ZGlmZiAtLWdpdCBhL2NvbW1vbi9YcmVnaW9uL01ha2VmaWxlLmluIGIvY29tbW9uL1hyZWdpb24vTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4YTI5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9YcmVnaW9uL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTUgQEAKKworU1JDUyA9IFJlZ2lvbi5jCisKK09CSlMgPSAkKFNSQ1M6LmM9Lm8pCisKK2xpYnJhcnkgPSBsaWJYcmVnaW9uLmEKKworYWxsOjogJChsaWJyYXJ5KQorCiskKGxpYnJhcnkpOiAkKE9CSlMpCisJcm0gLWYgJChsaWJyYXJ5KQorCSQoQVIpICQobGlicmFyeSkgJChPQkpTKQorCSQoUkFOTElCKSAkKGxpYnJhcnkpCisKKyMgZm9sbG93ZWQgYnkgYm9pbGVycGxhdGUubWsKZGlmZiAtLWdpdCBhL2NvbW1vbi9YcmVnaW9uL1JlZ2lvbi5jIGIvY29tbW9uL1hyZWdpb24vUmVnaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiMWU1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9YcmVnaW9uL1JlZ2lvbi5jCkBAIC0wLDAgKzEsMTY5NCBAQAorLyogJFhvcmc6IFJlZ2lvbi5jLHYgMS42IDIwMDEvMDIvMDkgMDI6MDM6MzUgeG9yZ2N2cyBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk4OCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NywgMTk4OCBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2xpYi9YMTEvUmVnaW9uLmMsdiAxLjggMjAwMS8xMi8xNCAxOTo1NDowNSBkYXdlcyBFeHAgJCAqLworLyoKKyAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGltcGxlbWVudCB0aGUgUmVnaW9uIGFic3RyYWN0aW9uLCBzaW1pbGFyIHRvIG9uZQorICogdXNlZCBpbiB0aGUgWDExIHNhbXBsZSBzZXJ2ZXIuIEEgUmVnaW9uIGlzIHNpbXBseSBhbiBhcmVhLCBhcyB0aGUgbmFtZQorICogaW1wbGllcywgYW5kIGlzIGltcGxlbWVudGVkIGFzIGEgInkteC1iYW5kZWQiIGFycmF5IG9mIHJlY3RhbmdsZXMuIFRvCisgKiBleHBsYWluOiBFYWNoIFJlZ2lvbiBpcyBtYWRlIHVwIG9mIGEgY2VydGFpbiBudW1iZXIgb2YgcmVjdGFuZ2xlcyBzb3J0ZWQKKyAqIGJ5IHkgY29vcmRpbmF0ZSBmaXJzdCwgYW5kIHRoZW4gYnkgeCBjb29yZGluYXRlLgorICoKKyAqIEZ1cnRoZXJtb3JlLCB0aGUgcmVjdGFuZ2xlcyBhcmUgYmFuZGVkIHN1Y2ggdGhhdCBldmVyeSByZWN0YW5nbGUgd2l0aCBhCisgKiBnaXZlbiB1cHBlci1sZWZ0IHkgY29vcmRpbmF0ZSAoeTEpIHdpbGwgaGF2ZSB0aGUgc2FtZSBsb3dlci1yaWdodCB5CisgKiBjb29yZGluYXRlICh5MikgYW5kIHZpY2UgdmVyc2EuIElmIGEgcmVjdGFuZ2xlIGhhcyBzY2FubGluZXMgaW4gYSBiYW5kLCBpdAorICogd2lsbCBzcGFuIHRoZSBlbnRpcmUgdmVydGljYWwgZGlzdGFuY2Ugb2YgdGhlIGJhbmQuIFRoaXMgbWVhbnMgdGhhdCBzb21lCisgKiBhcmVhcyB0aGF0IGNvdWxkIGJlIG1lcmdlZCBpbnRvIGEgdGFsbGVyIHJlY3RhbmdsZSB3aWxsIGJlIHJlcHJlc2VudGVkIGFzCisgKiBzZXZlcmFsIHNob3J0ZXIgcmVjdGFuZ2xlcyB0byBhY2NvdW50IGZvciBzaG9ydGVyIHJlY3RhbmdsZXMgdG8gaXRzIGxlZnQKKyAqIG9yIHJpZ2h0IGJ1dCB3aXRoaW4gaXRzICJ2ZXJ0aWNhbCBzY29wZSIuCisgKgorICogQW4gYWRkZWQgY29uc3RyYWludCBvbiB0aGUgcmVjdGFuZ2xlcyBpcyB0aGF0IHRoZXkgbXVzdCBjb3ZlciBhcyBtdWNoCisgKiBob3Jpem9udGFsIGFyZWEgYXMgcG9zc2libGUuIEUuZy4gbm8gdHdvIHJlY3RhbmdsZXMgaW4gYSBiYW5kIGFyZSBhbGxvd2VkCisgKiB0byB0b3VjaC4KKyAqCisgKiBXaGVuZXZlciBwb3NzaWJsZSwgYmFuZHMgd2lsbCBiZSBtZXJnZWQgdG9nZXRoZXIgdG8gY292ZXIgYSBncmVhdGVyIHZlcnRpY2FsCisgKiBkaXN0YW5jZSAoYW5kIHRodXMgcmVkdWNlIHRoZSBudW1iZXIgb2YgcmVjdGFuZ2xlcykuIFR3byBiYW5kcyBjYW4gYmUgbWVyZ2VkCisgKiBvbmx5IGlmIHRoZSBib3R0b20gb2Ygb25lIHRvdWNoZXMgdGhlIHRvcCBvZiB0aGUgb3RoZXIgYW5kIHRoZXkgaGF2ZQorICogcmVjdGFuZ2xlcyBpbiB0aGUgc2FtZSBwbGFjZXMgKG9mIHRoZSBzYW1lIHdpZHRoLCBvZiBjb3Vyc2UpLiBUaGlzIG1haW50YWlucworICogdGhlIHkteC1iYW5kaW5nIHRoYXQncyBzbyBuaWNlIHRvIGhhdmUuLi4KKyAqLworCisjaW5jbHVkZSAiWHJlZ2lvbi5oIgorLy8jaW5jbHVkZSAiWGxpYmludC5oIgorLy8jaW5jbHVkZSAiWHV0aWwuaCIKKyNpbmNsdWRlICJyZWdpb24uaCIKKy8vI2luY2x1ZGUgInBvbHkuaCIKKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChhLGIpICAgICAgICAgICAgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIGFzc2VydChleHByKSB7aWYgKCEoZXhwcikpIGZwcmludGYoc3RkZXJyLFwKKyJBc3NlcnRpb24gZmFpbGVkIGZpbGUgJXMsIGxpbmUgJWQ6IGV4cHJcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IH0KKyNlbHNlCisjZGVmaW5lIGFzc2VydChleHByKQorI2VuZGlmCisKK3R5cGVkZWYgdm9pZCAoKnZvaWRQcm9jcCkoKTsKKworc3RhdGljIHZvaWQgbWlSZWdpb25PcCgpOworLyoJQ3JlYXRlIGEgbmV3IGVtcHR5IHJlZ2lvbgkqLworUmVnaW9uCitYQ3JlYXRlUmVnaW9uKCkKK3sKKyAgICBSZWdpb24gdGVtcDsKKworICAgIGlmICghICh0ZW1wID0gKCBSZWdpb24gKVhtYWxsb2MoICh1bnNpZ25lZCkgc2l6ZW9mKCBSRUdJT04gKSkpKQorCXJldHVybiAoUmVnaW9uKSBOVUxMOworICAgIGlmICghICh0ZW1wLT5yZWN0cyA9ICggQk9YICogKVhtYWxsb2MoICh1bnNpZ25lZCkgc2l6ZW9mKCBCT1ggKSkpKSB7CisJWGZyZWUoKGNoYXIgKikgdGVtcCk7CisJcmV0dXJuIChSZWdpb24pIE5VTEw7CisgICAgfQorICAgIHRlbXAtPm51bVJlY3RzID0gMDsKKyAgICB0ZW1wLT5leHRlbnRzLngxID0gMDsKKyAgICB0ZW1wLT5leHRlbnRzLnkxID0gMDsKKyAgICB0ZW1wLT5leHRlbnRzLngyID0gMDsKKyAgICB0ZW1wLT5leHRlbnRzLnkyID0gMDsKKyAgICB0ZW1wLT5zaXplID0gMTsKKyAgICByZXR1cm4oIHRlbXAgKTsKK30KKworaW50CitYQ2xpcEJveCggciwgcmVjdCApCisgICAgUmVnaW9uIHI7CisgICAgWFJlY3RhbmdsZSAqcmVjdDsKK3sKKyAgICByZWN0LT54ID0gci0+ZXh0ZW50cy54MTsKKyAgICByZWN0LT55ID0gci0+ZXh0ZW50cy55MTsKKyAgICByZWN0LT53aWR0aCA9IHItPmV4dGVudHMueDIgLSByLT5leHRlbnRzLngxOworICAgIHJlY3QtPmhlaWdodCA9IHItPmV4dGVudHMueTIgLSByLT5leHRlbnRzLnkxOworICAgIHJldHVybiAxOworfQorCitpbnQKK1hVbmlvblJlY3RXaXRoUmVnaW9uKHJlY3QsIHNvdXJjZSwgZGVzdCkKKyAgICByZWdpc3RlciBYUmVjdGFuZ2xlICpyZWN0OworICAgIFJlZ2lvbiBzb3VyY2UsIGRlc3Q7Cit7CisgICAgUkVHSU9OIHJlZ2lvbjsKKworICAgIGlmICghcmVjdC0+d2lkdGggfHwgIXJlY3QtPmhlaWdodCkKKwlyZXR1cm4gMDsKKyAgICByZWdpb24ucmVjdHMgPSAmcmVnaW9uLmV4dGVudHM7CisgICAgcmVnaW9uLm51bVJlY3RzID0gMTsKKyAgICByZWdpb24uZXh0ZW50cy54MSA9IHJlY3QtPng7CisgICAgcmVnaW9uLmV4dGVudHMueTEgPSByZWN0LT55OworICAgIHJlZ2lvbi5leHRlbnRzLngyID0gcmVjdC0+eCArIHJlY3QtPndpZHRoOworICAgIHJlZ2lvbi5leHRlbnRzLnkyID0gcmVjdC0+eSArIHJlY3QtPmhlaWdodDsKKyAgICByZWdpb24uc2l6ZSA9IDE7CisKKyAgICByZXR1cm4gWFVuaW9uUmVnaW9uKCZyZWdpb24sIHNvdXJjZSwgZGVzdCk7Cit9CisKKy8qLQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbWlTZXRFeHRlbnRzIC0tCisgKglSZXNldCB0aGUgZXh0ZW50cyBvZiBhIHJlZ2lvbiB0byB3aGF0IHRoZXkgc2hvdWxkIGJlLiBDYWxsZWQgYnkKKyAqCW1pU3VidHJhY3QgYW5kIG1pSW50ZXJzZWN0IGIvYyB0aGV5IGNhbid0IGZpZ3VyZSBpdCBvdXQgYWxvbmcgdGhlCisgKgl3YXkgb3IgZG8gc28gZWFzaWx5LCBhcyBtaVVuaW9uIGNhbi4KKyAqCisgKiBSZXN1bHRzOgorICoJTm9uZS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKglUaGUgcmVnaW9uJ3MgJ2V4dGVudHMnIHN0cnVjdHVyZSBpcyBvdmVyd3JpdHRlbi4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyB2b2lkCittaVNldEV4dGVudHMgKHBSZWcpCisgICAgUmVnaW9uCSAgCXBSZWc7Cit7CisgICAgcmVnaXN0ZXIgQm94UHRyCXBCb3gsCisJCQlwQm94RW5kLAorCQkJcEV4dGVudHM7CisKKyAgICBpZiAocFJlZy0+bnVtUmVjdHMgPT0gMCkKKyAgICB7CisJcFJlZy0+ZXh0ZW50cy54MSA9IDA7CisJcFJlZy0+ZXh0ZW50cy55MSA9IDA7CisJcFJlZy0+ZXh0ZW50cy54MiA9IDA7CisJcFJlZy0+ZXh0ZW50cy55MiA9IDA7CisJcmV0dXJuOworICAgIH0KKworICAgIHBFeHRlbnRzID0gJnBSZWctPmV4dGVudHM7CisgICAgcEJveCA9IHBSZWctPnJlY3RzOworICAgIHBCb3hFbmQgPSAmcEJveFtwUmVnLT5udW1SZWN0cyAtIDFdOworCisgICAgLyoKKyAgICAgKiBTaW5jZSBwQm94IGlzIHRoZSBmaXJzdCByZWN0YW5nbGUgaW4gdGhlIHJlZ2lvbiwgaXQgbXVzdCBoYXZlIHRoZQorICAgICAqIHNtYWxsZXN0IHkxIGFuZCBzaW5jZSBwQm94RW5kIGlzIHRoZSBsYXN0IHJlY3RhbmdsZSBpbiB0aGUgcmVnaW9uLAorICAgICAqIGl0IG11c3QgaGF2ZSB0aGUgbGFyZ2VzdCB5MiwgYmVjYXVzZSBvZiBiYW5kaW5nLiBJbml0aWFsaXplIHgxIGFuZAorICAgICAqIHgyIGZyb20gIHBCb3ggYW5kIHBCb3hFbmQsIHJlc3AuLCBhcyBnb29kIHRoaW5ncyB0byBpbml0aWFsaXplIHRoZW0KKyAgICAgKiB0by4uLgorICAgICAqLworICAgIHBFeHRlbnRzLT54MSA9IHBCb3gtPngxOworICAgIHBFeHRlbnRzLT55MSA9IHBCb3gtPnkxOworICAgIHBFeHRlbnRzLT54MiA9IHBCb3hFbmQtPngyOworICAgIHBFeHRlbnRzLT55MiA9IHBCb3hFbmQtPnkyOworCisgICAgYXNzZXJ0KHBFeHRlbnRzLT55MSA8IHBFeHRlbnRzLT55Mik7CisgICAgd2hpbGUgKHBCb3ggPD0gcEJveEVuZCkKKyAgICB7CisJaWYgKHBCb3gtPngxIDwgcEV4dGVudHMtPngxKQorCXsKKwkgICAgcEV4dGVudHMtPngxID0gcEJveC0+eDE7CisJfQorCWlmIChwQm94LT54MiA+IHBFeHRlbnRzLT54MikKKwl7CisJICAgIHBFeHRlbnRzLT54MiA9IHBCb3gtPngyOworCX0KKwlwQm94Kys7CisgICAgfQorICAgIGFzc2VydChwRXh0ZW50cy0+eDEgPCBwRXh0ZW50cy0+eDIpOworfQorCitleHRlcm4gdm9pZCBfWFNldENsaXBSZWN0YW5nbGVzKCk7CisKKyNpZiAwCitpbnQKK1hTZXRSZWdpb24oIGRweSwgZ2MsIHIgKQorICAgIERpc3BsYXkgKmRweTsKKyAgICBHQyBnYzsKKyAgICByZWdpc3RlciBSZWdpb24gcjsKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBYUmVjdGFuZ2xlICp4ciwgKnByOworICAgIHJlZ2lzdGVyIEJPWCAqcGI7CisgICAgdW5zaWduZWQgbG9uZyB0b3RhbDsKKworICAgIExvY2tEaXNwbGF5IChkcHkpOworICAgIHRvdGFsID0gci0+bnVtUmVjdHMgKiBzaXplb2YgKFhSZWN0YW5nbGUpOworICAgIGlmICgoeHIgPSAoWFJlY3RhbmdsZSAqKSBfWEFsbG9jVGVtcChkcHksIHRvdGFsKSkpIHsKKwlmb3IgKHByID0geHIsIHBiID0gci0+cmVjdHMsIGkgPSByLT5udW1SZWN0czsgLS1pID49IDA7IHByKyssIHBiKyspIHsKKwkgICAgcHItPnggPSBwYi0+eDE7CisJICAgIHByLT55ID0gcGItPnkxOworCSAgICBwci0+d2lkdGggPSBwYi0+eDIgLSBwYi0+eDE7CisJICAgIHByLT5oZWlnaHQgPSBwYi0+eTIgLSBwYi0+eTE7CisJfQorICAgIH0KKyAgICBpZiAoeHIgfHwgIXItPm51bVJlY3RzKQorCV9YU2V0Q2xpcFJlY3RhbmdsZXMoZHB5LCBnYywgMCwgMCwgeHIsIHItPm51bVJlY3RzLCBZWEJhbmRlZCk7CisgICAgaWYgKHhyKQorCV9YRnJlZVRlbXAoZHB5LCAoY2hhciAqKXhyLCB0b3RhbCk7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gMTsKK30KKyNlbmRpZgorCitpbnQKK1hEZXN0cm95UmVnaW9uKCByICkKKyAgICBSZWdpb24gcjsKK3sKKyAgICBYZnJlZSggKGNoYXIgKikgci0+cmVjdHMgKTsKKyAgICBYZnJlZSggKGNoYXIgKikgciApOworICAgIHJldHVybiAxOworfQorCisKKy8qIFRyYW5zbGF0ZVJlZ2lvbihwUmVnaW9uLCB4LCB5KQorICAgdHJhbnNsYXRlcyBpbiBwbGFjZQorICAgYWRkZWQgYnkgcmF5bW9uZAorKi8KKworaW50CitYT2Zmc2V0UmVnaW9uKHBSZWdpb24sIHgsIHkpCisgICAgcmVnaXN0ZXIgUmVnaW9uIHBSZWdpb247CisgICAgcmVnaXN0ZXIgaW50IHg7CisgICAgcmVnaXN0ZXIgaW50IHk7Cit7CisgICAgcmVnaXN0ZXIgaW50IG5ib3g7CisgICAgcmVnaXN0ZXIgQk9YICpwYm94OworCisgICAgcGJveCA9IHBSZWdpb24tPnJlY3RzOworICAgIG5ib3ggPSBwUmVnaW9uLT5udW1SZWN0czsKKworICAgIHdoaWxlKG5ib3gtLSkKKyAgICB7CisJcGJveC0+eDEgKz0geDsKKwlwYm94LT54MiArPSB4OworCXBib3gtPnkxICs9IHk7CisJcGJveC0+eTIgKz0geTsKKwlwYm94Kys7CisgICAgfQorICAgIHBSZWdpb24tPmV4dGVudHMueDEgKz0geDsKKyAgICBwUmVnaW9uLT5leHRlbnRzLngyICs9IHg7CisgICAgcFJlZ2lvbi0+ZXh0ZW50cy55MSArPSB5OworICAgIHBSZWdpb24tPmV4dGVudHMueTIgKz0geTsKKyAgICByZXR1cm4gMTsKK30KKworLyogCisgICBVdGlsaXR5IHByb2NlZHVyZSBDb21wcmVzczoKKyAgIFJlcGxhY2UgciBieSB0aGUgcmVnaW9uIHInLCB3aGVyZSAKKyAgICAgcCBpbiByJyBpZmYgKFF1YW50aWZlciBtIDw9IGR4KSAocCArIG0gaW4gciksIGFuZAorICAgICBRdWFudGlmaWVyIGlzIEV4aXN0cyBpZiBncm93IGlzIFRSVUUsIEZvciBhbGwgaWYgZ3JvdyBpcyBGQUxTRSwgYW5kCisgICAgICh4LHkpICsgbSA9ICh4K20seSkgaWYgeGRpciBpcyBUUlVFOyAoeCx5K20pIGlmIHhkaXIgaXMgRkFMU0UuCisKKyAgIFRodXMsIGlmIHhkaXIgaXMgVFJVRSBhbmQgZ3JvdyBpcyBGQUxTRSwgciBpcyByZXBsYWNlZCBieSB0aGUgcmVnaW9uCisgICBvZiBhbGwgcG9pbnRzIHAgc3VjaCB0aGF0IHAgYW5kIHRoZSBuZXh0IGR4IHBvaW50cyBvbiB0aGUgc2FtZQorICAgaG9yaXpvbnRhbCBzY2FuIGxpbmUgYXJlIGFsbCBpbiByLiAgV2UgZG8gdGhpcyB1c2luZyBieSBub3RpbmcKKyAgIHRoYXQgcCBpcyB0aGUgaGVhZCBvZiBhIHJ1biBvZiBsZW5ndGggMl5pICsgayBpZmYgcCBpcyB0aGUgaGVhZAorICAgb2YgYSBydW4gb2YgbGVuZ3RoIDJeaSBhbmQgcCsyXmkgaXMgdGhlIGhlYWQgb2YgYSBydW4gb2YgbGVuZ3RoCisgICBrLiBUaHVzLCB0aGUgbG9vcCBpbnZhcmlhbnQ6IHMgY29udGFpbnMgdGhlIHJlZ2lvbiBjb3JyZXNwb25kaW5nCisgICB0byB0aGUgcnVucyBvZiBsZW5ndGggc2hpZnQuICByIGNvbnRhaW5zIHRoZSByZWdpb24gY29ycmVzcG9uZGluZworICAgdG8gdGhlIHJ1bnMgb2YgbGVuZ3RoIDEgKyBkeG8gJiAoc2hpZnQtMSksIHdoZXJlIGR4byBpcyB0aGUgb3JpZ2luYWwKKyAgIHZhbHVlIG9mIGR4LiAgZHggPSBkeG8gJiB+KHNoaWZ0LTEpLiAgQXMgcGFyYW1ldGVycywgcyBhbmQgdCBhcmUKKyAgIHNjcmF0Y2ggcmVnaW9ucywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlIHRoZW0gb24gZXZlcnkKKyAgIGNhbGwuCisqLworCisjZGVmaW5lIFpPcFJlZ2lvbihhLGIsYykgaWYgKGdyb3cpIFhVbmlvblJlZ2lvbihhLGIsYyk7IFwKKwkJCSBlbHNlIFhJbnRlcnNlY3RSZWdpb24oYSxiLGMpCisjZGVmaW5lIFpTaGlmdFJlZ2lvbihhLGIpIGlmICh4ZGlyKSBYT2Zmc2V0UmVnaW9uKGEsYiwwKTsgXAorCQkJICBlbHNlIFhPZmZzZXRSZWdpb24oYSwwLGIpCisjZGVmaW5lIFpDb3B5UmVnaW9uKGEsYikgWFVuaW9uUmVnaW9uKGEsYSxiKQorCitzdGF0aWMgdm9pZAorQ29tcHJlc3MociwgcywgdCwgZHgsIHhkaXIsIGdyb3cpCisgICAgUmVnaW9uIHIsIHMsIHQ7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgZHg7CisgICAgcmVnaXN0ZXIgaW50IHhkaXIsIGdyb3c7Cit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgc2hpZnQgPSAxOworCisgICAgWkNvcHlSZWdpb24ociwgcyk7CisgICAgd2hpbGUgKGR4KSB7CisgICAgICAgIGlmIChkeCAmIHNoaWZ0KSB7CisgICAgICAgICAgICBaU2hpZnRSZWdpb24ociwgLShpbnQpc2hpZnQpOworICAgICAgICAgICAgWk9wUmVnaW9uKHIsIHMsIHIpOworICAgICAgICAgICAgZHggLT0gc2hpZnQ7CisgICAgICAgICAgICBpZiAoIWR4KSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBaQ29weVJlZ2lvbihzLCB0KTsKKyAgICAgICAgWlNoaWZ0UmVnaW9uKHMsIC0oaW50KXNoaWZ0KTsKKyAgICAgICAgWk9wUmVnaW9uKHMsIHQsIHMpOworICAgICAgICBzaGlmdCA8PD0gMTsKKyAgICB9Cit9CisKKyN1bmRlZiBaT3BSZWdpb24KKyN1bmRlZiBaU2hpZnRSZWdpb24KKyN1bmRlZiBaQ29weVJlZ2lvbgorCitpbnQKK1hTaHJpbmtSZWdpb24ociwgZHgsIGR5KQorICAgIFJlZ2lvbiByOworICAgIGludCBkeCwgZHk7Cit7CisgICAgUmVnaW9uIHMsIHQ7CisgICAgaW50IGdyb3c7CisKKyAgICBpZiAoIWR4ICYmICFkeSkgcmV0dXJuIDA7CisgICAgaWYgKCghIChzID0gWENyZWF0ZVJlZ2lvbigpKSkgIHx8ICghICh0ID0gWENyZWF0ZVJlZ2lvbigpKSkpIHJldHVybiAwOworICAgIGlmICgoZ3JvdyA9IChkeCA8IDApKSkgZHggPSAtZHg7CisgICAgaWYgKGR4KSBDb21wcmVzcyhyLCBzLCB0LCAodW5zaWduZWQpIDIqZHgsIFRSVUUsIGdyb3cpOworICAgIGlmICgoZ3JvdyA9IChkeSA8IDApKSkgZHkgPSAtZHk7CisgICAgaWYgKGR5KSBDb21wcmVzcyhyLCBzLCB0LCAodW5zaWduZWQpIDIqZHksIEZBTFNFLCBncm93KTsKKyAgICBYT2Zmc2V0UmVnaW9uKHIsIGR4LCBkeSk7CisgICAgWERlc3Ryb3lSZWdpb24ocyk7CisgICAgWERlc3Ryb3lSZWdpb24odCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBub3RkZWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIEJvcCBkb3duIHRoZSBhcnJheSBvZiByZWN0cyB1bnRpbCB3ZSBoYXZlIHBhc3NlZAorICogICAgIHNjYW5saW5lIHkuICBudW1SZWN0cyBpcyB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBCT1ggCisqSW5kZXhSZWN0cyhyZWN0cywgbnVtUmVjdHMsIHkpCisgICAgcmVnaXN0ZXIgQk9YICpyZWN0czsKKyAgICByZWdpc3RlciBpbnQgbnVtUmVjdHM7CisgICAgcmVnaXN0ZXIgaW50IHk7Cit7CisgICAgIHdoaWxlICgobnVtUmVjdHMtLSkgJiYgKHJlY3RzLT55MiA8PSB5KSkKKyAgICAgICAgcmVjdHMrKzsKKyAgICAgcmV0dXJuKHJlY3RzKTsKK30KKyNlbmRpZgorDAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgkgICAgUmVnaW9uIEludGVyc2VjdGlvbgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKi0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG1pSW50ZXJzZWN0TyAtLQorICoJSGFuZGxlIGFuIG92ZXJsYXBwaW5nIGJhbmQgZm9yIG1pSW50ZXJzZWN0LgorICoKKyAqIFJlc3VsdHM6CisgKglOb25lLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCVJlY3RhbmdsZXMgbWF5IGJlIGFkZGVkIHRvIHRoZSByZWdpb24uCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBzdGF0aWMgdm9pZCovCitzdGF0aWMgaW50CittaUludGVyc2VjdE8gKHBSZWcsIHIxLCByMUVuZCwgcjIsIHIyRW5kLCB5MSwgeTIpCisgICAgcmVnaXN0ZXIgUmVnaW9uCXBSZWc7CisgICAgcmVnaXN0ZXIgQm94UHRyCXIxOworICAgIEJveFB0ciAgCSAgCXIxRW5kOworICAgIHJlZ2lzdGVyIEJveFB0cglyMjsKKyAgICBCb3hQdHIgIAkgIAlyMkVuZDsKKyAgICBzaG9ydCAgICAJICAJeTE7CisgICAgc2hvcnQgICAgCSAgCXkyOworeworICAgIHJlZ2lzdGVyIHNob3J0ICAJeDE7CisgICAgcmVnaXN0ZXIgc2hvcnQgIAl4MjsKKyAgICByZWdpc3RlciBCb3hQdHIJcE5leHRSZWN0OworCisgICAgcE5leHRSZWN0ID0gJnBSZWctPnJlY3RzW3BSZWctPm51bVJlY3RzXTsKKworICAgIHdoaWxlICgocjEgIT0gcjFFbmQpICYmIChyMiAhPSByMkVuZCkpCisgICAgeworCXgxID0gbWF4KHIxLT54MSxyMi0+eDEpOworCXgyID0gbWluKHIxLT54MixyMi0+eDIpOworCisJLyoKKwkgKiBJZiB0aGVyZSdzIGFueSBvdmVybGFwIGJldHdlZW4gdGhlIHR3byByZWN0YW5nbGVzLCBhZGQgdGhhdAorCSAqIG92ZXJsYXAgdG8gdGhlIG5ldyByZWdpb24uCisJICogVGhlcmUncyBubyBuZWVkIHRvIGNoZWNrIGZvciBzdWJzdW1wdGlvbiBiZWNhdXNlIHRoZSBvbmx5IHdheQorCSAqIHN1Y2ggYSBuZWVkIGNvdWxkIGFyaXNlIGlzIGlmIHNvbWUgcmVnaW9uIGhhcyB0d28gcmVjdGFuZ2xlcworCSAqIHJpZ2h0IG5leHQgdG8gZWFjaCBvdGhlci4gU2luY2UgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCisJICovCisJaWYgKHgxIDwgeDIpCisJeworCSAgICBhc3NlcnQoeTE8eTIpOworCisJICAgIE1FTUNIRUNLKHBSZWcsIHBOZXh0UmVjdCwgcFJlZy0+cmVjdHMpOworCSAgICBwTmV4dFJlY3QtPngxID0geDE7CisJICAgIHBOZXh0UmVjdC0+eTEgPSB5MTsKKwkgICAgcE5leHRSZWN0LT54MiA9IHgyOworCSAgICBwTmV4dFJlY3QtPnkyID0geTI7CisJICAgIHBSZWctPm51bVJlY3RzICs9IDE7CisJICAgIHBOZXh0UmVjdCsrOworCSAgICBhc3NlcnQocFJlZy0+bnVtUmVjdHMgPD0gcFJlZy0+c2l6ZSk7CisJfQorCisJLyoKKwkgKiBOZWVkIHRvIGFkdmFuY2UgdGhlIHBvaW50ZXJzLiBTaGlmdCB0aGUgb25lIHRoYXQgZXh0ZW5kcworCSAqIHRvIHRoZSByaWdodCB0aGUgbGVhc3QsIHNpbmNlIHRoZSBvdGhlciBzdGlsbCBoYXMgYSBjaGFuY2UgdG8KKwkgKiBvdmVybGFwIHdpdGggdGhhdCByZWdpb24ncyBuZXh0IHJlY3RhbmdsZSwgaWYgeW91IHNlZSB3aGF0IEkgbWVhbi4KKwkgKi8KKwlpZiAocjEtPngyIDwgcjItPngyKQorCXsKKwkgICAgcjErKzsKKwl9CisJZWxzZSBpZiAocjItPngyIDwgcjEtPngyKQorCXsKKwkgICAgcjIrKzsKKwl9CisJZWxzZQorCXsKKwkgICAgcjErKzsKKwkgICAgcjIrKzsKKwl9CisgICAgfQorICAgIHJldHVybiAwOwkvKiBsaW50ICovCit9CisKK2ludAorWEludGVyc2VjdFJlZ2lvbihyZWcxLCByZWcyLCBuZXdSZWcpCisgICAgUmVnaW9uIAkgIAlyZWcxOworICAgIFJlZ2lvbgkgIAlyZWcyOyAgICAgICAgICAvKiBzb3VyY2UgcmVnaW9ucyAgICAgKi8KKyAgICByZWdpc3RlciBSZWdpb24gCW5ld1JlZzsgICAgICAgICAgICAgICAvKiBkZXN0aW5hdGlvbiBSZWdpb24gKi8KK3sKKyAgIC8qIGNoZWNrIGZvciB0cml2aWFsIHJlamVjdCAqLworICAgIGlmICggKCEocmVnMS0+bnVtUmVjdHMpKSB8fCAoIShyZWcyLT5udW1SZWN0cykpICB8fAorCSghRVhURU5UQ0hFQ0soJnJlZzEtPmV4dGVudHMsICZyZWcyLT5leHRlbnRzKSkpCisgICAgICAgIG5ld1JlZy0+bnVtUmVjdHMgPSAwOworICAgIGVsc2UKKwltaVJlZ2lvbk9wIChuZXdSZWcsIHJlZzEsIHJlZzIsIAorICAgIAkJKHZvaWRQcm9jcCkgbWlJbnRlcnNlY3RPLCAodm9pZFByb2NwKSBOVUxMLCAodm9pZFByb2NwKSBOVUxMKTsKKyAgICAKKyAgICAvKgorICAgICAqIENhbid0IGFsdGVyIG5ld1JlZydzIGV4dGVudHMgYmVmb3JlIHdlIGNhbGwgbWlSZWdpb25PcCBiZWNhdXNlCisgICAgICogaXQgbWlnaHQgYmUgb25lIG9mIHRoZSBzb3VyY2UgcmVnaW9ucyBhbmQgbWlSZWdpb25PcCBkZXBlbmRzCisgICAgICogb24gdGhlIGV4dGVudHMgb2YgdGhvc2UgcmVnaW9ucyBiZWluZyB0aGUgc2FtZS4gQmVzaWRlcywgdGhpcworICAgICAqIHdheSB0aGVyZSdzIG5vIGNoZWNraW5nIGFnYWluc3QgcmVjdGFuZ2xlcyB0aGF0IHdpbGwgYmUgbnVrZWQKKyAgICAgKiBkdWUgdG8gY29hbGVzY2luZywgc28gd2UgaGF2ZSB0byBleGFtaW5lIGZld2VyIHJlY3RhbmdsZXMuCisgICAgICovCisgICAgbWlTZXRFeHRlbnRzKG5ld1JlZyk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCittaVJlZ2lvbkNvcHkoZHN0cmduLCByZ24pCisgICAgcmVnaXN0ZXIgUmVnaW9uIGRzdHJnbjsKKyAgICByZWdpc3RlciBSZWdpb24gcmduOworCit7CisgICAgaWYgKGRzdHJnbiAhPSByZ24pIC8qICBkb24ndCB3YW50IHRvIGNvcHkgdG8gaXRzZWxmICovCisgICAgeyAgCisgICAgICAgIGlmIChkc3RyZ24tPnNpemUgPCByZ24tPm51bVJlY3RzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHN0cmduLT5yZWN0cykKKyAgICAgICAgICAgIHsKKwkJQk9YICpwcmV2UmVjdHMgPSBkc3RyZ24tPnJlY3RzOworCQkKKyAgICAgICAgICAgICAgICBpZiAoISAoZHN0cmduLT5yZWN0cyA9IChCT1ggKikKKwkJICAgICAgIFhyZWFsbG9jKChjaGFyICopIGRzdHJnbi0+cmVjdHMsCisJCQkJKHVuc2lnbmVkKSByZ24tPm51bVJlY3RzICogKHNpemVvZihCT1gpKSkpKSB7CisJCSAgICBYZnJlZShwcmV2UmVjdHMpOworCQkgICAgcmV0dXJuOworCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RyZ24tPnNpemUgPSByZ24tPm51bVJlY3RzOworCX0KKyAgICAgICAgZHN0cmduLT5udW1SZWN0cyA9IHJnbi0+bnVtUmVjdHM7CisgICAgICAgIGRzdHJnbi0+ZXh0ZW50cy54MSA9IHJnbi0+ZXh0ZW50cy54MTsKKyAgICAgICAgZHN0cmduLT5leHRlbnRzLnkxID0gcmduLT5leHRlbnRzLnkxOworICAgICAgICBkc3RyZ24tPmV4dGVudHMueDIgPSByZ24tPmV4dGVudHMueDI7CisgICAgICAgIGRzdHJnbi0+ZXh0ZW50cy55MiA9IHJnbi0+ZXh0ZW50cy55MjsKKworCW1lbWNweSgoY2hhciAqKSBkc3RyZ24tPnJlY3RzLCAoY2hhciAqKSByZ24tPnJlY3RzLAorCSAgICAgICAoaW50KSAocmduLT5udW1SZWN0cyAqIHNpemVvZihCT1gpKSk7CisgICAgfQorfQorCisjaWZkZWYgbm90ZGVmCisKKy8qCisgKiAgY29tYmluUmVncyhuZXdSZWcsIHJlZzEsIHJlZzIpCisgKiAgICBpZiBvbmUgcmVnaW9uIGlzIGFib3ZlIG9yIGJlbG93IHRoZSBvdGhlci4KKyovIAorCitzdGF0aWMgdm9pZAorY29tYmluZVJlZ3MobmV3UmVnLCByZWcxLCByZWcyKQorICAgIHJlZ2lzdGVyIFJlZ2lvbiBuZXdSZWc7CisgICAgUmVnaW9uIHJlZzE7CisgICAgUmVnaW9uIHJlZzI7Cit7CisgICAgcmVnaXN0ZXIgUmVnaW9uIHRlbXBSZWc7CisgICAgcmVnaXN0ZXIgQk9YICpyZWN0czsKKyAgICByZWdpc3RlciBCT1ggKnJlY3RzMTsKKyAgICByZWdpc3RlciBCT1ggKnJlY3RzMjsKKyAgICByZWdpc3RlciBpbnQgdG90YWw7CisKKyAgICByZWN0czEgPSByZWcxLT5yZWN0czsKKyAgICByZWN0czIgPSByZWcyLT5yZWN0czsKKworICAgIHRvdGFsID0gcmVnMS0+bnVtUmVjdHMgKyByZWcyLT5udW1SZWN0czsKKyAgICBpZiAoISAodGVtcFJlZyA9IFhDcmVhdGVSZWdpb24oKSkpCisJcmV0dXJuOworICAgIHRlbXBSZWctPnNpemUgPSB0b3RhbDsKKyAgICAvKiAgcmVnaW9uIDEgaXMgYmVsb3cgcmVnaW9uIDIgICovCisgICAgaWYgKHJlZzEtPmV4dGVudHMueTEgPiByZWcyLT5leHRlbnRzLnkxKQorICAgIHsKKyAgICAgICAgbWlSZWdpb25Db3B5KHRlbXBSZWcsIHJlZzIpOworICAgICAgICByZWN0cyA9ICZ0ZW1wUmVnLT5yZWN0c1t0ZW1wUmVnLT5udW1SZWN0c107CisgICAgICAgIHRvdGFsIC09IHRlbXBSZWctPm51bVJlY3RzOworICAgICAgICB3aGlsZSAodG90YWwtLSkKKyAgICAgICAgICAgICpyZWN0cysrID0gKnJlY3RzMSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtaVJlZ2lvbkNvcHkodGVtcFJlZywgcmVnMSk7CisgICAgICAgIHJlY3RzID0gJnRlbXBSZWctPnJlY3RzW3RlbXBSZWctPm51bVJlY3RzXTsKKyAgICAgICAgdG90YWwgLT0gdGVtcFJlZy0+bnVtUmVjdHM7CisgICAgICAgIHdoaWxlICh0b3RhbC0tKQorICAgICAgICAgICAgKnJlY3RzKysgPSAqcmVjdHMyKys7CisgICAgfQorICAgIHRlbXBSZWctPmV4dGVudHMgPSByZWcxLT5leHRlbnRzOworICAgIHRlbXBSZWctPm51bVJlY3RzID0gcmVnMS0+bnVtUmVjdHMgKyByZWcyLT5udW1SZWN0czsKKyAgICBFWFRFTlRTKCZyZWcyLT5leHRlbnRzLCB0ZW1wUmVnKTsgIAorICAgIG1pUmVnaW9uQ29weShuZXdSZWcsIHRlbXBSZWcpOworICAgIFhmcmVlKChjaGFyICopdGVtcFJlZyk7Cit9CisKKy8qCisgKiAgUXVpY2tDaGVjayBjaGVja3MgdG8gc2VlIGlmIGl0IGRvZXMgbm90IGhhdmUgdG8gZ28gdGhyb3VnaCBhbGwgdGhlCisgKiAgdGhlIHVnbHkgY29kZSBmb3IgdGhlIHJlZ2lvbiBjYWxsLiAgSXQgcmV0dXJucyAxIGlmIGl0IGRpZCBhbGwKKyAqICB0aGUgd29yayBmb3IgVW5pb24sIG90aGVyd2lzZSAwIC0gc3RpbGwgd29yayB0byBiZSBkb25lLgorKi8gCisKK3N0YXRpYyBpbnQKK1F1aWNrQ2hlY2sobmV3UmVnLCByZWcxLCByZWcyKQorICAgIFJlZ2lvbiBuZXdSZWcsIHJlZzEsIHJlZzI7Cit7CisKKyAgICAvKiAgaWYgdW5pb25pbmcgd2l0aCBpdHNlbGYgb3Igbm8gcmVjdHMgdG8gdW5pb24gd2l0aCAgKi8KKyAgICBpZiAoIChyZWcxID09IHJlZzIpIHx8ICghKHJlZzEtPm51bVJlY3RzKSkgKQorICAgIHsKKyAgICAgICAgbWlSZWdpb25Db3B5KG5ld1JlZywgcmVnMik7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIC8qICAgaWYgbm90aGluZyB0byB1bmlvbiAgICovCisgICAgaWYgKCEocmVnMi0+bnVtUmVjdHMpKQorICAgIHsKKyAgICAgICAgbWlSZWdpb25Db3B5KG5ld1JlZywgcmVnMSk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIC8qICAgY291bGQgcHV0IGFuIGV4dGVudCBjaGVjayB0byBzZWUgaWYgYWRkIGFib3ZlIG9yIGJlbG93ICovCisKKyAgICBpZiAoKHJlZzEtPmV4dGVudHMueTEgPj0gcmVnMi0+ZXh0ZW50cy55MikgfHwKKyAgICAgICAgKHJlZzItPmV4dGVudHMueTEgPj0gcmVnMS0+ZXh0ZW50cy55MikgKQorICAgIHsKKyAgICAgICAgY29tYmluZVJlZ3MobmV3UmVnLCByZWcxLCByZWcyKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyogICBUb3BSZWN0cyhyZWN0cywgcmVnMSwgcmVnMikKKyAqIE4uQi4gV2Ugbm93IGFzc3VtZSB0aGF0IHJlZzEgYW5kIHJlZzIgaW50ZXJzZWN0LiAgVGhlcmVmb3JlIHdlIGFyZQorICogTk9UIGNoZWNraW5nIGluIHRoZSB0d28gd2hpbGUgbG9vcHMgZm9yIHN0ZXBwaW5nIG9mZiB0aGUgZW5kIG9mIHRoZQorICogcmVnaW9uLiAgCisgKi8gCisKK3N0YXRpYyBpbnQKK1RvcFJlY3RzKG5ld1JlZywgcmVjdHMsIHJlZzEsIHJlZzIsIEZpcnN0UmVjdCkKKyAgICByZWdpc3RlciBSZWdpb24gbmV3UmVnOworICAgIHJlZ2lzdGVyIEJPWCAqcmVjdHM7CisgICAgcmVnaXN0ZXIgUmVnaW9uIHJlZzE7CisgICAgcmVnaXN0ZXIgUmVnaW9uIHJlZzI7IAorICAgIEJPWCAqRmlyc3RSZWN0OworeworICAgIHJlZ2lzdGVyIEJPWCAqdGVtcFJlY3RzOworCisgICAgLyogIG5lZWQgdG8gYWRkIHNvbWUgcmVjdHMgZnJvbSByZWdpb24gMSAqLworICAgIGlmIChyZWcxLT5leHRlbnRzLnkxIDwgcmVnMi0+ZXh0ZW50cy55MSkKKyAgICB7CisgICAgICAgIHRlbXBSZWN0cyA9IHJlZzEtPnJlY3RzOworICAgICAgICB3aGlsZSh0ZW1wUmVjdHMtPnkxIDwgcmVnMi0+ZXh0ZW50cy55MSkKKwl7CisJICAgIE1FTUNIRUNLKG5ld1JlZywgcmVjdHMsIEZpcnN0UmVjdCk7CisgICAgICAgICAgICBBRERSRUNUTk9YKG5ld1JlZyxyZWN0cywgdGVtcFJlY3RzLT54MSwgdGVtcFJlY3RzLT55MSwgCisJCSAgICAgICB0ZW1wUmVjdHMtPngyLCBNSU4odGVtcFJlY3RzLT55MiwgcmVnMi0+ZXh0ZW50cy55MSkpOworICAgICAgICAgICAgdGVtcFJlY3RzKys7CisJfQorICAgIH0KKyAgICAvKiAgbmVlZCB0byBhZGQgc29tZSByZWN0cyBmcm9tIHJlZ2lvbiAyICovCisgICAgaWYgKHJlZzItPmV4dGVudHMueTEgPCByZWcxLT5leHRlbnRzLnkxKQorICAgIHsKKyAgICAgICAgdGVtcFJlY3RzID0gcmVnMi0+cmVjdHM7CisgICAgICAgIHdoaWxlICh0ZW1wUmVjdHMtPnkxIDwgcmVnMS0+ZXh0ZW50cy55MSkKKyAgICAgICAgeworICAgICAgICAgICAgTUVNQ0hFQ0sobmV3UmVnLCByZWN0cywgRmlyc3RSZWN0KTsKKyAgICAgICAgICAgIEFERFJFQ1ROT1gobmV3UmVnLCByZWN0cywgdGVtcFJlY3RzLT54MSx0ZW1wUmVjdHMtPnkxLCAKKwkJICAgICAgIHRlbXBSZWN0cy0+eDIsIE1JTih0ZW1wUmVjdHMtPnkyLCByZWcxLT5leHRlbnRzLnkxKSk7CisgICAgICAgICAgICB0ZW1wUmVjdHMrKzsKKwl9CisgICAgfQorICAgIHJldHVybiAxOworfQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoJICAgIEdlbmVyaWMgUmVnaW9uIE9wZXJhdG9yCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtaUNvYWxlc2NlIC0tCisgKglBdHRlbXB0IHRvIG1lcmdlIHRoZSBib3hlcyBpbiB0aGUgY3VycmVudCBiYW5kIHdpdGggdGhvc2UgaW4gdGhlCisgKglwcmV2aW91cyBvbmUuIFVzZWQgb25seSBieSBtaVJlZ2lvbk9wLgorICoKKyAqIFJlc3VsdHM6CisgKglUaGUgbmV3IGluZGV4IGZvciB0aGUgcHJldmlvdXMgYmFuZC4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKglJZiBjb2FsZXNjaW5nIHRha2VzIHBsYWNlOgorICoJICAgIC0gcmVjdGFuZ2xlcyBpbiB0aGUgcHJldmlvdXMgYmFuZCB3aWxsIGhhdmUgdGhlaXIgeTIgZmllbGRzCisgKgkgICAgICBhbHRlcmVkLgorICoJICAgIC0gcFJlZy0+bnVtUmVjdHMgd2lsbCBiZSBkZWNyZWFzZWQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBzdGF0aWMgaW50Ki8KK3N0YXRpYyBpbnQKK21pQ29hbGVzY2UgKHBSZWcsIHByZXZTdGFydCwgY3VyU3RhcnQpCisgICAgcmVnaXN0ZXIgUmVnaW9uCXBSZWc7CSAgICAJLyogUmVnaW9uIHRvIGNvYWxlc2NlICovCisgICAgaW50CSAgICAJICAJcHJldlN0YXJ0OyAgCS8qIEluZGV4IG9mIHN0YXJ0IG9mIHByZXZpb3VzIGJhbmQgKi8KKyAgICBpbnQJICAgIAkgIAljdXJTdGFydDsgICAJLyogSW5kZXggb2Ygc3RhcnQgb2YgY3VycmVudCBiYW5kICovCit7CisgICAgcmVnaXN0ZXIgQm94UHRyCXBQcmV2Qm94OyAgIAkvKiBDdXJyZW50IGJveCBpbiBwcmV2aW91cyBiYW5kICovCisgICAgcmVnaXN0ZXIgQm94UHRyCXBDdXJCb3g7ICAgIAkvKiBDdXJyZW50IGJveCBpbiBjdXJyZW50IGJhbmQgKi8KKyAgICByZWdpc3RlciBCb3hQdHIJcFJlZ0VuZDsgICAgCS8qIEVuZCBvZiByZWdpb24gKi8KKyAgICBpbnQJICAgIAkgIAljdXJOdW1SZWN0czsJLyogTnVtYmVyIG9mIHJlY3RhbmdsZXMgaW4gY3VycmVudAorCQkJCQkgKiBiYW5kICovCisgICAgaW50CSAgICAJICAJcHJldk51bVJlY3RzOwkvKiBOdW1iZXIgb2YgcmVjdGFuZ2xlcyBpbiBwcmV2aW91cworCQkJCQkgKiBiYW5kICovCisgICAgaW50CSAgICAJICAJYmFuZFkxOwkgICAgCS8qIFkxIGNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgYmFuZCAqLworCisgICAgcFJlZ0VuZCA9ICZwUmVnLT5yZWN0c1twUmVnLT5udW1SZWN0c107CisKKyAgICBwUHJldkJveCA9ICZwUmVnLT5yZWN0c1twcmV2U3RhcnRdOworICAgIHByZXZOdW1SZWN0cyA9IGN1clN0YXJ0IC0gcHJldlN0YXJ0OworCisgICAgLyoKKyAgICAgKiBGaWd1cmUgb3V0IGhvdyBtYW55IHJlY3RhbmdsZXMgYXJlIGluIHRoZSBjdXJyZW50IGJhbmQuIEhhdmUgdG8gZG8KKyAgICAgKiB0aGlzIGJlY2F1c2UgbXVsdGlwbGUgYmFuZHMgY291bGQgaGF2ZSBiZWVuIGFkZGVkIGluIG1pUmVnaW9uT3AKKyAgICAgKiBhdCB0aGUgZW5kIHdoZW4gb25lIHJlZ2lvbiBoYXMgYmVlbiBleGhhdXN0ZWQuCisgICAgICovCisgICAgcEN1ckJveCA9ICZwUmVnLT5yZWN0c1tjdXJTdGFydF07CisgICAgYmFuZFkxID0gcEN1ckJveC0+eTE7CisgICAgZm9yIChjdXJOdW1SZWN0cyA9IDA7CisJIChwQ3VyQm94ICE9IHBSZWdFbmQpICYmIChwQ3VyQm94LT55MSA9PSBiYW5kWTEpOworCSBjdXJOdW1SZWN0cysrKQorICAgIHsKKwlwQ3VyQm94Kys7CisgICAgfQorICAgIAorICAgIGlmIChwQ3VyQm94ICE9IHBSZWdFbmQpCisgICAgeworCS8qCisJICogSWYgbW9yZSB0aGFuIG9uZSBiYW5kIHdhcyBhZGRlZCwgd2UgaGF2ZSB0byBmaW5kIHRoZSBzdGFydAorCSAqIG9mIHRoZSBsYXN0IGJhbmQgYWRkZWQgc28gdGhlIG5leHQgY29hbGVzY2luZyBqb2IgY2FuIHN0YXJ0CisJICogYXQgdGhlIHJpZ2h0IHBsYWNlLi4uIChnaXZlbiB3aGVuIG11bHRpcGxlIGJhbmRzIGFyZSBhZGRlZCwKKwkgKiB0aGlzIG1heSBiZSBwb2ludGxlc3MgLS0gc2VlIGFib3ZlKS4KKwkgKi8KKwlwUmVnRW5kLS07CisJd2hpbGUgKHBSZWdFbmRbLTFdLnkxID09IHBSZWdFbmQtPnkxKQorCXsKKwkgICAgcFJlZ0VuZC0tOworCX0KKwljdXJTdGFydCA9IHBSZWdFbmQgLSBwUmVnLT5yZWN0czsKKwlwUmVnRW5kID0gcFJlZy0+cmVjdHMgKyBwUmVnLT5udW1SZWN0czsKKyAgICB9CisJCisgICAgaWYgKChjdXJOdW1SZWN0cyA9PSBwcmV2TnVtUmVjdHMpICYmIChjdXJOdW1SZWN0cyAhPSAwKSkgeworCXBDdXJCb3ggLT0gY3VyTnVtUmVjdHM7CisJLyoKKwkgKiBUaGUgYmFuZHMgbWF5IG9ubHkgYmUgY29hbGVzY2VkIGlmIHRoZSBib3R0b20gb2YgdGhlIHByZXZpb3VzCisJICogbWF0Y2hlcyB0aGUgdG9wIHNjYW5saW5lIG9mIHRoZSBjdXJyZW50LgorCSAqLworCWlmIChwUHJldkJveC0+eTIgPT0gcEN1ckJveC0+eTEpCisJeworCSAgICAvKgorCSAgICAgKiBNYWtlIHN1cmUgdGhlIGJhbmRzIGhhdmUgYm94ZXMgaW4gdGhlIHNhbWUgcGxhY2VzLiBUaGlzCisJICAgICAqIGFzc3VtZXMgdGhhdCBib3hlcyBoYXZlIGJlZW4gYWRkZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZXkKKwkgICAgICogY292ZXIgdGhlIG1vc3QgYXJlYSBwb3NzaWJsZS4gSS5lLiB0d28gYm94ZXMgaW4gYSBiYW5kIG11c3QKKwkgICAgICogaGF2ZSBzb21lIGhvcml6b250YWwgc3BhY2UgYmV0d2VlbiB0aGVtLgorCSAgICAgKi8KKwkgICAgZG8KKwkgICAgeworCQlpZiAoKHBQcmV2Qm94LT54MSAhPSBwQ3VyQm94LT54MSkgfHwKKwkJICAgIChwUHJldkJveC0+eDIgIT0gcEN1ckJveC0+eDIpKQorCQl7CisJCSAgICAvKgorCQkgICAgICogVGhlIGJhbmRzIGRvbid0IGxpbmUgdXAgc28gdGhleSBjYW4ndCBiZSBjb2FsZXNjZWQuCisJCSAgICAgKi8KKwkJICAgIHJldHVybiAoY3VyU3RhcnQpOworCQl9CisJCXBQcmV2Qm94Kys7CisJCXBDdXJCb3grKzsKKwkJcHJldk51bVJlY3RzIC09IDE7CisJICAgIH0gd2hpbGUgKHByZXZOdW1SZWN0cyAhPSAwKTsKKworCSAgICBwUmVnLT5udW1SZWN0cyAtPSBjdXJOdW1SZWN0czsKKwkgICAgcEN1ckJveCAtPSBjdXJOdW1SZWN0czsKKwkgICAgcFByZXZCb3ggLT0gY3VyTnVtUmVjdHM7CisKKwkgICAgLyoKKwkgICAgICogVGhlIGJhbmRzIG1heSBiZSBtZXJnZWQsIHNvIHNldCB0aGUgYm90dG9tIHkgb2YgZWFjaCBib3gKKwkgICAgICogaW4gdGhlIHByZXZpb3VzIGJhbmQgdG8gdGhhdCBvZiB0aGUgY29ycmVzcG9uZGluZyBib3ggaW4KKwkgICAgICogdGhlIGN1cnJlbnQgYmFuZC4KKwkgICAgICovCisJICAgIGRvCisJICAgIHsKKwkJcFByZXZCb3gtPnkyID0gcEN1ckJveC0+eTI7CisJCXBQcmV2Qm94Kys7CisJCXBDdXJCb3grKzsKKwkJY3VyTnVtUmVjdHMgLT0gMTsKKwkgICAgfSB3aGlsZSAoY3VyTnVtUmVjdHMgIT0gMCk7CisKKwkgICAgLyoKKwkgICAgICogSWYgb25seSBvbmUgYmFuZCB3YXMgYWRkZWQgdG8gdGhlIHJlZ2lvbiwgd2UgaGF2ZSB0byBiYWNrdXAKKwkgICAgICogY3VyU3RhcnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwcmV2aW91cyBiYW5kLgorCSAgICAgKgorCSAgICAgKiBJZiBtb3JlIHRoYW4gb25lIGJhbmQgd2FzIGFkZGVkIHRvIHRoZSByZWdpb24sIGNvcHkgdGhlCisJICAgICAqIG90aGVyIGJhbmRzIGRvd24uIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB0aGUgb3RoZXIgYmFuZHMKKwkgICAgICogY2FtZSBmcm9tIHRoZSBzYW1lIHJlZ2lvbiBhcyB0aGUgY3VycmVudCBvbmUgYW5kIG5vIGZ1cnRoZXIKKwkgICAgICogY29hbGVzY2luZyBjYW4gYmUgZG9uZSBvbiB0aGVtIHNpbmNlIGl0J3MgYWxsIGJlZW4gZG9uZQorCSAgICAgKiBhbHJlYWR5Li4uIGN1clN0YXJ0IGlzIGFscmVhZHkgaW4gdGhlIHJpZ2h0IHBsYWNlLgorCSAgICAgKi8KKwkgICAgaWYgKHBDdXJCb3ggPT0gcFJlZ0VuZCkKKwkgICAgeworCQljdXJTdGFydCA9IHByZXZTdGFydDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZG8KKwkJeworCQkgICAgKnBQcmV2Qm94KysgPSAqcEN1ckJveCsrOworCQl9IHdoaWxlIChwQ3VyQm94ICE9IHBSZWdFbmQpOworCSAgICB9CisJICAgIAorCX0KKyAgICB9CisgICAgcmV0dXJuIChjdXJTdGFydCk7Cit9CisKKy8qLQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbWlSZWdpb25PcCAtLQorICoJQXBwbHkgYW4gb3BlcmF0aW9uIHRvIHR3byByZWdpb25zLiBDYWxsZWQgYnkgbWlVbmlvbiwgbWlJbnZlcnNlLAorICoJbWlTdWJ0cmFjdCwgbWlJbnRlcnNlY3QuLi4KKyAqCisgKiBSZXN1bHRzOgorICoJTm9uZS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKglUaGUgbmV3IHJlZ2lvbiBpcyBvdmVyd3JpdHRlbi4KKyAqCisgKiBOb3RlczoKKyAqCVRoZSBpZGVhIGJlaGluZCB0aGlzIGZ1bmN0aW9uIGlzIHRvIHZpZXcgdGhlIHR3byByZWdpb25zIGFzIHNldHMuCisgKglUb2dldGhlciB0aGV5IGNvdmVyIGEgcmVjdGFuZ2xlIG9mIGFyZWEgdGhhdCB0aGlzIGZ1bmN0aW9uIGRpdmlkZXMKKyAqCWludG8gaG9yaXpvbnRhbCBiYW5kcyB3aGVyZSBwb2ludHMgYXJlIGNvdmVyZWQgb25seSBieSBvbmUgcmVnaW9uCisgKglvciBieSBib3RoLiBGb3IgdGhlIGZpcnN0IGNhc2UsIHRoZSBub25PdmVybGFwRnVuYyBpcyBjYWxsZWQgd2l0aAorICoJZWFjaCB0aGUgYmFuZCBhbmQgdGhlIGJhbmQncyB1cHBlciBhbmQgbG93ZXIgZXh0ZW50cy4gRm9yIHRoZQorICoJc2Vjb25kLCB0aGUgb3ZlcmxhcEZ1bmMgaXMgY2FsbGVkIHRvIHByb2Nlc3MgdGhlIGVudGlyZSBiYW5kLiBJdAorICoJaXMgcmVzcG9uc2libGUgZm9yIGNsaXBwaW5nIHRoZSByZWN0YW5nbGVzIGluIHRoZSBiYW5kLCB0aG91Z2gKKyAqCXRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGJvdW5kYXJpZXMuCisgKglBdCB0aGUgZW5kIG9mIGVhY2ggYmFuZCwgdGhlIG5ldyByZWdpb24gaXMgY29hbGVzY2VkLCBpZiBwb3NzaWJsZSwKKyAqCXRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHJlY3RhbmdsZXMgaW4gdGhlIHJlZ2lvbi4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIHN0YXRpYyB2b2lkKi8KK3N0YXRpYyB2b2lkCittaVJlZ2lvbk9wKG5ld1JlZywgcmVnMSwgcmVnMiwgb3ZlcmxhcEZ1bmMsICBub25PdmVybGFwMUZ1bmMsIG5vbk92ZXJsYXAyRnVuYykKKyAgICByZWdpc3RlciBSZWdpb24gCW5ld1JlZzsJICAgIAkgICAgCS8qIFBsYWNlIHRvIHN0b3JlIHJlc3VsdCAqLworICAgIFJlZ2lvbgkgIAlyZWcxOwkgICAgCSAgICAJLyogRmlyc3QgcmVnaW9uIGluIG9wZXJhdGlvbiAqLworICAgIFJlZ2lvbgkgIAlyZWcyOwkgICAgCSAgICAJLyogMmQgcmVnaW9uIGluIG9wZXJhdGlvbiAqLworICAgIHZvaWQgICAgCSAgCSgqb3ZlcmxhcEZ1bmMpKCk7ICAgCS8qIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIG92ZXItCisJCQkJCQkgKiBsYXBwaW5nIGJhbmRzICovCisgICAgdm9pZCAgICAJICAJKCpub25PdmVybGFwMUZ1bmMpKCk7CS8qIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIG5vbi0KKwkJCQkJCSAqIG92ZXJsYXBwaW5nIGJhbmRzIGluIHJlZ2lvbgorCQkJCQkJICogMSAqLworICAgIHZvaWQgICAgCSAgCSgqbm9uT3ZlcmxhcDJGdW5jKSgpOwkvKiBGdW5jdGlvbiB0byBjYWxsIGZvciBub24tCisJCQkJCQkgKiBvdmVybGFwcGluZyBiYW5kcyBpbiByZWdpb24KKwkJCQkJCSAqIDIgKi8KK3sKKyAgICByZWdpc3RlciBCb3hQdHIJcjE7IAkgICAgCSAgICAJLyogUG9pbnRlciBpbnRvIGZpcnN0IHJlZ2lvbiAqLworICAgIHJlZ2lzdGVyIEJveFB0cglyMjsgCSAgICAJICAgIAkvKiBQb2ludGVyIGludG8gMmQgcmVnaW9uICovCisgICAgQm94UHRyICAJICAJcjFFbmQ7CSAgICAJICAgIAkvKiBFbmQgb2YgMXN0IHJlZ2lvbiAqLworICAgIEJveFB0ciAgCSAgCXIyRW5kOwkgICAgCSAgICAJLyogRW5kIG9mIDJkIHJlZ2lvbiAqLworICAgIHJlZ2lzdGVyIHNob3J0ICAJeWJvdDsJICAgIAkgICAgCS8qIEJvdHRvbSBvZiBpbnRlcnNlY3Rpb24gKi8KKyAgICByZWdpc3RlciBzaG9ydCAgCXl0b3A7CSAgICAJICAgIAkvKiBUb3Agb2YgaW50ZXJzZWN0aW9uICovCisgICAgQm94UHRyICAJICAJb2xkUmVjdHM7ICAgCSAgICAJLyogT2xkIHJlY3RzIGZvciBuZXdSZWcgKi8KKyAgICBpbnQJICAgIAkgIAlwcmV2QmFuZDsgICAJICAgIAkvKiBJbmRleCBvZiBzdGFydCBvZgorCQkJCQkJICogcHJldmlvdXMgYmFuZCBpbiBuZXdSZWcgKi8KKyAgICBpbnQJICAgIAkgIAljdXJCYW5kOyAgICAJICAgIAkvKiBJbmRleCBvZiBzdGFydCBvZiBjdXJyZW50CisJCQkJCQkgKiBiYW5kIGluIG5ld1JlZyAqLworICAgIHJlZ2lzdGVyIEJveFB0ciAJcjFCYW5kRW5kOyAgCSAgICAJLyogRW5kIG9mIGN1cnJlbnQgYmFuZCBpbiByMSAqLworICAgIHJlZ2lzdGVyIEJveFB0ciAJcjJCYW5kRW5kOyAgCSAgICAJLyogRW5kIG9mIGN1cnJlbnQgYmFuZCBpbiByMiAqLworICAgIHNob3J0ICAgICAJICAJdG9wOwkgICAgCSAgICAJLyogVG9wIG9mIG5vbi1vdmVybGFwcGluZworCQkJCQkJICogYmFuZCAqLworICAgIHNob3J0ICAgICAJICAJYm90OwkgICAgCSAgICAJLyogQm90dG9tIG9mIG5vbi1vdmVybGFwcGluZworCQkJCQkJICogYmFuZCAqLworICAgIAorICAgIC8qCisgICAgICogSW5pdGlhbGl6YXRpb246CisgICAgICoJc2V0IHIxLCByMiwgcjFFbmQgYW5kIHIyRW5kIGFwcHJvcHJpYXRlbHksIHByZXNlcnZlIHRoZSBpbXBvcnRhbnQKKyAgICAgKiBwYXJ0cyBvZiB0aGUgZGVzdGluYXRpb24gcmVnaW9uIHVudGlsIHRoZSBlbmQgaW4gY2FzZSBpdCdzIG9uZSBvZgorICAgICAqIHRoZSB0d28gc291cmNlIHJlZ2lvbnMsIHRoZW4gbWFyayB0aGUgIm5ldyIgcmVnaW9uIGVtcHR5LCBhbGxvY2F0aW5nCisgICAgICogYW5vdGhlciBhcnJheSBvZiByZWN0YW5nbGVzIGZvciBpdCB0byB1c2UuCisgICAgICovCisgICAgcjEgPSByZWcxLT5yZWN0czsKKyAgICByMiA9IHJlZzItPnJlY3RzOworICAgIHIxRW5kID0gcjEgKyByZWcxLT5udW1SZWN0czsKKyAgICByMkVuZCA9IHIyICsgcmVnMi0+bnVtUmVjdHM7CisgICAgCisgICAgb2xkUmVjdHMgPSBuZXdSZWctPnJlY3RzOworICAgIAorICAgIEVNUFRZX1JFR0lPTihuZXdSZWcpOworCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBhIHJlYXNvbmFibGUgbnVtYmVyIG9mIHJlY3RhbmdsZXMgZm9yIHRoZSBuZXcgcmVnaW9uLiBUaGUgaWRlYQorICAgICAqIGlzIHRvIGFsbG9jYXRlIGVub3VnaCBzbyB0aGUgaW5kaXZpZHVhbCBmdW5jdGlvbnMgZG9uJ3QgbmVlZCB0bworICAgICAqIHJlYWxsb2NhdGUgYW5kIGNvcHkgdGhlIGFycmF5LCB3aGljaCBpcyB0aW1lIGNvbnN1bWluZywgeWV0IHdlIGRvbid0CisgICAgICogaGF2ZSB0byB3b3JyeSBhYm91dCB1c2luZyB0b28gbXVjaCBtZW1vcnkuIEkgaG9wZSB0byBiZSBhYmxlIHRvCisgICAgICogbnVrZSB0aGUgWHJlYWxsb2MoKSBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24gZXZlbnR1YWxseS4KKyAgICAgKi8KKyAgICBuZXdSZWctPnNpemUgPSBtYXgocmVnMS0+bnVtUmVjdHMscmVnMi0+bnVtUmVjdHMpICogMjsKKworICAgIGlmICghIChuZXdSZWctPnJlY3RzID0gKEJveFB0cikKKwkgICBYbWFsbG9jICgodW5zaWduZWQpIChzaXplb2YoQm94UmVjKSAqIG5ld1JlZy0+c2l6ZSkpKSkgeworCW5ld1JlZy0+c2l6ZSA9IDA7CisJcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIEluaXRpYWxpemUgeWJvdCBhbmQgeXRvcC4KKyAgICAgKiBJbiB0aGUgdXBjb21pbmcgbG9vcCwgeWJvdCBhbmQgeXRvcCBzZXJ2ZSBkaWZmZXJlbnQgZnVuY3Rpb25zIGRlcGVuZGluZworICAgICAqIG9uIHdoZXRoZXIgdGhlIGJhbmQgYmVpbmcgaGFuZGxlZCBpcyBhbiBvdmVybGFwcGluZyBvciBub24tb3ZlcmxhcHBpbmcKKyAgICAgKiBiYW5kLgorICAgICAqIAlJbiB0aGUgY2FzZSBvZiBhIG5vbi1vdmVybGFwcGluZyBiYW5kIChvbmx5IG9uZSBvZiB0aGUgcmVnaW9ucworICAgICAqIGhhcyBwb2ludHMgaW4gdGhlIGJhbmQpLCB5Ym90IGlzIHRoZSBib3R0b20gb2YgdGhlIG1vc3QgcmVjZW50CisgICAgICogaW50ZXJzZWN0aW9uIGFuZCB0aHVzIGNsaXBzIHRoZSB0b3Agb2YgdGhlIHJlY3RhbmdsZXMgaW4gdGhhdCBiYW5kLgorICAgICAqIHl0b3AgaXMgdGhlIHRvcCBvZiB0aGUgbmV4dCBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgdHdvIHJlZ2lvbnMgYW5kCisgICAgICogc2VydmVzIHRvIGNsaXAgdGhlIGJvdHRvbSBvZiB0aGUgcmVjdGFuZ2xlcyBpbiB0aGUgY3VycmVudCBiYW5kLgorICAgICAqCUZvciBhbiBvdmVybGFwcGluZyBiYW5kICh3aGVyZSB0aGUgdHdvIHJlZ2lvbnMgaW50ZXJzZWN0KSwgeXRvcCBjbGlwcworICAgICAqIHRoZSB0b3Agb2YgdGhlIHJlY3RhbmdsZXMgb2YgYm90aCByZWdpb25zIGFuZCB5Ym90IGNsaXBzIHRoZSBib3R0b21zLgorICAgICAqLworICAgIGlmIChyZWcxLT5leHRlbnRzLnkxIDwgcmVnMi0+ZXh0ZW50cy55MSkKKwl5Ym90ID0gcmVnMS0+ZXh0ZW50cy55MTsKKyAgICBlbHNlCisJeWJvdCA9IHJlZzItPmV4dGVudHMueTE7CisgICAgCisgICAgLyoKKyAgICAgKiBwcmV2QmFuZCBzZXJ2ZXMgdG8gbWFyayB0aGUgc3RhcnQgb2YgdGhlIHByZXZpb3VzIGJhbmQgc28gcmVjdGFuZ2xlcworICAgICAqIGNhbiBiZSBjb2FsZXNjZWQgaW50byBsYXJnZXIgcmVjdGFuZ2xlcy4gcXYuIG1pQ29hbGVzY2UsIGFib3ZlLgorICAgICAqIEluIHRoZSBiZWdpbm5pbmcsIHRoZXJlIGlzIG5vIHByZXZpb3VzIGJhbmQsIHNvIHByZXZCYW5kID09IGN1ckJhbmQKKyAgICAgKiAoY3VyQmFuZCBpcyBzZXQgbGF0ZXIgb24sIG9mIGNvdXJzZSwgYnV0IHRoZSBmaXJzdCBiYW5kIHdpbGwgYWx3YXlzCisgICAgICogc3RhcnQgYXQgaW5kZXggMCkuIHByZXZCYW5kIGFuZCBjdXJCYW5kIG11c3QgYmUgaW5kaWNlcyBiZWNhdXNlIG9mCisgICAgICogdGhlIHBvc3NpYmxlIGV4cGFuc2lvbiwgYW5kIHJlc3VsdGFudCBtb3ZpbmcsIG9mIHRoZSBuZXcgcmVnaW9uJ3MKKyAgICAgKiBhcnJheSBvZiByZWN0YW5nbGVzLgorICAgICAqLworICAgIHByZXZCYW5kID0gMDsKKyAgICAKKyAgICBkbworICAgIHsKKwljdXJCYW5kID0gbmV3UmVnLT5udW1SZWN0czsKKworCS8qCisJICogVGhpcyBhbGdvcml0aG0gcHJvY2VlZHMgb25lIHNvdXJjZS1iYW5kIChhcyBvcHBvc2VkIHRvIGEKKwkgKiBkZXN0aW5hdGlvbiBiYW5kLCB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IHdoZXJlIHRoZSB0d28gcmVnaW9ucworCSAqIGludGVyc2VjdCkgYXQgYSB0aW1lLiByMUJhbmRFbmQgYW5kIHIyQmFuZEVuZCBzZXJ2ZSB0byBtYXJrIHRoZQorCSAqIHJlY3RhbmdsZSBhZnRlciB0aGUgbGFzdCBvbmUgaW4gdGhlIGN1cnJlbnQgYmFuZCBmb3IgdGhlaXIKKwkgKiByZXNwZWN0aXZlIHJlZ2lvbnMuCisJICovCisJcjFCYW5kRW5kID0gcjE7CisJd2hpbGUgKChyMUJhbmRFbmQgIT0gcjFFbmQpICYmIChyMUJhbmRFbmQtPnkxID09IHIxLT55MSkpCisJeworCSAgICByMUJhbmRFbmQrKzsKKwl9CisJCisJcjJCYW5kRW5kID0gcjI7CisJd2hpbGUgKChyMkJhbmRFbmQgIT0gcjJFbmQpICYmIChyMkJhbmRFbmQtPnkxID09IHIyLT55MSkpCisJeworCSAgICByMkJhbmRFbmQrKzsKKwl9CisJCisJLyoKKwkgKiBGaXJzdCBoYW5kbGUgdGhlIGJhbmQgdGhhdCBkb2Vzbid0IGludGVyc2VjdCwgaWYgYW55LgorCSAqCisJICogTm90ZSB0aGF0IGF0dGVudGlvbiBpcyByZXN0cmljdGVkIHRvIG9uZSBiYW5kIGluIHRoZQorCSAqIG5vbi1pbnRlcnNlY3RpbmcgcmVnaW9uIGF0IG9uY2UsIHNvIGlmIGEgcmVnaW9uIGhhcyBuCisJICogYmFuZHMgYmV0d2VlbiB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgdGhlIG5leHQgcGxhY2UgaXQgb3ZlcmxhcHMKKwkgKiB0aGUgb3RoZXIsIHRoaXMgZW50aXJlIGxvb3Agd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCBuIHRpbWVzLgorCSAqLworCWlmIChyMS0+eTEgPCByMi0+eTEpCisJeworCSAgICB0b3AgPSBtYXgocjEtPnkxLHlib3QpOworCSAgICBib3QgPSBtaW4ocjEtPnkyLHIyLT55MSk7CisKKwkgICAgaWYgKCh0b3AgIT0gYm90KSAmJiAobm9uT3ZlcmxhcDFGdW5jICE9ICh2b2lkICgqKSgpKU5VTEwpKQorCSAgICB7CisJCSgqIG5vbk92ZXJsYXAxRnVuYykgKG5ld1JlZywgcjEsIHIxQmFuZEVuZCwgdG9wLCBib3QpOworCSAgICB9CisKKwkgICAgeXRvcCA9IHIyLT55MTsKKwl9CisJZWxzZSBpZiAocjItPnkxIDwgcjEtPnkxKQorCXsKKwkgICAgdG9wID0gbWF4KHIyLT55MSx5Ym90KTsKKwkgICAgYm90ID0gbWluKHIyLT55MixyMS0+eTEpOworCisJICAgIGlmICgodG9wICE9IGJvdCkgJiYgKG5vbk92ZXJsYXAyRnVuYyAhPSAodm9pZCAoKikoKSlOVUxMKSkKKwkgICAgeworCQkoKiBub25PdmVybGFwMkZ1bmMpIChuZXdSZWcsIHIyLCByMkJhbmRFbmQsIHRvcCwgYm90KTsKKwkgICAgfQorCisJICAgIHl0b3AgPSByMS0+eTE7CisJfQorCWVsc2UKKwl7CisJICAgIHl0b3AgPSByMS0+eTE7CisJfQorCisJLyoKKwkgKiBJZiBhbnkgcmVjdGFuZ2xlcyBnb3QgYWRkZWQgdG8gdGhlIHJlZ2lvbiwgdHJ5IGFuZCBjb2FsZXNjZSB0aGVtCisJICogd2l0aCByZWN0YW5nbGVzIGZyb20gdGhlIHByZXZpb3VzIGJhbmQuIE5vdGUgd2UgY291bGQganVzdCBkbworCSAqIHRoaXMgdGVzdCBpbiBtaUNvYWxlc2NlLCBidXQgc29tZSBtYWNoaW5lcyBpbmN1ciBhIG5vdAorCSAqIGluY29uc2lkZXJhYmxlIGNvc3QgZm9yIGZ1bmN0aW9uIGNhbGxzLCBzby4uLgorCSAqLworCWlmIChuZXdSZWctPm51bVJlY3RzICE9IGN1ckJhbmQpCisJeworCSAgICBwcmV2QmFuZCA9IG1pQ29hbGVzY2UgKG5ld1JlZywgcHJldkJhbmQsIGN1ckJhbmQpOworCX0KKworCS8qCisJICogTm93IHNlZSBpZiB3ZSd2ZSBoaXQgYW4gaW50ZXJzZWN0aW5nIGJhbmQuIFRoZSB0d28gYmFuZHMgb25seQorCSAqIGludGVyc2VjdCBpZiB5Ym90ID4geXRvcAorCSAqLworCXlib3QgPSBtaW4ocjEtPnkyLCByMi0+eTIpOworCWN1ckJhbmQgPSBuZXdSZWctPm51bVJlY3RzOworCWlmICh5Ym90ID4geXRvcCkKKwl7CisJICAgICgqIG92ZXJsYXBGdW5jKSAobmV3UmVnLCByMSwgcjFCYW5kRW5kLCByMiwgcjJCYW5kRW5kLCB5dG9wLCB5Ym90KTsKKworCX0KKwkKKwlpZiAobmV3UmVnLT5udW1SZWN0cyAhPSBjdXJCYW5kKQorCXsKKwkgICAgcHJldkJhbmQgPSBtaUNvYWxlc2NlIChuZXdSZWcsIHByZXZCYW5kLCBjdXJCYW5kKTsKKwl9CisKKwkvKgorCSAqIElmIHdlJ3ZlIGZpbmlzaGVkIHdpdGggYSBiYW5kICh5MiA9PSB5Ym90KSB3ZSBza2lwIGZvcndhcmQKKwkgKiBpbiB0aGUgcmVnaW9uIHRvIHRoZSBuZXh0IGJhbmQuCisJICovCisJaWYgKHIxLT55MiA9PSB5Ym90KQorCXsKKwkgICAgcjEgPSByMUJhbmRFbmQ7CisJfQorCWlmIChyMi0+eTIgPT0geWJvdCkKKwl7CisJICAgIHIyID0gcjJCYW5kRW5kOworCX0KKyAgICB9IHdoaWxlICgocjEgIT0gcjFFbmQpICYmIChyMiAhPSByMkVuZCkpOworCisgICAgLyoKKyAgICAgKiBEZWFsIHdpdGggd2hpY2hldmVyIHJlZ2lvbiBzdGlsbCBoYXMgcmVjdGFuZ2xlcyBsZWZ0LgorICAgICAqLworICAgIGN1ckJhbmQgPSBuZXdSZWctPm51bVJlY3RzOworICAgIGlmIChyMSAhPSByMUVuZCkKKyAgICB7CisJaWYgKG5vbk92ZXJsYXAxRnVuYyAhPSAodm9pZCAoKikoKSlOVUxMKQorCXsKKwkgICAgZG8KKwkgICAgeworCQlyMUJhbmRFbmQgPSByMTsKKwkJd2hpbGUgKChyMUJhbmRFbmQgPCByMUVuZCkgJiYgKHIxQmFuZEVuZC0+eTEgPT0gcjEtPnkxKSkKKwkJeworCQkgICAgcjFCYW5kRW5kKys7CisJCX0KKwkJKCogbm9uT3ZlcmxhcDFGdW5jKSAobmV3UmVnLCByMSwgcjFCYW5kRW5kLAorCQkJCSAgICAgbWF4KHIxLT55MSx5Ym90KSwgcjEtPnkyKTsKKwkJcjEgPSByMUJhbmRFbmQ7CisJICAgIH0gd2hpbGUgKHIxICE9IHIxRW5kKTsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKChyMiAhPSByMkVuZCkgJiYgKG5vbk92ZXJsYXAyRnVuYyAhPSAodm9pZCAoKikoKSlOVUxMKSkKKyAgICB7CisJZG8KKwl7CisJICAgIHIyQmFuZEVuZCA9IHIyOworCSAgICB3aGlsZSAoKHIyQmFuZEVuZCA8IHIyRW5kKSAmJiAocjJCYW5kRW5kLT55MSA9PSByMi0+eTEpKQorCSAgICB7CisJCSByMkJhbmRFbmQrKzsKKwkgICAgfQorCSAgICAoKiBub25PdmVybGFwMkZ1bmMpIChuZXdSZWcsIHIyLCByMkJhbmRFbmQsCisJCQkJbWF4KHIyLT55MSx5Ym90KSwgcjItPnkyKTsKKwkgICAgcjIgPSByMkJhbmRFbmQ7CisJfSB3aGlsZSAocjIgIT0gcjJFbmQpOworICAgIH0KKworICAgIGlmIChuZXdSZWctPm51bVJlY3RzICE9IGN1ckJhbmQpCisgICAgeworCSh2b2lkKSBtaUNvYWxlc2NlIChuZXdSZWcsIHByZXZCYW5kLCBjdXJCYW5kKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEEgYml0IG9mIGNsZWFudXAuIFRvIGtlZXAgcmVnaW9ucyBmcm9tIGdyb3dpbmcgd2l0aG91dCBib3VuZCwKKyAgICAgKiB3ZSBzaHJpbmsgdGhlIGFycmF5IG9mIHJlY3RhbmdsZXMgdG8gbWF0Y2ggdGhlIG5ldyBudW1iZXIgb2YKKyAgICAgKiByZWN0YW5nbGVzIGluIHRoZSByZWdpb24uIFRoaXMgbmV2ZXIgZ29lcyB0byAwLCBob3dldmVyLi4uCisgICAgICoKKyAgICAgKiBPbmx5IGRvIHRoaXMgc3R1ZmYgaWYgdGhlIG51bWJlciBvZiByZWN0YW5nbGVzIGFsbG9jYXRlZCBpcyBtb3JlIHRoYW4KKyAgICAgKiB0d2ljZSB0aGUgbnVtYmVyIG9mIHJlY3RhbmdsZXMgaW4gdGhlIHJlZ2lvbiAoYSBzaW1wbGUgb3B0aW1pemF0aW9uLi4uKS4KKyAgICAgKi8KKyAgICBpZiAobmV3UmVnLT5udW1SZWN0cyA8IChuZXdSZWctPnNpemUgPj4gMSkpCisgICAgeworCWlmIChSRUdJT05fTk9UX0VNUFRZKG5ld1JlZykpCisJeworCSAgICBCb3hQdHIgcHJldl9yZWN0cyA9IG5ld1JlZy0+cmVjdHM7CisJICAgIG5ld1JlZy0+c2l6ZSA9IG5ld1JlZy0+bnVtUmVjdHM7CisJICAgIG5ld1JlZy0+cmVjdHMgPSAoQm94UHRyKSBYcmVhbGxvYyAoKGNoYXIgKikgbmV3UmVnLT5yZWN0cywKKwkJCQkgICAodW5zaWduZWQpIChzaXplb2YoQm94UmVjKSAqIG5ld1JlZy0+c2l6ZSkpOworCSAgICBpZiAoISBuZXdSZWctPnJlY3RzKQorCQluZXdSZWctPnJlY3RzID0gcHJldl9yZWN0czsKKwl9CisJZWxzZQorCXsKKwkgICAgLyoKKwkgICAgICogTm8gcG9pbnQgaW4gZG9pbmcgdGhlIGV4dHJhIHdvcmsgaW52b2x2ZWQgaW4gYW4gWHJlYWxsb2MgaWYKKwkgICAgICogdGhlIHJlZ2lvbiBpcyBlbXB0eQorCSAgICAgKi8KKwkgICAgbmV3UmVnLT5zaXplID0gMTsKKwkgICAgWGZyZWUoKGNoYXIgKikgbmV3UmVnLT5yZWN0cyk7CisJICAgIG5ld1JlZy0+cmVjdHMgPSAoQm94UHRyKSBYbWFsbG9jKHNpemVvZihCb3hSZWMpKTsKKwl9CisgICAgfQorICAgIFhmcmVlICgoY2hhciAqKSBvbGRSZWN0cyk7CisgICAgcmV0dXJuOworfQorCisMCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCSAgICBSZWdpb24gVW5pb24KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG1pVW5pb25Ob25PIC0tCisgKglIYW5kbGUgYSBub24tb3ZlcmxhcHBpbmcgYmFuZCBmb3IgdGhlIHVuaW9uIG9wZXJhdGlvbi4gSnVzdAorICoJQWRkcyB0aGUgcmVjdGFuZ2xlcyBpbnRvIHRoZSByZWdpb24uIERvZXNuJ3QgaGF2ZSB0byBjaGVjayBmb3IKKyAqCXN1YnN1bXB0aW9uIG9yIGFueXRoaW5nLgorICoKKyAqIFJlc3VsdHM6CisgKglOb25lLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCXBSZWctPm51bVJlY3RzIGlzIGluY3JlbWVudGVkIGFuZCB0aGUgZmluYWwgcmVjdGFuZ2xlcyBvdmVyd3JpdHRlbgorICoJd2l0aCB0aGUgcmVjdGFuZ2xlcyB3ZSdyZSBwYXNzZWQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBzdGF0aWMgdm9pZCovCitzdGF0aWMgaW50CittaVVuaW9uTm9uTyAocFJlZywgciwgckVuZCwgeTEsIHkyKQorICAgIHJlZ2lzdGVyIFJlZ2lvbglwUmVnOworICAgIHJlZ2lzdGVyIEJveFB0cglyOworICAgIEJveFB0ciAgCSAgCXJFbmQ7CisgICAgcmVnaXN0ZXIgc2hvcnQgIAl5MTsKKyAgICByZWdpc3RlciBzaG9ydCAgCXkyOworeworICAgIHJlZ2lzdGVyIEJveFB0cglwTmV4dFJlY3Q7CisKKyAgICBwTmV4dFJlY3QgPSAmcFJlZy0+cmVjdHNbcFJlZy0+bnVtUmVjdHNdOworCisgICAgYXNzZXJ0KHkxIDwgeTIpOworCisgICAgd2hpbGUgKHIgIT0gckVuZCkKKyAgICB7CisJYXNzZXJ0KHItPngxIDwgci0+eDIpOworCU1FTUNIRUNLKHBSZWcsIHBOZXh0UmVjdCwgcFJlZy0+cmVjdHMpOworCXBOZXh0UmVjdC0+eDEgPSByLT54MTsKKwlwTmV4dFJlY3QtPnkxID0geTE7CisJcE5leHRSZWN0LT54MiA9IHItPngyOworCXBOZXh0UmVjdC0+eTIgPSB5MjsKKwlwUmVnLT5udW1SZWN0cyArPSAxOworCXBOZXh0UmVjdCsrOworCisJYXNzZXJ0KHBSZWctPm51bVJlY3RzPD1wUmVnLT5zaXplKTsKKwlyKys7CisgICAgfQorICAgIHJldHVybiAwOwkvKiBsaW50ICovCit9CisKKworLyotCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtaVVuaW9uTyAtLQorICoJSGFuZGxlIGFuIG92ZXJsYXBwaW5nIGJhbmQgZm9yIHRoZSB1bmlvbiBvcGVyYXRpb24uIFBpY2tzIHRoZQorICoJbGVmdC1tb3N0IHJlY3RhbmdsZSBlYWNoIHRpbWUgYW5kIG1lcmdlcyBpdCBpbnRvIHRoZSByZWdpb24uCisgKgorICogUmVzdWx0czoKKyAqCU5vbmUuCisgKgorICogU2lkZSBFZmZlY3RzOgorICoJUmVjdGFuZ2xlcyBhcmUgb3ZlcndyaXR0ZW4gaW4gcFJlZy0+cmVjdHMgYW5kIHBSZWctPm51bVJlY3RzIHdpbGwKKyAqCWJlIGNoYW5nZWQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIHN0YXRpYyB2b2lkKi8KK3N0YXRpYyBpbnQKK21pVW5pb25PIChwUmVnLCByMSwgcjFFbmQsIHIyLCByMkVuZCwgeTEsIHkyKQorICAgIHJlZ2lzdGVyIFJlZ2lvbglwUmVnOworICAgIHJlZ2lzdGVyIEJveFB0cglyMTsKKyAgICBCb3hQdHIgIAkgIAlyMUVuZDsKKyAgICByZWdpc3RlciBCb3hQdHIJcjI7CisgICAgQm94UHRyICAJICAJcjJFbmQ7CisgICAgcmVnaXN0ZXIgc2hvcnQJeTE7CisgICAgcmVnaXN0ZXIgc2hvcnQJeTI7Cit7CisgICAgcmVnaXN0ZXIgQm94UHRyCXBOZXh0UmVjdDsKKyAgICAKKyAgICBwTmV4dFJlY3QgPSAmcFJlZy0+cmVjdHNbcFJlZy0+bnVtUmVjdHNdOworCisjZGVmaW5lIE1FUkdFUkVDVChyKSBcCisgICAgaWYgKChwUmVnLT5udW1SZWN0cyAhPSAwKSAmJiAgXAorCShwTmV4dFJlY3RbLTFdLnkxID09IHkxKSAmJiAgXAorCShwTmV4dFJlY3RbLTFdLnkyID09IHkyKSAmJiAgXAorCShwTmV4dFJlY3RbLTFdLngyID49IHItPngxKSkgIFwKKyAgICB7ICBcCisJaWYgKHBOZXh0UmVjdFstMV0ueDIgPCByLT54MikgIFwKKwl7ICBcCisJICAgIHBOZXh0UmVjdFstMV0ueDIgPSByLT54MjsgIFwKKwkgICAgYXNzZXJ0KHBOZXh0UmVjdFstMV0ueDE8cE5leHRSZWN0Wy0xXS54Mik7IFwKKwl9ICBcCisgICAgfSAgXAorICAgIGVsc2UgIFwKKyAgICB7ICBcCisJTUVNQ0hFQ0socFJlZywgcE5leHRSZWN0LCBwUmVnLT5yZWN0cyk7ICBcCisJcE5leHRSZWN0LT55MSA9IHkxOyAgXAorCXBOZXh0UmVjdC0+eTIgPSB5MjsgIFwKKwlwTmV4dFJlY3QtPngxID0gci0+eDE7ICBcCisJcE5leHRSZWN0LT54MiA9IHItPngyOyAgXAorCXBSZWctPm51bVJlY3RzICs9IDE7ICBcCisgICAgICAgIHBOZXh0UmVjdCArPSAxOyAgXAorICAgIH0gIFwKKyAgICBhc3NlcnQocFJlZy0+bnVtUmVjdHM8PXBSZWctPnNpemUpO1wKKyAgICByKys7CisgICAgCisgICAgYXNzZXJ0ICh5MTx5Mik7CisgICAgd2hpbGUgKChyMSAhPSByMUVuZCkgJiYgKHIyICE9IHIyRW5kKSkKKyAgICB7CisJaWYgKHIxLT54MSA8IHIyLT54MSkKKwl7CisJICAgIE1FUkdFUkVDVChyMSk7CisJfQorCWVsc2UKKwl7CisJICAgIE1FUkdFUkVDVChyMik7CisJfQorICAgIH0KKyAgICAKKyAgICBpZiAocjEgIT0gcjFFbmQpCisgICAgeworCWRvCisJeworCSAgICBNRVJHRVJFQ1QocjEpOworCX0gd2hpbGUgKHIxICE9IHIxRW5kKTsKKyAgICB9CisgICAgZWxzZSB3aGlsZSAocjIgIT0gcjJFbmQpCisgICAgeworCU1FUkdFUkVDVChyMik7CisgICAgfQorICAgIHJldHVybiAwOwkvKiBsaW50ICovCit9CisKK2ludAorWFVuaW9uUmVnaW9uKHJlZzEsIHJlZzIsIG5ld1JlZykKKyAgICBSZWdpb24gCSAgcmVnMTsKKyAgICBSZWdpb24JICByZWcyOyAgICAgICAgICAgICAvKiBzb3VyY2UgcmVnaW9ucyAgICAgKi8KKyAgICBSZWdpb24gCSAgbmV3UmVnOyAgICAgICAgICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIFJlZ2lvbiAqLworeworICAgIC8qICBjaGVja3MgYWxsIHRoZSBzaW1wbGUgY2FzZXMgKi8KKworICAgIC8qCisgICAgICogUmVnaW9uIDEgYW5kIDIgYXJlIHRoZSBzYW1lIG9yIHJlZ2lvbiAxIGlzIGVtcHR5CisgICAgICovCisgICAgaWYgKCAocmVnMSA9PSByZWcyKSB8fCAoIShyZWcxLT5udW1SZWN0cykpICkKKyAgICB7CisgICAgICAgIGlmIChuZXdSZWcgIT0gcmVnMikKKyAgICAgICAgICAgIG1pUmVnaW9uQ29weShuZXdSZWcsIHJlZzIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGlmIG5vdGhpbmcgdG8gdW5pb24gKHJlZ2lvbiAyIGVtcHR5KQorICAgICAqLworICAgIGlmICghKHJlZzItPm51bVJlY3RzKSkKKyAgICB7CisgICAgICAgIGlmIChuZXdSZWcgIT0gcmVnMSkKKyAgICAgICAgICAgIG1pUmVnaW9uQ29weShuZXdSZWcsIHJlZzEpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlZ2lvbiAxIGNvbXBsZXRlbHkgc3Vic3VtZXMgcmVnaW9uIDIKKyAgICAgKi8KKyAgICBpZiAoKHJlZzEtPm51bVJlY3RzID09IDEpICYmIAorCShyZWcxLT5leHRlbnRzLngxIDw9IHJlZzItPmV4dGVudHMueDEpICYmCisJKHJlZzEtPmV4dGVudHMueTEgPD0gcmVnMi0+ZXh0ZW50cy55MSkgJiYKKwkocmVnMS0+ZXh0ZW50cy54MiA+PSByZWcyLT5leHRlbnRzLngyKSAmJgorCShyZWcxLT5leHRlbnRzLnkyID49IHJlZzItPmV4dGVudHMueTIpKQorICAgIHsKKyAgICAgICAgaWYgKG5ld1JlZyAhPSByZWcxKQorICAgICAgICAgICAgbWlSZWdpb25Db3B5KG5ld1JlZywgcmVnMSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qCisgICAgICogUmVnaW9uIDIgY29tcGxldGVseSBzdWJzdW1lcyByZWdpb24gMQorICAgICAqLworICAgIGlmICgocmVnMi0+bnVtUmVjdHMgPT0gMSkgJiYgCisJKHJlZzItPmV4dGVudHMueDEgPD0gcmVnMS0+ZXh0ZW50cy54MSkgJiYKKwkocmVnMi0+ZXh0ZW50cy55MSA8PSByZWcxLT5leHRlbnRzLnkxKSAmJgorCShyZWcyLT5leHRlbnRzLngyID49IHJlZzEtPmV4dGVudHMueDIpICYmCisJKHJlZzItPmV4dGVudHMueTIgPj0gcmVnMS0+ZXh0ZW50cy55MikpCisgICAgeworICAgICAgICBpZiAobmV3UmVnICE9IHJlZzIpCisgICAgICAgICAgICBtaVJlZ2lvbkNvcHkobmV3UmVnLCByZWcyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbWlSZWdpb25PcCAobmV3UmVnLCByZWcxLCByZWcyLCAodm9pZFByb2NwKSBtaVVuaW9uTywgCisgICAgCQkodm9pZFByb2NwKSBtaVVuaW9uTm9uTywgKHZvaWRQcm9jcCkgbWlVbmlvbk5vbk8pOworCisgICAgbmV3UmVnLT5leHRlbnRzLngxID0gbWluKHJlZzEtPmV4dGVudHMueDEsIHJlZzItPmV4dGVudHMueDEpOworICAgIG5ld1JlZy0+ZXh0ZW50cy55MSA9IG1pbihyZWcxLT5leHRlbnRzLnkxLCByZWcyLT5leHRlbnRzLnkxKTsKKyAgICBuZXdSZWctPmV4dGVudHMueDIgPSBtYXgocmVnMS0+ZXh0ZW50cy54MiwgcmVnMi0+ZXh0ZW50cy54Mik7CisgICAgbmV3UmVnLT5leHRlbnRzLnkyID0gbWF4KHJlZzEtPmV4dGVudHMueTIsIHJlZzItPmV4dGVudHMueTIpOworCisgICAgcmV0dXJuIDE7Cit9CisKKwwKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCSAgICAJICBSZWdpb24gU3VidHJhY3Rpb24KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG1pU3VidHJhY3ROb25PIC0tCisgKglEZWFsIHdpdGggbm9uLW92ZXJsYXBwaW5nIGJhbmQgZm9yIHN1YnRyYWN0aW9uLiBBbnkgcGFydHMgZnJvbQorICoJcmVnaW9uIDIgd2UgZGlzY2FyZC4gQW55dGhpbmcgZnJvbSByZWdpb24gMSB3ZSBhZGQgdG8gdGhlIHJlZ2lvbi4KKyAqCisgKiBSZXN1bHRzOgorICoJTm9uZS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKglwUmVnIG1heSBiZSBhZmZlY3RlZC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIHN0YXRpYyB2b2lkKi8KK3N0YXRpYyBpbnQKK21pU3VidHJhY3ROb25PMSAocFJlZywgciwgckVuZCwgeTEsIHkyKQorICAgIHJlZ2lzdGVyIFJlZ2lvbglwUmVnOworICAgIHJlZ2lzdGVyIEJveFB0cglyOworICAgIEJveFB0ciAgCSAgCXJFbmQ7CisgICAgcmVnaXN0ZXIgc2hvcnQgIAl5MTsKKyAgICByZWdpc3RlciBzaG9ydCAgIAl5MjsKK3sKKyAgICByZWdpc3RlciBCb3hQdHIJcE5leHRSZWN0OworCQorICAgIHBOZXh0UmVjdCA9ICZwUmVnLT5yZWN0c1twUmVnLT5udW1SZWN0c107CisJCisgICAgYXNzZXJ0KHkxPHkyKTsKKworICAgIHdoaWxlIChyICE9IHJFbmQpCisgICAgeworCWFzc2VydChyLT54MTxyLT54Mik7CisJTUVNQ0hFQ0socFJlZywgcE5leHRSZWN0LCBwUmVnLT5yZWN0cyk7CisJcE5leHRSZWN0LT54MSA9IHItPngxOworCXBOZXh0UmVjdC0+eTEgPSB5MTsKKwlwTmV4dFJlY3QtPngyID0gci0+eDI7CisJcE5leHRSZWN0LT55MiA9IHkyOworCXBSZWctPm51bVJlY3RzICs9IDE7CisJcE5leHRSZWN0Kys7CisKKwlhc3NlcnQocFJlZy0+bnVtUmVjdHMgPD0gcFJlZy0+c2l6ZSk7CisKKwlyKys7CisgICAgfQorICAgIHJldHVybiAwOwkvKiBsaW50ICovCit9CisKKy8qLQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbWlTdWJ0cmFjdE8gLS0KKyAqCU92ZXJsYXBwaW5nIGJhbmQgc3VidHJhY3Rpb24uIHgxIGlzIHRoZSBsZWZ0LW1vc3QgcG9pbnQgbm90IHlldAorICoJY2hlY2tlZC4KKyAqCisgKiBSZXN1bHRzOgorICoJTm9uZS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKglwUmVnIG1heSBoYXZlIHJlY3RhbmdsZXMgYWRkZWQgdG8gaXQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBzdGF0aWMgdm9pZCovCitzdGF0aWMgaW50CittaVN1YnRyYWN0TyAocFJlZywgcjEsIHIxRW5kLCByMiwgcjJFbmQsIHkxLCB5MikKKyAgICByZWdpc3RlciBSZWdpb24JcFJlZzsKKyAgICByZWdpc3RlciBCb3hQdHIJcjE7CisgICAgQm94UHRyICAJICAJcjFFbmQ7CisgICAgcmVnaXN0ZXIgQm94UHRyCXIyOworICAgIEJveFB0ciAgCSAgCXIyRW5kOworICAgIHJlZ2lzdGVyIHNob3J0ICAJeTE7CisgICAgcmVnaXN0ZXIgc2hvcnQgIAl5MjsKK3sKKyAgICByZWdpc3RlciBCb3hQdHIJcE5leHRSZWN0OworICAgIHJlZ2lzdGVyIGludCAgCXgxOworICAgIAorICAgIHgxID0gcjEtPngxOworICAgIAorICAgIGFzc2VydCh5MTx5Mik7CisgICAgcE5leHRSZWN0ID0gJnBSZWctPnJlY3RzW3BSZWctPm51bVJlY3RzXTsKKworICAgIHdoaWxlICgocjEgIT0gcjFFbmQpICYmIChyMiAhPSByMkVuZCkpCisgICAgeworCWlmIChyMi0+eDIgPD0geDEpCisJeworCSAgICAvKgorCSAgICAgKiBTdWJ0cmFoZW5kIG1pc3NlZCB0aGUgYm9hdDogZ28gdG8gbmV4dCBzdWJ0cmFoZW5kLgorCSAgICAgKi8KKwkgICAgcjIrKzsKKwl9CisJZWxzZSBpZiAocjItPngxIDw9IHgxKQorCXsKKwkgICAgLyoKKwkgICAgICogU3VidHJhaGVuZCBwcmVjZWVkcyBtaW51ZW5kOiBudWtlIGxlZnQgZWRnZSBvZiBtaW51ZW5kLgorCSAgICAgKi8KKwkgICAgeDEgPSByMi0+eDI7CisJICAgIGlmICh4MSA+PSByMS0+eDIpCisJICAgIHsKKwkJLyoKKwkJICogTWludWVuZCBjb21wbGV0ZWx5IGNvdmVyZWQ6IGFkdmFuY2UgdG8gbmV4dCBtaW51ZW5kIGFuZAorCQkgKiByZXNldCBsZWZ0IGZlbmNlIHRvIGVkZ2Ugb2YgbmV3IG1pbnVlbmQuCisJCSAqLworCQlyMSsrOworCQlpZiAocjEgIT0gcjFFbmQpCisJCSAgICB4MSA9IHIxLT54MTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyoKKwkJICogU3VidHJhaGVuZCBub3cgdXNlZCB1cCBzaW5jZSBpdCBkb2Vzbid0IGV4dGVuZCBiZXlvbmQKKwkJICogbWludWVuZAorCQkgKi8KKwkJcjIrKzsKKwkgICAgfQorCX0KKwllbHNlIGlmIChyMi0+eDEgPCByMS0+eDIpCisJeworCSAgICAvKgorCSAgICAgKiBMZWZ0IHBhcnQgb2Ygc3VidHJhaGVuZCBjb3ZlcnMgcGFydCBvZiBtaW51ZW5kOiBhZGQgdW5jb3ZlcmVkCisJICAgICAqIHBhcnQgb2YgbWludWVuZCB0byByZWdpb24gYW5kIHNraXAgdG8gbmV4dCBzdWJ0cmFoZW5kLgorCSAgICAgKi8KKwkgICAgYXNzZXJ0KHgxPHIyLT54MSk7CisJICAgIE1FTUNIRUNLKHBSZWcsIHBOZXh0UmVjdCwgcFJlZy0+cmVjdHMpOworCSAgICBwTmV4dFJlY3QtPngxID0geDE7CisJICAgIHBOZXh0UmVjdC0+eTEgPSB5MTsKKwkgICAgcE5leHRSZWN0LT54MiA9IHIyLT54MTsKKwkgICAgcE5leHRSZWN0LT55MiA9IHkyOworCSAgICBwUmVnLT5udW1SZWN0cyArPSAxOworCSAgICBwTmV4dFJlY3QrKzsKKworCSAgICBhc3NlcnQocFJlZy0+bnVtUmVjdHM8PXBSZWctPnNpemUpOworCisJICAgIHgxID0gcjItPngyOworCSAgICBpZiAoeDEgPj0gcjEtPngyKQorCSAgICB7CisJCS8qCisJCSAqIE1pbnVlbmQgdXNlZCB1cDogYWR2YW5jZSB0byBuZXcuLi4KKwkJICovCisJCXIxKys7CisJCWlmIChyMSAhPSByMUVuZCkKKwkJICAgIHgxID0gcjEtPngxOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKgorCQkgKiBTdWJ0cmFoZW5kIHVzZWQgdXAKKwkJICovCisJCXIyKys7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgLyoKKwkgICAgICogTWludWVuZCB1c2VkIHVwOiBhZGQgYW55IHJlbWFpbmluZyBwaWVjZSBiZWZvcmUgYWR2YW5jaW5nLgorCSAgICAgKi8KKwkgICAgaWYgKHIxLT54MiA+IHgxKQorCSAgICB7CisJCU1FTUNIRUNLKHBSZWcsIHBOZXh0UmVjdCwgcFJlZy0+cmVjdHMpOworCQlwTmV4dFJlY3QtPngxID0geDE7CisJCXBOZXh0UmVjdC0+eTEgPSB5MTsKKwkJcE5leHRSZWN0LT54MiA9IHIxLT54MjsKKwkJcE5leHRSZWN0LT55MiA9IHkyOworCQlwUmVnLT5udW1SZWN0cyArPSAxOworCQlwTmV4dFJlY3QrKzsKKwkJYXNzZXJ0KHBSZWctPm51bVJlY3RzPD1wUmVnLT5zaXplKTsKKwkgICAgfQorCSAgICByMSsrOworICAgICAgICAgICAgaWYgKHIxICE9IHIxRW5kKQorICAgICAgICAgICAgICB4MSA9IHIxLT54MTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBZGQgcmVtYWluaW5nIG1pbnVlbmQgcmVjdGFuZ2xlcyB0byByZWdpb24uCisgICAgICovCisgICAgd2hpbGUgKHIxICE9IHIxRW5kKQorICAgIHsKKwlhc3NlcnQoeDE8cjEtPngyKTsKKwlNRU1DSEVDSyhwUmVnLCBwTmV4dFJlY3QsIHBSZWctPnJlY3RzKTsKKwlwTmV4dFJlY3QtPngxID0geDE7CisJcE5leHRSZWN0LT55MSA9IHkxOworCXBOZXh0UmVjdC0+eDIgPSByMS0+eDI7CisJcE5leHRSZWN0LT55MiA9IHkyOworCXBSZWctPm51bVJlY3RzICs9IDE7CisJcE5leHRSZWN0Kys7CisKKwlhc3NlcnQocFJlZy0+bnVtUmVjdHM8PXBSZWctPnNpemUpOworCisJcjErKzsKKwlpZiAocjEgIT0gcjFFbmQpCisJeworCSAgICB4MSA9IHIxLT54MTsKKwl9CisgICAgfQorICAgIHJldHVybiAwOwkvKiBsaW50ICovCit9CisJCisvKi0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG1pU3VidHJhY3QgLS0KKyAqCVN1YnRyYWN0IHJlZ1MgZnJvbSByZWdNIGFuZCBsZWF2ZSB0aGUgcmVzdWx0IGluIHJlZ0QuCisgKglTIHN0YW5kcyBmb3Igc3VidHJhaGVuZCwgTSBmb3IgbWludWVuZCBhbmQgRCBmb3IgZGlmZmVyZW5jZS4KKyAqCisgKiBSZXN1bHRzOgorICoJVFJVRS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKglyZWdEIGlzIG92ZXJ3cml0dGVuLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitpbnQKK1hTdWJ0cmFjdFJlZ2lvbihyZWdNLCByZWdTLCByZWdEKQorICAgIFJlZ2lvbiAJICAJcmVnTTsKKyAgICBSZWdpb24JICAJcmVnUzsgICAgICAgICAgCisgICAgcmVnaXN0ZXIgUmVnaW9uCXJlZ0Q7Cit7CisgICAvKiBjaGVjayBmb3IgdHJpdmlhbCByZWplY3QgKi8KKyAgICBpZiAoICghKHJlZ00tPm51bVJlY3RzKSkgfHwgKCEocmVnUy0+bnVtUmVjdHMpKSAgfHwKKwkoIUVYVEVOVENIRUNLKCZyZWdNLT5leHRlbnRzLCAmcmVnUy0+ZXh0ZW50cykpICkKKyAgICB7CisJbWlSZWdpb25Db3B5KHJlZ0QsIHJlZ00pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgCisgICAgbWlSZWdpb25PcCAocmVnRCwgcmVnTSwgcmVnUywgKHZvaWRQcm9jcCkgbWlTdWJ0cmFjdE8sIAorICAgIAkJKHZvaWRQcm9jcCkgbWlTdWJ0cmFjdE5vbk8xLCAodm9pZFByb2NwKSBOVUxMKTsKKworICAgIC8qCisgICAgICogQ2FuJ3QgYWx0ZXIgbmV3UmVnJ3MgZXh0ZW50cyBiZWZvcmUgd2UgY2FsbCBtaVJlZ2lvbk9wIGJlY2F1c2UKKyAgICAgKiBpdCBtaWdodCBiZSBvbmUgb2YgdGhlIHNvdXJjZSByZWdpb25zIGFuZCBtaVJlZ2lvbk9wIGRlcGVuZHMKKyAgICAgKiBvbiB0aGUgZXh0ZW50cyBvZiB0aG9zZSByZWdpb25zIGJlaW5nIHRoZSB1bmFsdGVyZWQuIEJlc2lkZXMsIHRoaXMKKyAgICAgKiB3YXkgdGhlcmUncyBubyBjaGVja2luZyBhZ2FpbnN0IHJlY3RhbmdsZXMgdGhhdCB3aWxsIGJlIG51a2VkCisgICAgICogZHVlIHRvIGNvYWxlc2NpbmcsIHNvIHdlIGhhdmUgdG8gZXhhbWluZSBmZXdlciByZWN0YW5nbGVzLgorICAgICAqLworICAgIG1pU2V0RXh0ZW50cyAocmVnRCk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludAorWFhvclJlZ2lvbiggc3JhLCBzcmIsIGRyICkKKyAgICBSZWdpb24gc3JhLCBzcmIsIGRyOworeworICAgIFJlZ2lvbiB0cmEsIHRyYjsKKworICAgIGlmICgoISAodHJhID0gWENyZWF0ZVJlZ2lvbigpKSkgfHwgKCEgKHRyYiA9IFhDcmVhdGVSZWdpb24oKSkpKQorCXJldHVybiAwOworICAgICh2b2lkKSBYU3VidHJhY3RSZWdpb24oc3JhLHNyYix0cmEpOworICAgICh2b2lkKSBYU3VidHJhY3RSZWdpb24oc3JiLHNyYSx0cmIpOworICAgICh2b2lkKSBYVW5pb25SZWdpb24odHJhLHRyYixkcik7CisgICAgWERlc3Ryb3lSZWdpb24odHJhKTsKKyAgICBYRGVzdHJveVJlZ2lvbih0cmIpOworICAgIHJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIHRoZSByZWdpb24gaXMgZW1wdHkuICBBc3N1bWVzIGEgcmVnaW9uIGlzIHBhc3NlZCAKKyAqIGFzIGEgcGFyYW1ldGVyCisgKi8KK2ludCAKK1hFbXB0eVJlZ2lvbiggciApCisgICAgUmVnaW9uIHI7Cit7CisgICAgaWYoIHItPm51bVJlY3RzID09IDAgKSByZXR1cm4gVFJVRTsKKyAgICBlbHNlICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKglDaGVjayB0byBzZWUgaWYgdHdvIHJlZ2lvbnMgYXJlIGVxdWFsCQorICovCitpbnQgCitYRXF1YWxSZWdpb24oIHIxLCByMiApCisgICAgUmVnaW9uIHIxLCByMjsKK3sKKyAgICBpbnQgaTsKKworICAgIGlmKCByMS0+bnVtUmVjdHMgIT0gcjItPm51bVJlY3RzICkgcmV0dXJuIEZBTFNFOworICAgIGVsc2UgaWYoIHIxLT5udW1SZWN0cyA9PSAwICkgcmV0dXJuIFRSVUU7CisgICAgZWxzZSBpZiAoIHIxLT5leHRlbnRzLngxICE9IHIyLT5leHRlbnRzLngxICkgcmV0dXJuIEZBTFNFOworICAgIGVsc2UgaWYgKCByMS0+ZXh0ZW50cy54MiAhPSByMi0+ZXh0ZW50cy54MiApIHJldHVybiBGQUxTRTsKKyAgICBlbHNlIGlmICggcjEtPmV4dGVudHMueTEgIT0gcjItPmV4dGVudHMueTEgKSByZXR1cm4gRkFMU0U7CisgICAgZWxzZSBpZiAoIHIxLT5leHRlbnRzLnkyICE9IHIyLT5leHRlbnRzLnkyICkgcmV0dXJuIEZBTFNFOworICAgIGVsc2UgZm9yKCBpPTA7IGkgPCByMS0+bnVtUmVjdHM7IGkrKyApIHsKKyAgICAJaWYgKCByMS0+cmVjdHNbaV0ueDEgIT0gcjItPnJlY3RzW2ldLngxICkgcmV0dXJuIEZBTFNFOworICAgIAllbHNlIGlmICggcjEtPnJlY3RzW2ldLngyICE9IHIyLT5yZWN0c1tpXS54MiApIHJldHVybiBGQUxTRTsKKyAgICAJZWxzZSBpZiAoIHIxLT5yZWN0c1tpXS55MSAhPSByMi0+cmVjdHNbaV0ueTEgKSByZXR1cm4gRkFMU0U7CisgICAgCWVsc2UgaWYgKCByMS0+cmVjdHNbaV0ueTIgIT0gcjItPnJlY3RzW2ldLnkyICkgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworaW50IAorWFBvaW50SW5SZWdpb24oIHBSZWdpb24sIHgsIHkgKQorICAgIFJlZ2lvbiBwUmVnaW9uOworICAgIGludCB4LCB5OworeworICAgIGludCBpOworCisgICAgaWYgKHBSZWdpb24tPm51bVJlY3RzID09IDApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIUlOQk9YKHBSZWdpb24tPmV4dGVudHMsIHgsIHkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgZm9yIChpPTA7IGk8cFJlZ2lvbi0+bnVtUmVjdHM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChJTkJPWCAocFJlZ2lvbi0+cmVjdHNbaV0sIHgsIHkpKQorCSAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitpbnQgCitYUmVjdEluUmVnaW9uKHJlZ2lvbiwgcngsIHJ5LCByd2lkdGgsIHJoZWlnaHQpCisgICAgcmVnaXN0ZXIgUmVnaW9uCXJlZ2lvbjsKKyAgICBpbnQgcngsIHJ5OworICAgIHVuc2lnbmVkIGludCByd2lkdGgsIHJoZWlnaHQ7Cit7CisgICAgcmVnaXN0ZXIgQm94UHRyIHBib3g7CisgICAgcmVnaXN0ZXIgQm94UHRyIHBib3hFbmQ7CisgICAgQm94IHJlY3Q7CisgICAgcmVnaXN0ZXIgQm94UHRyIHByZWN0ID0gJnJlY3Q7CisgICAgaW50ICAgICAgcGFydEluLCBwYXJ0T3V0OworCisgICAgcHJlY3QtPngxID0gcng7CisgICAgcHJlY3QtPnkxID0gcnk7CisgICAgcHJlY3QtPngyID0gcndpZHRoICsgcng7CisgICAgcHJlY3QtPnkyID0gcmhlaWdodCArIHJ5OworICAgIAorICAgIC8qIHRoaXMgaXMgKGp1c3QpIGEgdXNlZnVsIG9wdGltaXphdGlvbiAqLworICAgIGlmICgocmVnaW9uLT5udW1SZWN0cyA9PSAwKSB8fCAhRVhURU5UQ0hFQ0soJnJlZ2lvbi0+ZXh0ZW50cywgcHJlY3QpKQorICAgICAgICByZXR1cm4oUmVjdGFuZ2xlT3V0KTsKKworICAgIHBhcnRPdXQgPSBGQUxTRTsKKyAgICBwYXJ0SW4gPSBGQUxTRTsKKworICAgIC8qIGNhbiBzdG9wIHdoZW4gYm90aCBwYXJ0T3V0IGFuZCBwYXJ0SW4gYXJlIFRSVUUsIG9yIHdlIHJlYWNoIHByZWN0LT55MiAqLworICAgIGZvciAocGJveCA9IHJlZ2lvbi0+cmVjdHMsIHBib3hFbmQgPSBwYm94ICsgcmVnaW9uLT5udW1SZWN0czsKKwkgcGJveCA8IHBib3hFbmQ7CisJIHBib3grKykKKyAgICB7CisKKwlpZiAocGJveC0+eTIgPD0gcnkpCisJICAgY29udGludWU7CS8qIGdldHRpbmcgdXAgdG8gc3BlZWQgb3Igc2tpcHBpbmcgcmVtYWluZGVyIG9mIGJhbmQgKi8KKworCWlmIChwYm94LT55MSA+IHJ5KQorCXsKKwkgICBwYXJ0T3V0ID0gVFJVRTsJLyogbWlzc2VkIHBhcnQgb2YgcmVjdGFuZ2xlIGFib3ZlICovCisJICAgaWYgKHBhcnRJbiB8fCAocGJveC0+eTEgPj0gcHJlY3QtPnkyKSkKKwkgICAgICBicmVhazsKKwkgICByeSA9IHBib3gtPnkxOwkvKiB4IGd1YXJhbnRlZWQgdG8gYmUgPT0gcHJlY3QtPngxICovCisJfQorCisJaWYgKHBib3gtPngyIDw9IHJ4KQorCSAgIGNvbnRpbnVlOwkJLyogbm90IGZhciBlbm91Z2ggb3ZlciB5ZXQgKi8KKworCWlmIChwYm94LT54MSA+IHJ4KQorCXsKKwkgICBwYXJ0T3V0ID0gVFJVRTsJLyogbWlzc2VkIHBhcnQgb2YgcmVjdGFuZ2xlIHRvIGxlZnQgKi8KKwkgICBpZiAocGFydEluKQorCSAgICAgIGJyZWFrOworCX0KKworCWlmIChwYm94LT54MSA8IHByZWN0LT54MikKKwl7CisJICAgIHBhcnRJbiA9IFRSVUU7CS8qIGRlZmluaXRlbHkgb3ZlcmxhcCAqLworCSAgICBpZiAocGFydE91dCkKKwkgICAgICAgYnJlYWs7CisJfQorCisJaWYgKHBib3gtPngyID49IHByZWN0LT54MikKKwl7CisJICAgcnkgPSBwYm94LT55MjsJLyogZmluaXNoZWQgd2l0aCB0aGlzIGJhbmQgKi8KKwkgICBpZiAocnkgPj0gcHJlY3QtPnkyKQorCSAgICAgIGJyZWFrOworCSAgIHJ4ID0gcHJlY3QtPngxOwkvKiByZXNldCB4IG91dCB0byBsZWZ0IGFnYWluICovCisJfSBlbHNlCisJeworCSAgICAvKgorCSAgICAgKiBCZWNhdXNlIGJveGVzIGluIGEgYmFuZCBhcmUgbWF4aW1hbCB3aWR0aCwgaWYgdGhlIGZpcnN0IGJveAorCSAgICAgKiB0byBvdmVybGFwIHRoZSByZWN0YW5nbGUgZG9lc24ndCBjb21wbGV0ZWx5IGNvdmVyIGl0IGluIHRoYXQKKwkgICAgICogYmFuZCwgdGhlIHJlY3RhbmdsZSBtdXN0IGJlIHBhcnRpYWxseSBvdXQsIHNpbmNlIHNvbWUgb2YgaXQKKwkgICAgICogd2lsbCBiZSB1bmNvdmVyZWQgaW4gdGhhdCBiYW5kLiBwYXJ0SW4gd2lsbCBoYXZlIGJlZW4gc2V0IHRydWUKKwkgICAgICogYnkgbm93Li4uCisJICAgICAqLworCSAgICBicmVhazsKKwl9CisKKyAgICB9CisKKyAgICByZXR1cm4ocGFydEluID8gKChyeSA8IHByZWN0LT55MikgPyBSZWN0YW5nbGVQYXJ0IDogUmVjdGFuZ2xlSW4pIDogCisJCVJlY3RhbmdsZU91dCk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vWHJlZ2lvbi9YcmVnaW9uLmRzcCBiL2NvbW1vbi9YcmVnaW9uL1hyZWdpb24uZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMGI1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vWHJlZ2lvbi9YcmVnaW9uLmRzcApAQCAtMCwwICsxLDEzMiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJYcmVnaW9uIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0DQorDQorQ0ZHPVhyZWdpb24gLSBXaW4zMiBEZWJ1ZyBVbmljb2RlDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJYcmVnaW9uLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJYcmVnaW9uLm1hayIgQ0ZHPSJYcmVnaW9uIC0gV2luMzIgRGVidWcgVW5pY29kZSINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAiWHJlZ2lvbiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJYcmVnaW9uIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJYcmVnaW9uIC0gV2luMzIgRGVidWcgVW5pY29kZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIlhyZWdpb24gLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiLi5cUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cUmVsZWFzZVxYcmVnaW9uIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0kgIi4uIiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlhyZWdpb24gLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiLi5cRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXERlYnVnXFhyZWdpb24iDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvSSAiLi4iIC9EICJfREVCVUciIC9EICJfTElCIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0ZEIC9HWiAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWA0KKyMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiWHJlZ2lvbiAtIFdpbjMyIERlYnVnIFVuaWNvZGUiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiWHJlZ2lvbl9fX1dpbjMyX0RlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiWHJlZ2lvbl9fX1dpbjMyX0RlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXERlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXERlYnVnX1VuaWNvZGVcWHJlZ2lvbiINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWkkgL09kIC9JICIuLiIgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRkQgL0daIC9jDQorIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgNCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aSSAvT2QgL0kgIi4uIiAvRCAiX0xJQiIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1VOSUNPREUiIC9EICJVTklDT0RFIiAvRkQgL0daIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYDQorIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSUIzMj1saW5rLmV4ZSAtbGliDQorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvDQorIyBBREQgTElCMzIgL25vbG9nbw0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiWHJlZ2lvbiAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJYcmVnaW9uIC0gV2luMzIgRGVidWciDQorIyBOYW1lICJYcmVnaW9uIC0gV2luMzIgRGVidWcgVW5pY29kZSINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxSZWdpb24uYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZWdpb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFhyZWdpb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvY29tbW9uL1hyZWdpb24vWHJlZ2lvbi5oIGIvY29tbW9uL1hyZWdpb24vWHJlZ2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YzlhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vWHJlZ2lvbi9YcmVnaW9uLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qICRYb3JnOiBYdXRpbC5oLHYgMS44IDIwMDEvMDIvMDkgMDI6MDM6MzkgeG9yZ2N2cyBFeHAgJCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5ODcgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAorZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCisKK0RJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9saWIvWDExL1h1dGlsLmgsdiAzLjQgMjAwMS8xMi8xNCAxOTo1NDoxMCBkYXdlcyBFeHAgJCAqLworCisjaWZuZGVmIF9YUkVHSU9OX0hfCisjZGVmaW5lIF9YUkVHSU9OX0hfCisKKy8vIC0gRmFrZWQgZGVmaW5lcyB0byBmb29sIHRoZSBYMTEgcmVnaW9uIGNvZGUKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEJvb2wgaW50CisjZGVmaW5lIFhtYWxsb2MgbWFsbG9jCisjZGVmaW5lIFhmcmVlIGZyZWUKKyNkZWZpbmUgWHJlYWxsb2MgcmVhbGxvYworCisjZGVmaW5lIE5lZWRGdW5jdGlvblByb3RvdHlwZXMgMQorCisvLyAtIENyaWJiZWQgZnJvbSBYbGliLmgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNob3J0IHgsIHk7Cit9IFhQb2ludDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNob3J0IHgsIHk7CisgICAgdW5zaWduZWQgc2hvcnQgd2lkdGgsIGhlaWdodDsKK30gWFJlY3RhbmdsZTsKKworLyoKKyAqIG9wYXF1ZSByZWZlcmVuY2UgdG8gUmVnaW9uIGRhdGEgdHlwZSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1hSZWdpb24gKlJlZ2lvbjsgCisKKy8qIFJldHVybiB2YWx1ZXMgZnJvbSBYUmVjdEluUmVnaW9uKCkgKi8KKyAKKyNkZWZpbmUgUmVjdGFuZ2xlT3V0IDAKKyNkZWZpbmUgUmVjdGFuZ2xlSW4gIDEKKyNkZWZpbmUgUmVjdGFuZ2xlUGFydCAyCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIGludCBYQ2xpcEJveCgKKyNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCisgICAgUmVnaW9uCQkvKiByICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiByZWN0X3JldHVybiAqLworI2VuZGlmCispOworCitleHRlcm4gUmVnaW9uIFhDcmVhdGVSZWdpb24oCisjaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIHZvaWQKKyNlbmRpZgorKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKlhEZWZhdWx0U3RyaW5nICh2b2lkKTsKKworZXh0ZXJuIGludCBYRGVzdHJveVJlZ2lvbigKKyNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCisgICAgUmVnaW9uCQkvKiByICovCisjZW5kaWYKKyk7CisKK2V4dGVybiBpbnQgWEVtcHR5UmVnaW9uKAorI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICBSZWdpb24JCS8qIHIgKi8KKyNlbmRpZgorKTsKKworZXh0ZXJuIGludCBYRXF1YWxSZWdpb24oCisjaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIFJlZ2lvbgkJLyogcjEgKi8sCisgICAgUmVnaW9uCQkvKiByMiAqLworI2VuZGlmCispOworCitleHRlcm4gaW50IFhJbnRlcnNlY3RSZWdpb24oCisjaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIFJlZ2lvbgkJLyogc3JhICovLAorICAgIFJlZ2lvbgkJLyogc3JiICovLAorICAgIFJlZ2lvbgkJLyogZHJfcmV0dXJuICovCisjZW5kaWYKKyk7CisKK2V4dGVybiBpbnQgWE9mZnNldFJlZ2lvbigKKyNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCisgICAgUmVnaW9uCQkvKiByICovLAorICAgIGludAkJCS8qIGR4ICovLAorICAgIGludAkJCS8qIGR5ICovCisjZW5kaWYKKyk7CisKK2V4dGVybiBCb29sIFhQb2ludEluUmVnaW9uKAorI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICBSZWdpb24JCS8qIHIgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovCisjZW5kaWYKKyk7CisKK2V4dGVybiBSZWdpb24gWFBvbHlnb25SZWdpb24oCisjaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIFhQb2ludCoJCS8qIHBvaW50cyAqLywKKyAgICBpbnQJCQkvKiBuICovLAorICAgIGludAkJCS8qIGZpbGxfcnVsZSAqLworI2VuZGlmCispOworCitleHRlcm4gaW50IFhSZWN0SW5SZWdpb24oCisjaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIFJlZ2lvbgkJLyogciAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KKyNlbmRpZgorKTsKKworZXh0ZXJuIGludCBYU2hyaW5rUmVnaW9uKAorI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICBSZWdpb24JCS8qIHIgKi8sCisgICAgaW50CQkJLyogZHggKi8sCisgICAgaW50CQkJLyogZHkgKi8KKyNlbmRpZgorKTsKKworZXh0ZXJuIGludCBYU3VidHJhY3RSZWdpb24oCisjaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIFJlZ2lvbgkJLyogc3JhICovLAorICAgIFJlZ2lvbgkJLyogc3JiICovLAorICAgIFJlZ2lvbgkJLyogZHJfcmV0dXJuICovCisjZW5kaWYKKyk7CisKK2V4dGVybiBpbnQgWFVuaW9uUmVjdFdpdGhSZWdpb24oCisjaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIFhSZWN0YW5nbGUqCQkvKiByZWN0YW5nbGUgKi8sCisgICAgUmVnaW9uCQkvKiBzcmNfcmVnaW9uICovLAorICAgIFJlZ2lvbgkJLyogZGVzdF9yZWdpb25fcmV0dXJuICovCisjZW5kaWYKKyk7CisKK2V4dGVybiBpbnQgWFVuaW9uUmVnaW9uKAorI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICBSZWdpb24JCS8qIHNyYSAqLywKKyAgICBSZWdpb24JCS8qIHNyYiAqLywKKyAgICBSZWdpb24JCS8qIGRyX3JldHVybiAqLworI2VuZGlmCispOworCitleHRlcm4gaW50IFhYb3JSZWdpb24oCisjaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIFJlZ2lvbgkJLyogc3JhICovLAorICAgIFJlZ2lvbgkJLyogc3JiICovLAorICAgIFJlZ2lvbgkJLyogZHJfcmV0dXJuICovCisjZW5kaWYKKyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYgLyogX1hVVElMX0hfICovCmRpZmYgLS1naXQgYS9jb21tb24vWHJlZ2lvbi9yZWdpb24uaCBiL2NvbW1vbi9YcmVnaW9uL3JlZ2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGYxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vWHJlZ2lvbi9yZWdpb24uaApAQCAtMCwwICsxLDE5MCBAQAorLyogJFhvcmc6IHJlZ2lvbi5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6NDAgeG9yZ2N2cyBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9YUkVHSU9OX0gKKyNkZWZpbmUgX1hSRUdJT05fSAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQgeDEsIHgyLCB5MSwgeTI7Cit9IEJveCwgQk9YLCBCb3hSZWMsICpCb3hQdHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworfVJFQ1RBTkdMRSwgUmVjdGFuZ2xlUmVjLCAqUmVjdGFuZ2xlUHRyOworCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIE1BWFNIT1JUIDMyNzY3CisjZGVmaW5lIE1JTlNIT1JUIC1NQVhTSE9SVAorI2lmbmRlZiBNQVgKKyNkZWZpbmUgTUFYKGEsYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworCisvKiAKKyAqICAgY2xpcCByZWdpb24KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfWFJlZ2lvbiB7CisgICAgbG9uZyBzaXplOworICAgIGxvbmcgbnVtUmVjdHM7CisgICAgQk9YICpyZWN0czsKKyAgICBCT1ggZXh0ZW50czsKK30gUkVHSU9OOworCisvKiBYdXRpbC5oIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbjogCisgKiB0eXBlZGVmIHN0cnVjdCBfWFJlZ2lvbiAqUmVnaW9uOyAKKyAqLyAgIAorCisvKiAgMSBpZiB0d28gQk9YcyBvdmVybGFwLgorICogIDAgaWYgdHdvIEJPWHMgZG8gbm90IG92ZXJsYXAuCisgKiAgUmVtZW1iZXIsIHgyIGFuZCB5MiBhcmUgbm90IGluIHRoZSByZWdpb24gCisgKi8KKyNkZWZpbmUgRVhURU5UQ0hFQ0socjEsIHIyKSBcCisJKChyMSktPngyID4gKHIyKS0+eDEgJiYgXAorCSAocjEpLT54MSA8IChyMiktPngyICYmIFwKKwkgKHIxKS0+eTIgPiAocjIpLT55MSAmJiBcCisJIChyMSktPnkxIDwgKHIyKS0+eTIpCisKKy8qCisgKiAgdXBkYXRlIHJlZ2lvbiBleHRlbnRzCisgKi8KKyNkZWZpbmUgRVhURU5UUyhyLGlkUmVjdCl7XAorICAgICAgICAgICAgaWYoKHIpLT54MSA8IChpZFJlY3QpLT5leHRlbnRzLngxKVwKKyAgICAgICAgICAgICAgKGlkUmVjdCktPmV4dGVudHMueDEgPSAociktPngxO1wKKyAgICAgICAgICAgIGlmKChyKS0+eTEgPCAoaWRSZWN0KS0+ZXh0ZW50cy55MSlcCisgICAgICAgICAgICAgIChpZFJlY3QpLT5leHRlbnRzLnkxID0gKHIpLT55MTtcCisgICAgICAgICAgICBpZigociktPngyID4gKGlkUmVjdCktPmV4dGVudHMueDIpXAorICAgICAgICAgICAgICAoaWRSZWN0KS0+ZXh0ZW50cy54MiA9IChyKS0+eDI7XAorICAgICAgICAgICAgaWYoKHIpLT55MiA+IChpZFJlY3QpLT5leHRlbnRzLnkyKVwKKyAgICAgICAgICAgICAgKGlkUmVjdCktPmV4dGVudHMueTIgPSAociktPnkyO1wKKyAgICAgICAgfQorCisvKgorICogICBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgZW5vdWdoIG1lbW9yeSBpbiB0aGUgcHJlc2VudCByZWdpb24uCisgKi8KKyNkZWZpbmUgTUVNQ0hFQ0socmVnLCByZWN0LCBmaXJzdHJlY3Qpe1wKKyAgICAgICAgaWYgKChyZWcpLT5udW1SZWN0cyA+PSAoKHJlZyktPnNpemUgLSAxKSl7XAorICAgICAgICAgIChmaXJzdHJlY3QpID0gKEJPWCAqKSBYcmVhbGxvYyBcCisgICAgICAgICAgKChjaGFyICopKGZpcnN0cmVjdCksICh1bnNpZ25lZCkgKDIgKiAoc2l6ZW9mKEJPWCkpICogKChyZWcpLT5zaXplKSkpO1wKKyAgICAgICAgICBpZiAoKGZpcnN0cmVjdCkgPT0gMClcCisgICAgICAgICAgICByZXR1cm4oMCk7XAorICAgICAgICAgIChyZWcpLT5zaXplICo9IDI7XAorICAgICAgICAgIChyZWN0KSA9ICYoZmlyc3RyZWN0KVsocmVnKS0+bnVtUmVjdHNdO1wKKyAgICAgICAgIH1cCisgICAgICAgfQorCisvKiAgdGhpcyByb3V0aW5lIGNoZWNrcyB0byBzZWUgaWYgdGhlIHByZXZpb3VzIHJlY3RhbmdsZSBpcyB0aGUgc2FtZQorICogIG9yIHN1YnN1bWVzIHRoZSBuZXcgcmVjdGFuZ2xlIHRvIGFkZC4KKyAqLworCisjZGVmaW5lIENIRUNLX1BSRVZJT1VTKFJlZywgUiwgUngxLCBSeTEsIFJ4MiwgUnkyKVwKKyAgICAgICAgICAgICAgICghKCgoUmVnKS0+bnVtUmVjdHMgPiAwKSYmXAorICAgICAgICAgICAgICAgICAgKChSLTEpLT55MSA9PSAoUnkxKSkgJiZcCisgICAgICAgICAgICAgICAgICAoKFItMSktPnkyID09IChSeTIpKSAmJlwKKyAgICAgICAgICAgICAgICAgICgoUi0xKS0+eDEgPD0gKFJ4MSkpICYmXAorICAgICAgICAgICAgICAgICAgKChSLTEpLT54MiA+PSAoUngyKSkpKQorCisvKiAgYWRkIGEgcmVjdGFuZ2xlIHRvIHRoZSBnaXZlbiBSZWdpb24gKi8KKyNkZWZpbmUgQUREUkVDVChyZWcsIHIsIHJ4MSwgcnkxLCByeDIsIHJ5Mil7XAorICAgIGlmICgoKHJ4MSkgPCAocngyKSkgJiYgKChyeTEpIDwgKHJ5MikpICYmXAorICAgICAgICBDSEVDS19QUkVWSU9VUygocmVnKSwgKHIpLCAocngxKSwgKHJ5MSksIChyeDIpLCAocnkyKSkpe1wKKyAgICAgICAgICAgICAgKHIpLT54MSA9IChyeDEpO1wKKyAgICAgICAgICAgICAgKHIpLT55MSA9IChyeTEpO1wKKyAgICAgICAgICAgICAgKHIpLT54MiA9IChyeDIpO1wKKyAgICAgICAgICAgICAgKHIpLT55MiA9IChyeTIpO1wKKyAgICAgICAgICAgICAgRVhURU5UUygociksIChyZWcpKTtcCisgICAgICAgICAgICAgIChyZWcpLT5udW1SZWN0cysrO1wKKyAgICAgICAgICAgICAgKHIpKys7XAorICAgICAgICAgICAgfVwKKyAgICAgICAgfQorCisKKworLyogIGFkZCBhIHJlY3RhbmdsZSB0byB0aGUgZ2l2ZW4gUmVnaW9uICovCisjZGVmaW5lIEFERFJFQ1ROT1gocmVnLCByLCByeDEsIHJ5MSwgcngyLCByeTIpe1wKKyAgICAgICAgICAgIGlmICgocngxIDwgcngyKSAmJiAocnkxIDwgcnkyKSAmJlwKKyAgICAgICAgICAgICAgICBDSEVDS19QUkVWSU9VUygocmVnKSwgKHIpLCAocngxKSwgKHJ5MSksIChyeDIpLCAocnkyKSkpe1wKKyAgICAgICAgICAgICAgKHIpLT54MSA9IChyeDEpO1wKKyAgICAgICAgICAgICAgKHIpLT55MSA9IChyeTEpO1wKKyAgICAgICAgICAgICAgKHIpLT54MiA9IChyeDIpO1wKKyAgICAgICAgICAgICAgKHIpLT55MiA9IChyeTIpO1wKKyAgICAgICAgICAgICAgKHJlZyktPm51bVJlY3RzKys7XAorICAgICAgICAgICAgICAocikrKztcCisgICAgICAgICAgICB9XAorICAgICAgICB9CisKKyNkZWZpbmUgRU1QVFlfUkVHSU9OKHBSZWcpIHBSZWctPm51bVJlY3RzID0gMAorCisjZGVmaW5lIFJFR0lPTl9OT1RfRU1QVFkocFJlZykgcFJlZy0+bnVtUmVjdHMKKworI2RlZmluZSBJTkJPWChyLCB4LCB5KSBcCisgICAgICAoICggKChyKS54MiA+ICB4KSkgJiYgXAorICAgICAgICAoICgocikueDEgPD0geCkpICYmIFwKKyAgICAgICAgKCAoKHIpLnkyID4gIHkpKSAmJiBcCisgICAgICAgICggKChyKS55MSA8PSB5KSkgKQorCisvKgorICogbnVtYmVyIG9mIHBvaW50cyB0byBidWZmZXIgYmVmb3JlIHNlbmRpbmcgdGhlbSBvZmYKKyAqIHRvIHNjYW5saW5lcygpIDogIE11c3QgYmUgYW4gZXZlbiBudW1iZXIKKyAqLworI2RlZmluZSBOVU1QVFNUT0JVRkZFUiAyMDAKKworLyoKKyAqIHVzZWQgdG8gYWxsb2NhdGUgYnVmZmVycyBmb3IgcG9pbnRzIGFuZCBsaW5rCisgKiB0aGUgYnVmZmVycyB0b2dldGhlcgorICovCit0eXBlZGVmIHN0cnVjdCBfUE9JTlRCTE9DSyB7CisgICAgWFBvaW50IHB0c1tOVU1QVFNUT0JVRkZFUl07CisgICAgc3RydWN0IF9QT0lOVEJMT0NLICpuZXh0OworfSBQT0lOVEJMT0NLOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9qYXZhYmluL2luZGV4LnZuYyBiL2NvbW1vbi9qYXZhYmluL2luZGV4LnZuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNiNjEzCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2phdmFiaW4vaW5kZXgudm5jCkBAIC0wLDAgKzEsMTMgQEAKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+CitWTkMgdmlld2VyIGZvciBKYXZhCis8L1RJVExFPgorPC9IRUFEPgorPEJPRFk+Cis8QVBQTEVUIENPREU9dm5jdmlld2VyL1ZOQ1ZpZXdlci5jbGFzcyBBUkNISVZFPXZuY3ZpZXdlci5qYXIKKyAgICAgICAgV0lEVEg9NDAwIEhFSUdIVD0yNTA+Cis8UEFSQU0gbmFtZT0icG9ydCIgdmFsdWU9IiRQT1JUIj4KKzwvQVBQTEVUPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2phdmFiaW4vbG9nbzE1MHgxNTAuZ2lmIGIvY29tbW9uL2phdmFiaW4vbG9nbzE1MHgxNTAuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNjk5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vamF2YWJpbi9sb2dvMTUweDE1MC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2phdmFiaW4vdm5jdmlld2VyLmphciBiL2NvbW1vbi9qYXZhYmluL3ZuY3ZpZXdlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5MmI1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qYXZhYmluL3ZuY3ZpZXdlci5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvUkVBRE1FIGIvY29tbW9uL2pwZWcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Y2MyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9SRUFETUUKQEAgLTAsMCArMSwzODUgQEAKK1RoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JFQURNRSBmb3IgcmVsZWFzZSA2YiBvZiAyNy1NYXItMTk5OAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIHRoZSBzaXh0aCBwdWJsaWMgcmVsZWFzZSBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRworR3JvdXAncyBmcmVlIEpQRUcgc29mdHdhcmUuICBZb3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCit0byB1c2UgaXQgZm9yIGFueSBwdXJwb3NlLCBzdWJqZWN0IHRvIHRoZSBjb25kaXRpb25zIHVuZGVyIExFR0FMIElTU1VFUywgYmVsb3cuCisKK1NlcmlvdXMgdXNlcnMgb2YgdGhpcyBzb2Z0d2FyZSAocGFydGljdWxhcmx5IHRob3NlIGluY29ycG9yYXRpbmcgaXQgaW50bworbGFyZ2VyIHByb2dyYW1zKSBzaG91bGQgY29udGFjdCBJSkcgYXQganBlZy1pbmZvQHV1bmV0LnV1Lm5ldCB0byBiZSBhZGRlZCB0bworb3VyIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0LiAgTWFpbGluZyBsaXN0IG1lbWJlcnMgYXJlIG5vdGlmaWVkIG9mIHVwZGF0ZXMKK2FuZCBoYXZlIGEgY2hhbmNlIHRvIHBhcnRpY2lwYXRlIGluIHRlY2huaWNhbCBkaXNjdXNzaW9ucywgZXRjLgorCitUaGlzIHNvZnR3YXJlIGlzIHRoZSB3b3JrIG9mIFRvbSBMYW5lLCBQaGlsaXAgR2xhZHN0b25lLCBKaW0gQm91Y2hlciwKK0xlZSBDcm9ja2VyLCBKdWxpYW4gTWluZ3VpbGxvbiwgTHVpcyBPcnRpeiwgR2VvcmdlIFBoaWxsaXBzLCBEYXZpZGUgUm9zc2ksCitHdWlkbyBWb2xsYmVkaW5nLCBHZScgV2VpamVycywgYW5kIG90aGVyIG1lbWJlcnMgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcKK0dyb3VwLgorCitJSkcgaXMgbm90IGFmZmlsaWF0ZWQgd2l0aCB0aGUgb2ZmaWNpYWwgSVNPIEpQRUcgc3RhbmRhcmRzIGNvbW1pdHRlZS4KKworCitET0NVTUVOVEFUSU9OIFJPQURNQVAKKz09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBzZWN0aW9uczoKKworT1ZFUlZJRVcgICAgICAgICAgICBHZW5lcmFsIGRlc2NyaXB0aW9uIG9mIEpQRUcgYW5kIHRoZSBJSkcgc29mdHdhcmUuCitMRUdBTCBJU1NVRVMgICAgICAgIENvcHlyaWdodCwgbGFjayBvZiB3YXJyYW50eSwgdGVybXMgb2YgZGlzdHJpYnV0aW9uLgorUkVGRVJFTkNFUyAgICAgICAgICBXaGVyZSB0byBsZWFybiBtb3JlIGFib3V0IEpQRUcuCitBUkNISVZFIExPQ0FUSU9OUyAgIFdoZXJlIHRvIGZpbmQgbmV3ZXIgdmVyc2lvbnMgb2YgdGhpcyBzb2Z0d2FyZS4KK1JFTEFURUQgU09GVFdBUkUgICAgT3RoZXIgc3R1ZmYgeW91IHNob3VsZCBnZXQuCitGSUxFIEZPUk1BVCBXQVJTICAgIFNvZnR3YXJlICpub3QqIHRvIGdldC4KK1RPIERPICAgICAgICAgICAgICAgUGxhbnMgZm9yIGZ1dHVyZSBJSkcgcmVsZWFzZXMuCisKK090aGVyIGRvY3VtZW50YXRpb24gZmlsZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbiBhcmU6CisKK1VzZXIgZG9jdW1lbnRhdGlvbjoKKyAgaW5zdGFsbC5kb2MgICAgICAgSG93IHRvIGNvbmZpZ3VyZSBhbmQgaW5zdGFsbCB0aGUgSUpHIHNvZnR3YXJlLgorICB1c2FnZS5kb2MgICAgICAgICBVc2FnZSBpbnN0cnVjdGlvbnMgZm9yIGNqcGVnLCBkanBlZywganBlZ3RyYW4sCisgICAgICAgICAgICAgICAgICAgIHJkanBnY29tLCBhbmQgd3JqcGdjb20uCisgICouMSAgICAgICAgICAgICAgIFVuaXgtc3R5bGUgbWFuIHBhZ2VzIGZvciBwcm9ncmFtcyAoc2FtZSBpbmZvIGFzIHVzYWdlLmRvYykuCisgIHdpemFyZC5kb2MgICAgICAgIEFkdmFuY2VkIHVzYWdlIGluc3RydWN0aW9ucyBmb3IgSlBFRyB3aXphcmRzIG9ubHkuCisgIGNoYW5nZS5sb2cgICAgICAgIFZlcnNpb24tdG8tdmVyc2lvbiBjaGFuZ2UgaGlnaGxpZ2h0cy4KK1Byb2dyYW1tZXIgYW5kIGludGVybmFsIGRvY3VtZW50YXRpb246CisgIGxpYmpwZWcuZG9jICAgICAgIEhvdyB0byB1c2UgdGhlIEpQRUcgbGlicmFyeSBpbiB5b3VyIG93biBwcm9ncmFtcy4KKyAgZXhhbXBsZS5jICAgICAgICAgU2FtcGxlIGNvZGUgZm9yIGNhbGxpbmcgdGhlIEpQRUcgbGlicmFyeS4KKyAgc3RydWN0dXJlLmRvYyAgICAgT3ZlcnZpZXcgb2YgdGhlIEpQRUcgbGlicmFyeSdzIGludGVybmFsIHN0cnVjdHVyZS4KKyAgZmlsZWxpc3QuZG9jICAgICAgUm9hZCBtYXAgb2YgSUpHIGZpbGVzLgorICBjb2RlcnVsZXMuZG9jICAgICBDb2Rpbmcgc3R5bGUgcnVsZXMgLS0tIHBsZWFzZSByZWFkIGlmIHlvdSBjb250cmlidXRlIGNvZGUuCisKK1BsZWFzZSByZWFkIGF0IGxlYXN0IHRoZSBmaWxlcyBpbnN0YWxsLmRvYyBhbmQgdXNhZ2UuZG9jLiAgVXNlZnVsIGluZm9ybWF0aW9uCitjYW4gYWxzbyBiZSBmb3VuZCBpbiB0aGUgSlBFRyBGQVEgKEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zKSBhcnRpY2xlLiAgU2VlCitBUkNISVZFIExPQ0FUSU9OUyBiZWxvdyB0byBmaW5kIG91dCB3aGVyZSB0byBvYnRhaW4gdGhlIEZBUSBhcnRpY2xlLgorCitJZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgSlBFRyBjb2RlIHdvcmtzLCB3ZSBzdWdnZXN0IHJlYWRpbmcgb25lIG9yCittb3JlIG9mIHRoZSBSRUZFUkVOQ0VTLCB0aGVuIGxvb2tpbmcgYXQgdGhlIGRvY3VtZW50YXRpb24gZmlsZXMgKGluIHJvdWdobHkKK3RoZSBvcmRlciBsaXN0ZWQpIGJlZm9yZSBkaXZpbmcgaW50byB0aGUgY29kZS4KKworCitPVkVSVklFVworPT09PT09PT0KKworVGhpcyBwYWNrYWdlIGNvbnRhaW5zIEMgc29mdHdhcmUgdG8gaW1wbGVtZW50IEpQRUcgaW1hZ2UgY29tcHJlc3Npb24gYW5kCitkZWNvbXByZXNzaW9uLiAgSlBFRyAocHJvbm91bmNlZCAiamF5LXBlZyIpIGlzIGEgc3RhbmRhcmRpemVkIGNvbXByZXNzaW9uCittZXRob2QgZm9yIGZ1bGwtY29sb3IgYW5kIGdyYXktc2NhbGUgaW1hZ2VzLiAgSlBFRyBpcyBpbnRlbmRlZCBmb3IgY29tcHJlc3NpbmcKKyJyZWFsLXdvcmxkIiBzY2VuZXM7IGxpbmUgZHJhd2luZ3MsIGNhcnRvb25zIGFuZCBvdGhlciBub24tcmVhbGlzdGljIGltYWdlcworYXJlIG5vdCBpdHMgc3Ryb25nIHN1aXQuICBKUEVHIGlzIGxvc3N5LCBtZWFuaW5nIHRoYXQgdGhlIG91dHB1dCBpbWFnZSBpcyBub3QKK2V4YWN0bHkgaWRlbnRpY2FsIHRvIHRoZSBpbnB1dCBpbWFnZS4gIEhlbmNlIHlvdSBtdXN0IG5vdCB1c2UgSlBFRyBpZiB5b3UKK2hhdmUgdG8gaGF2ZSBpZGVudGljYWwgb3V0cHV0IGJpdHMuICBIb3dldmVyLCBvbiB0eXBpY2FsIHBob3RvZ3JhcGhpYyBpbWFnZXMsCit2ZXJ5IGdvb2QgY29tcHJlc3Npb24gbGV2ZWxzIGNhbiBiZSBvYnRhaW5lZCB3aXRoIG5vIHZpc2libGUgY2hhbmdlLCBhbmQKK3JlbWFya2FibHkgaGlnaCBjb21wcmVzc2lvbiBsZXZlbHMgYXJlIHBvc3NpYmxlIGlmIHlvdSBjYW4gdG9sZXJhdGUgYQorbG93LXF1YWxpdHkgaW1hZ2UuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlZmVyZW5jZXMsIG9yIGp1c3QgZXhwZXJpbWVudAord2l0aCB2YXJpb3VzIGNvbXByZXNzaW9uIHNldHRpbmdzLgorCitUaGlzIHNvZnR3YXJlIGltcGxlbWVudHMgSlBFRyBiYXNlbGluZSwgZXh0ZW5kZWQtc2VxdWVudGlhbCwgYW5kIHByb2dyZXNzaXZlCitjb21wcmVzc2lvbiBwcm9jZXNzZXMuICBQcm92aXNpb24gaXMgbWFkZSBmb3Igc3VwcG9ydGluZyBhbGwgdmFyaWFudHMgb2YgdGhlc2UKK3Byb2Nlc3NlcywgYWx0aG91Z2ggc29tZSB1bmNvbW1vbiBwYXJhbWV0ZXIgc2V0dGluZ3MgYXJlbid0IGltcGxlbWVudGVkIHlldC4KK0ZvciBsZWdhbCByZWFzb25zLCB3ZSBhcmUgbm90IGRpc3RyaWJ1dGluZyBjb2RlIGZvciB0aGUgYXJpdGhtZXRpYy1jb2RpbmcKK3ZhcmlhbnRzIG9mIEpQRUc7IHNlZSBMRUdBTCBJU1NVRVMuICBXZSBoYXZlIG1hZGUgbm8gcHJvdmlzaW9uIGZvciBzdXBwb3J0aW5nCit0aGUgaGllcmFyY2hpY2FsIG9yIGxvc3NsZXNzIHByb2Nlc3NlcyBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZC4KKworV2UgcHJvdmlkZSBhIHNldCBvZiBsaWJyYXJ5IHJvdXRpbmVzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIEpQRUcgaW1hZ2UgZmlsZXMsCitwbHVzIHR3byBzYW1wbGUgYXBwbGljYXRpb25zICJjanBlZyIgYW5kICJkanBlZyIsIHdoaWNoIHVzZSB0aGUgbGlicmFyeSB0bworcGVyZm9ybSBjb252ZXJzaW9uIGJldHdlZW4gSlBFRyBhbmQgc29tZSBvdGhlciBwb3B1bGFyIGltYWdlIGZpbGUgZm9ybWF0cy4KK1RoZSBsaWJyYXJ5IGlzIGludGVuZGVkIHRvIGJlIHJldXNlZCBpbiBvdGhlciBhcHBsaWNhdGlvbnMuCisKK0luIG9yZGVyIHRvIHN1cHBvcnQgZmlsZSBjb252ZXJzaW9uIGFuZCB2aWV3aW5nIHNvZnR3YXJlLCB3ZSBoYXZlIGluY2x1ZGVkCitjb25zaWRlcmFibGUgZnVuY3Rpb25hbGl0eSBiZXlvbmQgdGhlIGJhcmUgSlBFRyBjb2RpbmcvZGVjb2RpbmcgY2FwYWJpbGl0eTsKK2ZvciBleGFtcGxlLCB0aGUgY29sb3IgcXVhbnRpemF0aW9uIG1vZHVsZXMgYXJlIG5vdCBzdHJpY3RseSBwYXJ0IG9mIEpQRUcKK2RlY29kaW5nLCBidXQgdGhleSBhcmUgZXNzZW50aWFsIGZvciBvdXRwdXQgdG8gY29sb3JtYXBwZWQgZmlsZSBmb3JtYXRzIG9yCitjb2xvcm1hcHBlZCBkaXNwbGF5cy4gIFRoZXNlIGV4dHJhIGZ1bmN0aW9ucyBjYW4gYmUgY29tcGlsZWQgb3V0IG9mIHRoZQorbGlicmFyeSBpZiBub3QgcmVxdWlyZWQgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbi4gIFdlIGhhdmUgYWxzbyBpbmNsdWRlZAorImpwZWd0cmFuIiwgYSB1dGlsaXR5IGZvciBsb3NzbGVzcyB0cmFuc2NvZGluZyBiZXR3ZWVuIGRpZmZlcmVudCBKUEVHCitwcm9jZXNzZXMsIGFuZCAicmRqcGdjb20iIGFuZCAid3JqcGdjb20iLCB0d28gc2ltcGxlIGFwcGxpY2F0aW9ucyBmb3IKK2luc2VydGluZyBhbmQgZXh0cmFjdGluZyB0ZXh0dWFsIGNvbW1lbnRzIGluIEpGSUYgZmlsZXMuCisKK1RoZSBlbXBoYXNpcyBpbiBkZXNpZ25pbmcgdGhpcyBzb2Z0d2FyZSBoYXMgYmVlbiBvbiBhY2hpZXZpbmcgcG9ydGFiaWxpdHkgYW5kCitmbGV4aWJpbGl0eSwgd2hpbGUgYWxzbyBtYWtpbmcgaXQgZmFzdCBlbm91Z2ggdG8gYmUgdXNlZnVsLiAgSW4gcGFydGljdWxhciwKK3RoZSBzb2Z0d2FyZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVhZCBhcyBhIHR1dG9yaWFsIG9uIEpQRUcuICAoU2VlIHRoZQorUkVGRVJFTkNFUyBzZWN0aW9uIGZvciBpbnRyb2R1Y3RvcnkgbWF0ZXJpYWwuKSAgUmF0aGVyLCBpdCBpcyBpbnRlbmRlZCB0bworYmUgcmVsaWFibGUsIHBvcnRhYmxlLCBpbmR1c3RyaWFsLXN0cmVuZ3RoIGNvZGUuICBXZSBkbyBub3QgY2xhaW0gdG8gaGF2ZQorYWNoaWV2ZWQgdGhhdCBnb2FsIGluIGV2ZXJ5IGFzcGVjdCBvZiB0aGUgc29mdHdhcmUsIGJ1dCB3ZSBzdHJpdmUgZm9yIGl0LgorCitXZSB3ZWxjb21lIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhcyBhIGNvbXBvbmVudCBvZiBjb21tZXJjaWFsIHByb2R1Y3RzLgorTm8gcm95YWx0eSBpcyByZXF1aXJlZCwgYnV0IHdlIGRvIGFzayBmb3IgYW4gYWNrbm93bGVkZ2VtZW50IGluIHByb2R1Y3QKK2RvY3VtZW50YXRpb24sIGFzIGRlc2NyaWJlZCB1bmRlciBMRUdBTCBJU1NVRVMuCisKKworTEVHQUwgSVNTVUVTCis9PT09PT09PT09PT0KKworSW4gcGxhaW4gRW5nbGlzaDoKKworMS4gV2UgZG9uJ3QgcHJvbWlzZSB0aGF0IHRoaXMgc29mdHdhcmUgd29ya3MuICAoQnV0IGlmIHlvdSBmaW5kIGFueSBidWdzLAorICAgcGxlYXNlIGxldCB1cyBrbm93ISkKKzIuIFlvdSBjYW4gdXNlIHRoaXMgc29mdHdhcmUgZm9yIHdoYXRldmVyIHlvdSB3YW50LiAgWW91IGRvbid0IGhhdmUgdG8gcGF5IHVzLgorMy4gWW91IG1heSBub3QgcHJldGVuZCB0aGF0IHlvdSB3cm90ZSB0aGlzIHNvZnR3YXJlLiAgSWYgeW91IHVzZSBpdCBpbiBhCisgICBwcm9ncmFtLCB5b3UgbXVzdCBhY2tub3dsZWRnZSBzb21ld2hlcmUgaW4geW91ciBkb2N1bWVudGF0aW9uIHRoYXQKKyAgIHlvdSd2ZSB1c2VkIHRoZSBJSkcgY29kZS4KKworSW4gbGVnYWxlc2U6CisKK1RoZSBhdXRob3JzIG1ha2UgTk8gV0FSUkFOVFkgb3IgcmVwcmVzZW50YXRpb24sIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsCit3aXRoIHJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZSwgaXRzIHF1YWxpdHksIGFjY3VyYWN5LCBtZXJjaGFudGFiaWxpdHksIG9yCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgIkFTIElTIiwgYW5kIHlvdSwKK2l0cyB1c2VyLCBhc3N1bWUgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5IGFuZCBhY2N1cmFjeS4KKworVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCitBbGwgUmlnaHRzIFJlc2VydmVkIGV4Y2VwdCBhcyBzcGVjaWZpZWQgYmVsb3cuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0IHRvIHRoZXNlCitjb25kaXRpb25zOgorKDEpIElmIGFueSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGlzCitSRUFETUUgZmlsZSBtdXN0IGJlIGluY2x1ZGVkLCB3aXRoIHRoaXMgY29weXJpZ2h0IGFuZCBuby13YXJyYW50eSBub3RpY2UKK3VuYWx0ZXJlZDsgYW5kIGFueSBhZGRpdGlvbnMsIGRlbGV0aW9ucywgb3IgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZXMKK211c3QgYmUgY2xlYXJseSBpbmRpY2F0ZWQgaW4gYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24uCisoMikgSWYgb25seSBleGVjdXRhYmxlIGNvZGUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4gdGhlIGFjY29tcGFueWluZworZG9jdW1lbnRhdGlvbiBtdXN0IHN0YXRlIHRoYXQgInRoaXMgc29mdHdhcmUgaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgd29yayBvZgordGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAiLgorKDMpIFBlcm1pc3Npb24gZm9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgb25seSBpZiB0aGUgdXNlciBhY2NlcHRzCitmdWxsIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgdW5kZXNpcmFibGUgY29uc2VxdWVuY2VzOyB0aGUgYXV0aG9ycyBhY2NlcHQKK05PIExJQUJJTElUWSBmb3IgZGFtYWdlcyBvZiBhbnkga2luZC4KKworVGhlc2UgY29uZGl0aW9ucyBhcHBseSB0byBhbnkgc29mdHdhcmUgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoZSBJSkcgY29kZSwKK25vdCBqdXN0IHRvIHRoZSB1bm1vZGlmaWVkIGxpYnJhcnkuICBJZiB5b3UgdXNlIG91ciB3b3JrLCB5b3Ugb3VnaHQgdG8KK2Fja25vd2xlZGdlIHVzLgorCitQZXJtaXNzaW9uIGlzIE5PVCBncmFudGVkIGZvciB0aGUgdXNlIG9mIGFueSBJSkcgYXV0aG9yJ3MgbmFtZSBvciBjb21wYW55IG5hbWUKK2luIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGlzIHNvZnR3YXJlIG9yIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQoraXQuICBUaGlzIHNvZnR3YXJlIG1heSBiZSByZWZlcnJlZCB0byBvbmx5IGFzICJ0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzCitzb2Z0d2FyZSIuCisKK1dlIHNwZWNpZmljYWxseSBwZXJtaXQgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgYXMgdGhlIGJhc2lzIG9mCitjb21tZXJjaWFsIHByb2R1Y3RzLCBwcm92aWRlZCB0aGF0IGFsbCB3YXJyYW50eSBvciBsaWFiaWxpdHkgY2xhaW1zIGFyZQorYXNzdW1lZCBieSB0aGUgcHJvZHVjdCB2ZW5kb3IuCisKKworYW5zaTJrbnIuYyBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBieSBwZXJtaXNzaW9uIG9mIEwuIFBldGVyIERldXRzY2gsCitzb2xlIHByb3ByaWV0b3Igb2YgaXRzIGNvcHlyaWdodCBob2xkZXIsIEFsYWRkaW4gRW50ZXJwcmlzZXMgb2YgTWVubG8gUGFyaywgQ0EuCithbnNpMmtuci5jIGlzIE5PVCBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBjb3B5cmlnaHQgYW5kIGNvbmRpdGlvbnMsIGJ1dCBpbnN0ZWFkCitieSB0aGUgdXN1YWwgZGlzdHJpYnV0aW9uIHRlcm1zIG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHByaW5jaXBhbGx5LAordGhhdCB5b3UgbXVzdCBpbmNsdWRlIHNvdXJjZSBjb2RlIGlmIHlvdSByZWRpc3RyaWJ1dGUgaXQuICAoU2VlIHRoZSBmaWxlCithbnNpMmtuci5jIGZvciBmdWxsIGRldGFpbHMuKSAgSG93ZXZlciwgc2luY2UgYW5zaTJrbnIuYyBpcyBub3QgbmVlZGVkIGFzIHBhcnQKK29mIGFueSBwcm9ncmFtIGdlbmVyYXRlZCBmcm9tIHRoZSBJSkcgY29kZSwgdGhpcyBkb2VzIG5vdCBsaW1pdCB5b3UgbW9yZSB0aGFuCit0aGUgZm9yZWdvaW5nIHBhcmFncmFwaHMgZG8uCisKK1RoZSBVbml4IGNvbmZpZ3VyYXRpb24gc2NyaXB0ICJjb25maWd1cmUiIHdhcyBwcm9kdWNlZCB3aXRoIEdOVSBBdXRvY29uZi4KK0l0IGlzIGNvcHlyaWdodCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGJ1dCBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZS4KK1RoZSBzYW1lIGhvbGRzIGZvciBpdHMgc3VwcG9ydGluZyBzY3JpcHRzIChjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWIsCitsdGNvbmZpZywgbHRtYWluLnNoKS4gIEFub3RoZXIgc3VwcG9ydCBzY3JpcHQsIGluc3RhbGwtc2gsIGlzIGNvcHlyaWdodAorYnkgTS5JLlQuIGJ1dCBpcyBhbHNvIGZyZWVseSBkaXN0cmlidXRhYmxlLgorCitJdCBhcHBlYXJzIHRoYXQgdGhlIGFyaXRobWV0aWMgY29kaW5nIG9wdGlvbiBvZiB0aGUgSlBFRyBzcGVjIGlzIGNvdmVyZWQgYnkKK3BhdGVudHMgb3duZWQgYnkgSUJNLCBBVCZULCBhbmQgTWl0c3ViaXNoaS4gIEhlbmNlIGFyaXRobWV0aWMgY29kaW5nIGNhbm5vdAorbGVnYWxseSBiZSB1c2VkIHdpdGhvdXQgb2J0YWluaW5nIG9uZSBvciBtb3JlIGxpY2Vuc2VzLiAgRm9yIHRoaXMgcmVhc29uLAorc3VwcG9ydCBmb3IgYXJpdGhtZXRpYyBjb2RpbmcgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBmcmVlIEpQRUcgc29mdHdhcmUuCisoU2luY2UgYXJpdGhtZXRpYyBjb2RpbmcgcHJvdmlkZXMgb25seSBhIG1hcmdpbmFsIGdhaW4gb3ZlciB0aGUgdW5wYXRlbnRlZAorSHVmZm1hbiBtb2RlLCBpdCBpcyB1bmxpa2VseSB0aGF0IHZlcnkgbWFueSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBzdXBwb3J0IGl0LikKK1NvIGZhciBhcyB3ZSBhcmUgYXdhcmUsIHRoZXJlIGFyZSBubyBwYXRlbnQgcmVzdHJpY3Rpb25zIG9uIHRoZSByZW1haW5pbmcKK2NvZGUuCisKK1RoZSBJSkcgZGlzdHJpYnV0aW9uIGZvcm1lcmx5IGluY2x1ZGVkIGNvZGUgdG8gcmVhZCBhbmQgd3JpdGUgR0lGIGZpbGVzLgorVG8gYXZvaWQgZW50YW5nbGVtZW50IHdpdGggdGhlIFVuaXN5cyBMWlcgcGF0ZW50LCBHSUYgcmVhZGluZyBzdXBwb3J0IGhhcworYmVlbiByZW1vdmVkIGFsdG9nZXRoZXIsIGFuZCB0aGUgR0lGIHdyaXRlciBoYXMgYmVlbiBzaW1wbGlmaWVkIHRvIHByb2R1Y2UKKyJ1bmNvbXByZXNzZWQgR0lGcyIuICBUaGlzIHRlY2huaXF1ZSBkb2VzIG5vdCB1c2UgdGhlIExaVyBhbGdvcml0aG07IHRoZQorcmVzdWx0aW5nIEdJRiBmaWxlcyBhcmUgbGFyZ2VyIHRoYW4gdXN1YWwsIGJ1dCBhcmUgcmVhZGFibGUgYnkgYWxsIHN0YW5kYXJkCitHSUYgZGVjb2RlcnMuCisKK1dlIGFyZSByZXF1aXJlZCB0byBzdGF0ZSB0aGF0CisgICAgIlRoZSBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQoYykgaXMgdGhlIENvcHlyaWdodCBwcm9wZXJ0eSBvZgorICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiAgR0lGKHNtKSBpcyBhIFNlcnZpY2UgTWFyayBwcm9wZXJ0eSBvZgorICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiIKKworCitSRUZFUkVOQ0VTCis9PT09PT09PT09CisKK1dlIGhpZ2hseSByZWNvbW1lbmQgcmVhZGluZyBvbmUgb3IgbW9yZSBvZiB0aGVzZSByZWZlcmVuY2VzIGJlZm9yZSB0cnlpbmcgdG8KK3VuZGVyc3RhbmQgdGhlIGlubmFyZHMgb2YgdGhlIEpQRUcgc29mdHdhcmUuCisKK1RoZSBiZXN0IHNob3J0IHRlY2huaWNhbCBpbnRyb2R1Y3Rpb24gdG8gdGhlIEpQRUcgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzCisJV2FsbGFjZSwgR3JlZ29yeSBLLiAgIlRoZSBKUEVHIFN0aWxsIFBpY3R1cmUgQ29tcHJlc3Npb24gU3RhbmRhcmQiLAorCUNvbW11bmljYXRpb25zIG9mIHRoZSBBQ00sIEFwcmlsIDE5OTEgKHZvbC4gMzQgbm8uIDQpLCBwcC4gMzAtNDQuCisoQWRqYWNlbnQgYXJ0aWNsZXMgaW4gdGhhdCBpc3N1ZSBkaXNjdXNzIE1QRUcgbW90aW9uIHBpY3R1cmUgY29tcHJlc3Npb24sCithcHBsaWNhdGlvbnMgb2YgSlBFRywgYW5kIHJlbGF0ZWQgdG9waWNzLikgIElmIHlvdSBkb24ndCBoYXZlIHRoZSBDQUNNIGlzc3VlCitoYW5keSwgYSBQb3N0U2NyaXB0IGZpbGUgY29udGFpbmluZyBhIHJldmlzZWQgdmVyc2lvbiBvZiBXYWxsYWNlJ3MgYXJ0aWNsZSBpcworYXZhaWxhYmxlIGF0IGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy93YWxsYWNlLnBzLmd6LiAgVGhlIGZpbGUgKGFjdHVhbGx5CithIHByZXByaW50IGZvciBhbiBhcnRpY2xlIHRoYXQgYXBwZWFyZWQgaW4gSUVFRSBUcmFucy4gQ29uc3VtZXIgRWxlY3Ryb25pY3MpCitvbWl0cyB0aGUgc2FtcGxlIGltYWdlcyB0aGF0IGFwcGVhcmVkIGluIENBQ00sIGJ1dCBpdCBpbmNsdWRlcyBjb3JyZWN0aW9ucworYW5kIHNvbWUgYWRkZWQgbWF0ZXJpYWwuICBOb3RlOiB0aGUgV2FsbGFjZSBhcnRpY2xlIGlzIGNvcHlyaWdodCBBQ00gYW5kIElFRUUsCithbmQgaXQgbWF5IG5vdCBiZSB1c2VkIGZvciBjb21tZXJjaWFsIHB1cnBvc2VzLgorCitBIHNvbWV3aGF0IGxlc3MgdGVjaG5pY2FsLCBtb3JlIGxlaXN1cmVseSBpbnRyb2R1Y3Rpb24gdG8gSlBFRyBjYW4gYmUgZm91bmQgaW4KKyJUaGUgRGF0YSBDb21wcmVzc2lvbiBCb29rIiBieSBNYXJrIE5lbHNvbiBhbmQgSmVhbi1sb3VwIEdhaWxseSwgcHVibGlzaGVkIGJ5CitNJlQgQm9va3MgKE5ldyBZb3JrKSwgMm5kIGVkLiAxOTk2LCBJU0JOIDEtNTU4NTEtNDM0LTEuICBUaGlzIGJvb2sgcHJvdmlkZXMKK2dvb2QgZXhwbGFuYXRpb25zIGFuZCBleGFtcGxlIEMgY29kZSBmb3IgYSBtdWx0aXR1ZGUgb2YgY29tcHJlc3Npb24gbWV0aG9kcworaW5jbHVkaW5nIEpQRUcuICBJdCBpcyBhbiBleGNlbGxlbnQgc291cmNlIGlmIHlvdSBhcmUgY29tZm9ydGFibGUgcmVhZGluZyBDCitjb2RlIGJ1dCBkb24ndCBrbm93IG11Y2ggYWJvdXQgZGF0YSBjb21wcmVzc2lvbiBpbiBnZW5lcmFsLiAgVGhlIGJvb2sncyBKUEVHCitzYW1wbGUgY29kZSBpcyBmYXIgZnJvbSBpbmR1c3RyaWFsLXN0cmVuZ3RoLCBidXQgd2hlbiB5b3UgYXJlIHJlYWR5IHRvIGxvb2sKK2F0IGEgZnVsbCBpbXBsZW1lbnRhdGlvbiwgeW91J3ZlIGdvdCBvbmUgaGVyZS4uLgorCitUaGUgYmVzdCBmdWxsIGRlc2NyaXB0aW9uIG9mIEpQRUcgaXMgdGhlIHRleHRib29rICJKUEVHIFN0aWxsIEltYWdlIERhdGEKK0NvbXByZXNzaW9uIFN0YW5kYXJkIiBieSBXaWxsaWFtIEIuIFBlbm5lYmFrZXIgYW5kIEpvYW4gTC4gTWl0Y2hlbGwsIHB1Ymxpc2hlZAorYnkgVmFuIE5vc3RyYW5kIFJlaW5ob2xkLCAxOTkzLCBJU0JOIDAtNDQyLTAxMjcyLTEuICBQcmljZSBVUyQ1OS45NSwgNjM4IHBwLgorVGhlIGJvb2sgaW5jbHVkZXMgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlIElTTyBKUEVHIHN0YW5kYXJkcyAoRElTIDEwOTE4LTEKK2FuZCBkcmFmdCBESVMgMTA5MTgtMikuICBUaGlzIGlzIGJ5IGZhciB0aGUgbW9zdCBjb21wbGV0ZSBleHBvc2l0aW9uIG9mIEpQRUcKK2luIGV4aXN0ZW5jZSwgYW5kIHdlIGhpZ2hseSByZWNvbW1lbmQgaXQuCisKK1RoZSBKUEVHIHN0YW5kYXJkIGl0c2VsZiBpcyBub3QgYXZhaWxhYmxlIGVsZWN0cm9uaWNhbGx5OyB5b3UgbXVzdCBvcmRlciBhCitwYXBlciBjb3B5IHRocm91Z2ggSVNPIG9yIElUVS4gIChVbmxlc3MgeW91IGZlZWwgYSBuZWVkIHRvIG93biBhIGNlcnRpZmllZAorb2ZmaWNpYWwgY29weSwgd2UgcmVjb21tZW5kIGJ1eWluZyB0aGUgUGVubmViYWtlciBhbmQgTWl0Y2hlbGwgYm9vayBpbnN0ZWFkOworaXQncyBtdWNoIGNoZWFwZXIgYW5kIGluY2x1ZGVzIGEgZ3JlYXQgZGVhbCBvZiB1c2VmdWwgZXhwbGFuYXRvcnkgbWF0ZXJpYWwuKQorSW4gdGhlIFVTQSwgY29waWVzIG9mIHRoZSBzdGFuZGFyZCBtYXkgYmUgb3JkZXJlZCBmcm9tIEFOU0kgU2FsZXMgYXQgKDIxMikKKzY0Mi00OTAwLCBvciBmcm9tIEdsb2JhbCBFbmdpbmVlcmluZyBEb2N1bWVudHMgYXQgKDgwMCkgODU0LTcxNzkuICAoQU5TSQorZG9lc24ndCB0YWtlIGNyZWRpdCBjYXJkIG9yZGVycywgYnV0IEdsb2JhbCBkb2VzLikgIEl0J3Mgbm90IGNoZWFwOiBhcyBvZgorMTk5MiwgQU5TSSB3YXMgY2hhcmdpbmcgJDk1IGZvciBQYXJ0IDEgYW5kICQ0NyBmb3IgUGFydCAyLCBwbHVzIDclCitzaGlwcGluZy9oYW5kbGluZy4gIFRoZSBzdGFuZGFyZCBpcyBkaXZpZGVkIGludG8gdHdvIHBhcnRzLCBQYXJ0IDEgYmVpbmcgdGhlCithY3R1YWwgc3BlY2lmaWNhdGlvbiwgd2hpbGUgUGFydCAyIGNvdmVycyBjb21wbGlhbmNlIHRlc3RpbmcgbWV0aG9kcy4gIFBhcnQgMQoraXMgdGl0bGVkICJEaWdpdGFsIENvbXByZXNzaW9uIGFuZCBDb2Rpbmcgb2YgQ29udGludW91cy10b25lIFN0aWxsIEltYWdlcywKK1BhcnQgMTogUmVxdWlyZW1lbnRzIGFuZCBndWlkZWxpbmVzIiBhbmQgaGFzIGRvY3VtZW50IG51bWJlcnMgSVNPL0lFQyBJUworMTA5MTgtMSwgSVRVLVQgVC44MS4gIFBhcnQgMiBpcyB0aXRsZWQgIkRpZ2l0YWwgQ29tcHJlc3Npb24gYW5kIENvZGluZyBvZgorQ29udGludW91cy10b25lIFN0aWxsIEltYWdlcywgUGFydCAyOiBDb21wbGlhbmNlIHRlc3RpbmciIGFuZCBoYXMgZG9jdW1lbnQKK251bWJlcnMgSVNPL0lFQyBJUyAxMDkxOC0yLCBJVFUtVCBULjgzLgorCitTb21lIGV4dGVuc2lvbnMgdG8gdGhlIG9yaWdpbmFsIEpQRUcgc3RhbmRhcmQgYXJlIGRlZmluZWQgaW4gSlBFRyBQYXJ0IDMsCithIG5ld2VyIElTTyBzdGFuZGFyZCBudW1iZXJlZCBJU08vSUVDIElTIDEwOTE4LTMgYW5kIElUVS1UIFQuODQuICBJSkcKK2N1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IGFueSBQYXJ0IDMgZXh0ZW5zaW9ucy4KKworVGhlIEpQRUcgc3RhbmRhcmQgZG9lcyBub3Qgc3BlY2lmeSBhbGwgZGV0YWlscyBvZiBhbiBpbnRlcmNoYW5nZWFibGUgZmlsZQorZm9ybWF0LiAgRm9yIHRoZSBvbWl0dGVkIGRldGFpbHMgd2UgZm9sbG93IHRoZSAiSkZJRiIgY29udmVudGlvbnMsIHJldmlzaW9uCisxLjAyLiAgQSBjb3B5IG9mIHRoZSBKRklGIHNwZWMgaXMgYXZhaWxhYmxlIGZyb206CisJTGl0ZXJhdHVyZSBEZXBhcnRtZW50CisJQy1DdWJlIE1pY3Jvc3lzdGVtcywgSW5jLgorCTE3NzggTWNDYXJ0aHkgQmx2ZC4KKwlNaWxwaXRhcywgQ0EgOTUwMzUKKwlwaG9uZSAoNDA4KSA5NDQtNjMwMCwgIGZheCAoNDA4KSA5NDQtNjMxNAorQSBQb3N0U2NyaXB0IHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBpcyBhdmFpbGFibGUgYnkgRlRQIGF0CitmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL2pwZWcvamZpZi5wcy5nei4gIFRoZXJlIGlzIGFsc28gYSBwbGFpbiB0ZXh0Cit2ZXJzaW9uIGF0IGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy9qZmlmLnR4dC5neiwgYnV0IGl0IGlzIG1pc3NpbmcKK3RoZSBmaWd1cmVzLgorCitUaGUgVElGRiA2LjAgZmlsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBjYW4gYmUgb2J0YWluZWQgYnkgRlRQIGZyb20KK2Z0cDovL2Z0cC5zZ2kuY29tL2dyYXBoaWNzL3RpZmYvVElGRjYucHMuZ3ouICBUaGUgSlBFRyBpbmNvcnBvcmF0aW9uIHNjaGVtZQorZm91bmQgaW4gdGhlIFRJRkYgNi4wIHNwZWMgb2YgMy1KdW5lLTkyIGhhcyBhIG51bWJlciBvZiBzZXJpb3VzIHByb2JsZW1zLgorSUpHIGRvZXMgbm90IHJlY29tbWVuZCB1c2Ugb2YgdGhlIFRJRkYgNi4wIGRlc2lnbiAoVElGRiBDb21wcmVzc2lvbiB0YWcgNikuCitJbnN0ZWFkLCB3ZSByZWNvbW1lbmQgdGhlIEpQRUcgZGVzaWduIHByb3Bvc2VkIGJ5IFRJRkYgVGVjaG5pY2FsIE5vdGUgIzIKKyhDb21wcmVzc2lvbiB0YWcgNykuICBDb3BpZXMgb2YgdGhpcyBOb3RlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGZ0cC5zZ2kuY29tIG9yCitmcm9tIGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy8uICBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBuZXh0IHJldmlzaW9uCitvZiB0aGUgVElGRiBzcGVjIHdpbGwgcmVwbGFjZSB0aGUgNi4wIEpQRUcgZGVzaWduIHdpdGggdGhlIE5vdGUncyBkZXNpZ24uCitBbHRob3VnaCBJSkcncyBvd24gY29kZSBkb2VzIG5vdCBzdXBwb3J0IFRJRkYvSlBFRywgdGhlIGZyZWUgbGlidGlmZiBsaWJyYXJ5Cit1c2VzIG91ciBsaWJyYXJ5IHRvIGltcGxlbWVudCBUSUZGL0pQRUcgcGVyIHRoZSBOb3RlLiAgbGlidGlmZiBpcyBhdmFpbGFibGUKK2Zyb20gZnRwOi8vZnRwLnNnaS5jb20vZ3JhcGhpY3MvdGlmZi8uCisKKworQVJDSElWRSBMT0NBVElPTlMKKz09PT09PT09PT09PT09PT09CisKK1RoZSAib2ZmaWNpYWwiIGFyY2hpdmUgc2l0ZSBmb3IgdGhpcyBzb2Z0d2FyZSBpcyBmdHAudXUubmV0IChJbnRlcm5ldAorYWRkcmVzcyAxOTIuNDguOTYuOSkuICBUaGUgbW9zdCByZWNlbnQgcmVsZWFzZWQgdmVyc2lvbiBjYW4gYWx3YXlzIGJlIGZvdW5kCit0aGVyZSBpbiBkaXJlY3RvcnkgZ3JhcGhpY3MvanBlZy4gIFRoaXMgcGFydGljdWxhciB2ZXJzaW9uIHdpbGwgYmUgYXJjaGl2ZWQKK2FzIGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy9qcGVnc3JjLnY2Yi50YXIuZ3ouICBJZiB5b3UgZG9uJ3QgaGF2ZQorZGlyZWN0IEludGVybmV0IGFjY2VzcywgVVVORVQncyBhcmNoaXZlcyBhcmUgYWxzbyBhdmFpbGFibGUgdmlhIFVVQ1A7IGNvbnRhY3QKK2hlbHBAdXVuZXQudXUubmV0IGZvciBpbmZvcm1hdGlvbiBvbiByZXRyaWV2aW5nIGZpbGVzIHRoYXQgd2F5LgorCitOdW1lcm91cyBJbnRlcm5ldCBzaXRlcyBtYWludGFpbiBjb3BpZXMgb2YgdGhlIFVVTkVUIGZpbGVzLiAgSG93ZXZlciwgb25seQorZnRwLnV1Lm5ldCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIGxhdGVzdCBvZmZpY2lhbCB2ZXJzaW9uLgorCitZb3UgY2FuIGFsc28gb2J0YWluIHRoaXMgc29mdHdhcmUgaW4gRE9TLWNvbXBhdGlibGUgInppcCIgYXJjaGl2ZSBmb3JtYXQgZnJvbQordGhlIFNpbVRlbCBhcmNoaXZlcyAoZnRwOi8vZnRwLnNpbXRlbC5uZXQvcHViL3NpbXRlbG5ldC9tc2Rvcy9ncmFwaGljcy8pLCBvcgorb24gQ29tcHVTZXJ2ZSBpbiB0aGUgR3JhcGhpY3MgU3VwcG9ydCBmb3J1bSAoR08gQ0lTOkdSQVBIU1VQKSwgbGlicmFyeSAxMgorIkpQRUcgVG9vbHMiLiAgQWdhaW4sIHRoZXNlIHZlcnNpb25zIG1heSBzb21ldGltZXMgbGFnIGJlaGluZCB0aGUgZnRwLnV1Lm5ldAorcmVsZWFzZS4KKworVGhlIEpQRUcgRkFRIChGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucykgYXJ0aWNsZSBpcyBhIHVzZWZ1bCBzb3VyY2Ugb2YKK2dlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgSlBFRy4gIEl0IGlzIHVwZGF0ZWQgY29uc3RhbnRseSBhbmQgdGhlcmVmb3JlIGlzCitub3QgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uICBUaGUgRkFRIGlzIHBvc3RlZCBldmVyeSB0d28gd2Vla3MgdG8KK1VzZW5ldCBuZXdzZ3JvdXBzIGNvbXAuZ3JhcGhpY3MubWlzYywgbmV3cy5hbnN3ZXJzLCBhbmQgb3RoZXIgZ3JvdXBzLgorSXQgaXMgYXZhaWxhYmxlIG9uIHRoZSBXb3JsZCBXaWRlIFdlYiBhdCBodHRwOi8vd3d3LmZhcXMub3JnL2ZhcXMvanBlZy1mYXEvCithbmQgb3RoZXIgbmV3cy5hbnN3ZXJzIGFyY2hpdmUgc2l0ZXMsIGluY2x1ZGluZyB0aGUgb2ZmaWNpYWwgbmV3cy5hbnN3ZXJzCithcmNoaXZlIGF0IHJ0Zm0ubWl0LmVkdTogZnRwOi8vcnRmbS5taXQuZWR1L3B1Yi91c2VuZXQvbmV3cy5hbnN3ZXJzL2pwZWctZmFxLy4KK0lmIHlvdSBkb24ndCBoYXZlIFdlYiBvciBGVFAgYWNjZXNzLCBzZW5kIGUtbWFpbCB0byBtYWlsLXNlcnZlckBydGZtLm1pdC5lZHUKK3dpdGggYm9keQorCXNlbmQgdXNlbmV0L25ld3MuYW5zd2Vycy9qcGVnLWZhcS9wYXJ0MQorCXNlbmQgdXNlbmV0L25ld3MuYW5zd2Vycy9qcGVnLWZhcS9wYXJ0MgorCisKK1JFTEFURUQgU09GVFdBUkUKKz09PT09PT09PT09PT09PT0KKworTnVtZXJvdXMgdmlld2luZyBhbmQgaW1hZ2UgbWFuaXB1bGF0aW9uIHByb2dyYW1zIG5vdyBzdXBwb3J0IEpQRUcuICAoUXVpdGUgYQorZmV3IG9mIHRoZW0gdXNlIHRoaXMgbGlicmFyeSB0byBkbyBzby4pICBUaGUgSlBFRyBGQVEgZGVzY3JpYmVkIGFib3ZlIGxpc3RzCitzb21lIG9mIHRoZSBtb3JlIHBvcHVsYXIgZnJlZSBhbmQgc2hhcmV3YXJlIHZpZXdlcnMsIGFuZCB0ZWxscyB3aGVyZSB0bworb2J0YWluIHRoZW0gb24gSW50ZXJuZXQuCisKK0lmIHlvdSBhcmUgb24gYSBVbml4IG1hY2hpbmUsIHdlIGhpZ2hseSByZWNvbW1lbmQgSmVmIFBvc2thbnplcidzIGZyZWUKK1BCTVBMVVMgc29mdHdhcmUsIHdoaWNoIHByb3ZpZGVzIG1hbnkgdXNlZnVsIG9wZXJhdGlvbnMgb24gUFBNLWZvcm1hdCBpbWFnZQorZmlsZXMuICBJbiBwYXJ0aWN1bGFyLCBpdCBjYW4gY29udmVydCBQUE0gaW1hZ2VzIHRvIGFuZCBmcm9tIGEgd2lkZSByYW5nZSBvZgorb3RoZXIgZm9ybWF0cywgdGh1cyBtYWtpbmcgY2pwZWcvZGpwZWcgY29uc2lkZXJhYmx5IG1vcmUgdXNlZnVsLiAgVGhlIGxhdGVzdAordmVyc2lvbiBpcyBkaXN0cmlidXRlZCBieSB0aGUgTmV0UEJNIGdyb3VwLCBhbmQgaXMgYXZhaWxhYmxlIGZyb20gbnVtZXJvdXMKK3NpdGVzLCBub3RhYmx5IGZ0cDovL3d1YXJjaGl2ZS53dXN0bC5lZHUvZ3JhcGhpY3MvZ3JhcGhpY3MvcGFja2FnZXMvTmV0UEJNLy4KK1VuZm9ydHVuYXRlbHkgUEJNUExVUy9ORVRQQk0gaXMgbm90IG5lYXJseSBhcyBwb3J0YWJsZSBhcyB0aGUgSUpHIHNvZnR3YXJlIGlzOworeW91IGFyZSBsaWtlbHkgdG8gaGF2ZSBkaWZmaWN1bHR5IG1ha2luZyBpdCB3b3JrIG9uIGFueSBub24tVW5peCBtYWNoaW5lLgorCitBIGRpZmZlcmVudCBmcmVlIEpQRUcgaW1wbGVtZW50YXRpb24sIHdyaXR0ZW4gYnkgdGhlIFBWUkcgZ3JvdXAgYXQgU3RhbmZvcmQsCitpcyBhdmFpbGFibGUgZnJvbSBmdHA6Ly9oYXZlZnVuLnN0YW5mb3JkLmVkdS9wdWIvanBlZy8uICBUaGlzIHByb2dyYW0KK2lzIGRlc2lnbmVkIGZvciByZXNlYXJjaCBhbmQgZXhwZXJpbWVudGF0aW9uIHJhdGhlciB0aGFuIHByb2R1Y3Rpb24gdXNlOworaXQgaXMgc2xvd2VyLCBoYXJkZXIgdG8gdXNlLCBhbmQgbGVzcyBwb3J0YWJsZSB0aGFuIHRoZSBJSkcgY29kZSwgYnV0IGl0CitpcyBlYXNpZXIgdG8gcmVhZCBhbmQgbW9kaWZ5LiAgQWxzbywgdGhlIFBWUkcgY29kZSBzdXBwb3J0cyBsb3NzbGVzcyBKUEVHLAord2hpY2ggd2UgZG8gbm90LiAgKE9uIHRoZSBvdGhlciBoYW5kLCBpdCBkb2Vzbid0IGRvIHByb2dyZXNzaXZlIEpQRUcuKQorCisKK0ZJTEUgRk9STUFUIFdBUlMKKz09PT09PT09PT09PT09PT0KKworU29tZSBKUEVHIHByb2dyYW1zIHByb2R1Y2UgZmlsZXMgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBvdXIgbGlicmFyeS4KK1RoZSByb290IG9mIHRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIElTTyBKUEVHIGNvbW1pdHRlZSBmYWlsZWQgdG8gc3BlY2lmeSBhCitjb25jcmV0ZSBmaWxlIGZvcm1hdC4gIFNvbWUgdmVuZG9ycyAiZmlsbGVkIGluIHRoZSBibGFua3MiIG9uIHRoZWlyIG93biwKK2NyZWF0aW5nIHByb3ByaWV0YXJ5IGZvcm1hdHMgdGhhdCBubyBvbmUgZWxzZSBjb3VsZCByZWFkLiAgKEZvciBleGFtcGxlLCBub25lCitvZiB0aGUgZWFybHkgY29tbWVyY2lhbCBKUEVHIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIE1hY2ludG9zaCB3ZXJlIGFibGUgdG8KK2V4Y2hhbmdlIGNvbXByZXNzZWQgZmlsZXMuKQorCitUaGUgZmlsZSBmb3JtYXQgd2UgaGF2ZSBhZG9wdGVkIGlzIGNhbGxlZCBKRklGIChzZWUgUkVGRVJFTkNFUykuICBUaGlzIGZvcm1hdAoraGFzIGJlZW4gYWdyZWVkIHRvIGJ5IGEgbnVtYmVyIG9mIG1ham9yIGNvbW1lcmNpYWwgSlBFRyB2ZW5kb3JzLCBhbmQgaXQgaGFzCitiZWNvbWUgdGhlIGRlIGZhY3RvIHN0YW5kYXJkLiAgSkZJRiBpcyBhIG1pbmltYWwgb3IgImxvdyBlbmQiIHJlcHJlc2VudGF0aW9uLgorV2UgcmVjb21tZW5kIHRoZSB1c2Ugb2YgVElGRi9KUEVHIChUSUZGIHJldmlzaW9uIDYuMCBhcyBtb2RpZmllZCBieSBUSUZGCitUZWNobmljYWwgTm90ZSAjMikgZm9yICJoaWdoIGVuZCIgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byByZWNvcmQgYSBsb3Qgb2YKK2FkZGl0aW9uYWwgZGF0YSBhYm91dCBhbiBpbWFnZS4gIFRJRkYvSlBFRyBpcyBmYWlybHkgbmV3IGFuZCBub3QgeWV0IHdpZGVseQorc3VwcG9ydGVkLCB1bmZvcnR1bmF0ZWx5LgorCitUaGUgdXBjb21pbmcgSlBFRyBQYXJ0IDMgc3RhbmRhcmQgZGVmaW5lcyBhIGZpbGUgZm9ybWF0IGNhbGxlZCBTUElGRi4KK1NQSUZGIGlzIGludGVyb3BlcmFibGUgd2l0aCBKRklGLCBpbiB0aGUgc2Vuc2UgdGhhdCBtb3N0IEpGSUYgZGVjb2RlcnMgc2hvdWxkCitiZSBhYmxlIHRvIHJlYWQgdGhlIG1vc3QgY29tbW9uIHZhcmlhbnQgb2YgU1BJRkYuICBTUElGRiBoYXMgc29tZSB0ZWNobmljYWwKK2FkdmFudGFnZXMgb3ZlciBKRklGLCBidXQgaXRzIG1ham9yIGNsYWltIHRvIGZhbWUgaXMgc2ltcGx5IHRoYXQgaXQgaXMgYW4KK29mZmljaWFsIHN0YW5kYXJkIHJhdGhlciB0aGFuIGFuIGluZm9ybWFsIG9uZS4gIEF0IHRoaXMgcG9pbnQgaXQgaXMgdW5jbGVhcgord2hldGhlciBTUElGRiB3aWxsIHN1cGVyc2VkZSBKRklGIG9yIHdoZXRoZXIgSkZJRiB3aWxsIHJlbWFpbiB0aGUgZGUtZmFjdG8KK3N0YW5kYXJkLiAgSUpHIGludGVuZHMgdG8gc3VwcG9ydCBTUElGRiBvbmNlIHRoZSBzdGFuZGFyZCBpcyBmcm96ZW4sIGJ1dCB3ZQoraGF2ZSBub3QgZGVjaWRlZCB3aGV0aGVyIGl0IHNob3VsZCBiZWNvbWUgb3VyIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCBvciBub3QuCisoSW4gYW55IGNhc2UsIG91ciBkZWNvZGVyIHdpbGwgcmVtYWluIGNhcGFibGUgb2YgcmVhZGluZyBKRklGIGluZGVmaW5pdGVseS4pCisKK1ZhcmlvdXMgcHJvcHJpZXRhcnkgZmlsZSBmb3JtYXRzIGluY29ycG9yYXRpbmcgSlBFRyBjb21wcmVzc2lvbiBhbHNvIGV4aXN0LgorV2UgaGF2ZSBsaXR0bGUgb3Igbm8gc3ltcGF0aHkgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlc2UgZm9ybWF0cy4gIEluZGVlZCwKK29uZSBvZiB0aGUgb3JpZ2luYWwgcmVhc29ucyBmb3IgZGV2ZWxvcGluZyB0aGlzIGZyZWUgc29mdHdhcmUgd2FzIHRvIGhlbHAKK2ZvcmNlIGNvbnZlcmdlbmNlIG9uIGNvbW1vbiwgb3BlbiBmb3JtYXQgc3RhbmRhcmRzIGZvciBKUEVHIGZpbGVzLiAgRG9uJ3QKK3VzZSBhIHByb3ByaWV0YXJ5IGZpbGUgZm9ybWF0IQorCisKK1RPIERPCis9PT09PQorCitUaGUgbWFqb3IgdGhydXN0IGZvciB2NyB3aWxsIHByb2JhYmx5IGJlIGltcHJvdmVtZW50IG9mIHZpc3VhbCBxdWFsaXR5LgorVGhlIGN1cnJlbnQgbWV0aG9kIGZvciBzY2FsaW5nIHRoZSBxdWFudGl6YXRpb24gdGFibGVzIGlzIGtub3duIG5vdCB0byBiZQordmVyeSBnb29kIGF0IGxvdyBRIHZhbHVlcy4gIFdlIGFsc28gaW50ZW5kIHRvIGludmVzdGlnYXRlIGJsb2NrIGJvdW5kYXJ5CitzbW9vdGhpbmcsICJwb29yIG1hbidzIHZhcmlhYmxlIHF1YW50aXphdGlvbiIsIGFuZCBvdGhlciBtZWFucyBvZiBpbXByb3ZpbmcKK3F1YWxpdHktdnMtZmlsZS1zaXplIHBlcmZvcm1hbmNlIHdpdGhvdXQgc2FjcmlmaWNpbmcgY29tcGF0aWJpbGl0eS4KKworSW4gZnV0dXJlIHZlcnNpb25zLCB3ZSBhcmUgY29uc2lkZXJpbmcgc3VwcG9ydGluZyBzb21lIG9mIHRoZSB1cGNvbWluZyBKUEVHCitQYXJ0IDMgZXh0ZW5zaW9ucyAtLS0gcHJpbmNpcGFsbHksIHZhcmlhYmxlIHF1YW50aXphdGlvbiBhbmQgdGhlIFNQSUZGIGZpbGUKK2Zvcm1hdC4KKworQXMgYWx3YXlzLCBzcGVlZGluZyB0aGluZ3MgdXAgaXMgb2YgZ3JlYXQgaW50ZXJlc3QuCisKK1BsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzLCBvZmZlcnMgb2YgaGVscCwgZXRjLiB0byBqcGVnLWluZm9AdXVuZXQudXUubmV0LgpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvUkVBRE1FX1RpZ2h0Vk5DLnR4dCBiL2NvbW1vbi9qcGVnL1JFQURNRV9UaWdodFZOQy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkNTAyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL1JFQURNRV9UaWdodFZOQy50eHQKQEAgLTAsMCArMSw1IEBACitUaGlzIGRpcmVjdG9yeSBpbmNsdWRlcyBhIGNvcHkgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHCitsaWJyYXJ5IChzZWUgdGhlIFJFQURNRSBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uKS4gTm90IGFsbCB0aGUgZmlsZXMKK2Zyb20gdGhlIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbiBoYXZlIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgVGlnaHRWTkMKK2NvZGViYXNlLiBUbyBvYnRhaW4gdGhlIG9yaWdpbmFsIGxpYnJhcnksIHBsZWFzZSBzZWUgdGhlIFJFQURNRSBmaWxlLAorc2VjdGlvbiAiQVJDSElWRSBMT0NBVElPTlMiLgpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvY29uZmlnLmd1ZXNzIGIvY29tbW9uL2pwZWcvY29uZmlnLmd1ZXNzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxM2VkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSw4ODMgQEAKKyMhIC9iaW4vc2gKKyMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgV3JpdHRlbiBieSBQZXIgQm90aG5lciA8Ym90aG5lckBjeWdudXMuY29tPi4KKyMgVGhlIG1hc3RlciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpcyBhdCB0aGUgRlNGIGluIC9ob21lL2dkL2dudS9saWIuCisjCisjIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KKyMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCisjIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgorIworIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKKyMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBzeXN0ZW0gdHlwZSAoaG9zdC90YXJnZXQgbmFtZSkuCisjCisjIE9ubHkgYSBmZXcgc3lzdGVtcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyBsaXN0OyBwbGVhc2UgYWRkIG90aGVycworIyAoYnV0IHRyeSB0byBrZWVwIHRoZSBzdHJ1Y3R1cmUgY2xlYW4pLgorIworCisjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgorIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDgvMjQvOTQuKQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCitVTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KKwordHJhcCAncm0gLWYgZHVtbXkuYyBkdW1teS5vIGR1bW15OyBleGl0IDEnIDEgMiAxNQorCisjIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCisKK2Nhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KKyAgICBhbHBoYTpPU0YxOio6KikKKwlpZiB0ZXN0ICRVTkFNRV9SRUxFQVNFID0gIlY0LjAiOyB0aGVuCisJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCisJZmkKKwkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KKwkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgorCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgorCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgorCWNhdCA8PEVPRiA+ZHVtbXkucworCS5nbG9ibCBtYWluCisJLmVudCBtYWluCittYWluOgorCS5mcmFtZSBcJDMwLDAsXCQyNiwwCisJLnByb2xvZ3VlIDAKKwkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciAkMAorCWxkYSBcJDIsMjU5CisJLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCisJc3JsIFwkMSw4LFwkMgorCXNsbCBcJDIsMixcJDIKKwlzbGwgXCQwLDMsXCQwCisJYWRkbCBcJDEsXCQwLFwkMAorCWFkZGwgXCQyLFwkMCxcJDAKKwlyZXQgXCQzMSwoXCQyNiksMQorCS5lbmQgbWFpbgorRU9GCisJJHtDQy1jY30gZHVtbXkucyAtbyBkdW1teSAyPi9kZXYvbnVsbAorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCisJCS4vZHVtbXkKKwkJY2FzZSAiJD8iIGluCisJCQk3KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgorCQkJCTs7CisJCQkxNSkKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKKwkJCQk7OworCQkJMTQpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgorCQkJCTs7CisJCQkxMCkKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgorCQkJCTs7CisJCQkxNikKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKKwkJCQk7OworCQllc2FjCisJZmkKKwlybSAtZiBkdW1teS5zIGR1bW15CisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyIFtbQS1aXV0gW1thLXpdXWAKKwlleGl0IDAgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDAgOzsKKyAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKKwllY2hvIG02OGstY2JtLXN5c3Y0CisJZXhpdCAwOzsKKyAgICBhbWlnYTpOZXRCU0Q6KjoqKQorICAgICAgZWNobyBtNjhrLWNibS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9CisgICAgICBleGl0IDAgOzsKKyAgICBhbWlnYTpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGFyYzY0Ok9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwczY0ZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGFyYzpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgaGttaXBzOk9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcG1heDpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc2dpOk9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgd2dyaXNjOk9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCisJZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMDs7CisgICAgYXJtMzI6TmV0QlNEOio6KikKKwllY2hvIGFybS11bmtub3duLW5ldGJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCWV4aXQgMCA7OworICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqKQorCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKKwlleGl0IDA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqfE1JUyo6T1N4KjoqOiopCisJIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KKwlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCisJZWxzZQorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKKwlmaQorCWV4aXQgMCA7OworICAgIE5JTEU6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgaTg2cGM6U3VuT1M6NS4qOiopCisJZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCAwIDs7CisgICAgc3VuMyo6U3VuT1M6KjoqKQorCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChoZWFkIC0xIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAorCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKKwljYXNlICJgL2Jpbi9hcmNoYCIgaW4KKwkgICAgc3VuMykKKwkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwkgICAgc3VuNCkKKwkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJZXNhYworCWV4aXQgMCA7OworICAgIGF1c2hwOlN1bk9TOio6KikKKwllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhdGFyaSo6TmV0QlNEOio6KikKKwllY2hvIG02OGstYXRhcmktbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGF0YXJpKjpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHN1bjMqOk5ldEJTRDoqOiopCisJZWNobyBtNjhrLXN1bi1uZXRic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3VuMyo6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYWM2OGs6TmV0QlNEOio6KikKKwllY2hvIG02OGstYXBwbGUtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1hYzY4azpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcG93ZXJwYzptYWNodGVuOio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCAwIDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBWQVgqOlVMVFJJWCo6KjoqKQorCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgMjAyMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQorCXNlZCAncy9eCS8vJyA8PCBFT0YgPmR1bW15LmMKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKiphcmd2OyB7CisJI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNlbmRpZgorCSAgZXhpdCAoLTEpOworCX0KK0VPRgorCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgXAorCSAgJiYgLi9kdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCisJICAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorCXJtIC1mIGR1bW15LmMgZHVtbXkKKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgMCA7OworICAgIG04OGs6Q1gvVVg6Nyo6KikKKwllY2hvIG04OGstaGFycmlzLWN4dXg3CisJZXhpdCAwIDs7CisgICAgbTg4azoqOjQqOlI0KikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKKwlleGl0IDAgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgMCA7OworICAgIEFWaWlPTjpkZ3V4Oio6KikKKyAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKKyAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKyAgICAgICAgaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCAtbyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdIDsgdGhlbgorCWlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IFwKKwkgICAgIC1vICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXSA7IHRoZW4KKwkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwlmaQorICAgICAgICBlbHNlIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBmaQorIAlleGl0IDAgOzsKKyAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQorCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCisJZXhpdCAwIDs7CisgICAgTTg4KjoqOlIzKjoqKQorCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDAgOzsKKyAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKKwllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCisJZXhpdCAwIDs7CisgICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKKwllY2hvIG02OGstdGVrdHJvbml4LWJzZAorCWV4aXQgMCA7OworICAgICo6SVJJWCo6KjoqKQorCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKKwlleGl0IDAgOzsKKyAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCisJZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCisJZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKKyAgICBpPzg2OkFJWDoqOiopCisJZWNobyBpMzg2LWlibS1haXgKKwlleGl0IDAgOzsKKyAgICAqOkFJWDoyOjMpCisJaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCXNlZCAncy9eCQkvLycgPDwgRU9GID5kdW1teS5jCisJCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CisKKwkJbWFpbigpCisJCQl7CisJCQlpZiAoIV9fcG93ZXJfcGMoKSkKKwkJCQlleGl0KDEpOworCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKKwkJCWV4aXQoMCk7CisJCQl9CitFT0YKKwkJJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCisJCXJtIC1mIGR1bW15LmMgZHVtbXkKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41CisJZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40CisJZWxzZQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCisJZmkKKwlleGl0IDAgOzsKKyAgICAqOkFJWDoqOjQpCisJaWYgL3Vzci9zYmluL2xzYXR0ciAtRUhsIHByb2MwIHwgZ3JlcCBQT1dFUiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJSUJNX0FSQ0g9cnM2MDAwCisJZWxzZQorCQlJQk1fQVJDSD1wb3dlcnBjCisJZmkKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9NC4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCAwIDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDAgOzsKKyAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKKwllY2hvIHJvbXAtaWJtLWJzZDQuNAorCWV4aXQgMCA7OworICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBOZXRCU0QgYW5kCisJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bworCWV4aXQgMCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisgICAgKjpCT1NYOio6KikKKwllY2hvIHJzNjAwMC1idWxsLWJvc3gKKwlleGl0IDAgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCAwIDs7CisgICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2QKKwlleGl0IDAgOzsKKyAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2Q0LjQKKwlleGl0IDAgOzsKKyAgICA5MDAwL1szNDc4XT8/OkhQLVVYOio6KikKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKKwkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OworCSAgICA5MDAwLzc/PyB8IDkwMDAvOD9bMTY3OV0gKSBIUF9BUkNIPWhwcGExLjEgOzsKKwkgICAgOTAwMC84Pz8gKSAgICAgICAgICAgIEhQX0FSQ0g9aHBwYTEuMCA7OworCWVzYWMKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCAwIDs7CisgICAgMzA1MCo6SEktVVg6KjoqKQorCXNlZCAncy9eCS8vJyA8PCBFT0YgPmR1bW15LmMKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50CisJbWFpbiAoKQorCXsKKwkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCisJICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAorCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCisJICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNwdSkKKwkJeworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCisJICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGV4aXQgKDApOworCX0KK0VPRgorCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorCXJtIC1mIGR1bW15LmMgZHVtbXkKKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCAwIDs7CisgICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1ic2QKKwlleGl0IDAgOzsKKyAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1ic2QKKwlleGl0IDAgOzsKKyAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtb3NmCisJZXhpdCAwIDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgMCA7OworICAgIGk/ODY6T1NGMToqOiopCisJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKKwlmaQorCWV4aXQgMCA7OworICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKKwllY2hvIGhwcGExLjEtaHAtbGl0ZXMKKwlleGl0IDAgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQ1JBWSpYLU1QOio6KjoqKQorCWVjaG8geG1wLWNyYXktdW5pY29zCisgICAgICAgIGV4aXQgMCA7OworICAgIENSQVkqWS1NUDoqOio6KikKKwllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBDUkFZKltBLVpdOTA6KjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCisJfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCisJICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8KKwlleGl0IDAgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIENSQVktMjoqOio6KikKKwllY2hvIGNyYXkyLWNyYXktdW5pY29zCisgICAgICAgIGV4aXQgMCA7OworICAgIEYzMDA6VU5JWF9TeXN0ZW1fVjoqOiopCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyIFtBLVpdIFthLXpdIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICJmMzAwLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKyAgICAgICAgZXhpdCAwIDs7CisgICAgRjMwMTpVTklYX1N5c3RlbV9WOio6KikKKyAgICAgICBlY2hvIGYzMDEtZnVqaXRzdS11eHB2YGVjaG8gJFVOQU1FX1JFTEVBU0UgfCBzZWQgJ3MvIC4qLy8nYAorICAgICAgIGV4aXQgMCA7OworICAgIGhwM1swLTldWzA1XTpOZXRCU0Q6KjoqKQorCWVjaG8gbTY4ay1ocC1uZXRic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgaHAzMDA6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBpPzg2OkJTRC8zODY6KjoqIHwgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6RnJlZUJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDAgOzsKKyAgICAqOk5ldEJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbmV0YnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJZXhpdCAwIDs7CisgICAgKjpPcGVuQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJZXhpdCAwIDs7CisgICAgaSo6Q1lHV0lOKjoqKQorCWVjaG8gaTM4Ni1wYy1jeWd3aW4zMgorCWV4aXQgMCA7OworICAgIGkqOk1JTkdXKjoqKQorCWVjaG8gaTM4Ni1wYy1taW5ndzMyCisJZXhpdCAwIDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luMzIKKwlleGl0IDAgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgKjpHTlU6KjoqKQorCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAorCWV4aXQgMCA7OworICAgICo6TGludXg6KjoqKQorCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCisJIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLgorCWxkX2hlbHBfc3RyaW5nPWBsZCAtLWhlbHAgMj4mMWAKKwlsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucz1gZWNobyAkbGRfaGVscF9zdHJpbmcgXAorCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCBlbXVsYXRpb25zOi8hZAorCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKKwkJCQkgICAgcy8uKnN1cHBvcnRlZCBlbXVsYXRpb25zOiAqLy8KKwkJCQkgICAgcy8gLiovLworCQkJCSAgICBwJ2AKKyAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF9lbXVsYXRpb25zIiBpbgorCSAgaT84NmxpbnV4KSAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IiAgICAgIDsgZXhpdCAwIDs7CisJICBpPzg2Y29mZikgICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiICAgICAgOyBleGl0IDAgOzsKKwkgIHNwYXJjbGludXgpIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OworCSAgbTY4a2xpbnV4KSAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiIDsgZXhpdCAwIDs7CisJICBlbGYzMnBwYykgICBlY2hvICJwb3dlcnBjLXVua25vd24tbGludXgtZ251IiAgICAgICAgICAgICAgOyBleGl0IDAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJhbHBoYSIgOyB0aGVuCisJCXNlZCAncy9eCS8vJyAgPDxFT0YgPmR1bW15LnMKKwkJLmdsb2JsIG1haW4KKwkJLmVudCBtYWluCisJbWFpbjoKKwkJLmZyYW1lIFwkMzAsMCxcJDI2LDAKKwkJLnByb2xvZ3VlIDAKKwkJLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgJDAKKwkJbGRhIFwkMiwyNTkKKwkJLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCisJCXNybCBcJDEsOCxcJDIKKwkJc2xsIFwkMiwyLFwkMgorCQlzbGwgXCQwLDMsXCQwCisJCWFkZGwgXCQxLFwkMCxcJDAKKwkJYWRkbCBcJDIsXCQwLFwkMAorCQlyZXQgXCQzMSwoXCQyNiksMQorCQkuZW5kIG1haW4KK0VPRgorCQlMSUJDPSIiCisJCSR7Q0MtY2N9IGR1bW15LnMgLW8gZHVtbXkgMj4vZGV2L251bGwKKwkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KKwkJCS4vZHVtbXkKKwkJCWNhc2UgIiQ/IiBpbgorCQkJNykKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKKwkJCQk7OworCQkJMTUpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCisJCQkJOzsKKwkJCTE0KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKKwkJCQk7OworCQkJMTApCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKKwkJCQk7OworCQkJMTYpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCisJCQkJOzsKKwkJCWVzYWMJCisKKwkJCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgZHVtbXkgfCBcCisJCQkgIGdyZXAgbGQuc28uMSA+IC9kZXYvbnVsbAorCQkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KKwkJCQlMSUJDPSJsaWJjMSIKKwkJCWZpCisJCWZpCQorCQlybSAtZiBkdW1teS5zIGR1bW15CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30gOyBleGl0IDAKKwllbGlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gIm1pcHMiIDsgdGhlbgorCSAgY2F0ID5kdW1teS5jIDw8RU9GCittYWluKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisjaWZkZWYgX19NSVBTRUJfXworICBwcmludGYgKCIlcy11bmtub3duLWxpbnV4LWdudVxuIiwgYXJndlsxXSk7CisjZW5kaWYKKyNpZmRlZiBfX01JUFNFTF9fCisgIHByaW50ZiAoIiVzZWwtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOworI2VuZGlmCisgIHJldHVybiAwOworfQorRU9GCisJICAke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgIiR7VU5BTUVfTUFDSElORX0iICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCisJICBybSAtZiBkdW1teS5jIGR1bW15CisJZWxzZQorCSAgIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpCisJICAjIG9yIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KKwkgICMgR0NDIHdhbnRzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbGludXgtZ251b2xkbGQgYW5kIGxpbnV4LWdudWFvdXQuCisJICAjIElmIGxkIGRvZXMgbm90IHByb3ZpZGUgKmFueSogInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKKwkgICMgdGhhdCBtZWFucyBpdCBpcyBnbnVvbGRsZC4KKwkgIGVjaG8gIiRsZF9oZWxwX3N0cmluZyIgfCBncmVwID4vZGV2L251bGwgMj4mMSAic3VwcG9ydGVkIGVtdWxhdGlvbnM6IgorCSAgdGVzdCAkPyAhPSAwICYmIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251b2xkbGQiICYmIGV4aXQgMAorCisJICBjYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgaT84NikKKwkgICAgVkVORE9SPXBjOworCSAgICA7OworCSAgKikKKwkgICAgVkVORE9SPXVua25vd247CisJICAgIDs7CisJICBlc2FjCisJICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgorCSAgY2F0ID5kdW1teS5jIDw8RU9GCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KK21haW4oYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyNpZmRlZiBfX0VMRl9fCisjIGlmZGVmIF9fR0xJQkNfXworIyAgaWYgX19HTElCQ19fID49IDIKKyAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKKyMgIGVsc2UKKyAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251bGliYzFcbiIsIGFyZ3ZbMV0pOworIyAgZW5kaWYKKyMgZWxzZQorICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKKyMgZW5kaWYKKyNlbHNlCisgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVhb3V0XG4iLCBhcmd2WzFdKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KK0VPRgorCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorCSAgcm0gLWYgZHVtbXkuYyBkdW1teQorCWZpIDs7CisjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLiAgZWFybGllciB2ZXJzaW9ucworIyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGggc3lzbmFtZSBhbmQgbm9kZW5hbWUuCisgICAgaT84NjpEWU5JWC9wdHg6NCo6KikKKwllY2hvIGkzODYtc2VxdWVudC1zeXN2NAorCWV4aXQgMCA7OworICAgIGk/ODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgMCA7OworICAgIGk/ODY6Kjo0Lio6KiB8IGk/ODY6U1lTVEVNX1Y6NC4qOiopCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCAwIDs7CisgICAgaT84NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGVncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAorCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDAgOzsKKyAgICBwYzoqOio6KikKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KKwllY2hvIGkzODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDAgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCAwIDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgMCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDAgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgMCA7OworICAgIE02OCo6KjpSM1ZbNTY3XSo6KikKKwl0ZXN0IC1yIC9zeXNWNjggJiYgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JyAmJiBleGl0IDAgOzsKKyAgICAzWzM0XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCkKKwlPU19SRUw9JycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgJiYgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgJiYgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMCA7OworICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQorICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKyAgICAgICAgICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0ICYmIGV4aXQgMCA7OworICAgIG02OCo6THlueE9TOjIuKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisJZWNobyBtNjhrLWF0YXJpLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgaT84NjpMeW54T1M6Mi4qOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjIuKjoqKQorCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFJNKjpTSU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgKjpTSU5JWC0qOio6KikKKwlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0CisJZWxzZQorCQllY2hvIG5zMzJrLXNuaS1zeXN2CisJZmkKKwlleGl0IDAgOzsKKyAgICBQRU5USVVNOkNQdW5peDo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCAwIDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgIG1jNjgqOkEvVVg6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbmV3cyo6TkVXUy1PUzoqOjYqKQorCWVjaG8gbWlwcy1zb255LW5ld3NvczYKKwlleGl0IDAgOzsKKyAgICBSMzAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiopCisJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCisJICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorICAgICAgICBleGl0IDAgOzsKK2VzYWMKKworI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCisjZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCisKK2NhdCA+ZHVtbXkuYyA8PEVPRgorI2lmZGVmIF9TRVFVRU5UXworIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorbWFpbiAoKQoreworI2lmIGRlZmluZWQgKHNvbnkpCisjaWYgZGVmaW5lZCAoTUlQU0VCKQorICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAorICAgICBJIGRvbid0IGtub3cuLi4uICAqLworICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCisjaWZkZWYgTkVXU09TNAorICAgICAgICAgICI0IgorI2Vsc2UKKwkgICIiCisjZW5kaWYKKyAgICAgICAgICk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXgiKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKKyAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTmVYVCkKKyNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKKyNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKKyNlbmRpZgorICBpbnQgdmVyc2lvbjsKKyAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOworICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKKyNpZiBkZWZpbmVkIChVTUFYVikKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaWYgZGVmaW5lZCAoQ01VKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX18zODZCU0RfXykKKyAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoc2VxdWVudCkKKyNpZiBkZWZpbmVkIChpMzg2KQorICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKG5zMzIwMDApCisgIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCisgICAgc3RydWN0IHV0c25hbWUgdW47CisKKyAgICB1bmFtZSgmdW4pOworCisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgeworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOworCisjZW5kaWYKKworI2lmIGRlZmluZWQgKHZheCkKKyNpZiAhZGVmaW5lZCAodWx0cml4KQorICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQorICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworICBleGl0ICgxKTsKK30KK0VPRgorCiske0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKK3JtIC1mIGR1bW15LmMgZHVtbXkKKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQorCisjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCisKK2lmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCit0aGVuCisgICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KKyAgICBjMSopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgYzIqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKwlleGl0IDAgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjMzgqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjNCopCisJZWNobyBjNC1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgZXNhYworZmkKKworI2VjaG8gJyhVbmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUpJyAxPiYyCisKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvY29uZmlnLnN1YiBiL2NvbW1vbi9qcGVnL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjEzYTZkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2NvbmZpZy5zdWIKQEAgLTAsMCArMSw5NTQgQEAKKyMhIC9iaW4vc2gKKyMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LCB2ZXJzaW9uIDEuMS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgorIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCisjIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCitpZiBbIHgkMSA9IHggXQordGhlbgorCWVjaG8gQ29uZmlndXJhdGlvbiBuYW1lIG1pc3NpbmcuIDE+JjIKKwllY2hvICJVc2FnZTogJDAgQ1BVLU1GUi1PUFNZUyIgMT4mMgorCWVjaG8gIm9yICAgICAkMCBBTElBUyIgMT4mMgorCWVjaG8gd2hlcmUgQUxJQVMgaXMgYSByZWNvZ25pemVkIGNvbmZpZ3VyYXRpb24gdHlwZS4gMT4mMgorCWV4aXQgMQorZmkKKworIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCitjYXNlICQxIGluCisJKmxvY2FsKikKKwkJZWNobyAkMQorCQlleGl0IDAKKwkJOzsKKwkqKQorCTs7Citlc2FjCisKKyMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KKyMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCittYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKK2Nhc2UgJG1heWJlX29zIGluCisgIGxpbnV4LWdudSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY281KQorCQlvcz1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbyopCisJCW9zPS1zY28zLjJ2MgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJdGFob2UgfCBpODYwIHwgbTMyciB8IG02OGsgfCBtNjgwMDAgfCBtODhrIHwgbnMzMmsgfCBhcmMgfCBhcm0gXAorCQl8IGFybWVbbGJdIHwgcHlyYW1pZCB8IG1uMTAyMDAgfCBtbjEwMzAwIFwKKwkJfCB0cm9uIHwgYTI5ayB8IDU4MCB8IGk5NjAgfCBoODMwMCB8IGhwcGEgfCBocHBhMS4wIHwgaHBwYTEuMSBcCisJCXwgYWxwaGEgfCBhbHBoYWV2NSB8IGFscGhhZXY1NiB8IHdlMzJrIHwgbnMxNmsgfCBjbGlwcGVyIFwKKwkJfCBpMzcwIHwgc2ggfCBwb3dlcnBjIHwgcG93ZXJwY2xlIHwgMTc1MGEgfCBkc3AxNnh4IHwgcGRwMTEgXAorCQl8IG1pcHM2NCB8IG1pcHNlbCB8IG1pcHM2NGVsIHwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKKwkJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCQl8IHNwYXJjIHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgfCBzcGFyYzY0IHwgdjg1MCkKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKKwkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKKwkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCisJaVszNDU2XTg2KQorCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYworCSAgOzsKKwkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgorCSotKi0qKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KKwl2YXgtKiB8IHRhaG9lLSogfCBpWzM0NTZdODYtKiB8IGk4NjAtKiB8IG0zMnItKiB8IG02OGstKiB8IG02ODAwMC0qIFwKKwkgICAgICB8IG04OGstKiB8IHNwYXJjLSogfCBuczMyay0qIHwgZng4MC0qIHwgYXJjLSogfCBhcm0tKiB8IGNbMTIzXSogXAorCSAgICAgIHwgbWlwcy0qIHwgcHlyYW1pZC0qIHwgdHJvbi0qIHwgYTI5ay0qIHwgcm9tcC0qIHwgcnM2MDAwLSogXAorCSAgICAgIHwgcG93ZXItKiB8IG5vbmUtKiB8IDU4MC0qIHwgY3JheTItKiB8IGg4MzAwLSogfCBpOTYwLSogXAorCSAgICAgIHwgeG1wLSogfCB5bXAtKiB8IGhwcGEtKiB8IGhwcGExLjAtKiB8IGhwcGExLjEtKiBcCisJICAgICAgfCBhbHBoYS0qIHwgYWxwaGFldjUtKiB8IGFscGhhZXY1Ni0qIHwgd2UzMmstKiB8IGN5ZHJhLSogXAorCSAgICAgIHwgbnMxNmstKiB8IHBuLSogfCBucDEtKiB8IHhwczEwMC0qIHwgY2xpcHBlci0qIHwgb3Jpb24tKiBcCisJICAgICAgfCBzcGFyY2xpdGUtKiB8IHBkcDExLSogfCBzaC0qIHwgcG93ZXJwYy0qIHwgcG93ZXJwY2xlLSogXAorCSAgICAgIHwgc3BhcmM2NC0qIHwgbWlwczY0LSogfCBtaXBzZWwtKiBcCisJICAgICAgfCBtaXBzNjRlbC0qIHwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiAgXAorCSAgICAgIHwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJICAgICAgfCBmMzAxLSopCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQorCQk7OworCWFtaWdhb3MgfCBhbWlnYWRvcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQorCQlvcz0tYW1pZ2FvcworCQk7OworCWFtaWdhdW5peCB8IGFtaXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQlvcz0tYXV4CisJCTs7CisJYmFsYW5jZSkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCB5bXApCisJCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyYXkyKQorCQliYXNpY19tYWNoaW5lPWNyYXkyLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCVtjdGpdOTAtY3JheSkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JkcyB8IHVub3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZHB4MjAgfCBkcHgyMC0qKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCisJCW9zPS1ib3N4CisJCTs7CisJZHB4MiogfCBkcHgyKi1idWxsKQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjMKKwkJOzsKKwllYm1vbjI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tZWJtb24KKwkJOzsKKwllbHhzaSkKKwkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQorCQlvcz0tYnNkCisJCTs7CisJZW5jb3JlIHwgdW1heCB8IG1tYXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCisJCTs7CisJZngyODAwKQorCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAorCQk7OworCWdlbml4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCisJCTs7CisJZ21pY3JvKQorCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCisJCW9zPS1zeXN2CisJCTs7CisJaDMwNTByKiB8IGhpdXgqKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCWg4MzAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWhhcnJpcykKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tc3lzdjMKKwkJOzsKKwlocDMwMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDMwMGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ic2QKKwkJOzsKKwlocDMwMGhwdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0taHB1eAorCQk7OworCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAorCQk7OworCWhwOWszWzItOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHA5azdbMC05XVswLTldIHwgaHA3WzAtOV1bMC05XSB8IGhwOWs4WzAtOV03IHwgaHA4WzAtOV03KQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocHBhLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwlpMzcwLWlibSogfCBpYm0qKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKyMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPworCWlbMzQ1Nl04NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpWzM0NTZdODZ2NCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjQKKwkJOzsKKwlpWzM0NTZdODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpWzM0NTZdODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworCW1pbmlmcmFtZSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAorCQk7OworCW1pcHNlbCotbGludXgqKQorCQliYXNpY19tYWNoaW5lPW1pcHNlbC11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwltaXBzKi1saW51eCopCisJCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwltaXBzMyotKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKKwkJOzsKKwltaXBzMyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KKwkJOzsKKwluY3IzMDAwKQorCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCisJCW9zPS1zeXN2NAorCQk7OworCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzMTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKyAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCisJCTs7CisJcGVudGl1bSB8IHA1KQorCQliYXNpY19tYWNoaW5lPWk1ODYtaW50ZWwKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1pbnRlbAorCQk7OworCXBlbnRpdW0tKiB8IHA1LSopCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1wcm8tKiB8IHA2LSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWs1KQorCQkjIFdlIGRvbid0IGhhdmUgc3BlY2lmaWMgc3VwcG9ydCBmb3IgQU1EJ3MgSzUgeWV0LCBzbyBqdXN0IGNhbGwgaXQgYSBQZW50aXVtCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1hbWQKKwkJOzsKKwluZXhlbikKKwkJIyBXZSBkb24ndCBoYXZlIHNwZWNpZmljIHN1cHBvcnQgZm9yIE5leGdlbiB5ZXQsIHNvIGp1c3QgY2FsbCBpdCBhIFBlbnRpdW0KKwkJYmFzaWNfbWFjaGluZT1pNTg2LW5leGdlbgorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXBwYykJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkgICAgICAgIDs7CisJcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCisJICAgICAgICA7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXNlcXVlbnQpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCTs7CisJc2gpCisJCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJc3BzNykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YyCisJCTs7CisJc3B1cikKKwkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzeW1tZXRyeSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJdHgzOSkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCisJCTs7CisJdHgzOWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgorCQk7OworCXRvd2VyIHwgdG93ZXItMzIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKKwkJOzsKKwl1ZGkyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXVsdHJhMykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQorCQlvcz0tc3ltMQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisgICAgICAgICAgICAgICBiYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQorICAgICAgICAgICAgICAgOzsKKwl2eHdvcmtzOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczY4KQorCQliYXNpY19tYWNoaW5lPW02OGstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXhtcCkKKwkJYmFzaWNfbWFjaGluZT14bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisgICAgICAgIHhwcyB8IHhwczEwMCkKKwkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCW1pcHMpCisJCWlmIFsgeCRvcyA9IHgtbGludXgtZ251IF07IHRoZW4KKwkJCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCisJCWVsc2UKKwkJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCWZpCisJCTs7CisJcm9tcCkKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXJzNjAwMCkKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJdmF4KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJOzsKKwlwZHAxMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKKwkJOzsKKwl3ZTMyaykKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlzcGFyYykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKyAgICAgICAgY3lkcmEpCisJCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQorCQk7OworCW9yaW9uKQorCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAorCQk7OworCW9yaW9uMTA1KQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCisJCTs7CisJKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworCisjIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLWRpZ2l0YWwqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKKwkJOzsKKwkqLWNvbW1vZG9yZSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCisJCTs7CisJKikKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCisKK2lmIFsgeCIkb3MiICE9IHgiIiBdCit0aGVuCitjYXNlICRvcyBpbgorICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcworICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgorCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgorCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCisJCTs7CisJLXNvbGFyaXMpCisJCW9zPS1zb2xhcmlzMgorCQk7OworCS1zdnI0KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXVuaXh3YXJlKikKKwkJb3M9LXN5c3Y0LjJ1dworCQk7OworCS1nbnUvbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCisJIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KKwkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KKwktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCisJICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKKwkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAorCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAorCSAgICAgIHwgLWFvcyogXAorCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCisJICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCisJICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1uZXRic2QqIHwgLW9wZW5ic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogXAorCSAgICAgIHwgLWx5bnhvcyogfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogXAorCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKKwkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKKwkgICAgICB8IC1jeWd3aW4zMiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLXV4cHYqKQorCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vc2Zyb3NlKikKKwkJb3M9LW9zZnJvc2UKKwkJOzsKKwktb3NmKikKKwkJb3M9LW9zZgorCQk7OworCS11dGVrKikKKwkJb3M9LWJzZAorCQk7OworCS1keW5peCopCisJCW9zPS1ic2QKKwkJOzsKKwktYWNpcyopCisJCW9zPS1hb3MKKwkJOzsKKwktY3RpeCogfCAtdXRzKikKKwkJb3M9LXN5c3YKKwkJOzsKKwktbnMyICkKKwkgICAgICAgIG9zPS1uZXh0c3RlcDIKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworCS10cml0b24qKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktb3NzKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCS1zdnIzKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3lzdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCisJLXN5c3YqKQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworICAgICAgICBwZHAxMS0qKQorCQlvcz0tbm9uZQorCQk7OworCSotZGVjIHwgdmF4LSopCisJCW9zPS11bHRyaXg0LjIKKwkJOzsKKwltNjgqLWFwb2xsbykKKwkJb3M9LWRvbWFpbgorCQk7OworCWkzODYtc3VuKQorCQlvcz0tc3Vub3M0LjAuMgorCQk7OworCW02ODAwMC1zdW4pCisJCW9zPS1zdW5vczMKKwkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCisJCSMgZGVmYXVsdC4KKwkJIyBvcz0tc3Vub3M0CisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotaWJtKQorCQlvcz0tYWl4CisJCTs7CisJKi1ocCkKKwkJb3M9LWhwdXgKKwkJOzsKKwkqLWhpdGFjaGkpCisJCW9zPS1oaXV4CisJCTs7CisJaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQorCQlvcz0tc3lzdgorCQk7OworCSotY2JtKQorCQlvcz0tYW1pZ2FvcworCQk7OworCSotZGcpCisJCW9zPS1kZ3V4CisJCTs7CisJKi1kb2xwaGluKQorCQlvcz0tc3lzdjMKKwkJOzsKKwltNjhrLWNjdXIpCisJCW9zPS1ydHUKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJb3M9LWx1bmEKKwkJOzsKKwkqLW5leHQgKQorCQlvcz0tbmV4dHN0ZXAKKwkJOzsKKwkqLXNlcXVlbnQpCisJCW9zPS1wdHgKKwkJOzsKKwkqLWNyZHMpCisJCW9zPS11bm9zCisJCTs7CisJKi1ucykKKwkJb3M9LWdlbml4CisJCTs7CisJaTM3MC0qKQorCQlvcz0tbXZzCisJCTs7CisJKi1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisgICAgICAgICotZ291bGQpCisJCW9zPS1zeXN2CisJCTs7CisgICAgICAgICotaGlnaGxldmVsKQorCQlvcz0tYnNkCisJCTs7CisJKi1lbmNvcmUpCisJCW9zPS1ic2QKKwkJOzsKKyAgICAgICAgKi1zZ2kpCisJCW9zPS1pcml4CisJCTs7CisgICAgICAgICotc2llbWVucykKKwkJb3M9LXN5c3Y0CisJCTs7CisJKi1tYXNzY29tcCkKKwkJb3M9LXJ0dQorCQk7OworCWYzMDEtZnVqaXRzdSkKKwkJb3M9LXV4cHYKKwkJOzsKKwkqKQorCQlvcz0tbm9uZQorCQk7OworZXNhYworZmkKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKKyMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCit2ZW5kb3I9dW5rbm93bgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotdW5rbm93bikKKwkJY2FzZSAkb3MgaW4KKwkJCS1yaXNjaXgqKQorCQkJCXZlbmRvcj1hY29ybgorCQkJCTs7CisJCQktc3Vub3MqKQorCQkJCXZlbmRvcj1zdW4KKwkJCQk7OworCQkJLWFpeCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktaHB1eCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1oaXV4KikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktdW5vcyopCisJCQkJdmVuZG9yPWNyZHMKKwkJCQk7OworCQkJLWRndXgqKQorCQkJCXZlbmRvcj1kZworCQkJCTs7CisJCQktbHVuYSopCisJCQkJdmVuZG9yPW9tcm9uCisJCQkJOzsKKwkJCS1nZW5peCopCisJCQkJdmVuZG9yPW5zCisJCQkJOzsKKwkJCS1tdnMqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCWVzYWMKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKKwkJOzsKK2VzYWMKKworZWNobyAkYmFzaWNfbWFjaGluZSRvcwpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvY29uZmlndXJlIGIvY29tbW9uL2pwZWcvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1YzlkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9jb25maWd1cmUKQEAgLTAsMCArMSwyMDExIEBACisjISAvYmluL3NoCisKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2hhcmVkICAgICAgICAgYnVpbGQgc2hhcmVkIGxpYnJhcnkgdXNpbmcgR05VIGxpYnRvb2wiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zdGF0aWMgICAgICAgICBidWlsZCBzdGF0aWMgbGlicmFyeSB1c2luZyBHTlUgbGlidG9vbCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLW1heG1lbVs9Tl0gICAgIGVuYWJsZSB1c2Ugb2YgdGVtcCBmaWxlcywgc2V0IG1heCBtZW0gdXNhZ2UgdG8gTiBNQiIKK2FjX2hlbHA9IiRhY19oZWxwCisiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqPSopCisgICAgdmFybmFtZT1gZWNobyAiJGFjX29wdGlvbiJ8c2VkIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZW4ndCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkdmFybmFtZXwgc2VkICdzL1thLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkdmFybmFtZTogaW52YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIHZhbD0iYGVjaG8gIiRhY19vcHRpb24ifHNlZCAncy9bXj1dKj0vLydgIgorICAgIHRlc3QgLW4gIiR2ZXJib3NlIiAmJiBlY2hvICIJc2V0dGluZyBzaGVsbCB2YXJpYWJsZSAkdmFybmFtZSB0byAkdmFsIgorICAgIGV2YWwgIiR2YXJuYW1lPSckdmFsJyIKKyAgICBldmFsICJleHBvcnQgJHZhcm5hbWUiIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPWpjbWFzdGVyLmMKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTM4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1Njc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjE1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2MjUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KK2ZpCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjQ5OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjU0OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19jdl9wcm9nX2djYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nY2M9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CisKK2lmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCisgIEdDQz15ZXMKKyAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItTzIiCitlbHNlCisgIEdDQz0KKyAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItTyIKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2ODE6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjk2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MDI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzEzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzQyOiBjaGVja2luZyBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snaWpnX2N2X2hhdmVfcHJvdG90eXBlcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDc0NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKTsgLyogY2hlY2sgcHJvdG90eXBlcyAqLworc3RydWN0IG1ldGhvZHNfc3RydWN0IHsJCS8qIGNoZWNrIG1ldGhvZC1wb2ludGVyIGRlY2xhcmF0aW9ucyAqLworICBpbnQgKCplcnJvcl9leGl0KSAoY2hhciAqbXNndGV4dCk7CisgIGludCAoKnRyYWNlX21lc3NhZ2UpIChjaGFyICptc2d0ZXh0KTsKKyAgaW50ICgqYW5vdGhlcl9tZXRob2QpICh2b2lkKTsKK307CitpbnQgdGVzdGZ1bmN0aW9uIChpbnQgYXJnMSwgaW50ICogYXJnMikgLyogY2hlY2sgZGVmaW5pdGlvbnMgKi8KK3sgcmV0dXJuIGFyZzJbYXJnMV07IH0KK2ludCB0ZXN0MmZ1bmN0aW9uICh2b2lkKQkvKiBjaGVjayB2b2lkIGFyZyBsaXN0ICovCit7IHJldHVybiAwOyB9CisKK2ludCBtYWluKCkgeworIAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19jdl9oYXZlX3Byb3RvdHlwZXM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19jdl9oYXZlX3Byb3RvdHlwZXM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyIgMT4mNgoraWYgdGVzdCAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTIAorRU9GCisKK2Vsc2UKKyAgZWNobyBZb3VyIGNvbXBpbGVyIGRvZXMgbm90IHNlZW0gdG8ga25vdyBhYm91dCBmdW5jdGlvbiBwcm90b3R5cGVzLgorICBlY2hvIFBlcmhhcHMgaXQgbmVlZHMgYSBzcGVjaWFsIHN3aXRjaCB0byBlbmFibGUgQU5TSSBDIG1vZGUuCisgIGVjaG8gSWYgc28sIHdlIHJlY29tbWVuZCBydW5uaW5nIGNvbmZpZ3VyZSBsaWtlIHRoaXM6CisgIGVjaG8gIiAgIC4vY29uZmlndXJlICBDQz0nY2MgLXN3aXRjaCciCisgIGVjaG8gd2hlcmUgLXN3aXRjaCBpcyB0aGUgcHJvcGVyIHN3aXRjaC4KK2ZpCithY19zYWZlPWBlY2hvICJzdGRkZWYuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RkZGVmLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc5MjogY2hlY2tpbmcgZm9yIHN0ZGRlZi5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3OTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MDI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NURERFRl9IIAorRU9GCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCithY19zYWZlPWBlY2hvICJzdGRsaWIuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RkbGliLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgyODogY2hlY2tpbmcgZm9yIHN0ZGxpYi5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MzMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4Mzg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NURExJQl9IIAorRU9GCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCithY19zYWZlPWBlY2hvICJzdHJpbmcuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RyaW5nLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg2NDogY2hlY2tpbmcgZm9yIHN0cmluZy5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9CU0RfU1RSSU5HUyAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5MDA6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTAyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIEhBVkVfU1REREVGX0gKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgTkVFRF9CU0RfU1RSSU5HUworI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKK3R5cGVkZWYgc2l6ZV90IG15X3NpemVfdDsKKworaW50IG1haW4oKSB7CisgbXlfc2l6ZV90IGZvb3ZhcjsgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTIzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX3NpemVfdF9vaz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX3NpemVfdF9vaz0ibm90IEFOU0ksIHBlcmhhcHMgaXQgaXMgaW4gc3lzL3R5cGVzLmgiCitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICIkYWNfdCIiJGlqZ19zaXplX3Rfb2siIDE+JjYKK2lmIHRlc3QgIiRpamdfc2l6ZV90X29rIiAhPSB5ZXM7IHRoZW4KK2FjX3NhZmU9YGVjaG8gInN5cy90eXBlcy5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXMvdHlwZXMuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTM3OiBjaGVja2luZyBmb3Igc3lzL3R5cGVzLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk0MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjk0NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfU1lTX1RZUEVTX0ggCitFT0YKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTY4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAic2l6ZV90IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfc2l6ZV90X29rPSJzaXplX3QgaXMgaW4gc3lzL3R5cGVzLmgiCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX3NpemVfdF9vaz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgoraWpnX3NpemVfdF9vaz1ubworZmkKKworZWNobyAiJGFjX3QiIiRpamdfc2l6ZV90X29rIiAxPiY2CitpZiB0ZXN0ICIkaWpnX3NpemVfdF9vayIgPSBubzsgdGhlbgorICBlY2hvIFR5cGUgc2l6ZV90IGlzIG5vdCBkZWZpbmVkIGluIGFueSBvZiB0aGUgdXN1YWwgcGxhY2VzLgorICBlY2hvIFRyeSBwdXR0aW5nICcidHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OyInIGluIGpjb25maWcuaC4KK2ZpCitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHR5cGUgdW5zaWduZWQgY2hhciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTk0OiBjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBjaGFyIiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk5NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworIHVuc2lnbmVkIGNoYXIgdW5fY2hhcjsgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAwMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIgCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitybSAtZiBjb25mdGVzdCoKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB0eXBlIHVuc2lnbmVkIHNob3J0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDE4OiBjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBzaG9ydCIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDIwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisgdW5zaWduZWQgc2hvcnQgdW5fc2hvcnQ7IAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMjc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVCAKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHR5cGUgdm9pZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA0MjogY2hlY2tpbmcgZm9yIHR5cGUgdm9pZCIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDQ0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogQ2F1dGlvbjogYSBDKysgY29tcGlsZXIgd2lsbCBpbnNpc3Qgb24gdmFsaWQgcHJvdG90eXBlcyAqLwordHlwZWRlZiB2b2lkICogdm9pZF9wdHI7CS8qIGNoZWNrIHZvaWQgKiAqLworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwkJLyogY2hlY2sgcHRyIHRvIGZ1bmN0aW9uIHJldHVybmluZyB2b2lkICovCit0eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpIChpbnQgYSwgaW50IGIpOworI2Vsc2UKK3R5cGVkZWYgdm9pZCAoKnZvaWRfZnVuYykgKCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwkJLyogY2hlY2sgdm9pZCBmdW5jdGlvbiByZXN1bHQgKi8KK3ZvaWQgdGVzdDNmdW5jdGlvbiAodm9pZF9wdHIgYXJnMSwgdm9pZF9mdW5jIGFyZzIpCisjZWxzZQordm9pZCB0ZXN0M2Z1bmN0aW9uIChhcmcxLCBhcmcyKQorICAgICB2b2lkX3B0ciBhcmcxOworICAgICB2b2lkX2Z1bmMgYXJnMjsKKyNlbmRpZgoreworICBjaGFyICogbG9jcHRyID0gKGNoYXIgKikgYXJnMTsgLyogY2hlY2sgY2FzdGluZyB0byBhbmQgZnJvbSB2b2lkICogKi8KKyAgYXJnMSA9ICh2b2lkICopIGxvY3B0cjsKKyAgKCphcmcyKSAoMSwgMik7CQkvKiBjaGVjayBjYWxsIG9mIGZjbiByZXR1cm5pbmcgdm9pZCAqLworfQorCitpbnQgbWFpbigpIHsKKyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDcyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSB2b2lkIGNoYXIKK0VPRgorCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDg4OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwOTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE0MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdCAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTYzOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lqZ19jdl9pbmxpbmU9IiIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExNjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gX19pbmxpbmVfXyBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQoraW50IGJhcigpIHsgcmV0dXJuIGZvbygpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfY3ZfaW5saW5lPSJfX2lubGluZV9fIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTgyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Cit9IF9faW5saW5lIGludCBmb28oKSB7IHJldHVybiAwOyB9CitpbnQgYmFyKCkgeyByZXR1cm4gZm9vKCk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE5MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19jdl9pbmxpbmU9Il9faW5saW5lIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTk4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Cit9IGlubGluZSBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQoraW50IGJhcigpIHsgcmV0dXJuIGZvbygpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfY3ZfaW5saW5lPSJpbmxpbmUiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWNobyAiJGFjX3QiIiRpamdfY3ZfaW5saW5lIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBJTkxJTkUgJGlqZ19jdl9pbmxpbmUKK0VPRgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYnJva2VuIGluY29tcGxldGUgdHlwZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyMjQ6IGNoZWNraW5nIGZvciBicm9rZW4gaW5jb21wbGV0ZSB0eXBlcyIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyB0eXBlZGVmIHN0cnVjdCB1bmRlZmluZWRfc3RydWN0dXJlICogdW5kZWZfc3RydWN0X3B0cjsgCitpbnQgbWFpbigpIHsKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMzM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIib2siIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiImJyb2tlbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOIAorRU9GCisKK2ZpCitybSAtZiBjb25mdGVzdCoKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaG9ydCBleHRlcm5hbCBuYW1lcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI0ODogY2hlY2tpbmcgZm9yIHNob3J0IGV4dGVybmFsIG5hbWVzIiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyNTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgcG9zc2libHlfZHVwbGljYXRlX2Z1bmN0aW9uICgpIHsgcmV0dXJuIDA7IH0KK2ludCBwb3NzaWJseV9kdXBsaV9mdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9CisKK2ludCBtYWluKCkgeworIAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJvayIgMT4mNgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIic2hvcnQiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTIAorRU9GCisKK2ZpCitybSAtZiBjb25mdGVzdCoKK2VjaG8gJGFjX24gImNoZWNraW5nIHRvIHNlZSBpZiBjaGFyIGlzIHNpZ25lZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI3NTogY2hlY2tpbmcgdG8gc2VlIGlmIGNoYXIgaXMgc2lnbmVkIiA+JjUKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGVjaG8gQXNzdW1pbmcgdGhhdCBjaGFyIGlzIHNpZ25lZCBvbiB0YXJnZXQgbWFjaGluZS4KK2VjaG8gSWYgaXQgaXMgdW5zaWduZWQsIHRoaXMgd2lsbCBiZSBhIGxpdHRsZSBiaXQgaW5lZmZpY2llbnQuCisKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCBpc19jaGFyX3NpZ25lZCAoaW50IGFyZykKKyNlbHNlCitpbnQgaXNfY2hhcl9zaWduZWQgKGFyZykKKyAgICAgaW50IGFyZzsKKyNlbmRpZgoreworICBpZiAoYXJnID09IDE4OSkgewkJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciB1bnNpZ25lZCBjaGFyICovCisgICAgcmV0dXJuIDA7CQkJLyogdHlwZSBjaGFyIGlzIHVuc2lnbmVkICovCisgIH0KKyAgZWxzZSBpZiAoYXJnICE9IC02NykgewkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHNpZ25lZCBjaGFyICovCisgICAgcHJpbnRmKCJIbW0sIGl0IHNlZW1zICdjaGFyJyBpcyBub3QgZWlnaHQgYml0cyB3aWRlIG9uIHlvdXIgbWFjaGluZS5cbiIpOworICAgIHByaW50ZigiSSBmZWFyIHRoZSBKUEVHIHNvZnR3YXJlIHdpbGwgbm90IHdvcmsgYXQgYWxsLlxuXG4iKTsKKyAgfQorICByZXR1cm4gMTsJCQkvKiBhc3N1bWUgY2hhciBpcyBzaWduZWQgb3RoZXJ3aXNlICovCit9CitjaGFyIHNpZ25lZF9jaGFyX2NoZWNrID0gKGNoYXIpICgtNjcpOworbWFpbigpIHsKKyAgZXhpdChpc19jaGFyX3NpZ25lZCgoaW50KSBzaWduZWRfY2hhcl9jaGVjaykpOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ0hBUl9JU19VTlNJR05FRCAKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB0byBzZWUgaWYgcmlnaHQgc2hpZnQgaXMgc2lnbmVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzIzOiBjaGVja2luZyB0byBzZWUgaWYgcmlnaHQgc2hpZnQgaXMgc2lnbmVkIiA+JjUKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGVjaG8gIiRhY190IiJBc3N1bWluZyB0aGF0IHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCBvbiB0YXJnZXQgbWFjaGluZS4iIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTMyOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCBpc19zaGlmdGluZ19zaWduZWQgKGxvbmcgYXJnKQorI2Vsc2UKK2ludCBpc19zaGlmdGluZ19zaWduZWQgKGFyZykKKyAgICAgbG9uZyBhcmc7CisjZW5kaWYKKy8qIFNlZSB3aGV0aGVyIHJpZ2h0LXNoaWZ0IG9uIGEgbG9uZyBpcyBzaWduZWQgb3Igbm90LiAqLworeworICBsb25nIHJlcyA9IGFyZyA+PiA0OworCisgIGlmIChyZXMgPT0gLTB4N0Y3RTgwQ0wpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgc2hpZnQgKi8KKyAgICByZXR1cm4gMTsJCQkvKiByaWdodCBzaGlmdCBpcyBzaWduZWQgKi8KKyAgfQorICAvKiBzZWUgaWYgdW5zaWduZWQtc2hpZnQgaGFjayB3aWxsIGZpeCBpdC4gKi8KKyAgLyogd2UgY2FuJ3QganVzdCB0ZXN0IGV4YWN0IHZhbHVlIHNpbmNlIGl0IGRlcGVuZHMgb24gd2lkdGggb2YgbG9uZy4uLiAqLworICByZXMgfD0gKH4wTCkgPDwgKDMyLTQpOworICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBub3c/ICovCisgICAgcmV0dXJuIDA7CQkJLyogcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgKi8KKyAgfQorICBwcmludGYoIlJpZ2h0IHNoaWZ0IGlzbid0IGFjdGluZyBhcyBJIGV4cGVjdCBpdCB0by5cbiIpOworICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7CisgIHJldHVybiAwOwkJCS8qIHRyeSBpdCB3aXRoIHVuc2lnbmVkIGFueXdheSAqLworfQorbWFpbigpIHsKKyAgZXhpdChpc19zaGlmdGluZ19zaWduZWQoLTB4N0Y3RTgwQjFMKSk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBSSUdIVF9TSElGVF9JU19VTlNJR05FRCAKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB0byBzZWUgaWYgZm9wZW4gYWNjZXB0cyBiIHNwZWMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzNzU6IGNoZWNraW5nIHRvIHNlZSBpZiBmb3BlbiBhY2NlcHRzIGIgc3BlYyIgPiY1CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBlY2hvICIkYWNfdCIiQXNzdW1pbmcgdGhhdCBpdCBkb2VzLiIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzgwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CittYWluKCkgeworICBpZiAoZm9wZW4oImNvbmZ0ZXN0ZGF0YSIsICJ3YiIpICE9IE5VTEwpCisgICAgZXhpdCgwKTsKKyAgZXhpdCgxKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRE9OVF9VU0VfQl9NT0RFIAorRU9GCisKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQzNjogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBpbnN0YWxsYnNkIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICAjIE9TRi8xIGluc3RhbGxic2QgYWxzbyB1c2VzIGRzcG1zZywgYnV0IGlzIHVzYWJsZS4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0ODg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKyMgRGVjaWRlIHdoZXRoZXIgdG8gdXNlIGxpYnRvb2wsCisjIGFuZCBpZiBzbyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCwgc3RhdGljLCBvciBib3RoIGZsYXZvcnMgb2YgbGlicmFyeS4KK0xUU0hBUkVEPSJubyIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKKyAgTFRTSEFSRUQ9IiRlbmFibGV2YWwiCitmaQorCitMVFNUQVRJQz0ibm8iCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCisgIExUU1RBVElDPSIkZW5hYmxldmFsIgorZmkKKworaWYgdGVzdCAieCRMVFNIQVJFRCIgIT0geG5vICAtbyAgIngkTFRTVEFUSUMiICE9IHhubzsgdGhlbgorICBVU0VMSUJUT09MPSJ5ZXMiCisgIExJQlRPT0w9Ii4vbGlidG9vbCIKKyAgTz0ibG8iCisgIEE9ImxhIgorICBMTj0nJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDKScKKyAgSU5TVEFMTF9MSUI9JyQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJHtJTlNUQUxMfScKKyAgSU5TVEFMTF9QUk9HUkFNPSJcJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkSU5TVEFMTF9QUk9HUkFNIgorZWxzZQorICBVU0VMSUJUT09MPSJubyIKKyAgTElCVE9PTD0iIgorICBPPSJvIgorICBBPSJhIgorICBMTj0nJChDQyknCisgIElOU1RBTExfTElCPSIkSU5TVEFMTF9EQVRBIgorZmkKKworCisKKworCisKKyMgQ29uZmlndXJlIGxpYnRvb2wgaWYgbmVlZGVkLgoraWYgdGVzdCAkVVNFTElCVE9PTCA9IHllczsgdGhlbgorICBkaXNhYmxlX3NoYXJlZD0KKyAgZGlzYWJsZV9zdGF0aWM9CisgIGlmIHRlc3QgIngkTFRTSEFSRUQiID0geG5vOyB0aGVuCisgICAgZGlzYWJsZV9zaGFyZWQ9Ii0tZGlzYWJsZS1zaGFyZWQiCisgIGZpCisgIGlmIHRlc3QgIngkTFRTVEFUSUMiID0geG5vOyB0aGVuCisgICAgZGlzYWJsZV9zdGF0aWM9Ii0tZGlzYWJsZS1zdGF0aWMiCisgIGZpCisgICRzcmNkaXIvbHRjb25maWcgJGRpc2FibGVfc2hhcmVkICRkaXNhYmxlX3N0YXRpYyAkc3JjZGlyL2x0bWFpbi5zaAorZmkKKworIyBTZWxlY3QgbWVtb3J5IG1hbmFnZXIgZGVwZW5kaW5nIG9uIHVzZXIgaW5wdXQuCisjIElmIG5vICItZW5hYmxlLW1heG1lbSIsIHVzZSBqbWVtbm9icworTUVNT1JZTUdSPSdqbWVtbm9icy4kKE8pJworTUFYTUVNPSJubyIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYXhtZW0gb3IgLS1kaXNhYmxlLW1heG1lbSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tYXhtZW0rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX21heG1lbSIKKyAgTUFYTUVNPSIkZW5hYmxldmFsIgorZmkKKworIyBzdXBwb3J0IC0td2l0aC1tYXhtZW0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggSUpHIFY1LgorIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tYXhtZW0gb3IgLS13aXRob3V0LW1heG1lbSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbWF4bWVtK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX21heG1lbSIKKyAgTUFYTUVNPSIkd2l0aHZhbCIKK2ZpCisKK2lmIHRlc3QgIngkTUFYTUVNIiA9IHh5ZXM7IHRoZW4KKyAgTUFYTUVNPTEKK2ZpCitpZiB0ZXN0ICJ4JE1BWE1FTSIgIT0geG5vOyB0aGVuCisgIGlmIHRlc3QgLW4gImBlY2hvICRNQVhNRU0gfCBzZWQgJ3MvWzAtOV0vL2cnYCI7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vbi1udW1lcmljIGFyZ3VtZW50IHRvIC0tZW5hYmxlLW1heG1lbSIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCisgIERFRkFVTFRNQVhNRU09YGV4cHIgJE1BWE1FTSBcKiAxMDQ4NTc2YAorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgREVGQVVMVF9NQVhfTUVNICR7REVGQVVMVE1BWE1FTX0KK0VPRgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJ3RtcGZpbGUoKSciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE1OTY6IGNoZWNraW5nIGZvciAndG1wZmlsZSgpJyIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNTk4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG1haW4oKSB7CisgRklMRSAqIHRmaWxlID0gdG1wZmlsZSgpOyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjA1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitNRU1PUllNR1I9J2ptZW1hbnNpLiQoTyknCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorTUVNT1JZTUdSPSdqbWVtbmFtZS4kKE8pJworY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIgCitFT0YKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICdta3RlbXAoKSciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2MjA6IGNoZWNraW5nIGZvciAnbWt0ZW1wKCknIiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE2MjIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKyBjaGFyIGZuYW1lWzgwXTsgbWt0ZW1wKGZuYW1lKTsgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYyOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBOT19NS1RFTVAgCitFT0YKKworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworCisjIEV4dHJhY3QgdGhlIGxpYnJhcnkgdmVyc2lvbiBJRCBmcm9tIGpwZWdsaWIuaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGxpYmpwZWcgdmVyc2lvbiBudW1iZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NTA6IGNoZWNraW5nIGxpYmpwZWcgdmVyc2lvbiBudW1iZXIiID4mNQorSlBFR19MSUJfVkVSU0lPTj1gc2VkIC1lICcvXiNkZWZpbmUgSlBFR19MSUJfVkVSU0lPTi8hZCcgLWUgJ3MvXlteMC05XSpcKFswLTldWzAtOV0qXCkuKiQvXDEvJyAkc3JjZGlyL2pwZWdsaWIuaGAKK2VjaG8gIiRhY190IiIkSlBFR19MSUJfVkVSU0lPTiIgMT4mNgorCisKKyMgUHJlcGFyZSB0byBtYXNzYWdlIG1ha2VmaWxlLmNmZyBjb3JyZWN0bHkuCitpZiB0ZXN0ICRpamdfY3ZfaGF2ZV9wcm90b3R5cGVzID0geWVzOyB0aGVuCisgIEEyS19ERVBTPSIiCisgIENPTV9BMks9IiMgIgorZWxzZQorICBBMktfREVQUz0iYW5zaTJrbnIiCisgIENPTV9BMks9IiIKK2ZpCisKKworIyBhbnNpMmtuciBuZWVkcyAtREJTRCBpZiBzdHJpbmcuaCBpcyBtaXNzaW5nCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RyaW5nX2ggPSBubzsgdGhlbgorICBBTlNJMktOUkZMQUdTPSItREJTRCIKK2Vsc2UKKyAgQU5TSTJLTlJGTEFHUz0iIgorZmkKKworIyBTdWJzdGl0dXRpb25zIHRvIGVuYWJsZSBvciBkaXNhYmxlIGxpYnRvb2wtcmVsYXRlZCBzdHVmZgoraWYgdGVzdCAkVVNFTElCVE9PTCA9IHllcyAtYSAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgorICBDT01fTFQ9IiIKK2Vsc2UKKyAgQ09NX0xUPSIjICIKK2ZpCisKK2lmIHRlc3QgIngkTFRTSEFSRUQiICE9IHhubzsgdGhlbgorICBGT1JDRV9JTlNUQUxMX0xJQj0iaW5zdGFsbC1saWIiCitlbHNlCisgIEZPUkNFX0lOU1RBTExfTElCPSIiCitmaQorCisjIFNldCB1cCAtSSBkaXJlY3RpdmVzCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBJTkNMVURFRkxBR1M9Jy1JJChzcmNkaXIpJworZWxzZQorICBJTkNMVURFRkxBR1M9Jy1JLiAtSSQoc3JjZGlyKScKK2ZpCisKK3RyYXAgJycgMSAyIDE1CisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMiIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKK2FjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlOm1ha2VmaWxlLmNmZyBqY29uZmlnLmg6amNvbmZpZy5jZmciIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQENDQCUkQ0MlZworcyVAQ1BQQCUkQ1BQJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworcyVAUkFOTElCQCUkUkFOTElCJWcKK3MlQExJQlRPT0xAJSRMSUJUT09MJWcKK3MlQE9AJSRPJWcKK3MlQEFAJSRBJWcKK3MlQExOQCUkTE4lZworcyVASU5TVEFMTF9MSUJAJSRJTlNUQUxMX0xJQiVnCitzJUBNRU1PUllNR1JAJSRNRU1PUllNR1IlZworcyVASlBFR19MSUJfVkVSU0lPTkAlJEpQRUdfTElCX1ZFUlNJT04lZworcyVAQTJLX0RFUFNAJSRBMktfREVQUyVnCitzJUBDT01fQTJLQCUkQ09NX0EySyVnCitzJUBBTlNJMktOUkZMQUdTQCUkQU5TSTJLTlJGTEFHUyVnCitzJUBDT01fTFRAJSRDT01fTFQlZworcyVARk9SQ0VfSU5TVEFMTF9MSUJAJSRGT1JDRV9JTlNUQUxMX0xJQiVnCitzJUBJTkNMVURFRkxBR1NAJSRJTkNMVURFRkxBR1MlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGU6bWFrZWZpbGUuY2ZnIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKK2FjX2RDPSdcMycKK2FjX2REPSclZycKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nXDQlZycKKyMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX2VCPSckJVwxI1wyZGVmaW5lXDMnCithY19lQz0nICcKK2FjX2VEPSclZycKKworaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisgIENPTkZJR19IRUFERVJTPSJqY29uZmlnLmg6amNvbmZpZy5jZmciCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCisKK0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6CisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QudmFscworY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorcy9bXFwmJV0vXFwmL2cKK3MlW1xcJGBdJVxcJiVnCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorcyVhY19kJWFjX3UlZ3AKK3MlYWNfdSVhY19lJWdwCitFT0YKK3NlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKK3JtIC1mIGNvbmZ0ZXN0LmhkcgorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvaW5zdGFsbC1zaCBiL2NvbW1vbi9qcGVnL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTg0MzY2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2luc3RhbGwtc2gKQEAgLTAsMCArMSwyNTAgQEAKKyMhL2Jpbi9zaAorIworIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKyMgVGhpcyBjb21lcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLgorIworIyBDb3B5cmlnaHQgMTk5MSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisjIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyMgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisjIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyMgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisjIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorIworIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAorIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAorIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgorIworIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCisjIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCisjIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgorCisKKyMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAorCisjIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCitkb2l0PSIke0RPSVRQUk9HLX0iCisKKworIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCisKK212cHJvZz0iJHtNVlBST0ctbXZ9IgorY3Bwcm9nPSIke0NQUFJPRy1jcH0iCitjaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKK2Nob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgorY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCitzdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKK3JtcHJvZz0iJHtSTVBST0ctcm19IgorbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCisKK3RyYW5zZm9ybWJhc2VuYW1lPSIiCit0cmFuc2Zvcm1fYXJnPSIiCitpbnN0Y21kPSIkbXZwcm9nIgorY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKK2Nob3duY21kPSIiCitjaGdycGNtZD0iIgorc3RyaXBjbWQ9IiIKK3JtY21kPSIkcm1wcm9nIC1mIgorbXZjbWQ9IiRtdnByb2ciCitzcmM9IiIKK2RzdD0iIgorZGlyX2FyZz0iIgorCit3aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KKyAgICBjYXNlICQxIGluCisJLWMpIGluc3RjbWQ9IiRjcHByb2ciCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1kKSBkaXJfYXJnPXRydWUKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktdD0qKSB0cmFuc2Zvcm1hcmc9YGVjaG8gJDEgfCBzZWQgJ3MvLXQ9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktYj0qKSB0cmFuc2Zvcm1iYXNlbmFtZT1gZWNobyAkMSB8IHNlZCAncy8tYj0vLydgCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCSopICBpZiBbIHgiJHNyYyIgPSB4IF0KKwkgICAgdGhlbgorCQlzcmM9JDEKKwkgICAgZWxzZQorCQkjIHRoaXMgY29sb24gaXMgdG8gd29yayBhcm91bmQgYSAzODZCU0QgL2Jpbi9zaCBidWcKKwkJOgorCQlkc3Q9JDEKKwkgICAgZmkKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworICAgIGVzYWMKK2RvbmUKKworaWYgWyB4IiRzcmMiID0geCBdCit0aGVuCisJZWNobyAiaW5zdGFsbDoJbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiCisJZXhpdCAxCitlbHNlCisJdHJ1ZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF07IHRoZW4KKwlkc3Q9JHNyYworCXNyYz0iIgorCQorCWlmIFsgLWQgJGRzdCBdOyB0aGVuCisJCWluc3RjbWQ9OgorCWVsc2UKKwkJaW5zdGNtZD1ta2RpcgorCWZpCitlbHNlCisKKyMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAorIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZCAKKyMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorCisJaWYgWyAtZiAkc3JjIC1vIC1kICRzcmMgXQorCXRoZW4KKwkJdHJ1ZQorCWVsc2UKKwkJZWNobyAiaW5zdGFsbDogICRzcmMgZG9lcyBub3QgZXhpc3QiCisJCWV4aXQgMQorCWZpCisJCisJaWYgWyB4IiRkc3QiID0geCBdCisJdGhlbgorCQllY2hvICJpbnN0YWxsOglubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCisJCWV4aXQgMQorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCisjIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKKworCWlmIFsgLWQgJGRzdCBdCisJdGhlbgorCQlkc3Q9IiRkc3QiL2BiYXNlbmFtZSAkc3JjYAorCWVsc2UKKwkJdHJ1ZQorCWZpCitmaQorCisjIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKK2RzdGRpcj1gZWNobyAkZHN0IHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKKworIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KKyMgIHRoaXMgcGFydCBpcyB0YWtlbiBmcm9tIE5vYWggRnJpZWRtYW4ncyBta2luc3RhbGxkaXJzIHNjcmlwdAorCisjIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgoraWYgWyAhIC1kICIkZHN0ZGlyIiBdOyB0aGVuCitkZWZhdWx0SUZTPScJCisnCitJRlM9IiR7SUZTLSR7ZGVmYXVsdElGU319IgorCitvSUZTPSIke0lGU30iCisjIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgorSUZTPSclJworc2V0IC0gYGVjaG8gJHtkc3RkaXJ9IHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCitJRlM9IiR7b0lGU30iCisKK3BhdGhjb21wPScnCisKK3doaWxlIFsgJCMgLW5lIDAgXSA7IGRvCisJcGF0aGNvbXA9IiR7cGF0aGNvbXB9JHsxfSIKKwlzaGlmdAorCisJaWYgWyAhIC1kICIke3BhdGhjb21wfSIgXSA7CisgICAgICAgIHRoZW4KKwkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCisJZWxzZQorCQl0cnVlCisJZmkKKworCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCitkb25lCitmaQorCitpZiBbIHgiJGRpcl9hcmciICE9IHggXQordGhlbgorCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKK2Vsc2UKKworIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCisKKwlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdCAkdHJhbnNmb3JtYmFzZW5hbWUgfCAKKwkJCXNlZCAkdHJhbnNmb3JtYXJnYCR0cmFuc2Zvcm1iYXNlbmFtZQorCWZpCisKKyMgZG9uJ3QgYWxsb3cgdGhlIHNlZCBjb21tYW5kIHRvIGNvbXBsZXRlbHkgZWxpbWluYXRlIHRoZSBmaWxlbmFtZQorCisJaWYgWyB4IiRkc3RmaWxlIiA9IHggXSAKKwl0aGVuCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCisJZWxzZQorCQl0cnVlCisJZmkKKworIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCisKKwlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKKworIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCisKKwkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKKworCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgorCisjIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKKworIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCisjIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgorCisJaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKworIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCisJJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKKwkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlIAorCitmaSAmJgorCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamNhcGltaW4uYyBiL2NvbW1vbi9qcGVnL2pjYXBpbWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmYjhjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pjYXBpbWluLmMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBqY2FwaW1pbi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBjb21wcmVzc2lvbiBoYWxmCisgKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAibWluaW11bSIgQVBJIHJvdXRpbmVzIHRoYXQgbWF5IGJlCisgKiBuZWVkZWQgaW4gZWl0aGVyIHRoZSBub3JtYWwgZnVsbC1jb21wcmVzc2lvbiBjYXNlIG9yIHRoZSB0cmFuc2NvZGluZy1vbmx5CisgKiBjYXNlLgorICoKKyAqIE1vc3Qgb2YgdGhlIHJvdXRpbmVzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbgorICogYXJlIGluIHRoaXMgZmlsZSBvciBpbiBqY2FwaXN0ZC5jLiAgQnV0IGFsc28gc2VlIGpjcGFyYW0uYyBmb3IKKyAqIHBhcmFtZXRlci1zZXR1cCBoZWxwZXIgcm91dGluZXMsIGpjb21hcGkuYyBmb3Igcm91dGluZXMgc2hhcmVkIGJ5CisgKiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiwgYW5kIGpjdHJhbnMuYyBmb3IgdGhlIHRyYW5zY29kaW5nIGNhc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBvZiBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LgorICogVGhlIGVycm9yIG1hbmFnZXIgbXVzdCBhbHJlYWR5IGJlIHNldCB1cCAoaW4gY2FzZSBtZW1vcnkgbWFuYWdlciBmYWlscykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX0NyZWF0ZUNvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKQoreworICBpbnQgaTsKKworICAvKiBHdWFyZCBhZ2FpbnN0IHZlcnNpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGxpYnJhcnkgYW5kIGNhbGxlci4gKi8KKyAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBzbyBqcGVnX2Rlc3Ryb3kga25vd3MgbWVtIG1nciBub3QgY2FsbGVkICovCisgIGlmICh2ZXJzaW9uICE9IEpQRUdfTElCX1ZFUlNJT04pCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX0xJQl9WRVJTSU9OLCBKUEVHX0xJQl9WRVJTSU9OLCB2ZXJzaW9uKTsKKyAgaWYgKHN0cnVjdHNpemUgIT0gU0laRU9GKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCkpCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX1NUUlVDVF9TSVpFLCAKKwkgICAgIChpbnQpIFNJWkVPRihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpLCAoaW50KSBzdHJ1Y3RzaXplKTsKKworICAvKiBGb3IgZGVidWdnaW5nIHB1cnBvc2VzLCB3ZSB6ZXJvIHRoZSB3aG9sZSBtYXN0ZXIgc3RydWN0dXJlLgorICAgKiBCdXQgdGhlIGFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IHNldCB0aGUgZXJyIHBvaW50ZXIsIGFuZCBtYXkgaGF2ZSBzZXQKKyAgICogY2xpZW50X2RhdGEsIHNvIHdlIGhhdmUgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aG9zZSBmaWVsZHMuCisgICAqIE5vdGU6IGlmIGFwcGxpY2F0aW9uIGhhc24ndCBzZXQgY2xpZW50X2RhdGEsIHRvb2xzIGxpa2UgUHVyaWZ5IG1heQorICAgKiBjb21wbGFpbiBoZXJlLgorICAgKi8KKyAgeworICAgIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVyciA9IGNpbmZvLT5lcnI7CisgICAgdm9pZCAqIGNsaWVudF9kYXRhID0gY2luZm8tPmNsaWVudF9kYXRhOyAvKiBpZ25vcmUgUHVyaWZ5IGNvbXBsYWludCBoZXJlICovCisgICAgTUVNWkVSTyhjaW5mbywgU0laRU9GKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCkpOworICAgIGNpbmZvLT5lcnIgPSBlcnI7CisgICAgY2luZm8tPmNsaWVudF9kYXRhID0gY2xpZW50X2RhdGE7CisgIH0KKyAgY2luZm8tPmlzX2RlY29tcHJlc3NvciA9IEZBTFNFOworCisgIC8qIEluaXRpYWxpemUgYSBtZW1vcnkgbWFuYWdlciBpbnN0YW5jZSBmb3IgdGhpcyBvYmplY3QgKi8KKyAgamluaXRfbWVtb3J5X21ncigoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogWmVybyBvdXQgcG9pbnRlcnMgdG8gcGVybWFuZW50IHN0cnVjdHVyZXMuICovCisgIGNpbmZvLT5wcm9ncmVzcyA9IE5VTEw7CisgIGNpbmZvLT5kZXN0ID0gTlVMTDsKKworICBjaW5mby0+Y29tcF9pbmZvID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1FVQU5UX1RCTFM7IGkrKykKKyAgICBjaW5mby0+cXVhbnRfdGJsX3B0cnNbaV0gPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKKyAgICBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7CisgICAgY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaV0gPSBOVUxMOworICB9CisKKyAgY2luZm8tPnNjcmlwdF9zcGFjZSA9IE5VTEw7CisKKyAgY2luZm8tPmlucHV0X2dhbW1hID0gMS4wOwkvKiBpbiBjYXNlIGFwcGxpY2F0aW9uIGZvcmdldHMgKi8KKworICAvKiBPSywgSSdtIHJlYWR5ICovCisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBDU1RBVEVfU1RBUlQ7Cit9CisKKworLyoKKyAqIERlc3RydWN0aW9uIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QKKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZGVzdHJveV9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGpwZWdfZGVzdHJveSgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHVzZSBjb21tb24gcm91dGluZSAqLworfQorCisKKy8qCisgKiBBYm9ydCBwcm9jZXNzaW5nIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvcGVyYXRpb24sCisgKiBidXQgZG9uJ3QgZGVzdHJveSB0aGUgb2JqZWN0IGl0c2VsZi4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfYWJvcnRfY29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCit9CisKKworLyoKKyAqIEZvcmNpYmx5IHN1cHByZXNzIG9yIHVuLXN1cHByZXNzIGFsbCBxdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGVzLgorICogTWFya3MgYWxsIGN1cnJlbnRseSBkZWZpbmVkIHRhYmxlcyBhcyBhbHJlYWR5IHdyaXR0ZW4gKGlmIHN1cHByZXNzKQorICogb3Igbm90IHdyaXR0ZW4gKGlmICFzdXBwcmVzcykuICBUaGlzIHdpbGwgY29udHJvbCB3aGV0aGVyIHRoZXkgZ2V0IGVtaXR0ZWQKKyAqIGJ5IGEgc3Vic2VxdWVudCBqcGVnX3N0YXJ0X2NvbXByZXNzIGNhbGwuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGV4cG9ydGVkIGZvciB1c2UgYnkgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byBwcm9kdWNlCisgKiBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zLiAgSXQgbG9naWNhbGx5IGJlbG9uZ3MgaW4gamNwYXJhbS5jLCBidXQKKyAqIHNpbmNlIGl0IGlzIGNhbGxlZCBieSBqcGVnX3N0YXJ0X2NvbXByZXNzLCB3ZSBwdXQgaXQgaGVyZSAtLS0gb3RoZXJ3aXNlCisgKiBqY3BhcmFtLm8gd291bGQgYmUgbGlua2VkIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIHVzZWQgaXQgb3Igbm90LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19zdXBwcmVzc190YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIHN1cHByZXNzKQoreworICBpbnQgaTsKKyAgSlFVQU5UX1RCTCAqIHF0Ymw7CisgIEpIVUZGX1RCTCAqIGh0Ymw7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKKyAgICBpZiAoKHF0YmwgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbaV0pICE9IE5VTEwpCisgICAgICBxdGJsLT5zZW50X3RhYmxlID0gc3VwcHJlc3M7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgaWYgKChodGJsID0gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0pICE9IE5VTEwpCisgICAgICBodGJsLT5zZW50X3RhYmxlID0gc3VwcHJlc3M7CisgICAgaWYgKChodGJsID0gY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaV0pICE9IE5VTEwpCisgICAgICBodGJsLT5zZW50X3RhYmxlID0gc3VwcHJlc3M7CisgIH0KK30KKworCisvKgorICogRmluaXNoIEpQRUcgY29tcHJlc3Npb24uCisgKgorICogSWYgYSBtdWx0aXBhc3Mgb3BlcmF0aW5nIG1vZGUgd2FzIHNlbGVjdGVkLCB0aGlzIG1heSBkbyBhIGdyZWF0IGRlYWwgb2YKKyAqIHdvcmsgaW5jbHVkaW5nIG1vc3Qgb2YgdGhlIGFjdHVhbCBvdXRwdXQuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZpbmlzaF9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIEpESU1FTlNJT04gaU1DVV9yb3c7CisKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gQ1NUQVRFX1NDQU5OSU5HIHx8CisgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IENTVEFURV9SQVdfT0spIHsKKyAgICAvKiBUZXJtaW5hdGUgZmlyc3QgcGFzcyAqLworICAgIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSA8IGNpbmZvLT5pbWFnZV9oZWlnaHQpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RPT19MSVRUTEVfREFUQSk7CisgICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfcGFzcykgKGNpbmZvKTsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9XUkNPRUZTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIFBlcmZvcm0gYW55IHJlbWFpbmluZyBwYXNzZXMgKi8KKyAgd2hpbGUgKCEgY2luZm8tPm1hc3Rlci0+aXNfbGFzdF9wYXNzKSB7CisgICAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9wYXNzKSAoY2luZm8pOworICAgIGZvciAoaU1DVV9yb3cgPSAwOyBpTUNVX3JvdyA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7IGlNQ1Vfcm93KyspIHsKKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworCWNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGlNQ1Vfcm93OworCWNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOworCSgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgfQorICAgICAgLyogV2UgYnlwYXNzIHRoZSBtYWluIGNvbnRyb2xsZXIgYW5kIGludm9rZSBjb2VmIGNvbnRyb2xsZXIgZGlyZWN0bHk7CisgICAgICAgKiBhbGwgd29yayBpcyBiZWluZyBkb25lIGZyb20gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlci4KKyAgICAgICAqLworICAgICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCAoSlNBTVBJTUFHRSkgTlVMTCkpCisJRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOworICAgIH0KKyAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9wYXNzKSAoY2luZm8pOworICB9CisgIC8qIFdyaXRlIEVPSSwgZG8gZmluYWwgY2xlYW51cCAqLworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZpbGVfdHJhaWxlcikgKGNpbmZvKTsKKyAgKCpjaW5mby0+ZGVzdC0+dGVybV9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyogV2UgY2FuIHVzZSBqcGVnX2Fib3J0IHRvIHJlbGVhc2UgbWVtb3J5IGFuZCByZXNldCBnbG9iYWxfc3RhdGUgKi8KKyAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7Cit9CisKKworLyoKKyAqIFdyaXRlIGEgc3BlY2lhbCBtYXJrZXIuCisgKiBUaGlzIGlzIG9ubHkgcmVjb21tZW5kZWQgZm9yIHdyaXRpbmcgQ09NIG9yIEFQUG4gbWFya2Vycy4KKyAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBhbmQgYmVmb3JlCisgKiBmaXJzdCBjYWxsIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgb3IganBlZ193cml0ZV9yYXdfZGF0YSgpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ193cml0ZV9tYXJrZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLAorCQkgICBjb25zdCBKT0NURVQgKmRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworICBKTUVUSE9EKHZvaWQsIHdyaXRlX21hcmtlcl9ieXRlLCAoal9jb21wcmVzc19wdHIgaW5mbywgaW50IHZhbCkpOworCisgIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSAhPSAwIHx8CisgICAgICAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU0NBTk5JTkcgJiYKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9SQVdfT0sgJiYKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9XUkNPRUZTKSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2hlYWRlcikgKGNpbmZvLCBtYXJrZXIsIGRhdGFsZW4pOworICB3cml0ZV9tYXJrZXJfYnl0ZSA9IGNpbmZvLT5tYXJrZXItPndyaXRlX21hcmtlcl9ieXRlOwkvKiBjb3B5IGZvciBzcGVlZCAqLworICB3aGlsZSAoZGF0YWxlbi0tKSB7CisgICAgKCp3cml0ZV9tYXJrZXJfYnl0ZSkgKGNpbmZvLCAqZGF0YXB0cik7CisgICAgZGF0YXB0cisrOworICB9Cit9CisKKy8qIFNhbWUsIGJ1dCBwaWVjZW1lYWwuICovCisKK0dMT0JBTCh2b2lkKQoranBlZ193cml0ZV9tX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgIT0gMCB8fAorICAgICAgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NDQU5OSU5HICYmCisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfUkFXX09LICYmCisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfV1JDT0VGUykpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX21hcmtlcl9oZWFkZXIpIChjaW5mbywgbWFya2VyLCBkYXRhbGVuKTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX21fYnl0ZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpCit7CisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2J5dGUpIChjaW5mbywgdmFsKTsKK30KKworCisvKgorICogQWx0ZXJuYXRlIGNvbXByZXNzaW9uIGZ1bmN0aW9uOiBqdXN0IHdyaXRlIGFuIGFiYnJldmlhdGVkIHRhYmxlIGZpbGUuCisgKiBCZWZvcmUgY2FsbGluZyB0aGlzLCBhbGwgcGFyYW1ldGVycyBhbmQgYSBkYXRhIGRlc3RpbmF0aW9uIG11c3QgYmUgc2V0IHVwLgorICoKKyAqIFRvIHByb2R1Y2UgYSBwYWlyIG9mIGZpbGVzIGNvbnRhaW5pbmcgYWJicmV2aWF0ZWQgdGFibGVzIGFuZCBhYmJyZXZpYXRlZAorICogaW1hZ2UgZGF0YSwgb25lIHdvdWxkIHByb2NlZWQgYXMgZm9sbG93czoKKyAqCisgKgkJaW5pdGlhbGl6ZSBKUEVHIG9iamVjdAorICoJCXNldCBKUEVHIHBhcmFtZXRlcnMKKyAqCQlzZXQgZGVzdGluYXRpb24gdG8gdGFibGUgZmlsZQorICoJCWpwZWdfd3JpdGVfdGFibGVzKGNpbmZvKTsKKyAqCQlzZXQgZGVzdGluYXRpb24gdG8gaW1hZ2UgZmlsZQorICoJCWpwZWdfc3RhcnRfY29tcHJlc3MoY2luZm8sIEZBTFNFKTsKKyAqCQl3cml0ZSBkYXRhLi4uCisgKgkJanBlZ19maW5pc2hfY29tcHJlc3MoY2luZm8pOworICoKKyAqIGpwZWdfd3JpdGVfdGFibGVzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgbWFya2luZyBhbGwgdGFibGVzIHdyaXR0ZW4KKyAqIChzYW1lIGFzIGpwZWdfc3VwcHJlc3NfdGFibGVzKC4uLiwgVFJVRSkpLiAgVGh1cyBhIHN1YnNlcXVlbnQgc3RhcnRfY29tcHJlc3MKKyAqIHdpbGwgbm90IHJlLWVtaXQgdGhlIHRhYmxlcyB1bmxlc3MgaXQgaXMgcGFzc2VkIHdyaXRlX2FsbF90YWJsZXM9VFJVRS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfd3JpdGVfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgLyogKFJlKWluaXRpYWxpemUgZXJyb3IgbWdyIGFuZCBkZXN0aW5hdGlvbiBtb2R1bGVzICovCisgICgqY2luZm8tPmVyci0+cmVzZXRfZXJyb3JfbWdyKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAoKmNpbmZvLT5kZXN0LT5pbml0X2Rlc3RpbmF0aW9uKSAoY2luZm8pOworICAvKiBJbml0aWFsaXplIHRoZSBtYXJrZXIgd3JpdGVyIC4uLiBiaXQgb2YgYSBjcm9jayB0byBkbyBpdCBoZXJlLiAqLworICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKKyAgLyogV3JpdGUgdGhlbSB0YWJsZXMhICovCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfdGFibGVzX29ubHkpIChjaW5mbyk7CisgIC8qIEFuZCBjbGVhbiB1cC4gKi8KKyAgKCpjaW5mby0+ZGVzdC0+dGVybV9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyoKKyAgICogSW4gbGlicmFyeSByZWxlYXNlcyB1cCB0aHJvdWdoIHY2YSwgd2UgY2FsbGVkIGpwZWdfYWJvcnQoKSBoZXJlIHRvIGZyZWUKKyAgICogYW55IHdvcmtpbmcgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgZGVzdGluYXRpb24gbWFuYWdlciBhbmQgbWFya2VyCisgICAqIHdyaXRlci4gIFNvbWUgYXBwbGljYXRpb25zIGhhZCBhIHByb2JsZW0gd2l0aCB0aGF0OiB0aGV5IGFsbG9jYXRlZCBzcGFjZQorICAgKiBvZiB0aGVpciBvd24gZnJvbSB0aGUgbGlicmFyeSBtZW1vcnkgbWFuYWdlciwgYW5kIGRpZG4ndCB3YW50IGl0IHRvIGdvCisgICAqIGF3YXkgZHVyaW5nIHdyaXRlX3RhYmxlcy4gIFNvIG5vdyB3ZSBkbyBub3RoaW5nLiAgVGhpcyB3aWxsIGNhdXNlIGEKKyAgICogbWVtb3J5IGxlYWsgaWYgYW4gYXBwIGNhbGxzIHdyaXRlX3RhYmxlcyByZXBlYXRlZGx5IHdpdGhvdXQgZG9pbmcgYSBmdWxsCisgICAqIGNvbXByZXNzaW9uIGN5Y2xlIG9yIG90aGVyd2lzZSByZXNldHRpbmcgdGhlIEpQRUcgb2JqZWN0LiAgSG93ZXZlciwgdGhhdAorICAgKiBzZWVtcyBsZXNzIGJhZCB0aGFuIHVuZXhwZWN0ZWRseSBmcmVlaW5nIG1lbW9yeSBpbiB0aGUgbm9ybWFsIGNhc2UuCisgICAqIEFuIGFwcCB0aGF0IHByZWZlcnMgdGhlIG9sZCBiZWhhdmlvciBjYW4gY2FsbCBqcGVnX2Fib3J0IGZvciBpdHNlbGYgYWZ0ZXIKKyAgICogZWFjaCBjYWxsIHRvIGpwZWdfd3JpdGVfdGFibGVzKCkuCisgICAqLworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamNhcGlzdGQuYyBiL2NvbW1vbi9qcGVnL2pjYXBpc3RkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzMjBiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pjYXBpc3RkLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBqY2FwaXN0ZC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBjb21wcmVzc2lvbiBoYWxmCisgKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAic3RhbmRhcmQiIEFQSSByb3V0aW5lcyB0aGF0IGFyZQorICogdXNlZCBpbiB0aGUgbm9ybWFsIGZ1bGwtY29tcHJlc3Npb24gY2FzZS4gIFRoZXkgYXJlIG5vdCB1c2VkIGJ5IGEKKyAqIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgaWYgYW4gYXBwbGljYXRpb24gbGlua3MgaW4KKyAqIGpwZWdfc3RhcnRfY29tcHJlc3MsIGl0IHdpbGwgZW5kIHVwIGxpbmtpbmcgaW4gdGhlIGVudGlyZSBjb21wcmVzc29yLgorICogV2UgdGh1cyBtdXN0IHNlcGFyYXRlIHRoaXMgZmlsZSBmcm9tIGpjYXBpbWluLmMgdG8gYXZvaWQgbGlua2luZyB0aGUKKyAqIHdob2xlIGNvbXByZXNzaW9uIGxpYnJhcnkgaW50byBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBDb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbi4KKyAqIEJlZm9yZSBjYWxsaW5nIHRoaXMsIGFsbCBwYXJhbWV0ZXJzIGFuZCBhIGRhdGEgZGVzdGluYXRpb24gbXVzdCBiZSBzZXQgdXAuCisgKgorICogV2UgcmVxdWlyZSBhIHdyaXRlX2FsbF90YWJsZXMgcGFyYW1ldGVyIGFzIGEgZmFpbHNhZmUgY2hlY2sgd2hlbiB3cml0aW5nCisgKiBtdWx0aXBsZSBkYXRhc3RyZWFtcyBmcm9tIHRoZSBzYW1lIGNvbXByZXNzaW9uIG9iamVjdC4gIFNpbmNlIHByaW9yIHJ1bnMKKyAqIHdpbGwgaGF2ZSBsZWZ0IGFsbCB0aGUgdGFibGVzIG1hcmtlZCBzZW50X3RhYmxlPVRSVUUsIGEgc3Vic2VxdWVudCBydW4KKyAqIHdvdWxkIGVtaXQgYW4gYWJicmV2aWF0ZWQgc3RyZWFtIChubyB0YWJsZXMpIGJ5IGRlZmF1bHQuICBUaGlzIG1heSBiZSB3aGF0CisgKiBpcyB3YW50ZWQsIGJ1dCBmb3Igc2FmZXR5J3Mgc2FrZSBpdCBzaG91bGQgbm90IGJlIHRoZSBkZWZhdWx0IGJlaGF2aW9yOgorICogcHJvZ3JhbW1lcnMgc2hvdWxkIGhhdmUgdG8gbWFrZSBhIGRlbGliZXJhdGUgY2hvaWNlIHRvIGVtaXQgYWJicmV2aWF0ZWQKKyAqIGltYWdlcy4gIFRoZXJlZm9yZSB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMgc2hvdWxkIGVuY291cmFnZSBwZW9wbGUKKyAqIHRvIHBhc3Mgd3JpdGVfYWxsX3RhYmxlcz1UUlVFOyB0aGVuIGl0IHdpbGwgdGFrZSBhY3RpdmUgdGhvdWdodCB0byBkbyB0aGUKKyAqIHdyb25nIHRoaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19zdGFydF9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gd3JpdGVfYWxsX3RhYmxlcykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgaWYgKHdyaXRlX2FsbF90YWJsZXMpCisgICAganBlZ19zdXBwcmVzc190YWJsZXMoY2luZm8sIEZBTFNFKTsJLyogbWFyayBhbGwgdGFibGVzIHRvIGJlIHdyaXR0ZW4gKi8KKworICAvKiAoUmUpaW5pdGlhbGl6ZSBlcnJvciBtZ3IgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgKi8KKyAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICgqY2luZm8tPmRlc3QtPmluaXRfZGVzdGluYXRpb24pIChjaW5mbyk7CisgIC8qIFBlcmZvcm0gbWFzdGVyIHNlbGVjdGlvbiBvZiBhY3RpdmUgbW9kdWxlcyAqLworICBqaW5pdF9jb21wcmVzc19tYXN0ZXIoY2luZm8pOworICAvKiBTZXQgdXAgZm9yIHRoZSBmaXJzdCBwYXNzICovCisgICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3JfcGFzcykgKGNpbmZvKTsKKyAgLyogUmVhZHkgZm9yIGFwcGxpY2F0aW9uIHRvIGRyaXZlIGZpcnN0IHBhc3MgdGhyb3VnaCBqcGVnX3dyaXRlX3NjYW5saW5lcworICAgKiBvciBqcGVnX3dyaXRlX3Jhd19kYXRhLgorICAgKi8KKyAgY2luZm8tPm5leHRfc2NhbmxpbmUgPSAwOworICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gKGNpbmZvLT5yYXdfZGF0YV9pbiA/IENTVEFURV9SQVdfT0sgOiBDU1RBVEVfU0NBTk5JTkcpOworfQorCisKKy8qCisgKiBXcml0ZSBzb21lIHNjYW5saW5lcyBvZiBkYXRhIHRvIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBudW1iZXIgb2YgbGluZXMgYWN0dWFsbHkgd3JpdHRlbi4KKyAqIFRoaXMgc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgc3VwcGxpZWQgbnVtX2xpbmVzIG9ubHkgaW4gY2FzZSB0aGF0CisgKiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUgaGFzIHJlcXVlc3RlZCBzdXNwZW5zaW9uIG9mIHRoZSBjb21wcmVzc29yLAorICogb3IgaWYgbW9yZSB0aGFuIGltYWdlX2hlaWdodCBzY2FubGluZXMgYXJlIHBhc3NlZCBpbi4KKyAqCisgKiBOb3RlOiB3ZSB3YXJuIGFib3V0IGV4Y2VzcyBjYWxscyB0byBqcGVnX3dyaXRlX3NjYW5saW5lcygpIHNpbmNlCisgKiB0aGlzIGxpa2VseSBzaWduYWxzIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgZXJyb3IuICBIb3dldmVyLAorICogZXhjZXNzIHNjYW5saW5lcyBwYXNzZWQgaW4gdGhlIGxhc3QgdmFsaWQgY2FsbCBhcmUgKnNpbGVudGx5KiBpZ25vcmVkLAorICogc28gdGhhdCB0aGUgYXBwbGljYXRpb24gbmVlZCBub3QgYWRqdXN0IG51bV9saW5lcyBmb3IgZW5kLW9mLWltYWdlCisgKiB3aGVuIHVzaW5nIGEgbXVsdGlwbGUtc2NhbmxpbmUgYnVmZmVyLgorICovCisKK0dMT0JBTChKRElNRU5TSU9OKQoranBlZ193cml0ZV9zY2FubGluZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIHNjYW5saW5lcywKKwkJICAgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpCit7CisgIEpESU1FTlNJT04gcm93X2N0ciwgcm93c19sZWZ0OworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TQ0FOTklORykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPj0gY2luZm8tPmltYWdlX2hlaWdodCkKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7CisKKyAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBjaW5mby0+bmV4dF9zY2FubGluZTsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPmltYWdlX2hlaWdodDsKKyAgICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgfQorCisgIC8qIEdpdmUgbWFzdGVyIGNvbnRyb2wgbW9kdWxlIGFub3RoZXIgY2hhbmNlIGlmIHRoaXMgaXMgZmlyc3QgY2FsbCB0bworICAgKiBqcGVnX3dyaXRlX3NjYW5saW5lcy4gIFRoaXMgbGV0cyBvdXRwdXQgb2YgdGhlIGZyYW1lL3NjYW4gaGVhZGVycyBiZQorICAgKiBkZWxheWVkIHNvIHRoYXQgYXBwbGljYXRpb24gY2FuIHdyaXRlIENPTSwgZXRjLCBtYXJrZXJzIGJldHdlZW4KKyAgICoganBlZ19zdGFydF9jb21wcmVzcyBhbmQganBlZ193cml0ZV9zY2FubGluZXMuCisgICAqLworICBpZiAoY2luZm8tPm1hc3Rlci0+Y2FsbF9wYXNzX3N0YXJ0dXApCisgICAgKCpjaW5mby0+bWFzdGVyLT5wYXNzX3N0YXJ0dXApIChjaW5mbyk7CisKKyAgLyogSWdub3JlIGFueSBleHRyYSBzY2FubGluZXMgYXQgYm90dG9tIG9mIGltYWdlLiAqLworICByb3dzX2xlZnQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0IC0gY2luZm8tPm5leHRfc2NhbmxpbmU7CisgIGlmIChudW1fbGluZXMgPiByb3dzX2xlZnQpCisgICAgbnVtX2xpbmVzID0gcm93c19sZWZ0OworCisgIHJvd19jdHIgPSAwOworICAoKmNpbmZvLT5tYWluLT5wcm9jZXNzX2RhdGEpIChjaW5mbywgc2NhbmxpbmVzLCAmcm93X2N0ciwgbnVtX2xpbmVzKTsKKyAgY2luZm8tPm5leHRfc2NhbmxpbmUgKz0gcm93X2N0cjsKKyAgcmV0dXJuIHJvd19jdHI7Cit9CisKKworLyoKKyAqIEFsdGVybmF0ZSBlbnRyeSBwb2ludCB0byB3cml0ZSByYXcgZGF0YS4KKyAqIFByb2Nlc3NlcyBleGFjdGx5IG9uZSBpTUNVIHJvdyBwZXIgY2FsbCwgdW5sZXNzIHN1c3BlbmRlZC4KKyAqLworCitHTE9CQUwoSkRJTUVOU0lPTikKK2pwZWdfd3JpdGVfcmF3X2RhdGEgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGRhdGEsCisJCSAgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpCit7CisgIEpESU1FTlNJT04gbGluZXNfcGVyX2lNQ1Vfcm93OworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9SQVdfT0spCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lID49IGNpbmZvLT5pbWFnZV9oZWlnaHQpIHsKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5uZXh0X3NjYW5saW5lOworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisKKyAgLyogR2l2ZSBtYXN0ZXIgY29udHJvbCBtb2R1bGUgYW5vdGhlciBjaGFuY2UgaWYgdGhpcyBpcyBmaXJzdCBjYWxsIHRvCisgICAqIGpwZWdfd3JpdGVfcmF3X2RhdGEuICBUaGlzIGxldHMgb3V0cHV0IG9mIHRoZSBmcmFtZS9zY2FuIGhlYWRlcnMgYmUKKyAgICogZGVsYXllZCBzbyB0aGF0IGFwcGxpY2F0aW9uIGNhbiB3cml0ZSBDT00sIGV0YywgbWFya2VycyBiZXR3ZWVuCisgICAqIGpwZWdfc3RhcnRfY29tcHJlc3MgYW5kIGpwZWdfd3JpdGVfcmF3X2RhdGEuCisgICAqLworICBpZiAoY2luZm8tPm1hc3Rlci0+Y2FsbF9wYXNzX3N0YXJ0dXApCisgICAgKCpjaW5mby0+bWFzdGVyLT5wYXNzX3N0YXJ0dXApIChjaW5mbyk7CisKKyAgLyogVmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGlNQ1Ugcm93IGhhcyBiZWVuIHBhc3NlZC4gKi8KKyAgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKKyAgaWYgKG51bV9saW5lcyA8IGxpbmVzX3Blcl9pTUNVX3JvdykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JVRkZFUl9TSVpFKTsKKworICAvKiBEaXJlY3RseSBjb21wcmVzcyB0aGUgcm93LiAqLworICBpZiAoISAoKmNpbmZvLT5jb2VmLT5jb21wcmVzc19kYXRhKSAoY2luZm8sIGRhdGEpKSB7CisgICAgLyogSWYgY29tcHJlc3NvciBkaWQgbm90IGNvbnN1bWUgdGhlIHdob2xlIHJvdywgc3VzcGVuZCBwcm9jZXNzaW5nLiAqLworICAgIHJldHVybiAwOworICB9CisKKyAgLyogT0ssIHdlIHByb2Nlc3NlZCBvbmUgaU1DVSByb3cuICovCisgIGNpbmZvLT5uZXh0X3NjYW5saW5lICs9IGxpbmVzX3Blcl9pTUNVX3JvdzsKKyAgcmV0dXJuIGxpbmVzX3Blcl9pTUNVX3JvdzsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pjY29lZmN0LmMgYi9jb21tb24vanBlZy9qY2NvZWZjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NjNkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qY2NvZWZjdC5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogamNjb2VmY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlciBmb3IgY29tcHJlc3Npb24uCisgKiBUaGlzIGNvbnRyb2xsZXIgaXMgdGhlIHRvcCBsZXZlbCBvZiB0aGUgSlBFRyBjb21wcmVzc29yIHByb3Blci4KKyAqIFRoZSBjb2VmZmljaWVudCBidWZmZXIgbGllcyBiZXR3ZWVuIGZvcndhcmQtRENUIGFuZCBlbnRyb3B5IGVuY29kaW5nIHN0ZXBzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBXZSB1c2UgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGVuIGRvaW5nIEh1ZmZtYW4gb3B0aW1pemF0aW9uLAorICogYW5kIGFsc28gZm9yIHdyaXRpbmcgbXVsdGlwbGUtc2NhbiBKUEVHIGZpbGVzLiAgSW4gYWxsIGNhc2VzLCB0aGUgRENUCisgKiBzdGVwIGlzIHJ1biBkdXJpbmcgdGhlIGZpcnN0IHBhc3MsIGFuZCBzdWJzZXF1ZW50IHBhc3NlcyBuZWVkIG9ubHkgcmVhZAorICogdGhlIGJ1ZmZlcmVkIGNvZWZmaWNpZW50cy4KKyAqLworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorI2RlZmluZSBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorI2Vsc2UKKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyNkZWZpbmUgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKKyNlbmRpZgorI2VuZGlmCisKKworLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBKRElNRU5TSU9OIGlNQ1Vfcm93X251bTsJLyogaU1DVSByb3cgIyB3aXRoaW4gaW1hZ2UgKi8KKyAgSkRJTUVOU0lPTiBtY3VfY3RyOwkJLyogY291bnRzIE1DVXMgcHJvY2Vzc2VkIGluIGN1cnJlbnQgcm93ICovCisgIGludCBNQ1VfdmVydF9vZmZzZXQ7CQkvKiBjb3VudHMgTUNVIHJvd3Mgd2l0aGluIGlNQ1Ugcm93ICovCisgIGludCBNQ1Vfcm93c19wZXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBzdWNoIHJvd3MgbmVlZGVkICovCisKKyAgLyogRm9yIHNpbmdsZS1wYXNzIGNvbXByZXNzaW9uLCBpdCdzIHN1ZmZpY2llbnQgdG8gYnVmZmVyIGp1c3Qgb25lIE1DVQorICAgKiAoYWx0aG91Z2ggdGhpcyBtYXkgcHJvdmUgYSBiaXQgc2xvdyBpbiBwcmFjdGljZSkuICBXZSBhbGxvY2F0ZSBhCisgICAqIHdvcmtzcGFjZSBvZiBDX01BWF9CTE9DS1NfSU5fTUNVIGNvZWZmaWNpZW50IGJsb2NrcywgYW5kIHJldXNlIGl0IGZvciBlYWNoCisgICAqIE1DVSBjb25zdHJ1Y3RlZCBhbmQgc2VudC4gIChPbiA4MHg4NiwgdGhlIHdvcmtzcGFjZSBpcyBGQVIgZXZlbiB0aG91Z2gKKyAgICogaXQncyBub3QgcmVhbGx5IHZlcnkgYmlnOyB0aGlzIGlzIHRvIGtlZXAgdGhlIG1vZHVsZSBpbnRlcmZhY2VzIHVuY2hhbmdlZAorICAgKiB3aGVuIGEgbGFyZ2UgY29lZmZpY2llbnQgYnVmZmVyIGlzIG5lY2Vzc2FyeS4pCisgICAqIEluIG11bHRpLXBhc3MgbW9kZXMsIHRoaXMgYXJyYXkgcG9pbnRzIHRvIHRoZSBjdXJyZW50IE1DVSdzIGJsb2NrcworICAgKiB3aXRoaW4gdGhlIHZpcnR1YWwgYXJyYXlzLgorICAgKi8KKyAgSkJMT0NLUk9XIE1DVV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07CisKKyAgLyogSW4gbXVsdGktcGFzcyBtb2Rlcywgd2UgbmVlZCBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LiAqLworICBqdmlydF9iYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKK30gbXlfY29lZl9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2NvZWZfY29udHJvbGxlciAqIG15X2NvZWZfcHRyOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoYm9vbGVhbikgY29tcHJlc3NfZGF0YQorICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7CisjaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKK01FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19maXJzdF9wYXNzCisgICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKK01FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19vdXRwdXQKKyAgICBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikpOworI2VuZGlmCisKKworTE9DQUwodm9pZCkKK3N0YXJ0X2lNQ1Vfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIFJlc2V0IHdpdGhpbi1pTUNVLXJvdyBjb3VudGVycyBmb3IgYSBuZXcgcm93ICovCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIC8qIEluIGFuIGludGVybGVhdmVkIHNjYW4sIGFuIE1DVSByb3cgaXMgdGhlIHNhbWUgYXMgYW4gaU1DVSByb3cuCisgICAqIEluIGEgbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYW4gaU1DVSByb3cgaGFzIHZfc2FtcF9mYWN0b3IgTUNVIHJvd3MuCisgICAqIEJ1dCBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgcHJvY2VzcyBvbmx5IHdoYXQncyBsZWZ0LgorICAgKi8KKyAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgeworICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IDE7CisgIH0gZWxzZSB7CisgICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IChjaW5mby0+dG90YWxfaU1DVV9yb3dzLTEpKQorICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPnZfc2FtcF9mYWN0b3I7CisgICAgZWxzZQorICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPmxhc3Rfcm93X2hlaWdodDsKKyAgfQorCisgIGNvZWYtPm1jdV9jdHIgPSAwOworICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSAwOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfY29lZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKworICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7CisKKyAgc3dpdGNoIChwYXNzX21vZGUpIHsKKyAgY2FzZSBKQlVGX1BBU1NfVEhSVToKKyAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gIT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX2RhdGE7CisgICAgYnJlYWs7CisjaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKKyAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6CisgICAgaWYgKGNvZWYtPndob2xlX2ltYWdlWzBdID09IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgY29lZi0+cHViLmNvbXByZXNzX2RhdGEgPSBjb21wcmVzc19maXJzdF9wYXNzOworICAgIGJyZWFrOworICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKKyAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX291dHB1dDsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2luZ2xlLXBhc3MgY2FzZS4KKyAqIFdlIHByb2Nlc3MgdGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpCisgKiBwZXIgY2FsbCwgaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIGltYWdlLgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBpTUNVIHJvdyBpcyBjb21wbGV0ZWQsIEZBTFNFIGlmIHN1c3BlbmRlZC4KKyAqCisgKiBOQjogaW5wdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLAorICogd2hpY2ggd2UgaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBjb21wb25lbnQncyBTT0YgcG9zaXRpb24uCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitjb21wcmVzc19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBpbnQgYmxrbiwgYmksIGNpLCB5aW5kZXgsIHlvZmZzZXQsIGJsb2NrY250OworICBKRElNRU5TSU9OIHlwb3MsIHhwb3M7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogTG9vcCB0byB3cml0ZSBhcyBtdWNoIGFzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLworICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisgICAgICAgeW9mZnNldCsrKSB7CisgICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPm1jdV9jdHI7IE1DVV9jb2xfbnVtIDw9IGxhc3RfTUNVX2NvbDsKKwkgTUNVX2NvbF9udW0rKykgeworICAgICAgLyogRGV0ZXJtaW5lIHdoZXJlIGRhdGEgY29tZXMgZnJvbSBpbiBpbnB1dF9idWYgYW5kIGRvIHRoZSBEQ1QgdGhpbmcuCisgICAgICAgKiBFYWNoIGNhbGwgb24gZm9yd2FyZF9EQ1QgcHJvY2Vzc2VzIGEgaG9yaXpvbnRhbCByb3cgb2YgRENUIGJsb2NrcworICAgICAgICogYXMgd2lkZSBhcyBhbiBNQ1U7IHdlIHJlbHkgb24gaGF2aW5nIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcworICAgICAgICogc2VxdWVudGlhbGx5LiAgRHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZSBhcmUgZmlsbGVkIGluCisgICAgICAgKiBzcGVjaWFsbHkuICBUaGUgZGF0YSBpbiB0aGVtIGRvZXMgbm90IG1hdHRlciBmb3IgaW1hZ2UgcmVjb25zdHJ1Y3Rpb24sCisgICAgICAgKiBzbyB3ZSBmaWxsIHRoZW0gd2l0aCB2YWx1ZXMgdGhhdCB3aWxsIGVuY29kZSB0byB0aGUgc21hbGxlc3QgYW1vdW50IG9mCisgICAgICAgKiBkYXRhLCB2aXo6IGFsbCB6ZXJvZXMgaW4gdGhlIEFDIGVudHJpZXMsIERDIGVudHJpZXMgZXF1YWwgdG8gcHJldmlvdXMKKyAgICAgICAqIGJsb2NrJ3MgREMgdmFsdWUuICAoVGhhbmtzIHRvIFRob21hcyBLaW5zbWFuIGZvciB0aGlzIGlkZWEuKQorICAgICAgICovCisgICAgICBibGtuID0gMDsKKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisJY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKwlibG9ja2NudCA9IChNQ1VfY29sX251bSA8IGxhc3RfTUNVX2NvbCkgPyBjb21wcHRyLT5NQ1Vfd2lkdGgKKwkJCQkJCTogY29tcHB0ci0+bGFzdF9jb2xfd2lkdGg7CisJeHBvcyA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aDsKKwl5cG9zID0geW9mZnNldCAqIERDVFNJWkU7IC8qIHlwb3MgPT0gKHlvZmZzZXQreWluZGV4KSAqIERDVFNJWkUgKi8KKwlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7CisJICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAorCSAgICAgIHlvZmZzZXQreWluZGV4IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7CisJICAgICgqY2luZm8tPmZkY3QtPmZvcndhcmRfRENUKSAoY2luZm8sIGNvbXBwdHIsCisJCQkJCSBpbnB1dF9idWZbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKwkJCQkJIGNvZWYtPk1DVV9idWZmZXJbYmxrbl0sCisJCQkJCSB5cG9zLCB4cG9zLCAoSkRJTUVOU0lPTikgYmxvY2tjbnQpOworCSAgICBpZiAoYmxvY2tjbnQgPCBjb21wcHRyLT5NQ1Vfd2lkdGgpIHsKKwkgICAgICAvKiBDcmVhdGUgc29tZSBkdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGltYWdlLiAqLworCSAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY29lZi0+TUNVX2J1ZmZlcltibGtuICsgYmxvY2tjbnRdLAorCQkJKGNvbXBwdHItPk1DVV93aWR0aCAtIGJsb2NrY250KSAqIFNJWkVPRihKQkxPQ0spKTsKKwkgICAgICBmb3IgKGJpID0gYmxvY2tjbnQ7IGJpIDwgY29tcHB0ci0+TUNVX3dpZHRoOyBiaSsrKSB7CisJCWNvZWYtPk1DVV9idWZmZXJbYmxrbitiaV1bMF1bMF0gPSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rYmktMV1bMF1bMF07CisJICAgICAgfQorCSAgICB9CisJICB9IGVsc2UgeworCSAgICAvKiBDcmVhdGUgYSByb3cgb2YgZHVtbXkgYmxvY2tzIGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLiAqLworCSAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbYmxrbl0sCisJCSAgICAgIGNvbXBwdHItPk1DVV93aWR0aCAqIFNJWkVPRihKQkxPQ0spKTsKKwkgICAgZm9yIChiaSA9IDA7IGJpIDwgY29tcHB0ci0+TUNVX3dpZHRoOyBiaSsrKSB7CisJICAgICAgY29lZi0+TUNVX2J1ZmZlcltibGtuK2JpXVswXVswXSA9IGNvZWYtPk1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKKwkgICAgfQorCSAgfQorCSAgYmxrbiArPSBjb21wcHRyLT5NQ1Vfd2lkdGg7CisJICB5cG9zICs9IERDVFNJWkU7CisJfQorICAgICAgfQorICAgICAgLyogVHJ5IHRvIHdyaXRlIHRoZSBNQ1UuICBJbiBldmVudCBvZiBhIHN1c3BlbnNpb24gZmFpbHVyZSwgd2Ugd2lsbAorICAgICAgICogcmUtRENUIHRoZSBNQ1Ugb24gcmVzdGFydCAoYSBiaXQgaW5lZmZpY2llbnQsIGNvdWxkIGJlIGZpeGVkLi4uKQorICAgICAgICovCisgICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5lbmNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7CisJLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLworCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7CisJY29lZi0+bWN1X2N0ciA9IE1DVV9jb2xfbnVtOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLworICAgIGNvZWYtPm1jdV9jdHIgPSAwOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCisgIGNvZWYtPmlNQ1Vfcm93X251bSsrOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIGZpcnN0IHBhc3Mgb2YgYSBtdWx0aS1wYXNzIGNhc2UuCisgKiBXZSBwcm9jZXNzIHRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KQorICogcGVyIGNhbGwsIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBpbWFnZS4KKyAqIFRoaXMgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyLCBEQ1QnZCBhbmQgcXVhbnRpemVkLAorICogYW5kIHNhdmVkIGludG8gdGhlIHZpcnR1YWwgYXJyYXlzLiAgV2UgYWxzbyBnZW5lcmF0ZSBzdWl0YWJsZSBkdW1teSBibG9ja3MKKyAqIGFzIG5lZWRlZCBhdCB0aGUgcmlnaHQgYW5kIGxvd2VyIGVkZ2VzLiAgKFRoZSBkdW1teSBibG9ja3MgYXJlIGNvbnN0cnVjdGVkCisgKiBpbiB0aGUgdmlydHVhbCBhcnJheXMsIHdoaWNoIGhhdmUgYmVlbiBwYWRkZWQgYXBwcm9wcmlhdGVseS4pICBUaGlzIG1ha2VzCisgKiBpdCBwb3NzaWJsZSBmb3Igc3Vic2VxdWVudCBwYXNzZXMgbm90IHRvIHdvcnJ5IGFib3V0IHJlYWwgdnMuIGR1bW15IGJsb2Nrcy4KKyAqCisgKiBXZSBtdXN0IGFsc28gZW1pdCB0aGUgZGF0YSB0byB0aGUgZW50cm9weSBlbmNvZGVyLiAgVGhpcyBpcyBjb252ZW5pZW50bHkKKyAqIGRvbmUgYnkgY2FsbGluZyBjb21wcmVzc19vdXRwdXQoKSBhZnRlciB3ZSd2ZSBsb2FkZWQgdGhlIGN1cnJlbnQgc3RyaXAKKyAqIG9mIHRoZSB2aXJ0dWFsIGFycmF5cy4KKyAqCisgKiBOQjogaW5wdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLiAgQWxsCisgKiBjb21wb25lbnRzIGFyZSBEQ1QnZCBhbmQgbG9hZGVkIGludG8gdGhlIHZpcnR1YWwgYXJyYXlzIGluIHRoaXMgcGFzcy4KKyAqIEhvd2V2ZXIsIGl0IG1heSBiZSB0aGF0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGVtaXR0ZWQgdG8KKyAqIHRoZSBlbnRyb3B5IGVuY29kZXIgZHVyaW5nIHRoaXMgZmlyc3QgcGFzczsgYmUgY2FyZWZ1bCBhYm91dCBsb29raW5nCisgKiBhdCB0aGUgc2Nhbi1kZXBlbmRlbnQgdmFyaWFibGVzIChNQ1UgZGltZW5zaW9ucywgZXRjKS4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2NvbXByZXNzX2ZpcnN0X3Bhc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBKRElNRU5TSU9OIGJsb2Nrc19hY3Jvc3MsIE1DVXNfYWNyb3NzLCBNQ1VpbmRleDsKKyAgaW50IGJpLCBjaSwgaF9zYW1wX2ZhY3RvciwgYmxvY2tfcm93LCBibG9ja19yb3dzLCBuZHVtbXk7CisgIEpDT0VGIGxhc3REQzsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSkJMT0NLQVJSQVkgYnVmZmVyOworICBKQkxPQ0tST1cgdGhpc2Jsb2Nrcm93LCBsYXN0YmxvY2tyb3c7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXIgZm9yIHRoaXMgY29tcG9uZW50LiAqLworICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCisgICAgICAgY29lZi0+aU1DVV9yb3dfbnVtICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKyAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCisgICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IGxhc3RfaU1DVV9yb3cpCisgICAgICBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlIHsKKyAgICAgIC8qIE5COiBjYW4ndCB1c2UgbGFzdF9yb3dfaGVpZ2h0IGhlcmUsIHNpbmNlIG1heSBub3QgYmUgc2V0ISAqLworICAgICAgYmxvY2tfcm93cyA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgICBpZiAoYmxvY2tfcm93cyA9PSAwKSBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICB9CisgICAgYmxvY2tzX2Fjcm9zcyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKKyAgICBoX3NhbXBfZmFjdG9yID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICAvKiBDb3VudCBudW1iZXIgb2YgZHVtbXkgYmxvY2tzIHRvIGJlIGFkZGVkIGF0IHRoZSByaWdodCBtYXJnaW4uICovCisgICAgbmR1bW15ID0gKGludCkgKGJsb2Nrc19hY3Jvc3MgJSBoX3NhbXBfZmFjdG9yKTsKKyAgICBpZiAobmR1bW15ID4gMCkKKyAgICAgIG5kdW1teSA9IGhfc2FtcF9mYWN0b3IgLSBuZHVtbXk7CisgICAgLyogUGVyZm9ybSBEQ1QgZm9yIGFsbCBub24tZHVtbXkgYmxvY2tzIGluIHRoaXMgaU1DVSByb3cuICBFYWNoIGNhbGwKKyAgICAgKiBvbiBmb3J3YXJkX0RDVCBwcm9jZXNzZXMgYSBjb21wbGV0ZSBob3Jpem9udGFsIHJvdyBvZiBEQ1QgYmxvY2tzLgorICAgICAqLworICAgIGZvciAoYmxvY2tfcm93ID0gMDsgYmxvY2tfcm93IDwgYmxvY2tfcm93czsgYmxvY2tfcm93KyspIHsKKyAgICAgIHRoaXNibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ddOworICAgICAgKCpjaW5mby0+ZmRjdC0+Zm9yd2FyZF9EQ1QpIChjaW5mbywgY29tcHB0ciwKKwkJCQkgICBpbnB1dF9idWZbY2ldLCB0aGlzYmxvY2tyb3csCisJCQkJICAgKEpESU1FTlNJT04pIChibG9ja19yb3cgKiBEQ1RTSVpFKSwKKwkJCQkgICAoSkRJTUVOU0lPTikgMCwgYmxvY2tzX2Fjcm9zcyk7CisgICAgICBpZiAobmR1bW15ID4gMCkgeworCS8qIENyZWF0ZSBkdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGltYWdlLiAqLworCXRoaXNibG9ja3JvdyArPSBibG9ja3NfYWNyb3NzOyAvKiA9PiBmaXJzdCBkdW1teSBibG9jayAqLworCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgdGhpc2Jsb2Nrcm93LCBuZHVtbXkgKiBTSVpFT0YoSkJMT0NLKSk7CisJbGFzdERDID0gdGhpc2Jsb2Nrcm93Wy0xXVswXTsKKwlmb3IgKGJpID0gMDsgYmkgPCBuZHVtbXk7IGJpKyspIHsKKwkgIHRoaXNibG9ja3Jvd1tiaV1bMF0gPSBsYXN0REM7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBJZiBhdCBlbmQgb2YgaW1hZ2UsIGNyZWF0ZSBkdW1teSBibG9jayByb3dzIGFzIG5lZWRlZC4KKyAgICAgKiBUaGUgdHJpY2t5IHBhcnQgaGVyZSBpcyB0aGF0IHdpdGhpbiBlYWNoIE1DVSwgd2Ugd2FudCB0aGUgREMgdmFsdWVzCisgICAgICogb2YgdGhlIGR1bW15IGJsb2NrcyB0byBtYXRjaCB0aGUgbGFzdCByZWFsIGJsb2NrJ3MgREMgdmFsdWUuCisgICAgICogVGhpcyBzcXVlZXplcyBhIGZldyBtb3JlIGJ5dGVzIG91dCBvZiB0aGUgcmVzdWx0aW5nIGZpbGUuLi4KKyAgICAgKi8KKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtID09IGxhc3RfaU1DVV9yb3cpIHsKKyAgICAgIGJsb2Nrc19hY3Jvc3MgKz0gbmR1bW15OwkvKiBpbmNsdWRlIGxvd2VyIHJpZ2h0IGNvcm5lciAqLworICAgICAgTUNVc19hY3Jvc3MgPSBibG9ja3NfYWNyb3NzIC8gaF9zYW1wX2ZhY3RvcjsKKyAgICAgIGZvciAoYmxvY2tfcm93ID0gYmxvY2tfcm93czsgYmxvY2tfcm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKwkgICBibG9ja19yb3crKykgeworCXRoaXNibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ddOworCWxhc3RibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ctMV07CisJanplcm9fZmFyKCh2b2lkIEZBUiAqKSB0aGlzYmxvY2tyb3csCisJCSAgKHNpemVfdCkgKGJsb2Nrc19hY3Jvc3MgKiBTSVpFT0YoSkJMT0NLKSkpOworCWZvciAoTUNVaW5kZXggPSAwOyBNQ1VpbmRleCA8IE1DVXNfYWNyb3NzOyBNQ1VpbmRleCsrKSB7CisJICBsYXN0REMgPSBsYXN0YmxvY2tyb3dbaF9zYW1wX2ZhY3Rvci0xXVswXTsKKwkgIGZvciAoYmkgPSAwOyBiaSA8IGhfc2FtcF9mYWN0b3I7IGJpKyspIHsKKwkgICAgdGhpc2Jsb2Nrcm93W2JpXVswXSA9IGxhc3REQzsKKwkgIH0KKwkgIHRoaXNibG9ja3JvdyArPSBoX3NhbXBfZmFjdG9yOyAvKiBhZHZhbmNlIHRvIG5leHQgTUNVIGluIHJvdyAqLworCSAgbGFzdGJsb2Nrcm93ICs9IGhfc2FtcF9mYWN0b3I7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKiBOQjogY29tcHJlc3Nfb3V0cHV0IHdpbGwgaW5jcmVtZW50IGlNQ1Vfcm93X251bSBpZiBzdWNjZXNzZnVsLgorICAgKiBBIHN1c3BlbnNpb24gcmV0dXJuIHdpbGwgcmVzdWx0IGluIHJlZG9pbmcgYWxsIHRoZSB3b3JrIGFib3ZlIG5leHQgdGltZS4KKyAgICovCisKKyAgLyogRW1pdCBkYXRhIHRvIHRoZSBlbnRyb3B5IGVuY29kZXIsIHNoYXJpbmcgY29kZSB3aXRoIHN1YnNlcXVlbnQgcGFzc2VzICovCisgIHJldHVybiBjb21wcmVzc19vdXRwdXQoY2luZm8sIGlucHV0X2J1Zik7Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHN1YnNlcXVlbnQgcGFzc2VzIG9mIGEgbXVsdGktcGFzcyBjYXNlLgorICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKKyAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KKyAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgorICoKKyAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQ7CisgIEpESU1FTlNJT04gc3RhcnRfY29sOworICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOworICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4KKyAgICogTkI6IGR1cmluZyBmaXJzdCBwYXNzLCB0aGlzIGlzIHNhZmUgb25seSBiZWNhdXNlIHRoZSBidWZmZXJzIHdpbGwKKyAgICogYWxyZWFkeSBiZSBhbGlnbmVkIHByb3Blcmx5LCBzbyBqbWVtbWdyLmMgd29uJ3QgbmVlZCB0byBkbyBhbnkgSS9PLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgIH0KKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKwkgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XSArIHN0YXJ0X2NvbDsKKwkgIGZvciAoeGluZGV4ID0gMDsgeGluZGV4IDwgY29tcHB0ci0+TUNVX3dpZHRoOyB4aW5kZXgrKykgeworCSAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisJICB9CisJfQorICAgICAgfQorICAgICAgLyogVHJ5IHRvIHdyaXRlIHRoZSBNQ1UuICovCisgICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5lbmNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7CisJLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLworCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7CisJY29lZi0+bWN1X2N0ciA9IE1DVV9jb2xfbnVtOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLworICAgIGNvZWYtPm1jdV9jdHIgPSAwOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCisgIGNvZWYtPmlNQ1Vfcm93X251bSsrOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2NfY29lZl9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQoreworICBteV9jb2VmX3B0ciBjb2VmOworCisgIGNvZWYgPSAobXlfY29lZl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICopIGNvZWY7CisgIGNvZWYtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19jb2VmOworCisgIC8qIENyZWF0ZSB0aGUgY29lZmZpY2llbnQgYnVmZmVyLiAqLworICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgeworI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECisgICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LCAqLworICAgIC8qIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIHNhbXBfZmFjdG9yIERDVCBibG9ja3MgaW4gZWFjaCBkaXJlY3Rpb24uICovCisgICAgaW50IGNpOworICAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIGNvZWYtPndob2xlX2ltYWdlW2NpXSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICB9CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8qIFdlIG9ubHkgbmVlZCBhIHNpbmdsZS1NQ1UgYnVmZmVyLiAqLworICAgIEpCTE9DS1JPVyBidWZmZXI7CisgICAgaW50IGk7CisKKyAgICBidWZmZXIgPSAoSkJMT0NLUk9XKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIENfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7CisgICAgZm9yIChpID0gMDsgaSA8IENfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgeworICAgICAgY29lZi0+TUNVX2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7CisgICAgfQorICAgIGNvZWYtPndob2xlX2ltYWdlWzBdID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamNjb2xvci5jIGIvY29tbW9uL2pwZWcvamNjb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGE0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qY2NvbG9yLmMKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiBqY2NvbG9yLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBpbnB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZXMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFByaXZhdGUgc3RhdGUgZm9yIFJHQi0+WUNDIGNvbnZlcnNpb24gKi8KKyAgSU5UMzIgKiByZ2JfeWNjX3RhYjsJCS8qID0+IHRhYmxlIGZvciBSR0IgdG8gWUNiQ3IgY29udmVyc2lvbiAqLworfSBteV9jb2xvcl9jb252ZXJ0ZXI7CisKK3R5cGVkZWYgbXlfY29sb3JfY29udmVydGVyICogbXlfY2NvbnZlcnRfcHRyOworCisKKy8qKioqKioqKioqKioqKioqIFJHQiAtPiBZQ2JDciBjb252ZXJzaW9uOiBtb3N0IGNvbW1vbiBjYXNlICoqKioqKioqKioqKioqLworCisvKgorICogWUNiQ3IgaXMgZGVmaW5lZCBwZXIgQ0NJUiA2MDEtMSwgZXhjZXB0IHRoYXQgQ2IgYW5kIENyIGFyZQorICogbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSByYXRoZXIgdGhhbiAtMC41IC4uIDAuNS4KKyAqIFRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucyB0byBiZSBpbXBsZW1lbnRlZCBhcmUgdGhlcmVmb3JlCisgKglZICA9ICAwLjI5OTAwICogUiArIDAuNTg3MDAgKiBHICsgMC4xMTQwMCAqIEIKKyAqCUNiID0gLTAuMTY4NzQgKiBSIC0gMC4zMzEyNiAqIEcgKyAwLjUwMDAwICogQiAgKyBDRU5URVJKU0FNUExFCisgKglDciA9ICAwLjUwMDAwICogUiAtIDAuNDE4NjkgKiBHIC0gMC4wODEzMSAqIEIgICsgQ0VOVEVSSlNBTVBMRQorICogKFRoZXNlIG51bWJlcnMgYXJlIGRlcml2ZWQgZnJvbSBUSUZGIDYuMCBzZWN0aW9uIDIxLCBkYXRlZCAzLUp1bmUtOTIuKQorICogTm90ZTogb2xkZXIgdmVyc2lvbnMgb2YgdGhlIElKRyBjb2RlIHVzZWQgYSB6ZXJvIG9mZnNldCBvZiBNQVhKU0FNUExFLzIsCisgKiByYXRoZXIgdGhhbiBDRU5URVJKU0FNUExFLCBmb3IgQ2IgYW5kIENyLiAgVGhpcyBnYXZlIGVxdWFsIHBvc2l0aXZlIGFuZAorICogbmVnYXRpdmUgc3dpbmdzIGZvciBDYi9DciwgYnV0IG1lYW50IHRoYXQgZ3JheXNjYWxlIHZhbHVlcyAoQ2I9Q3I9MCkKKyAqIHdlcmUgbm90IHJlcHJlc2VudGVkIGV4YWN0bHkuICBOb3cgd2Ugc2FjcmlmaWNlIGV4YWN0IHJlcHJlc2VudGF0aW9uIG9mCisgKiBtYXhpbXVtIHJlZCBhbmQgbWF4aW11bSBibHVlIGluIG9yZGVyIHRvIGdldCBleGFjdCBncmF5c2NhbGVzLgorICoKKyAqIFRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMsIHdlIHJlcHJlc2VudCB0aGUgZnJhY3Rpb25hbCBjb25zdGFudHMKKyAqIGFzIGludGVnZXJzIHNjYWxlZCB1cCBieSAyXjE2IChhYm91dCA0IGRpZ2l0cyBwcmVjaXNpb24pOyB3ZSBoYXZlIHRvIGRpdmlkZQorICogdGhlIHByb2R1Y3RzIGJ5IDJeMTYsIHdpdGggYXBwcm9wcmlhdGUgcm91bmRpbmcsIHRvIGdldCB0aGUgY29ycmVjdCBhbnN3ZXIuCisgKgorICogRm9yIGV2ZW4gbW9yZSBzcGVlZCwgd2UgYXZvaWQgZG9pbmcgYW55IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgaW5uZXIgbG9vcAorICogYnkgcHJlY2FsY3VsYXRpbmcgdGhlIGNvbnN0YW50cyB0aW1lcyBSLEcsQiBmb3IgYWxsIHBvc3NpYmxlIHZhbHVlcy4KKyAqIEZvciA4LWJpdCBKU0FNUExFcyB0aGlzIGlzIHZlcnkgcmVhc29uYWJsZSAob25seSAyNTYgZW50cmllcyBwZXIgdGFibGUpOworICogZm9yIDEyLWJpdCBzYW1wbGVzIGl0IGlzIHN0aWxsIGFjY2VwdGFibGUuICBJdCdzIG5vdCB2ZXJ5IHJlYXNvbmFibGUgZm9yCisgKiAxNi1iaXQgc2FtcGxlcywgYnV0IGlmIHlvdSB3YW50IGxvc3NsZXNzIHN0b3JhZ2UgeW91IHNob3VsZG4ndCBiZSBjaGFuZ2luZworICogY29sb3JzcGFjZSBhbnl3YXkuCisgKiBUaGUgQ0VOVEVSSlNBTVBMRSBvZmZzZXRzIGFuZCB0aGUgcm91bmRpbmcgZnVkZ2UtZmFjdG9yIG9mIDAuNSBhcmUgaW5jbHVkZWQKKyAqIGluIHRoZSB0YWJsZXMgdG8gc2F2ZSBhZGRpbmcgdGhlbSBzZXBhcmF0ZWx5IGluIHRoZSBpbm5lciBsb29wLgorICovCisKKyNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCisjZGVmaW5lIENCQ1JfT0ZGU0VUCSgoSU5UMzIpIENFTlRFUkpTQU1QTEUgPDwgU0NBTEVCSVRTKQorI2RlZmluZSBPTkVfSEFMRgkoKElOVDMyKSAxIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KQkJKChJTlQzMikgKCh4KSAqICgxTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKy8qIFdlIGFsbG9jYXRlIG9uZSBiaWcgdGFibGUgYW5kIGRpdmlkZSBpdCB1cCBpbnRvIGVpZ2h0IHBhcnRzLCBpbnN0ZWFkIG9mCisgKiBkb2luZyBlaWdodCBhbGxvY19zbWFsbCByZXF1ZXN0cy4gIFRoaXMgbGV0cyB1cyB1c2UgYSBzaW5nbGUgdGFibGUgYmFzZQorICogYWRkcmVzcywgd2hpY2ggY2FuIGJlIGhlbGQgaW4gYSByZWdpc3RlciBpbiB0aGUgaW5uZXIgbG9vcHMgb24gbWFueQorICogbWFjaGluZXMgKG1vcmUgdGhhbiBjYW4gaG9sZCBhbGwgZWlnaHQgYWRkcmVzc2VzLCBhbnl3YXkpLgorICovCisKKyNkZWZpbmUgUl9ZX09GRgkJMAkJCS8qIG9mZnNldCB0byBSID0+IFkgc2VjdGlvbiAqLworI2RlZmluZSBHX1lfT0ZGCQkoMSooTUFYSlNBTVBMRSsxKSkJLyogb2Zmc2V0IHRvIEcgPT4gWSBzZWN0aW9uICovCisjZGVmaW5lIEJfWV9PRkYJCSgyKihNQVhKU0FNUExFKzEpKQkvKiBldGMuICovCisjZGVmaW5lIFJfQ0JfT0ZGCSgzKihNQVhKU0FNUExFKzEpKQorI2RlZmluZSBHX0NCX09GRgkoNCooTUFYSlNBTVBMRSsxKSkKKyNkZWZpbmUgQl9DQl9PRkYJKDUqKE1BWEpTQU1QTEUrMSkpCisjZGVmaW5lIFJfQ1JfT0ZGCUJfQ0JfT0ZGCQkvKiBCPT5DYiwgUj0+Q3IgYXJlIHRoZSBzYW1lICovCisjZGVmaW5lIEdfQ1JfT0ZGCSg2KihNQVhKU0FNUExFKzEpKQorI2RlZmluZSBCX0NSX09GRgkoNyooTUFYSlNBTVBMRSsxKSkKKyNkZWZpbmUgVEFCTEVfU0laRQkoOCooTUFYSlNBTVBMRSsxKSkKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgUkdCLT5ZQ0MgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmdiX3ljY19zdGFydCAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgSU5UMzIgKiByZ2JfeWNjX3RhYjsKKyAgSU5UMzIgaTsKKworICAvKiBBbGxvY2F0ZSBhbmQgZmlsbCBpbiB0aGUgY29udmVyc2lvbiB0YWJsZXMuICovCisgIGNjb252ZXJ0LT5yZ2JfeWNjX3RhYiA9IHJnYl95Y2NfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoVEFCTEVfU0laRSAqIFNJWkVPRihJTlQzMikpKTsKKworICBmb3IgKGkgPSAwOyBpIDw9IE1BWEpTQU1QTEU7IGkrKykgeworICAgIHJnYl95Y2NfdGFiW2krUl9ZX09GRl0gPSBGSVgoMC4yOTkwMCkgKiBpOworICAgIHJnYl95Y2NfdGFiW2krR19ZX09GRl0gPSBGSVgoMC41ODcwMCkgKiBpOworICAgIHJnYl95Y2NfdGFiW2krQl9ZX09GRl0gPSBGSVgoMC4xMTQwMCkgKiBpICAgICArIE9ORV9IQUxGOworICAgIHJnYl95Y2NfdGFiW2krUl9DQl9PRkZdID0gKC1GSVgoMC4xNjg3NCkpICogaTsKKyAgICByZ2JfeWNjX3RhYltpK0dfQ0JfT0ZGXSA9ICgtRklYKDAuMzMxMjYpKSAqIGk7CisgICAgLyogV2UgdXNlIGEgcm91bmRpbmcgZnVkZ2UtZmFjdG9yIG9mIDAuNS1lcHNpbG9uIGZvciBDYiBhbmQgQ3IuCisgICAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1heGltdW0gb3V0cHV0IHdpbGwgcm91bmQgdG8gTUFYSlNBTVBMRQorICAgICAqIG5vdCBNQVhKU0FNUExFKzEsIGFuZCB0aHVzIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByYW5nZS1saW1pdC4KKyAgICAgKi8KKyAgICByZ2JfeWNjX3RhYltpK0JfQ0JfT0ZGXSA9IEZJWCgwLjUwMDAwKSAqIGkgICAgKyBDQkNSX09GRlNFVCArIE9ORV9IQUxGLTE7CisvKiAgQj0+Q2IgYW5kIFI9PkNyIHRhYmxlcyBhcmUgdGhlIHNhbWUKKyAgICByZ2JfeWNjX3RhYltpK1JfQ1JfT0ZGXSA9IEZJWCgwLjUwMDAwKSAqIGkgICAgKyBDQkNSX09GRlNFVCArIE9ORV9IQUxGLTE7CisqLworICAgIHJnYl95Y2NfdGFiW2krR19DUl9PRkZdID0gKC1GSVgoMC40MTg2OSkpICogaTsKKyAgICByZ2JfeWNjX3RhYltpK0JfQ1JfT0ZGXSA9ICgtRklYKDAuMDgxMzEpKSAqIGk7CisgIH0KK30KKworCisvKgorICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjaGFuZ2UgZnJvbSB0aGUgYXBwbGljYXRpb24ncyBpbnRlcmxlYXZlZC1waXhlbCBmb3JtYXQKKyAqIHRvIG91ciBpbnRlcm5hbCBub25pbnRlcmxlYXZlZCwgb25lLXBsYW5lLXBlci1jb21wb25lbnQgZm9ybWF0LgorICogVGhlIGlucHV0IGJ1ZmZlciBpcyB0aGVyZWZvcmUgdGhyZWUgdGltZXMgYXMgd2lkZSBhcyB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqCisgKiBBIHN0YXJ0aW5nIHJvdyBvZmZzZXQgaXMgcHJvdmlkZWQgb25seSBmb3IgdGhlIG91dHB1dCBidWZmZXIuICBUaGUgY2FsbGVyCisgKiBjYW4gZWFzaWx5IGFkanVzdCB0aGUgcGFzc2VkIGlucHV0X2J1ZiB2YWx1ZSB0byBhY2NvbW1vZGF0ZSBhbnkgcm93CisgKiBvZmZzZXQgcmVxdWlyZWQgb24gdGhhdCBzaWRlLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmdiX3ljY19jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisJCSBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgciwgZywgYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBjdGFiID0gY2NvbnZlcnQtPnJnYl95Y2NfdGFiOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMSwgb3V0cHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gKmlucHV0X2J1ZisrOworICAgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOworICAgIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdW291dHB1dF9yb3ddOworICAgIG91dHB0cjIgPSBvdXRwdXRfYnVmWzJdW291dHB1dF9yb3ddOworICAgIG91dHB1dF9yb3crKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgciA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX1JFRF0pOworICAgICAgZyA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0dSRUVOXSk7CisgICAgICBiID0gR0VUSlNBTVBMRShpbnB0cltSR0JfQkxVRV0pOworICAgICAgaW5wdHIgKz0gUkdCX1BJWEVMU0laRTsKKyAgICAgIC8qIElmIHRoZSBpbnB1dHMgYXJlIDAuLk1BWEpTQU1QTEUsIHRoZSBvdXRwdXRzIG9mIHRoZXNlIGVxdWF0aW9ucworICAgICAgICogbXVzdCBiZSB0b287IHdlIGRvIG5vdCBuZWVkIGFuIGV4cGxpY2l0IHJhbmdlLWxpbWl0aW5nIG9wZXJhdGlvbi4KKyAgICAgICAqIEhlbmNlIHRoZSB2YWx1ZSBiZWluZyBzaGlmdGVkIGlzIG5ldmVyIG5lZ2F0aXZlLCBhbmQgd2UgZG9uJ3QKKyAgICAgICAqIG5lZWQgdGhlIGdlbmVyYWwgUklHSFRfU0hJRlQgbWFjcm8uCisgICAgICAgKi8KKyAgICAgIC8qIFkgKi8KKyAgICAgIG91dHB0cjBbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX1lfT0ZGXSArIGN0YWJbZytHX1lfT0ZGXSArIGN0YWJbYitCX1lfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgICAvKiBDYiAqLworICAgICAgb3V0cHRyMVtjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfQ0JfT0ZGXSArIGN0YWJbZytHX0NCX09GRl0gKyBjdGFiW2IrQl9DQl9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICAgIC8qIENyICovCisgICAgICBvdXRwdHIyW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9DUl9PRkZdICsgY3RhYltnK0dfQ1JfT0ZGXSArIGN0YWJbYitCX0NSX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqIENhc2VzIG90aGVyIHRoYW4gUkdCIC0+IFlDYkNyICoqKioqKioqKioqKioqLworCisKKy8qCisgKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBSR0ItPmdyYXlzY2FsZSBjb252ZXJzaW9uLCB3aGljaCBpcyB0aGUgc2FtZQorICogYXMgdGhlIFJHQi0+WSBwb3J0aW9uIG9mIFJHQi0+WUNiQ3IuCisgKiBXZSBhc3N1bWUgcmdiX3ljY19zdGFydCBoYXMgYmVlbiBjYWxsZWQgKHdlIG9ubHkgdXNlIHRoZSBZIHRhYmxlcykuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCityZ2JfZ3JheV9jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIHJlZ2lzdGVyIGludCByLCBnLCBiOworICByZWdpc3RlciBJTlQzMiAqIGN0YWIgPSBjY29udmVydC0+cmdiX3ljY190YWI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOworICAgIG91dHB1dF9yb3crKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgciA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX1JFRF0pOworICAgICAgZyA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0dSRUVOXSk7CisgICAgICBiID0gR0VUSlNBTVBMRShpbnB0cltSR0JfQkxVRV0pOworICAgICAgaW5wdHIgKz0gUkdCX1BJWEVMU0laRTsKKyAgICAgIC8qIFkgKi8KKyAgICAgIG91dHB0cltjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfWV9PRkZdICsgY3RhYltnK0dfWV9PRkZdICsgY3RhYltiK0JfWV9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgQWRvYmUtc3R5bGUgQ01ZSy0+WUNDSyBjb252ZXJzaW9uLAorICogd2hlcmUgd2UgY29udmVydCBSPTEtQywgRz0xLU0sIGFuZCBCPTEtWSB0byBZQ2JDciB1c2luZyB0aGUgc2FtZQorICogY29udmVyc2lvbiBhcyBhYm92ZSwgd2hpbGUgcGFzc2luZyBLIChibGFjaykgdW5jaGFuZ2VkLgorICogV2UgYXNzdW1lIHJnYl95Y2Nfc3RhcnQgaGFzIGJlZW4gY2FsbGVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorY215a195Y2NrX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgciwgZywgYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBjdGFiID0gY2NvbnZlcnQtPnJnYl95Y2NfdGFiOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMSwgb3V0cHRyMiwgb3V0cHRyMzsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gKmlucHV0X2J1ZisrOworICAgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOworICAgIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdW291dHB1dF9yb3ddOworICAgIG91dHB0cjIgPSBvdXRwdXRfYnVmWzJdW291dHB1dF9yb3ddOworICAgIG91dHB0cjMgPSBvdXRwdXRfYnVmWzNdW291dHB1dF9yb3ddOworICAgIG91dHB1dF9yb3crKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgciA9IE1BWEpTQU1QTEUgLSBHRVRKU0FNUExFKGlucHRyWzBdKTsKKyAgICAgIGcgPSBNQVhKU0FNUExFIC0gR0VUSlNBTVBMRShpbnB0clsxXSk7CisgICAgICBiID0gTUFYSlNBTVBMRSAtIEdFVEpTQU1QTEUoaW5wdHJbMl0pOworICAgICAgLyogSyBwYXNzZXMgdGhyb3VnaCBhcy1pcyAqLworICAgICAgb3V0cHRyM1tjb2xdID0gaW5wdHJbM107CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSBoZXJlICovCisgICAgICBpbnB0ciArPSA0OworICAgICAgLyogSWYgdGhlIGlucHV0cyBhcmUgMC4uTUFYSlNBTVBMRSwgdGhlIG91dHB1dHMgb2YgdGhlc2UgZXF1YXRpb25zCisgICAgICAgKiBtdXN0IGJlIHRvbzsgd2UgZG8gbm90IG5lZWQgYW4gZXhwbGljaXQgcmFuZ2UtbGltaXRpbmcgb3BlcmF0aW9uLgorICAgICAgICogSGVuY2UgdGhlIHZhbHVlIGJlaW5nIHNoaWZ0ZWQgaXMgbmV2ZXIgbmVnYXRpdmUsIGFuZCB3ZSBkb24ndAorICAgICAgICogbmVlZCB0aGUgZ2VuZXJhbCBSSUdIVF9TSElGVCBtYWNyby4KKyAgICAgICAqLworICAgICAgLyogWSAqLworICAgICAgb3V0cHRyMFtjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfWV9PRkZdICsgY3RhYltnK0dfWV9PRkZdICsgY3RhYltiK0JfWV9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICAgIC8qIENiICovCisgICAgICBvdXRwdHIxW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9DQl9PRkZdICsgY3RhYltnK0dfQ0JfT0ZGXSArIGN0YWJbYitCX0NCX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgICAgLyogQ3IgKi8KKyAgICAgIG91dHB0cjJbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX0NSX09GRl0gKyBjdGFiW2crR19DUl9PRkZdICsgY3RhYltiK0JfQ1JfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIGdyYXlzY2FsZSBvdXRwdXQgd2l0aCBubyBjb252ZXJzaW9uLgorICogVGhlIHNvdXJjZSBjYW4gYmUgZWl0aGVyIHBsYWluIGdyYXlzY2FsZSBvciBZQ2JDciAoc2luY2UgWSA9PSBncmF5KS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2dyYXlzY2FsZV9jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOworICBpbnQgaW5zdHJpZGUgPSBjaW5mby0+aW5wdXRfY29tcG9uZW50czsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdXRfcm93Kys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIG91dHB0cltjb2xdID0gaW5wdHJbMF07CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIGlucHRyICs9IGluc3RyaWRlOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBtdWx0aS1jb21wb25lbnQgY29sb3JzcGFjZXMgd2l0aG91dCBjb252ZXJzaW9uLgorICogV2UgYXNzdW1lIGlucHV0X2NvbXBvbmVudHMgPT0gbnVtX2NvbXBvbmVudHMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitudWxsX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCSAgICAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisJICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICByZWdpc3RlciBpbnQgY2k7CisgIGludCBuYyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgLyogSXQgc2VlbXMgZmFzdGVzdCB0byBtYWtlIGEgc2VwYXJhdGUgcGFzcyBmb3IgZWFjaCBjb21wb25lbnQuICovCisgICAgZm9yIChjaSA9IDA7IGNpIDwgbmM7IGNpKyspIHsKKyAgICAgIGlucHRyID0gKmlucHV0X2J1ZjsKKyAgICAgIG91dHB0ciA9IG91dHB1dF9idWZbY2ldW291dHB1dF9yb3ddOworICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKwlvdXRwdHJbY29sXSA9IGlucHRyW2NpXTsgLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLworCWlucHRyICs9IG5jOworICAgICAgfQorICAgIH0KKyAgICBpbnB1dF9idWYrKzsKKyAgICBvdXRwdXRfcm93Kys7CisgIH0KK30KKworCisvKgorICogRW1wdHkgbWV0aG9kIGZvciBzdGFydF9wYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorbnVsbF9tZXRob2QgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrIG5lZWRlZCAqLworfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgaW5wdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY29sb3JfY29udmVydGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0OworCisgIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jb2xvcl9jb252ZXJ0ZXIpKTsKKyAgY2luZm8tPmNjb252ZXJ0ID0gKHN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciAqKSBjY29udmVydDsKKyAgLyogc2V0IHN0YXJ0X3Bhc3MgdG8gbnVsbCBtZXRob2QgdW50aWwgd2UgZmluZCBvdXQgZGlmZmVyZW50bHkgKi8KKyAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gbnVsbF9tZXRob2Q7CisKKyAgLyogTWFrZSBzdXJlIGlucHV0X2NvbXBvbmVudHMgYWdyZWVzIHdpdGggaW5fY29sb3Jfc3BhY2UgKi8KKyAgc3dpdGNoIChjaW5mby0+aW5fY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfUkdCOgorI2lmIFJHQl9QSVhFTFNJWkUgIT0gMworICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSBSR0JfUElYRUxTSVpFKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisjZW5kaWYgLyogZWxzZSBzaGFyZSBjb2RlIHdpdGggWUNiQ3IgKi8KKworICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gMykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX0NNWUs6CisgIGNhc2UgSkNTX1lDQ0s6CisgICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICE9IDQpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgkJCS8qIEpDU19VTktOT1dOIGNhbiBiZSBhbnl0aGluZyAqLworICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyA8IDEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIENoZWNrIG51bV9jb21wb25lbnRzLCBzZXQgY29udmVyc2lvbiBtZXRob2QgYmFzZWQgb24gcmVxdWVzdGVkIHNwYWNlICovCisgIHN3aXRjaCAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKQorICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheXNjYWxlX2NvbnZlcnQ7CisgICAgZWxzZSBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfZ3JheV9jb252ZXJ0OworICAgIH0gZWxzZSBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlzY2FsZV9jb252ZXJ0OworICAgIGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19SR0I6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IgJiYgUkdCX1BJWEVMU0laRSA9PSAzKQorICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgICAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gcmdiX3ljY19zdGFydDsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHJnYl95Y2NfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpCisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7CisgICAgZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX0NNWUs6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSA0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19DTVlLKQorICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19ZQ0NLOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykgeworICAgICAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gcmdiX3ljY19zdGFydDsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGNteWtfeWNja19jb252ZXJ0OworICAgIH0gZWxzZSBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19ZQ0NLKQorICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgkJCS8qIGFsbG93IG51bGwgY29udmVyc2lvbiBvZiBKQ1NfVU5LTk9XTiAqLworICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSAhPSBjaW5mby0+aW5fY29sb3Jfc3BhY2UgfHwKKwljaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gY2luZm8tPmlucHV0X2NvbXBvbmVudHMpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qY2RjdG1nci5jIGIvY29tbW9uL2pwZWcvamNkY3RtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWZhNzliCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamNkY3RtZ3IuYwpAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIGpjZGN0bWdyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZm9yd2FyZC1EQ1QgbWFuYWdlbWVudCBsb2dpYy4KKyAqIFRoaXMgY29kZSBzZWxlY3RzIGEgcGFydGljdWxhciBEQ1QgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCwKKyAqIGFuZCBpdCBwZXJmb3JtcyByZWxhdGVkIGhvdXNla2VlcGluZyBjaG9yZXMgaW5jbHVkaW5nIGNvZWZmaWNpZW50CisgKiBxdWFudGl6YXRpb24uCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgZm9yIHRoaXMgbW9kdWxlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogUG9pbnRlciB0byB0aGUgRENUIHJvdXRpbmUgYWN0dWFsbHkgaW4gdXNlICovCisgIGZvcndhcmRfRENUX21ldGhvZF9wdHIgZG9fZGN0OworCisgIC8qIFRoZSBhY3R1YWwgcG9zdC1EQ1QgZGl2aXNvcnMgLS0tIG5vdCBpZGVudGljYWwgdG8gdGhlIHF1YW50IHRhYmxlCisgICAqIGVudHJpZXMsIGJlY2F1c2Ugb2Ygc2NhbGluZyAoZXNwZWNpYWxseSBmb3IgYW4gdW5ub3JtYWxpemVkIERDVCkuCisgICAqIEVhY2ggdGFibGUgaXMgZ2l2ZW4gaW4gbm9ybWFsIGFycmF5IG9yZGVyLgorICAgKi8KKyAgRENURUxFTSAqIGRpdmlzb3JzW05VTV9RVUFOVF9UQkxTXTsKKworI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKyAgLyogU2FtZSBhcyBhYm92ZSBmb3IgdGhlIGZsb2F0aW5nLXBvaW50IGNhc2UuICovCisgIGZsb2F0X0RDVF9tZXRob2RfcHRyIGRvX2Zsb2F0X2RjdDsKKyAgRkFTVF9GTE9BVCAqIGZsb2F0X2Rpdmlzb3JzW05VTV9RVUFOVF9UQkxTXTsKKyNlbmRpZgorfSBteV9mZGN0X2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfZmRjdF9jb250cm9sbGVyICogbXlfZmRjdF9wdHI7CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICogVmVyaWZ5IHRoYXQgYWxsIHJlZmVyZW5jZWQgUS10YWJsZXMgYXJlIHByZXNlbnQsIGFuZCBzZXQgdXAKKyAqIHRoZSBkaXZpc29yIHRhYmxlIGZvciBlYWNoIG9uZS4KKyAqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBEQ1Qgb2YgYWxsIGNvbXBvbmVudHMgaXMgZG9uZSBkdXJpbmcKKyAqIHRoZSBmaXJzdCBwYXNzLCBldmVuIGlmIG9ubHkgc29tZSBjb21wb25lbnRzIHdpbGwgYmUgb3V0cHV0IGluIHRoZQorICogZmlyc3Qgc2Nhbi4gIEhlbmNlIGFsbCBjb21wb25lbnRzIHNob3VsZCBiZSBleGFtaW5lZCBoZXJlLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19mZGN0bWdyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfZmRjdF9wdHIgZmRjdCA9IChteV9mZGN0X3B0cikgY2luZm8tPmZkY3Q7CisgIGludCBjaSwgcXRibG5vLCBpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKUVVBTlRfVEJMICogcXRibDsKKyAgRENURUxFTSAqIGR0Ymw7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICBxdGJsbm8gPSBjb21wcHRyLT5xdWFudF90Ymxfbm87CisgICAgLyogTWFrZSBzdXJlIHNwZWNpZmllZCBxdWFudGl6YXRpb24gdGFibGUgaXMgcHJlc2VudCAqLworICAgIGlmIChxdGJsbm8gPCAwIHx8IHF0YmxubyA+PSBOVU1fUVVBTlRfVEJMUyB8fAorCWNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dID09IE5VTEwpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19RVUFOVF9UQUJMRSwgcXRibG5vKTsKKyAgICBxdGJsID0gY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub107CisgICAgLyogQ29tcHV0ZSBkaXZpc29ycyBmb3IgdGhpcyBxdWFudCB0YWJsZSAqLworICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBzYW1lIHRhYmxlLCBidXQgaXQncyBub3QgYSBiaWcgZGVhbCAqLworICAgIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisgICAgY2FzZSBKRENUX0lTTE9XOgorICAgICAgLyogRm9yIExMJk0gSURDVCBtZXRob2QsIGRpdmlzb3JzIGFyZSBlcXVhbCB0byByYXcgcXVhbnRpemF0aW9uCisgICAgICAgKiBjb2VmZmljaWVudHMgbXVsdGlwbGllZCBieSA4ICh0byBjb3VudGVyYWN0IHNjYWxpbmcpLgorICAgICAgICovCisgICAgICBpZiAoZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9PSBOVUxMKSB7CisJZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9IChEQ1RFTEVNICopCisJICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICAgIERDVFNJWkUyICogU0laRU9GKERDVEVMRU0pKTsKKyAgICAgIH0KKyAgICAgIGR0YmwgPSBmZGN0LT5kaXZpc29yc1txdGJsbm9dOworICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwlkdGJsW2ldID0gKChEQ1RFTEVNKSBxdGJsLT5xdWFudHZhbFtpXSkgPDwgMzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9JRkFTVDoKKyAgICAgIHsKKwkvKiBGb3IgQUEmTiBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCisJICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNworCSAqIFdlIGFwcGx5IGEgZnVydGhlciBzY2FsZSBmYWN0b3Igb2YgOC4KKwkgKi8KKyNkZWZpbmUgQ09OU1RfQklUUyAxNAorCXN0YXRpYyBjb25zdCBJTlQxNiBhYW5zY2FsZXNbRENUU0laRTJdID0geworCSAgLyogcHJlY29tcHV0ZWQgdmFsdWVzIHNjYWxlZCB1cCBieSAxNCBiaXRzICovCisJICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCisJICAyMjcyNSwgMzE1MjEsIDI5NjkyLCAyNjcyMiwgMjI3MjUsIDE3ODU1LCAxMjI5OSwgIDYyNzAsCisJICAyMTQwNywgMjk2OTIsIDI3OTY5LCAyNTE3MiwgMjE0MDcsIDE2ODE5LCAxMTU4NSwgIDU5MDYsCisJICAxOTI2NiwgMjY3MjIsIDI1MTcyLCAyMjY1NCwgMTkyNjYsIDE1MTM3LCAxMDQyNiwgIDUzMTUsCisJICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCisJICAxMjg3MywgMTc4NTUsIDE2ODE5LCAxNTEzNywgMTI4NzMsIDEwMTE0LCAgNjk2NywgIDM1NTIsCisJICAgODg2NywgMTIyOTksIDExNTg1LCAxMDQyNiwgIDg4NjcsICA2OTY3LCAgNDc5OSwgIDI0NDYsCisJICAgNDUyMCwgIDYyNzAsICA1OTA2LCAgNTMxNSwgIDQ1MjAsICAzNTUyLCAgMjQ0NiwgIDEyNDcKKwl9OworCVNISUZUX1RFTVBTCisKKwlpZiAoZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9PSBOVUxMKSB7CisJICBmZGN0LT5kaXZpc29yc1txdGJsbm9dID0gKERDVEVMRU0gKikKKwkgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkJRENUU0laRTIgKiBTSVpFT0YoRENURUxFTSkpOworCX0KKwlkdGJsID0gZmRjdC0+ZGl2aXNvcnNbcXRibG5vXTsKKwlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworCSAgZHRibFtpXSA9IChEQ1RFTEVNKQorCSAgICBERVNDQUxFKE1VTFRJUExZMTZWMTYoKElOVDMyKSBxdGJsLT5xdWFudHZhbFtpXSwKKwkJCQkgIChJTlQzMikgYWFuc2NhbGVzW2ldKSwKKwkJICAgIENPTlNUX0JJVFMtMyk7CisJfQorICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgICAgY2FzZSBKRENUX0ZMT0FUOgorICAgICAgeworCS8qIEZvciBmbG9hdCBBQSZOIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCisJICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCisJICogICBzY2FsZWZhY3RvclswXSA9IDEKKwkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43CisJICogV2UgYXBwbHkgYSBmdXJ0aGVyIHNjYWxlIGZhY3RvciBvZiA4LgorCSAqIFdoYXQncyBhY3R1YWxseSBzdG9yZWQgaXMgMS9kaXZpc29yIHNvIHRoYXQgdGhlIGlubmVyIGxvb3AgY2FuCisJICogdXNlIGEgbXVsdGlwbGljYXRpb24gcmF0aGVyIHRoYW4gYSBkaXZpc2lvbi4KKwkgKi8KKwlGQVNUX0ZMT0FUICogZmR0Ymw7CisJaW50IHJvdywgY29sOworCXN0YXRpYyBjb25zdCBkb3VibGUgYWFuc2NhbGVmYWN0b3JbRENUU0laRV0gPSB7CisJICAxLjAsIDEuMzg3MDM5ODQ1LCAxLjMwNjU2Mjk2NSwgMS4xNzU4NzU2MDIsCisJICAxLjAsIDAuNzg1Njk0OTU4LCAwLjU0MTE5NjEwMCwgMC4yNzU4OTkzNzkKKwl9OworCisJaWYgKGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgeworCSAgZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXSA9IChGQVNUX0ZMT0FUICopCisJICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJCURDVFNJWkUyICogU0laRU9GKEZBU1RfRkxPQVQpKTsKKwl9CisJZmR0YmwgPSBmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dOworCWkgPSAwOworCWZvciAocm93ID0gMDsgcm93IDwgRENUU0laRTsgcm93KyspIHsKKwkgIGZvciAoY29sID0gMDsgY29sIDwgRENUU0laRTsgY29sKyspIHsKKwkgICAgZmR0YmxbaV0gPSAoRkFTVF9GTE9BVCkKKwkgICAgICAoMS4wIC8gKCgoZG91YmxlKSBxdGJsLT5xdWFudHZhbFtpXSAqCisJCSAgICAgICBhYW5zY2FsZWZhY3Rvcltyb3ddICogYWFuc2NhbGVmYWN0b3JbY29sXSAqIDguMCkpKTsKKwkgICAgaSsrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGZvcndhcmQgRENUIG9uIG9uZSBvciBtb3JlIGJsb2NrcyBvZiBhIGNvbXBvbmVudC4KKyAqCisgKiBUaGUgaW5wdXQgc2FtcGxlcyBhcmUgdGFrZW4gZnJvbSB0aGUgc2FtcGxlX2RhdGFbXSBhcnJheSBzdGFydGluZyBhdAorICogcG9zaXRpb24gc3RhcnRfcm93L3N0YXJ0X2NvbCwgYW5kIG1vdmluZyB0byB0aGUgcmlnaHQgZm9yIGFueSBhZGRpdGlvbmFsCisgKiBibG9ja3MuIFRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIGFyZSByZXR1cm5lZCBpbiBjb2VmX2Jsb2Nrc1tdLgorICovCisKK01FVEhPRERFRih2b2lkKQorZm9yd2FyZF9EQ1QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpCTE9DS1JPVyBjb2VmX2Jsb2NrcywKKwkgICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKKwkgICAgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykKKy8qIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGZvciBpbnRlZ2VyIERDVCBpbXBsZW1lbnRhdGlvbnMuICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIGl0IHRpZ2h0bHkuICovCisgIG15X2ZkY3RfcHRyIGZkY3QgPSAobXlfZmRjdF9wdHIpIGNpbmZvLT5mZGN0OworICBmb3J3YXJkX0RDVF9tZXRob2RfcHRyIGRvX2RjdCA9IGZkY3QtPmRvX2RjdDsKKyAgRENURUxFTSAqIGRpdmlzb3JzID0gZmRjdC0+ZGl2aXNvcnNbY29tcHB0ci0+cXVhbnRfdGJsX25vXTsKKyAgRENURUxFTSB3b3Jrc3BhY2VbRENUU0laRTJdOwkvKiB3b3JrIGFyZWEgZm9yIEZEQ1Qgc3Vicm91dGluZSAqLworICBKRElNRU5TSU9OIGJpOworCisgIHNhbXBsZV9kYXRhICs9IHN0YXJ0X3JvdzsJLyogZm9sZCBpbiB0aGUgdmVydGljYWwgb2Zmc2V0IG9uY2UgKi8KKworICBmb3IgKGJpID0gMDsgYmkgPCBudW1fYmxvY2tzOyBiaSsrLCBzdGFydF9jb2wgKz0gRENUU0laRSkgeworICAgIC8qIExvYWQgZGF0YSBpbnRvIHdvcmtzcGFjZSwgYXBwbHlpbmcgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgeyByZWdpc3RlciBEQ1RFTEVNICp3b3Jrc3BhY2VwdHI7CisgICAgICByZWdpc3RlciBKU0FNUFJPVyBlbGVtcHRyOworICAgICAgcmVnaXN0ZXIgaW50IGVsZW1yOworCisgICAgICB3b3Jrc3BhY2VwdHIgPSB3b3Jrc3BhY2U7CisgICAgICBmb3IgKGVsZW1yID0gMDsgZWxlbXIgPCBEQ1RTSVpFOyBlbGVtcisrKSB7CisJZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2VsZW1yXSArIHN0YXJ0X2NvbDsKKyNpZiBEQ1RTSVpFID09IDgJCS8qIHVucm9sbCB0aGUgaW5uZXIgbG9vcCAqLworCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworI2Vsc2UKKwl7IHJlZ2lzdGVyIGludCBlbGVtYzsKKwkgIGZvciAoZWxlbWMgPSBEQ1RTSVpFOyBlbGVtYyA+IDA7IGVsZW1jLS0pIHsKKwkgICAgKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7CisJICB9CisJfQorI2VuZGlmCisgICAgICB9CisgICAgfQorCisgICAgLyogUGVyZm9ybSB0aGUgRENUICovCisgICAgKCpkb19kY3QpICh3b3Jrc3BhY2UpOworCisgICAgLyogUXVhbnRpemUvZGVzY2FsZSB0aGUgY29lZmZpY2llbnRzLCBhbmQgc3RvcmUgaW50byBjb2VmX2Jsb2Nrc1tdICovCisgICAgeyByZWdpc3RlciBEQ1RFTEVNIHRlbXAsIHF2YWw7CisgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgIHJlZ2lzdGVyIEpDT0VGUFRSIG91dHB1dF9wdHIgPSBjb2VmX2Jsb2Nrc1tiaV07CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisJcXZhbCA9IGRpdmlzb3JzW2ldOworCXRlbXAgPSB3b3Jrc3BhY2VbaV07CisJLyogRGl2aWRlIHRoZSBjb2VmZmljaWVudCB2YWx1ZSBieSBxdmFsLCBlbnN1cmluZyBwcm9wZXIgcm91bmRpbmcuCisJICogU2luY2UgQyBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2Ygcm91bmRpbmcgZm9yIG5lZ2F0aXZlCisJICogcXVvdGllbnRzLCB3ZSBoYXZlIHRvIGZvcmNlIHRoZSBkaXZpZGVuZCBwb3NpdGl2ZSBmb3IgcG9ydGFiaWxpdHkuCisJICoKKwkgKiBJbiBtb3N0IGZpbGVzLCBhdCBsZWFzdCBoYWxmIG9mIHRoZSBvdXRwdXQgdmFsdWVzIHdpbGwgYmUgemVybworCSAqIChhdCBkZWZhdWx0IHF1YW50aXphdGlvbiBzZXR0aW5ncywgbW9yZSBsaWtlIHRocmVlLXF1YXJ0ZXJzLi4uKQorCSAqIHNvIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGlzIGNhc2UgaXMgZmFzdC4gIE9uIG1hbnkgbWFjaGluZXMsCisJICogYSBjb21wYXJpc29uIGlzIGVub3VnaCBjaGVhcGVyIHRoYW4gYSBkaXZpZGUgdG8gbWFrZSBhIHNwZWNpYWwgdGVzdAorCSAqIGEgd2luLiAgU2luY2UgYm90aCBpbnB1dHMgd2lsbCBiZSBub25uZWdhdGl2ZSwgd2UgbmVlZCBvbmx5IHRlc3QKKwkgKiBmb3IgYSA8IGIgdG8gZGlzY292ZXIgd2hldGhlciBhL2IgaXMgMC4KKwkgKiBJZiB5b3VyIG1hY2hpbmUncyBkaXZpc2lvbiBpcyBmYXN0IGVub3VnaCwgZGVmaW5lIEZBU1RfRElWSURFLgorCSAqLworI2lmZGVmIEZBU1RfRElWSURFCisjZGVmaW5lIERJVklERV9CWShhLGIpCWEgLz0gYgorI2Vsc2UKKyNkZWZpbmUgRElWSURFX0JZKGEsYikJaWYgKGEgPj0gYikgYSAvPSBiOyBlbHNlIGEgPSAwCisjZW5kaWYKKwlpZiAodGVtcCA8IDApIHsKKwkgIHRlbXAgPSAtdGVtcDsKKwkgIHRlbXAgKz0gcXZhbD4+MTsJLyogZm9yIHJvdW5kaW5nICovCisJICBESVZJREVfQlkodGVtcCwgcXZhbCk7CisJICB0ZW1wID0gLXRlbXA7CisJfSBlbHNlIHsKKwkgIHRlbXAgKz0gcXZhbD4+MTsJLyogZm9yIHJvdW5kaW5nICovCisJICBESVZJREVfQlkodGVtcCwgcXZhbCk7CisJfQorCW91dHB1dF9wdHJbaV0gPSAoSkNPRUYpIHRlbXA7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKworTUVUSE9EREVGKHZvaWQpCitmb3J3YXJkX0RDVF9mbG9hdCAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgICBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKQkxPQ0tST1cgY29lZl9ibG9ja3MsCisJCSAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKKwkJICAgSkRJTUVOU0lPTiBudW1fYmxvY2tzKQorLyogVGhpcyB2ZXJzaW9uIGlzIHVzZWQgZm9yIGZsb2F0aW5nLXBvaW50IERDVCBpbXBsZW1lbnRhdGlvbnMuICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIGl0IHRpZ2h0bHkuICovCisgIG15X2ZkY3RfcHRyIGZkY3QgPSAobXlfZmRjdF9wdHIpIGNpbmZvLT5mZGN0OworICBmbG9hdF9EQ1RfbWV0aG9kX3B0ciBkb19kY3QgPSBmZGN0LT5kb19mbG9hdF9kY3Q7CisgIEZBU1RfRkxPQVQgKiBkaXZpc29ycyA9IGZkY3QtPmZsb2F0X2Rpdmlzb3JzW2NvbXBwdHItPnF1YW50X3RibF9ub107CisgIEZBU1RfRkxPQVQgd29ya3NwYWNlW0RDVFNJWkUyXTsgLyogd29yayBhcmVhIGZvciBGRENUIHN1YnJvdXRpbmUgKi8KKyAgSkRJTUVOU0lPTiBiaTsKKworICBzYW1wbGVfZGF0YSArPSBzdGFydF9yb3c7CS8qIGZvbGQgaW4gdGhlIHZlcnRpY2FsIG9mZnNldCBvbmNlICovCisKKyAgZm9yIChiaSA9IDA7IGJpIDwgbnVtX2Jsb2NrczsgYmkrKywgc3RhcnRfY29sICs9IERDVFNJWkUpIHsKKyAgICAvKiBMb2FkIGRhdGEgaW50byB3b3Jrc3BhY2UsIGFwcGx5aW5nIHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIHsgcmVnaXN0ZXIgRkFTVF9GTE9BVCAqd29ya3NwYWNlcHRyOworICAgICAgcmVnaXN0ZXIgSlNBTVBST1cgZWxlbXB0cjsKKyAgICAgIHJlZ2lzdGVyIGludCBlbGVtcjsKKworICAgICAgd29ya3NwYWNlcHRyID0gd29ya3NwYWNlOworICAgICAgZm9yIChlbGVtciA9IDA7IGVsZW1yIDwgRENUU0laRTsgZWxlbXIrKykgeworCWVsZW1wdHIgPSBzYW1wbGVfZGF0YVtlbGVtcl0gKyBzdGFydF9jb2w7CisjaWYgRENUU0laRSA9PSA4CQkvKiB1bnJvbGwgdGhlIGlubmVyIGxvb3AgKi8KKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisjZWxzZQorCXsgcmVnaXN0ZXIgaW50IGVsZW1jOworCSAgZm9yIChlbGVtYyA9IERDVFNJWkU7IGVsZW1jID4gMDsgZWxlbWMtLSkgeworCSAgICAqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkKKwkgICAgICAoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSAgfQorCX0KKyNlbmRpZgorICAgICAgfQorICAgIH0KKworICAgIC8qIFBlcmZvcm0gdGhlIERDVCAqLworICAgICgqZG9fZGN0KSAod29ya3NwYWNlKTsKKworICAgIC8qIFF1YW50aXplL2Rlc2NhbGUgdGhlIGNvZWZmaWNpZW50cywgYW5kIHN0b3JlIGludG8gY29lZl9ibG9ja3NbXSAqLworICAgIHsgcmVnaXN0ZXIgRkFTVF9GTE9BVCB0ZW1wOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICByZWdpc3RlciBKQ09FRlBUUiBvdXRwdXRfcHRyID0gY29lZl9ibG9ja3NbYmldOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworCS8qIEFwcGx5IHRoZSBxdWFudGl6YXRpb24gYW5kIHNjYWxpbmcgZmFjdG9yICovCisJdGVtcCA9IHdvcmtzcGFjZVtpXSAqIGRpdmlzb3JzW2ldOworCS8qIFJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlci4KKwkgKiBTaW5jZSBDIGRvZXMgbm90IHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiByb3VuZGluZyBmb3IgbmVnYXRpdmUKKwkgKiBxdW90aWVudHMsIHdlIGhhdmUgdG8gZm9yY2UgdGhlIGRpdmlkZW5kIHBvc2l0aXZlIGZvciBwb3J0YWJpbGl0eS4KKwkgKiBUaGUgbWF4aW11bSBjb2VmZmljaWVudCBzaXplIGlzICstMTZLIChmb3IgMTItYml0IGRhdGEpLCBzbyB0aGlzCisJICogY29kZSBzaG91bGQgd29yayBmb3IgZWl0aGVyIDE2LWJpdCBvciAzMi1iaXQgaW50cy4KKwkgKi8KKwlvdXRwdXRfcHRyW2ldID0gKEpDT0VGKSAoKGludCkgKHRlbXAgKyAoRkFTVF9GTE9BVCkgMTYzODQuNSkgLSAxNjM4NCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfRkxPQVRfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgRkRDVCBtYW5hZ2VyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfZm9yd2FyZF9kY3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9mZGN0X3B0ciBmZGN0OworICBpbnQgaTsKKworICBmZGN0ID0gKG15X2ZkY3RfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2ZkY3RfY29udHJvbGxlcikpOworICBjaW5mby0+ZmRjdCA9IChzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCAqKSBmZGN0OworICBmZGN0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfZmRjdG1ncjsKKworICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7CisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorICBjYXNlIEpEQ1RfSVNMT1c6CisgICAgZmRjdC0+cHViLmZvcndhcmRfRENUID0gZm9yd2FyZF9EQ1Q7CisgICAgZmRjdC0+ZG9fZGN0ID0ganBlZ19mZGN0X2lzbG93OworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICBjYXNlIEpEQ1RfSUZBU1Q6CisgICAgZmRjdC0+cHViLmZvcndhcmRfRENUID0gZm9yd2FyZF9EQ1Q7CisgICAgZmRjdC0+ZG9fZGN0ID0ganBlZ19mZGN0X2lmYXN0OworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICBjYXNlIEpEQ1RfRkxPQVQ6CisgICAgZmRjdC0+cHViLmZvcndhcmRfRENUID0gZm9yd2FyZF9EQ1RfZmxvYXQ7CisgICAgZmRjdC0+ZG9fZmxvYXRfZGN0ID0ganBlZ19mZGN0X2Zsb2F0OworICAgIGJyZWFrOworI2VuZGlmCisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworICAgIGJyZWFrOworICB9CisKKyAgLyogTWFyayBkaXZpc29yIHRhYmxlcyB1bmFsbG9jYXRlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1FVQU5UX1RCTFM7IGkrKykgeworICAgIGZkY3QtPmRpdmlzb3JzW2ldID0gTlVMTDsKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgICAgZmRjdC0+ZmxvYXRfZGl2aXNvcnNbaV0gPSBOVUxMOworI2VuZGlmCisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pjaHVmZi5jIGIvY29tbW9uL2pwZWcvamNodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzNTI1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pjaHVmZi5jCkBAIC0wLDAgKzEsOTA5IEBACisvKgorICogamNodWZmLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZW5jb2Rpbmcgcm91dGluZXMuCisgKgorICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgb3V0cHV0IHN1c3BlbnNpb24uCisgKiBJZiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUgZGVtYW5kcyBzdXNwZW5zaW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8KKyAqIGJhY2sgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVS4gIFRvIGRvIHRoaXMsIHdlIGNvcHkgc3RhdGUKKyAqIHZhcmlhYmxlcyBpbnRvIGxvY2FsIHdvcmtpbmcgc3RvcmFnZSwgYW5kIHVwZGF0ZSB0aGVtIGJhY2sgdG8gdGhlCisgKiBwZXJtYW5lbnQgSlBFRyBvYmplY3RzIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqY2h1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqY3BodWZmLmMgKi8KKworCisvKiBFeHBhbmRlZCBlbnRyb3B5IGVuY29kZXIgb2JqZWN0IGZvciBIdWZmbWFuIGVuY29kaW5nLgorICoKKyAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKKyAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQzMiBwdXRfYnVmZmVyOwkJLyogY3VycmVudCBiaXQtYWNjdW11bGF0aW9uIGJ1ZmZlciAqLworICBpbnQgcHV0X2JpdHM7CQkJLyogIyBvZiBiaXRzIG5vdyBpbiBpdCAqLworICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCit9IHNhdmFibGVfc3RhdGU7CisKKy8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KKyAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQorICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgorICovCisKKyNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgorI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCisjZWxzZQorI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAorCSgoZGVzdCkucHV0X2J1ZmZlciA9IChzcmMpLnB1dF9idWZmZXIsIFwKKwkgKGRlc3QpLnB1dF9iaXRzID0gKHNyYykucHV0X2JpdHMsIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzBdID0gKHNyYykubGFzdF9kY192YWxbMF0sIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzFdID0gKHNyYykubGFzdF9kY192YWxbMV0sIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzJdID0gKHNyYykubGFzdF9kY192YWxbMl0sIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzNdID0gKHNyYykubGFzdF9kY192YWxbM10pCisjZW5kaWYKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIHNhdmFibGVfc3RhdGUgc2F2ZWQ7CQkvKiBCaXQgYnVmZmVyICYgREMgc3RhdGUgYXQgc3RhcnQgb2YgTUNVICovCisKKyAgLyogVGhlc2UgZmllbGRzIGFyZSBOT1QgbG9hZGVkIGludG8gbG9jYWwgd29ya2luZyBzdGF0ZS4gKi8KKyAgdW5zaWduZWQgaW50IHJlc3RhcnRzX3RvX2dvOwkvKiBNQ1VzIGxlZnQgaW4gdGhpcyByZXN0YXJ0IGludGVydmFsICovCisgIGludCBuZXh0X3Jlc3RhcnRfbnVtOwkJLyogbmV4dCByZXN0YXJ0IG51bWJlciB0byB3cml0ZSAoMC03KSAqLworCisgIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCisgIGNfZGVyaXZlZF90YmwgKiBkY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisgIGNfZGVyaXZlZF90YmwgKiBhY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQJLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbiAqLworICBsb25nICogZGNfY291bnRfcHRyc1tOVU1fSFVGRl9UQkxTXTsKKyAgbG9uZyAqIGFjX2NvdW50X3B0cnNbTlVNX0hVRkZfVEJMU107CisjZW5kaWYKK30gaHVmZl9lbnRyb3B5X2VuY29kZXI7CisKK3R5cGVkZWYgaHVmZl9lbnRyb3B5X2VuY29kZXIgKiBodWZmX2VudHJvcHlfcHRyOworCisvKiBXb3JraW5nIHN0YXRlIHdoaWxlIHdyaXRpbmcgYW4gTUNVLgorICogVGhpcyBzdHJ1Y3QgY29udGFpbnMgYWxsIHRoZSBmaWVsZHMgdGhhdCBhcmUgbmVlZGVkIGJ5IHN1YnJvdXRpbmVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworICBzYXZhYmxlX3N0YXRlIGN1cjsJCS8qIEN1cnJlbnQgYml0IGJ1ZmZlciAmIERDIHN0YXRlICovCisgIGpfY29tcHJlc3NfcHRyIGNpbmZvOwkJLyogZHVtcF9idWZmZXIgbmVlZHMgYWNjZXNzIHRvIHRoaXMgKi8KK30gd29ya2luZ19zdGF0ZTsKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfaHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQlKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CitNRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfaHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECitNRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9nYXRoZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CitNRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyNlbmRpZgorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgorICogSWYgZ2F0aGVyX3N0YXRpc3RpY3MgaXMgVFJVRSwgd2UgZG8gbm90IG91dHB1dCBhbnl0aGluZyBkdXJpbmcgdGhlIHNjYW4sCisgKiBqdXN0IGNvdW50IHRoZSBIdWZmbWFuIHN5bWJvbHMgdXNlZCBhbmQgZ2VuZXJhdGUgSHVmZm1hbiBjb2RlIHRhYmxlcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IGNpLCBkY3RibCwgYWN0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgeworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9nYXRoZXI7CisgICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfZ2F0aGVyOworI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfaHVmZjsKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19odWZmOworICB9CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOworICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgeworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdGFibGUgaW5kZXhlcyAqLworICAgICAgLyogKG1ha2VfY19kZXJpdmVkX3RibCBkb2VzIHRoaXMgaW4gdGhlIG90aGVyIHBhdGgpICovCisgICAgICBpZiAoZGN0YmwgPCAwIHx8IGRjdGJsID49IE5VTV9IVUZGX1RCTFMpCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgZGN0YmwpOworICAgICAgaWYgKGFjdGJsIDwgMCB8fCBhY3RibCA+PSBOVU1fSFVGRl9UQkxTKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIGFjdGJsKTsKKyAgICAgIC8qIEFsbG9jYXRlIGFuZCB6ZXJvIHRoZSBzdGF0aXN0aWNzIHRhYmxlcyAqLworICAgICAgLyogTm90ZSB0aGF0IGpwZWdfZ2VuX29wdGltYWxfdGFibGUgZXhwZWN0cyAyNTcgZW50cmllcyBpbiBlYWNoIHRhYmxlISAqLworICAgICAgaWYgKGVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdID09IE5VTEwpCisJZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0gPSAobG9uZyAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOworICAgICAgTUVNWkVSTyhlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSwgMjU3ICogU0laRU9GKGxvbmcpKTsKKyAgICAgIGlmIChlbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSA9PSBOVUxMKQorCWVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdID0gKGxvbmcgKikKKwkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgMjU3ICogU0laRU9GKGxvbmcpKTsKKyAgICAgIE1FTVpFUk8oZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgLyogQ29tcHV0ZSBkZXJpdmVkIHZhbHVlcyBmb3IgSHVmZm1hbiB0YWJsZXMgKi8KKyAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCisgICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgZGN0YmwsCisJCQkgICAgICAmIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tkY3RibF0pOworICAgICAganBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCBhY3RibCwKKwkJCSAgICAgICYgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2FjdGJsXSk7CisgICAgfQorICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLworICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIH0KKworICAvKiBJbml0aWFsaXplIGJpdCBidWZmZXIgdG8gZW1wdHkgKi8KKyAgZW50cm9weS0+c2F2ZWQucHV0X2J1ZmZlciA9IDA7CisgIGVudHJvcHktPnNhdmVkLnB1dF9iaXRzID0gMDsKKworICAvKiBJbml0aWFsaXplIHJlc3RhcnQgc3R1ZmYgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSA9IDA7Cit9CisKKworLyoKKyAqIENvbXB1dGUgdGhlIGRlcml2ZWQgdmFsdWVzIGZvciBhIEh1ZmZtYW4gdGFibGUuCisgKiBUaGlzIHJvdXRpbmUgYWxzbyBwZXJmb3JtcyBzb21lIHZhbGlkYXRpb24gY2hlY2tzIG9uIHRoZSB0YWJsZS4KKyAqCisgKiBOb3RlIHRoaXMgaXMgYWxzbyB1c2VkIGJ5IGpjcGh1ZmYuYy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCisJCQkgY19kZXJpdmVkX3RibCAqKiBwZHRibCkKK3sKKyAgSkhVRkZfVEJMICpodGJsOworICBjX2Rlcml2ZWRfdGJsICpkdGJsOworICBpbnQgcCwgaSwgbCwgbGFzdHAsIHNpLCBtYXhzeW1ib2w7CisgIGNoYXIgaHVmZnNpemVbMjU3XTsKKyAgdW5zaWduZWQgaW50IGh1ZmZjb2RlWzI1N107CisgIHVuc2lnbmVkIGludCBjb2RlOworCisgIC8qIE5vdGUgdGhhdCBodWZmc2l6ZVtdIGFuZCBodWZmY29kZVtdIGFyZSBmaWxsZWQgaW4gY29kZS1sZW5ndGggb3JkZXIsCisgICAqIHBhcmFsbGVsaW5nIHRoZSBvcmRlciBvZiB0aGUgc3ltYm9scyB0aGVtc2VsdmVzIGluIGh0YmwtPmh1ZmZ2YWxbXS4KKyAgICovCisKKyAgLyogRmluZCB0aGUgaW5wdXQgSHVmZm1hbiB0YWJsZSAqLworICBpZiAodGJsbm8gPCAwIHx8IHRibG5vID49IE5VTV9IVUZGX1RCTFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOworICBodGJsID0KKyAgICBpc0RDID8gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dIDogY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dOworICBpZiAoaHRibCA9PSBOVUxMKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKKworICAvKiBBbGxvY2F0ZSBhIHdvcmtzcGFjZSBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzby4gKi8KKyAgaWYgKCpwZHRibCA9PSBOVUxMKQorICAgICpwZHRibCA9IChjX2Rlcml2ZWRfdGJsICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKGNfZGVyaXZlZF90YmwpKTsKKyAgZHRibCA9ICpwZHRibDsKKyAgCisgIC8qIEZpZ3VyZSBDLjE6IG1ha2UgdGFibGUgb2YgSHVmZm1hbiBjb2RlIGxlbmd0aCBmb3IgZWFjaCBzeW1ib2wgKi8KKworICBwID0gMDsKKyAgZm9yIChsID0gMTsgbCA8PSAxNjsgbCsrKSB7CisgICAgaSA9IChpbnQpIGh0YmwtPmJpdHNbbF07CisgICAgaWYgKGkgPCAwIHx8IHAgKyBpID4gMjU2KQkvKiBwcm90ZWN0IGFnYWluc3QgdGFibGUgb3ZlcnJ1biAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7CisgICAgd2hpbGUgKGktLSkKKyAgICAgIGh1ZmZzaXplW3ArK10gPSAoY2hhcikgbDsKKyAgfQorICBodWZmc2l6ZVtwXSA9IDA7CisgIGxhc3RwID0gcDsKKyAgCisgIC8qIEZpZ3VyZSBDLjI6IGdlbmVyYXRlIHRoZSBjb2RlcyB0aGVtc2VsdmVzICovCisgIC8qIFdlIGFsc28gdmFsaWRhdGUgdGhhdCB0aGUgY291bnRzIHJlcHJlc2VudCBhIGxlZ2FsIEh1ZmZtYW4gY29kZSB0cmVlLiAqLworCisgIGNvZGUgPSAwOworICBzaSA9IGh1ZmZzaXplWzBdOworICBwID0gMDsKKyAgd2hpbGUgKGh1ZmZzaXplW3BdKSB7CisgICAgd2hpbGUgKCgoaW50KSBodWZmc2l6ZVtwXSkgPT0gc2kpIHsKKyAgICAgIGh1ZmZjb2RlW3ArK10gPSBjb2RlOworICAgICAgY29kZSsrOworICAgIH0KKyAgICAvKiBjb2RlIGlzIG5vdyAxIG1vcmUgdGhhbiB0aGUgbGFzdCBjb2RlIHVzZWQgZm9yIGNvZGVsZW5ndGggc2k7IGJ1dAorICAgICAqIGl0IG11c3Qgc3RpbGwgZml0IGluIHNpIGJpdHMsIHNpbmNlIG5vIGNvZGUgaXMgYWxsb3dlZCB0byBiZSBhbGwgb25lcy4KKyAgICAgKi8KKyAgICBpZiAoKChJTlQzMikgY29kZSkgPj0gKCgoSU5UMzIpIDEpIDw8IHNpKSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworICAgIGNvZGUgPDw9IDE7CisgICAgc2krKzsKKyAgfQorICAKKyAgLyogRmlndXJlIEMuMzogZ2VuZXJhdGUgZW5jb2RpbmcgdGFibGVzICovCisgIC8qIFRoZXNlIGFyZSBjb2RlIGFuZCBzaXplIGluZGV4ZWQgYnkgc3ltYm9sIHZhbHVlICovCisKKyAgLyogU2V0IGFsbCBjb2RlbGVzcyBzeW1ib2xzIHRvIGhhdmUgY29kZSBsZW5ndGggMDsKKyAgICogdGhpcyBsZXRzIHVzIGRldGVjdCBkdXBsaWNhdGUgVkFMIGVudHJpZXMgaGVyZSwgYW5kIGxhdGVyCisgICAqIGFsbG93cyBlbWl0X2JpdHMgdG8gZGV0ZWN0IGFueSBhdHRlbXB0IHRvIGVtaXQgc3VjaCBzeW1ib2xzLgorICAgKi8KKyAgTUVNWkVSTyhkdGJsLT5laHVmc2ksIFNJWkVPRihkdGJsLT5laHVmc2kpKTsKKworICAvKiBUaGlzIGlzIGFsc28gYSBjb252ZW5pZW50IHBsYWNlIHRvIGNoZWNrIGZvciBvdXQtb2YtcmFuZ2UKKyAgICogYW5kIGR1cGxpY2F0ZWQgVkFMIGVudHJpZXMuICBXZSBhbGxvdyAwLi4yNTUgZm9yIEFDIHN5bWJvbHMKKyAgICogYnV0IG9ubHkgMC4uMTUgZm9yIERDLiAgKFdlIGNvdWxkIGNvbnN0cmFpbiB0aGVtIGZ1cnRoZXIKKyAgICogYmFzZWQgb24gZGF0YSBkZXB0aCBhbmQgbW9kZSwgYnV0IHRoaXMgc2VlbXMgZW5vdWdoLikKKyAgICovCisgIG1heHN5bWJvbCA9IGlzREMgPyAxNSA6IDI1NTsKKworICBmb3IgKHAgPSAwOyBwIDwgbGFzdHA7IHArKykgeworICAgIGkgPSBodGJsLT5odWZmdmFsW3BdOworICAgIGlmIChpIDwgMCB8fCBpID4gbWF4c3ltYm9sIHx8IGR0YmwtPmVodWZzaVtpXSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworICAgIGR0YmwtPmVodWZjb1tpXSA9IGh1ZmZjb2RlW3BdOworICAgIGR0YmwtPmVodWZzaVtpXSA9IGh1ZmZzaXplW3BdOworICB9Cit9CisKKworLyogT3V0cHV0dGluZyBieXRlcyB0byB0aGUgZmlsZSAqLworCisvKiBFbWl0IGEgYnl0ZSwgdGFraW5nICdhY3Rpb24nIGlmIG11c3Qgc3VzcGVuZC4gKi8KKyNkZWZpbmUgZW1pdF9ieXRlKHN0YXRlLHZhbCxhY3Rpb24pICBcCisJeyAqKHN0YXRlKS0+bmV4dF9vdXRwdXRfYnl0ZSsrID0gKEpPQ1RFVCkgKHZhbCk7ICBcCisJICBpZiAoLS0oc3RhdGUpLT5mcmVlX2luX2J1ZmZlciA9PSAwKSAgXAorCSAgICBpZiAoISBkdW1wX2J1ZmZlcihzdGF0ZSkpICBcCisJICAgICAgeyBhY3Rpb247IH0gfQorCisKK0xPQ0FMKGJvb2xlYW4pCitkdW1wX2J1ZmZlciAod29ya2luZ19zdGF0ZSAqIHN0YXRlKQorLyogRW1wdHkgdGhlIG91dHB1dCBidWZmZXI7IHJldHVybiBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIG11c3Qgc3VzcGVuZCAqLworeworICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKiBkZXN0ID0gc3RhdGUtPmNpbmZvLT5kZXN0OworCisgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKHN0YXRlLT5jaW5mbykpCisgICAgcmV0dXJuIEZBTFNFOworICAvKiBBZnRlciBhIHN1Y2Nlc3NmdWwgYnVmZmVyIGR1bXAsIG11c3QgcmVzZXQgYnVmZmVyIHBvaW50ZXJzICovCisgIHN0YXRlLT5uZXh0X291dHB1dF9ieXRlID0gZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgc3RhdGUtPmZyZWVfaW5fYnVmZmVyID0gZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qIE91dHB1dHRpbmcgYml0cyB0byB0aGUgZmlsZSAqLworCisvKiBPbmx5IHRoZSByaWdodCAyNCBiaXRzIG9mIHB1dF9idWZmZXIgYXJlIHVzZWQ7IHRoZSB2YWxpZCBiaXRzIGFyZQorICogbGVmdC1qdXN0aWZpZWQgaW4gdGhpcyBwYXJ0LiAgQXQgbW9zdCAxNiBiaXRzIGNhbiBiZSBwYXNzZWQgdG8gZW1pdF9iaXRzCisgKiBpbiBvbmUgY2FsbCwgYW5kIHdlIG5ldmVyIHJldGFpbiBtb3JlIHRoYW4gNyBiaXRzIGluIHB1dF9idWZmZXIKKyAqIGJldHdlZW4gY2FsbHMsIHNvIDI0IGJpdHMgYXJlIHN1ZmZpY2llbnQuCisgKi8KKworSU5MSU5FCitMT0NBTChib29sZWFuKQorZW1pdF9iaXRzICh3b3JraW5nX3N0YXRlICogc3RhdGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKKy8qIEVtaXQgc29tZSBiaXRzOyByZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBpZiBtdXN0IHN1c3BlbmQgKi8KK3sKKyAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgdGlnaHRseS4gKi8KKyAgcmVnaXN0ZXIgSU5UMzIgcHV0X2J1ZmZlciA9IChJTlQzMikgY29kZTsKKyAgcmVnaXN0ZXIgaW50IHB1dF9iaXRzID0gc3RhdGUtPmN1ci5wdXRfYml0czsKKworICAvKiBpZiBzaXplIGlzIDAsIGNhbGxlciB1c2VkIGFuIGludmFsaWQgSHVmZm1hbiB0YWJsZSBlbnRyeSAqLworICBpZiAoc2l6ZSA9PSAwKQorICAgIEVSUkVYSVQoc3RhdGUtPmNpbmZvLCBKRVJSX0hVRkZfTUlTU0lOR19DT0RFKTsKKworICBwdXRfYnVmZmVyICY9ICgoKElOVDMyKSAxKTw8c2l6ZSkgLSAxOyAvKiBtYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiBjb2RlICovCisgIAorICBwdXRfYml0cyArPSBzaXplOwkJLyogbmV3IG51bWJlciBvZiBiaXRzIGluIGJ1ZmZlciAqLworICAKKyAgcHV0X2J1ZmZlciA8PD0gMjQgLSBwdXRfYml0czsgLyogYWxpZ24gaW5jb21pbmcgYml0cyAqLworCisgIHB1dF9idWZmZXIgfD0gc3RhdGUtPmN1ci5wdXRfYnVmZmVyOyAvKiBhbmQgbWVyZ2Ugd2l0aCBvbGQgYnVmZmVyIGNvbnRlbnRzICovCisgIAorICB3aGlsZSAocHV0X2JpdHMgPj0gOCkgeworICAgIGludCBjID0gKGludCkgKChwdXRfYnVmZmVyID4+IDE2KSAmIDB4RkYpOworICAgIAorICAgIGVtaXRfYnl0ZShzdGF0ZSwgYywgcmV0dXJuIEZBTFNFKTsKKyAgICBpZiAoYyA9PSAweEZGKSB7CQkvKiBuZWVkIHRvIHN0dWZmIGEgemVybyBieXRlPyAqLworICAgICAgZW1pdF9ieXRlKHN0YXRlLCAwLCByZXR1cm4gRkFMU0UpOworICAgIH0KKyAgICBwdXRfYnVmZmVyIDw8PSA4OworICAgIHB1dF9iaXRzIC09IDg7CisgIH0KKworICBzdGF0ZS0+Y3VyLnB1dF9idWZmZXIgPSBwdXRfYnVmZmVyOyAvKiB1cGRhdGUgc3RhdGUgdmFyaWFibGVzICovCisgIHN0YXRlLT5jdXIucHV0X2JpdHMgPSBwdXRfYml0czsKKworICByZXR1cm4gVFJVRTsKK30KKworCitMT0NBTChib29sZWFuKQorZmx1c2hfYml0cyAod29ya2luZ19zdGF0ZSAqIHN0YXRlKQoreworICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIDB4N0YsIDcpKSAvKiBmaWxsIGFueSBwYXJ0aWFsIGJ5dGUgd2l0aCBvbmVzICovCisgICAgcmV0dXJuIEZBTFNFOworICBzdGF0ZS0+Y3VyLnB1dF9idWZmZXIgPSAwOwkvKiBhbmQgcmVzZXQgYml0LWJ1ZmZlciB0byBlbXB0eSAqLworICBzdGF0ZS0+Y3VyLnB1dF9iaXRzID0gMDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyogRW5jb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCisKK0xPQ0FMKGJvb2xlYW4pCitlbmNvZGVfb25lX2Jsb2NrICh3b3JraW5nX3N0YXRlICogc3RhdGUsIEpDT0VGUFRSIGJsb2NrLCBpbnQgbGFzdF9kY192YWwsCisJCSAgY19kZXJpdmVkX3RibCAqZGN0YmwsIGNfZGVyaXZlZF90YmwgKmFjdGJsKQoreworICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7CisgIHJlZ2lzdGVyIGludCBuYml0czsKKyAgcmVnaXN0ZXIgaW50IGssIHIsIGk7CisgIAorICAvKiBFbmNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgcGVyIHNlY3Rpb24gRi4xLjIuMSAqLworICAKKyAgdGVtcCA9IHRlbXAyID0gYmxvY2tbMF0gLSBsYXN0X2RjX3ZhbDsKKworICBpZiAodGVtcCA8IDApIHsKKyAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgIC8qIEZvciBhIG5lZ2F0aXZlIGlucHV0LCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhpbnB1dCkgKi8KKyAgICAvKiBUaGlzIGNvZGUgYXNzdW1lcyB3ZSBhcmUgb24gYSB0d28ncyBjb21wbGVtZW50IG1hY2hpbmUgKi8KKyAgICB0ZW1wMi0tOworICB9CisgIAorICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCisgIG5iaXRzID0gMDsKKyAgd2hpbGUgKHRlbXApIHsKKyAgICBuYml0cysrOworICAgIHRlbXAgPj49IDE7CisgIH0KKyAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCisgICAqIFNpbmNlIHdlJ3JlIGVuY29kaW5nIGEgZGlmZmVyZW5jZSwgdGhlIHJhbmdlIGxpbWl0IGlzIHR3aWNlIGFzIG11Y2guCisgICAqLworICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCisgICAgRVJSRVhJVChzdGF0ZS0+Y2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKyAgCisgIC8qIEVtaXQgdGhlIEh1ZmZtYW4tY29kZWQgc3ltYm9sIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KKyAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBkY3RibC0+ZWh1ZmNvW25iaXRzXSwgZGN0YmwtPmVodWZzaVtuYml0c10pKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KKyAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCisgIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLworICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBGLjEuMi4yICovCisgIAorICByID0gMDsJCQkvKiByID0gcnVuIGxlbmd0aCBvZiB6ZXJvcyAqLworICAKKyAgZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKKyAgICBpZiAoKHRlbXAgPSBibG9ja1tqcGVnX25hdHVyYWxfb3JkZXJba11dKSA9PSAwKSB7CisgICAgICByKys7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGlmIHJ1biBsZW5ndGggPiAxNSwgbXVzdCBlbWl0IHNwZWNpYWwgcnVuLWxlbmd0aC0xNiBjb2RlcyAoMHhGMCkgKi8KKyAgICAgIHdoaWxlIChyID4gMTUpIHsKKwlpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGFjdGJsLT5laHVmY29bMHhGMF0sIGFjdGJsLT5laHVmc2lbMHhGMF0pKQorCSAgcmV0dXJuIEZBTFNFOworCXIgLT0gMTY7CisgICAgICB9CisKKyAgICAgIHRlbXAyID0gdGVtcDsKKyAgICAgIGlmICh0ZW1wIDwgMCkgeworCXRlbXAgPSAtdGVtcDsJCS8qIHRlbXAgaXMgYWJzIHZhbHVlIG9mIGlucHV0ICovCisJLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisJdGVtcDItLTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgICAgbmJpdHMgPSAxOwkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgMSBiaXQgKi8KKyAgICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCisJbmJpdHMrKzsKKyAgICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKQorCUVSUkVYSVQoc3RhdGUtPmNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgICAgICAKKyAgICAgIC8qIEVtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgICAgaSA9IChyIDw8IDQpICsgbmJpdHM7CisgICAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGFjdGJsLT5laHVmY29baV0sIGFjdGJsLT5laHVmc2lbaV0pKQorCXJldHVybiBGQUxTRTsKKworICAgICAgLyogRW1pdCB0aGF0IG51bWJlciBvZiBiaXRzIG9mIHRoZSB2YWx1ZSwgaWYgcG9zaXRpdmUsICovCisgICAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KKyAgICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIHIgPSAwOworICAgIH0KKyAgfQorCisgIC8qIElmIHRoZSBsYXN0IGNvZWYocykgd2VyZSB6ZXJvLCBlbWl0IGFuIGVuZC1vZi1ibG9jayBjb2RlICovCisgIGlmIChyID4gMCkKKyAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGFjdGJsLT5laHVmY29bMF0sIGFjdGJsLT5laHVmc2lbMF0pKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBFbWl0IGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIHByZWRpY3Rpb25zLgorICovCisKK0xPQ0FMKGJvb2xlYW4pCitlbWl0X3Jlc3RhcnQgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgaW50IHJlc3RhcnRfbnVtKQoreworICBpbnQgY2k7CisKKyAgaWYgKCEgZmx1c2hfYml0cyhzdGF0ZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGVtaXRfYnl0ZShzdGF0ZSwgMHhGRiwgcmV0dXJuIEZBTFNFKTsKKyAgZW1pdF9ieXRlKHN0YXRlLCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSwgcmV0dXJuIEZBTFNFKTsKKworICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgc3RhdGUtPmNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorICAgIHN0YXRlLT5jdXIubGFzdF9kY192YWxbY2ldID0gMDsKKworICAvKiBUaGUgcmVzdGFydCBjb3VudGVyIGlzIG5vdCB1cGRhdGVkIHVudGlsIHdlIHN1Y2Nlc3NmdWxseSB3cml0ZSB0aGUgTUNVLiAqLworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBFbmNvZGUgYW5kIG91dHB1dCBvbmUgTUNVJ3Mgd29ydGggb2YgSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgd29ya2luZ19zdGF0ZSBzdGF0ZTsKKyAgaW50IGJsa24sIGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKworICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgc3RhdGUubmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBzdGF0ZS5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKyAgQVNTSUdOX1NUQVRFKHN0YXRlLmN1ciwgZW50cm9weS0+c2F2ZWQpOworICBzdGF0ZS5jaW5mbyA9IGNpbmZvOworCisgIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgZW1pdF9yZXN0YXJ0KCZzdGF0ZSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSkpCisJcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGlmICghIGVuY29kZV9vbmVfYmxvY2soJnN0YXRlLAorCQkJICAgTUNVX2RhdGFbYmxrbl1bMF0sIHN0YXRlLmN1ci5sYXN0X2RjX3ZhbFtjaV0sCisJCQkgICBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbY29tcHB0ci0+ZGNfdGJsX25vXSwKKwkJCSAgIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5hY190Ymxfbm9dKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvKiBVcGRhdGUgbGFzdF9kY192YWwgKi8KKyAgICBzdGF0ZS5jdXIubGFzdF9kY192YWxbY2ldID0gTUNVX2RhdGFbYmxrbl1bMF1bMF07CisgIH0KKworICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBzdGF0ZS5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBzdGF0ZS5mcmVlX2luX2J1ZmZlcjsKKyAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZS5jdXIpOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgd29ya2luZ19zdGF0ZSBzdGF0ZTsKKworICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgLi4uIGZsdXNoX2JpdHMgbmVlZHMgaXQgKi8KKyAgc3RhdGUubmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBzdGF0ZS5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKyAgQVNTSUdOX1NUQVRFKHN0YXRlLmN1ciwgZW50cm9weS0+c2F2ZWQpOworICBzdGF0ZS5jaW5mbyA9IGNpbmZvOworCisgIC8qIEZsdXNoIG91dCB0aGUgbGFzdCBkYXRhICovCisgIGlmICghIGZsdXNoX2JpdHMoJnN0YXRlKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisKKyAgLyogVXBkYXRlIHN0YXRlICovCisgIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gc3RhdGUubmV4dF9vdXRwdXRfYnl0ZTsKKyAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gc3RhdGUuZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUuY3VyKTsKK30KKworCisvKgorICogSHVmZm1hbiBjb2Rpbmcgb3B0aW1pemF0aW9uLgorICoKKyAqIFdlIGZpcnN0IHNjYW4gdGhlIHN1cHBsaWVkIGRhdGEgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgdXNlcyBvZiBlYWNoIHN5bWJvbAorICogdGhhdCBpcyB0byBiZSBIdWZmbWFuLWNvZGVkLiAoVGhpcyBwcm9jZXNzIE1VU1QgYWdyZWUgd2l0aCB0aGUgY29kZSBhYm92ZS4pCisgKiBUaGVuIHdlIGJ1aWxkIGEgSHVmZm1hbiBjb2RpbmcgdHJlZSBmb3IgdGhlIG9ic2VydmVkIGNvdW50cy4KKyAqIFN5bWJvbHMgd2hpY2ggYXJlIG5vdCBuZWVkZWQgYXQgYWxsIGZvciB0aGUgcGFydGljdWxhciBpbWFnZSBhcmUgbm90CisgKiBhc3NpZ25lZCBhbnkgY29kZSwgd2hpY2ggc2F2ZXMgc3BhY2UgaW4gdGhlIERIVCBtYXJrZXIgYXMgd2VsbCBhcyBpbgorICogdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAqLworCisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisKKworLyogUHJvY2VzcyBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCitMT0NBTCh2b2lkKQoraHRlc3Rfb25lX2Jsb2NrIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkNPRUZQVFIgYmxvY2ssIGludCBsYXN0X2RjX3ZhbCwKKwkJIGxvbmcgZGNfY291bnRzW10sIGxvbmcgYWNfY291bnRzW10pCit7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCBrLCByOworICAKKyAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEYuMS4yLjEgKi8KKyAgCisgIHRlbXAgPSBibG9ja1swXSAtIGxhc3RfZGNfdmFsOworICBpZiAodGVtcCA8IDApCisgICAgdGVtcCA9IC10ZW1wOworICAKKyAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICBuYml0cyA9IDA7CisgIHdoaWxlICh0ZW1wKSB7CisgICAgbmJpdHMrKzsKKyAgICB0ZW1wID4+PSAxOworICB9CisgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzLgorICAgKiBTaW5jZSB3ZSdyZSBlbmNvZGluZyBhIGRpZmZlcmVuY2UsIHRoZSByYW5nZSBsaW1pdCBpcyB0d2ljZSBhcyBtdWNoLgorICAgKi8KKyAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUysxKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKworICAvKiBDb3VudCB0aGUgSHVmZm1hbiBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLworICBkY19jb3VudHNbbmJpdHNdKys7CisgIAorICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBGLjEuMi4yICovCisgIAorICByID0gMDsJCQkvKiByID0gcnVuIGxlbmd0aCBvZiB6ZXJvcyAqLworICAKKyAgZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKKyAgICBpZiAoKHRlbXAgPSBibG9ja1tqcGVnX25hdHVyYWxfb3JkZXJba11dKSA9PSAwKSB7CisgICAgICByKys7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGlmIHJ1biBsZW5ndGggPiAxNSwgbXVzdCBlbWl0IHNwZWNpYWwgcnVuLWxlbmd0aC0xNiBjb2RlcyAoMHhGMCkgKi8KKyAgICAgIHdoaWxlIChyID4gMTUpIHsKKwlhY19jb3VudHNbMHhGMF0rKzsKKwlyIC09IDE2OworICAgICAgfQorICAgICAgCisgICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCisgICAgICBpZiAodGVtcCA8IDApCisJdGVtcCA9IC10ZW1wOworICAgICAgCisgICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCisgICAgICBuYml0cyA9IDE7CQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLworICAgICAgd2hpbGUgKCh0ZW1wID4+PSAxKSkKKwluYml0cysrOworICAgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KKyAgICAgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMpCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOworICAgICAgCisgICAgICAvKiBDb3VudCBIdWZmbWFuIHN5bWJvbCBmb3IgcnVuIGxlbmd0aCAvIG51bWJlciBvZiBiaXRzICovCisgICAgICBhY19jb3VudHNbKHIgPDwgNCkgKyBuYml0c10rKzsKKyAgICAgIAorICAgICAgciA9IDA7CisgICAgfQorICB9CisKKyAgLyogSWYgdGhlIGxhc3QgY29lZihzKSB3ZXJlIHplcm8sIGVtaXQgYW4gZW5kLW9mLWJsb2NrIGNvZGUgKi8KKyAgaWYgKHIgPiAwKQorICAgIGFjX2NvdW50c1swXSsrOworfQorCisKKy8qCisgKiBUcmlhbC1lbmNvZGUgb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCisgKiBObyBkYXRhIGlzIGFjdHVhbGx5IG91dHB1dCwgc28gbm8gc3VzcGVuc2lvbiByZXR1cm4gaXMgcG9zc2libGUuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitlbmNvZGVfbWN1X2dhdGhlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IGJsa24sIGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKworICAvKiBUYWtlIGNhcmUgb2YgcmVzdGFydCBpbnRlcnZhbHMgaWYgbmVlZGVkICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7CisgICAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorCWVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgICAgICAvKiBVcGRhdGUgcmVzdGFydCBzdGF0ZSAqLworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBodGVzdF9vbmVfYmxvY2soY2luZm8sIE1DVV9kYXRhW2Jsa25dWzBdLCBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0sCisJCSAgICBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2NvbXBwdHItPmRjX3RibF9ub10sCisJCSAgICBlbnRyb3B5LT5hY19jb3VudF9wdHJzW2NvbXBwdHItPmFjX3RibF9ub10pOworICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IE1DVV9kYXRhW2Jsa25dWzBdWzBdOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIEdlbmVyYXRlIHRoZSBiZXN0IEh1ZmZtYW4gY29kZSB0YWJsZSBmb3IgdGhlIGdpdmVuIGNvdW50cywgZmlsbCBodGJsLgorICogTm90ZSB0aGlzIGlzIGFsc28gdXNlZCBieSBqY3BodWZmLmMuCisgKgorICogVGhlIEpQRUcgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBubyBzeW1ib2wgYmUgYXNzaWduZWQgYSBjb2Rld29yZCBvZiBhbGwKKyAqIG9uZSBiaXRzIChzbyB0aGF0IHBhZGRpbmcgYml0cyBhZGRlZCBhdCB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCBzZWdtZW50CisgKiBjYW4ndCBsb29rIGxpa2UgYSB2YWxpZCBjb2RlKS4gIEJlY2F1c2Ugb2YgdGhlIGNhbm9uaWNhbCBvcmRlcmluZyBvZgorICogY29kZXdvcmRzLCB0aGlzIGp1c3QgbWVhbnMgdGhhdCB0aGVyZSBtdXN0IGJlIGFuIHVudXNlZCBzbG90IGluIHRoZQorICogbG9uZ2VzdCBjb2Rld29yZCBsZW5ndGggY2F0ZWdvcnkuICBTZWN0aW9uIEsuMiBvZiB0aGUgSlBFRyBzcGVjIHN1Z2dlc3RzCisgKiByZXNlcnZpbmcgc3VjaCBhIHNsb3QgYnkgcHJldGVuZGluZyB0aGF0IHN5bWJvbCAyNTYgaXMgYSB2YWxpZCBzeW1ib2wKKyAqIHdpdGggY291bnQgMS4gIEluIHRoZW9yeSB0aGF0J3Mgbm90IG9wdGltYWw7IGdpdmluZyBpdCBjb3VudCB6ZXJvIGJ1dAorICogaW5jbHVkaW5nIGl0IGluIHRoZSBzeW1ib2wgc2V0IGFueXdheSBzaG91bGQgZ2l2ZSBhIGJldHRlciBIdWZmbWFuIGNvZGUuCisgKiBCdXQgdGhlIHRoZW9yZXRpY2FsbHkgYmV0dGVyIGNvZGUgYWN0dWFsbHkgc2VlbXMgdG8gY29tZSBvdXQgd29yc2UgaW4KKyAqIHByYWN0aWNlLCBiZWNhdXNlIGl0IHByb2R1Y2VzIG1vcmUgYWxsLW9uZXMgYnl0ZXMgKHdoaWNoIGluY3VyIHN0dWZmZWQKKyAqIHplcm8gYnl0ZXMgaW4gdGhlIGZpbmFsIGZpbGUpLiAgSW4gYW55IGNhc2UgdGhlIGRpZmZlcmVuY2UgaXMgdGlueS4KKyAqCisgKiBUaGUgSlBFRyBzdGFuZGFyZCByZXF1aXJlcyBIdWZmbWFuIGNvZGVzIHRvIGJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIGxvbmcuCisgKiBJZiBzb21lIHN5bWJvbHMgaGF2ZSBhIHZlcnkgc21hbGwgYnV0IG5vbnplcm8gcHJvYmFiaWxpdHksIHRoZSBIdWZmbWFuIHRyZWUKKyAqIG11c3QgYmUgYWRqdXN0ZWQgdG8gbWVldCB0aGUgY29kZSBsZW5ndGggcmVzdHJpY3Rpb24uICBXZSBjdXJyZW50bHkgdXNlCisgKiB0aGUgYWRqdXN0bWVudCBtZXRob2Qgc3VnZ2VzdGVkIGluIEpQRUcgc2VjdGlvbiBLLjIuICBUaGlzIG1ldGhvZCBpcyAqbm90KgorICogb3B0aW1hbDsgaXQgbWF5IG5vdCBjaG9vc2UgdGhlIGJlc3QgcG9zc2libGUgbGltaXRlZC1sZW5ndGggY29kZS4gIEJ1dAorICogdHlwaWNhbGx5IG9ubHkgdmVyeS1sb3ctZnJlcXVlbmN5IHN5bWJvbHMgd2lsbCBiZSBnaXZlbiBsZXNzLXRoYW4tb3B0aW1hbAorICogbGVuZ3Rocywgc28gdGhlIGNvZGUgaXMgYWxtb3N0IG9wdGltYWwuICBFeHBlcmltZW50YWwgY29tcGFyaXNvbnMgYWdhaW5zdAorICogYW4gb3B0aW1hbCBsaW1pdGVkLWxlbmd0aC1jb2RlIGFsZ29yaXRobSBpbmRpY2F0ZSB0aGF0IHRoZSBkaWZmZXJlbmNlIGlzCisgKiBtaWNyb3Njb3BpYyAtLS0gdXN1YWxseSBsZXNzIHRoYW4gYSBodW5kcmVkdGggb2YgYSBwZXJjZW50IG9mIHRvdGFsIHNpemUuCisgKiBTbyB0aGUgZXh0cmEgY29tcGxleGl0eSBvZiBhbiBvcHRpbWFsIGFsZ29yaXRobSBkb2Vzbid0IHNlZW0gd29ydGh3aGlsZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZ2VuX29wdGltYWxfdGFibGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKSFVGRl9UQkwgKiBodGJsLCBsb25nIGZyZXFbXSkKK3sKKyNkZWZpbmUgTUFYX0NMRU4gMzIJCS8qIGFzc3VtZWQgbWF4aW11bSBpbml0aWFsIGNvZGUgbGVuZ3RoICovCisgIFVJTlQ4IGJpdHNbTUFYX0NMRU4rMV07CS8qIGJpdHNba10gPSAjIG9mIHN5bWJvbHMgd2l0aCBjb2RlIGxlbmd0aCBrICovCisgIGludCBjb2Rlc2l6ZVsyNTddOwkJLyogY29kZXNpemVba10gPSBjb2RlIGxlbmd0aCBvZiBzeW1ib2wgayAqLworICBpbnQgb3RoZXJzWzI1N107CQkvKiBuZXh0IHN5bWJvbCBpbiBjdXJyZW50IGJyYW5jaCBvZiB0cmVlICovCisgIGludCBjMSwgYzI7CisgIGludCBwLCBpLCBqOworICBsb25nIHY7CisKKyAgLyogVGhpcyBhbGdvcml0aG0gaXMgZXhwbGFpbmVkIGluIHNlY3Rpb24gSy4yIG9mIHRoZSBKUEVHIHN0YW5kYXJkICovCisKKyAgTUVNWkVSTyhiaXRzLCBTSVpFT0YoYml0cykpOworICBNRU1aRVJPKGNvZGVzaXplLCBTSVpFT0YoY29kZXNpemUpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI1NzsgaSsrKQorICAgIG90aGVyc1tpXSA9IC0xOwkJLyogaW5pdCBsaW5rcyB0byBlbXB0eSAqLworICAKKyAgZnJlcVsyNTZdID0gMTsJCS8qIG1ha2Ugc3VyZSAyNTYgaGFzIGEgbm9uemVybyBjb3VudCAqLworICAvKiBJbmNsdWRpbmcgdGhlIHBzZXVkby1zeW1ib2wgMjU2IGluIHRoZSBIdWZmbWFuIHByb2NlZHVyZSBndWFyYW50ZWVzCisgICAqIHRoYXQgbm8gcmVhbCBzeW1ib2wgaXMgZ2l2ZW4gY29kZS12YWx1ZSBvZiBhbGwgb25lcywgYmVjYXVzZSAyNTYKKyAgICogd2lsbCBiZSBwbGFjZWQgbGFzdCBpbiB0aGUgbGFyZ2VzdCBjb2Rld29yZCBjYXRlZ29yeS4KKyAgICovCisKKyAgLyogSHVmZm1hbidzIGJhc2ljIGFsZ29yaXRobSB0byBhc3NpZ24gb3B0aW1hbCBjb2RlIGxlbmd0aHMgdG8gc3ltYm9scyAqLworCisgIGZvciAoOzspIHsKKyAgICAvKiBGaW5kIHRoZSBzbWFsbGVzdCBub256ZXJvIGZyZXF1ZW5jeSwgc2V0IGMxID0gaXRzIHN5bWJvbCAqLworICAgIC8qIEluIGNhc2Ugb2YgdGllcywgdGFrZSB0aGUgbGFyZ2VyIHN5bWJvbCBudW1iZXIgKi8KKyAgICBjMSA9IC0xOworICAgIHYgPSAxMDAwMDAwMDAwTDsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NjsgaSsrKSB7CisgICAgICBpZiAoZnJlcVtpXSAmJiBmcmVxW2ldIDw9IHYpIHsKKwl2ID0gZnJlcVtpXTsKKwljMSA9IGk7CisgICAgICB9CisgICAgfQorCisgICAgLyogRmluZCB0aGUgbmV4dCBzbWFsbGVzdCBub256ZXJvIGZyZXF1ZW5jeSwgc2V0IGMyID0gaXRzIHN5bWJvbCAqLworICAgIC8qIEluIGNhc2Ugb2YgdGllcywgdGFrZSB0aGUgbGFyZ2VyIHN5bWJvbCBudW1iZXIgKi8KKyAgICBjMiA9IC0xOworICAgIHYgPSAxMDAwMDAwMDAwTDsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NjsgaSsrKSB7CisgICAgICBpZiAoZnJlcVtpXSAmJiBmcmVxW2ldIDw9IHYgJiYgaSAhPSBjMSkgeworCXYgPSBmcmVxW2ldOworCWMyID0gaTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEb25lIGlmIHdlJ3ZlIG1lcmdlZCBldmVyeXRoaW5nIGludG8gb25lIGZyZXF1ZW5jeSAqLworICAgIGlmIChjMiA8IDApCisgICAgICBicmVhazsKKyAgICAKKyAgICAvKiBFbHNlIG1lcmdlIHRoZSB0d28gY291bnRzL3RyZWVzICovCisgICAgZnJlcVtjMV0gKz0gZnJlcVtjMl07CisgICAgZnJlcVtjMl0gPSAwOworCisgICAgLyogSW5jcmVtZW50IHRoZSBjb2Rlc2l6ZSBvZiBldmVyeXRoaW5nIGluIGMxJ3MgdHJlZSBicmFuY2ggKi8KKyAgICBjb2Rlc2l6ZVtjMV0rKzsKKyAgICB3aGlsZSAob3RoZXJzW2MxXSA+PSAwKSB7CisgICAgICBjMSA9IG90aGVyc1tjMV07CisgICAgICBjb2Rlc2l6ZVtjMV0rKzsKKyAgICB9CisgICAgCisgICAgb3RoZXJzW2MxXSA9IGMyOwkJLyogY2hhaW4gYzIgb250byBjMSdzIHRyZWUgYnJhbmNoICovCisgICAgCisgICAgLyogSW5jcmVtZW50IHRoZSBjb2Rlc2l6ZSBvZiBldmVyeXRoaW5nIGluIGMyJ3MgdHJlZSBicmFuY2ggKi8KKyAgICBjb2Rlc2l6ZVtjMl0rKzsKKyAgICB3aGlsZSAob3RoZXJzW2MyXSA+PSAwKSB7CisgICAgICBjMiA9IG90aGVyc1tjMl07CisgICAgICBjb2Rlc2l6ZVtjMl0rKzsKKyAgICB9CisgIH0KKworICAvKiBOb3cgY291bnQgdGhlIG51bWJlciBvZiBzeW1ib2xzIG9mIGVhY2ggY29kZSBsZW5ndGggKi8KKyAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgeworICAgIGlmIChjb2Rlc2l6ZVtpXSkgeworICAgICAgLyogVGhlIEpQRUcgc3RhbmRhcmQgc2VlbXMgdG8gdGhpbmsgdGhhdCB0aGlzIGNhbid0IGhhcHBlbiwgKi8KKyAgICAgIC8qIGJ1dCBJJ20gcGFyYW5vaWQuLi4gKi8KKyAgICAgIGlmIChjb2Rlc2l6ZVtpXSA+IE1BWF9DTEVOKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfSFVGRl9DTEVOX09WRVJGTE9XKTsKKworICAgICAgYml0c1tjb2Rlc2l6ZVtpXV0rKzsKKyAgICB9CisgIH0KKworICAvKiBKUEVHIGRvZXNuJ3QgYWxsb3cgc3ltYm9scyB3aXRoIGNvZGUgbGVuZ3RocyBvdmVyIDE2IGJpdHMsIHNvIGlmIHRoZSBwdXJlCisgICAqIEh1ZmZtYW4gcHJvY2VkdXJlIGFzc2lnbmVkIGFueSBzdWNoIGxlbmd0aHMsIHdlIG11c3QgYWRqdXN0IHRoZSBjb2RpbmcuCisgICAqIEhlcmUgaXMgd2hhdCB0aGUgSlBFRyBzcGVjIHNheXMgYWJvdXQgaG93IHRoaXMgbmV4dCBiaXQgd29ya3M6CisgICAqIFNpbmNlIHN5bWJvbHMgYXJlIHBhaXJlZCBmb3IgdGhlIGxvbmdlc3QgSHVmZm1hbiBjb2RlLCB0aGUgc3ltYm9scyBhcmUKKyAgICogcmVtb3ZlZCBmcm9tIHRoaXMgbGVuZ3RoIGNhdGVnb3J5IHR3byBhdCBhIHRpbWUuICBUaGUgcHJlZml4IGZvciB0aGUgcGFpcgorICAgKiAod2hpY2ggaXMgb25lIGJpdCBzaG9ydGVyKSBpcyBhbGxvY2F0ZWQgdG8gb25lIG9mIHRoZSBwYWlyOyB0aGVuLAorICAgKiBza2lwcGluZyB0aGUgQklUUyBlbnRyeSBmb3IgdGhhdCBwcmVmaXggbGVuZ3RoLCBhIGNvZGUgd29yZCBmcm9tIHRoZSBuZXh0CisgICAqIHNob3J0ZXN0IG5vbnplcm8gQklUUyBlbnRyeSBpcyBjb252ZXJ0ZWQgaW50byBhIHByZWZpeCBmb3IgdHdvIGNvZGUgd29yZHMKKyAgICogb25lIGJpdCBsb25nZXIuCisgICAqLworICAKKyAgZm9yIChpID0gTUFYX0NMRU47IGkgPiAxNjsgaS0tKSB7CisgICAgd2hpbGUgKGJpdHNbaV0gPiAwKSB7CisgICAgICBqID0gaSAtIDI7CQkvKiBmaW5kIGxlbmd0aCBvZiBuZXcgcHJlZml4IHRvIGJlIHVzZWQgKi8KKyAgICAgIHdoaWxlIChiaXRzW2pdID09IDApCisJai0tOworICAgICAgCisgICAgICBiaXRzW2ldIC09IDI7CQkvKiByZW1vdmUgdHdvIHN5bWJvbHMgKi8KKyAgICAgIGJpdHNbaS0xXSsrOwkJLyogb25lIGdvZXMgaW4gdGhpcyBsZW5ndGggKi8KKyAgICAgIGJpdHNbaisxXSArPSAyOwkJLyogdHdvIG5ldyBzeW1ib2xzIGluIHRoaXMgbGVuZ3RoICovCisgICAgICBiaXRzW2pdLS07CQkvKiBzeW1ib2wgb2YgdGhpcyBsZW5ndGggaXMgbm93IGEgcHJlZml4ICovCisgICAgfQorICB9CisKKyAgLyogUmVtb3ZlIHRoZSBjb3VudCBmb3IgdGhlIHBzZXVkby1zeW1ib2wgMjU2IGZyb20gdGhlIGxhcmdlc3QgY29kZWxlbmd0aCAqLworICB3aGlsZSAoYml0c1tpXSA9PSAwKQkJLyogZmluZCBsYXJnZXN0IGNvZGVsZW5ndGggc3RpbGwgaW4gdXNlICovCisgICAgaS0tOworICBiaXRzW2ldLS07CisgIAorICAvKiBSZXR1cm4gZmluYWwgc3ltYm9sIGNvdW50cyAob25seSBmb3IgbGVuZ3RocyAwLi4xNikgKi8KKyAgTUVNQ09QWShodGJsLT5iaXRzLCBiaXRzLCBTSVpFT0YoaHRibC0+Yml0cykpOworICAKKyAgLyogUmV0dXJuIGEgbGlzdCBvZiB0aGUgc3ltYm9scyBzb3J0ZWQgYnkgY29kZSBsZW5ndGggKi8KKyAgLyogSXQncyBub3QgcmVhbCBjbGVhciB0byBtZSB3aHkgd2UgZG9uJ3QgbmVlZCB0byBjb25zaWRlciB0aGUgY29kZWxlbmd0aAorICAgKiBjaGFuZ2VzIG1hZGUgYWJvdmUsIGJ1dCB0aGUgSlBFRyBzcGVjIHNlZW1zIHRvIHRoaW5rIHRoaXMgd29ya3MuCisgICAqLworICBwID0gMDsKKyAgZm9yIChpID0gMTsgaSA8PSBNQVhfQ0xFTjsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykgeworICAgICAgaWYgKGNvZGVzaXplW2pdID09IGkpIHsKKwlodGJsLT5odWZmdmFsW3BdID0gKFVJTlQ4KSBqOworCXArKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBTZXQgc2VudF90YWJsZSBGQUxTRSBzbyB1cGRhdGVkIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCisgIGh0YmwtPnNlbnRfdGFibGUgPSBGQUxTRTsKK30KKworCisvKgorICogRmluaXNoIHVwIGEgc3RhdGlzdGljcy1nYXRoZXJpbmcgcGFzcyBhbmQgY3JlYXRlIHRoZSBuZXcgSHVmZm1hbiB0YWJsZXMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzc19nYXRoZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaSwgZGN0YmwsIGFjdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKyAgSkhVRkZfVEJMICoqaHRibHB0cjsKKyAgYm9vbGVhbiBkaWRfZGNbTlVNX0hVRkZfVEJMU107CisgIGJvb2xlYW4gZGlkX2FjW05VTV9IVUZGX1RCTFNdOworCisgIC8qIEl0J3MgaW1wb3J0YW50IG5vdCB0byBhcHBseSBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIG1vcmUgdGhhbiBvbmNlCisgICAqIHBlciB0YWJsZSwgYmVjYXVzZSBpdCBjbG9iYmVycyB0aGUgaW5wdXQgZnJlcXVlbmN5IGNvdW50cyEKKyAgICovCisgIE1FTVpFUk8oZGlkX2RjLCBTSVpFT0YoZGlkX2RjKSk7CisgIE1FTVpFUk8oZGlkX2FjLCBTSVpFT0YoZGlkX2FjKSk7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOworICAgIGlmICghIGRpZF9kY1tkY3RibF0pIHsKKyAgICAgIGh0YmxwdHIgPSAmIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2RjdGJsXTsKKyAgICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorCSpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSk7CisgICAgICBkaWRfZGNbZGN0YmxdID0gVFJVRTsKKyAgICB9CisgICAgaWYgKCEgZGlkX2FjW2FjdGJsXSkgeworICAgICAgaHRibHB0ciA9ICYgY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbYWN0YmxdOworICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCisJKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAganBlZ19nZW5fb3B0aW1hbF90YWJsZShjaW5mbywgKmh0YmxwdHIsIGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdKTsKKyAgICAgIGRpZF9hY1thY3RibF0gPSBUUlVFOworICAgIH0KKyAgfQorfQorCisKKyNlbmRpZiAvKiBFTlRST1BZX09QVF9TVVBQT1JURUQgKi8KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZy4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2h1ZmZfZW5jb2RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weTsKKyAgaW50IGk7CisKKyAgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKGh1ZmZfZW50cm9weV9lbmNvZGVyKSk7CisgIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OworICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfaHVmZjsKKworICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2ldID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgICBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2ldID0gZW50cm9weS0+YWNfY291bnRfcHRyc1tpXSA9IE5VTEw7CisjZW5kaWYKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamNodWZmLmggYi9jb21tb24vanBlZy9qY2h1ZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTU5OWZjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamNodWZmLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIGpjaHVmZi5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGVudHJvcHkgZW5jb2Rpbmcgcm91dGluZXMKKyAqIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBzZXF1ZW50aWFsIGVuY29kZXIgKGpjaHVmZi5jKSBhbmQgdGhlCisgKiBwcm9ncmVzc2l2ZSBlbmNvZGVyIChqY3BodWZmLmMpLiAgTm8gb3RoZXIgbW9kdWxlcyBuZWVkIHRvIHNlZSB0aGVzZS4KKyAqLworCisvKiBUaGUgbGVnYWwgcmFuZ2Ugb2YgYSBEQ1QgY29lZmZpY2llbnQgaXMKKyAqICAtMTAyNCAuLiArMTAyMyAgZm9yIDgtYml0IGRhdGE7CisgKiAtMTYzODQgLi4gKzE2MzgzIGZvciAxMi1iaXQgZGF0YS4KKyAqIEhlbmNlIHRoZSBtYWduaXR1ZGUgc2hvdWxkIGFsd2F5cyBmaXQgaW4gMTAgb3IgMTQgYml0cyByZXNwZWN0aXZlbHkuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIE1BWF9DT0VGX0JJVFMgMTAKKyNlbHNlCisjZGVmaW5lIE1BWF9DT0VGX0JJVFMgMTQKKyNlbmRpZgorCisvKiBEZXJpdmVkIGRhdGEgY29uc3RydWN0ZWQgZm9yIGVhY2ggSHVmZm1hbiB0YWJsZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBlaHVmY29bMjU2XTsJLyogY29kZSBmb3IgZWFjaCBzeW1ib2wgKi8KKyAgY2hhciBlaHVmc2lbMjU2XTsJCS8qIGxlbmd0aCBvZiBjb2RlIGZvciBlYWNoIHN5bWJvbCAqLworICAvKiBJZiBubyBjb2RlIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgYSBzeW1ib2wgUywgZWh1ZnNpW1NdIGNvbnRhaW5zIDAgKi8KK30gY19kZXJpdmVkX3RibDsKKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsCWpNa0NEZXJpdmVkCisjZGVmaW5lIGpwZWdfZ2VuX29wdGltYWxfdGFibGUJakdlbk9wdFRibAorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworLyogRXhwYW5kIGEgSHVmZm1hbiB0YWJsZSBkZWZpbml0aW9uIGludG8gdGhlIGRlcml2ZWQgZm9ybWF0ICovCitFWFRFUk4odm9pZCkganBlZ19tYWtlX2NfZGVyaXZlZF90YmwKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKKwkgICAgIGNfZGVyaXZlZF90YmwgKiogcGR0YmwpKTsKKworLyogR2VuZXJhdGUgYW4gb3B0aW1hbCB0YWJsZSBkZWZpbml0aW9uIGdpdmVuIHRoZSBzcGVjaWZpZWQgY291bnRzICovCitFWFRFUk4odm9pZCkganBlZ19nZW5fb3B0aW1hbF90YWJsZQorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpIVUZGX1RCTCAqIGh0YmwsIGxvbmcgZnJlcVtdKSk7CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qY2luaXQuYyBiL2NvbW1vbi9qcGVnL2pjaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZmZmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qY2luaXQuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogamNpbml0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgdGhlIEpQRUcgY29tcHJlc3Nvci4KKyAqIFRoaXMgcm91dGluZSBpcyBpbiBjaGFyZ2Ugb2Ygc2VsZWN0aW5nIHRoZSBtb2R1bGVzIHRvIGJlIGV4ZWN1dGVkIGFuZAorICogbWFraW5nIGFuIGluaXRpYWxpemF0aW9uIGNhbGwgdG8gZWFjaCBvbmUuCisgKgorICogTG9naWNhbGx5LCB0aGlzIGNvZGUgYmVsb25ncyBpbiBqY21hc3Rlci5jLiAgSXQncyBzcGxpdCBvdXQgYmVjYXVzZQorICogbGlua2luZyB0aGlzIHJvdXRpbmUgaW1wbGllcyBsaW5raW5nIHRoZSBlbnRpcmUgY29tcHJlc3Npb24gbGlicmFyeS4KKyAqIEZvciBhIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgamNtYXN0ZXIuYworICogd2l0aG91dCBsaW5raW5nIGluIHRoZSB3aG9sZSBsaWJyYXJ5LgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogTWFzdGVyIHNlbGVjdGlvbiBvZiBjb21wcmVzc2lvbiBtb2R1bGVzLgorICogVGhpcyBpcyBkb25lIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIHByb2Nlc3NpbmcgYW4gaW1hZ2UuICBXZSBkZXRlcm1pbmUKKyAqIHdoaWNoIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgaW5pdGlhbGl6YXRpb24gY2FsbHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9jb21wcmVzc19tYXN0ZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBJbml0aWFsaXplIG1hc3RlciBjb250cm9sIChpbmNsdWRlcyBwYXJhbWV0ZXIgY2hlY2tpbmcvcHJvY2Vzc2luZykgKi8KKyAgamluaXRfY19tYXN0ZXJfY29udHJvbChjaW5mbywgRkFMU0UgLyogZnVsbCBjb21wcmVzc2lvbiAqLyk7CisKKyAgLyogUHJlcHJvY2Vzc2luZyAqLworICBpZiAoISBjaW5mby0+cmF3X2RhdGFfaW4pIHsKKyAgICBqaW5pdF9jb2xvcl9jb252ZXJ0ZXIoY2luZm8pOworICAgIGppbml0X2Rvd25zYW1wbGVyKGNpbmZvKTsKKyAgICBqaW5pdF9jX3ByZXBfY29udHJvbGxlcihjaW5mbywgRkFMU0UgLyogbmV2ZXIgbmVlZCBmdWxsIGJ1ZmZlciBoZXJlICovKTsKKyAgfQorICAvKiBGb3J3YXJkIERDVCAqLworICBqaW5pdF9mb3J3YXJkX2RjdChjaW5mbyk7CisgIC8qIEVudHJvcHkgZW5jb2Rpbmc6IGVpdGhlciBIdWZmbWFuIG9yIGFyaXRobWV0aWMgY29kaW5nLiAqLworICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0FSSVRIX05PVElNUEwpOworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgICBqaW5pdF9waHVmZl9lbmNvZGVyKGNpbmZvKTsKKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgIGppbml0X2h1ZmZfZW5jb2RlcihjaW5mbyk7CisgIH0KKworICAvKiBOZWVkIGEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIgaW4gYW55IG11bHRpLXBhc3MgbW9kZS4gKi8KKyAgamluaXRfY19jb2VmX2NvbnRyb2xsZXIoY2luZm8sCisJCShib29sZWFuKSAoY2luZm8tPm51bV9zY2FucyA+IDEgfHwgY2luZm8tPm9wdGltaXplX2NvZGluZykpOworICBqaW5pdF9jX21haW5fY29udHJvbGxlcihjaW5mbywgRkFMU0UgLyogbmV2ZXIgbmVlZCBmdWxsIGJ1ZmZlciBoZXJlICovKTsKKworICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKKworICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLworICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogV3JpdGUgdGhlIGRhdGFzdHJlYW0gaGVhZGVyIChTT0kpIGltbWVkaWF0ZWx5LgorICAgKiBGcmFtZSBhbmQgc2NhbiBoZWFkZXJzIGFyZSBwb3N0cG9uZWQgdGlsbCBsYXRlci4KKyAgICogVGhpcyBsZXRzIGFwcGxpY2F0aW9uIGluc2VydCBzcGVjaWFsIG1hcmtlcnMgYWZ0ZXIgdGhlIFNPSS4KKyAgICovCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV9oZWFkZXIpIChjaW5mbyk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qY21haW5jdC5jIGIvY29tbW9uL2pwZWcvamNtYWluY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDI3OWE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamNtYWluY3QuYwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIGpjbWFpbmN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciBmb3IgY29tcHJlc3Npb24uCisgKiBUaGUgbWFpbiBidWZmZXIgbGllcyBiZXR3ZWVuIHRoZSBwcmUtcHJvY2Vzc29yIGFuZCB0aGUgSlBFRworICogY29tcHJlc3NvciBwcm9wZXI7IGl0IGhvbGRzIGRvd25zYW1wbGVkIGRhdGEgaW4gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogTm90ZTogY3VycmVudGx5LCB0aGVyZSBpcyBubyBvcGVyYXRpbmcgbW9kZSBpbiB3aGljaCBhIGZ1bGwtaW1hZ2UgYnVmZmVyCisgKiBpcyBuZWVkZWQgYXQgdGhpcyBzdGVwLiAgSWYgdGhlcmUgd2VyZSwgdGhhdCBtb2RlIGNvdWxkIG5vdCBiZSB1c2VkIHdpdGgKKyAqICJyYXcgZGF0YSIgaW5wdXQsIHNpbmNlIHRoaXMgbW9kdWxlIGlzIGJ5cGFzc2VkIGluIHRoYXQgY2FzZS4gIEhvd2V2ZXIsCisgKiB3ZSd2ZSBsZWZ0IHRoZSBjb2RlIGhlcmUgZm9yIHBvc3NpYmxlIHVzZSBpbiBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KKyAqLworI3VuZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisKKworLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBKRElNRU5TSU9OIGN1cl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIGN1cnJlbnQgaU1DVSByb3cgKi8KKyAgSkRJTUVOU0lPTiByb3dncm91cF9jdHI7CS8qIGNvdW50cyByb3cgZ3JvdXBzIHJlY2VpdmVkIGluIGlNQ1Ugcm93ICovCisgIGJvb2xlYW4gc3VzcGVuZGVkOwkJLyogcmVtZW1iZXIgaWYgd2Ugc3VzcGVuZGVkIG91dHB1dCAqLworICBKX0JVRl9NT0RFIHBhc3NfbW9kZTsJCS8qIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgKi8KKworICAvKiBJZiB1c2luZyBqdXN0IGEgc3RyaXAgYnVmZmVyLCB0aGlzIHBvaW50cyB0byB0aGUgZW50aXJlIHNldCBvZiBidWZmZXJzCisgICAqICh3ZSBhbGxvY2F0ZSBvbmUgZm9yIGVhY2ggY29tcG9uZW50KS4gIEluIHRoZSBmdWxsLWltYWdlIGNhc2UsIHRoaXMKKyAgICogcG9pbnRzIHRvIHRoZSBjdXJyZW50bHkgYWNjZXNzaWJsZSBzdHJpcHMgb2YgdGhlIHZpcnR1YWwgYXJyYXlzLgorICAgKi8KKyAgSlNBTVBBUlJBWSBidWZmZXJbTUFYX0NPTVBPTkVOVFNdOworCisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKyAgLyogSWYgdXNpbmcgZnVsbC1pbWFnZSBzdG9yYWdlLCB0aGlzIGFycmF5IGhvbGRzIHBvaW50ZXJzIHRvIHZpcnR1YWwtYXJyYXkKKyAgICogY29udHJvbCBibG9ja3MgZm9yIGVhY2ggY29tcG9uZW50LiAgVW51c2VkIGlmIG5vdCBmdWxsLWltYWdlIHN0b3JhZ2UuCisgICAqLworICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKKyNlbmRpZgorfSBteV9tYWluX2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfbWFpbl9jb250cm9sbGVyICogbXlfbWFpbl9wdHI7CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4KKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKKwkgICAgIEpESU1FTlNJT04gKmluX3Jvd19jdHIsIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkpOworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECitNRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX2J1ZmZlcl9tYWluCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJICAgICBKRElNRU5TSU9OICppbl9yb3dfY3RyLCBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpKTsKKyNlbmRpZgorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKworICAvKiBEbyBub3RoaW5nIGluIHJhdy1kYXRhIG1vZGUuICovCisgIGlmIChjaW5mby0+cmF3X2RhdGFfaW4pCisgICAgcmV0dXJuOworCisgIG1haW4tPmN1cl9pTUNVX3JvdyA9IDA7CS8qIGluaXRpYWxpemUgY291bnRlcnMgKi8KKyAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKKyAgbWFpbi0+c3VzcGVuZGVkID0gRkFMU0U7CisgIG1haW4tPnBhc3NfbW9kZSA9IHBhc3NfbW9kZTsJLyogc2F2ZSBtb2RlIGZvciB1c2UgYnkgcHJvY2Vzc19kYXRhICovCisKKyAgc3dpdGNoIChwYXNzX21vZGUpIHsKKyAgY2FzZSBKQlVGX1BBU1NfVEhSVToKKyNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorICAgIGlmIChtYWluLT53aG9sZV9pbWFnZVswXSAhPSBOVUxMKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworI2VuZGlmCisgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbjsKKyAgICBicmVhazsKKyNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorICBjYXNlIEpCVUZfU0FWRV9TT1VSQ0U6CisgIGNhc2UgSkJVRl9DUkFOS19ERVNUOgorICBjYXNlIEpCVUZfU0FWRV9BTkRfUEFTUzoKKyAgICBpZiAobWFpbi0+d2hvbGVfaW1hZ2VbMF0gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2J1ZmZlcl9tYWluOworICAgIGJyZWFrOworI2VuZGlmCisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgdGhlIHNpbXBsZSBwYXNzLXRocm91Z2ggbW9kZSwKKyAqIHdoZXJlIHdlIGhhdmUgb25seSBhIHN0cmlwIGJ1ZmZlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Byb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAorCQkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworCisgIHdoaWxlIChtYWluLT5jdXJfaU1DVV9yb3cgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7CisgICAgLyogUmVhZCBpbnB1dCBkYXRhIGlmIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBtYWluIGJ1ZmZlciB5ZXQgKi8KKyAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgRENUU0laRSkKKyAgICAgICgqY2luZm8tPnByZXAtPnByZV9wcm9jZXNzX2RhdGEpIChjaW5mbywKKwkJCQkJaW5wdXRfYnVmLCBpbl9yb3dfY3RyLCBpbl9yb3dzX2F2YWlsLAorCQkJCQltYWluLT5idWZmZXIsICZtYWluLT5yb3dncm91cF9jdHIsCisJCQkJCShKRElNRU5TSU9OKSBEQ1RTSVpFKTsKKworICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBmdWxsIGlNQ1Ugcm93IGJ1ZmZlcmVkLCByZXR1cm4gdG8gYXBwbGljYXRpb24gZm9yCisgICAgICogbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHByZXByb2Nlc3NvciB3aWxsIGFsd2F5cyBwYWQgdG8gZmlsbCB0aGUgaU1DVSByb3cKKyAgICAgKiBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZS4KKyAgICAgKi8KKyAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyICE9IERDVFNJWkUpCisgICAgICByZXR1cm47CisKKyAgICAvKiBTZW5kIHRoZSBjb21wbGV0ZWQgcm93IHRvIHRoZSBjb21wcmVzc29yICovCisgICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIpKSB7CisgICAgICAvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCB0aGVuIHdlIG11c3QgbmVlZCB0bworICAgICAgICogc3VzcGVuZCBwcm9jZXNzaW5nIGFuZCByZXR1cm4gdG8gdGhlIGFwcGxpY2F0aW9uLiAgSW4gdGhpcyBzaXR1YXRpb24KKyAgICAgICAqIHdlIHByZXRlbmQgd2UgZGlkbid0IHlldCBjb25zdW1lIHRoZSBsYXN0IGlucHV0IHJvdzsgb3RoZXJ3aXNlLCBpZgorICAgICAgICogaXQgaGFwcGVuZWQgdG8gYmUgdGhlIGxhc3Qgcm93IG9mIHRoZSBpbWFnZSwgdGhlIGFwcGxpY2F0aW9uIHdvdWxkCisgICAgICAgKiB0aGluayB3ZSB3ZXJlIGRvbmUuCisgICAgICAgKi8KKyAgICAgIGlmICghIG1haW4tPnN1c3BlbmRlZCkgeworCSgqaW5fcm93X2N0ciktLTsKKwltYWluLT5zdXNwZW5kZWQgPSBUUlVFOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBXZSBkaWQgZmluaXNoIHRoZSByb3cuICBVbmRvIG91ciBsaXR0bGUgc3VzcGVuc2lvbiBoYWNrIGlmIGEgcHJldmlvdXMKKyAgICAgKiBjYWxsIHN1c3BlbmRlZDsgdGhlbiBtYXJrIHRoZSBtYWluIGJ1ZmZlciBlbXB0eS4KKyAgICAgKi8KKyAgICBpZiAobWFpbi0+c3VzcGVuZGVkKSB7CisgICAgICAoKmluX3Jvd19jdHIpKys7CisgICAgICBtYWluLT5zdXNwZW5kZWQgPSBGQUxTRTsKKyAgICB9CisgICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKKyAgICBtYWluLT5jdXJfaU1DVV9yb3crKzsKKyAgfQorfQorCisKKyNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEuCisgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBhbGwgb2YgdGhlIG1vZGVzIHRoYXQgdXNlIGEgZnVsbC1zaXplIGJ1ZmZlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Byb2Nlc3NfZGF0YV9idWZmZXJfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAorCQkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGJvb2xlYW4gd3JpdGluZyA9IChtYWluLT5wYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKTsKKworICB3aGlsZSAobWFpbi0+Y3VyX2lNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgeworICAgIC8qIFJlYWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVycyBpZiBhdCB0aGUgc3RhcnQgb2YgYW4gaU1DVSByb3cuICovCisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA9PSAwKSB7CisgICAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSAgIGNpKyssIGNvbXBwdHIrKykgeworCW1haW4tPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKwkgICgoal9jb21tb25fcHRyKSBjaW5mbywgbWFpbi0+d2hvbGVfaW1hZ2VbY2ldLAorCSAgIG1haW4tPmN1cl9pTUNVX3JvdyAqIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSksCisJICAgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSksIHdyaXRpbmcpOworICAgICAgfQorICAgICAgLyogSW4gYSByZWFkIHBhc3MsIHByZXRlbmQgd2UganVzdCByZWFkIHNvbWUgc291cmNlIGRhdGEuICovCisgICAgICBpZiAoISB3cml0aW5nKSB7CisJKmluX3Jvd19jdHIgKz0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKKwltYWluLT5yb3dncm91cF9jdHIgPSBEQ1RTSVpFOworICAgICAgfQorICAgIH0KKworICAgIC8qIElmIGEgd3JpdGUgcGFzcywgcmVhZCBpbnB1dCBkYXRhIHVudGlsIHRoZSBjdXJyZW50IGlNQ1Ugcm93IGlzIGZ1bGwuICovCisgICAgLyogTm90ZTogcHJlcHJvY2Vzc29yIHdpbGwgcGFkIGlmIG5lY2Vzc2FyeSB0byBmaWxsIHRoZSBsYXN0IGlNQ1Ugcm93LiAqLworICAgIGlmICh3cml0aW5nKSB7CisgICAgICAoKmNpbmZvLT5wcmVwLT5wcmVfcHJvY2Vzc19kYXRhKSAoY2luZm8sCisJCQkJCWlucHV0X2J1ZiwgaW5fcm93X2N0ciwgaW5fcm93c19hdmFpbCwKKwkJCQkJbWFpbi0+YnVmZmVyLCAmbWFpbi0+cm93Z3JvdXBfY3RyLAorCQkJCQkoSkRJTUVOU0lPTikgRENUU0laRSk7CisgICAgICAvKiBSZXR1cm4gdG8gYXBwbGljYXRpb24gaWYgd2UgbmVlZCBtb3JlIGRhdGEgdG8gZmlsbCB0aGUgaU1DVSByb3cuICovCisgICAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgRENUU0laRSkKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogRW1pdCBkYXRhLCB1bmxlc3MgdGhpcyBpcyBhIHNpbmstb25seSBwYXNzLiAqLworICAgIGlmIChtYWluLT5wYXNzX21vZGUgIT0gSkJVRl9TQVZFX1NPVVJDRSkgeworICAgICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIpKSB7CisJLyogSWYgY29tcHJlc3NvciBkaWQgbm90IGNvbnN1bWUgdGhlIHdob2xlIHJvdywgdGhlbiB3ZSBtdXN0IG5lZWQgdG8KKwkgKiBzdXNwZW5kIHByb2Nlc3NpbmcgYW5kIHJldHVybiB0byB0aGUgYXBwbGljYXRpb24uICBJbiB0aGlzIHNpdHVhdGlvbgorCSAqIHdlIHByZXRlbmQgd2UgZGlkbid0IHlldCBjb25zdW1lIHRoZSBsYXN0IGlucHV0IHJvdzsgb3RoZXJ3aXNlLCBpZgorCSAqIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBsYXN0IHJvdyBvZiB0aGUgaW1hZ2UsIHRoZSBhcHBsaWNhdGlvbiB3b3VsZAorCSAqIHRoaW5rIHdlIHdlcmUgZG9uZS4KKwkgKi8KKwlpZiAoISBtYWluLT5zdXNwZW5kZWQpIHsKKwkgICgqaW5fcm93X2N0ciktLTsKKwkgIG1haW4tPnN1c3BlbmRlZCA9IFRSVUU7CisJfQorCXJldHVybjsKKyAgICAgIH0KKyAgICAgIC8qIFdlIGRpZCBmaW5pc2ggdGhlIHJvdy4gIFVuZG8gb3VyIGxpdHRsZSBzdXNwZW5zaW9uIGhhY2sgaWYgYSBwcmV2aW91cworICAgICAgICogY2FsbCBzdXNwZW5kZWQ7IHRoZW4gbWFyayB0aGUgbWFpbiBidWZmZXIgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIGlmIChtYWluLT5zdXNwZW5kZWQpIHsKKwkoKmluX3Jvd19jdHIpKys7CisJbWFpbi0+c3VzcGVuZGVkID0gRkFMU0U7CisgICAgICB9CisgICAgfQorCisgICAgLyogSWYgZ2V0IGhlcmUsIHdlIGFyZSBkb25lIHdpdGggdGhpcyBpTUNVIHJvdy4gIE1hcmsgYnVmZmVyIGVtcHR5LiAqLworICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgICAgbWFpbi0+Y3VyX2lNQ1Vfcm93Kys7CisgIH0KK30KKworI2VuZGlmIC8qIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgbWFpbiBidWZmZXIgY29udHJvbGxlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2NfbWFpbl9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQoreworICBteV9tYWluX3B0ciBtYWluOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgbWFpbiA9IChteV9tYWluX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9tYWluX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPm1haW4gPSAoc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgKikgbWFpbjsKKyAgbWFpbi0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX21haW47CisKKyAgLyogV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSBidWZmZXIgaW4gcmF3LWRhdGEgbW9kZS4gKi8KKyAgaWYgKGNpbmZvLT5yYXdfZGF0YV9pbikKKyAgICByZXR1cm47CisKKyAgLyogQ3JlYXRlIHRoZSBidWZmZXIuICBJdCBob2xkcyBkb3duc2FtcGxlZCBkYXRhLCBzbyBlYWNoIGNvbXBvbmVudAorICAgKiBtYXkgYmUgb2YgYSBkaWZmZXJlbnQgc2l6ZS4KKyAgICovCisgIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7CisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKyAgICAvKiBBbGxvY2F0ZSBhIGZ1bGwtaW1hZ2UgdmlydHVhbCBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICAvKiBOb3RlIHdlIHBhZCB0aGUgYm90dG9tIHRvIGEgbXVsdGlwbGUgb2YgdGhlIGlNQ1UgaGVpZ2h0ICovCisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICBtYWluLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCisJIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpICogRENUU0laRSwKKwkgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIH0KKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworI2VuZGlmCisgIH0gZWxzZSB7CisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKyAgICBtYWluLT53aG9sZV9pbWFnZVswXSA9IE5VTEw7IC8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCisjZW5kaWYKKyAgICAvKiBBbGxvY2F0ZSBhIHN0cmlwIGJ1ZmZlciBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIG1haW4tPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAorCSAoSkRJTUVOU0lPTikgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qY21hcmtlci5jIGIvY29tbW9uL2pwZWcvamNtYXJrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDFlNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamNtYXJrZXIuYwpAQCAtMCwwICsxLDY2NCBAQAorLyoKKyAqIGpjbWFya2VyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBKUEVHIGRhdGFzdHJlYW0gbWFya2Vycy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKwordHlwZWRlZiBlbnVtIHsJCQkvKiBKUEVHIG1hcmtlciBjb2RlcyAqLworICBNX1NPRjAgID0gMHhjMCwKKyAgTV9TT0YxICA9IDB4YzEsCisgIE1fU09GMiAgPSAweGMyLAorICBNX1NPRjMgID0gMHhjMywKKyAgCisgIE1fU09GNSAgPSAweGM1LAorICBNX1NPRjYgID0gMHhjNiwKKyAgTV9TT0Y3ICA9IDB4YzcsCisgIAorICBNX0pQRyAgID0gMHhjOCwKKyAgTV9TT0Y5ICA9IDB4YzksCisgIE1fU09GMTAgPSAweGNhLAorICBNX1NPRjExID0gMHhjYiwKKyAgCisgIE1fU09GMTMgPSAweGNkLAorICBNX1NPRjE0ID0gMHhjZSwKKyAgTV9TT0YxNSA9IDB4Y2YsCisgIAorICBNX0RIVCAgID0gMHhjNCwKKyAgCisgIE1fREFDICAgPSAweGNjLAorICAKKyAgTV9SU1QwICA9IDB4ZDAsCisgIE1fUlNUMSAgPSAweGQxLAorICBNX1JTVDIgID0gMHhkMiwKKyAgTV9SU1QzICA9IDB4ZDMsCisgIE1fUlNUNCAgPSAweGQ0LAorICBNX1JTVDUgID0gMHhkNSwKKyAgTV9SU1Q2ICA9IDB4ZDYsCisgIE1fUlNUNyAgPSAweGQ3LAorICAKKyAgTV9TT0kgICA9IDB4ZDgsCisgIE1fRU9JICAgPSAweGQ5LAorICBNX1NPUyAgID0gMHhkYSwKKyAgTV9EUVQgICA9IDB4ZGIsCisgIE1fRE5MICAgPSAweGRjLAorICBNX0RSSSAgID0gMHhkZCwKKyAgTV9ESFAgICA9IDB4ZGUsCisgIE1fRVhQICAgPSAweGRmLAorICAKKyAgTV9BUFAwICA9IDB4ZTAsCisgIE1fQVBQMSAgPSAweGUxLAorICBNX0FQUDIgID0gMHhlMiwKKyAgTV9BUFAzICA9IDB4ZTMsCisgIE1fQVBQNCAgPSAweGU0LAorICBNX0FQUDUgID0gMHhlNSwKKyAgTV9BUFA2ICA9IDB4ZTYsCisgIE1fQVBQNyAgPSAweGU3LAorICBNX0FQUDggID0gMHhlOCwKKyAgTV9BUFA5ICA9IDB4ZTksCisgIE1fQVBQMTAgPSAweGVhLAorICBNX0FQUDExID0gMHhlYiwKKyAgTV9BUFAxMiA9IDB4ZWMsCisgIE1fQVBQMTMgPSAweGVkLAorICBNX0FQUDE0ID0gMHhlZSwKKyAgTV9BUFAxNSA9IDB4ZWYsCisgIAorICBNX0pQRzAgID0gMHhmMCwKKyAgTV9KUEcxMyA9IDB4ZmQsCisgIE1fQ09NICAgPSAweGZlLAorICAKKyAgTV9URU0gICA9IDB4MDEsCisgIAorICBNX0VSUk9SID0gMHgxMDAKK30gSlBFR19NQVJLRVI7CisKKworLyogUHJpdmF0ZSBzdGF0ZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgdW5zaWduZWQgaW50IGxhc3RfcmVzdGFydF9pbnRlcnZhbDsgLyogbGFzdCBEUkkgdmFsdWUgZW1pdHRlZDsgMCBhZnRlciBTT0kgKi8KK30gbXlfbWFya2VyX3dyaXRlcjsKKwordHlwZWRlZiBteV9tYXJrZXJfd3JpdGVyICogbXlfbWFya2VyX3B0cjsKKworCisvKgorICogQmFzaWMgb3V0cHV0IHJvdXRpbmVzLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBkbyBub3Qgc3VwcG9ydCBzdXNwZW5zaW9uIHdoaWxlIHdyaXRpbmcgYSBtYXJrZXIuCisgKiBUaGVyZWZvcmUsIGFuIGFwcGxpY2F0aW9uIHVzaW5nIHN1c3BlbnNpb24gbXVzdCBlbnN1cmUgdGhhdCB0aGVyZSBpcworICogZW5vdWdoIGJ1ZmZlciBzcGFjZSBmb3IgdGhlIGluaXRpYWwgbWFya2VycyAodHlwLiA2MDAtNzAwIGJ5dGVzKSBiZWZvcmUKKyAqIGNhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcywgYW5kIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgdHJhaWxpbmcgRU9JCisgKiAoYSBmZXcgYnl0ZXMpIGJlZm9yZSBjYWxsaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzLiAgTXVsdGlwYXNzIGNvbXByZXNzaW9uCisgKiBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZCBhdCBhbGwgd2l0aCBzdXNwZW5zaW9uLCBzbyB0aG9zZSB0d28gYXJlIHRoZSBvbmx5CisgKiBwb2ludHMgd2hlcmUgbWFya2VycyB3aWxsIGJlIHdyaXR0ZW4uCisgKi8KKworTE9DQUwodm9pZCkKK2VtaXRfYnl0ZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpCisvKiBFbWl0IGEgYnl0ZSAqLworeworICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKiBkZXN0ID0gY2luZm8tPmRlc3Q7CisKKyAgKihkZXN0LT5uZXh0X291dHB1dF9ieXRlKSsrID0gKEpPQ1RFVCkgdmFsOworICBpZiAoLS1kZXN0LT5mcmVlX2luX2J1ZmZlciA9PSAwKSB7CisgICAgaWYgKCEgKCpkZXN0LT5lbXB0eV9vdXRwdXRfYnVmZmVyKSAoY2luZm8pKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOworICB9Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfbWFya2VyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlBFR19NQVJLRVIgbWFyaykKKy8qIEVtaXQgYSBtYXJrZXIgY29kZSAqLworeworICBlbWl0X2J5dGUoY2luZm8sIDB4RkYpOworICBlbWl0X2J5dGUoY2luZm8sIChpbnQpIG1hcmspOworfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0XzJieXRlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWx1ZSkKKy8qIEVtaXQgYSAyLWJ5dGUgaW50ZWdlcjsgdGhlc2UgYXJlIGFsd2F5cyBNU0IgZmlyc3QgaW4gSlBFRyBmaWxlcyAqLworeworICBlbWl0X2J5dGUoY2luZm8sICh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICBlbWl0X2J5dGUoY2luZm8sIHZhbHVlICYgMHhGRik7Cit9CisKKworLyoKKyAqIFJvdXRpbmVzIHRvIHdyaXRlIHNwZWNpZmljIG1hcmtlciB0eXBlcy4KKyAqLworCitMT0NBTChpbnQpCitlbWl0X2RxdCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBpbmRleCkKKy8qIEVtaXQgYSBEUVQgbWFya2VyICovCisvKiBSZXR1cm5zIHRoZSBwcmVjaXNpb24gdXNlZCAoMCA9IDhiaXRzLCAxID0gMTZiaXRzKSBmb3IgYmFzZWxpbmUgY2hlY2tpbmcgKi8KK3sKKyAgSlFVQU5UX1RCTCAqIHF0YmwgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbaW5kZXhdOworICBpbnQgcHJlYzsKKyAgaW50IGk7CisKKyAgaWYgKHF0YmwgPT0gTlVMTCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19RVUFOVF9UQUJMRSwgaW5kZXgpOworCisgIHByZWMgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgIGlmIChxdGJsLT5xdWFudHZhbFtpXSA+IDI1NSkKKyAgICAgIHByZWMgPSAxOworICB9CisKKyAgaWYgKCEgcXRibC0+c2VudF90YWJsZSkgeworICAgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RRVCk7CisKKyAgICBlbWl0XzJieXRlcyhjaW5mbywgcHJlYyA/IERDVFNJWkUyKjIgKyAxICsgMiA6IERDVFNJWkUyICsgMSArIDIpOworCisgICAgZW1pdF9ieXRlKGNpbmZvLCBpbmRleCArIChwcmVjPDw0KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgICAgLyogVGhlIHRhYmxlIGVudHJpZXMgbXVzdCBiZSBlbWl0dGVkIGluIHppZ3phZyBvcmRlci4gKi8KKyAgICAgIHVuc2lnbmVkIGludCBxdmFsID0gcXRibC0+cXVhbnR2YWxbanBlZ19uYXR1cmFsX29yZGVyW2ldXTsKKyAgICAgIGlmIChwcmVjKQorCWVtaXRfYnl0ZShjaW5mbywgKGludCkgKHF2YWwgPj4gOCkpOworICAgICAgZW1pdF9ieXRlKGNpbmZvLCAoaW50KSAocXZhbCAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBxdGJsLT5zZW50X3RhYmxlID0gVFJVRTsKKyAgfQorCisgIHJldHVybiBwcmVjOworfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X2RodCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBpbmRleCwgYm9vbGVhbiBpc19hYykKKy8qIEVtaXQgYSBESFQgbWFya2VyICovCit7CisgIEpIVUZGX1RCTCAqIGh0Ymw7CisgIGludCBsZW5ndGgsIGk7CisgIAorICBpZiAoaXNfYWMpIHsKKyAgICBodGJsID0gY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOworICAgIGluZGV4ICs9IDB4MTA7CQkvKiBvdXRwdXQgaW5kZXggaGFzIEFDIGJpdCBzZXQgKi8KKyAgfSBlbHNlIHsKKyAgICBodGJsID0gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOworICB9CisKKyAgaWYgKGh0YmwgPT0gTlVMTCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCBpbmRleCk7CisgIAorICBpZiAoISBodGJsLT5zZW50X3RhYmxlKSB7CisgICAgZW1pdF9tYXJrZXIoY2luZm8sIE1fREhUKTsKKyAgICAKKyAgICBsZW5ndGggPSAwOworICAgIGZvciAoaSA9IDE7IGkgPD0gMTY7IGkrKykKKyAgICAgIGxlbmd0aCArPSBodGJsLT5iaXRzW2ldOworICAgIAorICAgIGVtaXRfMmJ5dGVzKGNpbmZvLCBsZW5ndGggKyAyICsgMSArIDE2KTsKKyAgICBlbWl0X2J5dGUoY2luZm8sIGluZGV4KTsKKyAgICAKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspCisgICAgICBlbWl0X2J5dGUoY2luZm8sIGh0YmwtPmJpdHNbaV0pOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgaHRibC0+aHVmZnZhbFtpXSk7CisgICAgCisgICAgaHRibC0+c2VudF90YWJsZSA9IFRSVUU7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9kYWMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRW1pdCBhIERBQyBtYXJrZXIgKi8KKy8qIFNpbmNlIHRoZSB1c2VmdWwgaW5mbyBpcyBzbyBzbWFsbCwgd2Ugd2FudCB0byBlbWl0IGFsbCB0aGUgdGFibGVzIGluICovCisvKiBvbmUgREFDIG1hcmtlci4gIFRoZXJlZm9yZSB0aGlzIHJvdXRpbmUgZG9lcyBpdHMgb3duIHNjYW4gb2YgdGhlIHRhYmxlLiAqLworeworI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAorICBjaGFyIGRjX2luX3VzZVtOVU1fQVJJVEhfVEJMU107CisgIGNoYXIgYWNfaW5fdXNlW05VTV9BUklUSF9UQkxTXTsKKyAgaW50IGxlbmd0aCwgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKQorICAgIGRjX2luX3VzZVtpXSA9IGFjX2luX3VzZVtpXSA9IDA7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXTsKKyAgICBkY19pbl91c2VbY29tcHB0ci0+ZGNfdGJsX25vXSA9IDE7CisgICAgYWNfaW5fdXNlW2NvbXBwdHItPmFjX3RibF9ub10gPSAxOworICB9CisgIAorICBsZW5ndGggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykKKyAgICBsZW5ndGggKz0gZGNfaW5fdXNlW2ldICsgYWNfaW5fdXNlW2ldOworICAKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fREFDKTsKKyAgCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCBsZW5ndGgqMiArIDIpOworICAKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspIHsKKyAgICBpZiAoZGNfaW5fdXNlW2ldKSB7CisgICAgICBlbWl0X2J5dGUoY2luZm8sIGkpOworICAgICAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+YXJpdGhfZGNfTFtpXSArIChjaW5mby0+YXJpdGhfZGNfVVtpXTw8NCkpOworICAgIH0KKyAgICBpZiAoYWNfaW5fdXNlW2ldKSB7CisgICAgICBlbWl0X2J5dGUoY2luZm8sIGkgKyAweDEwKTsKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmFyaXRoX2FjX0tbaV0pOworICAgIH0KKyAgfQorI2VuZGlmIC8qIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAqLworfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X2RyaSAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBFbWl0IGEgRFJJIG1hcmtlciAqLworeworICBlbWl0X21hcmtlcihjaW5mbywgTV9EUkkpOworICAKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIDQpOwkvKiBmaXhlZCBsZW5ndGggKi8KKworICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpOworfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X3NvZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpQRUdfTUFSS0VSIGNvZGUpCisvKiBFbWl0IGEgU09GIG1hcmtlciAqLworeworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIAorICBlbWl0X21hcmtlcihjaW5mbywgY29kZSk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgMyAqIGNpbmZvLT5udW1fY29tcG9uZW50cyArIDIgKyA1ICsgMSk7IC8qIGxlbmd0aCAqLworCisgIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBTT0YgZmllbGQgY2FuIGhhbmRsZSAqLworICBpZiAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgPiA2NTUzNUwgfHwKKyAgICAgIChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggPiA2NTUzNUwpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfSU1BR0VfVE9PX0JJRywgKHVuc2lnbmVkIGludCkgNjU1MzUpOworCisgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmRhdGFfcHJlY2lzaW9uKTsKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5pbWFnZV9oZWlnaHQpOworICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPmltYWdlX3dpZHRoKTsKKworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5udW1fY29tcG9uZW50cyk7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICBlbWl0X2J5dGUoY2luZm8sIGNvbXBwdHItPmNvbXBvbmVudF9pZCk7CisgICAgZW1pdF9ieXRlKGNpbmZvLCAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA8PCA0KSArIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgIGVtaXRfYnl0ZShjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X3NvcyAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBFbWl0IGEgU09TIG1hcmtlciAqLworeworICBpbnQgaSwgdGQsIHRhOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fU09TKTsKKyAgCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICogY2luZm8tPmNvbXBzX2luX3NjYW4gKyAyICsgMSArIDMpOyAvKiBsZW5ndGggKi8KKyAgCisgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmNvbXBzX2luX3NjYW4pOworICAKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9baV07CisgICAgZW1pdF9ieXRlKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQpOworICAgIHRkID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIHRhID0gY29tcHB0ci0+YWNfdGJsX25vOworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworICAgICAgLyogUHJvZ3Jlc3NpdmUgbW9kZTogb25seSBEQyBvciBvbmx5IEFDIHRhYmxlcyBhcmUgdXNlZCBpbiBvbmUgc2NhbjsKKyAgICAgICAqIGZ1cnRoZXJtb3JlLCBIdWZmbWFuIGNvZGluZyBvZiBEQyByZWZpbmVtZW50IHVzZXMgbm8gdGFibGUgYXQgYWxsLgorICAgICAgICogV2UgZW1pdCAwIGZvciB1bnVzZWQgZmllbGQocyk7IHRoaXMgaXMgcmVjb21tZW5kZWQgYnkgdGhlIFAmTSB0ZXh0CisgICAgICAgKiBidXQgZG9lcyBub3Qgc2VlbSB0byBiZSBzcGVjaWZpZWQgaW4gdGhlIHN0YW5kYXJkLgorICAgICAgICovCisgICAgICBpZiAoY2luZm8tPlNzID09IDApIHsKKwl0YSA9IDA7CQkJLyogREMgc2NhbiAqLworCWlmIChjaW5mby0+QWggIT0gMCAmJiAhY2luZm8tPmFyaXRoX2NvZGUpCisJICB0ZCA9IDA7CQkvKiBubyBEQyB0YWJsZSBlaXRoZXIgKi8KKyAgICAgIH0gZWxzZSB7CisJdGQgPSAwOwkJCS8qIEFDIHNjYW4gKi8KKyAgICAgIH0KKyAgICB9CisgICAgZW1pdF9ieXRlKGNpbmZvLCAodGQgPDwgNCkgKyB0YSk7CisgIH0KKworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5Tcyk7CisgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPlNlKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAoY2luZm8tPkFoIDw8IDQpICsgY2luZm8tPkFsKTsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9qZmlmX2FwcDAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRW1pdCBhIEpGSUYtY29tcGxpYW50IEFQUDAgbWFya2VyICovCit7CisgIC8qCisgICAqIExlbmd0aCBvZiBBUFAwIGJsb2NrCSgyIGJ5dGVzKQorICAgKiBCbG9jayBJRAkJCSg0IGJ5dGVzIC0gQVNDSUkgIkpGSUYiKQorICAgKiBaZXJvIGJ5dGUJCQkoMSBieXRlIHRvIHRlcm1pbmF0ZSB0aGUgSUQgc3RyaW5nKQorICAgKiBWZXJzaW9uIE1ham9yLCBNaW5vcgkoMiBieXRlcyAtIG1ham9yIGZpcnN0KQorICAgKiBVbml0cwkJCSgxIGJ5dGUgLSAweDAwID0gbm9uZSwgMHgwMSA9IGluY2gsIDB4MDIgPSBjbSkKKyAgICogWGRwdQkJCSgyIGJ5dGVzIC0gZG90cyBwZXIgdW5pdCBob3Jpem9udGFsKQorICAgKiBZZHB1CQkJKDIgYnl0ZXMgLSBkb3RzIHBlciB1bml0IHZlcnRpY2FsKQorICAgKiBUaHVtYm5haWwgWCBzaXplCQkoMSBieXRlKQorICAgKiBUaHVtYm5haWwgWSBzaXplCQkoMSBieXRlKQorICAgKi8KKyAgCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0FQUDApOworICAKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIDIgKyA0ICsgMSArIDIgKyAxICsgMiArIDIgKyAxICsgMSk7IC8qIGxlbmd0aCAqLworCisgIGVtaXRfYnl0ZShjaW5mbywgMHg0QSk7CS8qIElkZW50aWZpZXI6IEFTQ0lJICJKRklGIiAqLworICBlbWl0X2J5dGUoY2luZm8sIDB4NDYpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NDkpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NDYpOworICBlbWl0X2J5dGUoY2luZm8sIDApOworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24pOyAvKiBWZXJzaW9uIGZpZWxkcyAqLworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24pOworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5kZW5zaXR5X3VuaXQpOyAvKiBQaXhlbCBzaXplIGluZm9ybWF0aW9uICovCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+WF9kZW5zaXR5KTsKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5ZX2RlbnNpdHkpOworICBlbWl0X2J5dGUoY2luZm8sIDApOwkJLyogTm8gdGh1bWJuYWlsIGltYWdlICovCisgIGVtaXRfYnl0ZShjaW5mbywgMCk7Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfYWRvYmVfYXBwMTQgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRW1pdCBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgKi8KK3sKKyAgLyoKKyAgICogTGVuZ3RoIG9mIEFQUDE0IGJsb2NrCSgyIGJ5dGVzKQorICAgKiBCbG9jayBJRAkJCSg1IGJ5dGVzIC0gQVNDSUkgIkFkb2JlIikKKyAgICogVmVyc2lvbiBOdW1iZXIJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDEwMCkKKyAgICogRmxhZ3MwCQkJKDIgYnl0ZXMgLSBjdXJyZW50bHkgMCkKKyAgICogRmxhZ3MxCQkJKDIgYnl0ZXMgLSBjdXJyZW50bHkgMCkKKyAgICogQ29sb3IgdHJhbnNmb3JtCQkoMSBieXRlKQorICAgKgorICAgKiBBbHRob3VnaCBBZG9iZSBUTiA1MTE2IG1lbnRpb25zIFZlcnNpb24gPSAxMDEsIGFsbCB0aGUgQWRvYmUgZmlsZXMKKyAgICogbm93IGluIGNpcmN1bGF0aW9uIHNlZW0gdG8gdXNlIFZlcnNpb24gPSAxMDAsIHNvIHRoYXQncyB3aGF0IHdlIHdyaXRlLgorICAgKgorICAgKiBXZSB3cml0ZSB0aGUgY29sb3IgdHJhbnNmb3JtIGJ5dGUgYXMgMSBpZiB0aGUgSlBFRyBjb2xvciBzcGFjZSBpcworICAgKiBZQ2JDciwgMiBpZiBpdCdzIFlDQ0ssIDAgb3RoZXJ3aXNlLiAgQWRvYmUncyBkZWZpbml0aW9uIGhhcyB0byBkbyB3aXRoCisgICAqIHdoZXRoZXIgdGhlIGVuY29kZXIgcGVyZm9ybWVkIGEgdHJhbnNmb3JtYXRpb24sIHdoaWNoIGlzIHByZXR0eSB1c2VsZXNzLgorICAgKi8KKyAgCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0FQUDE0KTsKKyAgCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICsgNSArIDIgKyAyICsgMiArIDEpOyAvKiBsZW5ndGggKi8KKworICBlbWl0X2J5dGUoY2luZm8sIDB4NDEpOwkvKiBJZGVudGlmaWVyOiBBU0NJSSAiQWRvYmUiICovCisgIGVtaXRfYnl0ZShjaW5mbywgMHg2NCk7CisgIGVtaXRfYnl0ZShjaW5mbywgMHg2Rik7CisgIGVtaXRfYnl0ZShjaW5mbywgMHg2Mik7CisgIGVtaXRfYnl0ZShjaW5mbywgMHg2NSk7CisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAxMDApOwkvKiBWZXJzaW9uICovCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAwKTsJLyogRmxhZ3MwICovCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAwKTsJLyogRmxhZ3MxICovCisgIHN3aXRjaCAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgZW1pdF9ieXRlKGNpbmZvLCAxKTsJLyogQ29sb3IgdHJhbnNmb3JtID0gMSAqLworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ0NLOgorICAgIGVtaXRfYnl0ZShjaW5mbywgMik7CS8qIENvbG9yIHRyYW5zZm9ybSA9IDIgKi8KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBlbWl0X2J5dGUoY2luZm8sIDApOwkvKiBDb2xvciB0cmFuc2Zvcm0gPSAwICovCisgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogVGhlc2Ugcm91dGluZXMgYWxsb3cgd3JpdGluZyBhbiBhcmJpdHJhcnkgbWFya2VyIHdpdGggcGFyYW1ldGVycy4KKyAqIFRoZSBvbmx5IGludGVuZGVkIHVzZSBpcyB0byBlbWl0IENPTSBvciBBUFBuIG1hcmtlcnMgYWZ0ZXIgY2FsbGluZworICogd3JpdGVfZmlsZV9oZWFkZXIgYW5kIGJlZm9yZSBjYWxsaW5nIHdyaXRlX2ZyYW1lX2hlYWRlci4KKyAqIE90aGVyIHVzZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHByb2R1Y2UgZGVzaXJhYmxlIHJlc3VsdHMuCisgKiBDb3VudGluZyB0aGUgcGFyYW1ldGVyIGJ5dGVzIHByb3Blcmx5IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX21hcmtlcl9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKKy8qIEVtaXQgYW4gYXJiaXRyYXJ5IG1hcmtlciBoZWFkZXIgKi8KK3sKKyAgaWYgKGRhdGFsZW4gPiAodW5zaWduZWQgaW50KSA2NTUzMykJCS8qIHNhZmV0eSBjaGVjayAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgZW1pdF9tYXJrZXIoY2luZm8sIChKUEVHX01BUktFUikgbWFya2VyKTsKKworICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgKGRhdGFsZW4gKyAyKSk7CS8qIHRvdGFsIGxlbmd0aCAqLworfQorCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX21hcmtlcl9ieXRlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkKKy8qIEVtaXQgb25lIGJ5dGUgb2YgbWFya2VyIHBhcmFtZXRlcnMgZm9sbG93aW5nIHdyaXRlX21hcmtlcl9oZWFkZXIgKi8KK3sKKyAgZW1pdF9ieXRlKGNpbmZvLCB2YWwpOworfQorCisKKy8qCisgKiBXcml0ZSBkYXRhc3RyZWFtIGhlYWRlci4KKyAqIFRoaXMgY29uc2lzdHMgb2YgYW4gU09JIGFuZCBvcHRpb25hbCBBUFBuIG1hcmtlcnMuCisgKiBXZSByZWNvbW1lbmQgdXNlIG9mIHRoZSBKRklGIG1hcmtlciwgYnV0IG5vdCB0aGUgQWRvYmUgbWFya2VyLAorICogd2hlbiB1c2luZyBZQ2JDciBvciBncmF5c2NhbGUgZGF0YS4gIFRoZSBKRklGIG1hcmtlciBzaG91bGQgTk9UCisgKiBiZSB1c2VkIGZvciBhbnkgb3RoZXIgSlBFRyBjb2xvcnNwYWNlLiAgVGhlIEFkb2JlIG1hcmtlciBpcyBoZWxwZnVsCisgKiB0byBkaXN0aW5ndWlzaCBSR0IsIENNWUssIGFuZCBZQ0NLIGNvbG9yc3BhY2VzLgorICogTm90ZSB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiB3cml0ZSBhZGRpdGlvbmFsIGhlYWRlciBtYXJrZXJzIGFmdGVyCisgKiBqcGVnX3N0YXJ0X2NvbXByZXNzIHJldHVybnMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9maWxlX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7CisKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fU09JKTsJLyogZmlyc3QgdGhlIFNPSSAqLworCisgIC8qIFNPSSBpcyBkZWZpbmVkIHRvIHJlc2V0IHJlc3RhcnQgaW50ZXJ2YWwgdG8gMCAqLworICBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCA9IDA7CisKKyAgaWYgKGNpbmZvLT53cml0ZV9KRklGX2hlYWRlcikJLyogbmV4dCBhbiBvcHRpb25hbCBKRklGIEFQUDAgKi8KKyAgICBlbWl0X2pmaWZfYXBwMChjaW5mbyk7CisgIGlmIChjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyKSAvKiBuZXh0IGFuIG9wdGlvbmFsIEFkb2JlIEFQUDE0ICovCisgICAgZW1pdF9hZG9iZV9hcHAxNChjaW5mbyk7Cit9CisKKworLyoKKyAqIFdyaXRlIGZyYW1lIGhlYWRlci4KKyAqIFRoaXMgY29uc2lzdHMgb2YgRFFUIGFuZCBTT0ZuIG1hcmtlcnMuCisgKiBOb3RlIHRoYXQgd2UgZG8gbm90IGVtaXQgdGhlIFNPRiB1bnRpbCB3ZSBoYXZlIGVtaXR0ZWQgdGhlIERRVChzKS4KKyAqIFRoaXMgYXZvaWRzIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aCBpbmNvcnJlY3QgaW1wbGVtZW50YXRpb25zIHRoYXQKKyAqIHRyeSB0byBlcnJvci1jaGVjayB0aGUgcXVhbnQgdGFibGUgbnVtYmVycyBhcyBzb29uIGFzIHRoZXkgc2VlIHRoZSBTT0YuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9mcmFtZV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpbnQgY2ksIHByZWM7CisgIGJvb2xlYW4gaXNfYmFzZWxpbmU7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIAorICAvKiBFbWl0IERRVCBmb3IgZWFjaCBxdWFudGl6YXRpb24gdGFibGUuCisgICAqIE5vdGUgdGhhdCBlbWl0X2RxdCgpIHN1cHByZXNzZXMgYW55IGR1cGxpY2F0ZSB0YWJsZXMuCisgICAqLworICBwcmVjID0gMDsKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICBwcmVjICs9IGVtaXRfZHF0KGNpbmZvLCBjb21wcHRyLT5xdWFudF90Ymxfbm8pOworICB9CisgIC8qIG5vdyBwcmVjIGlzIG5vbnplcm8gaWZmIHRoZXJlIGFyZSBhbnkgMTYtYml0IHF1YW50IHRhYmxlcy4gKi8KKworICAvKiBDaGVjayBmb3IgYSBub24tYmFzZWxpbmUgc3BlY2lmaWNhdGlvbi4KKyAgICogTm90ZSB3ZSBhc3N1bWUgdGhhdCBIdWZmbWFuIHRhYmxlIG51bWJlcnMgd29uJ3QgYmUgY2hhbmdlZCBsYXRlci4KKyAgICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSB8fCBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSB8fAorICAgICAgY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IDgpIHsKKyAgICBpc19iYXNlbGluZSA9IEZBTFNFOworICB9IGVsc2UgeworICAgIGlzX2Jhc2VsaW5lID0gVFJVRTsKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIGlmIChjb21wcHRyLT5kY190Ymxfbm8gPiAxIHx8IGNvbXBwdHItPmFjX3RibF9ubyA+IDEpCisJaXNfYmFzZWxpbmUgPSBGQUxTRTsKKyAgICB9CisgICAgaWYgKHByZWMgJiYgaXNfYmFzZWxpbmUpIHsKKyAgICAgIGlzX2Jhc2VsaW5lID0gRkFMU0U7CisgICAgICAvKiBJZiBpdCdzIGJhc2VsaW5lIGV4Y2VwdCBmb3IgcXVhbnRpemVyIHNpemUsIHdhcm4gdGhlIHVzZXIgKi8KKyAgICAgIFRSQUNFTVMoY2luZm8sIDAsIEpUUkNfMTZCSVRfVEFCTEVTKTsKKyAgICB9CisgIH0KKworICAvKiBFbWl0IHRoZSBwcm9wZXIgU09GIG1hcmtlciAqLworICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICBlbWl0X3NvZihjaW5mbywgTV9TT0Y5KTsJLyogU09GIGNvZGUgZm9yIGFyaXRobWV0aWMgY29kaW5nICovCisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQorICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMik7CS8qIFNPRiBjb2RlIGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuICovCisgICAgZWxzZSBpZiAoaXNfYmFzZWxpbmUpCisgICAgICBlbWl0X3NvZihjaW5mbywgTV9TT0YwKTsJLyogU09GIGNvZGUgZm9yIGJhc2VsaW5lIGltcGxlbWVudGF0aW9uICovCisgICAgZWxzZQorICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMSk7CS8qIFNPRiBjb2RlIGZvciBub24tYmFzZWxpbmUgSHVmZm1hbiBmaWxlICovCisgIH0KK30KKworCisvKgorICogV3JpdGUgc2NhbiBoZWFkZXIuCisgKiBUaGlzIGNvbnNpc3RzIG9mIERIVCBvciBEQUMgbWFya2Vycywgb3B0aW9uYWwgRFJJLCBhbmQgU09TLgorICogQ29tcHJlc3NlZCBkYXRhIHdpbGwgYmUgd3JpdHRlbiBmb2xsb3dpbmcgdGhlIFNPUy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX3NjYW5faGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKKyAgaW50IGk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgLyogRW1pdCBhcml0aCBjb25kaXRpb25pbmcgaW5mby4gIFdlIG1heSBoYXZlIHNvbWUgZHVwbGljYXRpb24KKyAgICAgKiBpZiB0aGUgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMsIGJ1dCBpdCdzIHNvIHNtYWxsIGl0J3MgaGFyZGx5CisgICAgICogd29ydGggd29ycnlpbmcgYWJvdXQuCisgICAgICovCisgICAgZW1pdF9kYWMoY2luZm8pOworICB9IGVsc2UgeworICAgIC8qIEVtaXQgSHVmZm1hbiB0YWJsZXMuCisgICAgICogTm90ZSB0aGF0IGVtaXRfZGh0KCkgc3VwcHJlc3NlcyBhbnkgZHVwbGljYXRlIHRhYmxlcy4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykgeworICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldOworICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisJLyogUHJvZ3Jlc3NpdmUgbW9kZTogb25seSBEQyBvciBvbmx5IEFDIHRhYmxlcyBhcmUgdXNlZCBpbiBvbmUgc2NhbiAqLworCWlmIChjaW5mby0+U3MgPT0gMCkgeworCSAgaWYgKGNpbmZvLT5BaCA9PSAwKQkvKiBEQyBuZWVkcyBubyB0YWJsZSBmb3IgcmVmaW5lbWVudCBzY2FuICovCisJICAgIGVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5kY190Ymxfbm8sIEZBTFNFKTsKKwl9IGVsc2UgeworCSAgZW1pdF9kaHQoY2luZm8sIGNvbXBwdHItPmFjX3RibF9ubywgVFJVRSk7CisJfQorICAgICAgfSBlbHNlIHsKKwkvKiBTZXF1ZW50aWFsIG1vZGU6IG5lZWQgYm90aCBEQyBhbmQgQUMgdGFibGVzICovCisJZW1pdF9kaHQoY2luZm8sIGNvbXBwdHItPmRjX3RibF9ubywgRkFMU0UpOworCWVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5hY190Ymxfbm8sIFRSVUUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEVtaXQgRFJJIGlmIHJlcXVpcmVkIC0tLSBub3RlIHRoYXQgRFJJIHZhbHVlIGNvdWxkIGNoYW5nZSBmb3IgZWFjaCBzY2FuLgorICAgKiBXZSBhdm9pZCB3YXN0aW5nIHNwYWNlIHdpdGggdW5uZWNlc3NhcnkgRFJJcywgaG93ZXZlci4KKyAgICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCAhPSBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCkgeworICAgIGVtaXRfZHJpKGNpbmZvKTsKKyAgICBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworICB9CisKKyAgZW1pdF9zb3MoY2luZm8pOworfQorCisKKy8qCisgKiBXcml0ZSBkYXRhc3RyZWFtIHRyYWlsZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9maWxlX3RyYWlsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBlbWl0X21hcmtlcihjaW5mbywgTV9FT0kpOworfQorCisKKy8qCisgKiBXcml0ZSBhbiBhYmJyZXZpYXRlZCB0YWJsZS1zcGVjaWZpY2F0aW9uIGRhdGFzdHJlYW0uCisgKiBUaGlzIGNvbnNpc3RzIG9mIFNPSSwgRFFUIGFuZCBESFQgdGFibGVzLCBhbmQgRU9JLgorICogQW55IHRhYmxlIHRoYXQgaXMgZGVmaW5lZCBhbmQgbm90IG1hcmtlZCBzZW50X3RhYmxlID0gVFJVRSB3aWxsIGJlCisgKiBlbWl0dGVkLiAgTm90ZSB0aGF0IGFsbCB0YWJsZXMgd2lsbCBiZSBtYXJrZWQgc2VudF90YWJsZSA9IFRSVUUgYXQgZXhpdC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX3RhYmxlc19vbmx5IChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaW50IGk7CisKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fU09JKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1FVQU5UX1RCTFM7IGkrKykgeworICAgIGlmIChjaW5mby0+cXVhbnRfdGJsX3B0cnNbaV0gIT0gTlVMTCkKKyAgICAgICh2b2lkKSBlbWl0X2RxdChjaW5mbywgaSk7CisgIH0KKworICBpZiAoISBjaW5mby0+YXJpdGhfY29kZSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKKyAgICAgIGlmIChjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpXSAhPSBOVUxMKQorCWVtaXRfZGh0KGNpbmZvLCBpLCBGQUxTRSk7CisgICAgICBpZiAoY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaV0gIT0gTlVMTCkKKwllbWl0X2RodChjaW5mbywgaSwgVFJVRSk7CisgICAgfQorICB9CisKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRU9JKTsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgbWFya2VyIHdyaXRlciBtb2R1bGUuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9tYXJrZXJfd3JpdGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFya2VyX3B0ciBtYXJrZXI7CisKKyAgLyogQ3JlYXRlIHRoZSBzdWJvYmplY3QgKi8KKyAgbWFya2VyID0gKG15X21hcmtlcl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfbWFya2VyX3dyaXRlcikpOworICBjaW5mby0+bWFya2VyID0gKHN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgKikgbWFya2VyOworICAvKiBJbml0aWFsaXplIG1ldGhvZCBwb2ludGVycyAqLworICBtYXJrZXItPnB1Yi53cml0ZV9maWxlX2hlYWRlciA9IHdyaXRlX2ZpbGVfaGVhZGVyOworICBtYXJrZXItPnB1Yi53cml0ZV9mcmFtZV9oZWFkZXIgPSB3cml0ZV9mcmFtZV9oZWFkZXI7CisgIG1hcmtlci0+cHViLndyaXRlX3NjYW5faGVhZGVyID0gd3JpdGVfc2Nhbl9oZWFkZXI7CisgIG1hcmtlci0+cHViLndyaXRlX2ZpbGVfdHJhaWxlciA9IHdyaXRlX2ZpbGVfdHJhaWxlcjsKKyAgbWFya2VyLT5wdWIud3JpdGVfdGFibGVzX29ubHkgPSB3cml0ZV90YWJsZXNfb25seTsKKyAgbWFya2VyLT5wdWIud3JpdGVfbWFya2VyX2hlYWRlciA9IHdyaXRlX21hcmtlcl9oZWFkZXI7CisgIG1hcmtlci0+cHViLndyaXRlX21hcmtlcl9ieXRlID0gd3JpdGVfbWFya2VyX2J5dGU7CisgIC8qIEluaXRpYWxpemUgcHJpdmF0ZSBzdGF0ZSAqLworICBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCA9IDA7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qY21hc3Rlci5jIGIvY29tbW9uL2pwZWcvamNtYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWI0MDIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamNtYXN0ZXIuYwpAQCAtMCwwICsxLDU5MCBAQAorLyoKKyAqIGpjbWFzdGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBtYXN0ZXIgY29udHJvbCBsb2dpYyBmb3IgdGhlIEpQRUcgY29tcHJlc3Nvci4KKyAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjb25jZXJuZWQgd2l0aCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiwgaW5pdGlhbCBzZXR1cCwKKyAqIGFuZCBpbnRlci1wYXNzIGNvbnRyb2wgKGRldGVybWluaW5nIHRoZSBudW1iZXIgb2YgcGFzc2VzIGFuZCB0aGUgd29yayAKKyAqIHRvIGJlIGRvbmUgaW4gZWFjaCBwYXNzKS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUHJpdmF0ZSBzdGF0ZSAqLworCit0eXBlZGVmIGVudW0geworCW1haW5fcGFzcywJCS8qIGlucHV0IGRhdGEsIGFsc28gZG8gZmlyc3Qgb3V0cHV0IHN0ZXAgKi8KKwlodWZmX29wdF9wYXNzLAkJLyogSHVmZm1hbiBjb2RlIG9wdGltaXphdGlvbiBwYXNzICovCisJb3V0cHV0X3Bhc3MJCS8qIGRhdGEgb3V0cHV0IHBhc3MgKi8KK30gY19wYXNzX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgY19wYXNzX3R5cGUgcGFzc190eXBlOwkvKiB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBwYXNzICovCisKKyAgaW50IHBhc3NfbnVtYmVyOwkJLyogIyBvZiBwYXNzZXMgY29tcGxldGVkICovCisgIGludCB0b3RhbF9wYXNzZXM7CQkvKiB0b3RhbCAjIG9mIHBhc3NlcyBuZWVkZWQgKi8KKworICBpbnQgc2Nhbl9udW1iZXI7CQkvKiBjdXJyZW50IGluZGV4IGluIHNjYW5faW5mb1tdICovCit9IG15X2NvbXBfbWFzdGVyOworCit0eXBlZGVmIG15X2NvbXBfbWFzdGVyICogbXlfbWFzdGVyX3B0cjsKKworCisvKgorICogU3VwcG9ydCByb3V0aW5lcyB0aGF0IGRvIHZhcmlvdXMgZXNzZW50aWFsIGNhbGN1bGF0aW9ucy4KKyAqLworCitMT0NBTCh2b2lkKQoraW5pdGlhbF9zZXR1cCAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBtYXN0ZXIgc2VsZWN0aW9uIHBoYXNlICovCit7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgbG9uZyBzYW1wbGVzcGVycm93OworICBKRElNRU5TSU9OIGpkX3NhbXBsZXNwZXJyb3c7CisKKyAgLyogU2FuaXR5IGNoZWNrIG9uIGltYWdlIGRpbWVuc2lvbnMgKi8KKyAgaWYgKGNpbmZvLT5pbWFnZV9oZWlnaHQgPD0gMCB8fCBjaW5mby0+aW1hZ2Vfd2lkdGggPD0gMAorICAgICAgfHwgY2luZm8tPm51bV9jb21wb25lbnRzIDw9IDAgfHwgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPD0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNUFRZX0lNQUdFKTsKKworICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gSSBjYW4gaGFuZGxlICovCisgIGlmICgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04gfHwKKyAgICAgIChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIEpQRUdfTUFYX0RJTUVOU0lPTik7CisKKyAgLyogV2lkdGggb2YgYW4gaW5wdXQgc2NhbmxpbmUgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIEpESU1FTlNJT04uICovCisgIHNhbXBsZXNwZXJyb3cgPSAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzOworICBqZF9zYW1wbGVzcGVycm93ID0gKEpESU1FTlNJT04pIHNhbXBsZXNwZXJyb3c7CisgIGlmICgobG9uZykgamRfc2FtcGxlc3BlcnJvdyAhPSBzYW1wbGVzcGVycm93KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOworCisgIC8qIEZvciBub3csIHByZWNpc2lvbiBtdXN0IG1hdGNoIGNvbXBpbGVkLWluIHZhbHVlLi4uICovCisgIGlmIChjaW5mby0+ZGF0YV9wcmVjaXNpb24gIT0gQklUU19JTl9KU0FNUExFKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUkVDSVNJT04sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbik7CisKKyAgLyogQ2hlY2sgdGhhdCBudW1iZXIgb2YgY29tcG9uZW50cyB3b24ndCBleGNlZWQgaW50ZXJuYWwgYXJyYXkgc2l6ZXMgKi8KKyAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA+IE1BWF9DT01QT05FTlRTKQorICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgTUFYX0NPTVBPTkVOVFMpOworCisgIC8qIENvbXB1dGUgbWF4aW11bSBzYW1wbGluZyBmYWN0b3JzOyBjaGVjayBmYWN0b3IgdmFsaWRpdHkgKi8KKyAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yID0gMTsKKyAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gMTsKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjw9MCB8fCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yPk1BWF9TQU1QX0ZBQ1RPUiB8fAorCWNvbXBwdHItPnZfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9TQU1QTElORyk7CisgICAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciwKKwkJCQkgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKTsKKyAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPSBNQVgoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAorCQkJCSAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICB9CisKKyAgLyogQ29tcHV0ZSBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHMgKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBGaWxsIGluIHRoZSBjb3JyZWN0IGNvbXBvbmVudF9pbmRleCB2YWx1ZTsgZG9uJ3QgcmVseSBvbiBhcHBsaWNhdGlvbiAqLworICAgIGNvbXBwdHItPmNvbXBvbmVudF9pbmRleCA9IGNpOworICAgIC8qIEZvciBjb21wcmVzc2lvbiwgd2UgbmV2ZXIgZG8gRENUIHNjYWxpbmcuICovCisgICAgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplID0gRENUU0laRTsKKyAgICAvKiBTaXplIGluIERDVCBibG9ja3MgKi8KKyAgICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgLyogU2l6ZSBpbiBzYW1wbGVzICovCisgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3Rvcik7CisgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisJCSAgICAobG9uZykgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKKyAgICAvKiBNYXJrIGNvbXBvbmVudCBuZWVkZWQgKHRoaXMgZmxhZyBpc24ndCBhY3R1YWxseSB1c2VkIGZvciBjb21wcmVzc2lvbikgKi8KKyAgICBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkID0gVFJVRTsKKyAgfQorCisgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3dzIChudW1iZXIgb2YgdGltZXMgdGhhdAorICAgKiBtYWluIGNvbnRyb2xsZXIgd2lsbCBjYWxsIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIpLgorICAgKi8KKyAgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyA9IChKRElNRU5TSU9OKQorICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisJCSAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOworfQorCisKKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKworTE9DQUwodm9pZCkKK3ZhbGlkYXRlX3NjcmlwdCAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBWZXJpZnkgdGhhdCB0aGUgc2NhbiBzY3JpcHQgaW4gY2luZm8tPnNjYW5faW5mb1tdIGlzIHZhbGlkOyBhbHNvCisgKiBkZXRlcm1pbmUgd2hldGhlciBpdCB1c2VzIHByb2dyZXNzaXZlIEpQRUcsIGFuZCBzZXQgY2luZm8tPnByb2dyZXNzaXZlX21vZGUuCisgKi8KK3sKKyAgY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FucHRyOworICBpbnQgc2Nhbm5vLCBuY29tcHMsIGNpLCBjb2VmaSwgdGhpc2k7CisgIGludCBTcywgU2UsIEFoLCBBbDsKKyAgYm9vbGVhbiBjb21wb25lbnRfc2VudFtNQVhfQ09NUE9ORU5UU107CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgaW50ICogbGFzdF9iaXRwb3NfcHRyOworICBpbnQgbGFzdF9iaXRwb3NbTUFYX0NPTVBPTkVOVFNdW0RDVFNJWkUyXTsKKyAgLyogLTEgdW50aWwgdGhhdCBjb2VmZmljaWVudCBoYXMgYmVlbiBzZWVuOyB0aGVuIGxhc3QgQWwgZm9yIGl0ICovCisjZW5kaWYKKworICBpZiAoY2luZm8tPm51bV9zY2FucyA8PSAwKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgMCk7CisKKyAgLyogRm9yIHNlcXVlbnRpYWwgSlBFRywgYWxsIHNjYW5zIG11c3QgaGF2ZSBTcz0wLCBTZT1EQ1RTSVpFMi0xOworICAgKiBmb3IgcHJvZ3Jlc3NpdmUgSlBFRywgbm8gc2NhbiBjYW4gaGF2ZSB0aGlzLgorICAgKi8KKyAgc2NhbnB0ciA9IGNpbmZvLT5zY2FuX2luZm87CisgIGlmIChzY2FucHRyLT5TcyAhPSAwIHx8IHNjYW5wdHItPlNlICE9IERDVFNJWkUyLTEpIHsKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gVFJVRTsKKyAgICBsYXN0X2JpdHBvc19wdHIgPSAmIGxhc3RfYml0cG9zWzBdWzBdOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgCisgICAgICBmb3IgKGNvZWZpID0gMDsgY29lZmkgPCBEQ1RTSVpFMjsgY29lZmkrKykKKwkqbGFzdF9iaXRwb3NfcHRyKysgPSAtMTsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBGQUxTRTsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIAorICAgICAgY29tcG9uZW50X3NlbnRbY2ldID0gRkFMU0U7CisgIH0KKworICBmb3IgKHNjYW5ubyA9IDE7IHNjYW5ubyA8PSBjaW5mby0+bnVtX3NjYW5zOyBzY2FucHRyKyssIHNjYW5ubysrKSB7CisgICAgLyogVmFsaWRhdGUgY29tcG9uZW50IGluZGV4ZXMgKi8KKyAgICBuY29tcHMgPSBzY2FucHRyLT5jb21wc19pbl9zY2FuOworICAgIGlmIChuY29tcHMgPD0gMCB8fCBuY29tcHMgPiBNQVhfQ09NUFNfSU5fU0NBTikKKyAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgbmNvbXBzLCBNQVhfQ09NUFNfSU5fU0NBTik7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7CisgICAgICB0aGlzaSA9IHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV07CisgICAgICBpZiAodGhpc2kgPCAwIHx8IHRoaXNpID49IGNpbmZvLT5udW1fY29tcG9uZW50cykKKwlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU0NBTl9TQ1JJUFQsIHNjYW5ubyk7CisgICAgICAvKiBDb21wb25lbnRzIG11c3QgYXBwZWFyIGluIFNPRiBvcmRlciB3aXRoaW4gZWFjaCBzY2FuICovCisgICAgICBpZiAoY2kgPiAwICYmIHRoaXNpIDw9IHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaS0xXSkKKwlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU0NBTl9TQ1JJUFQsIHNjYW5ubyk7CisgICAgfQorICAgIC8qIFZhbGlkYXRlIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgKi8KKyAgICBTcyA9IHNjYW5wdHItPlNzOworICAgIFNlID0gc2NhbnB0ci0+U2U7CisgICAgQWggPSBzY2FucHRyLT5BaDsKKyAgICBBbCA9IHNjYW5wdHItPkFsOworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgICAvKiBUaGUgSlBFRyBzcGVjIHNpbXBseSBnaXZlcyB0aGUgcmFuZ2VzIDAuLjEzIGZvciBBaCBhbmQgQWwsIGJ1dCB0aGF0CisgICAgICAgKiBzZWVtcyB3cm9uZzogdGhlIHVwcGVyIGJvdW5kIG91Z2h0IHRvIGRlcGVuZCBvbiBkYXRhIHByZWNpc2lvbi4KKyAgICAgICAqIFBlcmhhcHMgdGhleSByZWFsbHkgbWVhbnQgMC4uTisxIGZvciBOLWJpdCBwcmVjaXNpb24uCisgICAgICAgKiBIZXJlIHdlIGFsbG93IDAuLjEwIGZvciA4LWJpdCBkYXRhOyBBbCBsYXJnZXIgdGhhbiAxMCByZXN1bHRzIGluCisgICAgICAgKiBvdXQtb2YtcmFuZ2UgcmVjb25zdHJ1Y3RlZCBEQyB2YWx1ZXMgZHVyaW5nIHRoZSBmaXJzdCBEQyBzY2FuLAorICAgICAgICogd2hpY2ggbWlnaHQgY2F1c2UgcHJvYmxlbXMgZm9yIHNvbWUgZGVjb2RlcnMuCisgICAgICAgKi8KKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBNQVhfQUhfQUwgMTAKKyNlbHNlCisjZGVmaW5lIE1BWF9BSF9BTCAxMworI2VuZGlmCisgICAgICBpZiAoU3MgPCAwIHx8IFNzID49IERDVFNJWkUyIHx8IFNlIDwgU3MgfHwgU2UgPj0gRENUU0laRTIgfHwKKwkgIEFoIDwgMCB8fCBBaCA+IE1BWF9BSF9BTCB8fCBBbCA8IDAgfHwgQWwgPiBNQVhfQUhfQUwpCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworICAgICAgaWYgKFNzID09IDApIHsKKwlpZiAoU2UgIT0gMCkJCS8qIERDIGFuZCBBQyB0b2dldGhlciBub3QgT0sgKi8KKwkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKKyAgICAgIH0gZWxzZSB7CisJaWYgKG5jb21wcyAhPSAxKQkvKiBBQyBzY2FucyBtdXN0IGJlIGZvciBvbmx5IG9uZSBjb21wb25lbnQgKi8KKwkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKKyAgICAgIH0KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgeworCWxhc3RfYml0cG9zX3B0ciA9ICYgbGFzdF9iaXRwb3Nbc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXV1bMF07CisJaWYgKFNzICE9IDAgJiYgbGFzdF9iaXRwb3NfcHRyWzBdIDwgMCkgLyogQUMgd2l0aG91dCBwcmlvciBEQyBzY2FuICovCisJICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisJZm9yIChjb2VmaSA9IFNzOyBjb2VmaSA8PSBTZTsgY29lZmkrKykgeworCSAgaWYgKGxhc3RfYml0cG9zX3B0cltjb2VmaV0gPCAwKSB7CisJICAgIC8qIGZpcnN0IHNjYW4gb2YgdGhpcyBjb2VmZmljaWVudCAqLworCSAgICBpZiAoQWggIT0gMCkKKwkgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisJICB9IGVsc2UgeworCSAgICAvKiBub3QgZmlyc3Qgc2NhbiAqLworCSAgICBpZiAoQWggIT0gbGFzdF9iaXRwb3NfcHRyW2NvZWZpXSB8fCBBbCAhPSBBaC0xKQorCSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKKwkgIH0KKwkgIGxhc3RfYml0cG9zX3B0cltjb2VmaV0gPSBBbDsKKwl9CisgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgLyogRm9yIHNlcXVlbnRpYWwgSlBFRywgYWxsIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgbXVzdCBiZSB0aGVzZTogKi8KKyAgICAgIGlmIChTcyAhPSAwIHx8IFNlICE9IERDVFNJWkUyLTEgfHwgQWggIT0gMCB8fCBBbCAhPSAwKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKKyAgICAgIC8qIE1ha2Ugc3VyZSBjb21wb25lbnRzIGFyZSBub3Qgc2VudCB0d2ljZSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7CisJdGhpc2kgPSBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldOworCWlmIChjb21wb25lbnRfc2VudFt0aGlzaV0pCisJICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU0NBTl9TQ1JJUFQsIHNjYW5ubyk7CisJY29tcG9uZW50X3NlbnRbdGhpc2ldID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBOb3cgdmVyaWZ5IHRoYXQgZXZlcnl0aGluZyBnb3Qgc2VudC4gKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAvKiBGb3IgcHJvZ3Jlc3NpdmUgbW9kZSwgd2Ugb25seSBjaGVjayB0aGF0IGF0IGxlYXN0IHNvbWUgREMgZGF0YQorICAgICAqIGdvdCBzZW50IGZvciBlYWNoIGNvbXBvbmVudDsgdGhlIHNwZWMgZG9lcyBub3QgcmVxdWlyZSB0aGF0IGFsbCBiaXRzCisgICAgICogb2YgYWxsIGNvZWZmaWNpZW50cyBiZSB0cmFuc21pdHRlZC4gIFdvdWxkIGl0IGJlIHdpc2VyIHRvIGVuZm9yY2UKKyAgICAgKiB0cmFuc21pc3Npb24gb2YgYWxsIGNvZWZmaWNpZW50IGJpdHM/PworICAgICAqLworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgaWYgKGxhc3RfYml0cG9zW2NpXVswXSA8IDApCisJRVJSRVhJVChjaW5mbywgSkVSUl9NSVNTSU5HX0RBVEEpOworICAgIH0KKyNlbmRpZgorICB9IGVsc2UgeworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgaWYgKCEgY29tcG9uZW50X3NlbnRbY2ldKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfTUlTU0lOR19EQVRBKTsKKyAgICB9CisgIH0KK30KKworI2VuZGlmIC8qIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLworCisKK0xPQ0FMKHZvaWQpCitzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIFNldCB1cCB0aGUgc2NhbiBwYXJhbWV0ZXJzIGZvciB0aGUgY3VycmVudCBzY2FuICovCit7CisgIGludCBjaTsKKworI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICBpZiAoY2luZm8tPnNjYW5faW5mbyAhPSBOVUxMKSB7CisgICAgLyogUHJlcGFyZSBmb3IgY3VycmVudCBzY2FuIC0tLSB0aGUgc2NyaXB0IGlzIGFscmVhZHkgdmFsaWRhdGVkICovCisgICAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKKyAgICBjb25zdCBqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIgPSBjaW5mby0+c2Nhbl9pbmZvICsgbWFzdGVyLT5zY2FuX251bWJlcjsKKworICAgIGNpbmZvLT5jb21wc19pbl9zY2FuID0gc2NhbnB0ci0+Y29tcHNfaW5fc2NhbjsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBzY2FucHRyLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgICBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0gPQorCSZjaW5mby0+Y29tcF9pbmZvW3NjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV1dOworICAgIH0KKyAgICBjaW5mby0+U3MgPSBzY2FucHRyLT5TczsKKyAgICBjaW5mby0+U2UgPSBzY2FucHRyLT5TZTsKKyAgICBjaW5mby0+QWggPSBzY2FucHRyLT5BaDsKKyAgICBjaW5mby0+QWwgPSBzY2FucHRyLT5BbDsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeworICAgIC8qIFByZXBhcmUgZm9yIHNpbmdsZSBzZXF1ZW50aWFsLUpQRUcgc2NhbiBjb250YWluaW5nIGFsbCBjb21wb25lbnRzICovCisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+bnVtX2NvbXBvbmVudHMsCisJICAgICAgIE1BWF9DT01QU19JTl9TQ0FOKTsKKyAgICBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXSA9ICZjaW5mby0+Y29tcF9pbmZvW2NpXTsKKyAgICB9CisgICAgY2luZm8tPlNzID0gMDsKKyAgICBjaW5mby0+U2UgPSBEQ1RTSVpFMi0xOworICAgIGNpbmZvLT5BaCA9IDA7CisgICAgY2luZm8tPkFsID0gMDsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitwZXJfc2Nhbl9zZXR1cCAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBwcm9jZXNzaW5nIGEgSlBFRyBzY2FuICovCisvKiBjaW5mby0+Y29tcHNfaW5fc2NhbiBhbmQgY2luZm8tPmN1cl9jb21wX2luZm9bXSBhcmUgYWxyZWFkeSBzZXQgKi8KK3sKKyAgaW50IGNpLCBtY3VibGtzLCB0bXA7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIAorICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPT0gMSkgeworICAgIAorICAgIC8qIE5vbmludGVybGVhdmVkIChzaW5nbGUtY29tcG9uZW50KSBzY2FuICovCisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdOworICAgIAorICAgIC8qIE92ZXJhbGwgaW1hZ2Ugc2l6ZSBpbiBNQ1VzICovCisgICAgY2luZm8tPk1DVXNfcGVyX3JvdyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKKyAgICBjaW5mby0+TUNVX3Jvd3NfaW5fc2NhbiA9IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CisgICAgCisgICAgLyogRm9yIG5vbmludGVybGVhdmVkIHNjYW4sIGFsd2F5cyBvbmUgYmxvY2sgcGVyIE1DVSAqLworICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IDE7CisgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IDE7CisgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IDE7CisgICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IERDVFNJWkU7CisgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSAxOworICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FucywgaXQgaXMgY29udmVuaWVudCB0byBkZWZpbmUgbGFzdF9yb3dfaGVpZ2h0CisgICAgICogYXMgdGhlIG51bWJlciBvZiBibG9jayByb3dzIHByZXNlbnQgaW4gdGhlIGxhc3QgaU1DVSByb3cuCisgICAgICovCisgICAgdG1wID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOworICAgIAorICAgIC8qIFByZXBhcmUgYXJyYXkgZGVzY3JpYmluZyBNQ1UgY29tcG9zaXRpb24gKi8KKyAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDE7CisgICAgY2luZm8tPk1DVV9tZW1iZXJzaGlwWzBdID0gMDsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgICAvKiBJbnRlcmxlYXZlZCAobXVsdGktY29tcG9uZW50KSBzY2FuICovCisgICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuIDw9IDAgfHwgY2luZm8tPmNvbXBzX2luX3NjYW4gPiBNQVhfQ09NUFNfSU5fU0NBTikKKyAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPmNvbXBzX2luX3NjYW4sCisJICAgICAgIE1BWF9DT01QU19JTl9TQ0FOKTsKKyAgICAKKyAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLworICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKKyAgICBjaW5mby0+TUNVX3Jvd3NfaW5fc2NhbiA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKKyAgICAKKyAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDA7CisgICAgCisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICAvKiBTYW1wbGluZyBmYWN0b3JzIGdpdmUgIyBvZiBibG9ja3Mgb2YgY29tcG9uZW50IGluIGVhY2ggTUNVICovCisgICAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gY29tcHB0ci0+TUNVX3dpZHRoICogY29tcHB0ci0+TUNVX2hlaWdodDsKKyAgICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBEQ1RTSVpFOworICAgICAgLyogRmlndXJlIG51bWJlciBvZiBub24tZHVtbXkgYmxvY2tzIGluIGxhc3QgTUNVIGNvbHVtbiAmIHJvdyAqLworICAgICAgdG1wID0gKGludCkgKGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV93aWR0aCk7CisgICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV93aWR0aDsKKyAgICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gdG1wOworICAgICAgdG1wID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1VfaGVpZ2h0KTsKKyAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX2hlaWdodDsKKyAgICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKKyAgICAgIC8qIFByZXBhcmUgYXJyYXkgZGVzY3JpYmluZyBNQ1UgY29tcG9zaXRpb24gKi8KKyAgICAgIG1jdWJsa3MgPSBjb21wcHRyLT5NQ1VfYmxvY2tzOworICAgICAgaWYgKGNpbmZvLT5ibG9ja3NfaW5fTUNVICsgbWN1YmxrcyA+IENfTUFYX0JMT0NLU19JTl9NQ1UpCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTUNVX1NJWkUpOworICAgICAgd2hpbGUgKG1jdWJsa3MtLSA+IDApIHsKKwljaW5mby0+TUNVX21lbWJlcnNoaXBbY2luZm8tPmJsb2Nrc19pbl9NQ1UrK10gPSBjaTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgIH0KKworICAvKiBDb252ZXJ0IHJlc3RhcnQgc3BlY2lmaWVkIGluIHJvd3MgdG8gYWN0dWFsIE1DVSBjb3VudC4gKi8KKyAgLyogTm90ZSB0aGF0IGNvdW50IG11c3QgZml0IGluIDE2IGJpdHMsIHNvIHdlIHByb3ZpZGUgbGltaXRpbmcuICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbl9yb3dzID4gMCkgeworICAgIGxvbmcgbm9taW5hbCA9IChsb25nKSBjaW5mby0+cmVzdGFydF9pbl9yb3dzICogKGxvbmcpIGNpbmZvLT5NQ1VzX3Blcl9yb3c7CisgICAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAodW5zaWduZWQgaW50KSBNSU4obm9taW5hbCwgNjU1MzVMKTsKKyAgfQorfQorCisKKy8qCisgKiBQZXItcGFzcyBzZXR1cC4KKyAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwYXNzLiAgV2UgZGV0ZXJtaW5lIHdoaWNoIG1vZHVsZXMKKyAqIHdpbGwgYmUgYWN0aXZlIGR1cmluZyB0aGlzIHBhc3MgYW5kIGdpdmUgdGhlbSBhcHByb3ByaWF0ZSBzdGFydF9wYXNzIGNhbGxzLgorICogV2UgYWxzbyBzZXQgaXNfbGFzdF9wYXNzIHRvIGluZGljYXRlIHdoZXRoZXIgYW55IG1vcmUgcGFzc2VzIHdpbGwgYmUKKyAqIHJlcXVpcmVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHJlcGFyZV9mb3JfcGFzcyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisKKyAgc3dpdGNoIChtYXN0ZXItPnBhc3NfdHlwZSkgeworICBjYXNlIG1haW5fcGFzczoKKyAgICAvKiBJbml0aWFsIHBhc3M6IHdpbGwgY29sbGVjdCBpbnB1dCBkYXRhLCBhbmQgZG8gZWl0aGVyIEh1ZmZtYW4KKyAgICAgKiBvcHRpbWl6YXRpb24gb3IgZGF0YSBvdXRwdXQgZm9yIHRoZSBmaXJzdCBzY2FuLgorICAgICAqLworICAgIHNlbGVjdF9zY2FuX3BhcmFtZXRlcnMoY2luZm8pOworICAgIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKKyAgICBpZiAoISBjaW5mby0+cmF3X2RhdGFfaW4pIHsKKyAgICAgICgqY2luZm8tPmNjb252ZXJ0LT5zdGFydF9wYXNzKSAoY2luZm8pOworICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAgICgqY2luZm8tPnByZXAtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9QQVNTX1RIUlUpOworICAgIH0KKyAgICAoKmNpbmZvLT5mZGN0LT5zdGFydF9wYXNzKSAoY2luZm8pOworICAgICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbywgY2luZm8tPm9wdGltaXplX2NvZGluZyk7CisgICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfcGFzcykgKGNpbmZvLAorCQkJCShtYXN0ZXItPnRvdGFsX3Bhc3NlcyA+IDEgPworCQkJCSBKQlVGX1NBVkVfQU5EX1BBU1MgOiBKQlVGX1BBU1NfVEhSVSkpOworICAgICgqY2luZm8tPm1haW4tPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9QQVNTX1RIUlUpOworICAgIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKSB7CisgICAgICAvKiBObyBpbW1lZGlhdGUgZGF0YSBvdXRwdXQ7IHBvc3Rwb25lIHdyaXRpbmcgZnJhbWUvc2NhbiBoZWFkZXJzICovCisgICAgICBtYXN0ZXItPnB1Yi5jYWxsX3Bhc3Nfc3RhcnR1cCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAvKiBXaWxsIHdyaXRlIGZyYW1lL3NjYW4gaGVhZGVycyBhdCBmaXJzdCBqcGVnX3dyaXRlX3NjYW5saW5lcyBjYWxsICovCisgICAgICBtYXN0ZXItPnB1Yi5jYWxsX3Bhc3Nfc3RhcnR1cCA9IFRSVUU7CisgICAgfQorICAgIGJyZWFrOworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorICBjYXNlIGh1ZmZfb3B0X3Bhc3M6CisgICAgLyogRG8gSHVmZm1hbiBvcHRpbWl6YXRpb24gZm9yIGEgc2NhbiBhZnRlciB0aGUgZmlyc3Qgb25lLiAqLworICAgIHNlbGVjdF9zY2FuX3BhcmFtZXRlcnMoY2luZm8pOworICAgIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKKyAgICBpZiAoY2luZm8tPlNzICE9IDAgfHwgY2luZm8tPkFoID09IDAgfHwgY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICAgICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbywgVFJVRSk7CisgICAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7CisgICAgICBtYXN0ZXItPnB1Yi5jYWxsX3Bhc3Nfc3RhcnR1cCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIFNwZWNpYWwgY2FzZTogSHVmZm1hbiBEQyByZWZpbmVtZW50IHNjYW5zIG5lZWQgbm8gSHVmZm1hbiB0YWJsZQorICAgICAqIGFuZCB0aGVyZWZvcmUgd2UgY2FuIHNraXAgdGhlIG9wdGltaXphdGlvbiBwYXNzIGZvciB0aGVtLgorICAgICAqLworICAgIG1hc3Rlci0+cGFzc190eXBlID0gb3V0cHV0X3Bhc3M7CisgICAgbWFzdGVyLT5wYXNzX251bWJlcisrOworICAgIC8qRkFMTFRIUk9VR0gqLworI2VuZGlmCisgIGNhc2Ugb3V0cHV0X3Bhc3M6CisgICAgLyogRG8gYSBkYXRhLW91dHB1dCBwYXNzLiAqLworICAgIC8qIFdlIG5lZWQgbm90IHJlcGVhdCBwZXItc2NhbiBzZXR1cCBpZiBwcmlvciBvcHRpbWl6YXRpb24gcGFzcyBkaWQgaXQuICovCisgICAgaWYgKCEgY2luZm8tPm9wdGltaXplX2NvZGluZykgeworICAgICAgc2VsZWN0X3NjYW5fcGFyYW1ldGVycyhjaW5mbyk7CisgICAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisgICAgfQorICAgICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbywgRkFMU0UpOworICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKKyAgICAvKiBXZSBlbWl0IGZyYW1lL3NjYW4gaGVhZGVycyBub3cgKi8KKyAgICBpZiAobWFzdGVyLT5zY2FuX251bWJlciA9PSAwKQorICAgICAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9mcmFtZV9oZWFkZXIpIChjaW5mbyk7CisgICAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9zY2FuX2hlYWRlcikgKGNpbmZvKTsKKyAgICBtYXN0ZXItPnB1Yi5jYWxsX3Bhc3Nfc3RhcnR1cCA9IEZBTFNFOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyAgfQorCisgIG1hc3Rlci0+cHViLmlzX2xhc3RfcGFzcyA9IChtYXN0ZXItPnBhc3NfbnVtYmVyID09IG1hc3Rlci0+dG90YWxfcGFzc2VzLTEpOworCisgIC8qIFNldCB1cCBwcm9ncmVzcyBtb25pdG9yJ3MgcGFzcyBpbmZvIGlmIHByZXNlbnQgKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gbWFzdGVyLT5wYXNzX251bWJlcjsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IG1hc3Rlci0+dG90YWxfcGFzc2VzOworICB9Cit9CisKKworLyoKKyAqIFNwZWNpYWwgc3RhcnQtb2YtcGFzcyBob29rLgorICogVGhpcyBpcyBjYWxsZWQgYnkganBlZ193cml0ZV9zY2FubGluZXMgaWYgY2FsbF9wYXNzX3N0YXJ0dXAgaXMgVFJVRS4KKyAqIEluIHNpbmdsZS1wYXNzIHByb2Nlc3NpbmcsIHdlIG5lZWQgdGhpcyBob29rIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0bworICogd3JpdGUgZnJhbWUvc2NhbiBoZWFkZXJzIGR1cmluZyBqcGVnX3N0YXJ0X2NvbXByZXNzOyB3ZSB3YW50IHRvIGxldCB0aGUKKyAqIGFwcGxpY2F0aW9uIHdyaXRlIENPTSBtYXJrZXJzIGV0Yy4gYmV0d2VlbiBqcGVnX3N0YXJ0X2NvbXByZXNzIGFuZCB0aGUKKyAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzIGxvb3AuCisgKiBJbiBtdWx0aS1wYXNzIHByb2Nlc3NpbmcsIHRoaXMgcm91dGluZSBpcyBub3QgdXNlZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bhc3Nfc3RhcnR1cCAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGNpbmZvLT5tYXN0ZXItPmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7IC8qIHJlc2V0IGZsYWcgc28gY2FsbCBvbmx5IG9uY2UgKi8KKworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZyYW1lX2hlYWRlcikgKGNpbmZvKTsKKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9zY2FuX2hlYWRlcikgKGNpbmZvKTsKK30KKworCisvKgorICogRmluaXNoIHVwIGF0IGVuZCBvZiBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfbWFzdGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKKworICAvKiBUaGUgZW50cm9weSBjb2RlciBhbHdheXMgbmVlZHMgYW4gZW5kLW9mLXBhc3MgY2FsbCwKKyAgICogZWl0aGVyIHRvIGFuYWx5emUgc3RhdGlzdGljcyBvciB0byBmbHVzaCBpdHMgb3V0cHV0IGJ1ZmZlci4KKyAgICovCisgICgqY2luZm8tPmVudHJvcHktPmZpbmlzaF9wYXNzKSAoY2luZm8pOworCisgIC8qIFVwZGF0ZSBzdGF0ZSBmb3IgbmV4dCBwYXNzICovCisgIHN3aXRjaCAobWFzdGVyLT5wYXNzX3R5cGUpIHsKKyAgY2FzZSBtYWluX3Bhc3M6CisgICAgLyogbmV4dCBwYXNzIGlzIGVpdGhlciBvdXRwdXQgb2Ygc2NhbiAwIChhZnRlciBvcHRpbWl6YXRpb24pCisgICAgICogb3Igb3V0cHV0IG9mIHNjYW4gMSAoaWYgbm8gb3B0aW1pemF0aW9uKS4KKyAgICAgKi8KKyAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOworICAgIGlmICghIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCisgICAgICBtYXN0ZXItPnNjYW5fbnVtYmVyKys7CisgICAgYnJlYWs7CisgIGNhc2UgaHVmZl9vcHRfcGFzczoKKyAgICAvKiBuZXh0IHBhc3MgaXMgYWx3YXlzIG91dHB1dCBvZiBjdXJyZW50IHNjYW4gKi8KKyAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOworICAgIGJyZWFrOworICBjYXNlIG91dHB1dF9wYXNzOgorICAgIC8qIG5leHQgcGFzcyBpcyBlaXRoZXIgb3B0aW1pemF0aW9uIG9yIG91dHB1dCBvZiBuZXh0IHNjYW4gKi8KKyAgICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykKKyAgICAgIG1hc3Rlci0+cGFzc190eXBlID0gaHVmZl9vcHRfcGFzczsKKyAgICBtYXN0ZXItPnNjYW5fbnVtYmVyKys7CisgICAgYnJlYWs7CisgIH0KKworICBtYXN0ZXItPnBhc3NfbnVtYmVyKys7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgbWFzdGVyIGNvbXByZXNzaW9uIGNvbnRyb2wuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9jX21hc3Rlcl9jb250cm9sIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiB0cmFuc2NvZGVfb25seSkKK3sKKyAgbXlfbWFzdGVyX3B0ciBtYXN0ZXI7CisKKyAgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKG15X2NvbXBfbWFzdGVyKSk7CisgIGNpbmZvLT5tYXN0ZXIgPSAoc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgKikgbWFzdGVyOworICBtYXN0ZXItPnB1Yi5wcmVwYXJlX2Zvcl9wYXNzID0gcHJlcGFyZV9mb3JfcGFzczsKKyAgbWFzdGVyLT5wdWIucGFzc19zdGFydHVwID0gcGFzc19zdGFydHVwOworICBtYXN0ZXItPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX21hc3RlcjsKKyAgbWFzdGVyLT5wdWIuaXNfbGFzdF9wYXNzID0gRkFMU0U7CisKKyAgLyogVmFsaWRhdGUgcGFyYW1ldGVycywgZGV0ZXJtaW5lIGRlcml2ZWQgdmFsdWVzICovCisgIGluaXRpYWxfc2V0dXAoY2luZm8pOworCisgIGlmIChjaW5mby0+c2Nhbl9pbmZvICE9IE5VTEwpIHsKKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgICB2YWxpZGF0ZV9zY3JpcHQoY2luZm8pOworI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IEZBTFNFOworICAgIGNpbmZvLT5udW1fc2NhbnMgPSAxOworICB9CisKKyAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQkvKiAgVEVNUE9SQVJZIEhBQ0sgPz8/ICovCisgICAgY2luZm8tPm9wdGltaXplX2NvZGluZyA9IFRSVUU7IC8qIGFzc3VtZSBkZWZhdWx0IHRhYmxlcyBubyBnb29kIGZvciBwcm9ncmVzc2l2ZSBtb2RlICovCisKKyAgLyogSW5pdGlhbGl6ZSBteSBwcml2YXRlIHN0YXRlICovCisgIGlmICh0cmFuc2NvZGVfb25seSkgeworICAgIC8qIG5vIG1haW4gcGFzcyBpbiB0cmFuc2NvZGluZyAqLworICAgIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKQorICAgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBodWZmX29wdF9wYXNzOworICAgIGVsc2UKKyAgICAgIG1hc3Rlci0+cGFzc190eXBlID0gb3V0cHV0X3Bhc3M7CisgIH0gZWxzZSB7CisgICAgLyogZm9yIG5vcm1hbCBjb21wcmVzc2lvbiwgZmlyc3QgcGFzcyBpcyBhbHdheXMgdGhpcyB0eXBlOiAqLworICAgIG1hc3Rlci0+cGFzc190eXBlID0gbWFpbl9wYXNzOworICB9CisgIG1hc3Rlci0+c2Nhbl9udW1iZXIgPSAwOworICBtYXN0ZXItPnBhc3NfbnVtYmVyID0gMDsKKyAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCisgICAgbWFzdGVyLT50b3RhbF9wYXNzZXMgPSBjaW5mby0+bnVtX3NjYW5zICogMjsKKyAgZWxzZQorICAgIG1hc3Rlci0+dG90YWxfcGFzc2VzID0gY2luZm8tPm51bV9zY2FuczsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pjb21hcGkuYyBiL2NvbW1vbi9qcGVnL2pjb21hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjFmYTc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamNvbWFwaS5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogamNvbWFwaS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIHJvdXRpbmVzIHRoYXQgYXJlIHVzZWQgZm9yIGJvdGgKKyAqIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogQWJvcnQgcHJvY2Vzc2luZyBvZiBhIEpQRUcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24sCisgKiBidXQgZG9uJ3QgZGVzdHJveSB0aGUgb2JqZWN0IGl0c2VsZi4KKyAqCisgKiBGb3IgdGhpcywgd2UgbWVyZWx5IGNsZWFuIHVwIGFsbCB0aGUgbm9ucGVybWFuZW50IG1lbW9yeSBwb29scy4KKyAqIE5vdGUgdGhhdCB0ZW1wIGZpbGVzICh2aXJ0dWFsIGFycmF5cykgYXJlIG5vdCBhbGxvd2VkIHRvIGJlbG9uZyB0bworICogdGhlIHBlcm1hbmVudCBwb29sLCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gY2xvc2UgYWxsIHRlbXAgZmlsZXMgaGVyZS4KKyAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBvciBkZXN0aW5hdGlvbiwgaWYgbmVjZXNzYXJ5LCBpcyB0aGUgYXBwbGljYXRpb24ncworICogcmVzcG9uc2liaWxpdHkuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Fib3J0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIGludCBwb29sOworCisgIC8qIERvIG5vdGhpbmcgaWYgY2FsbGVkIG9uIGEgbm90LWluaXRpYWxpemVkIG9yIGRlc3Ryb3llZCBKUEVHIG9iamVjdC4gKi8KKyAgaWYgKGNpbmZvLT5tZW0gPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogUmVsZWFzaW5nIHBvb2xzIGluIHJldmVyc2Ugb3JkZXIgbWlnaHQgaGVscCBhdm9pZCBmcmFnbWVudGF0aW9uCisgICAqIHdpdGggc29tZSAoYnJhaW4tZGFtYWdlZCkgbWFsbG9jIGxpYnJhcmllcy4KKyAgICovCisgIGZvciAocG9vbCA9IEpQT09MX05VTVBPT0xTLTE7IHBvb2wgPiBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgeworICAgICgqY2luZm8tPm1lbS0+ZnJlZV9wb29sKSAoY2luZm8sIHBvb2wpOworICB9CisKKyAgLyogUmVzZXQgb3ZlcmFsbCBzdGF0ZSBmb3IgcG9zc2libGUgcmV1c2Ugb2Ygb2JqZWN0ICovCisgIGlmIChjaW5mby0+aXNfZGVjb21wcmVzc29yKSB7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVEFSVDsKKyAgICAvKiBUcnkgdG8ga2VlcCBhcHBsaWNhdGlvbiBmcm9tIGFjY2Vzc2luZyBub3ctZGVsZXRlZCBtYXJrZXIgbGlzdC4KKyAgICAgKiBBIGJpdCBrbHVkZ3kgdG8gZG8gaXQgaGVyZSwgYnV0IHRoaXMgaXMgdGhlIG1vc3QgY2VudHJhbCBwbGFjZS4KKyAgICAgKi8KKyAgICAoKGpfZGVjb21wcmVzc19wdHIpIGNpbmZvKS0+bWFya2VyX2xpc3QgPSBOVUxMOworICB9IGVsc2UgeworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBDU1RBVEVfU1RBUlQ7CisgIH0KK30KKworCisvKgorICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIG9iamVjdC4KKyAqCisgKiBFdmVyeXRoaW5nIGdldHMgZGVhbGxvY2F0ZWQgZXhjZXB0IHRoZSBtYXN0ZXIganBlZ19jb21wcmVzc19zdHJ1Y3QgaXRzZWxmCisgKiBhbmQgdGhlIGVycm9yIG1hbmFnZXIgc3RydWN0LiAgQm90aCBvZiB0aGVzZSBhcmUgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uCisgKiBhbmQgbXVzdCBiZSBmcmVlZCwgaWYgbmVjZXNzYXJ5LCBieSB0aGUgYXBwbGljYXRpb24uICAoT2Z0ZW4gdGhleSBhcmUgb24KKyAqIHRoZSBzdGFjayBhbmQgc28gZG9uJ3QgbmVlZCB0byBiZSBmcmVlZCBhbnl3YXkuKQorICogQ2xvc2luZyBhIGRhdGEgc291cmNlIG9yIGRlc3RpbmF0aW9uLCBpZiBuZWNlc3NhcnksIGlzIHRoZSBhcHBsaWNhdGlvbidzCisgKiByZXNwb25zaWJpbGl0eS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZGVzdHJveSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBXZSBuZWVkIG9ubHkgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gcmVsZWFzZSBldmVyeXRoaW5nLiAqLworICAvKiBOQjogbWVtIHBvaW50ZXIgaXMgTlVMTCBpZiBtZW1vcnkgbWdyIGZhaWxlZCB0byBpbml0aWFsaXplLiAqLworICBpZiAoY2luZm8tPm1lbSAhPSBOVUxMKQorICAgICgqY2luZm8tPm1lbS0+c2VsZl9kZXN0cnVjdCkgKGNpbmZvKTsKKyAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBiZSBzYWZlIGlmIGpwZWdfZGVzdHJveSBpcyBjYWxsZWQgdHdpY2UgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IDA7CS8qIG1hcmsgaXQgZGVzdHJveWVkICovCit9CisKKworLyoKKyAqIENvbnZlbmllbmNlIHJvdXRpbmVzIGZvciBhbGxvY2F0aW5nIHF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMuCisgKiAoV291bGQganV0aWxzLmMgYmUgYSBtb3JlIHJlYXNvbmFibGUgcGxhY2UgdG8gcHV0IHRoZXNlPykKKyAqLworCitHTE9CQUwoSlFVQU5UX1RCTCAqKQoranBlZ19hbGxvY19xdWFudF90YWJsZSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBKUVVBTlRfVEJMICp0Ymw7CisKKyAgdGJsID0gKEpRVUFOVF9UQkwgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoY2luZm8sIEpQT09MX1BFUk1BTkVOVCwgU0laRU9GKEpRVUFOVF9UQkwpKTsKKyAgdGJsLT5zZW50X3RhYmxlID0gRkFMU0U7CS8qIG1ha2Ugc3VyZSB0aGlzIGlzIGZhbHNlIGluIGFueSBuZXcgdGFibGUgKi8KKyAgcmV0dXJuIHRibDsKK30KKworCitHTE9CQUwoSkhVRkZfVEJMICopCitqcGVnX2FsbG9jX2h1ZmZfdGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgSkhVRkZfVEJMICp0Ymw7CisKKyAgdGJsID0gKEpIVUZGX1RCTCAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpIChjaW5mbywgSlBPT0xfUEVSTUFORU5ULCBTSVpFT0YoSkhVRkZfVEJMKSk7CisgIHRibC0+c2VudF90YWJsZSA9IEZBTFNFOwkvKiBtYWtlIHN1cmUgdGhpcyBpcyBmYWxzZSBpbiBhbnkgbmV3IHRhYmxlICovCisgIHJldHVybiB0Ymw7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qY29uZmlnLmNmZyBiL2NvbW1vbi9qcGVnL2pjb25maWcuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTA0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qY29uZmlnLmNmZwpAQCAtMCwwICsxLDQ0IEBACisvKiBqY29uZmlnLmNmZyAtLS0gc291cmNlIGZpbGUgZWRpdGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHQgKi8KKy8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCisKKyN1bmRlZiBIQVZFX1BST1RPVFlQRVMKKyN1bmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKKyN1bmRlZiBIQVZFX1VOU0lHTkVEX1NIT1JUCisjdW5kZWYgdm9pZAorI3VuZGVmIGNvbnN0CisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI3VuZGVmIEhBVkVfU1REREVGX0gKKyN1bmRlZiBIQVZFX1NURExJQl9ICisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBnZXQgd2FybmluZ3MgYWJvdXQgdW5kZWZpbmVkIHN0cnVjdHVyZXMuICovCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI3VuZGVmIElOTElORQorLyogVGhlc2UgYXJlIGZvciBjb25maWd1cmluZyB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlci4gKi8KKyN1bmRlZiBERUZBVUxUX01BWF9NRU0KKyN1bmRlZiBOT19NS1RFTVAKKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyN1bmRlZiBUV09fRklMRV9DT01NQU5ETElORQorI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKKyN1bmRlZiBET05UX1VTRV9CX01PREUKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgcGVyY2VudC1kb25lIHByb2dyZXNzIHJlcG9ydHMgZnJvbSBjanBlZy9kanBlZy4gKi8KKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQKKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pjb25maWcuZG9jIGIvY29tbW9uL2pwZWcvamNvbmZpZy5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4ZDFjMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pjb25maWcuZG9jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogamNvbmZpZy5kb2MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB0bworICogY3VzdG9taXplIHRoZSBKUEVHIHNvZnR3YXJlIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLgorICoKKyAqIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uIGFyZSBzdG9yZWQKKyAqIGluIGpjb25maWcuaC4gIE9uIG1hbnkgbWFjaGluZXMsIGpjb25maWcuaCBjYW4gYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkKKyAqIG9yIGNvcGllZCBmcm9tIG9uZSBvZiB0aGUgImNhbm5lZCIgamNvbmZpZyBmaWxlcyB0aGF0IHdlIHN1cHBseS4gIEJ1dCBpZgorICogeW91IG5lZWQgdG8gZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZSBieSBoYW5kLCB0aGlzIGZpbGUgdGVsbHMgeW91IGhvdy4KKyAqCisgKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLS0tIElUIFdPTidUIEFDQ09NUExJU0ggQU5ZVEhJTkcuCisgKiBFRElUIEEgQ09QWSBOQU1FRCBKQ09ORklHLkguCisgKi8KKworCisvKgorICogVGhlc2Ugc3ltYm9scyBpbmRpY2F0ZSB0aGUgcHJvcGVydGllcyBvZiB5b3VyIG1hY2hpbmUgb3IgY29tcGlsZXIuCisgKiAjZGVmaW5lIHRoZSBzeW1ib2wgaWYgeWVzLCAjdW5kZWYgaXQgaWYgbm8uCisgKi8KKworLyogRG9lcyB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcz8KKyAqIChJZiBub3QsIHlvdSBhbHNvIG5lZWQgdG8gdXNlIGFuc2kya25yLCBzZWUgaW5zdGFsbC5kb2MpCisgKi8KKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisKKy8qIERvZXMgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBkZWNsYXJhdGlvbiAidW5zaWduZWQgY2hhciIgPworICogSG93IGFib3V0ICJ1bnNpZ25lZCBzaG9ydCIgPworICovCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisKKy8qIERlZmluZSAidm9pZCIgYXMgImNoYXIiIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBrbm93IGFib3V0IHR5cGUgdm9pZC4KKyAqIE5PVEU6IGJlIHN1cmUgdG8gZGVmaW5lIHZvaWQgc3VjaCB0aGF0ICJ2b2lkICoiIHJlcHJlc2VudHMgdGhlIG1vc3QgZ2VuZXJhbAorICogcG9pbnRlciB0eXBlLCBlLmcuLCB0aGF0IHJldHVybmVkIGJ5IG1hbGxvYygpLgorICovCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworCisvKiBEZWZpbmUgImNvbnN0IiBhcyBlbXB0eSBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyB0aGUgImNvbnN0IiBrZXl3b3JkLgorICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisKKy8qIERlZmluZSB0aGlzIGlmIGFuIG9yZGluYXJ5ICJjaGFyIiB0eXBlIGlzIHVuc2lnbmVkLgorICogSWYgeW91J3JlIG5vdCBzdXJlLCBsZWF2aW5nIGl0IHVuZGVmaW5lZCB3aWxsIHdvcmsgYXQgc29tZSBjb3N0IGluIHNwZWVkLgorICogSWYgeW91IGRlZmluZWQgSEFWRV9VTlNJR05FRF9DSEFSIHRoZW4gdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMgbWluaW1hbC4KKyAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFOU0ktY29uZm9ybWluZyA8c3RkZGVmLmg+IGZpbGUuCisgKi8KKyNkZWZpbmUgSEFWRV9TVERERUZfSAorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU5TSS1jb25mb3JtaW5nIDxzdGRsaWIuaD4gZmlsZS4KKyAqLworI2RlZmluZSBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYW4gQU5TSS9TeXNWIDxzdHJpbmcuaD4sCisgKiBidXQgZG9lcyBoYXZlIGEgQlNELXN0eWxlIDxzdHJpbmdzLmg+LgorICovCisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHR5cGVkZWYgc2l6ZV90IGluIGFueSBvZiB0aGUKKyAqIEFOU0ktc3RhbmRhcmQgcGxhY2VzIChzdGRkZWYuaCwgc3RkbGliLmgsIG9yIHN0ZGlvLmgpLCBidXQgcGxhY2VzIGl0IGluCisgKiA8c3lzL3R5cGVzLmg+IGluc3RlYWQuCisgKi8KKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisKKy8qIEZvciA4MHg4NiBtYWNoaW5lcywgeW91IG5lZWQgdG8gZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLAorICogdW5sZXNzIHlvdSBhcmUgdXNpbmcgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBvciA4MDM4NiBmbGF0LW1lbW9yeSBtb2RlLgorICogT24gbGVzcyBicmFpbi1kYW1hZ2VkIENQVXMgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgZGVmaW5lZC4KKyAqIChEZWZpbmluZyB0aGlzIHN5bWJvbCBjYXVzZXMgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIGJlIHJlZmVyZW5jZWQgdGhyb3VnaAorICogImZhciIgcG9pbnRlcnMgYW5kIHRvIGJlIGFsbG9jYXRlZCB3aXRoIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIG1hbGxvYy4pCisgKi8KKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGxpbmtlciBuZWVkcyBnbG9iYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MKKyAqIHRoYW4gdGhlIGZpcnN0IDE1IGNoYXJhY3RlcnMuCisgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKKy8qIEFsdGhvdWdoIGEgcmVhbCBBTlNJIEMgY29tcGlsZXIgY2FuIGRlYWwgcGVyZmVjdGx5IHdlbGwgd2l0aCBwb2ludGVycyB0bworICogdW5zcGVjaWZpZWQgc3RydWN0dXJlcyAoc2VlICJpbmNvbXBsZXRlIHR5cGVzIiBpbiB0aGUgc3BlYyksIGEgZmV3IHByZS1BTlNJCisgKiBhbmQgcHNldWRvLUFOU0kgY29tcGlsZXJzIGdldCBjb25mdXNlZC4gIFRvIGtlZXAgb25lIG9mIHRoZXNlIGJvem9zIGhhcHB5LAorICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdQorICogYWN0dWFsbHkgZ2V0ICJtaXNzaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uIiB3YXJuaW5ncyBvciBlcnJvcnMgd2hpbGUKKyAqIGNvbXBpbGluZyB0aGUgSlBFRyBjb2RlLgorICovCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworCisvKgorICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKKyAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCisgKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQorICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgaGFzIGJlZW4gZGVmaW5lZC4KKyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBpbXBsZW1lbnRzICI+PiIgb24gc2lnbmVkIHZhbHVlcyBhcyBhIGxvZ2ljYWwKKyAqICh1bnNpZ25lZCkgc2hpZnQ7IGxlYXZlIGl0IHVuZGVmaW5lZCBpZiAiPj4iIGlzIGEgc2lnbmVkIChhcml0aG1ldGljKSBzaGlmdCwKKyAqIHdoaWNoIGlzIHRoZSBub3JtYWwgYW5kIHJhdGlvbmFsIGRlZmluaXRpb24uCisgKi8KKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisKKy8qCisgKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgZG8gbm90IGFmZmVjdCB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwKKyAqIGJ1dCBvbmx5IHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnIChzZWUgY2pwZWcuYywgZGpwZWcuYykuCisgKiBPdGhlciBhcHBsaWNhdGlvbnMgY2FuIGlnbm9yZSB0aGVzZS4KKyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisvKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoaWNoIGltYWdlIChub24tSlBFRykgZmlsZSBmb3JtYXRzIGFyZSBhbGxvd2VkLiAqLworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBuYW1lIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbiB0aGUgY29tbWFuZAorICogbGluZSwgcmF0aGVyIHRoYW4gdXNpbmcgc3Rkb3V0IGFuZCBvcHRpb25hbGx5IHN0ZGluLiAgWW91IE1VU1QgZG8gdGhpcyBpZgorICogeW91ciBzeXN0ZW0gY2FuJ3QgY29wZSB3aXRoIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LiAgU2VlIGNvbW1lbnRzIGF0CisgKiBoZWFkIG9mIGNqcGVnLmMgb3IgZGpwZWcuYy4KKyAqLworI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIG5lZWRzIGV4cGxpY2l0IGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVzLgorICogVGhpcyBpcyBjcnVjaWFsIHVuZGVyIE1TLURPUywgd2hlcmUgdGhlIHRlbXBvcmFyeSAiZmlsZXMiIG1heSBiZSBhcmVhcworICogb2YgZXh0ZW5kZWQgbWVtb3J5OyBvbiBtb3N0IG90aGVyIHN5c3RlbXMgaXQncyBub3QgYXMgaW1wb3J0YW50LgorICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorCisvKiBCeSBkZWZhdWx0LCB3ZSBvcGVuIGltYWdlIGZpbGVzIHdpdGggZm9wZW4oLi4uLCJyYiIpIG9yIGZvcGVuKC4uLiwid2IiKS4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCB0ZXh0IGZpbGVzIGZyb20gYmluYXJ5IGZpbGVzLAorICogYW5kIGlzIGhhcm1sZXNzIG9uIG1vc3Qgc3lzdGVtcyB0aGF0IGRvbid0LiAgSWYgeW91IGhhdmUgb25lIG9mIHRoZSByYXJlCisgKiBzeXN0ZW1zIHRoYXQgY29tcGxhaW5zIGFib3V0IHRoZSAiYiIgc3BlYywgZGVmaW5lIHRoaXMgc3ltYm9sLgorICovCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuCisgKi8KKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQKKworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamNvbmZpZy5oIGIvY29tbW9uL2pwZWcvamNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjkxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qY29uZmlnLmgKQEAgLTAsMCArMSw0NSBAQAorLyogamNvbmZpZy52YyAtLS0gamNvbmZpZy5oIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBvbiBXaW5kb3dzIDk1IG9yIE5ULiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBIQVZFX1NURERFRl9ICisjZGVmaW5lIEhBVkVfU1RETElCX0gKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAorI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIHdlIHByZXN1bWUgYSAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20gKi8KKyNpZm5kZWYgX19SUENORFJfSF9fCQkvKiBkb24ndCBjb25mbGljdCBpZiBycGNuZHIuaCBhbHJlYWR5IHJlYWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuOworI2VuZGlmCisjZGVmaW5lIEhBVkVfQk9PTEVBTgkJLyogcHJldmVudCBqbW9yZWNmZy5oIGZyb20gcmVkZWZpbmluZyBpdCAqLworCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgKi8KKyNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE1pY3Jvc29mdCBoYXMgc2V0bW9kZSgpICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorI3VuZGVmIERPTlRfVVNFX0JfTU9ERQorI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pjcGFyYW0uYyBiL2NvbW1vbi9qcGVnL2pjcGFyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmM0OGY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamNwYXJhbS5jCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogamNwYXJhbS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgb3B0aW9uYWwgZGVmYXVsdC1zZXR0aW5nIGNvZGUgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBBcHBsaWNhdGlvbnMgZG8gbm90IGhhdmUgdG8gdXNlIHRoaXMgZmlsZSwgYnV0IHRob3NlIHRoYXQgZG9uJ3QgdXNlIGl0CisgKiBtdXN0IGtub3cgYSBsb3QgbW9yZSBhYm91dCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBjb2RlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogUXVhbnRpemF0aW9uIHRhYmxlIHNldHVwIHJvdXRpbmVzCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2FkZF9xdWFudF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCisJCSAgICAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCisvKiBEZWZpbmUgYSBxdWFudGl6YXRpb24gdGFibGUgZXF1YWwgdG8gdGhlIGJhc2ljX3RhYmxlIHRpbWVzCisgKiBhIHNjYWxlIGZhY3RvciAoZ2l2ZW4gYXMgYSBwZXJjZW50YWdlKS4KKyAqIElmIGZvcmNlX2Jhc2VsaW5lIGlzIFRSVUUsIHRoZSBjb21wdXRlZCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcworICogYXJlIGxpbWl0ZWQgdG8gMS4uMjU1IGZvciBKUEVHIGJhc2VsaW5lIGNvbXBhdGliaWxpdHkuCisgKi8KK3sKKyAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOworICBpbnQgaTsKKyAgbG9uZyB0ZW1wOworCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIGlmICh3aGljaF90YmwgPCAwIHx8IHdoaWNoX3RibCA+PSBOVU1fUVVBTlRfVEJMUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EUVRfSU5ERVgsIHdoaWNoX3RibCk7CisKKyAgcXRibHB0ciA9ICYgY2luZm8tPnF1YW50X3RibF9wdHJzW3doaWNoX3RibF07CisKKyAgaWYgKCpxdGJscHRyID09IE5VTEwpCisgICAgKnF0YmxwdHIgPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgIHRlbXAgPSAoKGxvbmcpIGJhc2ljX3RhYmxlW2ldICogc2NhbGVfZmFjdG9yICsgNTBMKSAvIDEwMEw7CisgICAgLyogbGltaXQgdGhlIHZhbHVlcyB0byB0aGUgdmFsaWQgcmFuZ2UgKi8KKyAgICBpZiAodGVtcCA8PSAwTCkgdGVtcCA9IDFMOworICAgIGlmICh0ZW1wID4gMzI3NjdMKSB0ZW1wID0gMzI3NjdMOyAvKiBtYXggcXVhbnRpemVyIG5lZWRlZCBmb3IgMTIgYml0cyAqLworICAgIGlmIChmb3JjZV9iYXNlbGluZSAmJiB0ZW1wID4gMjU1TCkKKyAgICAgIHRlbXAgPSAyNTVMOwkJLyogbGltaXQgdG8gYmFzZWxpbmUgcmFuZ2UgaWYgcmVxdWVzdGVkICovCisgICAgKCpxdGJscHRyKS0+cXVhbnR2YWxbaV0gPSAoVUlOVDE2KSB0ZW1wOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBzZW50X3RhYmxlIEZBTFNFIHNvIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCisgICgqcXRibHB0ciktPnNlbnRfdGFibGUgPSBGQUxTRTsKK30KKworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYWxlX2ZhY3RvciwKKwkJCSBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzCisgKiBhbmQgYSBzdHJhaWdodCBwZXJjZW50YWdlLXNjYWxpbmcgcXVhbGl0eSBzY2FsZS4gIEluIG1vc3QgY2FzZXMgaXQncyBiZXR0ZXIKKyAqIHRvIHVzZSBqcGVnX3NldF9xdWFsaXR5IChiZWxvdyk7IHRoaXMgZW50cnkgcG9pbnQgaXMgcHJvdmlkZWQgZm9yCisgKiBhcHBsaWNhdGlvbnMgdGhhdCBpbnNpc3Qgb24gYSBsaW5lYXIgcGVyY2VudGFnZSBzY2FsaW5nLgorICovCit7CisgIC8qIFRoZXNlIGFyZSB0aGUgc2FtcGxlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gSlBFRyBzcGVjIHNlY3Rpb24gSy4xLgorICAgKiBUaGUgc3BlYyBzYXlzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBwcm9kdWNlICJnb29kIiBxdWFsaXR5LCBhbmQKKyAgICogd2hlbiBkaXZpZGVkIGJ5IDIsICJ2ZXJ5IGdvb2QiIHF1YWxpdHkuCisgICAqLworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0ZF9sdW1pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgICAxNiwgIDExLCAgMTAsICAxNiwgIDI0LCAgNDAsICA1MSwgIDYxLAorICAgIDEyLCAgMTIsICAxNCwgIDE5LCAgMjYsICA1OCwgIDYwLCAgNTUsCisgICAgMTQsICAxMywgIDE2LCAgMjQsICA0MCwgIDU3LCAgNjksICA1NiwKKyAgICAxNCwgIDE3LCAgMjIsICAyOSwgIDUxLCAgODcsICA4MCwgIDYyLAorICAgIDE4LCAgMjIsICAzNywgIDU2LCAgNjgsIDEwOSwgMTAzLCAgNzcsCisgICAgMjQsICAzNSwgIDU1LCAgNjQsICA4MSwgMTA0LCAxMTMsICA5MiwKKyAgICA0OSwgIDY0LCAgNzgsICA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICAgIDcyLCAgOTIsICA5NSwgIDk4LCAxMTIsIDEwMCwgMTAzLCAgOTkKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGRfY2hyb21pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgICAxNywgIDE4LCAgMjQsICA0NywgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDE4LCAgMjEsICAyNiwgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgMjQsICAyNiwgIDU2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA0NywgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTkKKyAgfTsKKworICAvKiBTZXQgdXAgdHdvIHF1YW50aXphdGlvbiB0YWJsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2FsaW5nICovCisgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCAwLCBzdGRfbHVtaW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgMSwgc3RkX2Nocm9taW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKK0dMT0JBTChpbnQpCitqcGVnX3F1YWxpdHlfc2NhbGluZyAoaW50IHF1YWxpdHkpCisvKiBDb252ZXJ0IGEgdXNlci1zcGVjaWZpZWQgcXVhbGl0eSByYXRpbmcgdG8gYSBwZXJjZW50YWdlIHNjYWxpbmcgZmFjdG9yCisgKiBmb3IgYW4gdW5kZXJseWluZyBxdWFudGl6YXRpb24gdGFibGUsIHVzaW5nIG91ciByZWNvbW1lbmRlZCBzY2FsaW5nIGN1cnZlLgorICogVGhlIGlucHV0ICdxdWFsaXR5JyBmYWN0b3Igc2hvdWxkIGJlIDAgKHRlcnJpYmxlKSB0byAxMDAgKHZlcnkgZ29vZCkuCisgKi8KK3sKKyAgLyogU2FmZXR5IGxpbWl0IG9uIHF1YWxpdHkgZmFjdG9yLiAgQ29udmVydCAwIHRvIDEgdG8gYXZvaWQgemVybyBkaXZpZGUuICovCisgIGlmIChxdWFsaXR5IDw9IDApIHF1YWxpdHkgPSAxOworICBpZiAocXVhbGl0eSA+IDEwMCkgcXVhbGl0eSA9IDEwMDsKKworICAvKiBUaGUgYmFzaWMgdGFibGUgaXMgdXNlZCBhcy1pcyAoc2NhbGluZyAxMDApIGZvciBhIHF1YWxpdHkgb2YgNTAuCisgICAqIFF1YWxpdGllcyA1MC4uMTAwIGFyZSBjb252ZXJ0ZWQgdG8gc2NhbGluZyBwZXJjZW50YWdlIDIwMCAtIDIqUTsKKyAgICogbm90ZSB0aGF0IGF0IFE9MTAwIHRoZSBzY2FsaW5nIGlzIDAsIHdoaWNoIHdpbGwgY2F1c2UganBlZ19hZGRfcXVhbnRfdGFibGUKKyAgICogdG8gbWFrZSBhbGwgdGhlIHRhYmxlIGVudHJpZXMgMSAoaGVuY2UsIG1pbmltdW0gcXVhbnRpemF0aW9uIGxvc3MpLgorICAgKiBRdWFsaXRpZXMgMS4uNTAgYXJlIGNvbnZlcnRlZCB0byBzY2FsaW5nIHBlcmNlbnRhZ2UgNTAwMC9RLgorICAgKi8KKyAgaWYgKHF1YWxpdHkgPCA1MCkKKyAgICBxdWFsaXR5ID0gNTAwMCAvIHF1YWxpdHk7CisgIGVsc2UKKyAgICBxdWFsaXR5ID0gMjAwIC0gcXVhbGl0eSoyOworCisgIHJldHVybiBxdWFsaXR5OworfQorCisKK0dMT0JBTCh2b2lkKQoranBlZ19zZXRfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzLgorICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgcXVhbGl0eS1hZGp1c3RpbmcgZW50cnkgcG9pbnQgZm9yIHR5cGljYWwgdXNlcgorICogaW50ZXJmYWNlczsgb25seSB0aG9zZSB3aG8gd2FudCBkZXRhaWxlZCBjb250cm9sIG92ZXIgcXVhbnRpemF0aW9uIHRhYmxlcworICogd291bGQgdXNlIHRoZSBwcmVjZWRpbmcgdGhyZWUgcm91dGluZXMgZGlyZWN0bHkuCisgKi8KK3sKKyAgLyogQ29udmVydCB1c2VyIDAtMTAwIHJhdGluZyB0byBwZXJjZW50YWdlIHNjYWxpbmcgKi8KKyAgcXVhbGl0eSA9IGpwZWdfcXVhbGl0eV9zY2FsaW5nKHF1YWxpdHkpOworCisgIC8qIFNldCB1cCBzdGFuZGFyZCBxdWFsaXR5IHRhYmxlcyAqLworICBqcGVnX3NldF9saW5lYXJfcXVhbGl0eShjaW5mbywgcXVhbGl0eSwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKKy8qCisgKiBIdWZmbWFuIHRhYmxlIHNldHVwIHJvdXRpbmVzCisgKi8KKworTE9DQUwodm9pZCkKK2FkZF9odWZmX3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJSkhVRkZfVEJMICoqaHRibHB0ciwgY29uc3QgVUlOVDggKmJpdHMsIGNvbnN0IFVJTlQ4ICp2YWwpCisvKiBEZWZpbmUgYSBIdWZmbWFuIHRhYmxlICovCit7CisgIGludCBuc3ltYm9scywgbGVuOworCisgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBDb3B5IHRoZSBudW1iZXItb2Ytc3ltYm9scy1vZi1lYWNoLWNvZGUtbGVuZ3RoIGNvdW50cyAqLworICBNRU1DT1BZKCgqaHRibHB0ciktPmJpdHMsIGJpdHMsIFNJWkVPRigoKmh0YmxwdHIpLT5iaXRzKSk7CisKKyAgLyogVmFsaWRhdGUgdGhlIGNvdW50cy4gIFdlIGRvIHRoaXMgaGVyZSBtYWlubHkgc28gd2UgY2FuIGNvcHkgdGhlIHJpZ2h0CisgICAqIG51bWJlciBvZiBzeW1ib2xzIGZyb20gdGhlIHZhbFtdIGFycmF5LCB3aXRob3V0IHJpc2tpbmcgbWFyY2hpbmcgb2ZmCisgICAqIHRoZSBlbmQgb2YgbWVtb3J5LiAgamNodWZmLmMgd2lsbCBkbyBhIG1vcmUgdGhvcm91Z2ggdGVzdCBsYXRlci4KKyAgICovCisgIG5zeW1ib2xzID0gMDsKKyAgZm9yIChsZW4gPSAxOyBsZW4gPD0gMTY7IGxlbisrKQorICAgIG5zeW1ib2xzICs9IGJpdHNbbGVuXTsKKyAgaWYgKG5zeW1ib2xzIDwgMSB8fCBuc3ltYm9scyA+IDI1NikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKworICBNRU1DT1BZKCgqaHRibHB0ciktPmh1ZmZ2YWwsIHZhbCwgbnN5bWJvbHMgKiBTSVpFT0YoVUlOVDgpKTsKKworICAvKiBJbml0aWFsaXplIHNlbnRfdGFibGUgRkFMU0Ugc28gdGFibGUgd2lsbCBiZSB3cml0dGVuIHRvIEpQRUcgZmlsZS4gKi8KKyAgKCpodGJscHRyKS0+c2VudF90YWJsZSA9IEZBTFNFOworfQorCisKK0xPQ0FMKHZvaWQpCitzdGRfaHVmZl90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2V0IHVwIHRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyAoY2YuIEpQRUcgc3RhbmRhcmQgc2VjdGlvbiBLLjMpICovCisvKiBJTVBPUlRBTlQ6IHRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbiEgKi8KK3sKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfbHVtaW5hbmNlWzE3XSA9CisgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMSwgNSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2x1bWluYW5jZVtdID0KKyAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSB9OworICAKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfY2hyb21pbmFuY2VbMTddID0KKyAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfZGNfY2hyb21pbmFuY2VbXSA9CisgICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfTsKKyAgCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2x1bWluYW5jZVsxN10gPQorICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDIsIDEsIDMsIDMsIDIsIDQsIDMsIDUsIDUsIDQsIDQsIDAsIDAsIDEsIDB4N2QgfTsKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9hY19sdW1pbmFuY2VbXSA9CisgICAgeyAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAgICAgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywKKyAgICAgIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4YTEsIDB4MDgsCisgICAgICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAgICAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwKKyAgICAgIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCisgICAgICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwKKyAgICAgIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksCisgICAgICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAgICAgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwKKyAgICAgIDB4N2EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksCisgICAgICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAgICAgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywKKyAgICAgIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsCisgICAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAgICAgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwKKyAgICAgIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTEsIDB4ZTIsCisgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAorICAgICAgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgICAgIDB4ZjksIDB4ZmEgfTsKKyAgCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2Nocm9taW5hbmNlWzE3XSA9CisgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3NyB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2FjX2Nocm9taW5hbmNlW10gPQorICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwKKyAgICAgIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCisgICAgICAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAorICAgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwKKyAgICAgIDB4MTUsIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsCisgICAgICAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI2LAorICAgICAgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgICAgIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsCisgICAgICAweDQ5LCAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAorICAgICAgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKKyAgICAgIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCisgICAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKKyAgICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCisgICAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LAorICAgICAgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywKKyAgICAgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsCisgICAgICAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAorICAgICAgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwKKyAgICAgIDB4ZWEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgICAgICAweGY5LCAweGZhIH07CisgIAorICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzBdLAorCQkgYml0c19kY19sdW1pbmFuY2UsIHZhbF9kY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5hY19odWZmX3RibF9wdHJzWzBdLAorCQkgYml0c19hY19sdW1pbmFuY2UsIHZhbF9hY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzFdLAorCQkgYml0c19kY19jaHJvbWluYW5jZSwgdmFsX2RjX2Nocm9taW5hbmNlKTsKKyAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1sxXSwKKwkJIGJpdHNfYWNfY2hyb21pbmFuY2UsIHZhbF9hY19jaHJvbWluYW5jZSk7Cit9CisKKworLyoKKyAqIERlZmF1bHQgcGFyYW1ldGVyIHNldHVwIGZvciBjb21wcmVzc2lvbi4KKyAqCisgKiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBjaG9vc2UgdG8gdXNlIHRoaXMgcm91dGluZSBtdXN0IGRvIHRoZWlyCisgKiBvd24gc2V0dXAgb2YgYWxsIHRoZXNlIHBhcmFtZXRlcnMuICBBbHRlcm5hdGVseSwgeW91IGNhbiBjYWxsIHRoaXMKKyAqIHRvIGVzdGFibGlzaCBkZWZhdWx0cyBhbmQgdGhlbiBhbHRlciBwYXJhbWV0ZXJzIHNlbGVjdGl2ZWx5LiAgVGhpcworICogaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoIHNpbmNlLCBpZiB3ZSBhZGQgYW55IG5ldyBwYXJhbWV0ZXJzLAorICogeW91ciBjb2RlIHdpbGwgc3RpbGwgd29yayAodGhleSdsbCBiZSBzZXQgdG8gcmVhc29uYWJsZSBkZWZhdWx0cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NldF9kZWZhdWx0cyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBpOworCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIEFsbG9jYXRlIGNvbXBfaW5mbyBhcnJheSBsYXJnZSBlbm91Z2ggZm9yIG1heGltdW0gY29tcG9uZW50IGNvdW50LgorICAgKiBBcnJheSBpcyBtYWRlIHBlcm1hbmVudCBpbiBjYXNlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNvbXByZXNzCisgICAqIG11bHRpcGxlIGltYWdlcyBhdCBzYW1lIHBhcmFtIHNldHRpbmdzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5jb21wX2luZm8gPT0gTlVMTCkKKyAgICBjaW5mby0+Y29tcF9pbmZvID0gKGpwZWdfY29tcG9uZW50X2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJCSAgTUFYX0NPTVBPTkVOVFMgKiBTSVpFT0YoanBlZ19jb21wb25lbnRfaW5mbykpOworCisgIC8qIEluaXRpYWxpemUgZXZlcnl0aGluZyBub3QgZGVwZW5kZW50IG9uIHRoZSBjb2xvciBzcGFjZSAqLworCisgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IEJJVFNfSU5fSlNBTVBMRTsKKyAgLyogU2V0IHVwIHR3byBxdWFudGl6YXRpb24gdGFibGVzIHVzaW5nIGRlZmF1bHQgcXVhbGl0eSBvZiA3NSAqLworICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCA3NSwgVFJVRSk7CisgIC8qIFNldCB1cCB0d28gSHVmZm1hbiB0YWJsZXMgKi8KKyAgc3RkX2h1ZmZfdGFibGVzKGNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIGRlZmF1bHQgYXJpdGhtZXRpYyBjb2RpbmcgY29uZGl0aW9uaW5nICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmFyaXRoX2RjX0xbaV0gPSAwOworICAgIGNpbmZvLT5hcml0aF9kY19VW2ldID0gMTsKKyAgICBjaW5mby0+YXJpdGhfYWNfS1tpXSA9IDU7CisgIH0KKworICAvKiBEZWZhdWx0IGlzIG5vIG11bHRpcGxlLXNjYW4gb3V0cHV0ICovCisgIGNpbmZvLT5zY2FuX2luZm8gPSBOVUxMOworICBjaW5mby0+bnVtX3NjYW5zID0gMDsKKworICAvKiBFeHBlY3Qgbm9ybWFsIHNvdXJjZSBpbWFnZSwgbm90IHJhdyBkb3duc2FtcGxlZCBkYXRhICovCisgIGNpbmZvLT5yYXdfZGF0YV9pbiA9IEZBTFNFOworCisgIC8qIFVzZSBIdWZmbWFuIGNvZGluZywgbm90IGFyaXRobWV0aWMgY29kaW5nLCBieSBkZWZhdWx0ICovCisgIGNpbmZvLT5hcml0aF9jb2RlID0gRkFMU0U7CisKKyAgLyogQnkgZGVmYXVsdCwgZG9uJ3QgZG8gZXh0cmEgcGFzc2VzIHRvIG9wdGltaXplIGVudHJvcHkgY29kaW5nICovCisgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBGQUxTRTsKKyAgLyogVGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbi4KKyAgICogSWYgdGhlIHByZWNpc2lvbiBpcyBoaWdoZXIsIGZvcmNlIG9wdGltaXphdGlvbiBvbiBzbyB0aGF0IHVzYWJsZQorICAgKiB0YWJsZXMgd2lsbCBiZSBjb21wdXRlZC4gIFRoaXMgdGVzdCBjYW4gYmUgcmVtb3ZlZCBpZiBkZWZhdWx0IHRhYmxlcworICAgKiBhcmUgc3VwcGxpZWQgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBkZXNpcmVkIHByZWNpc2lvbi4KKyAgICovCisgIGlmIChjaW5mby0+ZGF0YV9wcmVjaXNpb24gPiA4KQorICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOworCisgIC8qIEJ5IGRlZmF1bHQsIHVzZSB0aGUgc2ltcGxlciBub24tY29zaXRlZCBzYW1wbGluZyBhbGlnbm1lbnQgKi8KKyAgY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcgPSBGQUxTRTsKKworICAvKiBObyBpbnB1dCBzbW9vdGhpbmcgKi8KKyAgY2luZm8tPnNtb290aGluZ19mYWN0b3IgPSAwOworCisgIC8qIERDVCBhbGdvcml0aG0gcHJlZmVyZW5jZSAqLworICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKKworICAvKiBObyByZXN0YXJ0IG1hcmtlcnMgKi8KKyAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAwOworICBjaW5mby0+cmVzdGFydF9pbl9yb3dzID0gMDsKKworICAvKiBGaWxsIGluIGRlZmF1bHQgSkZJRiBtYXJrZXIgcGFyYW1ldGVycy4gIE5vdGUgdGhhdCB3aGV0aGVyIHRoZSBtYXJrZXIKKyAgICogd2lsbCBhY3R1YWxseSBiZSB3cml0dGVuIGlzIGRldGVybWluZWQgYnkganBlZ19zZXRfY29sb3JzcGFjZS4KKyAgICoKKyAgICogQnkgZGVmYXVsdCwgdGhlIGxpYnJhcnkgZW1pdHMgSkZJRiB2ZXJzaW9uIGNvZGUgMS4wMS4KKyAgICogQW4gYXBwbGljYXRpb24gdGhhdCB3YW50cyB0byBlbWl0IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBzaG91bGQgc2V0CisgICAqIEpGSUZfbWlub3JfdmVyc2lvbiB0byAyLiAgV2UgY291bGQgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCBqdXN0IGRlZmF1bHRpbmcKKyAgICogdG8gMS4wMiwgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBzb21lIGRlY29kZXJzIGluIHVzZSB0aGF0IHdpbGwgY29tcGxhaW4KKyAgICogYWJvdXQgdGhhdDsgc2F5aW5nIDEuMDEgc2hvdWxkIG1pbmltaXplIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuCisgICAqLworICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gMTsgLyogRGVmYXVsdCBKRklGIHZlcnNpb24gPSAxLjAxICovCisgIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSAxOworICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMDsJLyogUGl4ZWwgc2l6ZSBpcyB1bmtub3duIGJ5IGRlZmF1bHQgKi8KKyAgY2luZm8tPlhfZGVuc2l0eSA9IDE7CQkvKiBQaXhlbCBhc3BlY3QgcmF0aW8gaXMgc3F1YXJlIGJ5IGRlZmF1bHQgKi8KKyAgY2luZm8tPllfZGVuc2l0eSA9IDE7CisKKyAgLyogQ2hvb3NlIEpQRUcgY29sb3JzcGFjZSBiYXNlZCBvbiBpbnB1dCBzcGFjZSwgc2V0IGRlZmF1bHRzIGFjY29yZGluZ2x5ICovCisKKyAganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoY2luZm8pOworfQorCisKKy8qCisgKiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUgSlBFRyBjb2xvcnNwYWNlIGZvciBpbl9jb2xvcl9zcGFjZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgc3dpdGNoIChjaW5mby0+aW5fY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19HUkFZU0NBTEUpOworICAgIGJyZWFrOworICBjYXNlIEpDU19SR0I6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfQ01ZSzoKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfQ01ZSyk7IC8qIEJ5IGRlZmF1bHQsIG5vIHRyYW5zbGF0aW9uICovCisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1lDQ0s6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDQ0spOworICAgIGJyZWFrOworICBjYXNlIEpDU19VTktOT1dOOgorICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19VTktOT1dOKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgfQorfQorCisKKy8qCisgKiBTZXQgdGhlIEpQRUcgY29sb3JzcGFjZSwgYW5kIGNob29zZSBjb2xvcnNwYWNlLWRlcGVuZGVudCBkZWZhdWx0IHZhbHVlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X2NvbG9yc3BhY2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpCit7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBpbnQgY2k7CisKKyNkZWZpbmUgU0VUX0NPTVAoaW5kZXgsaWQsaHNhbXAsdnNhbXAscXVhbnQsZGN0YmwsYWN0YmwpICBcCisgIChjb21wcHRyID0gJmNpbmZvLT5jb21wX2luZm9baW5kZXhdLCBcCisgICBjb21wcHRyLT5jb21wb25lbnRfaWQgPSAoaWQpLCBcCisgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gKGhzYW1wKSwgXAorICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9ICh2c2FtcCksIFwKKyAgIGNvbXBwdHItPnF1YW50X3RibF9ubyA9IChxdWFudCksIFwKKyAgIGNvbXBwdHItPmRjX3RibF9ubyA9IChkY3RibCksIFwKKyAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChhY3RibCkgKQorCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIEZvciBhbGwgY29sb3JzcGFjZXMsIHdlIHVzZSBRIGFuZCBIdWZmIHRhYmxlcyAwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cywKKyAgICogdGFibGVzIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCisgICAqLworCisgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gY29sb3JzcGFjZTsKKworICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBGQUxTRTsgLyogTm8gbWFya2VyIGZvciBub24tSkZJRiBjb2xvcnNwYWNlcyAqLworICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gRkFMU0U7IC8qIHdyaXRlIG5vIEFkb2JlIG1hcmtlciBieSBkZWZhdWx0ICovCisKKyAgc3dpdGNoIChjb2xvcnNwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMTsKKyAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSUQgMSAqLworICAgIFNFVF9DT01QKDAsIDEsIDEsMSwgMCwgMCwwKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfUkdCOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBSR0IgKi8KKyAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSAzOworICAgIFNFVF9DT01QKDAsIDB4NTIgLyogJ1InICovLCAxLDEsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMSwgMHg0NyAvKiAnRycgKi8sIDEsMSwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgyLCAweDQyIC8qICdCJyAqLywgMSwxLCAwLCAwLDApOworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMzsKKyAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSURzIDEsMiwzICovCisgICAgLyogV2UgZGVmYXVsdCB0byAyeDIgc3Vic2FtcGxlcyBvZiBjaHJvbWluYW5jZSAqLworICAgIFNFVF9DT01QKDAsIDEsIDIsMiwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgxLCAyLCAxLDEsIDEsIDEsMSk7CisgICAgU0VUX0NPTVAoMiwgMywgMSwxLCAxLCAxLDEpOworICAgIGJyZWFrOworICBjYXNlIEpDU19DTVlLOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBDTVlLICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKKyAgICBTRVRfQ09NUCgwLCAweDQzIC8qICdDJyAqLywgMSwxLCAwLCAwLDApOworICAgIFNFVF9DT01QKDEsIDB4NEQgLyogJ00nICovLCAxLDEsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMiwgMHg1OSAvKiAnWScgKi8sIDEsMSwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgzLCAweDRCIC8qICdLJyAqLywgMSwxLCAwLCAwLDApOworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ0NLOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBZQ0NLICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKKyAgICBTRVRfQ09NUCgwLCAxLCAyLDIsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMSwgMiwgMSwxLCAxLCAxLDEpOworICAgIFNFVF9DT01QKDIsIDMsIDEsMSwgMSwgMSwxKTsKKyAgICBTRVRfQ09NUCgzLCA0LCAyLDIsIDAsIDAsMCk7CisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1VOS05PV046CisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gY2luZm8tPmlucHV0X2NvbXBvbmVudHM7CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA8IDEgfHwgY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKKwkgICAgICAgTUFYX0NPTVBPTkVOVFMpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgU0VUX0NPTVAoY2ksIGNpLCAxLDEsIDAsIDAsMCk7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgIH0KK30KKworCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKworTE9DQUwoanBlZ19zY2FuX2luZm8gKikKK2ZpbGxfYV9zY2FuIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBjaSwKKwkgICAgIGludCBTcywgaW50IFNlLCBpbnQgQWgsIGludCBBbCkKKy8qIFN1cHBvcnQgcm91dGluZTogZ2VuZXJhdGUgb25lIHNjYW4gZm9yIHNwZWNpZmllZCBjb21wb25lbnQgKi8KK3sKKyAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7CisgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFswXSA9IGNpOworICBzY2FucHRyLT5TcyA9IFNzOworICBzY2FucHRyLT5TZSA9IFNlOworICBzY2FucHRyLT5BaCA9IEFoOworICBzY2FucHRyLT5BbCA9IEFsOworICBzY2FucHRyKys7CisgIHJldHVybiBzY2FucHRyOworfQorCitMT0NBTChqcGVnX3NjYW5faW5mbyAqKQorZmlsbF9zY2FucyAoanBlZ19zY2FuX2luZm8gKiBzY2FucHRyLCBpbnQgbmNvbXBzLAorCSAgICBpbnQgU3MsIGludCBTZSwgaW50IEFoLCBpbnQgQWwpCisvKiBTdXBwb3J0IHJvdXRpbmU6IGdlbmVyYXRlIG9uZSBzY2FuIGZvciBlYWNoIGNvbXBvbmVudCAqLworeworICBpbnQgY2k7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7CisgICAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7CisgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4WzBdID0gY2k7CisgICAgc2NhbnB0ci0+U3MgPSBTczsKKyAgICBzY2FucHRyLT5TZSA9IFNlOworICAgIHNjYW5wdHItPkFoID0gQWg7CisgICAgc2NhbnB0ci0+QWwgPSBBbDsKKyAgICBzY2FucHRyKys7CisgIH0KKyAgcmV0dXJuIHNjYW5wdHI7Cit9CisKK0xPQ0FMKGpwZWdfc2Nhbl9pbmZvICopCitmaWxsX2RjX3NjYW5zIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBuY29tcHMsIGludCBBaCwgaW50IEFsKQorLyogU3VwcG9ydCByb3V0aW5lOiBnZW5lcmF0ZSBpbnRlcmxlYXZlZCBEQyBzY2FuIGlmIHBvc3NpYmxlLCBlbHNlIE4gc2NhbnMgKi8KK3sKKyAgaW50IGNpOworCisgIGlmIChuY29tcHMgPD0gTUFYX0NPTVBTX0lOX1NDQU4pIHsKKyAgICAvKiBTaW5nbGUgaW50ZXJsZWF2ZWQgREMgc2NhbiAqLworICAgIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSBuY29tcHM7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKQorICAgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXSA9IGNpOworICAgIHNjYW5wdHItPlNzID0gc2NhbnB0ci0+U2UgPSAwOworICAgIHNjYW5wdHItPkFoID0gQWg7CisgICAgc2NhbnB0ci0+QWwgPSBBbDsKKyAgICBzY2FucHRyKys7CisgIH0gZWxzZSB7CisgICAgLyogTm9uaW50ZXJsZWF2ZWQgREMgc2NhbiBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDAsIDAsIEFoLCBBbCk7CisgIH0KKyAgcmV0dXJuIHNjYW5wdHI7Cit9CisKKworLyoKKyAqIENyZWF0ZSBhIHJlY29tbWVuZGVkIHByb2dyZXNzaXZlLUpQRUcgc2NyaXB0LgorICogY2luZm8tPm51bV9jb21wb25lbnRzIGFuZCBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSBtdXN0IGJlIGNvcnJlY3QuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBuY29tcHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgIGludCBuc2NhbnM7CisgIGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKKworICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICAvKiBGaWd1cmUgc3BhY2UgbmVlZGVkIGZvciBzY3JpcHQuICBDYWxjdWxhdGlvbiBtdXN0IG1hdGNoIGNvZGUgYmVsb3chICovCisgIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCisgICAgbnNjYW5zID0gMTA7CisgIH0gZWxzZSB7CisgICAgLyogQWxsLXB1cnBvc2Ugc2NyaXB0IGZvciBvdGhlciBjb2xvciBzcGFjZXMuICovCisgICAgaWYgKG5jb21wcyA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgICAgbnNjYW5zID0gNiAqIG5jb21wczsJLyogMiBEQyArIDQgQUMgc2NhbnMgcGVyIGNvbXBvbmVudCAqLworICAgIGVsc2UKKyAgICAgIG5zY2FucyA9IDIgKyA0ICogbmNvbXBzOwkvKiAyIERDIHNjYW5zOyA0IEFDIHNjYW5zIHBlciBjb21wb25lbnQgKi8KKyAgfQorCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBzY3JpcHQuCisgICAqIFdlIG5lZWQgdG8gcHV0IGl0IGluIHRoZSBwZXJtYW5lbnQgcG9vbCBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBwZXJmb3JtcworICAgKiBtdWx0aXBsZSBjb21wcmVzc2lvbnMgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2V0dGluZ3MuICBUbyBhdm9pZCBhIG1lbW9yeQorICAgKiBsZWFrIGlmIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGlzIGNhbGxlZCByZXBlYXRlZGx5IGZvciB0aGUgc2FtZSBKUEVHCisgICAqIG9iamVjdCwgd2UgdHJ5IHRvIHJlLXVzZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzcGFjZSwgYW5kIHdlIGFsbG9jYXRlCisgICAqIGVub3VnaCBzcGFjZSB0byBoYW5kbGUgWUNiQ3IgZXZlbiBpZiBpbml0aWFsbHkgYXNrZWQgZm9yIGdyYXlzY2FsZS4KKyAgICovCisgIGlmIChjaW5mby0+c2NyaXB0X3NwYWNlID09IE5VTEwgfHwgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplIDwgbnNjYW5zKSB7CisgICAgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplID0gTUFYKG5zY2FucywgMTApOworICAgIGNpbmZvLT5zY3JpcHRfc3BhY2UgPSAoanBlZ19zY2FuX2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplICogU0laRU9GKGpwZWdfc2Nhbl9pbmZvKSk7CisgIH0KKyAgc2NhbnB0ciA9IGNpbmZvLT5zY3JpcHRfc3BhY2U7CisgIGNpbmZvLT5zY2FuX2luZm8gPSBzY2FucHRyOworICBjaW5mby0+bnVtX3NjYW5zID0gbnNjYW5zOworCisgIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCisgICAgLyogSW5pdGlhbCBEQyBzY2FuICovCisgICAgc2NhbnB0ciA9IGZpbGxfZGNfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAwLCAxKTsKKyAgICAvKiBJbml0aWFsIEFDIHNjYW46IGdldCBzb21lIGx1bWEgZGF0YSBvdXQgaW4gYSBodXJyeSAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA1LCAwLCAyKTsKKyAgICAvKiBDaHJvbWEgZGF0YSBpcyB0b28gc21hbGwgdG8gYmUgd29ydGggZXhwZW5kaW5nIG1hbnkgc2NhbnMgb24gKi8KKyAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMiwgMSwgNjMsIDAsIDEpOworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAxLCAxLCA2MywgMCwgMSk7CisgICAgLyogQ29tcGxldGUgc3BlY3RyYWwgc2VsZWN0aW9uIGZvciBsdW1hIEFDICovCisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDYsIDYzLCAwLCAyKTsKKyAgICAvKiBSZWZpbmUgbmV4dCBiaXQgb2YgbHVtYSBBQyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA2MywgMiwgMSk7CisgICAgLyogRmluaXNoIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7CisgICAgLyogRmluaXNoIEFDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAyLCAxLCA2MywgMSwgMCk7CisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDEsIDEsIDYzLCAxLCAwKTsKKyAgICAvKiBMdW1hIGJvdHRvbSBiaXQgY29tZXMgbGFzdCBzaW5jZSBpdCdzIHVzdWFsbHkgbGFyZ2VzdCBzY2FuICovCisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDEsIDYzLCAxLCAwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBBbGwtcHVycG9zZSBzY3JpcHQgZm9yIG90aGVyIGNvbG9yIHNwYWNlcy4gKi8KKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmlyc3QgcGFzcyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMCwgMSk7CisgICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA1LCAwLCAyKTsKKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDYsIDYzLCAwLCAyKTsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gc2Vjb25kIHBhc3MgKi8KKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDYzLCAyLCAxKTsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmluYWwgcGFzcyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7CisgICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA2MywgMSwgMCk7CisgIH0KK30KKworI2VuZGlmIC8qIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qY3BodWZmLmMgYi9jb21tb24vanBlZy9qY3BodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmOTE3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pjcGh1ZmYuYwpAQCAtMCwwICsxLDgzMyBAQAorLyoKKyAqIGpjcGh1ZmYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZyByb3V0aW5lcyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KKyAqCisgKiBXZSBkbyBub3Qgc3VwcG9ydCBvdXRwdXQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhlIGxpYnJhcnkKKyAqIGN1cnJlbnRseSBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZS1zY2FuIGZpbGVzIHRvIGJlIHdyaXR0ZW4gd2l0aCBvdXRwdXQKKyAqIHN1c3BlbnNpb24uCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpjaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpjaHVmZi5jICovCisKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorCisvKiBFeHBhbmRlZCBlbnRyb3B5IGVuY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGVuY29kaW5nLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBNb2RlIGZsYWc6IFRSVUUgZm9yIG9wdGltaXphdGlvbiwgRkFMU0UgZm9yIGFjdHVhbCBkYXRhIG91dHB1dCAqLworICBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzOworCisgIC8qIEJpdC1sZXZlbCBjb2Rpbmcgc3RhdHVzLgorICAgKiBuZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyIGFyZSBsb2NhbCBjb3BpZXMgb2YgY2luZm8tPmRlc3QgZmllbGRzLgorICAgKi8KKyAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworICBJTlQzMiBwdXRfYnVmZmVyOwkJLyogY3VycmVudCBiaXQtYWNjdW11bGF0aW9uIGJ1ZmZlciAqLworICBpbnQgcHV0X2JpdHM7CQkJLyogIyBvZiBiaXRzIG5vdyBpbiBpdCAqLworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGxpbmsgdG8gY2luZm8gKG5lZWRlZCBmb3IgZHVtcF9idWZmZXIpICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgREMgY29tcG9uZW50cyAqLworICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgQUMgY29tcG9uZW50cyAqLworICBpbnQgYWNfdGJsX25vOwkJLyogdGhlIHRhYmxlIG51bWJlciBvZiB0aGUgc2luZ2xlIGNvbXBvbmVudCAqLworICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJLyogcnVuIGxlbmd0aCBvZiBFT0JzICovCisgIHVuc2lnbmVkIGludCBCRTsJCS8qICMgb2YgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIGJlZm9yZSBNQ1UgKi8KKyAgY2hhciAqIGJpdF9idWZmZXI7CQkvKiBidWZmZXIgZm9yIGNvcnJlY3Rpb24gYml0cyAoMSBwZXIgY2hhcikgKi8KKyAgLyogcGFja2luZyBjb3JyZWN0aW9uIGJpdHMgdGlnaHRseSB3b3VsZCBzYXZlIHNvbWUgc3BhY2UgYnV0IGNvc3QgdGltZS4uLiAqLworCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKS4KKyAgICogU2luY2UgYW55IG9uZSBzY2FuIGNvZGVzIG9ubHkgREMgb3Igb25seSBBQywgd2Ugb25seSBuZWVkIG9uZSBzZXQKKyAgICogb2YgdGFibGVzLCBub3Qgb25lIGZvciBEQyBhbmQgb25lIGZvciBBQy4KKyAgICovCisgIGNfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyAgLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbjsgYWdhaW4sIG9uZSBzZXQgaXMgZW5vdWdoICovCisgIGxvbmcgKiBjb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOworfSBwaHVmZl9lbnRyb3B5X2VuY29kZXI7CisKK3R5cGVkZWYgcGh1ZmZfZW50cm9weV9lbmNvZGVyICogcGh1ZmZfZW50cm9weV9wdHI7CisKKy8qIE1BWF9DT1JSX0JJVFMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBBQyByZWZpbmVtZW50IGNvcnJlY3Rpb24tYml0CisgKiBidWZmZXIgY2FuIGhvbGQuICBMYXJnZXIgc2l6ZXMgbWF5IHNsaWdodGx5IGltcHJvdmUgY29tcHJlc3Npb24sIGJ1dAorICogMTAwMCBpcyBhbHJlYWR5IHdlbGwgaW50byB0aGUgcmVhbG0gb2Ygb3ZlcmtpbGwuCisgKiBUaGUgbWluaW11bSBzYWZlIHNpemUgaXMgNjQgYml0cy4KKyAqLworCisjZGVmaW5lIE1BWF9DT1JSX0JJVFMgIDEwMDAJLyogTWF4ICMgb2YgY29ycmVjdGlvbiBiaXRzIEkgY2FuIGJ1ZmZlciAqLworCisvKiBJUklHSFRfU0hJRlQgaXMgbGlrZSBSSUdIVF9TSElGVCwgYnV0IHdvcmtzIG9uIGludCByYXRoZXIgdGhhbiBJTlQzMi4KKyAqIFdlIGFzc3VtZSB0aGF0IGludCByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCBpZiBJTlQzMiByaWdodCBzaGlmdCBpcywKKyAqIHdoaWNoIHNob3VsZCBiZSBzYWZlLgorICovCisKKyNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI2RlZmluZSBJU0hJRlRfVEVNUFMJaW50IGlzaGlmdF90ZW1wOworI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAorCSgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKKwkgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4wKSA8PCAoMTYtKHNoZnQpKSkgOiBcCisJIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQorI2Vsc2UKKyNkZWZpbmUgSVNISUZUX1RFTVBTCisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQorI2VuZGlmCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9EQ19maXJzdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0RDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0FDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19waHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitNRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyX3BodWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2NhbiB1c2luZyBwcm9ncmVzc2l2ZSBKUEVHLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCit7ICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGJvb2xlYW4gaXNfRENfYmFuZDsKKyAgaW50IGNpLCB0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIGVudHJvcHktPmNpbmZvID0gY2luZm87CisgIGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzID0gZ2F0aGVyX3N0YXRpc3RpY3M7CisKKyAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7CisKKyAgLyogV2UgYXNzdW1lIGpjbWFzdGVyLmMgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHNjYW4gcGFyYW1ldGVycy4gKi8KKworICAvKiBTZWxlY3QgZXhlY3V0aW9uIHJvdXRpbmVzICovCisgIGlmIChjaW5mby0+QWggPT0gMCkgeworICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0RDX2ZpcnN0OworICAgIGVsc2UKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9BQ19maXJzdDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfRENfYmFuZCkKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9EQ19yZWZpbmU7CisgICAgZWxzZSB7CisgICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfQUNfcmVmaW5lOworICAgICAgLyogQUMgcmVmaW5lbWVudCBuZWVkcyBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlciAqLworICAgICAgaWYgKGVudHJvcHktPmJpdF9idWZmZXIgPT0gTlVMTCkKKwllbnRyb3B5LT5iaXRfYnVmZmVyID0gKGNoYXIgKikKKwkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgTUFYX0NPUlJfQklUUyAqIFNJWkVPRihjaGFyKSk7CisgICAgfQorICB9CisgIGlmIChnYXRoZXJfc3RhdGlzdGljcykKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19nYXRoZXJfcGh1ZmY7CisgIGVsc2UKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19waHVmZjsKKworICAvKiBPbmx5IERDIGNvZWZmaWNpZW50cyBtYXkgYmUgaW50ZXJsZWF2ZWQsIHNvIGNpbmZvLT5jb21wc19pbl9zY2FuID0gMQorICAgKiBmb3IgQUMgY29lZmZpY2llbnRzLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLworICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgICAgLyogR2V0IHRhYmxlIGluZGV4ICovCisgICAgaWYgKGlzX0RDX2JhbmQpIHsKKyAgICAgIGlmIChjaW5mby0+QWggIT0gMCkJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLworCWNvbnRpbnVlOworICAgICAgdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIH0gZWxzZSB7CisgICAgICBlbnRyb3B5LT5hY190Ymxfbm8gPSB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87CisgICAgfQorICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgeworICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdGFibGUgaW5kZXggKi8KKyAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLworICAgICAgaWYgKHRibCA8IDAgfHwgdGJsID49IE5VTV9IVUZGX1RCTFMpCisgICAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibCk7CisgICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KKyAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KKyAgICAgIGlmIChlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPT0gTlVMTCkKKwllbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPSAobG9uZyAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOworICAgICAgTUVNWkVSTyhlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGUgKi8KKyAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCisgICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgaXNfRENfYmFuZCwgdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSBBQyBzdHVmZiAqLworICBlbnRyb3B5LT5FT0JSVU4gPSAwOworICBlbnRyb3B5LT5CRSA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCisgIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOworICBlbnRyb3B5LT5wdXRfYml0cyA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOworfQorCisKKy8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUuCisgKiBOQjogdGhlc2UgbXVzdCBiZSBjYWxsZWQgb25seSB3aGVuIGFjdHVhbGx5IG91dHB1dHRpbmcsCisgKiB0aGF0IGlzLCBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcyA9PSBGQUxTRS4KKyAqLworCisvKiBFbWl0IGEgYnl0ZSAqLworI2RlZmluZSBlbWl0X2J5dGUoZW50cm9weSx2YWwpICBcCisJeyAqKGVudHJvcHkpLT5uZXh0X291dHB1dF9ieXRlKysgPSAoSk9DVEVUKSAodmFsKTsgIFwKKwkgIGlmICgtLShlbnRyb3B5KS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKKwkgICAgZHVtcF9idWZmZXIoZW50cm9weSk7IH0KKworCitMT0NBTCh2b2lkKQorZHVtcF9idWZmZXIgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCisvKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlcjsgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZS4gKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGVudHJvcHktPmNpbmZvLT5kZXN0OworCisgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGVudHJvcHktPmNpbmZvKSkKKyAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisgIC8qIEFmdGVyIGEgc3VjY2Vzc2Z1bCBidWZmZXIgZHVtcCwgbXVzdCByZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gZGVzdC0+ZnJlZV9pbl9idWZmZXI7Cit9CisKKworLyogT3V0cHV0dGluZyBiaXRzIHRvIHRoZSBmaWxlICovCisKKy8qIE9ubHkgdGhlIHJpZ2h0IDI0IGJpdHMgb2YgcHV0X2J1ZmZlciBhcmUgdXNlZDsgdGhlIHZhbGlkIGJpdHMgYXJlCisgKiBsZWZ0LWp1c3RpZmllZCBpbiB0aGlzIHBhcnQuICBBdCBtb3N0IDE2IGJpdHMgY2FuIGJlIHBhc3NlZCB0byBlbWl0X2JpdHMKKyAqIGluIG9uZSBjYWxsLCBhbmQgd2UgbmV2ZXIgcmV0YWluIG1vcmUgdGhhbiA3IGJpdHMgaW4gcHV0X2J1ZmZlcgorICogYmV0d2VlbiBjYWxscywgc28gMjQgYml0cyBhcmUgc3VmZmljaWVudC4KKyAqLworCitJTkxJTkUKK0xPQ0FMKHZvaWQpCitlbWl0X2JpdHMgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKKy8qIEVtaXQgc29tZSBiaXRzLCB1bmxlc3Mgd2UgYXJlIGluIGdhdGhlciBtb2RlICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCisgIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7CisgIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IGVudHJvcHktPnB1dF9iaXRzOworCisgIC8qIGlmIHNpemUgaXMgMCwgY2FsbGVyIHVzZWQgYW4gaW52YWxpZCBIdWZmbWFuIHRhYmxlIGVudHJ5ICovCisgIGlmIChzaXplID09IDApCisgICAgRVJSRVhJVChlbnRyb3B5LT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7CisKKyAgaWYgKGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKQorICAgIHJldHVybjsJCQkvKiBkbyBub3RoaW5nIGlmIHdlJ3JlIG9ubHkgZ2V0dGluZyBzdGF0cyAqLworCisgIHB1dF9idWZmZXIgJj0gKCgoSU5UMzIpIDEpPDxzaXplKSAtIDE7IC8qIG1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIGNvZGUgKi8KKyAgCisgIHB1dF9iaXRzICs9IHNpemU7CQkvKiBuZXcgbnVtYmVyIG9mIGJpdHMgaW4gYnVmZmVyICovCisgIAorICBwdXRfYnVmZmVyIDw8PSAyNCAtIHB1dF9iaXRzOyAvKiBhbGlnbiBpbmNvbWluZyBiaXRzICovCisKKyAgcHV0X2J1ZmZlciB8PSBlbnRyb3B5LT5wdXRfYnVmZmVyOyAvKiBhbmQgbWVyZ2Ugd2l0aCBvbGQgYnVmZmVyIGNvbnRlbnRzICovCisKKyAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKKyAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKKyAgICAKKyAgICBlbWl0X2J5dGUoZW50cm9weSwgYyk7CisgICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KKyAgICAgIGVtaXRfYnl0ZShlbnRyb3B5LCAwKTsKKyAgICB9CisgICAgcHV0X2J1ZmZlciA8PD0gODsKKyAgICBwdXRfYml0cyAtPSA4OworICB9CisKKyAgZW50cm9weS0+cHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7IC8qIHVwZGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+cHV0X2JpdHMgPSBwdXRfYml0czsKK30KKworCitMT0NBTCh2b2lkKQorZmx1c2hfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSkKK3sKKyAgZW1pdF9iaXRzKGVudHJvcHksIDB4N0YsIDcpOyAvKiBmaWxsIGFueSBwYXJ0aWFsIGJ5dGUgd2l0aCBvbmVzICovCisgIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOyAgICAgLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgZW50cm9weS0+cHV0X2JpdHMgPSAwOworfQorCisKKy8qCisgKiBFbWl0IChvciBqdXN0IGNvdW50KSBhIEh1ZmZtYW4gc3ltYm9sLgorICovCisKK0lOTElORQorTE9DQUwodm9pZCkKK2VtaXRfc3ltYm9sIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgdGJsX25vLCBpbnQgc3ltYm9sKQoreworICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCisgICAgZW50cm9weS0+Y291bnRfcHRyc1t0Ymxfbm9dW3N5bWJvbF0rKzsKKyAgZWxzZSB7CisgICAgY19kZXJpdmVkX3RibCAqIHRibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0Ymxfbm9dOworICAgIGVtaXRfYml0cyhlbnRyb3B5LCB0YmwtPmVodWZjb1tzeW1ib2xdLCB0YmwtPmVodWZzaVtzeW1ib2xdKTsKKyAgfQorfQorCisKKy8qCisgKiBFbWl0IGJpdHMgZnJvbSBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlci4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9idWZmZXJlZF9iaXRzIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBjaGFyICogYnVmc3RhcnQsCisJCSAgICB1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisgIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKKyAgICByZXR1cm47CQkJLyogbm8gcmVhbCB3b3JrICovCisKKyAgd2hpbGUgKG5iaXRzID4gMCkgeworICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAoKmJ1ZnN0YXJ0KSwgMSk7CisgICAgYnVmc3RhcnQrKzsKKyAgICBuYml0cy0tOworICB9Cit9CisKKworLyoKKyAqIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIHN5bWJvbC4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9lb2JydW4gKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCit7CisgIHJlZ2lzdGVyIGludCB0ZW1wLCBuYml0czsKKworICBpZiAoZW50cm9weS0+RU9CUlVOID4gMCkgewkvKiBpZiB0aGVyZSBpcyBhbnkgcGVuZGluZyBFT0JSVU4gKi8KKyAgICB0ZW1wID0gZW50cm9weS0+RU9CUlVOOworICAgIG5iaXRzID0gMDsKKyAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQorICAgICAgbmJpdHMrKzsKKyAgICAvKiBzYWZldHkgY2hlY2s6IHNob3VsZG4ndCBoYXBwZW4gZ2l2ZW4gbGltaXRlZCBjb3JyZWN0aW9uLWJpdCBidWZmZXIgKi8KKyAgICBpZiAobmJpdHMgPiAxNCkKKyAgICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOworCisgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCBuYml0cyA8PCA0KTsKKyAgICBpZiAobmJpdHMpCisgICAgICBlbWl0X2JpdHMoZW50cm9weSwgZW50cm9weS0+RU9CUlVOLCBuYml0cyk7CisKKyAgICBlbnRyb3B5LT5FT0JSVU4gPSAwOworCisgICAgLyogRW1pdCBhbnkgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzICovCisgICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIGVudHJvcHktPmJpdF9idWZmZXIsIGVudHJvcHktPkJFKTsKKyAgICBlbnRyb3B5LT5CRSA9IDA7CisgIH0KK30KKworCisvKgorICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9yZXN0YXJ0IChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgcmVzdGFydF9udW0pCit7CisgIGludCBjaTsKKworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpZiAoISBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykgeworICAgIGZsdXNoX2JpdHMoZW50cm9weSk7CisgICAgZW1pdF9ieXRlKGVudHJvcHksIDB4RkYpOworICAgIGVtaXRfYnl0ZShlbnRyb3B5LCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSk7CisgIH0KKworICBpZiAoZW50cm9weS0+Y2luZm8tPlNzID09IDApIHsKKyAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBlbnRyb3B5LT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIH0gZWxzZSB7CisgICAgLyogUmUtaW5pdGlhbGl6ZSBhbGwgQUMtcmVsYXRlZCBmaWVsZHMgdG8gMCAqLworICAgIGVudHJvcHktPkVPQlJVTiA9IDA7CisgICAgZW50cm9weS0+QkUgPSAwOworICB9Cit9CisKKworLyoKKyAqIE1DVSBlbmNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9EQ19maXJzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7CisgIHJlZ2lzdGVyIGludCBuYml0czsKKyAgaW50IGJsa24sIGNpOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIElTSElGVF9URU1QUworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKyAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCisgICAgLyogQ29tcHV0ZSB0aGUgREMgdmFsdWUgYWZ0ZXIgdGhlIHJlcXVpcmVkIHBvaW50IHRyYW5zZm9ybSBieSBBbC4KKyAgICAgKiBUaGlzIGlzIHNpbXBseSBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LgorICAgICAqLworICAgIHRlbXAyID0gSVJJR0hUX1NISUZUKChpbnQpICgoKmJsb2NrKVswXSksIEFsKTsKKworICAgIC8qIERDIGRpZmZlcmVuY2VzIGFyZSBmaWd1cmVkIG9uIHRoZSBwb2ludC10cmFuc2Zvcm1lZCB2YWx1ZXMuICovCisgICAgdGVtcCA9IHRlbXAyIC0gZW50cm9weS0+bGFzdF9kY192YWxbY2ldOworICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IHRlbXAyOworCisgICAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEcuMS4yLjEgKi8KKyAgICB0ZW1wMiA9IHRlbXA7CisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgLyogRm9yIGEgbmVnYXRpdmUgaW5wdXQsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGlucHV0KSAqLworICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisgICAgICB0ZW1wMi0tOworICAgIH0KKyAgICAKKyAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCisgICAgbmJpdHMgPSAwOworICAgIHdoaWxlICh0ZW1wKSB7CisgICAgICBuYml0cysrOworICAgICAgdGVtcCA+Pj0gMTsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCisgICAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KKyAgICAgKi8KKyAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgICAgCisgICAgLyogQ291bnQvZW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGNvbXBwdHItPmRjX3RibF9ubywgbmJpdHMpOworICAgIAorICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICAgIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLworICAgICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cyk7CisgIH0KKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNQ1UgZW5jb2RpbmcgZm9yIEFDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKKyAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfQUNfZmlyc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgU2UgPSBjaW5mby0+U2U7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgSkJMT0NLUk9XIGJsb2NrOworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2sgKi8KKyAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKworICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBHLjEuMi4yLCBmaWcuIEcuMyAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgIAorICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIGlmICgodGVtcCA9ICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvKiBXZSBtdXN0IGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuICBGb3IgQUMgY29lZmZpY2llbnRzIHRoaXMKKyAgICAgKiBpcyBhbiBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG93YXJkcyAwLiAgVG8gZG8gdGhpcyBwb3J0YWJseQorICAgICAqIGluIEMsIHdlIHNoaWZ0IGFmdGVyIG9idGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWU7IHNvIHRoZSBjb2RlIGlzCisgICAgICogaW50ZXJ3b3ZlbiB3aXRoIGZpbmRpbmcgdGhlIGFicyB2YWx1ZSAodGVtcCkgYW5kIG91dHB1dCBiaXRzICh0ZW1wMikuCisgICAgICovCisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCisgICAgICAvKiBGb3IgYSBuZWdhdGl2ZSBjb2VmLCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhjb2VmKSAqLworICAgICAgdGVtcDIgPSB+dGVtcDsKKyAgICB9IGVsc2UgeworICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCisgICAgICB0ZW1wMiA9IHRlbXA7CisgICAgfQorICAgIC8qIFdhdGNoIG91dCBmb3IgY2FzZSB0aGF0IG5vbnplcm8gY29lZiBpcyB6ZXJvIGFmdGVyIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGlmICh0ZW1wID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOICovCisgICAgaWYgKGVudHJvcHktPkVPQlJVTiA+IDApCisgICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgd2hpbGUgKHIgPiAxNSkgeworICAgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAweEYwKTsKKyAgICAgIHIgLT0gMTY7CisgICAgfQorCisgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgIG5iaXRzID0gMTsJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLworICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCisgICAgICBuYml0cysrOworICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyBuYml0cyk7CisKKyAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KKyAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KKyAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKTsKKworICAgIHIgPSAwOwkJCS8qIHJlc2V0IHplcm8gcnVuIGxlbmd0aCAqLworICB9CisKKyAgaWYgKHIgPiAwKSB7CQkJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KKyAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLworICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPT0gMHg3RkZGKQorICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CS8qIGZvcmNlIGl0IG91dCB0byBhdm9pZCBvdmVyZmxvdyAqLworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICogTm90ZTogd2UgYXNzdW1lIHN1Y2ggc2NhbnMgY2FuIGJlIG11bHRpLWNvbXBvbmVudCwgYWx0aG91Z2ggdGhlIHNwZWMKKyAqIGlzIG5vdCB2ZXJ5IGNsZWFyIG9uIHRoZSBwb2ludC4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfRENfcmVmaW5lIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworICBpbnQgYmxrbjsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICBKQkxPQ0tST1cgYmxvY2s7CisKKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworCisgICAgLyogV2Ugc2ltcGx5IGVtaXQgdGhlIEFsJ3RoIGJpdCBvZiB0aGUgREMgY29lZmZpY2llbnQgdmFsdWUuICovCisgICAgdGVtcCA9ICgqYmxvY2spWzBdOworICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAodGVtcCA+PiBBbCksIDEpOworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9BQ19yZWZpbmUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXA7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgRU9COworICBjaGFyICpCUl9idWZmZXI7CisgIHVuc2lnbmVkIGludCBCUjsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKyAgaW50IGFic3ZhbHVlc1tEQ1RTSVpFMl07CisKKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9jayAqLworICBibG9jayA9IE1DVV9kYXRhWzBdOworCisgIC8qIEl0IGlzIGNvbnZlbmllbnQgdG8gbWFrZSBhIHByZS1wYXNzIHRvIGRldGVybWluZSB0aGUgdHJhbnNmb3JtZWQKKyAgICogY29lZmZpY2llbnRzJyBhYnNvbHV0ZSB2YWx1ZXMgYW5kIHRoZSBFT0IgcG9zaXRpb24uCisgICAqLworICBFT0IgPSAwOworICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIHRlbXAgPSAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dOworICAgIC8qIFdlIG11c3QgYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSBieSBBbC4gIEZvciBBQyBjb2VmZmljaWVudHMgdGhpcworICAgICAqIGlzIGFuIGludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0b3dhcmRzIDAuICBUbyBkbyB0aGlzIHBvcnRhYmx5CisgICAgICogaW4gQywgd2Ugc2hpZnQgYWZ0ZXIgb2J0YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAodGVtcCA8IDApCisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGFic3ZhbHVlc1trXSA9IHRlbXA7CS8qIHNhdmUgYWJzIHZhbHVlIGZvciBtYWluIHBhc3MgKi8KKyAgICBpZiAodGVtcCA9PSAxKQorICAgICAgRU9CID0gazsJCQkvKiBFT0IgPSBpbmRleCBvZiBsYXN0IG5ld2x5LW5vbnplcm8gY29lZiAqLworICB9CisKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRy4xLjIuMywgZmlnLiBHLjcgKi8KKyAgCisgIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCisgIEJSID0gMDsJCQkvKiBCUiA9IGNvdW50IG9mIGJ1ZmZlcmVkIGJpdHMgYWRkZWQgbm93ICovCisgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXIgKyBlbnRyb3B5LT5CRTsgLyogQXBwZW5kIGJpdHMgdG8gYnVmZmVyICovCisKKyAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKKyAgICBpZiAoKHRlbXAgPSBhYnN2YWx1ZXNba10pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHJlcXVpcmVkIFpSTHMsIGJ1dCBub3QgaWYgdGhleSBjYW4gYmUgZm9sZGVkIGludG8gRU9CICovCisgICAgd2hpbGUgKHIgPiAxNSAmJiBrIDw9IEVPQikgeworICAgICAgLyogZW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOworICAgICAgLyogRW1pdCBaUkwgKi8KKyAgICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgMHhGMCk7CisgICAgICByIC09IDE2OworICAgICAgLyogRW1pdCBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBaUkwgKi8KKyAgICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICAgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXI7IC8qIEJFIGJpdHMgYXJlIGdvbmUgbm93ICovCisgICAgICBCUiA9IDA7CisgICAgfQorCisgICAgLyogSWYgdGhlIGNvZWYgd2FzIHByZXZpb3VzbHkgbm9uemVybywgaXQgb25seSBuZWVkcyBhIGNvcnJlY3Rpb24gYml0LgorICAgICAqIE5PVEU6IGEgc3RyYWlnaHQgdHJhbnNsYXRpb24gb2YgdGhlIHNwZWMncyBmaWd1cmUgRy43IHdvdWxkIHN1Z2dlc3QKKyAgICAgKiB0aGF0IHdlIGFsc28gbmVlZCB0byB0ZXN0IHIgPiAxNS4gIEJ1dCBpZiByID4gMTUsIHdlIGNhbiBvbmx5IGdldCBoZXJlCisgICAgICogaWYgayA+IEVPQiwgd2hpY2ggaW1wbGllcyB0aGF0IHRoaXMgY29lZmZpY2llbnQgaXMgbm90IDEuCisgICAgICovCisgICAgaWYgKHRlbXAgPiAxKSB7CisgICAgICAvKiBUaGUgY29ycmVjdGlvbiBiaXQgaXMgdGhlIG5leHQgYml0IG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gKi8KKyAgICAgIEJSX2J1ZmZlcltCUisrXSA9IChjaGFyKSAodGVtcCAmIDEpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyAxKTsKKworICAgIC8qIEVtaXQgb3V0cHV0IGJpdCBmb3IgbmV3bHktbm9uemVybyBjb2VmICovCisgICAgdGVtcCA9ICgoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dIDwgMCkgPyAwIDogMTsKKyAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcCwgMSk7CisKKyAgICAvKiBFbWl0IGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyB0aGF0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZSAqLworICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyOyAvKiBCRSBiaXRzIGFyZSBnb25lIG5vdyAqLworICAgIEJSID0gMDsKKyAgICByID0gMDsJCQkvKiByZXNldCB6ZXJvIHJ1biBsZW5ndGggKi8KKyAgfQorCisgIGlmIChyID4gMCB8fCBCUiA+IDApIHsJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KKyAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLworICAgIGVudHJvcHktPkJFICs9IEJSOwkJLyogY29uY2F0IG15IGNvcnJlY3Rpb24gYml0cyB0byBvbGRlciBvbmVzICovCisgICAgLyogV2UgZm9yY2Ugb3V0IHRoZSBFT0IgaWYgd2UgcmlzayBlaXRoZXI6CisgICAgICogMS4gb3ZlcmZsb3cgb2YgdGhlIEVPQiBjb3VudGVyOworICAgICAqIDIuIG92ZXJmbG93IG9mIHRoZSBjb3JyZWN0aW9uIGJpdCBidWZmZXIgZHVyaW5nIHRoZSBuZXh0IE1DVS4KKyAgICAgKi8KKyAgICBpZiAoZW50cm9weS0+RU9CUlVOID09IDB4N0ZGRiB8fCBlbnRyb3B5LT5CRSA+IChNQVhfQ09SUl9CSVRTLURDVFNJWkUyKzEpKQorICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CisgIH0KKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBhIEh1ZmZtYW4tY29tcHJlc3NlZCBwcm9ncmVzc2l2ZSBzY2FuLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKworICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIEZsdXNoIG91dCBhbnkgYnVmZmVyZWQgZGF0YSAqLworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgZmx1c2hfYml0cyhlbnRyb3B5KTsKKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYSBzdGF0aXN0aWNzLWdhdGhlcmluZyBwYXNzIGFuZCBjcmVhdGUgdGhlIG5ldyBIdWZmbWFuIHRhYmxlcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX2dhdGhlcl9waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBib29sZWFuIGlzX0RDX2JhbmQ7CisgIGludCBjaSwgdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKyAgSkhVRkZfVEJMICoqaHRibHB0cjsKKyAgYm9vbGVhbiBkaWRbTlVNX0hVRkZfVEJMU107CisKKyAgLyogRmx1c2ggb3V0IGJ1ZmZlcmVkIGRhdGEgKGFsbCB3ZSBjYXJlIGFib3V0IGlzIGNvdW50aW5nIHRoZSBFT0Igc3ltYm9sKSAqLworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKKworICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQorICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCisgICAqLworICBNRU1aRVJPKGRpZCwgU0laRU9GKGRpZCkpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBpZiAoaXNfRENfYmFuZCkgeworICAgICAgaWYgKGNpbmZvLT5BaCAhPSAwKQkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCisJY29udGludWU7CisgICAgICB0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87CisgICAgfSBlbHNlIHsKKyAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICB9CisgICAgaWYgKCEgZGlkW3RibF0pIHsKKyAgICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0YmxdOworICAgICAgZWxzZQorICAgICAgICBodGJscHRyID0gJiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0YmxdOworICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCisgICAgICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0pOworICAgICAgZGlkW3RibF0gPSBUUlVFOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfcGh1ZmZfZW5jb2RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YocGh1ZmZfZW50cm9weV9lbmNvZGVyKSk7CisgIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OworICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfcGh1ZmY7CisKKyAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgICAgZW50cm9weS0+Y291bnRfcHRyc1tpXSA9IE5VTEw7CisgIH0KKyAgZW50cm9weS0+Yml0X2J1ZmZlciA9IE5VTEw7CS8qIG5lZWRlZCBvbmx5IGluIEFDIHJlZmluZW1lbnQgc2NhbiAqLworfQorCisjZW5kaWYgLyogQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pjcHJlcGN0LmMgYi9jb21tb24vanBlZy9qY3ByZXBjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOTMzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qY3ByZXBjdC5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogamNwcmVwY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb21wcmVzc2lvbiBwcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCisgKiBUaGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgY29sb3IgY29udmVyc2lvbiwgZG93bnNhbXBsaW5nLAorICogYW5kIGVkZ2UgZXhwYW5zaW9uIHN0ZXBzLgorICoKKyAqIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBpcyBhc3NvY2lhdGVkIHdpdGggYnVmZmVyaW5nIGlucHV0IHJvd3MKKyAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBkb3duc2FtcGxlci4gIFNlZSB0aGUgY29tbWVudHMgYXQgdGhlIGhlYWQgb2YKKyAqIGpjc2FtcGxlLmMgZm9yIHRoZSBkb3duc2FtcGxlcidzIG5lZWRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBBdCBwcmVzZW50LCBqY3NhbXBsZS5jIGNhbiByZXF1ZXN0IGNvbnRleHQgcm93cyBvbmx5IGZvciBzbW9vdGhpbmcuCisgKiBJbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCBhbHNvIG5lZWQgY29udGV4dCByb3dzIGZvciBDQ0lSNjAxIHNhbXBsaW5nCisgKiBvciBvdGhlciBtb3JlLWNvbXBsZXggZG93bnNhbXBsaW5nIHByb2NlZHVyZXMuICBUaGUgY29kZSB0byBzdXBwb3J0CisgKiBjb250ZXh0IHJvd3Mgc2hvdWxkIGJlIGNvbXBpbGVkIG9ubHkgaWYgbmVlZGVkLgorICovCisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorI2RlZmluZSBDT05URVhUX1JPV1NfU1VQUE9SVEVECisjZW5kaWYKKworCisvKgorICogRm9yIHRoZSBzaW1wbGUgKG5vLWNvbnRleHQtcm93KSBjYXNlLCB3ZSBqdXN0IG5lZWQgdG8gYnVmZmVyIG9uZQorICogcm93IGdyb3VwJ3Mgd29ydGggb2YgcGl4ZWxzIGZvciB0aGUgZG93bnNhbXBsaW5nIHN0ZXAuICBBdCB0aGUgYm90dG9tIG9mCisgKiB0aGUgaW1hZ2UsIHdlIHBhZCB0byBhIGZ1bGwgcm93IGdyb3VwIGJ5IHJlcGxpY2F0aW5nIHRoZSBsYXN0IHBpeGVsIHJvdy4KKyAqIFRoZSBkb3duc2FtcGxlcidzIGxhc3Qgb3V0cHV0IHJvdyBpcyB0aGVuIHJlcGxpY2F0ZWQgaWYgbmVlZGVkIHRvIHBhZAorICogb3V0IHRvIGEgZnVsbCBpTUNVIHJvdy4KKyAqCisgKiBXaGVuIHByb3ZpZGluZyBjb250ZXh0IHJvd3MsIHdlIG11c3QgYnVmZmVyIHRocmVlIHJvdyBncm91cHMnIHdvcnRoIG9mCisgKiBwaXhlbHMuICBUaHJlZSByb3cgZ3JvdXBzIGFyZSBwaHlzaWNhbGx5IGFsbG9jYXRlZCwgYnV0IHRoZSByb3cgcG9pbnRlcgorICogYXJyYXlzIGFyZSBtYWRlIGZpdmUgcm93IGdyb3VwcyBoaWdoLCB3aXRoIHRoZSBleHRyYSBwb2ludGVycyBhYm92ZSBhbmQKKyAqIGJlbG93ICJ3cmFwcGluZyBhcm91bmQiIHRvIHBvaW50IHRvIHRoZSBsYXN0IGFuZCBmaXJzdCByZWFsIHJvdyBncm91cHMuCisgKiBUaGlzIGFsbG93cyB0aGUgZG93bnNhbXBsZXIgdG8gYWNjZXNzIHRoZSBwcm9wZXIgY29udGV4dCByb3dzLgorICogQXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgY3JlYXRlIGR1bW15IGNvbnRleHQgcm93cyBieQorICogY29weWluZyB0aGUgZmlyc3Qgb3IgbGFzdCByZWFsIHBpeGVsIHJvdy4gIFRoaXMgY29weWluZyBjb3VsZCBiZSBhdm9pZGVkCisgKiBieSBwb2ludGVyIGhhY2tpbmcgYXMgaXMgZG9uZSBpbiBqZG1haW5jdC5jLCBidXQgaXQgZG9lc24ndCBzZWVtIHdvcnRoIHRoZQorICogdHJvdWJsZSBvbiB0aGUgY29tcHJlc3Npb24gc2lkZS4KKyAqLworCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlci4gIFRoaXMgYnVmZmVyIGhvbGRzIGNvbG9yLWNvbnZlcnRlZCBkYXRhCisgICAqIHVudGlsIHdlIGhhdmUgZW5vdWdoIHRvIGRvIGEgZG93bnNhbXBsZSBzdGVwLgorICAgKi8KKyAgSlNBTVBBUlJBWSBjb2xvcl9idWZbTUFYX0NPTVBPTkVOVFNdOworCisgIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIHNvdXJjZSBpbWFnZSAqLworICBpbnQgbmV4dF9idWZfcm93OwkJLyogaW5kZXggb2YgbmV4dCByb3cgdG8gc3RvcmUgaW4gY29sb3JfYnVmICovCisKKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECS8qIG9ubHkgbmVlZGVkIGZvciBjb250ZXh0IGNhc2UgKi8KKyAgaW50IHRoaXNfcm93X2dyb3VwOwkJLyogc3RhcnRpbmcgcm93IGluZGV4IG9mIGdyb3VwIHRvIHByb2Nlc3MgKi8KKyAgaW50IG5leHRfYnVmX3N0b3A7CQkvKiBkb3duc2FtcGxlIHdoZW4gd2UgcmVhY2ggdGhpcyBpbmRleCAqLworI2VuZGlmCit9IG15X3ByZXBfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9wcmVwX2NvbnRyb2xsZXIgKiBteV9wcmVwX3B0cjsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3ByZXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7CisKKyAgaWYgKHBhc3NfbW9kZSAhPSBKQlVGX1BBU1NfVEhSVSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLworICBwcmVwLT5yb3dzX3RvX2dvID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgLyogTWFyayB0aGUgY29udmVyc2lvbiBidWZmZXIgZW1wdHkgKi8KKyAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECisgIC8qIFByZXNldCBhZGRpdGlvbmFsIHN0YXRlIHZhcmlhYmxlcyBmb3IgY29udGV4dCBtb2RlLgorICAgKiBUaGVzZSBhcmVuJ3QgdXNlZCBpbiBub24tY29udGV4dCBtb2RlLCBzbyB3ZSBuZWVkbid0IHRlc3Qgd2hpY2ggbW9kZS4KKyAgICovCisgIHByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKKyAgLyogU2V0IG5leHRfYnVmX3N0b3AgdG8gc3RvcCBhZnRlciB0d28gcm93IGdyb3VwcyBoYXZlIGJlZW4gcmVhZCBpbi4gKi8KKyAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IDIgKiBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisjZW5kaWYKK30KKworCisvKgorICogRXhwYW5kIGFuIGltYWdlIHZlcnRpY2FsbHkgZnJvbSBoZWlnaHQgaW5wdXRfcm93cyB0byBoZWlnaHQgb3V0cHV0X3Jvd3MsCisgKiBieSBkdXBsaWNhdGluZyB0aGUgYm90dG9tIHJvdy4KKyAqLworCitMT0NBTCh2b2lkKQorZXhwYW5kX2JvdHRvbV9lZGdlIChKU0FNUEFSUkFZIGltYWdlX2RhdGEsIEpESU1FTlNJT04gbnVtX2NvbHMsCisJCSAgICBpbnQgaW5wdXRfcm93cywgaW50IG91dHB1dF9yb3dzKQoreworICByZWdpc3RlciBpbnQgcm93OworCisgIGZvciAocm93ID0gaW5wdXRfcm93czsgcm93IDwgb3V0cHV0X3Jvd3M7IHJvdysrKSB7CisgICAgamNvcHlfc2FtcGxlX3Jvd3MoaW1hZ2VfZGF0YSwgaW5wdXRfcm93cy0xLCBpbWFnZV9kYXRhLCByb3csCisJCSAgICAgIDEsIG51bV9jb2xzKTsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2ltcGxlIG5vLWNvbnRleHQgY2FzZS4KKyAqCisgKiBQcmVwcm9jZXNzb3Igb3V0cHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAorICogaXMgZGVmaW5lZCB0byBiZSB2X3NhbXBfZmFjdG9yIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LgorICogRG93bnNhbXBsaW5nIHdpbGwgcHJvZHVjZSB0aGlzIG11Y2ggZGF0YSBmcm9tIGVhY2ggbWF4X3Zfc2FtcF9mYWN0b3IKKyAqIGlucHV0IHJvd3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVfcHJvY2Vzc19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCSAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IG51bXJvd3MsIGNpOworICBKRElNRU5TSU9OIGlucm93czsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgd2hpbGUgKCppbl9yb3dfY3RyIDwgaW5fcm93c19hdmFpbCAmJgorCSAqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgeworICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCisgICAgaW5yb3dzID0gaW5fcm93c19hdmFpbCAtICppbl9yb3dfY3RyOworICAgIG51bXJvd3MgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLSBwcmVwLT5uZXh0X2J1Zl9yb3c7CisgICAgbnVtcm93cyA9IChpbnQpIE1JTigoSkRJTUVOU0lPTikgbnVtcm93cywgaW5yb3dzKTsKKyAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKKwkJCQkgICAgICAgcHJlcC0+Y29sb3JfYnVmLAorCQkJCSAgICAgICAoSkRJTUVOU0lPTikgcHJlcC0+bmV4dF9idWZfcm93LAorCQkJCSAgICAgICBudW1yb3dzKTsKKyAgICAqaW5fcm93X2N0ciArPSBudW1yb3dzOworICAgIHByZXAtPm5leHRfYnVmX3JvdyArPSBudW1yb3dzOworICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKKyAgICAvKiBJZiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KKyAgICBpZiAocHJlcC0+cm93c190b19nbyA9PSAwICYmCisJcHJlcC0+bmV4dF9idWZfcm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKwlleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAorCQkJICAgcHJlcC0+bmV4dF9idWZfcm93LCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgICAgfQorICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAgIH0KKyAgICAvKiBJZiB3ZSd2ZSBmaWxsZWQgdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBlbXB0eSBpdC4gKi8KKyAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93ID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+ZG93bnNhbXBsZSkgKGNpbmZvLAorCQkJCQlwcmVwLT5jb2xvcl9idWYsIChKRElNRU5TSU9OKSAwLAorCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOworICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKKyAgICAgICgqb3V0X3Jvd19ncm91cF9jdHIpKys7CisgICAgfQorICAgIC8qIElmIGF0IGJvdHRvbSBvZiBpbWFnZSwgcGFkIHRoZSBvdXRwdXQgdG8gYSBmdWxsIGlNQ1UgaGVpZ2h0LgorICAgICAqIE5vdGUgd2UgYXNzdW1lIHRoZSBjYWxsZXIgaXMgcHJvdmlkaW5nIGEgb25lLWlNQ1UtaGVpZ2h0IG91dHB1dCBidWZmZXIhCisgICAgICovCisgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gMCAmJgorCSpvdXRfcm93X2dyb3VwX2N0ciA8IG91dF9yb3dfZ3JvdXBzX2F2YWlsKSB7CisgICAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSAgIGNpKyssIGNvbXBwdHIrKykgeworCWV4cGFuZF9ib3R0b21fZWRnZShvdXRwdXRfYnVmW2NpXSwKKwkJCSAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCisJCQkgICAoaW50KSAoKm91dF9yb3dfZ3JvdXBfY3RyICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJCQkgICAoaW50KSAob3V0X3Jvd19ncm91cHNfYXZhaWwgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSk7CisgICAgICB9CisgICAgICAqb3V0X3Jvd19ncm91cF9jdHIgPSBvdXRfcm93X2dyb3Vwc19hdmFpbDsKKyAgICAgIGJyZWFrOwkJCS8qIGNhbiBleGl0IG91dGVyIGxvb3Agd2l0aG91dCB0ZXN0ICovCisgICAgfQorICB9Cit9CisKKworI2lmZGVmIENPTlRFWFRfUk9XU19TVVBQT1JURUQKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBjb250ZXh0IGNhc2UuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVfcHJvY2Vzc19jb250ZXh0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJICAgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IG51bXJvd3MsIGNpOworICBpbnQgYnVmX2hlaWdodCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIDM7CisgIEpESU1FTlNJT04gaW5yb3dzOworCisgIHdoaWxlICgqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgeworICAgIGlmICgqaW5fcm93X2N0ciA8IGluX3Jvd3NfYXZhaWwpIHsKKyAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCisgICAgICBpbnJvd3MgPSBpbl9yb3dzX2F2YWlsIC0gKmluX3Jvd19jdHI7CisgICAgICBudW1yb3dzID0gcHJlcC0+bmV4dF9idWZfc3RvcCAtIHByZXAtPm5leHRfYnVmX3JvdzsKKyAgICAgIG51bXJvd3MgPSAoaW50KSBNSU4oKEpESU1FTlNJT04pIG51bXJvd3MsIGlucm93cyk7CisgICAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKKwkJCQkJIHByZXAtPmNvbG9yX2J1ZiwKKwkJCQkJIChKRElNRU5TSU9OKSBwcmVwLT5uZXh0X2J1Zl9yb3csCisJCQkJCSBudW1yb3dzKTsKKyAgICAgIC8qIFBhZCBhdCB0b3Agb2YgaW1hZ2UsIGlmIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gY2luZm8tPmltYWdlX2hlaWdodCkgeworCWZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworCSAgaW50IHJvdzsKKwkgIGZvciAocm93ID0gMTsgcm93IDw9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcjsgcm93KyspIHsKKwkgICAgamNvcHlfc2FtcGxlX3Jvd3MocHJlcC0+Y29sb3JfYnVmW2NpXSwgMCwKKwkJCSAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0sIC1yb3csCisJCQkgICAgICAxLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgICppbl9yb3dfY3RyICs9IG51bXJvd3M7CisgICAgICBwcmVwLT5uZXh0X2J1Zl9yb3cgKz0gbnVtcm93czsKKyAgICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKKyAgICB9IGVsc2UgeworICAgICAgLyogUmV0dXJuIGZvciBtb3JlIGRhdGEsIHVubGVzcyB3ZSBhcmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuICovCisgICAgICBpZiAocHJlcC0+cm93c190b19nbyAhPSAwKQorCWJyZWFrOworICAgICAgLyogV2hlbiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KKyAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPCBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7CisJZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisJICBleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAorCQkJICAgICBwcmVwLT5uZXh0X2J1Zl9yb3csIHByZXAtPm5leHRfYnVmX3N0b3ApOworCX0KKwlwcmVwLT5uZXh0X2J1Zl9yb3cgPSBwcmVwLT5uZXh0X2J1Zl9zdG9wOworICAgICAgfQorICAgIH0KKyAgICAvKiBJZiB3ZSd2ZSBnb3R0ZW4gZW5vdWdoIGRhdGEsIGRvd25zYW1wbGUgYSByb3cgZ3JvdXAuICovCisgICAgaWYgKHByZXAtPm5leHRfYnVmX3JvdyA9PSBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7CisgICAgICAoKmNpbmZvLT5kb3duc2FtcGxlLT5kb3duc2FtcGxlKSAoY2luZm8sCisJCQkJCXByZXAtPmNvbG9yX2J1ZiwKKwkJCQkJKEpESU1FTlNJT04pIHByZXAtPnRoaXNfcm93X2dyb3VwLAorCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOworICAgICAgKCpvdXRfcm93X2dyb3VwX2N0cikrKzsKKyAgICAgIC8qIEFkdmFuY2UgcG9pbnRlcnMgd2l0aCB3cmFwYXJvdW5kIGFzIG5lY2Vzc2FyeS4gKi8KKyAgICAgIHByZXAtPnRoaXNfcm93X2dyb3VwICs9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICAgIGlmIChwcmVwLT50aGlzX3Jvd19ncm91cCA+PSBidWZfaGVpZ2h0KQorCXByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKKyAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPj0gYnVmX2hlaWdodCkKKwlwcmVwLT5uZXh0X2J1Zl9yb3cgPSAwOworICAgICAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IHByZXAtPm5leHRfYnVmX3JvdyArIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICB9CisgIH0KK30KKworCisvKgorICogQ3JlYXRlIHRoZSB3cmFwcGVkLWFyb3VuZCBkb3duc2FtcGxpbmcgaW5wdXQgYnVmZmVyIG5lZWRlZCBmb3IgY29udGV4dCBtb2RlLgorICovCisKK0xPQ0FMKHZvaWQpCitjcmVhdGVfY29udGV4dF9idWZmZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IHJncm91cF9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisgIGludCBjaSwgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpTQU1QQVJSQVkgdHJ1ZV9idWZmZXIsIGZha2VfYnVmZmVyOworCisgIC8qIEdyYWIgZW5vdWdoIHNwYWNlIGZvciBmYWtlIHJvdyBwb2ludGVycyBmb3IgYWxsIHRoZSBjb21wb25lbnRzOworICAgKiB3ZSBuZWVkIGZpdmUgcm93IGdyb3Vwcycgd29ydGggb2YgcG9pbnRlcnMgZm9yIGVhY2ggY29tcG9uZW50LgorICAgKi8KKyAgZmFrZV9idWZmZXIgPSAoSlNBTVBBUlJBWSkKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShjaW5mby0+bnVtX2NvbXBvbmVudHMgKiA1ICogcmdyb3VwX2hlaWdodCkgKgorCQkJCVNJWkVPRihKU0FNUFJPVykpOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBidWZmZXIgc3BhY2UgKDMgcm93IGdyb3VwcykgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqIFdlIG1ha2UgdGhlIGJ1ZmZlciB3aWRlIGVub3VnaCB0byBhbGxvdyB0aGUgZG93bnNhbXBsZXIgdG8gZWRnZS1leHBhbmQKKyAgICAgKiBob3Jpem9udGFsbHkgd2l0aGluIHRoZSBidWZmZXIsIGlmIGl0IHNvIGNob29zZXMuCisgICAgICovCisgICAgdHJ1ZV9idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKEpESU1FTlNJT04pICgoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgKgorCQkgICAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisgICAgICAgKEpESU1FTlNJT04pICgzICogcmdyb3VwX2hlaWdodCkpOworICAgIC8qIENvcHkgdHJ1ZSBidWZmZXIgcm93IHBvaW50ZXJzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUgZmFrZSByb3cgYXJyYXkgKi8KKyAgICBNRU1DT1BZKGZha2VfYnVmZmVyICsgcmdyb3VwX2hlaWdodCwgdHJ1ZV9idWZmZXIsCisJICAgIDMgKiByZ3JvdXBfaGVpZ2h0ICogU0laRU9GKEpTQU1QUk9XKSk7CisgICAgLyogRmlsbCBpbiB0aGUgYWJvdmUgYW5kIGJlbG93IHdyYXBhcm91bmQgcG9pbnRlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwX2hlaWdodDsgaSsrKSB7CisgICAgICBmYWtlX2J1ZmZlcltpXSA9IHRydWVfYnVmZmVyWzIgKiByZ3JvdXBfaGVpZ2h0ICsgaV07CisgICAgICBmYWtlX2J1ZmZlcls0ICogcmdyb3VwX2hlaWdodCArIGldID0gdHJ1ZV9idWZmZXJbaV07CisgICAgfQorICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSBmYWtlX2J1ZmZlciArIHJncm91cF9oZWlnaHQ7CisgICAgZmFrZV9idWZmZXIgKz0gNSAqIHJncm91cF9oZWlnaHQ7IC8qIHBvaW50IHRvIHNwYWNlIGZvciBuZXh0IGNvbXBvbmVudCAqLworICB9Cit9CisKKyNlbmRpZiAvKiBDT05URVhUX1JPV1NfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19wcmVwX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X3ByZXBfcHRyIHByZXA7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaWYgKG5lZWRfZnVsbF9idWZmZXIpCQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgcHJlcCA9IChteV9wcmVwX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9wcmVwX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPnByZXAgPSAoc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgKikgcHJlcDsKKyAgcHJlcC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3ByZXA7CisKKyAgLyogQWxsb2NhdGUgdGhlIGNvbG9yIGNvbnZlcnNpb24gYnVmZmVyLgorICAgKiBXZSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gYWxsb3cgdGhlIGRvd25zYW1wbGVyIHRvIGVkZ2UtZXhwYW5kCisgICAqIGhvcml6b250YWxseSB3aXRoaW4gdGhlIGJ1ZmZlciwgaWYgaXQgc28gY2hvb3Nlcy4KKyAgICovCisgIGlmIChjaW5mby0+ZG93bnNhbXBsZS0+bmVlZF9jb250ZXh0X3Jvd3MpIHsKKyAgICAvKiBTZXQgdXAgdG8gcHJvdmlkZSBjb250ZXh0IHJvd3MgKi8KKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECisgICAgcHJlcC0+cHViLnByZV9wcm9jZXNzX2RhdGEgPSBwcmVfcHJvY2Vzc19jb250ZXh0OworICAgIGNyZWF0ZV9jb250ZXh0X2J1ZmZlcihjaW5mbyk7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8qIE5vIGNvbnRleHQsIGp1c3QgbWFrZSBpdCB0YWxsIGVub3VnaCBmb3Igb25lIHJvdyBncm91cCAqLworICAgIHByZXAtPnB1Yi5wcmVfcHJvY2Vzc19kYXRhID0gcHJlX3Byb2Nlc3NfZGF0YTsKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCSAoSkRJTUVOU0lPTikgKCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSAqCisJCQljaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamNzYW1wbGUuYyBiL2NvbW1vbi9qcGVnL2pjc2FtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyZWM4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pjc2FtcGxlLmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiBqY3NhbXBsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZG93bnNhbXBsaW5nIHJvdXRpbmVzLgorICoKKyAqIERvd25zYW1wbGluZyBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKKyAqIGlzIGRlZmluZWQgdG8gYmUgbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBvZiBlYWNoIGNvbXBvbmVudCwKKyAqIGZyb20gd2hpY2ggdGhlIGRvd25zYW1wbGVyIHByb2R1Y2VzIHZfc2FtcF9mYWN0b3Igc2FtcGxlIHJvd3MuCisgKiBBIHNpbmdsZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIGluIGVhY2ggY2FsbCB0byB0aGUgZG93bnNhbXBsZXIgbW9kdWxlLgorICoKKyAqIFRoZSBkb3duc2FtcGxlciBpcyByZXNwb25zaWJsZSBmb3IgZWRnZS1leHBhbnNpb24gb2YgaXRzIG91dHB1dCBkYXRhCisgKiB0byBmaWxsIGFuIGludGVncmFsIG51bWJlciBvZiBEQ1QgYmxvY2tzIGhvcml6b250YWxseS4gIFRoZSBzb3VyY2UgYnVmZmVyCisgKiBtYXkgYmUgbW9kaWZpZWQgaWYgaXQgaXMgaGVscGZ1bCBmb3IgdGhpcyBwdXJwb3NlICh0aGUgc291cmNlIGJ1ZmZlciBpcworICogYWxsb2NhdGVkIHdpZGUgZW5vdWdoIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGRlc2lyZWQgb3V0cHV0IHdpZHRoKS4KKyAqIFRoZSBjYWxsZXIgKHRoZSBwcmVwIGNvbnRyb2xsZXIpIGlzIHJlc3BvbnNpYmxlIGZvciB2ZXJ0aWNhbCBwYWRkaW5nLgorICoKKyAqIFRoZSBkb3duc2FtcGxlciBtYXkgcmVxdWVzdCAiY29udGV4dCByb3dzIiBieSBzZXR0aW5nIG5lZWRfY29udGV4dF9yb3dzCisgKiBkdXJpbmcgc3RhcnR1cC4gIEluIHRoaXMgY2FzZSwgdGhlIGlucHV0IGFycmF5cyB3aWxsIGNvbnRhaW4gYXQgbGVhc3QKKyAqIG9uZSByb3cgZ3JvdXAncyB3b3J0aCBvZiBwaXhlbHMgYWJvdmUgYW5kIGJlbG93IHRoZSBwYXNzZWQtaW4gZGF0YTsKKyAqIHRoZSBjYWxsZXIgd2lsbCBjcmVhdGUgZHVtbXkgcm93cyBhdCBpbWFnZSB0b3AgYW5kIGJvdHRvbSBieSByZXBsaWNhdGluZworICogdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBwaXhlbCByb3cuCisgKgorICogQW4gZXhjZWxsZW50IHJlZmVyZW5jZSBmb3IgaW1hZ2UgcmVzYW1wbGluZyBpcworICogICBEaWdpdGFsIEltYWdlIFdhcnBpbmcsIEdlb3JnZSBXb2xiZXJnLCAxOTkwLgorICogICBQdWIuIGJ5IElFRUUgQ29tcHV0ZXIgU29jaWV0eSBQcmVzcywgTG9zIEFsYW1pdG9zLCBDQS4gSVNCTiAwLTgxODYtODk0NC03LgorICoKKyAqIFRoZSBkb3duc2FtcGxpbmcgYWxnb3JpdGhtIHVzZWQgaGVyZSBpcyBhIHNpbXBsZSBhdmVyYWdlIG9mIHRoZSBzb3VyY2UKKyAqIHBpeGVscyBjb3ZlcmVkIGJ5IHRoZSBvdXRwdXQgcGl4ZWwuICBUaGUgaGktZmFsdXRpbiBzYW1wbGluZyBsaXRlcmF0dXJlCisgKiByZWZlcnMgdG8gdGhpcyBhcyBhICJib3ggZmlsdGVyIi4gIEluIGdlbmVyYWwgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIGJveAorICogZmlsdGVyIGFyZSBub3QgdmVyeSBnb29kLCBidXQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlcyB3ZSBub3JtYWxseSB1c2UgKDE6MQorICogYW5kIDI6MSByYXRpb3MpIHRoZSBib3ggaXMgZXF1aXZhbGVudCB0byBhICJ0cmlhbmdsZSBmaWx0ZXIiIHdoaWNoIGlzIG5vdAorICogbmVhcmx5IHNvIGJhZC4gIElmIHlvdSBpbnRlbmQgdG8gdXNlIG90aGVyIHNhbXBsaW5nIHJhdGlvcywgeW91J2QgYmUgd2VsbAorICogYWR2aXNlZCB0byBpbXByb3ZlIHRoaXMgY29kZS4KKyAqCisgKiBBIHNpbXBsZSBpbnB1dC1zbW9vdGhpbmcgY2FwYWJpbGl0eSBpcyBwcm92aWRlZC4gIFRoaXMgaXMgbWFpbmx5IGludGVuZGVkCisgKiBmb3IgY2xlYW5pbmcgdXAgY29sb3ItZGl0aGVyZWQgR0lGIGlucHV0IGZpbGVzIChpZiB5b3UgZmluZCBpdCBpbmFkZXF1YXRlLAorICogd2Ugc3VnZ2VzdCB1c2luZyBhbiBleHRlcm5hbCBmaWx0ZXJpbmcgcHJvZ3JhbSBzdWNoIGFzIHBubWNvbnZvbCkuICBXaGVuCisgKiBlbmFibGVkLCBlYWNoIGlucHV0IHBpeGVsIFAgaXMgcmVwbGFjZWQgYnkgYSB3ZWlnaHRlZCBzdW0gb2YgaXRzZWxmIGFuZCBpdHMKKyAqIGVpZ2h0IG5laWdoYm9ycy4gIFAncyB3ZWlnaHQgaXMgMS04KlNGIGFuZCBlYWNoIG5laWdoYm9yJ3Mgd2VpZ2h0IGlzIFNGLAorICogd2hlcmUgU0YgPSAoc21vb3RoaW5nX2ZhY3RvciAvIDEwMjQpLgorICogQ3VycmVudGx5LCBzbW9vdGhpbmcgaXMgb25seSBzdXBwb3J0ZWQgZm9yIDJoMnYgc2FtcGxpbmcgZmFjdG9ycy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUG9pbnRlciB0byByb3V0aW5lIHRvIGRvd25zYW1wbGUgYSBzaW5nbGUgY29tcG9uZW50ICovCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZG93bnNhbXBsZTFfcHRyLAorCQkoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKSk7CisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRG93bnNhbXBsaW5nIG1ldGhvZCBwb2ludGVycywgb25lIHBlciBjb21wb25lbnQgKi8KKyAgZG93bnNhbXBsZTFfcHRyIG1ldGhvZHNbTUFYX0NPTVBPTkVOVFNdOworfSBteV9kb3duc2FtcGxlcjsKKwordHlwZWRlZiBteV9kb3duc2FtcGxlciAqIG15X2Rvd25zYW1wbGVfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIGRvd25zYW1wbGluZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBmb3Igbm93ICovCit9CisKKworLyoKKyAqIEV4cGFuZCBhIGNvbXBvbmVudCBob3Jpem9udGFsbHkgZnJvbSB3aWR0aCBpbnB1dF9jb2xzIHRvIHdpZHRoIG91dHB1dF9jb2xzLAorICogYnkgZHVwbGljYXRpbmcgdGhlIHJpZ2h0bW9zdCBzYW1wbGVzLgorICovCisKK0xPQ0FMKHZvaWQpCitleHBhbmRfcmlnaHRfZWRnZSAoSlNBTVBBUlJBWSBpbWFnZV9kYXRhLCBpbnQgbnVtX3Jvd3MsCisJCSAgIEpESU1FTlNJT04gaW5wdXRfY29scywgSkRJTUVOU0lPTiBvdXRwdXRfY29scykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKU0FNUExFIHBpeHZhbDsKKyAgcmVnaXN0ZXIgaW50IGNvdW50OworICBpbnQgcm93OworICBpbnQgbnVtY29scyA9IChpbnQpIChvdXRwdXRfY29scyAtIGlucHV0X2NvbHMpOworCisgIGlmIChudW1jb2xzID4gMCkgeworICAgIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7CisgICAgICBwdHIgPSBpbWFnZV9kYXRhW3Jvd10gKyBpbnB1dF9jb2xzOworICAgICAgcGl4dmFsID0gcHRyWy0xXTsJCS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIGZvciAoY291bnQgPSBudW1jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pCisJKnB0cisrID0gcGl4dmFsOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBEbyBkb3duc2FtcGxpbmcgZm9yIGEgd2hvbGUgcm93IGdyb3VwIChhbGwgY29tcG9uZW50cykuCisgKgorICogSW4gdGhpcyB2ZXJzaW9uIHdlIHNpbXBseSBkb3duc2FtcGxlIGVhY2ggY29tcG9uZW50IGluZGVwZW5kZW50bHkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzZXBfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCUpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19pbmRleCwKKwkJSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBfaW5kZXgpCit7CisgIG15X2Rvd25zYW1wbGVfcHRyIGRvd25zYW1wbGUgPSAobXlfZG93bnNhbXBsZV9wdHIpIGNpbmZvLT5kb3duc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBKU0FNUEFSUkFZIGluX3B0ciwgb3V0X3B0cjsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGluX3B0ciA9IGlucHV0X2J1ZltjaV0gKyBpbl9yb3dfaW5kZXg7CisgICAgb3V0X3B0ciA9IG91dHB1dF9idWZbY2ldICsgKG91dF9yb3dfZ3JvdXBfaW5kZXggKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICAoKmRvd25zYW1wbGUtPm1ldGhvZHNbY2ldKSAoY2luZm8sIGNvbXBwdHIsIGluX3B0ciwgb3V0X3B0cik7CisgIH0KK30KKworCisvKgorICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgorICogT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBhcmJpdHJhcnkgaW50ZWdyYWwgc2FtcGxpbmcgcmF0aW9zLCB3aXRob3V0IHNtb290aGluZy4KKyAqIE5vdGUgdGhhdCB0aGlzIHZlcnNpb24gaXMgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGN1c3RvbWFyeSBzYW1wbGluZyByYXRpb3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitpbnRfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBpbnJvdywgb3V0cm93LCBoX2V4cGFuZCwgdl9leHBhbmQsIG51bXBpeCwgbnVtcGl4MiwgaCwgdjsKKyAgSkRJTUVOU0lPTiBvdXRjb2wsIG91dGNvbF9oOwkvKiBvdXRjb2xfaCA9PSBvdXRjb2wqaF9leHBhbmQgKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIElOVDMyIG91dHZhbHVlOworCisgIGhfZXhwYW5kID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgdl9leHBhbmQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLyBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICBudW1waXggPSBoX2V4cGFuZCAqIHZfZXhwYW5kOworICBudW1waXgyID0gbnVtcGl4LzI7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogaF9leHBhbmQpOworCisgIGlucm93ID0gMDsKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgZm9yIChvdXRjb2wgPSAwLCBvdXRjb2xfaCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOworCSBvdXRjb2wrKywgb3V0Y29sX2ggKz0gaF9leHBhbmQpIHsKKyAgICAgIG91dHZhbHVlID0gMDsKKyAgICAgIGZvciAodiA9IDA7IHYgPCB2X2V4cGFuZDsgdisrKSB7CisJaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93K3ZdICsgb3V0Y29sX2g7CisJZm9yIChoID0gMDsgaCA8IGhfZXhwYW5kOyBoKyspIHsKKwkgIG91dHZhbHVlICs9IChJTlQzMikgR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisJfQorICAgICAgfQorICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgob3V0dmFsdWUgKyBudW1waXgyKSAvIG51bXBpeCk7CisgICAgfQorICAgIGlucm93ICs9IHZfZXhwYW5kOworICB9Cit9CisKKworLyoKKyAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBmdWxsLXNpemUgY29tcG9uZW50LAorICogd2l0aG91dCBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmdWxsc2l6ZV9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQoreworICAvKiBDb3B5IHRoZSBkYXRhICovCisgIGpjb3B5X3NhbXBsZV9yb3dzKGlucHV0X2RhdGEsIDAsIG91dHB1dF9kYXRhLCAwLAorCQkgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOworICAvKiBFZGdlLWV4cGFuZCAqLworICBleHBhbmRfcmlnaHRfZWRnZShvdXRwdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAorCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFKTsKK30KKworCisvKgorICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwsCisgKiB3aXRob3V0IHNtb290aGluZy4KKyAqCisgKiBBIG5vdGUgYWJvdXQgdGhlICJiaWFzIiBjYWxjdWxhdGlvbnM6IHdoZW4gcm91bmRpbmcgZnJhY3Rpb25hbCB2YWx1ZXMgdG8KKyAqIGludGVnZXIsIHdlIGRvIG5vdCB3YW50IHRvIGFsd2F5cyByb3VuZCAwLjUgdXAgdG8gdGhlIG5leHQgaW50ZWdlci4KKyAqIElmIHdlIGRpZCB0aGF0LCB3ZSdkIGludHJvZHVjZSBhIG5vdGljZWFibGUgYmlhcyB0b3dhcmRzIGxhcmdlciB2YWx1ZXMuCisgKiBJbnN0ZWFkLCB0aGlzIGNvZGUgaXMgYXJyYW5nZWQgc28gdGhhdCAwLjUgd2lsbCBiZSByb3VuZGVkIHVwIG9yIGRvd24gYXQKKyAqIGFsdGVybmF0ZSBwaXhlbCBsb2NhdGlvbnMgKGEgc2ltcGxlIG9yZGVyZWQgZGl0aGVyIHBhdHRlcm4pLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2MV9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBvdXRyb3c7CisgIEpESU1FTlNJT04gb3V0Y29sOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGJpYXM7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CisKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgICAgYmlhcyA9IDA7CQkJLyogYmlhcyA9IDAsMSwwLDEsLi4uIGZvciBzdWNjZXNzaXZlIHNhbXBsZXMgKi8KKyAgICBmb3IgKG91dGNvbCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOyBvdXRjb2wrKykgeworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoR0VUSlNBTVBMRSgqaW5wdHIpICsgR0VUSlNBTVBMRShpbnB0clsxXSkKKwkJCSAgICAgICsgYmlhcykgPj4gMSk7CisgICAgICBiaWFzIF49IDE7CQkvKiAwPT4xLCAxPT4wICovCisgICAgICBpbnB0ciArPSAyOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAorICogd2l0aG91dCBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyAgaW50IGlucm93LCBvdXRyb3c7CisgIEpESU1FTlNJT04gb3V0Y29sOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGJpYXM7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CisKKyAgaW5yb3cgPSAwOworICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKKyAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOworICAgIGJpYXMgPSAxOwkJCS8qIGJpYXMgPSAxLDIsMSwyLC4uLiBmb3Igc3VjY2Vzc2l2ZSBzYW1wbGVzICovCisgICAgZm9yIChvdXRjb2wgPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsgb3V0Y29sKyspIHsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCQkJICAgICAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKQorCQkJICAgICAgKyBiaWFzKSA+PiAyKTsKKyAgICAgIGJpYXMgXj0gMzsJCS8qIDE9PjIsIDI9PjEgKi8KKyAgICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsKKyAgICB9CisgICAgaW5yb3cgKz0gMjsKKyAgfQorfQorCisKKyNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAorICogd2l0aCBzbW9vdGhpbmcuICBPbmUgcm93IG9mIGNvbnRleHQgaXMgcmVxdWlyZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX3Ntb290aF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBpbnJvdywgb3V0cm93OworICBKRElNRU5TSU9OIGNvbGN0cjsKKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBhYm92ZV9wdHIsIGJlbG93X3B0ciwgb3V0cHRyOworICBJTlQzMiBtZW1iZXJzdW0sIG5laWdoc3VtLCBtZW1iZXJzY2FsZSwgbmVpZ2hzY2FsZTsKKworICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCisgICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCisgICAqIGVmZmljaWVudC4KKyAgICovCisgIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEgLSAxLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKyAyLAorCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIDIpOworCisgIC8qIFdlIGRvbid0IGJvdGhlciB0byBmb3JtIHRoZSBpbmRpdmlkdWFsICJzbW9vdGhlZCIgaW5wdXQgcGl4ZWwgdmFsdWVzOworICAgKiB3ZSBjYW4gZGlyZWN0bHkgY29tcHV0ZSB0aGUgb3V0cHV0IHdoaWNoIGlzIHRoZSBhdmVyYWdlIG9mIHRoZSBmb3VyCisgICAqIHNtb290aGVkIHZhbHVlcy4gIEVhY2ggb2YgdGhlIGZvdXIgbWVtYmVyIHBpeGVscyBjb250cmlidXRlcyBhIGZyYWN0aW9uCisgICAqICgxLTgqU0YpIHRvIGl0cyBvd24gc21vb3RoZWQgaW1hZ2UgYW5kIGEgZnJhY3Rpb24gU0YgdG8gZWFjaCBvZiB0aGUgdGhyZWUKKyAgICogb3RoZXIgc21vb3RoZWQgcGl4ZWxzLCB0aGVyZWZvcmUgYSB0b3RhbCBmcmFjdGlvbiAoMS01KlNGKS80IHRvIHRoZSBmaW5hbAorICAgKiBvdXRwdXQuICBUaGUgZm91ciBjb3JuZXItYWRqYWNlbnQgbmVpZ2hib3IgcGl4ZWxzIGNvbnRyaWJ1dGUgYSBmcmFjdGlvbgorICAgKiBTRiB0byBqdXN0IG9uZSBzbW9vdGhlZCBwaXhlbCwgb3IgU0YvNCB0byB0aGUgZmluYWwgb3V0cHV0OyB3aGlsZSB0aGUKKyAgICogZWlnaHQgZWRnZS1hZGphY2VudCBuZWlnaGJvcnMgY29udHJpYnV0ZSBTRiB0byBlYWNoIG9mIHR3byBzbW9vdGhlZAorICAgKiBwaXhlbHMsIG9yIFNGLzIgb3ZlcmFsbC4gIEluIG9yZGVyIHRvIHVzZSBpbnRlZ2VyIGFyaXRobWV0aWMsIHRoZXNlCisgICAqIGZhY3RvcnMgYXJlIHNjYWxlZCBieSAyXjE2ID0gNjU1MzYuCisgICAqIEFsc28gcmVjYWxsIHRoYXQgU0YgPSBzbW9vdGhpbmdfZmFjdG9yIC8gMTAyNC4KKyAgICovCisKKyAgbWVtYmVyc2NhbGUgPSAxNjM4NCAtIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogODA7IC8qIHNjYWxlZCAoMS01KlNGKS80ICovCisgIG5laWdoc2NhbGUgPSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDE2OyAvKiBzY2FsZWQgU0YvNCAqLworCisgIGlucm93ID0gMDsKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIwID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKKyAgICBhYm92ZV9wdHIgPSBpbnB1dF9kYXRhW2lucm93LTFdOworICAgIGJlbG93X3B0ciA9IGlucHV0X2RhdGFbaW5yb3crMl07CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbjogcHJldGVuZCBjb2x1bW4gLTEgaXMgc2FtZSBhcyBjb2x1bW4gMCAqLworICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCQlHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgIG5laWdoc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCisJICAgICAgIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSkgKworCSAgICAgICBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMl0pICsKKwkgICAgICAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzJdKTsKKyAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKKyAgICBuZWlnaHN1bSArPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMl0pICsKKwkJR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzJdKTsKKyAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsgYWJvdmVfcHRyICs9IDI7IGJlbG93X3B0ciArPSAyOworCisgICAgZm9yIChjb2xjdHIgPSBvdXRwdXRfY29scyAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7CisgICAgICAvKiBzdW0gb2YgcGl4ZWxzIGRpcmVjdGx5IG1hcHBlZCB0byB0aGlzIG91dHB1dCBlbGVtZW50ICovCisgICAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKKwkJICBHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgICAgLyogc3VtIG9mIGVkZ2UtbmVpZ2hib3IgcGl4ZWxzICovCisgICAgICBuZWlnaHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKworCQkgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCisJCSBHRVRKU0FNUExFKGlucHRyMFstMV0pICsgR0VUSlNBTVBMRShpbnB0cjBbMl0pICsKKwkJIEdFVEpTQU1QTEUoaW5wdHIxWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMVsyXSk7CisgICAgICAvKiBUaGUgZWRnZS1uZWlnaGJvcnMgY291bnQgdHdpY2UgYXMgbXVjaCBhcyBjb3JuZXItbmVpZ2hib3JzICovCisgICAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKKyAgICAgIC8qIEFkZCBpbiB0aGUgY29ybmVyLW5laWdoYm9ycyAqLworICAgICAgbmVpZ2hzdW0gKz0gR0VUSlNBTVBMRShhYm92ZV9wdHJbLTFdKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzJdKSArCisJCSAgR0VUSlNBTVBMRShiZWxvd19wdHJbLTFdKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzJdKTsKKyAgICAgIC8qIGZvcm0gZmluYWwgb3V0cHV0IHNjYWxlZCB1cCBieSAyXjE2ICovCisgICAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAgIC8qIHJvdW5kLCBkZXNjYWxlIGFuZCBvdXRwdXQgaXQgKi8KKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7CisgICAgICBpbnB0cjAgKz0gMjsgaW5wdHIxICs9IDI7IGFib3ZlX3B0ciArPSAyOyBiZWxvd19wdHIgKz0gMjsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCisJCUdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7CisgICAgbmVpZ2hzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKKwkgICAgICAgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCisJICAgICAgIEdFVEpTQU1QTEUoaW5wdHIwWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCSAgICAgICBHRVRKU0FNUExFKGlucHRyMVstMV0pICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgIG5laWdoc3VtICs9IG5laWdoc3VtOworICAgIG5laWdoc3VtICs9IEdFVEpTQU1QTEUoYWJvdmVfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKworCQlHRVRKU0FNUExFKGJlbG93X3B0clstMV0pICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pOworICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOworICAgICpvdXRwdHIgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworCisgICAgaW5yb3cgKz0gMjsKKyAgfQorfQorCisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgZnVsbC1zaXplIGNvbXBvbmVudCwKKyAqIHdpdGggc21vb3RoaW5nLiAgT25lIHJvdyBvZiBjb250ZXh0IGlzIHJlcXVpcmVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorZnVsbHNpemVfc21vb3RoX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyLAorCQkJICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyAgaW50IG91dHJvdzsKKyAgSkRJTUVOU0lPTiBjb2xjdHI7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgYWJvdmVfcHRyLCBiZWxvd19wdHIsIG91dHB0cjsKKyAgSU5UMzIgbWVtYmVyc3VtLCBuZWlnaHN1bSwgbWVtYmVyc2NhbGUsIG5laWdoc2NhbGU7CisgIGludCBjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhIC0gMSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICsgMiwKKwkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMpOworCisgIC8qIEVhY2ggb2YgdGhlIGVpZ2h0IG5laWdoYm9yIHBpeGVscyBjb250cmlidXRlcyBhIGZyYWN0aW9uIFNGIHRvIHRoZQorICAgKiBzbW9vdGhlZCBwaXhlbCwgd2hpbGUgdGhlIG1haW4gcGl4ZWwgY29udHJpYnV0ZXMgKDEtOCpTRikuICBJbiBvcmRlcgorICAgKiB0byB1c2UgaW50ZWdlciBhcml0aG1ldGljLCB0aGVzZSBmYWN0b3JzIGFyZSBtdWx0aXBsaWVkIGJ5IDJeMTYgPSA2NTUzNi4KKyAgICogQWxzbyByZWNhbGwgdGhhdCBTRiA9IHNtb290aGluZ19mYWN0b3IgLyAxMDI0LgorICAgKi8KKworICBtZW1iZXJzY2FsZSA9IDY1NTM2TCAtIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogNTEyTDsgLyogc2NhbGVkIDEtOCpTRiAqLworICBuZWlnaHNjYWxlID0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiA2NDsgLyogc2NhbGVkIFNGICovCisKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgICAgYWJvdmVfcHRyID0gaW5wdXRfZGF0YVtvdXRyb3ctMV07CisgICAgYmVsb3dfcHRyID0gaW5wdXRfZGF0YVtvdXRyb3crMV07CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLworICAgIGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cisrKSArIEdFVEpTQU1QTEUoKmJlbG93X3B0cisrKSArCisJICAgICBHRVRKU0FNUExFKCppbnB0cik7CisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsKKwkJIEdFVEpTQU1QTEUoKmlucHRyKTsKKyAgICBuZWlnaHN1bSA9IGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgbmV4dGNvbHN1bTsKKyAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgIGxhc3Rjb2xzdW0gPSBjb2xzdW07IGNvbHN1bSA9IG5leHRjb2xzdW07CisKKyAgICBmb3IgKGNvbGN0ciA9IG91dHB1dF9jb2xzIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKKyAgICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOworICAgICAgYWJvdmVfcHRyKys7IGJlbG93X3B0cisrOworICAgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsKKwkJICAgR0VUSlNBTVBMRSgqaW5wdHIpOworICAgICAgbmVpZ2hzdW0gPSBsYXN0Y29sc3VtICsgKGNvbHN1bSAtIG1lbWJlcnN1bSkgKyBuZXh0Y29sc3VtOworICAgICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgICAgbGFzdGNvbHN1bSA9IGNvbHN1bTsgY29sc3VtID0gbmV4dGNvbHN1bTsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIpOworICAgIG5laWdoc3VtID0gbGFzdGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgY29sc3VtOworICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOworICAgICpvdXRwdHIgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworCisgIH0KK30KKworI2VuZGlmIC8qIElOUFVUX1NNT09USElOR19TVVBQT1JURUQgKi8KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGRvd25zYW1wbGluZy4KKyAqIE5vdGUgdGhhdCB3ZSBtdXN0IHNlbGVjdCBhIHJvdXRpbmUgZm9yIGVhY2ggY29tcG9uZW50LgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfZG93bnNhbXBsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9kb3duc2FtcGxlX3B0ciBkb3duc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBib29sZWFuIHNtb290aG9rID0gVFJVRTsKKworICBkb3duc2FtcGxlID0gKG15X2Rvd25zYW1wbGVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2Rvd25zYW1wbGVyKSk7CisgIGNpbmZvLT5kb3duc2FtcGxlID0gKHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyICopIGRvd25zYW1wbGU7CisgIGRvd25zYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kb3duc2FtcGxlOworICBkb3duc2FtcGxlLT5wdWIuZG93bnNhbXBsZSA9IHNlcF9kb3duc2FtcGxlOworICBkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBGQUxTRTsKKworICBpZiAoY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQ0lSNjAxX05PVElNUEwpOworCisgIC8qIFZlcmlmeSB3ZSBjYW4gaGFuZGxlIHRoZSBzYW1wbGluZyBmYWN0b3JzLCBhbmQgc2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgorCWNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPT0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICAgICAgaWYgKGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yKSB7CisJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV9zbW9vdGhfZG93bnNhbXBsZTsKKwlkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBUUlVFOworICAgICAgfSBlbHNlCisjZW5kaWYKKwlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX2Rvd25zYW1wbGU7CisgICAgfSBlbHNlIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKKwkgICAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICAgIHNtb290aG9rID0gRkFMU0U7CisgICAgICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfZG93bnNhbXBsZTsKKyAgICB9IGVsc2UgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgorCSAgICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECisgICAgICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IpIHsKKwlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfc21vb3RoX2Rvd25zYW1wbGU7CisJZG93bnNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKKyAgICAgIH0gZWxzZQorI2VuZGlmCisJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX2Rvd25zYW1wbGU7CisgICAgfSBlbHNlIGlmICgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICUgY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgPT0gMCAmJgorCSAgICAgICAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICUgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgPT0gMCkgeworICAgICAgc21vb3Rob2sgPSBGQUxTRTsKKyAgICAgIGRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaW50X2Rvd25zYW1wbGU7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMKTsKKyAgfQorCisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IgJiYgIXNtb290aG9rKQorICAgIFRSQUNFTVMoY2luZm8sIDAsIEpUUkNfU01PT1RIX05PVElNUEwpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qY3RyYW5zLmMgYi9jb21tb24vanBlZy9qY3RyYW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2ZDcwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pjdHJhbnMuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIGpjdHJhbnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGNvbXByZXNzaW9uLAorICogdGhhdCBpcywgd3JpdGluZyByYXcgRENUIGNvZWZmaWNpZW50IGFycmF5cyB0byBhbiBvdXRwdXQgSlBFRyBmaWxlLgorICogVGhlIHJvdXRpbmVzIGluIGpjYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9tYXN0ZXJfc2VsZWN0aW9uCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7CitMT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKKworCisvKgorICogQ29tcHJlc3Npb24gaW5pdGlhbGl6YXRpb24gZm9yIHdyaXRpbmcgcmF3LWNvZWZmaWNpZW50IGRhdGEuCisgKiBCZWZvcmUgY2FsbGluZyB0aGlzLCBhbGwgcGFyYW1ldGVycyBhbmQgYSBkYXRhIGRlc3RpbmF0aW9uIG11c3QgYmUgc2V0IHVwLgorICogQ2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBkYXRhLgorICoKKyAqIFRoZSBudW1iZXIgb2YgcGFzc2VkIHZpcnR1YWwgYXJyYXlzIG11c3QgbWF0Y2ggY2luZm8tPm51bV9jb21wb25lbnRzLgorICogTm90ZSB0aGF0IHRoZSB2aXJ0dWFsIGFycmF5cyBuZWVkIG5vdCBiZSBmaWxsZWQgb3IgZXZlbiByZWFsaXplZCBhdAorICogdGhlIHRpbWUgd3JpdGVfY29lZmZpY2llbnRzIGlzIGNhbGxlZDsgaW5kZWVkLCBpZiB0aGUgdmlydHVhbCBhcnJheXMKKyAqIHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBjb21wcmVzc2lvbiBvYmplY3QncyBtZW1vcnkgbWFuYWdlciwgdGhleQorICogdHlwaWNhbGx5IHdpbGwgYmUgcmVhbGl6ZWQgZHVyaW5nIHRoaXMgcm91dGluZSBhbmQgZmlsbGVkIGFmdGVyd2FyZHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyAoal9jb21wcmVzc19wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIE1hcmsgYWxsIHRhYmxlcyB0byBiZSB3cml0dGVuICovCisgIGpwZWdfc3VwcHJlc3NfdGFibGVzKGNpbmZvLCBGQUxTRSk7CisgIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLworICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCisgIHRyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8sIGNvZWZfYXJyYXlzKTsKKyAgLyogV2FpdCBmb3IganBlZ19maW5pc2hfY29tcHJlc3MoKSBjYWxsICovCisgIGNpbmZvLT5uZXh0X3NjYW5saW5lID0gMDsJLyogc28ganBlZ193cml0ZV9tYXJrZXIgd29ya3MgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9XUkNPRUZTOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMsCisgKiB0aGVuIGNvcHkgZnJvbSB0aGUgc291cmNlIG9iamVjdCBhbGwgcGFyYW1ldGVycyBuZWVkZWQgZm9yIGxvc3NsZXNzCisgKiB0cmFuc2NvZGluZy4gIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdmFyaWVkIHdpdGhvdXQgbG9zcyAoc3VjaCBhcworICogc2NhbiBzY3JpcHQgYW5kIEh1ZmZtYW4gb3B0aW1pemF0aW9uKSBhcmUgbGVmdCBpbiB0aGVpciBkZWZhdWx0IHN0YXRlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCisJCQkgICAgICAgal9jb21wcmVzc19wdHIgZHN0aW5mbykKK3sKKyAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICppbmNvbXAsICpvdXRjb21wOworICBKUVVBTlRfVEJMICpjX3F1YW50LCAqc2xvdF9xdWFudDsKKyAgaW50IHRibG5vLCBjaSwgY29lZmk7CisKKyAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KKyAgaWYgKGRzdGluZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoZHN0aW5mbywgSkVSUl9CQURfU1RBVEUsIGRzdGluZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIENvcHkgZnVuZGFtZW50YWwgaW1hZ2UgZGltZW5zaW9ucyAqLworICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IHNyY2luZm8tPmltYWdlX3dpZHRoOworICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgIGRzdGluZm8tPmlucHV0X2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgZHN0aW5mby0+aW5fY29sb3Jfc3BhY2UgPSBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlOworICAvKiBJbml0aWFsaXplIGFsbCBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIGpwZWdfc2V0X2RlZmF1bHRzKGRzdGluZm8pOworICAvKiBqcGVnX3NldF9kZWZhdWx0cyBtYXkgY2hvb3NlIHdyb25nIGNvbG9yc3BhY2UsIGVnIFlDYkNyIGlmIGlucHV0IGlzIFJHQi4KKyAgICogRml4IGl0IHRvIGdldCB0aGUgcmlnaHQgaGVhZGVyIG1hcmtlcnMgZm9yIHRoZSBpbWFnZSBjb2xvcnNwYWNlLgorICAgKi8KKyAganBlZ19zZXRfY29sb3JzcGFjZShkc3RpbmZvLCBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKTsKKyAgZHN0aW5mby0+ZGF0YV9wcmVjaXNpb24gPSBzcmNpbmZvLT5kYXRhX3ByZWNpc2lvbjsKKyAgZHN0aW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IHNyY2luZm8tPkNDSVI2MDFfc2FtcGxpbmc7CisgIC8qIENvcHkgdGhlIHNvdXJjZSdzIHF1YW50aXphdGlvbiB0YWJsZXMuICovCisgIGZvciAodGJsbm8gPSAwOyB0YmxubyA8IE5VTV9RVUFOVF9UQkxTOyB0YmxubysrKSB7CisgICAgaWYgKHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXSAhPSBOVUxMKSB7CisgICAgICBxdGJscHRyID0gJiBkc3RpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub107CisgICAgICBpZiAoKnF0YmxwdHIgPT0gTlVMTCkKKwkqcXRibHB0ciA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgZHN0aW5mbyk7CisgICAgICBNRU1DT1BZKCgqcXRibHB0ciktPnF1YW50dmFsLAorCSAgICAgIHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXS0+cXVhbnR2YWwsCisJICAgICAgU0laRU9GKCgqcXRibHB0ciktPnF1YW50dmFsKSk7CisgICAgICAoKnF0YmxwdHIpLT5zZW50X3RhYmxlID0gRkFMU0U7CisgICAgfQorICB9CisgIC8qIENvcHkgdGhlIHNvdXJjZSdzIHBlci1jb21wb25lbnQgaW5mby4KKyAgICogTm90ZSB3ZSBhc3N1bWUganBlZ19zZXRfZGVmYXVsdHMgaGFzIGFsbG9jYXRlZCB0aGUgZGVzdCBjb21wX2luZm8gYXJyYXkuCisgICAqLworICBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9IHNyY2luZm8tPm51bV9jb21wb25lbnRzOworICBpZiAoZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPCAxIHx8IGRzdGluZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgRVJSRVhJVDIoZHN0aW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGRzdGluZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgTUFYX0NPTVBPTkVOVFMpOworICBmb3IgKGNpID0gMCwgaW5jb21wID0gc3JjaW5mby0+Y29tcF9pbmZvLCBvdXRjb21wID0gZHN0aW5mby0+Y29tcF9pbmZvOworICAgICAgIGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyssIGluY29tcCsrLCBvdXRjb21wKyspIHsKKyAgICBvdXRjb21wLT5jb21wb25lbnRfaWQgPSBpbmNvbXAtPmNvbXBvbmVudF9pZDsKKyAgICBvdXRjb21wLT5oX3NhbXBfZmFjdG9yID0gaW5jb21wLT5oX3NhbXBfZmFjdG9yOworICAgIG91dGNvbXAtPnZfc2FtcF9mYWN0b3IgPSBpbmNvbXAtPnZfc2FtcF9mYWN0b3I7CisgICAgb3V0Y29tcC0+cXVhbnRfdGJsX25vID0gaW5jb21wLT5xdWFudF90Ymxfbm87CisgICAgLyogTWFrZSBzdXJlIHNhdmVkIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgY29tcG9uZW50IG1hdGNoZXMgdGhlIHF0YWJsZQorICAgICAqIHNsb3QuICBJZiBub3QsIHRoZSBpbnB1dCBmaWxlIHJlLXVzZWQgdGhpcyBxdGFibGUgc2xvdC4KKyAgICAgKiBJSkcgZW5jb2RlciBjdXJyZW50bHkgY2Fubm90IGR1cGxpY2F0ZSB0aGlzLgorICAgICAqLworICAgIHRibG5vID0gb3V0Y29tcC0+cXVhbnRfdGJsX25vOworICAgIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwlzcmNpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub10gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQxKGRzdGluZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHRibG5vKTsKKyAgICBzbG90X3F1YW50ID0gc3JjaW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOworICAgIGNfcXVhbnQgPSBpbmNvbXAtPnF1YW50X3RhYmxlOworICAgIGlmIChjX3F1YW50ICE9IE5VTEwpIHsKKyAgICAgIGZvciAoY29lZmkgPSAwOyBjb2VmaSA8IERDVFNJWkUyOyBjb2VmaSsrKSB7CisJaWYgKGNfcXVhbnQtPnF1YW50dmFsW2NvZWZpXSAhPSBzbG90X3F1YW50LT5xdWFudHZhbFtjb2VmaV0pCisJICBFUlJFWElUMShkc3RpbmZvLCBKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsIHRibG5vKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogTm90ZTogd2UgZG8gbm90IGNvcHkgdGhlIHNvdXJjZSdzIEh1ZmZtYW4gdGFibGUgYXNzaWdubWVudHM7CisgICAgICogaW5zdGVhZCB3ZSByZWx5IG9uIGpwZWdfc2V0X2NvbG9yc3BhY2UgdG8gaGF2ZSBtYWRlIGEgc3VpdGFibGUgY2hvaWNlLgorICAgICAqLworICB9CisgIC8qIEFsc28gY29weSBKRklGIHZlcnNpb24gYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24sIGlmIGF2YWlsYWJsZS4KKyAgICogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpc24ndCAiY3JpdGljYWwiIGluZm8sIGJ1dCBpdCdzIG5lYXJseQorICAgKiBhbHdheXMgYXBwcm9wcmlhdGUgdG8gY29weSBpdCBpZiBhdmFpbGFibGUuICBJbiBwYXJ0aWN1bGFyLAorICAgKiBpZiB0aGUgYXBwbGljYXRpb24gY2hvb3NlcyB0byBjb3B5IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBmcm9tCisgICAqIHRoZSBzb3VyY2UgZmlsZSwgd2UgbmVlZCB0byBjb3B5IHRoZSB2ZXJzaW9uIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAorICAgKiBlbWl0IGEgZmlsZSB0aGF0IGhhcyAxLjAyIGV4dGVuc2lvbnMgYnV0IGEgY2xhaW1lZCB2ZXJzaW9uIG9mIDEuMDEuCisgICAqIFdlIHdpbGwgKm5vdCosIGhvd2V2ZXIsIGNvcHkgdmVyc2lvbiBpbmZvIGZyb20gbWlzbGFiZWxlZCAiMi4wMSIgZmlsZXMuCisgICAqLworICBpZiAoc3JjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7CisgICAgaWYgKHNyY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9PSAxKSB7CisgICAgICBkc3RpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21ham9yX3ZlcnNpb247CisgICAgICBkc3RpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb247CisgICAgfQorICAgIGRzdGluZm8tPmRlbnNpdHlfdW5pdCA9IHNyY2luZm8tPmRlbnNpdHlfdW5pdDsKKyAgICBkc3RpbmZvLT5YX2RlbnNpdHkgPSBzcmNpbmZvLT5YX2RlbnNpdHk7CisgICAgZHN0aW5mby0+WV9kZW5zaXR5ID0gc3JjaW5mby0+WV9kZW5zaXR5OworICB9Cit9CisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcyBmb3IgdHJhbnNjb2RpbmcuCisgKiBUaGlzIHN1YnN0aXR1dGVzIGZvciBqY2luaXQuYydzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmdWxsIGNvbXByZXNzb3IuCisgKi8KKworTE9DQUwodm9pZCkKK3RyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKQoreworICAvKiBBbHRob3VnaCB3ZSBkb24ndCBhY3R1YWxseSB1c2UgaW5wdXRfY29tcG9uZW50cyBmb3IgdHJhbnNjb2RpbmcsCisgICAqIGpjbWFzdGVyLmMncyBpbml0aWFsX3NldHVwIHdpbGwgY29tcGxhaW4gaWYgaW5wdXRfY29tcG9uZW50cyBpcyAwLgorICAgKi8KKyAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOworICAvKiBJbml0aWFsaXplIG1hc3RlciBjb250cm9sIChpbmNsdWRlcyBwYXJhbWV0ZXIgY2hlY2tpbmcvcHJvY2Vzc2luZykgKi8KKyAgamluaXRfY19tYXN0ZXJfY29udHJvbChjaW5mbywgVFJVRSAvKiB0cmFuc2NvZGUgb25seSAqLyk7CisKKyAgLyogRW50cm9weSBlbmNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIGppbml0X3BodWZmX2VuY29kZXIoY2luZm8pOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKKyAgfQorCisgIC8qIFdlIG5lZWQgYSBzcGVjaWFsIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLiAqLworICB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIGNvZWZfYXJyYXlzKTsKKworICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKKworICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLworICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogV3JpdGUgdGhlIGRhdGFzdHJlYW0gaGVhZGVyIChTT0ksIEpGSUYpIGltbWVkaWF0ZWx5LgorICAgKiBGcmFtZSBhbmQgc2NhbiBoZWFkZXJzIGFyZSBwb3N0cG9uZWQgdGlsbCBsYXRlci4KKyAgICogVGhpcyBsZXRzIGFwcGxpY2F0aW9uIGluc2VydCBzcGVjaWFsIG1hcmtlcnMgYWZ0ZXIgdGhlIFNPSS4KKyAgICovCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV9oZWFkZXIpIChjaW5mbyk7Cit9CisKKworLyoKKyAqIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBpcyBhIHNwZWNpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvZWZmaWNpZW50CisgKiBidWZmZXIgY29udHJvbGxlci4gIFRoaXMgaXMgc2ltaWxhciB0byBqY2NvZWZjdC5jLCBidXQgaXQgaGFuZGxlcyBvbmx5CisgKiBvdXRwdXQgZnJvbSBwcmVzdXBwbGllZCB2aXJ0dWFsIGFycmF5cy4gIEZ1cnRoZXJtb3JlLCB3ZSBnZW5lcmF0ZSBhbnkKKyAqIGR1bW15IHBhZGRpbmcgYmxvY2tzIG9uLXRoZS1mbHkgcmF0aGVyIHRoYW4gZXhwZWN0aW5nIHRoZW0gdG8gYmUgcHJlc2VudAorICogaW4gdGhlIGFycmF5cy4KKyAqLworCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEpESU1FTlNJT04gaU1DVV9yb3dfbnVtOwkvKiBpTUNVIHJvdyAjIHdpdGhpbiBpbWFnZSAqLworICBKRElNRU5TSU9OIG1jdV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KKyAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KKyAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KKworICAvKiBWaXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KKyAganZpcnRfYmFycmF5X3B0ciAqIHdob2xlX2ltYWdlOworCisgIC8qIFdvcmtzcGFjZSBmb3IgY29uc3RydWN0aW5nIGR1bW15IGJsb2NrcyBhdCByaWdodC9ib3R0b20gZWRnZXMuICovCisgIEpCTE9DS1JPVyBkdW1teV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07Cit9IG15X2NvZWZfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKKworCitMT0NBTCh2b2lkKQorc3RhcnRfaU1DVV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKi8KK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisKKyAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KKyAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KKyAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCisgICAqLworICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7CisgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OworICB9CisKKyAgY29lZi0+bWN1X2N0ciA9IDA7CisgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19jb2VmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIGlmIChwYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKworICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKKyAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KKyAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgorICoKKyAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0LCBibG9ja2NudDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2w7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07CisgIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0NfTUFYX0JMT0NLU19JTl9NQ1VdOworICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgIH0KKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAorCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7CisJICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAorCSAgICAgIHlpbmRleCt5b2Zmc2V0IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7CisJICAgIC8qIEZpbGwgaW4gcG9pbnRlcnMgdG8gcmVhbCBibG9ja3MgaW4gdGhpcyByb3cgKi8KKwkgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOworCSAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGJsb2NrY250OyB4aW5kZXgrKykKKwkgICAgICBNQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisJICB9IGVsc2UgeworCSAgICAvKiBBdCBib3R0b20gb2YgaW1hZ2UsIG5lZWQgYSB3aG9sZSByb3cgb2YgZHVtbXkgYmxvY2tzICovCisJICAgIHhpbmRleCA9IDA7CisJICB9CisJICAvKiBGaWxsIGluIGFueSBkdW1teSBibG9ja3MgbmVlZGVkIGluIHRoaXMgcm93LgorCSAgICogRHVtbXkgYmxvY2tzIGFyZSBmaWxsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGluIGpjY29lZmN0LmM6CisJICAgKiBhbGwgemVyb2VzIGluIHRoZSBBQyBlbnRyaWVzLCBEQyBlbnRyaWVzIGVxdWFsIHRvIHByZXZpb3VzCisJICAgKiBibG9jaydzIERDIHZhbHVlLiAgVGhlIGluaXQgcm91dGluZSBoYXMgYWxyZWFkeSB6ZXJvZWQgdGhlCisJICAgKiBBQyBlbnRyaWVzLCBzbyB3ZSBuZWVkIG9ubHkgc2V0IHRoZSBEQyBlbnRyaWVzIGNvcnJlY3RseS4KKwkgICAqLworCSAgZm9yICg7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKKwkgICAgTUNVX2J1ZmZlcltibGtuXSA9IGNvZWYtPmR1bW15X2J1ZmZlcltibGtuXTsKKwkgICAgTUNVX2J1ZmZlcltibGtuXVswXVswXSA9IE1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKKwkgICAgYmxrbisrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBNQ1VfYnVmZmVyKSkgeworCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KKwljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KKyAgICBjb2VmLT5tY3VfY3RyID0gMDsKKyAgfQorICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLworICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKKyAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KKyAqCisgKiBFYWNoIHBhc3NlZCBjb2VmZmljaWVudCBhcnJheSBtdXN0IGJlIHRoZSByaWdodCBzaXplIGZvciB0aGF0CisgKiBjb2VmZmljaWVudDogd2lkdGhfaW5fYmxvY2tzIHdpZGUgYW5kIGhlaWdodF9pbl9ibG9ja3MgaGlnaCwKKyAqIHdpdGggdW5pdGhlaWdodCBhdCBsZWFzdCB2X3NhbXBfZmFjdG9yLgorICovCisKK0xPQ0FMKHZvaWQpCit0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpCit7CisgIG15X2NvZWZfcHRyIGNvZWY7CisgIEpCTE9DS1JPVyBidWZmZXI7CisgIGludCBpOworCisgIGNvZWYgPSAobXlfY29lZl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICopIGNvZWY7CisgIGNvZWYtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19jb2VmOworICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX291dHB1dDsKKworICAvKiBTYXZlIHBvaW50ZXIgdG8gdmlydHVhbCBhcnJheXMgKi8KKyAgY29lZi0+d2hvbGVfaW1hZ2UgPSBjb2VmX2FycmF5czsKKworICAvKiBBbGxvY2F0ZSBhbmQgcHJlLXplcm8gc3BhY2UgZm9yIGR1bW15IERDVCBibG9ja3MuICovCisgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlDX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOworICBqemVyb19mYXIoKHZvaWQgRkFSICopIGJ1ZmZlciwgQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKKyAgZm9yIChpID0gMDsgaSA8IENfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgeworICAgIGNvZWYtPmR1bW15X2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pkYXBpbWluLmMgYi9jb21tb24vanBlZy9qZGFwaW1pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGI1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZGFwaW1pbi5jCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogamRhcGltaW4uYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgZGVjb21wcmVzc2lvbiBoYWxmCisgKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAibWluaW11bSIgQVBJIHJvdXRpbmVzIHRoYXQgbWF5IGJlCisgKiBuZWVkZWQgaW4gZWl0aGVyIHRoZSBub3JtYWwgZnVsbC1kZWNvbXByZXNzaW9uIGNhc2Ugb3IgdGhlCisgKiB0cmFuc2NvZGluZy1vbmx5IGNhc2UuCisgKgorICogTW9zdCBvZiB0aGUgcm91dGluZXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uCisgKiBhcmUgaW4gdGhpcyBmaWxlIG9yIGluIGpkYXBpc3RkLmMuICBCdXQgYWxzbyBzZWUgamNvbWFwaS5jIGZvciByb3V0aW5lcworICogc2hhcmVkIGJ5IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLCBhbmQgamR0cmFucy5jIGZvciB0aGUgdHJhbnNjb2RpbmcKKyAqIGNhc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBvZiBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuCisgKiBUaGUgZXJyb3IgbWFuYWdlciBtdXN0IGFscmVhZHkgYmUgc2V0IHVwIChpbiBjYXNlIG1lbW9yeSBtYW5hZ2VyIGZhaWxzKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfQ3JlYXRlRGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKQoreworICBpbnQgaTsKKworICAvKiBHdWFyZCBhZ2FpbnN0IHZlcnNpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGxpYnJhcnkgYW5kIGNhbGxlci4gKi8KKyAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBzbyBqcGVnX2Rlc3Ryb3kga25vd3MgbWVtIG1nciBub3QgY2FsbGVkICovCisgIGlmICh2ZXJzaW9uICE9IEpQRUdfTElCX1ZFUlNJT04pCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX0xJQl9WRVJTSU9OLCBKUEVHX0xJQl9WRVJTSU9OLCB2ZXJzaW9uKTsKKyAgaWYgKHN0cnVjdHNpemUgIT0gU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSkKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfU1RSVUNUX1NJWkUsIAorCSAgICAgKGludCkgU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSwgKGludCkgc3RydWN0c2l6ZSk7CisKKyAgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UgemVybyB0aGUgd2hvbGUgbWFzdGVyIHN0cnVjdHVyZS4KKyAgICogQnV0IHRoZSBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBzZXQgdGhlIGVyciBwb2ludGVyLCBhbmQgbWF5IGhhdmUgc2V0CisgICAqIGNsaWVudF9kYXRhLCBzbyB3ZSBoYXZlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhvc2UgZmllbGRzLgorICAgKiBOb3RlOiBpZiBhcHBsaWNhdGlvbiBoYXNuJ3Qgc2V0IGNsaWVudF9kYXRhLCB0b29scyBsaWtlIFB1cmlmeSBtYXkKKyAgICogY29tcGxhaW4gaGVyZS4KKyAgICovCisgIHsKKyAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOworICAgIHZvaWQgKiBjbGllbnRfZGF0YSA9IGNpbmZvLT5jbGllbnRfZGF0YTsgLyogaWdub3JlIFB1cmlmeSBjb21wbGFpbnQgaGVyZSAqLworICAgIE1FTVpFUk8oY2luZm8sIFNJWkVPRihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpOworICAgIGNpbmZvLT5lcnIgPSBlcnI7CisgICAgY2luZm8tPmNsaWVudF9kYXRhID0gY2xpZW50X2RhdGE7CisgIH0KKyAgY2luZm8tPmlzX2RlY29tcHJlc3NvciA9IFRSVUU7CisKKyAgLyogSW5pdGlhbGl6ZSBhIG1lbW9yeSBtYW5hZ2VyIGluc3RhbmNlIGZvciB0aGlzIG9iamVjdCAqLworICBqaW5pdF9tZW1vcnlfbWdyKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBaZXJvIG91dCBwb2ludGVycyB0byBwZXJtYW5lbnQgc3RydWN0dXJlcy4gKi8KKyAgY2luZm8tPnByb2dyZXNzID0gTlVMTDsKKyAgY2luZm8tPnNyYyA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspCisgICAgY2luZm8tPnF1YW50X3RibF9wdHJzW2ldID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gPSBOVUxMOworICAgIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgbWFya2VyIHByb2Nlc3NvciBzbyBhcHBsaWNhdGlvbiBjYW4gb3ZlcnJpZGUgbWV0aG9kcworICAgKiBmb3IgQ09NLCBBUFBuIG1hcmtlcnMgYmVmb3JlIGNhbGxpbmcganBlZ19yZWFkX2hlYWRlci4KKyAgICovCisgIGNpbmZvLT5tYXJrZXJfbGlzdCA9IE5VTEw7CisgIGppbml0X21hcmtlcl9yZWFkZXIoY2luZm8pOworCisgIC8qIEFuZCBpbml0aWFsaXplIHRoZSBvdmVyYWxsIGlucHV0IGNvbnRyb2xsZXIuICovCisgIGppbml0X2lucHV0X2NvbnRyb2xsZXIoY2luZm8pOworCisgIC8qIE9LLCBJJ20gcmVhZHkgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVEFSVDsKK30KKworCisvKgorICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0CisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAganBlZ19kZXN0cm95KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCit9CisKKworLyoKKyAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLAorICogYnV0IGRvbid0IGRlc3Ryb3kgdGhlIG9iamVjdCBpdHNlbGYuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Fib3J0X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KK30KKworCisvKgorICogU2V0IGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgorICovCisKK0xPQ0FMKHZvaWQpCitkZWZhdWx0X2RlY29tcHJlc3NfcGFybXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIEd1ZXNzIHRoZSBpbnB1dCBjb2xvcnNwYWNlLCBhbmQgc2V0IG91dHB1dCBjb2xvcnNwYWNlIGFjY29yZGluZ2x5LiAqLworICAvKiAoV2lzaCBKUEVHIGNvbW1pdHRlZSBoYWQgcHJvdmlkZWQgYSByZWFsIHdheSB0byBzcGVjaWZ5IHRoaXMuLi4pICovCisgIC8qIE5vdGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIG91ciBndWVzc2VzLiAqLworICBzd2l0Y2ggKGNpbmZvLT5udW1fY29tcG9uZW50cykgeworICBjYXNlIDE6CisgICAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworICAgIGJyZWFrOworICAgIAorICBjYXNlIDM6CisgICAgaWYgKGNpbmZvLT5zYXdfSkZJRl9tYXJrZXIpIHsKKyAgICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBKRklGIGltcGxpZXMgWUNiQ3IgKi8KKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyKSB7CisgICAgICBzd2l0Y2ggKGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pIHsKKyAgICAgIGNhc2UgMDoKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisJYnJlYWs7CisgICAgICBjYXNlIDE6CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCVdBUk5NUzEoY2luZm8sIEpXUk5fQURPQkVfWEZPUk0sIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pOworCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgaXQncyBZQ2JDciAqLworCWJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBTYXcgbm8gc3BlY2lhbCBtYXJrZXJzLCB0cnkgdG8gZ3Vlc3MgZnJvbSB0aGUgY29tcG9uZW50IElEcyAqLworICAgICAgaW50IGNpZDAgPSBjaW5mby0+Y29tcF9pbmZvWzBdLmNvbXBvbmVudF9pZDsKKyAgICAgIGludCBjaWQxID0gY2luZm8tPmNvbXBfaW5mb1sxXS5jb21wb25lbnRfaWQ7CisgICAgICBpbnQgY2lkMiA9IGNpbmZvLT5jb21wX2luZm9bMl0uY29tcG9uZW50X2lkOworCisgICAgICBpZiAoY2lkMCA9PSAxICYmIGNpZDEgPT0gMiAmJiBjaWQyID09IDMpCisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7IC8qIGFzc3VtZSBKRklGIHcvb3V0IG1hcmtlciAqLworICAgICAgZWxzZSBpZiAoY2lkMCA9PSA4MiAmJiBjaWQxID09IDcxICYmIGNpZDIgPT0gNjYpCisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOyAvKiBBU0NJSSAnUicsICdHJywgJ0InICovCisgICAgICBlbHNlIHsKKwlUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19VTktOT1dOX0lEUywgY2lkMCwgY2lkMSwgY2lkMik7CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7IC8qIGFzc3VtZSBpdCdzIFlDYkNyICovCisgICAgICB9CisgICAgfQorICAgIC8qIEFsd2F5cyBndWVzcyBSR0IgaXMgcHJvcGVyIG91dHB1dCBjb2xvcnNwYWNlLiAqLworICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworICAgIGJyZWFrOworICAgIAorICBjYXNlIDQ6CisgICAgaWYgKGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyKSB7CisgICAgICBzd2l0Y2ggKGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pIHsKKyAgICAgIGNhc2UgMDoKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19DTVlLOworCWJyZWFrOworICAgICAgY2FzZSAyOgorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDQ0s7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCVdBUk5NUzEoY2luZm8sIEpXUk5fQURPQkVfWEZPUk0sIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pOworCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDQ0s7IC8qIGFzc3VtZSBpdCdzIFlDQ0sgKi8KKwlicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogTm8gc3BlY2lhbCBtYXJrZXJzLCBhc3N1bWUgc3RyYWlnaHQgQ01ZSy4gKi8KKyAgICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX0NNWUs7CisgICAgfQorICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKKyAgICBicmVhazsKKyAgICAKKyAgZGVmYXVsdDoKKyAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19VTktOT1dOOworICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIFNldCBkZWZhdWx0cyBmb3Igb3RoZXIgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAqLworICBjaW5mby0+c2NhbGVfbnVtID0gMTsJCS8qIDE6MSBzY2FsaW5nICovCisgIGNpbmZvLT5zY2FsZV9kZW5vbSA9IDE7CisgIGNpbmZvLT5vdXRwdXRfZ2FtbWEgPSAxLjA7CisgIGNpbmZvLT5idWZmZXJlZF9pbWFnZSA9IEZBTFNFOworICBjaW5mby0+cmF3X2RhdGFfb3V0ID0gRkFMU0U7CisgIGNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9ERUZBVUxUOworICBjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyA9IFRSVUU7CisgIGNpbmZvLT5kb19ibG9ja19zbW9vdGhpbmcgPSBUUlVFOworICBjaW5mby0+cXVhbnRpemVfY29sb3JzID0gRkFMU0U7CisgIC8qIFdlIHNldCB0aGVzZSBpbiBjYXNlIGFwcGxpY2F0aW9uIG9ubHkgc2V0cyBxdWFudGl6ZV9jb2xvcnMuICovCisgIGNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfRlM7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgIGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSA9IFRSVUU7CisjZWxzZQorICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKKyNlbmRpZgorICBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID0gMjU2OworICBjaW5mby0+Y29sb3JtYXAgPSBOVUxMOworICAvKiBJbml0aWFsaXplIGZvciBubyBtb2RlIGNoYW5nZSBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLiAqLworICBjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50ID0gRkFMU0U7CisgIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgPSBGQUxTRTsKKyAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOworfQorCisKKy8qCisgKiBEZWNvbXByZXNzaW9uIHN0YXJ0dXA6IHJlYWQgc3RhcnQgb2YgSlBFRyBkYXRhc3RyZWFtIHRvIHNlZSB3aGF0J3MgdGhlcmUuCisgKiBOZWVkIG9ubHkgaW5pdGlhbGl6ZSBKUEVHIG9iamVjdCBhbmQgc3VwcGx5IGEgZGF0YSBzb3VyY2UgYmVmb3JlIGNhbGxpbmcuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgcmVhZCBhcyBmYXIgYXMgdGhlIGZpcnN0IFNPUyBtYXJrZXIgKGllLCBhY3R1YWwgc3RhcnQgb2YKKyAqIGNvbXByZXNzZWQgZGF0YSksIGFuZCB3aWxsIHNhdmUgYWxsIHRhYmxlcyBhbmQgcGFyYW1ldGVycyBpbiB0aGUgSlBFRworICogb2JqZWN0LiAgSXQgd2lsbCBhbHNvIGluaXRpYWxpemUgdGhlIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyB0byBkZWZhdWx0CisgKiB2YWx1ZXMsIGFuZCBmaW5hbGx5IHJldHVybiBKUEVHX0hFQURFUl9PSy4gIE9uIHJldHVybiwgdGhlIGFwcGxpY2F0aW9uIG1heQorICogYWRqdXN0IHRoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHRoZW4gY2FsbCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MuCisgKiAoT3IsIGlmIHRoZSBhcHBsaWNhdGlvbiBvbmx5IHdhbnRlZCB0byBkZXRlcm1pbmUgdGhlIGltYWdlIHBhcmFtZXRlcnMsCisgKiB0aGUgZGF0YSBuZWVkIG5vdCBiZSBkZWNvbXByZXNzZWQuICBJbiB0aGF0IGNhc2UsIGNhbGwganBlZ19hYm9ydCBvcgorICoganBlZ19kZXN0cm95IHRvIHJlbGVhc2UgYW55IHRlbXBvcmFyeSBzcGFjZS4pCisgKiBJZiBhbiBhYmJyZXZpYXRlZCAodGFibGVzIG9ubHkpIGRhdGFzdHJlYW0gaXMgcHJlc2VudGVkLCB0aGUgcm91dGluZSB3aWxsCisgKiByZXR1cm4gSlBFR19IRUFERVJfVEFCTEVTX09OTFkgdXBvbiByZWFjaGluZyBFT0kuICBUaGUgYXBwbGljYXRpb24gbWF5IHRoZW4KKyAqIHJlLXVzZSB0aGUgSlBFRyBvYmplY3QgdG8gcmVhZCB0aGUgYWJicmV2aWF0ZWQgaW1hZ2UgZGF0YXN0cmVhbShzKS4KKyAqIEl0IGlzIHVubmVjZXNzYXJ5IChidXQgT0spIHRvIGNhbGwganBlZ19hYm9ydCBpbiB0aGlzIGNhc2UuCisgKiBUaGUgSlBFR19TVVNQRU5ERUQgcmV0dXJuIGNvZGUgb25seSBvY2N1cnMgaWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZQorICogcmVxdWVzdHMgc3VzcGVuc2lvbiBvZiB0aGUgZGVjb21wcmVzc29yLiAgSW4gdGhpcyBjYXNlIHRoZSBhcHBsaWNhdGlvbgorICogc2hvdWxkIGxvYWQgbW9yZSBzb3VyY2UgZGF0YSBhbmQgdGhlbiByZS1jYWxsIGpwZWdfcmVhZF9oZWFkZXIgdG8gcmVzdW1lCisgKiBwcm9jZXNzaW5nLgorICogSWYgYSBub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkIGFuZCByZXF1aXJlX2ltYWdlIGlzIFRSVUUsIHRoZW4gdGhlCisgKiByZXR1cm4gY29kZSBuZWVkIG5vdCBiZSBpbnNwZWN0ZWQgc2luY2Ugb25seSBKUEVHX0hFQURFUl9PSyBpcyBwb3NzaWJsZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgbm93IGp1c3QgYSBmcm9udCBlbmQgdG8ganBlZ19jb25zdW1lX2lucHV0LCB3aXRoIHNvbWUKKyAqIGV4dHJhIGVycm9yIGNoZWNraW5nLgorICovCisKK0dMT0JBTChpbnQpCitqcGVnX3JlYWRfaGVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIHJlcXVpcmVfaW1hZ2UpCit7CisgIGludCByZXRjb2RlOworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TVEFSVCAmJgorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfSU5IRUFERVIpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICByZXRjb2RlID0ganBlZ19jb25zdW1lX2lucHV0KGNpbmZvKTsKKworICBzd2l0Y2ggKHJldGNvZGUpIHsKKyAgY2FzZSBKUEVHX1JFQUNIRURfU09TOgorICAgIHJldGNvZGUgPSBKUEVHX0hFQURFUl9PSzsKKyAgICBicmVhazsKKyAgY2FzZSBKUEVHX1JFQUNIRURfRU9JOgorICAgIGlmIChyZXF1aXJlX2ltYWdlKQkJLyogQ29tcGxhaW4gaWYgYXBwbGljYXRpb24gd2FudGVkIGFuIGltYWdlICovCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PX0lNQUdFKTsKKyAgICAvKiBSZXNldCB0byBzdGFydCBzdGF0ZTsgaXQgd291bGQgYmUgc2FmZXIgdG8gcmVxdWlyZSB0aGUgYXBwbGljYXRpb24gdG8KKyAgICAgKiBjYWxsIGpwZWdfYWJvcnQsIGJ1dCB3ZSBjYW4ndCBjaGFuZ2UgaXQgbm93IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisgICAgICogQSBzaWRlIGVmZmVjdCBpcyB0byBmcmVlIGFueSB0ZW1wb3JhcnkgbWVtb3J5ICh0aGVyZSBzaG91bGRuJ3QgYmUgYW55KS4KKyAgICAgKi8KKyAgICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogc2V0cyBzdGF0ZSA9IERTVEFURV9TVEFSVCAqLworICAgIHJldGNvZGUgPSBKUEVHX0hFQURFUl9UQUJMRVNfT05MWTsKKyAgICBicmVhazsKKyAgY2FzZSBKUEVHX1NVU1BFTkRFRDoKKyAgICAvKiBubyB3b3JrICovCisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0Y29kZTsKK30KKworCisvKgorICogQ29uc3VtZSBkYXRhIGluIGFkdmFuY2Ugb2Ygd2hhdCB0aGUgZGVjb21wcmVzc29yIHJlcXVpcmVzLgorICogVGhpcyBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIG9uY2UgdGhlIGRlY29tcHJlc3NvciBvYmplY3QgaGFzCisgKiBiZWVuIGNyZWF0ZWQgYW5kIGEgZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0IHVwLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBlc3NlbnRpYWxseSBhIHN0YXRlIG1hY2hpbmUgdGhhdCBoYW5kbGVzIGEgY291cGxlCisgKiBvZiBjcml0aWNhbCBzdGF0ZS10cmFuc2l0aW9uIGFjdGlvbnMsIG5hbWVseSBpbml0aWFsIHNldHVwIGFuZAorICogdHJhbnNpdGlvbiBmcm9tIGhlYWRlciBzY2FubmluZyB0byByZWFkeS1mb3Itc3RhcnRfZGVjb21wcmVzcy4KKyAqIEFsbCB0aGUgYWN0dWFsIGlucHV0IGlzIGRvbmUgdmlhIHRoZSBpbnB1dCBjb250cm9sbGVyJ3MgY29uc3VtZV9pbnB1dAorICogbWV0aG9kLgorICovCisKK0dMT0JBTChpbnQpCitqcGVnX2NvbnN1bWVfaW5wdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCByZXRjb2RlID0gSlBFR19TVVNQRU5ERUQ7CisKKyAgLyogTkI6IGV2ZXJ5IHBvc3NpYmxlIERTVEFURSB2YWx1ZSBzaG91bGQgYmUgbGlzdGVkIGluIHRoaXMgc3dpdGNoICovCisgIHN3aXRjaCAoY2luZm8tPmdsb2JhbF9zdGF0ZSkgeworICBjYXNlIERTVEFURV9TVEFSVDoKKyAgICAvKiBTdGFydC1vZi1kYXRhc3RyZWFtIGFjdGlvbnM6IHJlc2V0IGFwcHJvcHJpYXRlIG1vZHVsZXMgKi8KKyAgICAoKmNpbmZvLT5pbnB1dGN0bC0+cmVzZXRfaW5wdXRfY29udHJvbGxlcikgKGNpbmZvKTsKKyAgICAvKiBJbml0aWFsaXplIGFwcGxpY2F0aW9uJ3MgZGF0YSBzb3VyY2UgbW9kdWxlICovCisgICAgKCpjaW5mby0+c3JjLT5pbml0X3NvdXJjZSkgKGNpbmZvKTsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0lOSEVBREVSOworICAgIC8qRkFMTFRIUk9VR0gqLworICBjYXNlIERTVEFURV9JTkhFQURFUjoKKyAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpIChjaW5mbyk7CisgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykgeyAvKiBGb3VuZCBTT1MsIHByZXBhcmUgdG8gZGVjb21wcmVzcyAqLworICAgICAgLyogU2V0IHVwIGRlZmF1bHQgcGFyYW1ldGVycyBiYXNlZCBvbiBoZWFkZXIgZGF0YSAqLworICAgICAgZGVmYXVsdF9kZWNvbXByZXNzX3Bhcm1zKGNpbmZvKTsKKyAgICAgIC8qIFNldCBnbG9iYWwgc3RhdGU6IHJlYWR5IGZvciBzdGFydF9kZWNvbXByZXNzICovCisgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1JFQURZOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBEU1RBVEVfUkVBRFk6CisgICAgLyogQ2FuJ3QgYWR2YW5jZSBwYXN0IGZpcnN0IFNPUyB1bnRpbCBzdGFydF9kZWNvbXByZXNzIGlzIGNhbGxlZCAqLworICAgIHJldGNvZGUgPSBKUEVHX1JFQUNIRURfU09TOworICAgIGJyZWFrOworICBjYXNlIERTVEFURV9QUkVMT0FEOgorICBjYXNlIERTVEFURV9QUkVTQ0FOOgorICBjYXNlIERTVEFURV9TQ0FOTklORzoKKyAgY2FzZSBEU1RBVEVfUkFXX09LOgorICBjYXNlIERTVEFURV9CVUZJTUFHRToKKyAgY2FzZSBEU1RBVEVfQlVGUE9TVDoKKyAgY2FzZSBEU1RBVEVfU1RPUFBJTkc6CisgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIH0KKyAgcmV0dXJuIHJldGNvZGU7Cit9CisKKworLyoKKyAqIEhhdmUgd2UgZmluaXNoZWQgcmVhZGluZyB0aGUgaW5wdXQgZmlsZT8KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfaW5wdXRfY29tcGxldGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIENoZWNrIGZvciB2YWxpZCBqcGVnIG9iamVjdCAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA8IERTVEFURV9TVEFSVCB8fAorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA+IERTVEFURV9TVE9QUElORykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICByZXR1cm4gY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZDsKK30KKworCisvKgorICogSXMgdGhlcmUgbW9yZSB0aGFuIG9uZSBzY2FuPworICovCisKK0dMT0JBTChib29sZWFuKQoranBlZ19oYXNfbXVsdGlwbGVfc2NhbnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIE9ubHkgdmFsaWQgYWZ0ZXIganBlZ19yZWFkX2hlYWRlciBjb21wbGV0ZXMgKi8KKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPCBEU1RBVEVfUkVBRFkgfHwKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPiBEU1RBVEVfU1RPUFBJTkcpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgcmV0dXJuIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zOworfQorCisKKy8qCisgKiBGaW5pc2ggSlBFRyBkZWNvbXByZXNzaW9uLgorICoKKyAqIFRoaXMgd2lsbCBub3JtYWxseSBqdXN0IHZlcmlmeSB0aGUgZmlsZSB0cmFpbGVyIGFuZCByZWxlYXNlIHRlbXAgc3RvcmFnZS4KKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgorICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpZiAoKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1NDQU5OSU5HIHx8CisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkFXX09LKSAmJiAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgeworICAgIC8qIFRlcm1pbmF0ZSBmaW5hbCBwYXNzIG9mIG5vbi1idWZmZXJlZCBtb2RlICovCisgICAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby0+b3V0cHV0X2hlaWdodCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVE9PX0xJVFRMRV9EQVRBKTsKKyAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOworICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX0JVRklNQUdFKSB7CisgICAgLyogRmluaXNoaW5nIGFmdGVyIGEgYnVmZmVyZWQtaW1hZ2Ugb3BlcmF0aW9uICovCisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TVE9QUElORykgeworICAgIC8qIFNUT1BQSU5HID0gcmVwZWF0IGNhbGwgYWZ0ZXIgYSBzdXNwZW5zaW9uLCBhbnl0aGluZyBlbHNlIGlzIGVycm9yICovCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgfQorICAvKiBSZWFkIHVudGlsIEVPSSAqLworICB3aGlsZSAoISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7CisgICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgcmV0dXJuIEZBTFNFOwkJLyogU3VzcGVuZCwgY29tZSBiYWNrIGxhdGVyICovCisgIH0KKyAgLyogRG8gZmluYWwgY2xlYW51cCAqLworICAoKmNpbmZvLT5zcmMtPnRlcm1fc291cmNlKSAoY2luZm8pOworICAvKiBXZSBjYW4gdXNlIGpwZWdfYWJvcnQgdG8gcmVsZWFzZSBtZW1vcnkgYW5kIHJlc2V0IGdsb2JhbF9zdGF0ZSAqLworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qZGFwaXN0ZC5jIGIvY29tbW9uL2pwZWcvamRhcGlzdGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGUzZmEwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamRhcGlzdGQuYwpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIGpkYXBpc3RkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGRlY29tcHJlc3Npb24gaGFsZgorICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgInN0YW5kYXJkIiBBUEkgcm91dGluZXMgdGhhdCBhcmUKKyAqIHVzZWQgaW4gdGhlIG5vcm1hbCBmdWxsLWRlY29tcHJlc3Npb24gY2FzZS4gIFRoZXkgYXJlIG5vdCB1c2VkIGJ5IGEKKyAqIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgaWYgYW4gYXBwbGljYXRpb24gbGlua3MgaW4KKyAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGRlY29tcHJlc3Nvci4KKyAqIFdlIHRodXMgbXVzdCBzZXBhcmF0ZSB0aGlzIGZpbGUgZnJvbSBqZGFwaW1pbi5jIHRvIGF2b2lkIGxpbmtpbmcgdGhlCisgKiB3aG9sZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgaW50byBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTChib29sZWFuKSBvdXRwdXRfcGFzc19zZXR1cCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogRGVjb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbi4KKyAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBJZiBhIG11bHRpcGFzcyBvcGVyYXRpbmcgbW9kZSB3YXMgc2VsZWN0ZWQsIHRoaXMgd2lsbCBkbyBhbGwgYnV0IHRoZQorICogbGFzdCBwYXNzLCBhbmQgdGh1cyBtYXkgdGFrZSBhIGdyZWF0IGRlYWwgb2YgdGltZS4KKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgorICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX3N0YXJ0X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgeworICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wsIHNlbGVjdCBhY3RpdmUgbW9kdWxlcyAqLworICAgIGppbml0X21hc3Rlcl9kZWNvbXByZXNzKGNpbmZvKTsKKyAgICBpZiAoY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgICAvKiBObyBtb3JlIHdvcmsgaGVyZTsgZXhwZWN0aW5nIGpwZWdfc3RhcnRfb3V0cHV0IG5leHQgKi8KKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVMT0FEOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9QUkVMT0FEKSB7CisgICAgLyogSWYgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMsIGFic29yYiB0aGVtIGFsbCBpbnRvIHRoZSBjb2VmIGJ1ZmZlciAqLworICAgIGlmIChjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgeworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAgICAgZm9yICg7OykgeworCWludCByZXRjb2RlOworCS8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKwlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCisJICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKwkvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCisJcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworCWlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQorCSAgcmV0dXJuIEZBTFNFOworCWlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCisJICBicmVhazsKKwkvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKKwkgICAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKKwkgIGlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgeworCSAgICAvKiBqZG1hc3RlciB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KKwkgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOworCSAgfQorCX0KKyAgICAgIH0KKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCisgICAgfQorICAgIGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7CisgIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgZmluYWwgcGFzcyAqLworICByZXR1cm4gb3V0cHV0X3Bhc3Nfc2V0dXAoY2luZm8pOworfQorCisKKy8qCisgKiBTZXQgdXAgZm9yIGFuIG91dHB1dCBwYXNzLCBhbmQgcGVyZm9ybSBhbnkgZHVtbXkgcGFzcyhlcykgbmVlZGVkLgorICogQ29tbW9uIHN1YnJvdXRpbmUgZm9yIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBhbmQganBlZ19zdGFydF9vdXRwdXQuCisgKiBFbnRyeTogZ2xvYmFsX3N0YXRlID0gRFNUQVRFX1BSRVNDQU4gb25seSBpZiBwcmV2aW91c2x5IHN1c3BlbmRlZC4KKyAqIEV4aXQ6IElmIGRvbmUsIHJldHVybnMgVFJVRSBhbmQgc2V0cyBnbG9iYWxfc3RhdGUgZm9yIHByb3BlciBvdXRwdXQgbW9kZS4KKyAqICAgICAgIElmIHN1c3BlbmRlZCwgcmV0dXJucyBGQUxTRSBhbmQgc2V0cyBnbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFU0NBTi4KKyAqLworCitMT0NBTChib29sZWFuKQorb3V0cHV0X3Bhc3Nfc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9QUkVTQ0FOKSB7CisgICAgLyogRmlyc3QgY2FsbDogZG8gcGFzcyBzZXR1cCAqLworICAgICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MpIChjaW5mbyk7CisgICAgY2luZm8tPm91dHB1dF9zY2FubGluZSA9IDA7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVTQ0FOOworICB9CisgIC8qIExvb3Agb3ZlciBhbnkgcmVxdWlyZWQgZHVtbXkgcGFzc2VzICovCisgIHdoaWxlIChjaW5mby0+bWFzdGVyLT5pc19kdW1teV9wYXNzKSB7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgICAgLyogQ3JhbmsgdGhyb3VnaCB0aGUgZHVtbXkgcGFzcyAqLworICAgIHdoaWxlIChjaW5mby0+b3V0cHV0X3NjYW5saW5lIDwgY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICAgIEpESU1FTlNJT04gbGFzdF9zY2FubGluZTsKKyAgICAgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworCWNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisJY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworCSgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgfQorICAgICAgLyogUHJvY2VzcyBzb21lIGRhdGEgKi8KKyAgICAgIGxhc3Rfc2NhbmxpbmUgPSBjaW5mby0+b3V0cHV0X3NjYW5saW5lOworICAgICAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIChKU0FNUEFSUkFZKSBOVUxMLAorCQkJCSAgICAmY2luZm8tPm91dHB1dF9zY2FubGluZSwgKEpESU1FTlNJT04pIDApOworICAgICAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPT0gbGFzdF9zY2FubGluZSkKKwlyZXR1cm4gRkFMU0U7CQkvKiBObyBwcm9ncmVzcyBtYWRlLCBtdXN0IHN1c3BlbmQgKi8KKyAgICB9CisgICAgLyogRmluaXNoIHVwIGR1bW15IHBhc3MsIGFuZCBzZXQgdXAgZm9yIGFub3RoZXIgb25lICovCisgICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfb3V0cHV0X3Bhc3MpIChjaW5mbyk7CisgICAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gMDsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworICB9CisgIC8qIFJlYWR5IGZvciBhcHBsaWNhdGlvbiB0byBkcml2ZSBvdXRwdXQgcGFzcyB0aHJvdWdoCisgICAqIGpwZWdfcmVhZF9zY2FubGluZXMgb3IganBlZ19yZWFkX3Jhd19kYXRhLgorICAgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IGNpbmZvLT5yYXdfZGF0YV9vdXQgPyBEU1RBVEVfUkFXX09LIDogRFNUQVRFX1NDQU5OSU5HOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogUmVhZCBzb21lIHNjYW5saW5lcyBvZiBkYXRhIGZyb20gdGhlIEpQRUcgZGVjb21wcmVzc29yLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGxpbmVzIGFjdHVhbGx5IHJlYWQuCisgKiBUaGlzIG1heSBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciByZXF1ZXN0ZWQgaW4gc2V2ZXJhbCBjYXNlcywKKyAqIGluY2x1ZGluZyBib3R0b20gb2YgaW1hZ2UsIGRhdGEgc291cmNlIHN1c3BlbnNpb24sIGFuZCBvcGVyYXRpbmcKKyAqIG1vZGVzIHRoYXQgZW1pdCBtdWx0aXBsZSBzY2FubGluZXMgYXQgYSB0aW1lLgorICoKKyAqIE5vdGU6IHdlIHdhcm4gYWJvdXQgZXhjZXNzIGNhbGxzIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKSBzaW5jZQorICogdGhpcyBsaWtlbHkgc2lnbmFscyBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyIGVycm9yLiAgSG93ZXZlciwKKyAqIGFuIG92ZXJzaXplIGJ1ZmZlciAobWF4X2xpbmVzID4gc2NhbmxpbmVzIHJlbWFpbmluZykgaXMgbm90IGFuIGVycm9yLgorICovCisKK0dMT0JBTChKRElNRU5TSU9OKQoranBlZ19yZWFkX3NjYW5saW5lcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBzY2FubGluZXMsCisJCSAgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpCit7CisgIEpESU1FTlNJT04gcm93X2N0cjsKKworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU0NBTk5JTkcpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPj0gY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisKKyAgLyogUHJvY2VzcyBzb21lIGRhdGEgKi8KKyAgcm93X2N0ciA9IDA7CisgICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCBtYXhfbGluZXMpOworICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IHJvd19jdHI7CisgIHJldHVybiByb3dfY3RyOworfQorCisKKy8qCisgKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQgdG8gcmVhZCByYXcgZGF0YS4KKyAqIFByb2Nlc3NlcyBleGFjdGx5IG9uZSBpTUNVIHJvdyBwZXIgY2FsbCwgdW5sZXNzIHN1c3BlbmRlZC4KKyAqLworCitHTE9CQUwoSkRJTUVOU0lPTikKK2pwZWdfcmVhZF9yYXdfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBkYXRhLAorCQkgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpCit7CisgIEpESU1FTlNJT04gbGluZXNfcGVyX2lNQ1Vfcm93OworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9SQVdfT0spCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPj0gY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisKKyAgLyogVmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGlNQ1Ugcm93IGNhbiBiZSByZXR1cm5lZC4gKi8KKyAgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIGlmIChtYXhfbGluZXMgPCBsaW5lc19wZXJfaU1DVV9yb3cpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CVUZGRVJfU0laRSk7CisKKyAgLyogRGVjb21wcmVzcyBkaXJlY3RseSBpbnRvIHVzZXIncyBidWZmZXIuICovCisgIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLCBkYXRhKSkKKyAgICByZXR1cm4gMDsJCQkvKiBzdXNwZW5zaW9uIGZvcmNlZCwgY2FuIGRvIG5vdGhpbmcgbW9yZSAqLworCisgIC8qIE9LLCB3ZSBwcm9jZXNzZWQgb25lIGlNQ1Ugcm93LiAqLworICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IGxpbmVzX3Blcl9pTUNVX3JvdzsKKyAgcmV0dXJuIGxpbmVzX3Blcl9pTUNVX3JvdzsKK30KKworCisvKiBBZGRpdGlvbmFsIGVudHJ5IHBvaW50cyBmb3IgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KKworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYW4gb3V0cHV0IHBhc3MgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfc3RhcnRfb3V0cHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgc2Nhbl9udW1iZXIpCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZJTUFHRSAmJgorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICAvKiBMaW1pdCBzY2FuIG51bWJlciB0byB2YWxpZCByYW5nZSAqLworICBpZiAoc2Nhbl9udW1iZXIgPD0gMCkKKyAgICBzY2FuX251bWJlciA9IDE7CisgIGlmIChjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkICYmCisgICAgICBzY2FuX251bWJlciA+IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcikKKyAgICBzY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKKyAgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IHNjYW5fbnVtYmVyOworICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgcmVhbCBwYXNzICovCisgIHJldHVybiBvdXRwdXRfcGFzc19zZXR1cChjaW5mbyk7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhZnRlciBhbiBvdXRwdXQgcGFzcyBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLgorICoKKyAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuZGVkLiAgVGhlIHJldHVybiB2YWx1ZSBuZWVkIGJlIGluc3BlY3RlZCBvbmx5IGlmCisgKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfZmluaXNoX291dHB1dCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgLyogVGVybWluYXRlIHRoaXMgcGFzcy4gKi8KKyAgICAvKiBXZSBkbyBub3QgcmVxdWlyZSB0aGUgd2hvbGUgcGFzcyB0byBoYXZlIGJlZW4gY29tcGxldGVkLiAqLworICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX291dHB1dF9wYXNzKSAoY2luZm8pOworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGUE9TVDsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZQT1NUKSB7CisgICAgLyogQlVGUE9TVCA9IHJlcGVhdCBjYWxsIGFmdGVyIGEgc3VzcGVuc2lvbiwgYW55dGhpbmcgZWxzZSBpcyBlcnJvciAqLworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIH0KKyAgLyogUmVhZCBtYXJrZXJzIGxvb2tpbmcgZm9yIFNPUyBvciBFT0kgKi8KKyAgd2hpbGUgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA8PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyICYmCisJICEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgeworICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLworICB9CisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qZGF0YWRzdC5jIGIvY29tbW9uL2pwZWcvamRhdGFkc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGY2ZmIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamRhdGFkc3QuYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIGpkYXRhZHN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb21wcmVzc2lvbiBkYXRhIGRlc3RpbmF0aW9uIHJvdXRpbmVzIGZvciB0aGUgY2FzZSBvZgorICogZW1pdHRpbmcgSlBFRyBkYXRhIHRvIGEgZmlsZSAob3IgYW55IHN0ZGlvIHN0cmVhbSkuICBXaGlsZSB0aGVzZSByb3V0aW5lcworICogYXJlIHN1ZmZpY2llbnQgZm9yIG1vc3QgYXBwbGljYXRpb25zLCBzb21lIHdpbGwgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQKKyAqIGRlc3RpbmF0aW9uIG1hbmFnZXIuCisgKiBJTVBPUlRBTlQ6IHdlIGFzc3VtZSB0aGF0IGZ3cml0ZSgpIHdpbGwgY29ycmVjdGx5IHRyYW5zY3JpYmUgYW4gYXJyYXkgb2YKKyAqIEpPQ1RFVHMgaW50byA4LWJpdC13aWRlIGVsZW1lbnRzIG9uIGV4dGVybmFsIHN0b3JhZ2UuICBJZiBjaGFyIGlzIHdpZGVyCisgKiB0aGFuIDggYml0cyBvbiB5b3VyIG1hY2hpbmUsIHlvdSBtYXkgbmVlZCB0byBkbyBzb21lIHR3ZWFraW5nLgorICovCisKKy8qIHRoaXMgaXMgbm90IGEgY29yZSBsaWJyYXJ5IG1vZHVsZSwgc28gaXQgZG9lc24ndCBkZWZpbmUgSlBFR19JTlRFUk5BTFMgKi8KKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZXJyb3IuaCIKKworCisvKiBFeHBhbmRlZCBkYXRhIGRlc3RpbmF0aW9uIG9iamVjdCBmb3Igc3RkaW8gb3V0cHV0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEZJTEUgKiBvdXRmaWxlOwkJLyogdGFyZ2V0IHN0cmVhbSAqLworICBKT0NURVQgKiBidWZmZXI7CQkvKiBzdGFydCBvZiBidWZmZXIgKi8KK30gbXlfZGVzdGluYXRpb25fbWdyOworCit0eXBlZGVmIG15X2Rlc3RpbmF0aW9uX21nciAqIG15X2Rlc3RfcHRyOworCisjZGVmaW5lIE9VVFBVVF9CVUZfU0laRSAgNDA5NgkvKiBjaG9vc2UgYW4gZWZmaWNpZW50bHkgZndyaXRlJ2FibGUgc2l6ZSAqLworCisKKy8qCisgKiBJbml0aWFsaXplIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19zdGFydF9jb21wcmVzcworICogYmVmb3JlIGFueSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitpbml0X2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfZGVzdF9wdHIgZGVzdCA9IChteV9kZXN0X3B0cikgY2luZm8tPmRlc3Q7CisKKyAgLyogQWxsb2NhdGUgdGhlIG91dHB1dCBidWZmZXIgLS0tIGl0IHdpbGwgYmUgcmVsZWFzZWQgd2hlbiBkb25lIHdpdGggaW1hZ2UgKi8KKyAgZGVzdC0+YnVmZmVyID0gKEpPQ1RFVCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIE9VVFBVVF9CVUZfU0laRSAqIFNJWkVPRihKT0NURVQpKTsKKworICBkZXN0LT5wdWIubmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPmJ1ZmZlcjsKKyAgZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyID0gT1VUUFVUX0JVRl9TSVpFOworfQorCisKKy8qCisgKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlciAtLS0gY2FsbGVkIHdoZW5ldmVyIGJ1ZmZlciBmaWxscyB1cC4KKyAqCisgKiBJbiB0eXBpY2FsIGFwcGxpY2F0aW9ucywgdGhpcyBzaG91bGQgd3JpdGUgdGhlIGVudGlyZSBvdXRwdXQgYnVmZmVyCisgKiAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9vdXRwdXRfYnl0ZSAmIGZyZWVfaW5fYnVmZmVyKSwKKyAqIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZCByZXR1cm4gVFJVRQorICogaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gZHVtcGVkLgorICoKKyAqIEluIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gYmUgYWJsZSB0byBzdXNwZW5kIGNvbXByZXNzaW9uIGR1ZSB0byBvdXRwdXQKKyAqIG92ZXJydW4sIGEgRkFMU0UgcmV0dXJuIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgY2Fubm90IGJlIGVtcHRpZWQgbm93LgorICogSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBjb21wcmVzc29yIHdpbGwgcmV0dXJuIHRvIGl0cyBjYWxsZXIgKHBvc3NpYmx5IHdpdGgKKyAqIGFuIGluZGljYXRpb24gdGhhdCBpdCBoYXMgbm90IGFjY2VwdGVkIGFsbCB0aGUgc3VwcGxpZWQgc2NhbmxpbmVzKS4gIFRoZQorICogYXBwbGljYXRpb24gc2hvdWxkIHJlc3VtZSBjb21wcmVzc2lvbiBhZnRlciBpdCBoYXMgbWFkZSBtb3JlIHJvb20gaW4gdGhlCisgKiBvdXRwdXQgYnVmZmVyLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBzdWJzdGFudGlhbCByZXN0cmljdGlvbnMgb24gdGhlIHVzZSBvZgorICogc3VzcGVuc2lvbiAtLS0gc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorICoKKyAqIFdoZW4gc3VzcGVuZGluZywgdGhlIGNvbXByZXNzb3Igd2lsbCBiYWNrIHVwIHRvIGEgY29udmVuaWVudCByZXN0YXJ0IHBvaW50CisgKiAodHlwaWNhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpLiBuZXh0X291dHB1dF9ieXRlICYgZnJlZV9pbl9idWZmZXIKKyAqIGluZGljYXRlIHdoZXJlIHRoZSByZXN0YXJ0IHBvaW50IHdpbGwgYmUgaWYgdGhlIGN1cnJlbnQgY2FsbCByZXR1cm5zIEZBTFNFLgorICogRGF0YSBiZXlvbmQgdGhpcyBwb2ludCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGFmdGVyIHJlc3VtcHRpb24sIHNvIGRvIG5vdAorICogd3JpdGUgaXQgb3V0IHdoZW4gZW1wdHlpbmcgdGhlIGJ1ZmZlciBleHRlcm5hbGx5LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW1wdHlfb3V0cHV0X2J1ZmZlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Rlc3RfcHRyIGRlc3QgPSAobXlfZGVzdF9wdHIpIGNpbmZvLT5kZXN0OworCisgIGlmIChKRldSSVRFKGRlc3QtPm91dGZpbGUsIGRlc3QtPmJ1ZmZlciwgT1VUUFVUX0JVRl9TSVpFKSAhPQorICAgICAgKHNpemVfdCkgT1VUUFVUX0JVRl9TSVpFKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisKKyAgZGVzdC0+cHViLm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0LT5idWZmZXI7CisgIGRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlciA9IE9VVFBVVF9CVUZfU0laRTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogVGVybWluYXRlIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19maW5pc2hfY29tcHJlc3MKKyAqIGFmdGVyIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4uICBVc3VhbGx5IG5lZWRzIHRvIGZsdXNoIGJ1ZmZlci4KKyAqCisgKiBOQjogKm5vdCogY2FsbGVkIGJ5IGpwZWdfYWJvcnQgb3IganBlZ19kZXN0cm95OyBzdXJyb3VuZGluZworICogYXBwbGljYXRpb24gbXVzdCBkZWFsIHdpdGggYW55IGNsZWFudXAgdGhhdCBzaG91bGQgaGFwcGVuIGV2ZW4KKyAqIGZvciBlcnJvciBleGl0LgorICovCisKK01FVEhPRERFRih2b2lkKQordGVybV9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Rlc3RfcHRyIGRlc3QgPSAobXlfZGVzdF9wdHIpIGNpbmZvLT5kZXN0OworICBzaXplX3QgZGF0YWNvdW50ID0gT1VUUFVUX0JVRl9TSVpFIC0gZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFdyaXRlIGFueSBkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyICovCisgIGlmIChkYXRhY291bnQgPiAwKSB7CisgICAgaWYgKEpGV1JJVEUoZGVzdC0+b3V0ZmlsZSwgZGVzdC0+YnVmZmVyLCBkYXRhY291bnQpICE9IGRhdGFjb3VudCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisgIH0KKyAgZmZsdXNoKGRlc3QtPm91dGZpbGUpOworICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCisgIGlmIChmZXJyb3IoZGVzdC0+b3V0ZmlsZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKK30KKworCisvKgorICogUHJlcGFyZSBmb3Igb3V0cHV0IHRvIGEgc3RkaW8gc3RyZWFtLgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBvcGVuZWQgdGhlIHN0cmVhbSwgYW5kIGlzIHJlc3BvbnNpYmxlCisgKiBmb3IgY2xvc2luZyBpdCBhZnRlciBmaW5pc2hpbmcgY29tcHJlc3Npb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N0ZGlvX2Rlc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogb3V0ZmlsZSkKK3sKKyAgbXlfZGVzdF9wdHIgZGVzdDsKKworICAvKiBUaGUgZGVzdGluYXRpb24gb2JqZWN0IGlzIG1hZGUgcGVybWFuZW50IHNvIHRoYXQgbXVsdGlwbGUgSlBFRyBpbWFnZXMKKyAgICogY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgZmlsZSB3aXRob3V0IHJlLWV4ZWN1dGluZyBqcGVnX3N0ZGlvX2Rlc3QuCisgICAqIFRoaXMgbWFrZXMgaXQgZGFuZ2Vyb3VzIHRvIHVzZSB0aGlzIG1hbmFnZXIgYW5kIGEgZGlmZmVyZW50IGRlc3RpbmF0aW9uCisgICAqIG1hbmFnZXIgc2VyaWFsbHkgd2l0aCB0aGUgc2FtZSBKUEVHIG9iamVjdCwgYmVjYXVzZSB0aGVpciBwcml2YXRlIG9iamVjdAorICAgKiBzaXplcyBtYXkgYmUgZGlmZmVyZW50LiAgQ2F2ZWF0IHByb2dyYW1tZXIuCisgICAqLworICBpZiAoY2luZm8tPmRlc3QgPT0gTlVMTCkgewkvKiBmaXJzdCB0aW1lIGZvciB0aGlzIEpQRUcgb2JqZWN0PyAqLworICAgIGNpbmZvLT5kZXN0ID0gKHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCisJCQkJICBTSVpFT0YobXlfZGVzdGluYXRpb25fbWdyKSk7CisgIH0KKworICBkZXN0ID0gKG15X2Rlc3RfcHRyKSBjaW5mby0+ZGVzdDsKKyAgZGVzdC0+cHViLmluaXRfZGVzdGluYXRpb24gPSBpbml0X2Rlc3RpbmF0aW9uOworICBkZXN0LT5wdWIuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IGVtcHR5X291dHB1dF9idWZmZXI7CisgIGRlc3QtPnB1Yi50ZXJtX2Rlc3RpbmF0aW9uID0gdGVybV9kZXN0aW5hdGlvbjsKKyAgZGVzdC0+b3V0ZmlsZSA9IG91dGZpbGU7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qZGF0YXNyYy5jIGIvY29tbW9uL2pwZWcvamRhdGFzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGM3NTJiCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamRhdGFzcmMuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIGpkYXRhc3JjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNvbXByZXNzaW9uIGRhdGEgc291cmNlIHJvdXRpbmVzIGZvciB0aGUgY2FzZSBvZgorICogcmVhZGluZyBKUEVHIGRhdGEgZnJvbSBhIGZpbGUgKG9yIGFueSBzdGRpbyBzdHJlYW0pLiAgV2hpbGUgdGhlc2Ugcm91dGluZXMKKyAqIGFyZSBzdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucywgc29tZSB3aWxsIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50CisgKiBzb3VyY2UgbWFuYWdlci4KKyAqIElNUE9SVEFOVDogd2UgYXNzdW1lIHRoYXQgZnJlYWQoKSB3aWxsIGNvcnJlY3RseSB0cmFuc2NyaWJlIGFuIGFycmF5IG9mCisgKiBKT0NURVRzIGZyb20gOC1iaXQtd2lkZSBlbGVtZW50cyBvbiBleHRlcm5hbCBzdG9yYWdlLiAgSWYgY2hhciBpcyB3aWRlcgorICogdGhhbiA4IGJpdHMgb24geW91ciBtYWNoaW5lLCB5b3UgbWF5IG5lZWQgdG8gZG8gc29tZSB0d2Vha2luZy4KKyAqLworCisvKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamVycm9yLmgiCisKKworLyogRXhwYW5kZWQgZGF0YSBzb3VyY2Ugb2JqZWN0IGZvciBzdGRpbyBpbnB1dCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgRklMRSAqIGluZmlsZTsJCS8qIHNvdXJjZSBzdHJlYW0gKi8KKyAgSk9DVEVUICogYnVmZmVyOwkJLyogc3RhcnQgb2YgYnVmZmVyICovCisgIGJvb2xlYW4gc3RhcnRfb2ZfZmlsZTsJLyogaGF2ZSB3ZSBnb3R0ZW4gYW55IGRhdGEgeWV0PyAqLworfSBteV9zb3VyY2VfbWdyOworCit0eXBlZGVmIG15X3NvdXJjZV9tZ3IgKiBteV9zcmNfcHRyOworCisjZGVmaW5lIElOUFVUX0JVRl9TSVpFICA0MDk2CS8qIGNob29zZSBhbiBlZmZpY2llbnRseSBmcmVhZCdhYmxlIHNpemUgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX3JlYWRfaGVhZGVyCisgKiBiZWZvcmUgYW55IGRhdGEgaXMgYWN0dWFsbHkgcmVhZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2luaXRfc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9zcmNfcHRyIHNyYyA9IChteV9zcmNfcHRyKSBjaW5mby0+c3JjOworCisgIC8qIFdlIHJlc2V0IHRoZSBlbXB0eS1pbnB1dC1maWxlIGZsYWcgZm9yIGVhY2ggaW1hZ2UsCisgICAqIGJ1dCB3ZSBkb24ndCBjbGVhciB0aGUgaW5wdXQgYnVmZmVyLgorICAgKiBUaGlzIGlzIGNvcnJlY3QgYmVoYXZpb3IgZm9yIHJlYWRpbmcgYSBzZXJpZXMgb2YgaW1hZ2VzIGZyb20gb25lIHNvdXJjZS4KKyAgICovCisgIHNyYy0+c3RhcnRfb2ZfZmlsZSA9IFRSVUU7Cit9CisKKworLyoKKyAqIEZpbGwgdGhlIGlucHV0IGJ1ZmZlciAtLS0gY2FsbGVkIHdoZW5ldmVyIGJ1ZmZlciBpcyBlbXB0aWVkLgorICoKKyAqIEluIHR5cGljYWwgYXBwbGljYXRpb25zLCB0aGlzIHNob3VsZCByZWFkIGZyZXNoIGRhdGEgaW50byB0aGUgYnVmZmVyCisgKiAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9pbnB1dF9ieXRlICYgYnl0ZXNfaW5fYnVmZmVyKSwKKyAqIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZCByZXR1cm4gVFJVRQorICogaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gcmVsb2FkZWQuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvCisgKiBmaWxsIHRoZSBidWZmZXIgZW50aXJlbHksIG9ubHkgdG8gb2J0YWluIGF0IGxlYXN0IG9uZSBtb3JlIGJ5dGUuCisgKgorICogVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBFT0YgcmV0dXJuLiAgSWYgdGhlIGVuZCBvZiB0aGUgZmlsZSBoYXMgYmVlbgorICogcmVhY2hlZCwgdGhlIHJvdXRpbmUgaGFzIGEgY2hvaWNlIG9mIEVSUkVYSVQoKSBvciBpbnNlcnRpbmcgZmFrZSBkYXRhIGludG8KKyAqIHRoZSBidWZmZXIuICBJbiBtb3N0IGNhc2VzLCBnZW5lcmF0aW5nIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpbnNlcnRpbmcgYQorICogZmFrZSBFT0kgbWFya2VyIGlzIHRoZSBiZXN0IGNvdXJzZSBvZiBhY3Rpb24gLS0tIHRoaXMgd2lsbCBhbGxvdyB0aGUKKyAqIGRlY29tcHJlc3NvciB0byBvdXRwdXQgaG93ZXZlciBtdWNoIG9mIHRoZSBpbWFnZSBpcyB0aGVyZS4gIEhvd2V2ZXIsCisgKiB0aGUgcmVzdWx0aW5nIGVycm9yIG1lc3NhZ2UgaXMgbWlzbGVhZGluZyBpZiB0aGUgcmVhbCBwcm9ibGVtIGlzIGFuIGVtcHR5CisgKiBpbnB1dCBmaWxlLCBzbyB3ZSBoYW5kbGUgdGhhdCBjYXNlIHNwZWNpYWxseS4KKyAqCisgKiBJbiBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFibGUgdG8gc3VzcGVuZCBjb21wcmVzc2lvbiBkdWUgdG8gaW5wdXQKKyAqIG5vdCBiZWluZyBhdmFpbGFibGUgeWV0LCBhIEZBTFNFIHJldHVybiBpbmRpY2F0ZXMgdGhhdCBubyBtb3JlIGRhdGEgY2FuIGJlCisgKiBvYnRhaW5lZCByaWdodCBub3csIGJ1dCBtb3JlIG1heSBiZSBmb3J0aGNvbWluZyBsYXRlci4gIEluIHRoaXMgc2l0dWF0aW9uLAorICogdGhlIGRlY29tcHJlc3NvciB3aWxsIHJldHVybiB0byBpdHMgY2FsbGVyICh3aXRoIGFuIGluZGljYXRpb24gb2YgdGhlCisgKiBudW1iZXIgb2Ygc2NhbmxpbmVzIGl0IGhhcyByZWFkLCBpZiBhbnkpLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXN1bWUKKyAqIGRlY29tcHJlc3Npb24gYWZ0ZXIgaXQgaGFzIGxvYWRlZCBtb3JlIGRhdGEgaW50byB0aGUgaW5wdXQgYnVmZmVyLiAgTm90ZQorICogdGhhdCB0aGVyZSBhcmUgc3Vic3RhbnRpYWwgcmVzdHJpY3Rpb25zIG9uIHRoZSB1c2Ugb2Ygc3VzcGVuc2lvbiAtLS0gc2VlCisgKiB0aGUgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBXaGVuIHN1c3BlbmRpbmcsIHRoZSBkZWNvbXByZXNzb3Igd2lsbCBiYWNrIHVwIHRvIGEgY29udmVuaWVudCByZXN0YXJ0IHBvaW50CisgKiAodHlwaWNhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpLiBuZXh0X2lucHV0X2J5dGUgJiBieXRlc19pbl9idWZmZXIKKyAqIGluZGljYXRlIHdoZXJlIHRoZSByZXN0YXJ0IHBvaW50IHdpbGwgYmUgaWYgdGhlIGN1cnJlbnQgY2FsbCByZXR1cm5zIEZBTFNFLgorICogRGF0YSBiZXlvbmQgdGhpcyBwb2ludCBtdXN0IGJlIHJlc2Nhbm5lZCBhZnRlciByZXN1bXB0aW9uLCBzbyBtb3ZlIGl0IHRvCisgKiB0aGUgZnJvbnQgb2YgdGhlIGJ1ZmZlciByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIGl0LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZmlsbF9pbnB1dF9idWZmZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgIHNpemVfdCBuYnl0ZXM7CisKKyAgbmJ5dGVzID0gSkZSRUFEKHNyYy0+aW5maWxlLCBzcmMtPmJ1ZmZlciwgSU5QVVRfQlVGX1NJWkUpOworCisgIGlmIChuYnl0ZXMgPD0gMCkgeworICAgIGlmIChzcmMtPnN0YXJ0X29mX2ZpbGUpCS8qIFRyZWF0IGVtcHR5IGlucHV0IGZpbGUgYXMgZmF0YWwgZXJyb3IgKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU1QVFkpOworICAgIFdBUk5NUyhjaW5mbywgSldSTl9KUEVHX0VPRik7CisgICAgLyogSW5zZXJ0IGEgZmFrZSBFT0kgbWFya2VyICovCisgICAgc3JjLT5idWZmZXJbMF0gPSAoSk9DVEVUKSAweEZGOworICAgIHNyYy0+YnVmZmVyWzFdID0gKEpPQ1RFVCkgSlBFR19FT0k7CisgICAgbmJ5dGVzID0gMjsKKyAgfQorCisgIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IHNyYy0+YnVmZmVyOworICBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXIgPSBuYnl0ZXM7CisgIHNyYy0+c3RhcnRfb2ZfZmlsZSA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBTa2lwIGRhdGEgLS0tIHVzZWQgdG8gc2tpcCBvdmVyIGEgcG90ZW50aWFsbHkgbGFyZ2UgYW1vdW50IG9mCisgKiB1bmludGVyZXN0aW5nIGRhdGEgKHN1Y2ggYXMgYW4gQVBQbiBtYXJrZXIpLgorICoKKyAqIFdyaXRlcnMgb2Ygc3VzcGVuZGFibGUtaW5wdXQgYXBwbGljYXRpb25zIG11c3Qgbm90ZSB0aGF0IHNraXBfaW5wdXRfZGF0YQorICogaXMgbm90IGdyYW50ZWQgdGhlIHJpZ2h0IHRvIGdpdmUgYSBzdXNwZW5zaW9uIHJldHVybi4gIElmIHRoZSBza2lwIGV4dGVuZHMKKyAqIGJleW9uZCB0aGUgZGF0YSBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlciwgdGhlIGJ1ZmZlciBjYW4gYmUgbWFya2VkIGVtcHR5IHNvCisgKiB0aGF0IHRoZSBuZXh0IHJlYWQgd2lsbCBjYXVzZSBhIGZpbGxfaW5wdXRfYnVmZmVyIGNhbGwgdGhhdCBjYW4gc3VzcGVuZC4KKyAqIEFycmFuZ2luZyBmb3IgYWRkaXRpb25hbCBieXRlcyB0byBiZSBkaXNjYXJkZWQgYmVmb3JlIHJlbG9hZGluZyB0aGUgaW5wdXQKKyAqIGJ1ZmZlciBpcyB0aGUgYXBwbGljYXRpb24gd3JpdGVyJ3MgcHJvYmxlbS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3NraXBfaW5wdXRfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpCit7CisgIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisKKyAgLyogSnVzdCBhIGR1bWIgaW1wbGVtZW50YXRpb24gZm9yIG5vdy4gIENvdWxkIHVzZSBmc2VlaygpIGV4Y2VwdAorICAgKiBpdCBkb2Vzbid0IHdvcmsgb24gcGlwZXMuICBOb3QgY2xlYXIgdGhhdCBiZWluZyBzbWFydCBpcyB3b3J0aAorICAgKiBhbnkgdHJvdWJsZSBhbnl3YXkgLS0tIGxhcmdlIHNraXBzIGFyZSBpbmZyZXF1ZW50LgorICAgKi8KKyAgaWYgKG51bV9ieXRlcyA+IDApIHsKKyAgICB3aGlsZSAobnVtX2J5dGVzID4gKGxvbmcpIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlcikgeworICAgICAgbnVtX2J5dGVzIC09IChsb25nKSBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXI7CisgICAgICAodm9pZCkgZmlsbF9pbnB1dF9idWZmZXIoY2luZm8pOworICAgICAgLyogbm90ZSB3ZSBhc3N1bWUgdGhhdCBmaWxsX2lucHV0X2J1ZmZlciB3aWxsIG5ldmVyIHJldHVybiBGQUxTRSwKKyAgICAgICAqIHNvIHN1c3BlbnNpb24gbmVlZCBub3QgYmUgaGFuZGxlZC4KKyAgICAgICAqLworICAgIH0KKyAgICBzcmMtPnB1Yi5uZXh0X2lucHV0X2J5dGUgKz0gKHNpemVfdCkgbnVtX2J5dGVzOworICAgIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciAtPSAoc2l6ZV90KSBudW1fYnl0ZXM7CisgIH0KK30KKworCisvKgorICogQW4gYWRkaXRpb25hbCBtZXRob2QgdGhhdCBjYW4gYmUgcHJvdmlkZWQgYnkgZGF0YSBzb3VyY2UgbW9kdWxlcyBpcyB0aGUKKyAqIHJlc3luY190b19yZXN0YXJ0IG1ldGhvZCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gdGhlIHByZXNlbmNlIG9mIFJTVCBtYXJrZXJzLgorICogRm9yIHRoZSBtb21lbnQsIHRoaXMgc291cmNlIG1vZHVsZSBqdXN0IHVzZXMgdGhlIGRlZmF1bHQgcmVzeW5jIG1ldGhvZAorICogcHJvdmlkZWQgYnkgdGhlIEpQRUcgbGlicmFyeS4gIFRoYXQgbWV0aG9kIGFzc3VtZXMgdGhhdCBubyBiYWNrdHJhY2tpbmcKKyAqIGlzIHBvc3NpYmxlLgorICovCisKKworLyoKKyAqIFRlcm1pbmF0ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCisgKiBhZnRlciBhbGwgZGF0YSBoYXMgYmVlbiByZWFkLiAgT2Z0ZW4gYSBuby1vcC4KKyAqCisgKiBOQjogKm5vdCogY2FsbGVkIGJ5IGpwZWdfYWJvcnQgb3IganBlZ19kZXN0cm95OyBzdXJyb3VuZGluZworICogYXBwbGljYXRpb24gbXVzdCBkZWFsIHdpdGggYW55IGNsZWFudXAgdGhhdCBzaG91bGQgaGFwcGVuIGV2ZW4KKyAqIGZvciBlcnJvciBleGl0LgorICovCisKK01FVEhPRERFRih2b2lkKQordGVybV9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgbmVjZXNzYXJ5IGhlcmUgKi8KK30KKworCisvKgorICogUHJlcGFyZSBmb3IgaW5wdXQgZnJvbSBhIHN0ZGlvIHN0cmVhbS4KKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGFscmVhZHkgb3BlbmVkIHRoZSBzdHJlYW0sIGFuZCBpcyByZXNwb25zaWJsZQorICogZm9yIGNsb3NpbmcgaXQgYWZ0ZXIgZmluaXNoaW5nIGRlY29tcHJlc3Npb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N0ZGlvX3NyYyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKK3sKKyAgbXlfc3JjX3B0ciBzcmM7CisKKyAgLyogVGhlIHNvdXJjZSBvYmplY3QgYW5kIGlucHV0IGJ1ZmZlciBhcmUgbWFkZSBwZXJtYW5lbnQgc28gdGhhdCBhIHNlcmllcworICAgKiBvZiBKUEVHIGltYWdlcyBjYW4gYmUgcmVhZCBmcm9tIHRoZSBzYW1lIGZpbGUgYnkgY2FsbGluZyBqcGVnX3N0ZGlvX3NyYworICAgKiBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgb25lLiAgKElmIHdlIGRpc2NhcmRlZCB0aGUgYnVmZmVyIGF0IHRoZSBlbmQgb2YKKyAgICogb25lIGltYWdlLCB3ZSdkIGxpa2VseSBsb3NlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBvbmUuKQorICAgKiBUaGlzIG1ha2VzIGl0IHVuc2FmZSB0byB1c2UgdGhpcyBtYW5hZ2VyIGFuZCBhIGRpZmZlcmVudCBzb3VyY2UKKyAgICogbWFuYWdlciBzZXJpYWxseSB3aXRoIHRoZSBzYW1lIEpQRUcgb2JqZWN0LiAgQ2F2ZWF0IHByb2dyYW1tZXIuCisgICAqLworICBpZiAoY2luZm8tPnNyYyA9PSBOVUxMKSB7CS8qIGZpcnN0IHRpbWUgZm9yIHRoaXMgSlBFRyBvYmplY3Q/ICovCisgICAgY2luZm8tPnNyYyA9IChzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQkgIFNJWkVPRihteV9zb3VyY2VfbWdyKSk7CisgICAgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgICAgc3JjLT5idWZmZXIgPSAoSk9DVEVUICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQkgIElOUFVUX0JVRl9TSVpFICogU0laRU9GKEpPQ1RFVCkpOworICB9CisKKyAgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgIHNyYy0+cHViLmluaXRfc291cmNlID0gaW5pdF9zb3VyY2U7CisgIHNyYy0+cHViLmZpbGxfaW5wdXRfYnVmZmVyID0gZmlsbF9pbnB1dF9idWZmZXI7CisgIHNyYy0+cHViLnNraXBfaW5wdXRfZGF0YSA9IHNraXBfaW5wdXRfZGF0YTsKKyAgc3JjLT5wdWIucmVzeW5jX3RvX3Jlc3RhcnQgPSBqcGVnX3Jlc3luY190b19yZXN0YXJ0OyAvKiB1c2UgZGVmYXVsdCBtZXRob2QgKi8KKyAgc3JjLT5wdWIudGVybV9zb3VyY2UgPSB0ZXJtX3NvdXJjZTsKKyAgc3JjLT5pbmZpbGUgPSBpbmZpbGU7CisgIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciA9IDA7IC8qIGZvcmNlcyBmaWxsX2lucHV0X2J1ZmZlciBvbiBmaXJzdCByZWFkICovCisgIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IE5VTEw7IC8qIHVudGlsIGJ1ZmZlciBsb2FkZWQgKi8KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pkY29lZmN0LmMgYi9jb21tb24vanBlZy9qZGNvZWZjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MzhkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZGNvZWZjdC5jCkBAIC0wLDAgKzEsNzM2IEBACisvKgorICogamRjb2VmY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlciBmb3IgZGVjb21wcmVzc2lvbi4KKyAqIFRoaXMgY29udHJvbGxlciBpcyB0aGUgdG9wIGxldmVsIG9mIHRoZSBKUEVHIGRlY29tcHJlc3NvciBwcm9wZXIuCisgKiBUaGUgY29lZmZpY2llbnQgYnVmZmVyIGxpZXMgYmV0d2VlbiBlbnRyb3B5IGRlY29kaW5nIGFuZCBpbnZlcnNlLURDVCBzdGVwcy4KKyAqCisgKiBJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB0aGlzIGNvbnRyb2xsZXIgaXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuCisgKiBpbnB1dC1vcmllbnRlZCBwcm9jZXNzaW5nIGFuZCBvdXRwdXQtb3JpZW50ZWQgcHJvY2Vzc2luZy4KKyAqIEFsc28sIHRoZSBpbnB1dCBzaWRlIChvbmx5KSBpcyB1c2VkIHdoZW4gcmVhZGluZyBhIGZpbGUgZm9yIHRyYW5zY29kaW5nLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworLyogQmxvY2sgc21vb3RoaW5nIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRywgc286ICovCisjaWZuZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisjdW5kZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorI2VuZGlmCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogVGhlc2UgdmFyaWFibGVzIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhlIGlucHV0IHNpZGUuICovCisgIC8qIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyBpcyBhbHNvIHVzZWQgZm9yIHRoaXMuICovCisgIEpESU1FTlNJT04gTUNVX2N0cjsJCS8qIGNvdW50cyBNQ1VzIHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdyAqLworICBpbnQgTUNVX3ZlcnRfb2Zmc2V0OwkJLyogY291bnRzIE1DVSByb3dzIHdpdGhpbiBpTUNVIHJvdyAqLworICBpbnQgTUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwkvKiBudW1iZXIgb2Ygc3VjaCByb3dzIG5lZWRlZCAqLworCisgIC8qIFRoZSBvdXRwdXQgc2lkZSdzIGxvY2F0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cuICovCisKKyAgLyogSW4gc2luZ2xlLXBhc3MgbW9kZXMsIGl0J3Mgc3VmZmljaWVudCB0byBidWZmZXIganVzdCBvbmUgTUNVLgorICAgKiBXZSBhbGxvY2F0ZSBhIHdvcmtzcGFjZSBvZiBEX01BWF9CTE9DS1NfSU5fTUNVIGNvZWZmaWNpZW50IGJsb2NrcywKKyAgICogYW5kIGxldCB0aGUgZW50cm9weSBkZWNvZGVyIHdyaXRlIGludG8gdGhhdCB3b3Jrc3BhY2UgZWFjaCB0aW1lLgorICAgKiAoT24gODB4ODYsIHRoZSB3b3Jrc3BhY2UgaXMgRkFSIGV2ZW4gdGhvdWdoIGl0J3Mgbm90IHJlYWxseSB2ZXJ5IGJpZzsKKyAgICogdGhpcyBpcyB0byBrZWVwIHRoZSBtb2R1bGUgaW50ZXJmYWNlcyB1bmNoYW5nZWQgd2hlbiBhIGxhcmdlIGNvZWZmaWNpZW50CisgICAqIGJ1ZmZlciBpcyBuZWNlc3NhcnkuKQorICAgKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB0aGlzIGFycmF5IHBvaW50cyB0byB0aGUgY3VycmVudCBNQ1UncyBibG9ja3MKKyAgICogd2l0aGluIHRoZSB2aXJ0dWFsIGFycmF5czsgaXQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBpbnB1dCBzaWRlLgorICAgKi8KKyAgSkJMT0NLUk9XIE1DVV9idWZmZXJbRF9NQVhfQkxPQ0tTX0lOX01DVV07CisKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgLyogSW4gbXVsdGktcGFzcyBtb2Rlcywgd2UgbmVlZCBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LiAqLworICBqdmlydF9iYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKKyNlbmRpZgorCisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorICAvKiBXaGVuIGRvaW5nIGJsb2NrIHNtb290aGluZywgd2UgbGF0Y2ggY29lZmZpY2llbnQgQWwgdmFsdWVzIGhlcmUgKi8KKyAgaW50ICogY29lZl9iaXRzX2xhdGNoOworI2RlZmluZSBTQVZFRF9DT0VGUyAgNgkJLyogd2Ugc2F2ZSBjb2VmX2JpdHNbMC4uNV0gKi8KKyNlbmRpZgorfSBteV9jb2VmX2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfY29lZl9jb250cm9sbGVyICogbXlfY29lZl9wdHI7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoaW50KSBkZWNvbXByZXNzX29uZXBhc3MKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorTUVUSE9EREVGKGludCkgZGVjb21wcmVzc19kYXRhCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKKyNlbmRpZgorI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKK0xPQ0FMKGJvb2xlYW4pIHNtb290aGluZ19vayBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK01FVEhPRERFRihpbnQpIGRlY29tcHJlc3Nfc21vb3RoX2RhdGEKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOworI2VuZGlmCisKKworTE9DQUwodm9pZCkKK3N0YXJ0X2lNQ1Vfcm93IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKGlucHV0IHNpZGUpICovCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIC8qIEluIGFuIGludGVybGVhdmVkIHNjYW4sIGFuIE1DVSByb3cgaXMgdGhlIHNhbWUgYXMgYW4gaU1DVSByb3cuCisgICAqIEluIGEgbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYW4gaU1DVSByb3cgaGFzIHZfc2FtcF9mYWN0b3IgTUNVIHJvd3MuCisgICAqIEJ1dCBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgcHJvY2VzcyBvbmx5IHdoYXQncyBsZWZ0LgorICAgKi8KKyAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgeworICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IDE7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8IChjaW5mby0+dG90YWxfaU1DVV9yb3dzLTEpKQorICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPnZfc2FtcF9mYWN0b3I7CisgICAgZWxzZQorICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPmxhc3Rfcm93X2hlaWdodDsKKyAgfQorCisgIGNvZWYtPk1DVV9jdHIgPSAwOworICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSAwOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhbiBpbnB1dCBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9pbnB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgPSAwOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGFuIG91dHB1dCBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9vdXRwdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIC8qIElmIG11bHRpcGFzcywgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdG8gdXNlIGJsb2NrIHNtb290aGluZyBvbiB0aGlzIHBhc3MgKi8KKyAgaWYgKGNvZWYtPnB1Yi5jb2VmX2FycmF5cyAhPSBOVUxMKSB7CisgICAgaWYgKGNpbmZvLT5kb19ibG9ja19zbW9vdGhpbmcgJiYgc21vb3RoaW5nX29rKGNpbmZvKSkKKyAgICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX3Ntb290aF9kYXRhOworICAgIGVsc2UKKyAgICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX2RhdGE7CisgIH0KKyNlbmRpZgorICBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ID0gMDsKK30KKworCisvKgorICogRGVjb21wcmVzcyBhbmQgcmV0dXJuIHNvbWUgZGF0YSBpbiB0aGUgc2luZ2xlLXBhc3MgY2FzZS4KKyAqIEFsd2F5cyBhdHRlbXB0cyB0byBlbWl0IG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KS4KKyAqIElucHV0IGFuZCBvdXRwdXQgbXVzdCBydW4gaW4gbG9ja3N0ZXAgc2luY2Ugd2UgaGF2ZSBvbmx5IGEgb25lLU1DVSBidWZmZXIuCisgKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KKyAqCisgKiBOQjogb3V0cHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZSwKKyAqIHdoaWNoIHdlIGluZGV4IGFjY29yZGluZyB0byB0aGUgY29tcG9uZW50J3MgU09GIHBvc2l0aW9uLgorICovCisKK01FVEhPRERFRihpbnQpCitkZWNvbXByZXNzX29uZXBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KKyAgSkRJTUVOU0lPTiBsYXN0X01DVV9jb2wgPSBjaW5mby0+TUNVc19wZXJfcm93IC0gMTsKKyAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7CisgIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQsIHVzZWZ1bF93aWR0aDsKKyAgSlNBTVBBUlJBWSBvdXRwdXRfcHRyOworICBKRElNRU5TSU9OIHN0YXJ0X2NvbCwgb3V0cHV0X2NvbDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKKworICAvKiBMb29wIHRvIHByb2Nlc3MgYXMgbXVjaCBhcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KKyAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworICAgICAgIHlvZmZzZXQrKykgeworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8PSBsYXN0X01DVV9jb2w7CisJIE1DVV9jb2xfbnVtKyspIHsKKyAgICAgIC8qIFRyeSB0byBmZXRjaCBhbiBNQ1UuICBFbnRyb3B5IGRlY29kZXIgZXhwZWN0cyBidWZmZXIgdG8gYmUgemVyb2VkLiAqLworICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyWzBdLAorCQkoc2l6ZV90KSAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSkpOworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgeworCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KKwljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCWNvZWYtPk1DVV9jdHIgPSBNQ1VfY29sX251bTsKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICB9CisgICAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBzaG91bGQgZ28gaW4gb3V0cHV0X2J1ZiBhbmQgZG8gdGhlIElEQ1QgdGhpbmcuCisgICAgICAgKiBXZSBza2lwIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlcyAoYnV0IGJsa24gZ2V0cworICAgICAgICogaW5jcmVtZW50ZWQgcGFzdCB0aGVtISkuICBOb3RlIHRoZSBpbm5lciBsb29wIHJlbGllcyBvbiBoYXZpbmcKKyAgICAgICAqIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcyBzZXF1ZW50aWFsbHkuCisgICAgICAgKi8KKyAgICAgIGJsa24gPSAwOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisJY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKwkvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKwlpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisJICBibGtuICs9IGNvbXBwdHItPk1DVV9ibG9ja3M7CisJICBjb250aW51ZTsKKwl9CisJaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKKwl1c2VmdWxfd2lkdGggPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gY29tcHB0ci0+TUNVX3dpZHRoCisJCQkJCQkgICAgOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwlvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdICsKKwkgIHlvZmZzZXQgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOworCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKwkgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93IHx8CisJICAgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKKwkgICAgb3V0cHV0X2NvbCA9IHN0YXJ0X2NvbDsKKwkgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCB1c2VmdWxfd2lkdGg7IHhpbmRleCsrKSB7CisJICAgICAgKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLAorCQkJICAgICAgKEpDT0VGUFRSKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24reGluZGV4XSwKKwkJCSAgICAgIG91dHB1dF9wdHIsIG91dHB1dF9jb2wpOworCSAgICAgIG91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworCSAgICB9CisJICB9CisJICBibGtuICs9IGNvbXBwdHItPk1DVV93aWR0aDsKKwkgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLworICAgIGNvZWYtPk1DVV9jdHIgPSAwOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCisgIGNpbmZvLT5vdXRwdXRfaU1DVV9yb3crKzsKKyAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7CisgICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKworLyoKKyAqIER1bW15IGNvbnN1bWUtaW5wdXQgcm91dGluZSBmb3Igc2luZ2xlLXBhc3Mgb3BlcmF0aW9uLgorICovCisKK01FVEhPRERFRihpbnQpCitkdW1teV9jb25zdW1lX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsJLyogQWx3YXlzIGluZGljYXRlIG5vdGhpbmcgd2FzIGRvbmUgKi8KK30KKworCisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisKKy8qCisgKiBDb25zdW1lIGlucHV0IGRhdGEgYW5kIHN0b3JlIGl0IGluIHRoZSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlci4KKyAqIFdlIHJlYWQgYXMgbXVjaCBhcyBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykgcGVyIGNhbGwsCisgKiBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KKyAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1JPV19DT01QTEVURUQsIEpQRUdfU0NBTl9DT01QTEVURUQsIG9yIEpQRUdfU1VTUEVOREVELgorICovCisKK01FVEhPRERFRihpbnQpCitjb25zdW1lX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQ7CisgIEpESU1FTlNJT04gc3RhcnRfY29sOworICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOworICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAvKiBOb3RlOiBlbnRyb3B5IGRlY29kZXIgZXhwZWN0cyBidWZmZXIgdG8gYmUgemVyb2VkLAorICAgICAqIGJ1dCB0aGlzIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGUgbWVtb3J5IG1hbmFnZXIKKyAgICAgKiBiZWNhdXNlIHdlIHJlcXVlc3RlZCBhIHByZS16ZXJvZWQgYXJyYXkuCisgICAgICovCisgIH0KKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+TUNVX2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKwkgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XSArIHN0YXJ0X2NvbDsKKwkgIGZvciAoeGluZGV4ID0gMDsgeGluZGV4IDwgY29tcHB0ci0+TUNVX3dpZHRoOyB4aW5kZXgrKykgeworCSAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisJICB9CisJfQorICAgICAgfQorICAgICAgLyogVHJ5IHRvIGZldGNoIHRoZSBNQ1UuICovCisgICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7CisJLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLworCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7CisJY29lZi0+TUNVX2N0ciA9IE1DVV9jb2xfbnVtOworCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLworICAgIGNvZWYtPk1DVV9jdHIgPSAwOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCisgIGlmICgrKyhjaW5mby0+aW5wdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgeworICAgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKKyAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgc2NhbiAqLworICAoKmNpbmZvLT5pbnB1dGN0bC0+ZmluaXNoX2lucHV0X3Bhc3MpIChjaW5mbyk7CisgIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOworfQorCisKKy8qCisgKiBEZWNvbXByZXNzIGFuZCByZXR1cm4gc29tZSBkYXRhIGluIHRoZSBtdWx0aS1wYXNzIGNhc2UuCisgKiBBbHdheXMgYXR0ZW1wdHMgdG8gZW1pdCBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykuCisgKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KKyAqCisgKiBOQjogb3V0cHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZS4KKyAqLworCitNRVRIT0RERUYoaW50KQorZGVjb21wcmVzc19kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKKyAgSkRJTUVOU0lPTiBibG9ja19udW07CisgIGludCBjaSwgYmxvY2tfcm93LCBibG9ja19yb3dzOworICBKQkxPQ0tBUlJBWSBidWZmZXI7CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyOworICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKKworICAvKiBGb3JjZSBzb21lIGlucHV0IHRvIGJlIGRvbmUgaWYgd2UgYXJlIGdldHRpbmcgYWhlYWQgb2YgdGhlIGlucHV0LiAqLworICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDwgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciB8fAorCSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKKwkgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8PSBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSkgeworICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICB9CisKKyAgLyogT0ssIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKQorICAgICAgY29udGludWU7CisgICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KKyAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorICAgICAgIGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCisgICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93KQorICAgICAgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgZWxzZSB7CisgICAgICAvKiBOQjogY2FuJ3QgdXNlIGxhc3Rfcm93X2hlaWdodCBoZXJlOyBpdCBpcyBpbnB1dC1zaWRlLWRlcGVuZGVudCEgKi8KKyAgICAgIGJsb2NrX3Jvd3MgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgICAgaWYgKGJsb2NrX3Jvd3MgPT0gMCkgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgfQorICAgIGludmVyc2VfRENUID0gY2luZm8tPmlkY3QtPmludmVyc2VfRENUW2NpXTsKKyAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZltjaV07CisgICAgLyogTG9vcCBvdmVyIGFsbCBEQ1QgYmxvY2tzIHRvIGJlIHByb2Nlc3NlZC4gKi8KKyAgICBmb3IgKGJsb2NrX3JvdyA9IDA7IGJsb2NrX3JvdyA8IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdysrKSB7CisgICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2Jsb2NrX3Jvd107CisgICAgICBvdXRwdXRfY29sID0gMDsKKyAgICAgIGZvciAoYmxvY2tfbnVtID0gMDsgYmxvY2tfbnVtIDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOyBibG9ja19udW0rKykgeworCSgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwgKEpDT0VGUFRSKSBidWZmZXJfcHRyLAorCQkJb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7CisJYnVmZmVyX3B0cisrOworCW91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgICAgfQorICAgICAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisgICAgfQorICB9CisKKyAgaWYgKCsrKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykKKyAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOworICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKK30KKworI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLworCisKKyNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECisKKy8qCisgKiBUaGlzIGNvZGUgYXBwbGllcyBpbnRlcmJsb2NrIHNtb290aGluZyBhcyBkZXNjcmliZWQgYnkgc2VjdGlvbiBLLjgKKyAqIG9mIHRoZSBKUEVHIHN0YW5kYXJkOiB0aGUgZmlyc3QgNSBBQyBjb2VmZmljaWVudHMgYXJlIGVzdGltYXRlZCBmcm9tCisgKiB0aGUgREMgdmFsdWVzIG9mIGEgRENUIGJsb2NrIGFuZCBpdHMgOCBuZWlnaGJvcmluZyBibG9ja3MuCisgKiBXZSBhcHBseSBzbW9vdGhpbmcgb25seSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRyBkZWNvZGluZywgYW5kIG9ubHkgaWYKKyAqIHRoZSBjb2VmZmljaWVudHMgaXQgY2FuIGVzdGltYXRlIGFyZSBub3QgeWV0IGtub3duIHRvIGZ1bGwgcHJlY2lzaW9uLgorICovCisKKy8qIE5hdHVyYWwtb3JkZXIgYXJyYXkgcG9zaXRpb25zIG9mIHRoZSBmaXJzdCA1IHppZ3phZy1vcmRlciBjb2VmZmljaWVudHMgKi8KKyNkZWZpbmUgUTAxX1BPUyAgMQorI2RlZmluZSBRMTBfUE9TICA4CisjZGVmaW5lIFEyMF9QT1MgIDE2CisjZGVmaW5lIFExMV9QT1MgIDkKKyNkZWZpbmUgUTAyX1BPUyAgMgorCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYmxvY2sgc21vb3RoaW5nIGlzIGFwcGxpY2FibGUgYW5kIHNhZmUuCisgKiBXZSBhbHNvIGxhdGNoIHRoZSBjdXJyZW50IHN0YXRlcyBvZiB0aGUgY29lZl9iaXRzW10gZW50cmllcyBmb3IgdGhlCisgKiBBQyBjb2VmZmljaWVudHM7IG90aGVyd2lzZSwgaWYgdGhlIGlucHV0IHNpZGUgb2YgdGhlIGRlY29tcHJlc3NvcgorICogYWR2YW5jZXMgaW50byBhIG5ldyBzY2FuLCB3ZSBtaWdodCB0aGluayB0aGUgY29lZmZpY2llbnRzIGFyZSBrbm93bgorICogbW9yZSBhY2N1cmF0ZWx5IHRoYW4gdGhleSByZWFsbHkgYXJlLgorICovCisKK0xPQ0FMKGJvb2xlYW4pCitzbW9vdGhpbmdfb2sgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBib29sZWFuIHNtb290aGluZ191c2VmdWwgPSBGQUxTRTsKKyAgaW50IGNpLCBjb2VmaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlFVQU5UX1RCTCAqIHF0YWJsZTsKKyAgaW50ICogY29lZl9iaXRzOworICBpbnQgKiBjb2VmX2JpdHNfbGF0Y2g7CisKKyAgaWYgKCEgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgfHwgY2luZm8tPmNvZWZfYml0cyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBBbGxvY2F0ZSBsYXRjaCBhcmVhIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KKyAgaWYgKGNvZWYtPmNvZWZfYml0c19sYXRjaCA9PSBOVUxMKQorICAgIGNvZWYtPmNvZWZfYml0c19sYXRjaCA9IChpbnQgKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBjaW5mby0+bnVtX2NvbXBvbmVudHMgKgorCQkJCSAgKFNBVkVEX0NPRUZTICogU0laRU9GKGludCkpKTsKKyAgY29lZl9iaXRzX2xhdGNoID0gY29lZi0+Y29lZl9iaXRzX2xhdGNoOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQWxsIGNvbXBvbmVudHMnIHF1YW50aXphdGlvbiB2YWx1ZXMgbXVzdCBhbHJlYWR5IGJlIGxhdGNoZWQuICovCisgICAgaWYgKChxdGFibGUgPSBjb21wcHRyLT5xdWFudF90YWJsZSkgPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvKiBWZXJpZnkgREMgJiBmaXJzdCA1IEFDIHF1YW50aXplcnMgYXJlIG5vbnplcm8gdG8gYXZvaWQgemVyby1kaXZpZGUuICovCisgICAgaWYgKHF0YWJsZS0+cXVhbnR2YWxbMF0gPT0gMCB8fAorCXF0YWJsZS0+cXVhbnR2YWxbUTAxX1BPU10gPT0gMCB8fAorCXF0YWJsZS0+cXVhbnR2YWxbUTEwX1BPU10gPT0gMCB8fAorCXF0YWJsZS0+cXVhbnR2YWxbUTIwX1BPU10gPT0gMCB8fAorCXF0YWJsZS0+cXVhbnR2YWxbUTExX1BPU10gPT0gMCB8fAorCXF0YWJsZS0+cXVhbnR2YWxbUTAyX1BPU10gPT0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvKiBEQyB2YWx1ZXMgbXVzdCBiZSBhdCBsZWFzdCBwYXJ0bHkga25vd24gZm9yIGFsbCBjb21wb25lbnRzLiAqLworICAgIGNvZWZfYml0cyA9IGNpbmZvLT5jb2VmX2JpdHNbY2ldOworICAgIGlmIChjb2VmX2JpdHNbMF0gPCAwKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIC8qIEJsb2NrIHNtb290aGluZyBpcyBoZWxwZnVsIGlmIHNvbWUgQUMgY29lZmZpY2llbnRzIHJlbWFpbiBpbmFjY3VyYXRlLiAqLworICAgIGZvciAoY29lZmkgPSAxOyBjb2VmaSA8PSA1OyBjb2VmaSsrKSB7CisgICAgICBjb2VmX2JpdHNfbGF0Y2hbY29lZmldID0gY29lZl9iaXRzW2NvZWZpXTsKKyAgICAgIGlmIChjb2VmX2JpdHNbY29lZmldICE9IDApCisJc21vb3RoaW5nX3VzZWZ1bCA9IFRSVUU7CisgICAgfQorICAgIGNvZWZfYml0c19sYXRjaCArPSBTQVZFRF9DT0VGUzsKKyAgfQorCisgIHJldHVybiBzbW9vdGhpbmdfdXNlZnVsOworfQorCisKKy8qCisgKiBWYXJpYW50IG9mIGRlY29tcHJlc3NfZGF0YSBmb3IgdXNlIHdoZW4gZG9pbmcgYmxvY2sgc21vb3RoaW5nLgorICovCisKK01FVEhPRERFRihpbnQpCitkZWNvbXByZXNzX3Ntb290aF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKKyAgSkRJTUVOU0lPTiBibG9ja19udW0sIGxhc3RfYmxvY2tfY29sdW1uOworICBpbnQgY2ksIGJsb2NrX3JvdywgYmxvY2tfcm93cywgYWNjZXNzX3Jvd3M7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKKyAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHIsIHByZXZfYmxvY2tfcm93LCBuZXh0X2Jsb2NrX3JvdzsKKyAgSlNBTVBBUlJBWSBvdXRwdXRfcHRyOworICBKRElNRU5TSU9OIG91dHB1dF9jb2w7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGludmVyc2VfRENUX21ldGhvZF9wdHIgaW52ZXJzZV9EQ1Q7CisgIGJvb2xlYW4gZmlyc3Rfcm93LCBsYXN0X3JvdzsKKyAgSkJMT0NLIHdvcmtzcGFjZTsKKyAgaW50ICpjb2VmX2JpdHM7CisgIEpRVUFOVF9UQkwgKnF1YW50dGJsOworICBJTlQzMiBRMDAsUTAxLFEwMixRMTAsUTExLFEyMCwgbnVtOworICBpbnQgREMxLERDMixEQzMsREM0LERDNSxEQzYsREM3LERDOCxEQzk7CisgIGludCBBbCwgcHJlZDsKKworICAvKiBGb3JjZSBzb21lIGlucHV0IHRvIGJlIGRvbmUgaWYgd2UgYXJlIGdldHRpbmcgYWhlYWQgb2YgdGhlIGlucHV0LiAqLworICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDw9IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKKwkgISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7CisgICAgaWYgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA9PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyKSB7CisgICAgICAvKiBJZiBpbnB1dCBpcyB3b3JraW5nIG9uIGN1cnJlbnQgc2Nhbiwgd2Ugb3JkaW5hcmlseSB3YW50IGl0IHRvCisgICAgICAgKiBoYXZlIGNvbXBsZXRlZCB0aGUgY3VycmVudCByb3cuICBCdXQgaWYgaW5wdXQgc2NhbiBpcyBEQywKKyAgICAgICAqIHdlIHdhbnQgaXQgdG8ga2VlcCBvbmUgcm93IGFoZWFkIHNvIHRoYXQgbmV4dCBibG9jayByb3cncyBEQworICAgICAgICogdmFsdWVzIGFyZSB1cCB0byBkYXRlLgorICAgICAgICovCisgICAgICBKRElNRU5TSU9OIGRlbHRhID0gKGNpbmZvLT5TcyA9PSAwKSA/IDEgOiAwOworICAgICAgaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA+IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3crZGVsdGEpCisJYnJlYWs7CisgICAgfQorICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICB9CisKKyAgLyogT0ssIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKQorICAgICAgY29udGludWU7CisgICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCisgICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93KSB7CisgICAgICBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICAgIGFjY2Vzc19yb3dzID0gYmxvY2tfcm93cyAqIDI7IC8qIHRoaXMgYW5kIG5leHQgaU1DVSByb3cgKi8KKyAgICAgIGxhc3Rfcm93ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE5COiBjYW4ndCB1c2UgbGFzdF9yb3dfaGVpZ2h0IGhlcmU7IGl0IGlzIGlucHV0LXNpZGUtZGVwZW5kZW50ISAqLworICAgICAgYmxvY2tfcm93cyA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgICBpZiAoYmxvY2tfcm93cyA9PSAwKSBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICAgIGFjY2Vzc19yb3dzID0gYmxvY2tfcm93czsgLyogdGhpcyBpTUNVIHJvdyBvbmx5ICovCisgICAgICBsYXN0X3JvdyA9IFRSVUU7CisgICAgfQorICAgIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlciBmb3IgdGhpcyBjb21wb25lbnQuICovCisgICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPiAwKSB7CisgICAgICBhY2Nlc3Nfcm93cyArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyAvKiBwcmlvciBpTUNVIHJvdyB0b28gKi8KKyAgICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorCSAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyAtIDEpICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzLCBGQUxTRSk7CisgICAgICBidWZmZXIgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsJLyogcG9pbnQgdG8gY3VycmVudCBpTUNVIHJvdyAqLworICAgICAgZmlyc3Rfcm93ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorCSAoSkRJTUVOU0lPTikgMCwgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzLCBGQUxTRSk7CisgICAgICBmaXJzdF9yb3cgPSBUUlVFOworICAgIH0KKyAgICAvKiBGZXRjaCBjb21wb25lbnQtZGVwZW5kZW50IGluZm8gKi8KKyAgICBjb2VmX2JpdHMgPSBjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggKyAoY2kgKiBTQVZFRF9DT0VGUyk7CisgICAgcXVhbnR0YmwgPSBjb21wcHRyLT5xdWFudF90YWJsZTsKKyAgICBRMDAgPSBxdWFudHRibC0+cXVhbnR2YWxbMF07CisgICAgUTAxID0gcXVhbnR0YmwtPnF1YW50dmFsW1EwMV9QT1NdOworICAgIFExMCA9IHF1YW50dGJsLT5xdWFudHZhbFtRMTBfUE9TXTsKKyAgICBRMjAgPSBxdWFudHRibC0+cXVhbnR2YWxbUTIwX1BPU107CisgICAgUTExID0gcXVhbnR0YmwtPnF1YW50dmFsW1ExMV9QT1NdOworICAgIFEwMiA9IHF1YW50dGJsLT5xdWFudHZhbFtRMDJfUE9TXTsKKyAgICBpbnZlcnNlX0RDVCA9IGNpbmZvLT5pZGN0LT5pbnZlcnNlX0RDVFtjaV07CisgICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbY2ldOworICAgIC8qIExvb3Agb3ZlciBhbGwgRENUIGJsb2NrcyB0byBiZSBwcm9jZXNzZWQuICovCisgICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgeworICAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltibG9ja19yb3ddOworICAgICAgaWYgKGZpcnN0X3JvdyAmJiBibG9ja19yb3cgPT0gMCkKKwlwcmV2X2Jsb2NrX3JvdyA9IGJ1ZmZlcl9wdHI7CisgICAgICBlbHNlCisJcHJldl9ibG9ja19yb3cgPSBidWZmZXJbYmxvY2tfcm93LTFdOworICAgICAgaWYgKGxhc3Rfcm93ICYmIGJsb2NrX3JvdyA9PSBibG9ja19yb3dzLTEpCisJbmV4dF9ibG9ja19yb3cgPSBidWZmZXJfcHRyOworICAgICAgZWxzZQorCW5leHRfYmxvY2tfcm93ID0gYnVmZmVyW2Jsb2NrX3JvdysxXTsKKyAgICAgIC8qIFdlIGZldGNoIHRoZSBzdXJyb3VuZGluZyBEQyB2YWx1ZXMgdXNpbmcgYSBzbGlkaW5nLXJlZ2lzdGVyIGFwcHJvYWNoLgorICAgICAgICogSW5pdGlhbGl6ZSBhbGwgbmluZSBoZXJlIHNvIGFzIHRvIGRvIHRoZSByaWdodCB0aGluZyBvbiBuYXJyb3cgcGljcy4KKyAgICAgICAqLworICAgICAgREMxID0gREMyID0gREMzID0gKGludCkgcHJldl9ibG9ja19yb3dbMF1bMF07CisgICAgICBEQzQgPSBEQzUgPSBEQzYgPSAoaW50KSBidWZmZXJfcHRyWzBdWzBdOworICAgICAgREM3ID0gREM4ID0gREM5ID0gKGludCkgbmV4dF9ibG9ja19yb3dbMF1bMF07CisgICAgICBvdXRwdXRfY29sID0gMDsKKyAgICAgIGxhc3RfYmxvY2tfY29sdW1uID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzIC0gMTsKKyAgICAgIGZvciAoYmxvY2tfbnVtID0gMDsgYmxvY2tfbnVtIDw9IGxhc3RfYmxvY2tfY29sdW1uOyBibG9ja19udW0rKykgeworCS8qIEZldGNoIGN1cnJlbnQgRENUIGJsb2NrIGludG8gd29ya3NwYWNlIHNvIHdlIGNhbiBtb2RpZnkgaXQuICovCisJamNvcHlfYmxvY2tfcm93KGJ1ZmZlcl9wdHIsIChKQkxPQ0tST1cpIHdvcmtzcGFjZSwgKEpESU1FTlNJT04pIDEpOworCS8qIFVwZGF0ZSBEQyB2YWx1ZXMgKi8KKwlpZiAoYmxvY2tfbnVtIDwgbGFzdF9ibG9ja19jb2x1bW4pIHsKKwkgIERDMyA9IChpbnQpIHByZXZfYmxvY2tfcm93WzFdWzBdOworCSAgREM2ID0gKGludCkgYnVmZmVyX3B0clsxXVswXTsKKwkgIERDOSA9IChpbnQpIG5leHRfYmxvY2tfcm93WzFdWzBdOworCX0KKwkvKiBDb21wdXRlIGNvZWZmaWNpZW50IGVzdGltYXRlcyBwZXIgSy44LgorCSAqIEFuIGVzdGltYXRlIGlzIGFwcGxpZWQgb25seSBpZiBjb2VmZmljaWVudCBpcyBzdGlsbCB6ZXJvLAorCSAqIGFuZCBpcyBub3Qga25vd24gdG8gYmUgZnVsbHkgYWNjdXJhdGUuCisJICovCisJLyogQUMwMSAqLworCWlmICgoQWw9Y29lZl9iaXRzWzFdKSAhPSAwICYmIHdvcmtzcGFjZVsxXSA9PSAwKSB7CisJICBudW0gPSAzNiAqIFEwMCAqIChEQzQgLSBEQzYpOworCSAgaWYgKG51bSA+PSAwKSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMDE8PDcpICsgbnVtKSAvIChRMDE8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgIH0gZWxzZSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMDE8PDcpIC0gbnVtKSAvIChRMDE8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgICAgcHJlZCA9IC1wcmVkOworCSAgfQorCSAgd29ya3NwYWNlWzFdID0gKEpDT0VGKSBwcmVkOworCX0KKwkvKiBBQzEwICovCisJaWYgKChBbD1jb2VmX2JpdHNbMl0pICE9IDAgJiYgd29ya3NwYWNlWzhdID09IDApIHsKKwkgIG51bSA9IDM2ICogUTAwICogKERDMiAtIERDOCk7CisJICBpZiAobnVtID49IDApIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFExMDw8NykgKyBudW0pIC8gKFExMDw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgfSBlbHNlIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFExMDw8NykgLSBudW0pIC8gKFExMDw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgICBwcmVkID0gLXByZWQ7CisJICB9CisJICB3b3Jrc3BhY2VbOF0gPSAoSkNPRUYpIHByZWQ7CisJfQorCS8qIEFDMjAgKi8KKwlpZiAoKEFsPWNvZWZfYml0c1szXSkgIT0gMCAmJiB3b3Jrc3BhY2VbMTZdID09IDApIHsKKwkgIG51bSA9IDkgKiBRMDAgKiAoREMyICsgREM4IC0gMipEQzUpOworCSAgaWYgKG51bSA+PSAwKSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMjA8PDcpICsgbnVtKSAvIChRMjA8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgIH0gZWxzZSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMjA8PDcpIC0gbnVtKSAvIChRMjA8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgICAgcHJlZCA9IC1wcmVkOworCSAgfQorCSAgd29ya3NwYWNlWzE2XSA9IChKQ09FRikgcHJlZDsKKwl9CisJLyogQUMxMSAqLworCWlmICgoQWw9Y29lZl9iaXRzWzRdKSAhPSAwICYmIHdvcmtzcGFjZVs5XSA9PSAwKSB7CisJICBudW0gPSA1ICogUTAwICogKERDMSAtIERDMyAtIERDNyArIERDOSk7CisJICBpZiAobnVtID49IDApIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFExMTw8NykgKyBudW0pIC8gKFExMTw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgfSBlbHNlIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFExMTw8NykgLSBudW0pIC8gKFExMTw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgICBwcmVkID0gLXByZWQ7CisJICB9CisJICB3b3Jrc3BhY2VbOV0gPSAoSkNPRUYpIHByZWQ7CisJfQorCS8qIEFDMDIgKi8KKwlpZiAoKEFsPWNvZWZfYml0c1s1XSkgIT0gMCAmJiB3b3Jrc3BhY2VbMl0gPT0gMCkgeworCSAgbnVtID0gOSAqIFEwMCAqIChEQzQgKyBEQzYgLSAyKkRDNSk7CisJICBpZiAobnVtID49IDApIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFEwMjw8NykgKyBudW0pIC8gKFEwMjw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgfSBlbHNlIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFEwMjw8NykgLSBudW0pIC8gKFEwMjw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgICBwcmVkID0gLXByZWQ7CisJICB9CisJICB3b3Jrc3BhY2VbMl0gPSAoSkNPRUYpIHByZWQ7CisJfQorCS8qIE9LLCBkbyB0aGUgSURDVCAqLworCSgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwgKEpDT0VGUFRSKSB3b3Jrc3BhY2UsCisJCQlvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKKwkvKiBBZHZhbmNlIGZvciBuZXh0IGNvbHVtbiAqLworCURDMSA9IERDMjsgREMyID0gREMzOworCURDNCA9IERDNTsgREM1ID0gREM2OworCURDNyA9IERDODsgREM4ID0gREM5OworCWJ1ZmZlcl9wdHIrKywgcHJldl9ibG9ja19yb3crKywgbmV4dF9ibG9ja19yb3crKzsKKwlvdXRwdXRfY29sICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICAgIH0KKyAgICAgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgIH0KKyAgfQorCisgIGlmICgrKyhjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpCisgICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKyNlbmRpZiAvKiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9kX2NvZWZfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQoreworICBteV9jb2VmX3B0ciBjb2VmOworCisgIGNvZWYgPSAobXlfY29lZl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyICopIGNvZWY7CisgIGNvZWYtPnB1Yi5zdGFydF9pbnB1dF9wYXNzID0gc3RhcnRfaW5wdXRfcGFzczsKKyAgY29lZi0+cHViLnN0YXJ0X291dHB1dF9wYXNzID0gc3RhcnRfb3V0cHV0X3Bhc3M7CisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorICBjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggPSBOVUxMOworI2VuZGlmCisKKyAgLyogQ3JlYXRlIHRoZSBjb2VmZmljaWVudCBidWZmZXIuICovCisgIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7CisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LCAqLworICAgIC8qIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIHNhbXBfZmFjdG9yIERDVCBibG9ja3MgaW4gZWFjaCBkaXJlY3Rpb24uICovCisgICAgLyogTm90ZSB3ZSBhc2sgZm9yIGEgcHJlLXplcm9lZCBhcnJheS4gKi8KKyAgICBpbnQgY2ksIGFjY2Vzc19yb3dzOworICAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIGFjY2Vzc19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECisgICAgICAvKiBJZiBibG9jayBzbW9vdGhpbmcgY291bGQgYmUgdXNlZCwgbmVlZCBhIGJpZ2dlciB3aW5kb3cgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKKwlhY2Nlc3Nfcm93cyAqPSAzOworI2VuZGlmCisgICAgICBjb2VmLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgVFJVRSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBhY2Nlc3Nfcm93cyk7CisgICAgfQorICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGEgPSBjb25zdW1lX2RhdGE7CisgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3NfZGF0YTsKKyAgICBjb2VmLT5wdWIuY29lZl9hcnJheXMgPSBjb2VmLT53aG9sZV9pbWFnZTsgLyogbGluayB0byB2aXJ0dWFsIGFycmF5cyAqLworI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICAvKiBXZSBvbmx5IG5lZWQgYSBzaW5nbGUtTUNVIGJ1ZmZlci4gKi8KKyAgICBKQkxPQ0tST1cgYnVmZmVyOworICAgIGludCBpOworCisgICAgYnVmZmVyID0gKEpCTE9DS1JPVykKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBEX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOworICAgIGZvciAoaSA9IDA7IGkgPCBEX01BWF9CTE9DS1NfSU5fTUNVOyBpKyspIHsKKyAgICAgIGNvZWYtPk1DVV9idWZmZXJbaV0gPSBidWZmZXIgKyBpOworICAgIH0KKyAgICBjb2VmLT5wdWIuY29uc3VtZV9kYXRhID0gZHVtbXlfY29uc3VtZV9kYXRhOworICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX29uZXBhc3M7CisgICAgY29lZi0+cHViLmNvZWZfYXJyYXlzID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamRjb2xvci5jIGIvY29tbW9uL2pwZWcvamRjb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMDRkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZGNvbG9yLmMKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiBqZGNvbG9yLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBvdXRwdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmVzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBQcml2YXRlIHN1Ym9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFByaXZhdGUgc3RhdGUgZm9yIFlDQy0+UkdCIGNvbnZlcnNpb24gKi8KKyAgaW50ICogQ3Jfcl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gUiBjb252ZXJzaW9uICovCisgIGludCAqIENiX2JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEIgY29udmVyc2lvbiAqLworICBJTlQzMiAqIENyX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIEcgY29udmVyc2lvbiAqLworICBJTlQzMiAqIENiX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEcgY29udmVyc2lvbiAqLworfSBteV9jb2xvcl9kZWNvbnZlcnRlcjsKKwordHlwZWRlZiBteV9jb2xvcl9kZWNvbnZlcnRlciAqIG15X2Njb252ZXJ0X3B0cjsKKworCisvKioqKioqKioqKioqKioqKiBZQ2JDciAtPiBSR0IgY29udmVyc2lvbjogbW9zdCBjb21tb24gY2FzZSAqKioqKioqKioqKioqKi8KKworLyoKKyAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKKyAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCisgKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQorICoJUiA9IFkgICAgICAgICAgICAgICAgKyAxLjQwMjAwICogQ3IKKyAqCUcgPSBZIC0gMC4zNDQxNCAqIENiIC0gMC43MTQxNCAqIENyCisgKglCID0gWSArIDEuNzcyMDAgKiBDYgorICogd2hlcmUgQ2IgYW5kIENyIHJlcHJlc2VudCB0aGUgaW5jb21pbmcgdmFsdWVzIGxlc3MgQ0VOVEVSSlNBTVBMRS4KKyAqIChUaGVzZSBudW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gVElGRiA2LjAgc2VjdGlvbiAyMSwgZGF0ZWQgMy1KdW5lLTkyLikKKyAqCisgKiBUbyBhdm9pZCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLCB3ZSByZXByZXNlbnQgdGhlIGZyYWN0aW9uYWwgY29uc3RhbnRzCisgKiBhcyBpbnRlZ2VycyBzY2FsZWQgdXAgYnkgMl4xNiAoYWJvdXQgNCBkaWdpdHMgcHJlY2lzaW9uKTsgd2UgaGF2ZSB0byBkaXZpZGUKKyAqIHRoZSBwcm9kdWN0cyBieSAyXjE2LCB3aXRoIGFwcHJvcHJpYXRlIHJvdW5kaW5nLCB0byBnZXQgdGhlIGNvcnJlY3QgYW5zd2VyLgorICogTm90aWNlIHRoYXQgWSwgYmVpbmcgYW4gaW50ZWdyYWwgaW5wdXQsIGRvZXMgbm90IGNvbnRyaWJ1dGUgYW55IGZyYWN0aW9uCisgKiBzbyBpdCBuZWVkIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgcm91bmRpbmcuCisgKgorICogRm9yIGV2ZW4gbW9yZSBzcGVlZCwgd2UgYXZvaWQgZG9pbmcgYW55IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgaW5uZXIgbG9vcAorICogYnkgcHJlY2FsY3VsYXRpbmcgdGhlIGNvbnN0YW50cyB0aW1lcyBDYiBhbmQgQ3IgZm9yIGFsbCBwb3NzaWJsZSB2YWx1ZXMuCisgKiBGb3IgOC1iaXQgSlNBTVBMRXMgdGhpcyBpcyB2ZXJ5IHJlYXNvbmFibGUgKG9ubHkgMjU2IGVudHJpZXMgcGVyIHRhYmxlKTsKKyAqIGZvciAxMi1iaXQgc2FtcGxlcyBpdCBpcyBzdGlsbCBhY2NlcHRhYmxlLiAgSXQncyBub3QgdmVyeSByZWFzb25hYmxlIGZvcgorICogMTYtYml0IHNhbXBsZXMsIGJ1dCBpZiB5b3Ugd2FudCBsb3NzbGVzcyBzdG9yYWdlIHlvdSBzaG91bGRuJ3QgYmUgY2hhbmdpbmcKKyAqIGNvbG9yc3BhY2UgYW55d2F5LgorICogVGhlIENyPT5SIGFuZCBDYj0+QiB2YWx1ZXMgY2FuIGJlIHJvdW5kZWQgdG8gaW50ZWdlcnMgaW4gYWR2YW5jZTsgdGhlCisgKiB2YWx1ZXMgZm9yIHRoZSBHIGNhbGN1bGF0aW9uIGFyZSBsZWZ0IHNjYWxlZCB1cCwgc2luY2Ugd2UgbXVzdCBhZGQgdGhlbQorICogdG9nZXRoZXIgYmVmb3JlIHJvdW5kaW5nLgorICovCisKKyNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCisjZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworCisvKgorICogSW5pdGlhbGl6ZSB0YWJsZXMgZm9yIFlDQy0+UkdCIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqLworCitMT0NBTCh2b2lkKQorYnVpbGRfeWNjX3JnYl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICBpbnQgaTsKKyAgSU5UMzIgeDsKKyAgU0hJRlRfVEVNUFMKKworICBjY29udmVydC0+Q3Jfcl90YWIgPSAoaW50ICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKKyAgY2NvbnZlcnQtPkNiX2JfdGFiID0gKGludCAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7CisgIGNjb252ZXJ0LT5Dcl9nX3RhYiA9IChJTlQzMiAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKKyAgY2NvbnZlcnQtPkNiX2dfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOworCisgIGZvciAoaSA9IDAsIHggPSAtQ0VOVEVSSlNBTVBMRTsgaSA8PSBNQVhKU0FNUExFOyBpKyssIHgrKykgeworICAgIC8qIGkgaXMgdGhlIGFjdHVhbCBpbnB1dCBwaXhlbCB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgKi8KKyAgICAvKiBUaGUgQ2Igb3IgQ3IgdmFsdWUgd2UgYXJlIHRoaW5raW5nIG9mIGlzIHggPSBpIC0gQ0VOVEVSSlNBTVBMRSAqLworICAgIC8qIENyPT5SIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNDAyMDAgKiB4ICovCisgICAgY2NvbnZlcnQtPkNyX3JfdGFiW2ldID0gKGludCkKKwkJICAgIFJJR0hUX1NISUZUKEZJWCgxLjQwMjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKKyAgICAvKiBDYj0+QiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjc3MjAwICogeCAqLworICAgIGNjb252ZXJ0LT5DYl9iX3RhYltpXSA9IChpbnQpCisJCSAgICBSSUdIVF9TSElGVChGSVgoMS43NzIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7CisgICAgLyogQ3I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjcxNDE0ICogeCAqLworICAgIGNjb252ZXJ0LT5Dcl9nX3RhYltpXSA9ICgtIEZJWCgwLjcxNDE0KSkgKiB4OworICAgIC8qIENiPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC4zNDQxNCAqIHggKi8KKyAgICAvKiBXZSBhbHNvIGFkZCBpbiBPTkVfSEFMRiBzbyB0aGF0IG5lZWQgbm90IGRvIGl0IGluIGlubmVyIGxvb3AgKi8KKyAgICBjY29udmVydC0+Q2JfZ190YWJbaV0gPSAoLSBGSVgoMC4zNDQxNCkpICogeCArIE9ORV9IQUxGOworICB9Cit9CisKKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBjb2xvcnNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjaGFuZ2UgZnJvbSBub25pbnRlcmxlYXZlZCwgb25lLXBsYW5lLXBlci1jb21wb25lbnQgZm9ybWF0CisgKiB0byBpbnRlcmxlYXZlZC1waXhlbCBmb3JtYXQuICBUaGUgb3V0cHV0IGJ1ZmZlciBpcyB0aGVyZWZvcmUgdGhyZWUgdGltZXMKKyAqIGFzIHdpZGUgYXMgdGhlIGlucHV0IGJ1ZmZlci4KKyAqIEEgc3RhcnRpbmcgcm93IG9mZnNldCBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgaW5wdXQgYnVmZmVyLiAgVGhlIGNhbGxlcgorICogY2FuIGVhc2lseSBhZGp1c3QgdGhlIHBhc3NlZCBvdXRwdXRfYnVmIHZhbHVlIHRvIGFjY29tbW9kYXRlIGFueSByb3cKKyAqIG9mZnNldCByZXF1aXJlZCBvbiB0aGF0IHNpZGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit5Y2NfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7CisgIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOworICBTSElGVF9URU1QUworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoaW5wdHIwW2NvbF0pOworICAgICAgY2IgPSBHRVRKU0FNUExFKGlucHRyMVtjb2xdKTsKKyAgICAgIGNyID0gR0VUSlNBTVBMRShpbnB0cjJbY29sXSk7CisgICAgICAvKiBSYW5nZS1saW1pdGluZyBpcyBlc3NlbnRpYWwgZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgRENUIGxvc3Nlcy4gKi8KKyAgICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOworICAgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsKKwkJCSAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKKwkJCQkJCSBTQ0FMRUJJVFMpKV07CisgICAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKKyAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOworICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqIENhc2VzIG90aGVyIHRoYW4gWUNiQ3IgLT4gUkdCICoqKioqKioqKioqKioqLworCisKKy8qCisgKiBDb2xvciBjb252ZXJzaW9uIGZvciBubyBjb2xvcnNwYWNlIGNoYW5nZToganVzdCBjb3B5IHRoZSBkYXRhLAorICogY29udmVydGluZyBmcm9tIHNlcGFyYXRlLXBsYW5lcyB0byBpbnRlcmxlYXZlZCByZXByZXNlbnRhdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK251bGxfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY291bnQ7CisgIHJlZ2lzdGVyIGludCBudW1fY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIGludCBjaTsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgbnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGlucHRyID0gaW5wdXRfYnVmW2NpXVtpbnB1dF9yb3ddOworICAgICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXSArIGNpOworICAgICAgZm9yIChjb3VudCA9IG51bV9jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKwkqb3V0cHRyID0gKmlucHRyKys7CS8qIG5lZWRuJ3QgYm90aGVyIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KKwlvdXRwdHIgKz0gbnVtX2NvbXBvbmVudHM7CisgICAgICB9CisgICAgfQorICAgIGlucHV0X3JvdysrOworICAgIG91dHB1dF9idWYrKzsKKyAgfQorfQorCisKKy8qCisgKiBDb2xvciBjb252ZXJzaW9uIGZvciBncmF5c2NhbGU6IGp1c3QgY29weSB0aGUgZGF0YS4KKyAqIFRoaXMgYWxzbyB3b3JrcyBmb3IgWUNiQ3IgLT4gZ3JheXNjYWxlIGNvbnZlcnNpb24sIGluIHdoaWNoCisgKiB3ZSBqdXN0IGNvcHkgdGhlIFkgKGx1bWluYW5jZSkgY29tcG9uZW50IGFuZCBpZ25vcmUgY2hyb21pbmFuY2UuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitncmF5c2NhbGVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgamNvcHlfc2FtcGxlX3Jvd3MoaW5wdXRfYnVmWzBdLCAoaW50KSBpbnB1dF9yb3csIG91dHB1dF9idWYsIDAsCisJCSAgICBudW1fcm93cywgY2luZm8tPm91dHB1dF93aWR0aCk7Cit9CisKKworLyoKKyAqIENvbnZlcnQgZ3JheXNjYWxlIHRvIFJHQjoganVzdCBkdXBsaWNhdGUgdGhlIGdyYXlsZXZlbCB0aHJlZSB0aW1lcy4KKyAqIFRoaXMgaXMgcHJvdmlkZWQgdG8gc3VwcG9ydCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IHRvIGNvcGUKKyAqIHdpdGggZ3JheXNjYWxlIGFzIGEgc2VwYXJhdGUgY2FzZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2dyYXlfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gaW5wdXRfYnVmWzBdW2lucHV0X3JvdysrXTsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICAvKiBXZSBjYW4gZGlzcGVuc2Ugd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLworICAgICAgb3V0cHRyW1JHQl9SRURdID0gb3V0cHRyW1JHQl9HUkVFTl0gPSBvdXRwdHJbUkdCX0JMVUVdID0gaW5wdHJbY29sXTsKKyAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBBZG9iZS1zdHlsZSBZQ0NLLT5DTVlLIGNvbnZlcnNpb24uCisgKiBXZSBjb252ZXJ0IFlDYkNyIHRvIFI9MS1DLCBHPTEtTSwgYW5kIEI9MS1ZIHVzaW5nIHRoZSBzYW1lCisgKiBjb252ZXJzaW9uIGFzIGFib3ZlLCB3aGlsZSBwYXNzaW5nIEsgKGJsYWNrKSB1bmNoYW5nZWQuCisgKiBXZSBhc3N1bWUgYnVpbGRfeWNjX3JnYl90YWJsZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit5Y2NrX2NteWtfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjIsIGlucHRyMzsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKKyAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7CisgIFNISUZUX1RFTVBTCisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOworICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOworICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOworICAgIGlucHRyMyA9IGlucHV0X2J1ZlszXVtpbnB1dF9yb3ddOworICAgIGlucHV0X3JvdysrOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHkgID0gR0VUSlNBTVBMRShpbnB0cjBbY29sXSk7CisgICAgICBjYiA9IEdFVEpTQU1QTEUoaW5wdHIxW2NvbF0pOworICAgICAgY3IgPSBHRVRKU0FNUExFKGlucHRyMltjb2xdKTsKKyAgICAgIC8qIFJhbmdlLWxpbWl0aW5nIGlzIGVzc2VudGlhbCBkdWUgdG8gbm9pc2UgaW50cm9kdWNlZCBieSBEQ1QgbG9zc2VzLiAqLworICAgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgQ3JydGFiW2NyXSldOwkvKiByZWQgKi8KKyAgICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0W01BWEpTQU1QTEUgLSAoeSArCQkJLyogZ3JlZW4gKi8KKwkJCSAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKKwkJCQkJCSBTQ0FMRUJJVFMpKSldOworICAgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgQ2JidGFiW2NiXSldOwkvKiBibHVlICovCisgICAgICAvKiBLIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZCAqLworICAgICAgb3V0cHRyWzNdID0gaW5wdHIzW2NvbF07CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSBoZXJlICovCisgICAgICBvdXRwdHIgKz0gNDsKKyAgICB9CisgIH0KK30KKworCisvKgorICogRW1wdHkgbWV0aG9kIGZvciBzdGFydF9wYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19kY29sb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgbmVlZGVkICovCit9CisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBvdXRwdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY29sb3JfZGVjb252ZXJ0ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKKyAgaW50IGNpOworCisgIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jb2xvcl9kZWNvbnZlcnRlcikpOworICBjaW5mby0+Y2NvbnZlcnQgPSAoc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgKikgY2NvbnZlcnQ7CisgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfZGNvbG9yOworCisgIC8qIE1ha2Ugc3VyZSBudW1fY29tcG9uZW50cyBhZ3JlZXMgd2l0aCBqcGVnX2NvbG9yX3NwYWNlICovCisgIHN3aXRjaCAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfUkdCOgorICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX0NNWUs6CisgIGNhc2UgSkNTX1lDQ0s6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSA0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgkJCS8qIEpDU19VTktOT1dOIGNhbiBiZSBhbnl0aGluZyAqLworICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPCAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIFNldCBvdXRfY29sb3JfY29tcG9uZW50cyBhbmQgY29udmVyc2lvbiBtZXRob2QgYmFzZWQgb24gcmVxdWVzdGVkIHNwYWNlLgorICAgKiBBbHNvIGNsZWFyIHRoZSBjb21wb25lbnRfbmVlZGVkIGZsYWdzIGZvciBhbnkgdW51c2VkIGNvbXBvbmVudHMsCisgICAqIHNvIHRoYXQgZWFybGllciBwaXBlbGluZSBzdGFnZXMgY2FuIGF2b2lkIHVzZWxlc3MgY29tcHV0YXRpb24uCisgICAqLworCisgIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgeworICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSB8fAorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheXNjYWxlX2NvbnZlcnQ7CisgICAgICAvKiBGb3IgY29sb3ItPmdyYXlzY2FsZSBjb252ZXJzaW9uLCBvbmx5IHRoZSBZICgwKSBjb21wb25lbnQgaXMgbmVlZGVkICovCisgICAgICBmb3IgKGNpID0gMTsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspCisJY2luZm8tPmNvbXBfaW5mb1tjaV0uY29tcG9uZW50X25lZWRlZCA9IEZBTFNFOworICAgIH0gZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1JHQjoKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOworICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY19yZ2JfY29udmVydDsKKyAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOworICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheV9yZ2JfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19SR0IgJiYgUkdCX1BJWEVMU0laRSA9PSAzKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfQ01ZSzoKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OworICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSykgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNja19jbXlrX2NvbnZlcnQ7CisgICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19DTVlLKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBQZXJtaXQgbnVsbCBjb252ZXJzaW9uIHRvIHNhbWUgb3V0cHV0IHNwYWNlICovCisgICAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKKyAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICB9IGVsc2UJCQkvKiB1bnN1cHBvcnRlZCBub24tbnVsbCBjb252ZXJzaW9uICovCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKKyAgICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPSAxOyAvKiBzaW5nbGUgY29sb3JtYXBwZWQgb3V0cHV0IGNvbXBvbmVudCAqLworICBlbHNlCisgICAgY2luZm8tPm91dHB1dF9jb21wb25lbnRzID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamRjdC5oIGIvY29tbW9uL2pwZWcvamRjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTkyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZGN0LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBqZGN0LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgaW5jbHVkZSBmaWxlIGNvbnRhaW5zIGNvbW1vbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmb3J3YXJkIGFuZAorICogaW52ZXJzZSBEQ1QgbW9kdWxlcy4gIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgcHJpdmF0ZSB0byB0aGUgRENUIG1hbmFnZXJzCisgKiAoamNkY3RtZ3IuYywgamRkY3RtZ3IuYykgYW5kIHRoZSBpbmRpdmlkdWFsIERDVCBhbGdvcml0aG1zLgorICogVGhlIGluZGl2aWR1YWwgRENUIGFsZ29yaXRobXMgYXJlIGtlcHQgaW4gc2VwYXJhdGUgZmlsZXMgdG8gZWFzZSAKKyAqIG1hY2hpbmUtZGVwZW5kZW50IHR1bmluZyAoZS5nLiwgYXNzZW1ibHkgY29kaW5nKS4KKyAqLworCisKKy8qCisgKiBBIGZvcndhcmQgRENUIHJvdXRpbmUgaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIGEgd29yayBhcmVhIG9mIHR5cGUgRENURUxFTVtdOworICogdGhlIERDVCBpcyB0byBiZSBwZXJmb3JtZWQgaW4tcGxhY2UgaW4gdGhhdCBidWZmZXIuICBUeXBlIERDVEVMRU0gaXMgaW50CisgKiBmb3IgOC1iaXQgc2FtcGxlcywgSU5UMzIgZm9yIDEyLWJpdCBzYW1wbGVzLiAgKE5PVEU6IEZsb2F0aW5nLXBvaW50IERDVAorICogaW1wbGVtZW50YXRpb25zIHVzZSBhbiBhcnJheSBvZiB0eXBlIEZBU1RfRkxPQVQsIGluc3RlYWQuKQorICogVGhlIERDVCBpbnB1dHMgYXJlIGV4cGVjdGVkIHRvIGJlIHNpZ25lZCAocmFuZ2UgKy1DRU5URVJKU0FNUExFKS4KKyAqIFRoZSBEQ1Qgb3V0cHV0cyBhcmUgcmV0dXJuZWQgc2NhbGVkIHVwIGJ5IGEgZmFjdG9yIG9mIDg7IHRoZXkgdGhlcmVmb3JlCisgKiBoYXZlIGEgcmFuZ2Ugb2YgKy04SyBmb3IgOC1iaXQgZGF0YSwgKy0xMjhLIGZvciAxMi1iaXQgZGF0YS4gIFRoaXMKKyAqIGNvbnZlbnRpb24gaW1wcm92ZXMgYWNjdXJhY3kgaW4gaW50ZWdlciBpbXBsZW1lbnRhdGlvbnMgYW5kIHNhdmVzIHNvbWUKKyAqIHdvcmsgaW4gZmxvYXRpbmctcG9pbnQgb25lcy4KKyAqIFF1YW50aXphdGlvbiBvZiB0aGUgb3V0cHV0IGNvZWZmaWNpZW50cyBpcyBkb25lIGJ5IGpjZGN0bWdyLmMuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Cit0eXBlZGVmIGludCBEQ1RFTEVNOwkJLyogMTYgb3IgMzIgYml0cyBpcyBmaW5lICovCisjZWxzZQordHlwZWRlZiBJTlQzMiBEQ1RFTEVNOwkJLyogbXVzdCBoYXZlIDMyIGJpdHMgKi8KKyNlbmRpZgorCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciwgKERDVEVMRU0gKiBkYXRhKSk7Cit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZmxvYXRfRENUX21ldGhvZF9wdHIsIChGQVNUX0ZMT0FUICogZGF0YSkpOworCisKKy8qCisgKiBBbiBpbnZlcnNlIERDVCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byB0aGUgaW5wdXQgSkJMT0NLIGFuZCBhIHBvaW50ZXIKKyAqIHRvIGFuIG91dHB1dCBzYW1wbGUgYXJyYXkuICBUaGUgcm91dGluZSBtdXN0IGRlcXVhbnRpemUgdGhlIGlucHV0IGRhdGEgYXMKKyAqIHdlbGwgYXMgcGVyZm9ybSB0aGUgSURDVDsgZm9yIGRlcXVhbnRpemF0aW9uLCBpdCB1c2VzIHRoZSBtdWx0aXBsaWVyIHRhYmxlCisgKiBwb2ludGVkIHRvIGJ5IGNvbXBwdHItPmRjdF90YWJsZS4gIFRoZSBvdXRwdXQgZGF0YSBpcyB0byBiZSBwbGFjZWQgaW50byB0aGUKKyAqIHNhbXBsZSBhcnJheSBzdGFydGluZyBhdCBhIHNwZWNpZmllZCBjb2x1bW4uICAoQW55IHJvdyBvZmZzZXQgbmVlZGVkIHdpbGwKKyAqIGJlIGFwcGxpZWQgdG8gdGhlIGFycmF5IHBvaW50ZXIgYmVmb3JlIGl0IGlzIHBhc3NlZCB0byB0aGUgSURDVCBjb2RlLikKKyAqIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZW1pdHRlZCBieSB0aGUgSURDVCByb3V0aW5lIGlzCisgKiBEQ1Rfc2NhbGVkX3NpemUgKiBEQ1Rfc2NhbGVkX3NpemUuCisgKi8KKworLyogdHlwZWRlZiBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGlzIGRlY2xhcmVkIGluIGpwZWdpbnQuaCAqLworCisvKgorICogRWFjaCBJRENUIHJvdXRpbmUgaGFzIGl0cyBvd24gaWRlYXMgYWJvdXQgdGhlIGJlc3QgZGN0X3RhYmxlIGVsZW1lbnQgdHlwZS4KKyAqLworCit0eXBlZGVmIE1VTFRJUExJRVIgSVNMT1dfTVVMVF9UWVBFOyAvKiBzaG9ydCBvciBpbnQsIHdoaWNoZXZlciBpcyBmYXN0ZXIgKi8KKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAordHlwZWRlZiBNVUxUSVBMSUVSIElGQVNUX01VTFRfVFlQRTsgLyogMTYgYml0cyBpcyBPSywgdXNlIHNob3J0IGlmIGZhc3RlciAqLworI2RlZmluZSBJRkFTVF9TQ0FMRV9CSVRTICAyCS8qIGZyYWN0aW9uYWwgYml0cyBpbiBzY2FsZSBmYWN0b3JzICovCisjZWxzZQordHlwZWRlZiBJTlQzMiBJRkFTVF9NVUxUX1RZUEU7CS8qIG5lZWQgMzIgYml0cyBmb3Igc2NhbGVkIHF1YW50aXplcnMgKi8KKyNkZWZpbmUgSUZBU1RfU0NBTEVfQklUUyAgMTMJLyogZnJhY3Rpb25hbCBiaXRzIGluIHNjYWxlIGZhY3RvcnMgKi8KKyNlbmRpZgordHlwZWRlZiBGQVNUX0ZMT0FUIEZMT0FUX01VTFRfVFlQRTsgLyogcHJlZmVycmVkIGZsb2F0aW5nIHR5cGUgKi8KKworCisvKgorICogRWFjaCBJRENUIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHJhbmdlLWxpbWl0aW5nIGl0cyByZXN1bHRzIGFuZAorICogY29udmVydGluZyB0aGVtIHRvIHVuc2lnbmVkIGZvcm0gKDAuLk1BWEpTQU1QTEUpLiAgVGhlIHJhdyBvdXRwdXRzIGNvdWxkCisgKiBiZSBxdWl0ZSBmYXIgb3V0IG9mIHJhbmdlIGlmIHRoZSBpbnB1dCBkYXRhIGlzIGNvcnJ1cHQsIHNvIGEgYnVsbGV0cHJvb2YKKyAqIHJhbmdlLWxpbWl0aW5nIHN0ZXAgaXMgcmVxdWlyZWQuICBXZSB1c2UgYSBtYXNrLWFuZC10YWJsZS1sb29rdXAgbWV0aG9kCisgKiB0byBkbyB0aGUgY29tYmluZWQgb3BlcmF0aW9ucyBxdWlja2x5LiAgU2VlIHRoZSBjb21tZW50cyB3aXRoCisgKiBwcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlIChpbiBqZG1hc3Rlci5jKSBmb3IgbW9yZSBpbmZvLgorICovCisKKyNkZWZpbmUgSURDVF9yYW5nZV9saW1pdChjaW5mbykgICgoY2luZm8pLT5zYW1wbGVfcmFuZ2VfbGltaXQgKyBDRU5URVJKU0FNUExFKQorCisjZGVmaW5lIFJBTkdFX01BU0sgIChNQVhKU0FNUExFICogNCArIDMpIC8qIDIgYml0cyB3aWRlciB0aGFuIGxlZ2FsIHNhbXBsZXMgKi8KKworCisvKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganBlZ19mZGN0X2lzbG93CQlqRkRpc2xvdworI2RlZmluZSBqcGVnX2ZkY3RfaWZhc3QJCWpGRGlmYXN0CisjZGVmaW5lIGpwZWdfZmRjdF9mbG9hdAkJakZEZmxvYXQKKyNkZWZpbmUganBlZ19pZGN0X2lzbG93CQlqUkRpc2xvdworI2RlZmluZSBqcGVnX2lkY3RfaWZhc3QJCWpSRGlmYXN0CisjZGVmaW5lIGpwZWdfaWRjdF9mbG9hdAkJalJEZmxvYXQKKyNkZWZpbmUganBlZ19pZGN0XzR4NAkJalJENHg0CisjZGVmaW5lIGpwZWdfaWRjdF8yeDIJCWpSRDJ4MgorI2RlZmluZSBqcGVnX2lkY3RfMXgxCQlqUkQxeDEKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKy8qIEV4dGVybiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIERDVCByb3V0aW5lcy4gKi8KKworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF9pc2xvdyBKUFAoKERDVEVMRU0gKiBkYXRhKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0X2lmYXN0IEpQUCgoRENURUxFTSAqIGRhdGEpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZkY3RfZmxvYXQgSlBQKChGQVNUX0ZMT0FUICogZGF0YSkpOworCitFWFRFUk4odm9pZCkganBlZ19pZGN0X2lzbG93CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfaWZhc3QKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF9mbG9hdAorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzR4NAorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzJ4MgorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzF4MQorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CisKKworLyoKKyAqIE1hY3JvcyBmb3IgaGFuZGxpbmcgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYzsgdGhlc2UgYXJlIHVzZWQgYnkgbWFueQorICogYnV0IG5vdCBhbGwgb2YgdGhlIERDVC9JRENUIG1vZHVsZXMuCisgKgorICogQWxsIHZhbHVlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgb2YgdHlwZSBJTlQzMi4KKyAqIEZyYWN0aW9uYWwgY29uc3RhbnRzIGFyZSBzY2FsZWQgbGVmdCBieSBDT05TVF9CSVRTIGJpdHMuCisgKiBDT05TVF9CSVRTIGlzIGRlZmluZWQgd2l0aGluIGVhY2ggbW9kdWxlIHVzaW5nIHRoZXNlIG1hY3JvcywKKyAqIGFuZCBtYXkgZGlmZmVyIGZyb20gb25lIG1vZHVsZSB0byB0aGUgbmV4dC4KKyAqLworCisjZGVmaW5lIE9ORQkoKElOVDMyKSAxKQorI2RlZmluZSBDT05TVF9TQ0FMRSAoT05FIDw8IENPTlNUX0JJVFMpCisKKy8qIENvbnZlcnQgYSBwb3NpdGl2ZSByZWFsIGNvbnN0YW50IHRvIGFuIGludGVnZXIgc2NhbGVkIGJ5IENPTlNUX1NDQUxFLgorICogQ2F1dGlvbjogc29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLAorICogdGh1cyBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqLworCisjZGVmaW5lIEZJWCh4KQkoKElOVDMyKSAoKHgpICogQ09OU1RfU0NBTEUgKyAwLjUpKQorCisvKiBEZXNjYWxlIGFuZCBjb3JyZWN0bHkgcm91bmQgYW4gSU5UMzIgdmFsdWUgdGhhdCdzIHNjYWxlZCBieSBOIGJpdHMuCisgKiBXZSBhc3N1bWUgUklHSFRfU0hJRlQgcm91bmRzIHRvd2FyZHMgbWludXMgaW5maW5pdHksIHNvIGFkZGluZworICogdGhlIGZ1ZGdlIGZhY3RvciBpcyBjb3JyZWN0IGZvciBlaXRoZXIgc2lnbiBvZiBYLgorICovCisKKyNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCgoeCkgKyAoT05FIDw8ICgobiktMSkpLCBuKQorCisvKiBNdWx0aXBseSBhbiBJTlQzMiB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCB0byB5aWVsZCBhbiBJTlQzMiByZXN1bHQuCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgb25seSB3aGVuIHRoZSB0d28gaW5wdXRzIHdpbGwgYWN0dWFsbHkgYmUgbm8gbW9yZSB0aGFuCisgKiAxNiBiaXRzIHdpZGUsIHNvIHRoYXQgYSAxNngxNi0+MzIgYml0IG11bHRpcGx5IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYQorICogZnVsbCAzMngzMiBtdWx0aXBseS4gIFRoaXMgcHJvdmlkZXMgYSB1c2VmdWwgc3BlZWR1cCBvbiBtYW55IG1hY2hpbmVzLgorICogVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSBhIDE2eDE2LT4zMiBtdWx0aXBseSBwb3J0YWJseQorICogaW4gQywgYnV0IHNvbWUgQyBjb21waWxlcnMgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgeW91IHByb3ZpZGUgdGhlCisgKiBjb3JyZWN0IGNvbWJpbmF0aW9uIG9mIGNhc3RzLgorICovCisKKyNpZmRlZiBTSE9SVHhTSE9SVF8zMgkJLyogbWF5IHdvcmsgaWYgJ2ludCcgaXMgMzIgYml0cyAqLworI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgICgoKElOVDE2KSAodmFyKSkgKiAoKElOVDE2KSAoY29uc3QpKSkKKyNlbmRpZgorI2lmZGVmIFNIT1JUeExDT05TVF8zMgkJLyoga25vd24gdG8gd29yayB3aXRoIE1pY3Jvc29mdCBDIDYuMCAqLworI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgICgoKElOVDE2KSAodmFyKSkgKiAoKElOVDMyKSAoY29uc3QpKSkKKyNlbmRpZgorCisjaWZuZGVmIE1VTFRJUExZMTZDMTYJCS8qIGRlZmF1bHQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgICgodmFyKSAqIChjb25zdCkpCisjZW5kaWYKKworLyogU2FtZSBleGNlcHQgYm90aCBpbnB1dHMgYXJlIHZhcmlhYmxlcy4gKi8KKworI2lmZGVmIFNIT1JUeFNIT1JUXzMyCQkvKiBtYXkgd29yayBpZiAnaW50JyBpcyAzMiBiaXRzICovCisjZGVmaW5lIE1VTFRJUExZMTZWMTYodmFyMSx2YXIyKSAgKCgoSU5UMTYpICh2YXIxKSkgKiAoKElOVDE2KSAodmFyMikpKQorI2VuZGlmCisKKyNpZm5kZWYgTVVMVElQTFkxNlYxNgkJLyogZGVmYXVsdCBkZWZpbml0aW9uICovCisjZGVmaW5lIE1VTFRJUExZMTZWMTYodmFyMSx2YXIyKSAgKCh2YXIxKSAqICh2YXIyKSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamRkY3RtZ3IuYyBiL2NvbW1vbi9qcGVnL2pkZGN0bWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmOGQwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pkZGN0bWdyLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBqZGRjdG1nci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludmVyc2UtRENUIG1hbmFnZW1lbnQgbG9naWMuCisgKiBUaGlzIGNvZGUgc2VsZWN0cyBhIHBhcnRpY3VsYXIgSURDVCBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLAorICogYW5kIGl0IHBlcmZvcm1zIHJlbGF0ZWQgaG91c2VrZWVwaW5nIGNob3Jlcy4gIE5vIGNvZGUgaW4gdGhpcyBmaWxlCisgKiBpcyBleGVjdXRlZCBwZXIgSURDVCBzdGVwLCBvbmx5IGR1cmluZyBvdXRwdXQgcGFzcyBzZXR1cC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIElEQ1Qgcm91dGluZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIGNvZWZmaWNpZW50CisgKiBkZXF1YW50aXphdGlvbiBhcyB3ZWxsIGFzIHRoZSBJRENUIHByb3Blci4gIFRoaXMgbW9kdWxlIHNldHMgdXAgdGhlCisgKiBkZXF1YW50aXphdGlvbiBtdWx0aXBsaWVyIHRhYmxlIG5lZWRlZCBieSB0aGUgSURDVCByb3V0aW5lLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisKKy8qCisgKiBUaGUgZGVjb21wcmVzc29yIGlucHV0IHNpZGUgKGpkaW5wdXQuYykgc2F2ZXMgYXdheSB0aGUgYXBwcm9wcmlhdGUKKyAqIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgZWFjaCBjb21wb25lbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBzY2FuCisgKiBpbnZvbHZpbmcgdGhhdCBjb21wb25lbnQuICAoVGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gY29ycmVjdGx5CisgKiBkZWNvZGUgZmlsZXMgdGhhdCByZXVzZSBRLXRhYmxlIHNsb3RzLikKKyAqIFdoZW4gd2UgYXJlIHJlYWR5IHRvIG1ha2UgYW4gb3V0cHV0IHBhc3MsIHRoZSBzYXZlZCBRLXRhYmxlIGlzIGNvbnZlcnRlZAorICogdG8gYSBtdWx0aXBsaWVyIHRhYmxlIHRoYXQgd2lsbCBhY3R1YWxseSBiZSB1c2VkIGJ5IHRoZSBJRENUIHJvdXRpbmUuCisgKiBUaGUgbXVsdGlwbGllciB0YWJsZSBjb250ZW50cyBhcmUgSURDVC1tZXRob2QtZGVwZW5kZW50LiAgVG8gc3VwcG9ydAorICogYXBwbGljYXRpb24gY2hhbmdlcyBpbiBJRENUIG1ldGhvZCBiZXR3ZWVuIHNjYW5zLCB3ZSBjYW4gcmVtYWtlIHRoZQorICogbXVsdGlwbGllciB0YWJsZXMgaWYgbmVjZXNzYXJ5LgorICogSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhlIGZpcnN0IG91dHB1dCBwYXNzIG1heSBvY2N1ciBiZWZvcmUgYW55IGRhdGEKKyAqIGhhcyBiZWVuIHNlZW4gZm9yIHNvbWUgY29tcG9uZW50cywgYW5kIHRodXMgYmVmb3JlIHRoZWlyIFEtdGFibGVzIGhhdmUKKyAqIGJlZW4gc2F2ZWQgYXdheS4gIFRvIGhhbmRsZSB0aGlzIGNhc2UsIG11bHRpcGxpZXIgdGFibGVzIGFyZSBwcmVzZXQKKyAqIHRvIHplcm9lczsgdGhlIHJlc3VsdCBvZiB0aGUgSURDVCB3aWxsIGJlIGEgbmV1dHJhbCBncmF5IGxldmVsLgorICovCisKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgZm9yIHRoaXMgbW9kdWxlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogVGhpcyBhcnJheSBjb250YWlucyB0aGUgSURDVCBtZXRob2QgY29kZSB0aGF0IGVhY2ggbXVsdGlwbGllciB0YWJsZQorICAgKiBpcyBjdXJyZW50bHkgc2V0IHVwIGZvciwgb3IgLTEgaWYgaXQncyBub3QgeWV0IHNldCB1cC4KKyAgICogVGhlIGFjdHVhbCBtdWx0aXBsaWVyIHRhYmxlcyBhcmUgcG9pbnRlZCB0byBieSBkY3RfdGFibGUgaW4gdGhlCisgICAqIHBlci1jb21wb25lbnQgY29tcF9pbmZvIHN0cnVjdHVyZXMuCisgICAqLworICBpbnQgY3VyX21ldGhvZFtNQVhfQ09NUE9ORU5UU107Cit9IG15X2lkY3RfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9pZGN0X2NvbnRyb2xsZXIgKiBteV9pZGN0X3B0cjsKKworCisvKiBBbGxvY2F0ZWQgbXVsdGlwbGllciB0YWJsZXM6IGJpZyBlbm91Z2ggZm9yIGFueSBzdXBwb3J0ZWQgdmFyaWFudCAqLworCit0eXBlZGVmIHVuaW9uIHsKKyAgSVNMT1dfTVVMVF9UWVBFIGlzbG93X2FycmF5W0RDVFNJWkUyXTsKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisgIElGQVNUX01VTFRfVFlQRSBpZmFzdF9hcnJheVtEQ1RTSVpFMl07CisjZW5kaWYKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgIEZMT0FUX01VTFRfVFlQRSBmbG9hdF9hcnJheVtEQ1RTSVpFMl07CisjZW5kaWYKK30gbXVsdGlwbGllcl90YWJsZTsKKworCisvKiBUaGUgY3VycmVudCBzY2FsZWQtSURDVCByb3V0aW5lcyByZXF1aXJlIElTTE9XLXN0eWxlIG11bHRpcGxpZXIgdGFibGVzLAorICogc28gYmUgc3VyZSB0byBjb21waWxlIHRoYXQgY29kZSBpZiBlaXRoZXIgSVNMT1cgb3IgU0NBTElORyBpcyByZXF1ZXN0ZWQuCisgKi8KKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisjZGVmaW5lIFBST1ZJREVfSVNMT1dfVEFCTEVTCisjZWxzZQorI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKKyNkZWZpbmUgUFJPVklERV9JU0xPV19UQUJMRVMKKyNlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIFByZXBhcmUgZm9yIGFuIG91dHB1dCBwYXNzLgorICogSGVyZSB3ZSBzZWxlY3QgdGhlIHByb3BlciBJRENUIHJvdXRpbmUgZm9yIGVhY2ggY29tcG9uZW50IGFuZCBidWlsZAorICogYSBtYXRjaGluZyBtdWx0aXBsaWVyIHRhYmxlLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfaWRjdF9wdHIgaWRjdCA9IChteV9pZGN0X3B0cikgY2luZm8tPmlkY3Q7CisgIGludCBjaSwgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgaW50IG1ldGhvZCA9IDA7CisgIGludmVyc2VfRENUX21ldGhvZF9wdHIgbWV0aG9kX3B0ciA9IE5VTEw7CisgIEpRVUFOVF9UQkwgKiBxdGJsOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogU2VsZWN0IHRoZSBwcm9wZXIgSURDVCByb3V0aW5lIGZvciB0aGlzIGNvbXBvbmVudCdzIHNjYWxpbmcgKi8KKyAgICBzd2l0Y2ggKGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgeworI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKKyAgICBjYXNlIDE6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzF4MTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0cmVkIHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMngyOworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RyZWQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF80eDQ7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgRENUU0laRToKKyAgICAgIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisgICAgICBjYXNlIEpEQ1RfSVNMT1c6CisJbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pc2xvdzsKKwltZXRob2QgPSBKRENUX0lTTE9XOworCWJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICAgICAgY2FzZSBKRENUX0lGQVNUOgorCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfaWZhc3Q7CisJbWV0aG9kID0gSkRDVF9JRkFTVDsKKwlicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKyAgICAgIGNhc2UgSkRDVF9GTE9BVDoKKwltZXRob2RfcHRyID0ganBlZ19pZGN0X2Zsb2F0OworCW1ldGhvZCA9IEpEQ1RfRkxPQVQ7CisJYnJlYWs7CisjZW5kaWYKKyAgICAgIGRlZmF1bHQ6CisJRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworCWJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9EQ1RTSVpFLCBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlkY3QtPnB1Yi5pbnZlcnNlX0RDVFtjaV0gPSBtZXRob2RfcHRyOworICAgIC8qIENyZWF0ZSBtdWx0aXBsaWVyIHRhYmxlIGZyb20gcXVhbnQgdGFibGUuCisgICAgICogSG93ZXZlciwgd2UgY2FuIHNraXAgdGhpcyBpZiB0aGUgY29tcG9uZW50IGlzIHVuaW50ZXJlc3RpbmcKKyAgICAgKiBvciBpZiB3ZSBhbHJlYWR5IGJ1aWx0IHRoZSB0YWJsZS4gIEFsc28sIGlmIG5vIHF1YW50IHRhYmxlCisgICAgICogaGFzIHlldCBiZWVuIHNhdmVkIGZvciB0aGUgY29tcG9uZW50LCB3ZSBsZWF2ZSB0aGUKKyAgICAgKiBtdWx0aXBsaWVyIHRhYmxlIGFsbC16ZXJvOyB3ZSdsbCBiZSByZWFkaW5nIHplcm9lcyBmcm9tIHRoZQorICAgICAqIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBidWZmZXIgYW55d2F5LgorICAgICAqLworICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQgfHwgaWRjdC0+Y3VyX21ldGhvZFtjaV0gPT0gbWV0aG9kKQorICAgICAgY29udGludWU7CisgICAgcXRibCA9IGNvbXBwdHItPnF1YW50X3RhYmxlOworICAgIGlmIChxdGJsID09IE5VTEwpCQkvKiBoYXBwZW5zIGlmIG5vIGRhdGEgeWV0IGZvciBjb21wb25lbnQgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIGlkY3QtPmN1cl9tZXRob2RbY2ldID0gbWV0aG9kOworICAgIHN3aXRjaCAobWV0aG9kKSB7CisjaWZkZWYgUFJPVklERV9JU0xPV19UQUJMRVMKKyAgICBjYXNlIEpEQ1RfSVNMT1c6CisgICAgICB7CisJLyogRm9yIExMJk0gSURDVCBtZXRob2QsIG11bHRpcGxpZXJzIGFyZSBlcXVhbCB0byByYXcgcXVhbnRpemF0aW9uCisJICogY29lZmZpY2llbnRzLCBidXQgYXJlIHN0b3JlZCBhcyBpbnRzIHRvIGVuc3VyZSBhY2Nlc3MgZWZmaWNpZW5jeS4KKwkgKi8KKwlJU0xPV19NVUxUX1RZUEUgKiBpc210YmwgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKwlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworCSAgaXNtdGJsW2ldID0gKElTTE9XX01VTFRfVFlQRSkgcXRibC0+cXVhbnR2YWxbaV07CisJfQorICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisgICAgY2FzZSBKRENUX0lGQVNUOgorICAgICAgeworCS8qIEZvciBBQSZOIElEQ1QgbWV0aG9kLCBtdWx0aXBsaWVycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCisJICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCisJICogICBzY2FsZWZhY3RvclswXSA9IDEKKwkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43CisJICogRm9yIGludGVnZXIgb3BlcmF0aW9uLCB0aGUgbXVsdGlwbGllciB0YWJsZSBpcyB0byBiZSBzY2FsZWQgYnkKKwkgKiBJRkFTVF9TQ0FMRV9CSVRTLgorCSAqLworCUlGQVNUX01VTFRfVFlQRSAqIGlmbXRibCA9IChJRkFTVF9NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworI2RlZmluZSBDT05TVF9CSVRTIDE0CisJc3RhdGljIGNvbnN0IElOVDE2IGFhbnNjYWxlc1tEQ1RTSVpFMl0gPSB7CisJICAvKiBwcmVjb21wdXRlZCB2YWx1ZXMgc2NhbGVkIHVwIGJ5IDE0IGJpdHMgKi8KKwkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKKwkgIDIyNzI1LCAzMTUyMSwgMjk2OTIsIDI2NzIyLCAyMjcyNSwgMTc4NTUsIDEyMjk5LCAgNjI3MCwKKwkgIDIxNDA3LCAyOTY5MiwgMjc5NjksIDI1MTcyLCAyMTQwNywgMTY4MTksIDExNTg1LCAgNTkwNiwKKwkgIDE5MjY2LCAyNjcyMiwgMjUxNzIsIDIyNjU0LCAxOTI2NiwgMTUxMzcsIDEwNDI2LCAgNTMxNSwKKwkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKKwkgIDEyODczLCAxNzg1NSwgMTY4MTksIDE1MTM3LCAxMjg3MywgMTAxMTQsICA2OTY3LCAgMzU1MiwKKwkgICA4ODY3LCAxMjI5OSwgMTE1ODUsIDEwNDI2LCAgODg2NywgIDY5NjcsICA0Nzk5LCAgMjQ0NiwKKwkgICA0NTIwLCAgNjI3MCwgIDU5MDYsICA1MzE1LCAgNDUyMCwgIDM1NTIsICAyNDQ2LCAgMTI0NworCX07CisJU0hJRlRfVEVNUFMKKworCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisJICBpZm10YmxbaV0gPSAoSUZBU1RfTVVMVF9UWVBFKQorCSAgICBERVNDQUxFKE1VTFRJUExZMTZWMTYoKElOVDMyKSBxdGJsLT5xdWFudHZhbFtpXSwKKwkJCQkgIChJTlQzMikgYWFuc2NhbGVzW2ldKSwKKwkJICAgIENPTlNUX0JJVFMtSUZBU1RfU0NBTEVfQklUUyk7CisJfQorICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgICAgY2FzZSBKRENUX0ZMT0FUOgorICAgICAgeworCS8qIEZvciBmbG9hdCBBQSZOIElEQ1QgbWV0aG9kLCBtdWx0aXBsaWVycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCisJICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCisJICogICBzY2FsZWZhY3RvclswXSA9IDEKKwkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43CisJICovCisJRkxPQVRfTVVMVF9UWVBFICogZm10YmwgPSAoRkxPQVRfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKwlpbnQgcm93LCBjb2w7CisJc3RhdGljIGNvbnN0IGRvdWJsZSBhYW5zY2FsZWZhY3RvcltEQ1RTSVpFXSA9IHsKKwkgIDEuMCwgMS4zODcwMzk4NDUsIDEuMzA2NTYyOTY1LCAxLjE3NTg3NTYwMiwKKwkgIDEuMCwgMC43ODU2OTQ5NTgsIDAuNTQxMTk2MTAwLCAwLjI3NTg5OTM3OQorCX07CisKKwlpID0gMDsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IERDVFNJWkU7IHJvdysrKSB7CisJICBmb3IgKGNvbCA9IDA7IGNvbCA8IERDVFNJWkU7IGNvbCsrKSB7CisJICAgIGZtdGJsW2ldID0gKEZMT0FUX01VTFRfVFlQRSkKKwkgICAgICAoKGRvdWJsZSkgcXRibC0+cXVhbnR2YWxbaV0gKgorCSAgICAgICBhYW5zY2FsZWZhY3Rvcltyb3ddICogYWFuc2NhbGVmYWN0b3JbY29sXSk7CisJICAgIGkrKzsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSBJRENUIG1hbmFnZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9pbnZlcnNlX2RjdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfaWRjdF9wdHIgaWRjdDsKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIGlkY3QgPSAobXlfaWRjdF9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfaWRjdF9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5pZGN0ID0gKHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0ICopIGlkY3Q7CisgIGlkY3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzczsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIEFsbG9jYXRlIGFuZCBwcmUtemVybyBhIG11bHRpcGxpZXIgdGFibGUgZm9yIGVhY2ggY29tcG9uZW50ICovCisgICAgY29tcHB0ci0+ZGN0X3RhYmxlID0KKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YobXVsdGlwbGllcl90YWJsZSkpOworICAgIE1FTVpFUk8oY29tcHB0ci0+ZGN0X3RhYmxlLCBTSVpFT0YobXVsdGlwbGllcl90YWJsZSkpOworICAgIC8qIE1hcmsgbXVsdGlwbGllciB0YWJsZSBub3QgeWV0IHNldCB1cCBmb3IgYW55IG1ldGhvZCAqLworICAgIGlkY3QtPmN1cl9tZXRob2RbY2ldID0gLTE7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pkaHVmZi5jIGIvY29tbW9uL2pwZWcvamRodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViYTM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pkaHVmZi5jCkBAIC0wLDAgKzEsNjUxIEBACisvKgorICogamRodWZmLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZGVjb2Rpbmcgcm91dGluZXMuCisgKgorICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgaW5wdXQgc3VzcGVuc2lvbi4KKyAqIElmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUgZGVtYW5kcyBzdXNwZW5zaW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gYmFjaworICogdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVS4gIFRvIGRvIHRoaXMsIHdlIGNvcHkgc3RhdGUgdmFyaWFibGVzCisgKiBpbnRvIGxvY2FsIHdvcmtpbmcgc3RvcmFnZSwgYW5kIHVwZGF0ZSB0aGVtIGJhY2sgdG8gdGhlIHBlcm1hbmVudAorICogc3RvcmFnZSBvbmx5IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGFuIE1DVS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamRwaHVmZi5jICovCisKKworLyoKKyAqIEV4cGFuZGVkIGVudHJvcHkgZGVjb2RlciBvYmplY3QgZm9yIEh1ZmZtYW4gZGVjb2RpbmcuCisgKgorICogVGhlIHNhdmFibGVfc3RhdGUgc3VicmVjb3JkIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGNoYW5nZSB3aXRoaW4gYW4gTUNVLAorICogYnV0IG11c3Qgbm90IGJlIHVwZGF0ZWQgcGVybWFuZW50bHkgdW50aWwgd2UgY29tcGxldGUgdGhlIE1DVS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBsYXN0X2RjX3ZhbFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIGxhc3QgREMgY29lZiBmb3IgZWFjaCBjb21wb25lbnQgKi8KK30gc2F2YWJsZV9zdGF0ZTsKKworLyogVGhpcyBtYWNybyBpcyB0byB3b3JrIGFyb3VuZCBjb21waWxlcnMgd2l0aCBtaXNzaW5nIG9yIGJyb2tlbgorICogc3RydWN0dXJlIGFzc2lnbm1lbnQuICBZb3UnbGwgbmVlZCB0byBmaXggdGhpcyBjb2RlIGlmIHlvdSBoYXZlCisgKiBzdWNoIGEgY29tcGlsZXIgYW5kIHlvdSBjaGFuZ2UgTUFYX0NPTVBTX0lOX1NDQU4uCisgKi8KKworI2lmbmRlZiBOT19TVFJVQ1RfQVNTSUdOCisjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgICgoZGVzdCkgPSAoc3JjKSkKKyNlbHNlCisjaWYgTUFYX0NPTVBTX0lOX1NDQU4gPT0gNAorI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICBcCisJKChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQorI2VuZGlmCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIGxvYWRlZCBpbnRvIGxvY2FsIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBlYWNoIE1DVS4KKyAgICogSW4gY2FzZSBvZiBzdXNwZW5zaW9uLCB3ZSBleGl0IFdJVEhPVVQgdXBkYXRpbmcgdGhlbS4KKyAgICovCisgIGJpdHJlYWRfcGVybV9zdGF0ZSBiaXRzdGF0ZTsJLyogQml0IGJ1ZmZlciBhdCBzdGFydCBvZiBNQ1UgKi8KKyAgc2F2YWJsZV9zdGF0ZSBzYXZlZDsJCS8qIE90aGVyIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworCisgIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCisgIGRfZGVyaXZlZF90YmwgKiBkY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisgIGRfZGVyaXZlZF90YmwgKiBhY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyAgLyogUHJlY2FsY3VsYXRlZCBpbmZvIHNldCB1cCBieSBzdGFydF9wYXNzIGZvciB1c2UgaW4gZGVjb2RlX21jdTogKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyB0byBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIHdpdGhpbiBhbiBNQ1UgKi8KKyAgZF9kZXJpdmVkX3RibCAqIGRjX2N1cl90YmxzW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworICBkX2Rlcml2ZWRfdGJsICogYWNfY3VyX3RibHNbRF9NQVhfQkxPQ0tTX0lOX01DVV07CisgIC8qIFdoZXRoZXIgd2UgY2FyZSBhYm91dCB0aGUgREMgYW5kIEFDIGNvZWZmaWNpZW50IHZhbHVlcyBmb3IgZWFjaCBibG9jayAqLworICBib29sZWFuIGRjX25lZWRlZFtEX01BWF9CTE9DS1NfSU5fTUNVXTsKKyAgYm9vbGVhbiBhY19uZWVkZWRbRF9NQVhfQkxPQ0tTX0lOX01DVV07Cit9IGh1ZmZfZW50cm9weV9kZWNvZGVyOworCit0eXBlZGVmIGh1ZmZfZW50cm9weV9kZWNvZGVyICogaHVmZl9lbnRyb3B5X3B0cjsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfaHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaSwgYmxrbiwgZGN0YmwsIGFjdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKworICAvKiBDaGVjayB0aGF0IHRoZSBzY2FuIHBhcmFtZXRlcnMgU3MsIFNlLCBBaC9BbCBhcmUgT0sgZm9yIHNlcXVlbnRpYWwgSlBFRy4KKyAgICogVGhpcyBvdWdodCB0byBiZSBhbiBlcnJvciBjb25kaXRpb24sIGJ1dCB3ZSBtYWtlIGl0IGEgd2FybmluZyBiZWNhdXNlCisgICAqIHRoZXJlIGFyZSBzb21lIGJhc2VsaW5lIGZpbGVzIG91dCB0aGVyZSB3aXRoIGFsbCB6ZXJvZXMgaW4gdGhlc2UgYnl0ZXMuCisgICAqLworICBpZiAoY2luZm8tPlNzICE9IDAgfHwgY2luZm8tPlNlICE9IERDVFNJWkUyLTEgfHwKKyAgICAgIGNpbmZvLT5BaCAhPSAwIHx8IGNpbmZvLT5BbCAhPSAwKQorICAgIFdBUk5NUyhjaW5mbywgSldSTl9OT1RfU0VRVUVOVElBTCk7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOworICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCisgICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIGEgdGFibGUsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUgKi8KKyAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgZGN0YmwsCisJCQkgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKKyAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgRkFMU0UsIGFjdGJsLAorCQkJICAgICYgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2FjdGJsXSk7CisgICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKKyAgfQorCisgIC8qIFByZWNhbGN1bGF0ZSBkZWNvZGluZyBpbmZvIGZvciBlYWNoIGJsb2NrIGluIGFuIE1DVSBvZiB0aGlzIHNjYW4gKi8KKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIC8qIFByZWNhbGN1bGF0ZSB3aGljaCB0YWJsZSB0byB1c2UgZm9yIGVhY2ggYmxvY2sgKi8KKyAgICBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXSA9IGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dOworICAgIGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmFjX3RibF9ub107CisgICAgLyogRGVjaWRlIHdoZXRoZXIgd2UgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyAqLworICAgIGlmIChjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisgICAgICBlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0gPSBUUlVFOworICAgICAgLyogd2UgZG9uJ3QgbmVlZCB0aGUgQUNzIGlmIHByb2R1Y2luZyBhIDEvOHRoLXNpemUgaW1hZ2UgKi8KKyAgICAgIGVudHJvcHktPmFjX25lZWRlZFtibGtuXSA9IChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPiAxKTsKKyAgICB9IGVsc2UgeworICAgICAgZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dID0gZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLworICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOworICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KKyAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IGNvdW50ZXIgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKK30KKworCisvKgorICogQ29tcHV0ZSB0aGUgZGVyaXZlZCB2YWx1ZXMgZm9yIGEgSHVmZm1hbiB0YWJsZS4KKyAqIFRoaXMgcm91dGluZSBhbHNvIHBlcmZvcm1zIHNvbWUgdmFsaWRhdGlvbiBjaGVja3Mgb24gdGhlIHRhYmxlLgorICoKKyAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamRwaHVmZi5jLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19tYWtlX2RfZGVyaXZlZF90YmwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAorCQkJIGRfZGVyaXZlZF90YmwgKiogcGR0YmwpCit7CisgIEpIVUZGX1RCTCAqaHRibDsKKyAgZF9kZXJpdmVkX3RibCAqZHRibDsKKyAgaW50IHAsIGksIGwsIHNpLCBudW1zeW1ib2xzOworICBpbnQgbG9va2JpdHMsIGN0cjsKKyAgY2hhciBodWZmc2l6ZVsyNTddOworICB1bnNpZ25lZCBpbnQgaHVmZmNvZGVbMjU3XTsKKyAgdW5zaWduZWQgaW50IGNvZGU7CisKKyAgLyogTm90ZSB0aGF0IGh1ZmZzaXplW10gYW5kIGh1ZmZjb2RlW10gYXJlIGZpbGxlZCBpbiBjb2RlLWxlbmd0aCBvcmRlciwKKyAgICogcGFyYWxsZWxpbmcgdGhlIG9yZGVyIG9mIHRoZSBzeW1ib2xzIHRoZW1zZWx2ZXMgaW4gaHRibC0+aHVmZnZhbFtdLgorICAgKi8KKworICAvKiBGaW5kIHRoZSBpbnB1dCBIdWZmbWFuIHRhYmxlICovCisgIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX0hVRkZfVEJMUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7CisgIGh0YmwgPQorICAgIGlzREMgPyBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0Ymxub10gOiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0Ymxub107CisgIGlmIChodGJsID09IE5VTEwpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOworCisgIC8qIEFsbG9jYXRlIGEgd29ya3NwYWNlIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLiAqLworICBpZiAoKnBkdGJsID09IE5VTEwpCisgICAgKnBkdGJsID0gKGRfZGVyaXZlZF90YmwgKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YoZF9kZXJpdmVkX3RibCkpOworICBkdGJsID0gKnBkdGJsOworICBkdGJsLT5wdWIgPSBodGJsOwkJLyogZmlsbCBpbiBiYWNrIGxpbmsgKi8KKyAgCisgIC8qIEZpZ3VyZSBDLjE6IG1ha2UgdGFibGUgb2YgSHVmZm1hbiBjb2RlIGxlbmd0aCBmb3IgZWFjaCBzeW1ib2wgKi8KKworICBwID0gMDsKKyAgZm9yIChsID0gMTsgbCA8PSAxNjsgbCsrKSB7CisgICAgaSA9IChpbnQpIGh0YmwtPmJpdHNbbF07CisgICAgaWYgKGkgPCAwIHx8IHAgKyBpID4gMjU2KQkvKiBwcm90ZWN0IGFnYWluc3QgdGFibGUgb3ZlcnJ1biAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7CisgICAgd2hpbGUgKGktLSkKKyAgICAgIGh1ZmZzaXplW3ArK10gPSAoY2hhcikgbDsKKyAgfQorICBodWZmc2l6ZVtwXSA9IDA7CisgIG51bXN5bWJvbHMgPSBwOworICAKKyAgLyogRmlndXJlIEMuMjogZ2VuZXJhdGUgdGhlIGNvZGVzIHRoZW1zZWx2ZXMgKi8KKyAgLyogV2UgYWxzbyB2YWxpZGF0ZSB0aGF0IHRoZSBjb3VudHMgcmVwcmVzZW50IGEgbGVnYWwgSHVmZm1hbiBjb2RlIHRyZWUuICovCisgIAorICBjb2RlID0gMDsKKyAgc2kgPSBodWZmc2l6ZVswXTsKKyAgcCA9IDA7CisgIHdoaWxlIChodWZmc2l6ZVtwXSkgeworICAgIHdoaWxlICgoKGludCkgaHVmZnNpemVbcF0pID09IHNpKSB7CisgICAgICBodWZmY29kZVtwKytdID0gY29kZTsKKyAgICAgIGNvZGUrKzsKKyAgICB9CisgICAgLyogY29kZSBpcyBub3cgMSBtb3JlIHRoYW4gdGhlIGxhc3QgY29kZSB1c2VkIGZvciBjb2RlbGVuZ3RoIHNpOyBidXQKKyAgICAgKiBpdCBtdXN0IHN0aWxsIGZpdCBpbiBzaSBiaXRzLCBzaW5jZSBubyBjb2RlIGlzIGFsbG93ZWQgdG8gYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgaWYgKCgoSU5UMzIpIGNvZGUpID49ICgoKElOVDMyKSAxKSA8PCBzaSkpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICBjb2RlIDw8PSAxOworICAgIHNpKys7CisgIH0KKworICAvKiBGaWd1cmUgRi4xNTogZ2VuZXJhdGUgZGVjb2RpbmcgdGFibGVzIGZvciBiaXQtc2VxdWVudGlhbCBkZWNvZGluZyAqLworCisgIHAgPSAwOworICBmb3IgKGwgPSAxOyBsIDw9IDE2OyBsKyspIHsKKyAgICBpZiAoaHRibC0+Yml0c1tsXSkgeworICAgICAgLyogdmFsb2Zmc2V0W2xdID0gaHVmZnZhbFtdIGluZGV4IG9mIDFzdCBzeW1ib2wgb2YgY29kZSBsZW5ndGggbCwKKyAgICAgICAqIG1pbnVzIHRoZSBtaW5pbXVtIGNvZGUgb2YgbGVuZ3RoIGwKKyAgICAgICAqLworICAgICAgZHRibC0+dmFsb2Zmc2V0W2xdID0gKElOVDMyKSBwIC0gKElOVDMyKSBodWZmY29kZVtwXTsKKyAgICAgIHAgKz0gaHRibC0+Yml0c1tsXTsKKyAgICAgIGR0YmwtPm1heGNvZGVbbF0gPSBodWZmY29kZVtwLTFdOyAvKiBtYXhpbXVtIGNvZGUgb2YgbGVuZ3RoIGwgKi8KKyAgICB9IGVsc2UgeworICAgICAgZHRibC0+bWF4Y29kZVtsXSA9IC0xOwkvKiAtMSBpZiBubyBjb2RlcyBvZiB0aGlzIGxlbmd0aCAqLworICAgIH0KKyAgfQorICBkdGJsLT5tYXhjb2RlWzE3XSA9IDB4RkZGRkZMOyAvKiBlbnN1cmVzIGpwZWdfaHVmZl9kZWNvZGUgdGVybWluYXRlcyAqLworCisgIC8qIENvbXB1dGUgbG9va2FoZWFkIHRhYmxlcyB0byBzcGVlZCB1cCBkZWNvZGluZy4KKyAgICogRmlyc3Qgd2Ugc2V0IGFsbCB0aGUgdGFibGUgZW50cmllcyB0byAwLCBpbmRpY2F0aW5nICJ0b28gbG9uZyI7CisgICAqIHRoZW4gd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBIdWZmbWFuIGNvZGVzIHRoYXQgYXJlIHNob3J0IGVub3VnaCBhbmQKKyAgICogZmlsbCBpbiBhbGwgdGhlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kIHRvIGJpdCBzZXF1ZW5jZXMgc3RhcnRpbmcKKyAgICogd2l0aCB0aGF0IGNvZGUuCisgICAqLworCisgIE1FTVpFUk8oZHRibC0+bG9va19uYml0cywgU0laRU9GKGR0YmwtPmxvb2tfbmJpdHMpKTsKKworICBwID0gMDsKKyAgZm9yIChsID0gMTsgbCA8PSBIVUZGX0xPT0tBSEVBRDsgbCsrKSB7CisgICAgZm9yIChpID0gMTsgaSA8PSAoaW50KSBodGJsLT5iaXRzW2xdOyBpKyssIHArKykgeworICAgICAgLyogbCA9IGN1cnJlbnQgY29kZSdzIGxlbmd0aCwgcCA9IGl0cyBpbmRleCBpbiBodWZmY29kZVtdICYgaHVmZnZhbFtdLiAqLworICAgICAgLyogR2VuZXJhdGUgbGVmdC1qdXN0aWZpZWQgY29kZSBmb2xsb3dlZCBieSBhbGwgcG9zc2libGUgYml0IHNlcXVlbmNlcyAqLworICAgICAgbG9va2JpdHMgPSBodWZmY29kZVtwXSA8PCAoSFVGRl9MT09LQUhFQUQtbCk7CisgICAgICBmb3IgKGN0ciA9IDEgPDwgKEhVRkZfTE9PS0FIRUFELWwpOyBjdHIgPiAwOyBjdHItLSkgeworCWR0YmwtPmxvb2tfbmJpdHNbbG9va2JpdHNdID0gbDsKKwlkdGJsLT5sb29rX3N5bVtsb29rYml0c10gPSBodGJsLT5odWZmdmFsW3BdOworCWxvb2tiaXRzKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogVmFsaWRhdGUgc3ltYm9scyBhcyBiZWluZyByZWFzb25hYmxlLgorICAgKiBGb3IgQUMgdGFibGVzLCB3ZSBtYWtlIG5vIGNoZWNrLCBidXQgYWNjZXB0IGFsbCBieXRlIHZhbHVlcyAwLi4yNTUuCisgICAqIEZvciBEQyB0YWJsZXMsIHdlIHJlcXVpcmUgdGhlIHN5bWJvbHMgdG8gYmUgaW4gcmFuZ2UgMC4uMTUuCisgICAqIChUaWdodGVyIGJvdW5kcyBjb3VsZCBiZSBhcHBsaWVkIGRlcGVuZGluZyBvbiB0aGUgZGF0YSBkZXB0aCBhbmQgbW9kZSwKKyAgICogYnV0IHRoaXMgaXMgc3VmZmljaWVudCB0byBlbnN1cmUgc2FmZSBkZWNvZGluZy4pCisgICAqLworICBpZiAoaXNEQykgeworICAgIGZvciAoaSA9IDA7IGkgPCBudW1zeW1ib2xzOyBpKyspIHsKKyAgICAgIGludCBzeW0gPSBodGJsLT5odWZmdmFsW2ldOworICAgICAgaWYgKHN5bSA8IDAgfHwgc3ltID4gMTUpCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIE91dC1vZi1saW5lIGNvZGUgZm9yIGJpdCBmZXRjaGluZyAoc2hhcmVkIHdpdGggamRwaHVmZi5jKS4KKyAqIFNlZSBqZGh1ZmYuaCBmb3IgaW5mbyBhYm91dCB1c2FnZS4KKyAqIE5vdGU6IGN1cnJlbnQgdmFsdWVzIG9mIGdldF9idWZmZXIgYW5kIGJpdHNfbGVmdCBhcmUgcGFzc2VkIGFzIHBhcmFtZXRlcnMsCisgKiBidXQgYXJlIHJldHVybmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBvZiB0aGUgc3RhdGUgc3RydWN0LgorICoKKyAqIE9uIG1vc3QgbWFjaGluZXMgTUlOX0dFVF9CSVRTIHNob3VsZCBiZSAyNSB0byBhbGxvdyB0aGUgZnVsbCAzMi1iaXQgd2lkdGgKKyAqIG9mIGdldF9idWZmZXIgdG8gYmUgdXNlZC4gIChPbiBtYWNoaW5lcyB3aXRoIHdpZGVyIHdvcmRzLCBhbiBldmVuIGxhcmdlcgorICogYnVmZmVyIGNvdWxkIGJlIHVzZWQuKSAgSG93ZXZlciwgb24gc29tZSBtYWNoaW5lcyAzMi1iaXQgc2hpZnRzIGFyZQorICogcXVpdGUgc2xvdyBhbmQgdGFrZSB0aW1lIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIHBsYWNlcyBzaGlmdGVkLgorICogKFRoaXMgaXMgdHJ1ZSB3aXRoIG1vc3QgUEMgY29tcGlsZXJzLCBmb3IgaW5zdGFuY2UuKSAgSW4gdGhpcyBjYXNlIGl0IG1heQorICogYmUgYSB3aW4gdG8gc2V0IE1JTl9HRVRfQklUUyB0byB0aGUgbWluaW11bSB2YWx1ZSBvZiAxNS4gIFRoaXMgcmVkdWNlcyB0aGUKKyAqIGF2ZXJhZ2Ugc2hpZnQgZGlzdGFuY2UgYXQgdGhlIGNvc3Qgb2YgbW9yZSBjYWxscyB0byBqcGVnX2ZpbGxfYml0X2J1ZmZlci4KKyAqLworCisjaWZkZWYgU0xPV19TSElGVF8zMgorI2RlZmluZSBNSU5fR0VUX0JJVFMgIDE1CS8qIG1pbmltdW0gYWxsb3dhYmxlIHZhbHVlICovCisjZWxzZQorI2RlZmluZSBNSU5fR0VUX0JJVFMgIChCSVRfQlVGX1NJWkUtNykKKyNlbmRpZgorCisKK0dMT0JBTChib29sZWFuKQoranBlZ19maWxsX2JpdF9idWZmZXIgKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLAorCQkgICAgICByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwKKwkJICAgICAgaW50IG5iaXRzKQorLyogTG9hZCB1cCB0aGUgYml0IGJ1ZmZlciB0byBhIGRlcHRoIG9mIGF0IGxlYXN0IG5iaXRzICovCit7CisgIC8qIENvcHkgaGVhdmlseSB1c2VkIHN0YXRlIGZpZWxkcyBpbnRvIGxvY2FscyAoaG9wZWZ1bGx5IHJlZ2lzdGVycykgKi8KKyAgcmVnaXN0ZXIgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlID0gc3RhdGUtPm5leHRfaW5wdXRfYnl0ZTsKKyAgcmVnaXN0ZXIgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlciA9IHN0YXRlLT5ieXRlc19pbl9idWZmZXI7CisgIGpfZGVjb21wcmVzc19wdHIgY2luZm8gPSBzdGF0ZS0+Y2luZm87CisKKyAgLyogQXR0ZW1wdCB0byBsb2FkIGF0IGxlYXN0IE1JTl9HRVRfQklUUyBiaXRzIGludG8gZ2V0X2J1ZmZlci4gKi8KKyAgLyogKEl0IGlzIGFzc3VtZWQgdGhhdCBubyByZXF1ZXN0IHdpbGwgYmUgZm9yIG1vcmUgdGhhbiB0aGF0IG1hbnkgYml0cy4pICovCisgIC8qIFdlIGZhaWwgdG8gZG8gc28gb25seSBpZiB3ZSBoaXQgYSBtYXJrZXIgb3IgYXJlIGZvcmNlZCB0byBzdXNwZW5kLiAqLworCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7CS8qIGNhbm5vdCBhZHZhbmNlIHBhc3QgYSBtYXJrZXIgKi8KKyAgICB3aGlsZSAoYml0c19sZWZ0IDwgTUlOX0dFVF9CSVRTKSB7CisgICAgICByZWdpc3RlciBpbnQgYzsKKworICAgICAgLyogQXR0ZW1wdCB0byByZWFkIGEgYnl0ZSAqLworICAgICAgaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7CisJaWYgKCEgKCpjaW5mby0+c3JjLT5maWxsX2lucHV0X2J1ZmZlcikgKGNpbmZvKSkKKwkgIHJldHVybiBGQUxTRTsKKwluZXh0X2lucHV0X2J5dGUgPSBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGU7CisJYnl0ZXNfaW5fYnVmZmVyID0gY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyOworICAgICAgfQorICAgICAgYnl0ZXNfaW5fYnVmZmVyLS07CisgICAgICBjID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7CisKKyAgICAgIC8qIElmIGl0J3MgMHhGRiwgY2hlY2sgYW5kIGRpc2NhcmQgc3R1ZmZlZCB6ZXJvIGJ5dGUgKi8KKyAgICAgIGlmIChjID09IDB4RkYpIHsKKwkvKiBMb29wIGhlcmUgdG8gZGlzY2FyZCBhbnkgcGFkZGluZyBGRidzIG9uIHRlcm1pbmF0aW5nIG1hcmtlciwKKwkgKiBzbyB0aGF0IHdlIGNhbiBzYXZlIGEgdmFsaWQgdW5yZWFkX21hcmtlciB2YWx1ZS4gIE5PVEU6IHdlIHdpbGwKKwkgKiBhY2NlcHQgbXVsdGlwbGUgRkYncyBmb2xsb3dlZCBieSBhIDAgYXMgbWVhbmluZyBhIHNpbmdsZSBGRiBkYXRhCisJICogYnl0ZS4gIFRoaXMgZGF0YSBwYXR0ZXJuIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkLgorCSAqLworCWRvIHsKKwkgIGlmIChieXRlc19pbl9idWZmZXIgPT0gMCkgeworCSAgICBpZiAoISAoKmNpbmZvLT5zcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKQorCSAgICAgIHJldHVybiBGQUxTRTsKKwkgICAgbmV4dF9pbnB1dF9ieXRlID0gY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlOworCSAgICBieXRlc19pbl9idWZmZXIgPSBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7CisJICB9CisJICBieXRlc19pbl9idWZmZXItLTsKKwkgIGMgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsKKwl9IHdoaWxlIChjID09IDB4RkYpOworCisJaWYgKGMgPT0gMCkgeworCSAgLyogRm91bmQgRkYvMDAsIHdoaWNoIHJlcHJlc2VudHMgYW4gRkYgZGF0YSBieXRlICovCisJICBjID0gMHhGRjsKKwl9IGVsc2UgeworCSAgLyogT29wcywgaXQncyBhY3R1YWxseSBhIG1hcmtlciBpbmRpY2F0aW5nIGVuZCBvZiBjb21wcmVzc2VkIGRhdGEuCisJICAgKiBTYXZlIHRoZSBtYXJrZXIgY29kZSBmb3IgbGF0ZXIgdXNlLgorCSAgICogRmluZSBwb2ludDogaXQgbWlnaHQgYXBwZWFyIHRoYXQgd2Ugc2hvdWxkIHNhdmUgdGhlIG1hcmtlciBpbnRvCisJICAgKiBiaXRyZWFkIHdvcmtpbmcgc3RhdGUsIG5vdCBzdHJhaWdodCBpbnRvIHBlcm1hbmVudCBzdGF0ZS4gIEJ1dAorCSAgICogb25jZSB3ZSBoYXZlIGhpdCBhIG1hcmtlciwgd2UgY2Fubm90IG5lZWQgdG8gc3VzcGVuZCB3aXRoaW4gdGhlCisJICAgKiBjdXJyZW50IE1DVSwgYmVjYXVzZSB3ZSB3aWxsIHJlYWQgbm8gbW9yZSBieXRlcyBmcm9tIHRoZSBkYXRhCisJICAgKiBzb3VyY2UuICBTbyBpdCBpcyBPSyB0byB1cGRhdGUgcGVybWFuZW50IHN0YXRlIHJpZ2h0IGF3YXkuCisJICAgKi8KKwkgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gYzsKKwkgIC8qIFNlZSBpZiB3ZSBuZWVkIHRvIGluc2VydCBzb21lIGZha2UgemVybyBiaXRzLiAqLworCSAgZ290byBub19tb3JlX2J5dGVzOworCX0KKyAgICAgIH0KKworICAgICAgLyogT0ssIGxvYWQgYyBpbnRvIGdldF9idWZmZXIgKi8KKyAgICAgIGdldF9idWZmZXIgPSAoZ2V0X2J1ZmZlciA8PCA4KSB8IGM7CisgICAgICBiaXRzX2xlZnQgKz0gODsKKyAgICB9IC8qIGVuZCB3aGlsZSAqLworICB9IGVsc2UgeworICBub19tb3JlX2J5dGVzOgorICAgIC8qIFdlIGdldCBoZXJlIGlmIHdlJ3ZlIHJlYWQgdGhlIG1hcmtlciB0aGF0IHRlcm1pbmF0ZXMgdGhlIGNvbXByZXNzZWQKKyAgICAgKiBkYXRhIHNlZ21lbnQuICBUaGVyZSBzaG91bGQgYmUgZW5vdWdoIGJpdHMgaW4gdGhlIGJ1ZmZlciByZWdpc3RlcgorICAgICAqIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3Q7IGlmIHNvLCBubyBwcm9ibGVtLgorICAgICAqLworICAgIGlmIChuYml0cyA+IGJpdHNfbGVmdCkgeworICAgICAgLyogVWgtb2guICBSZXBvcnQgY29ycnVwdGVkIGRhdGEgdG8gdXNlciBhbmQgc3R1ZmYgemVyb2VzIGludG8KKyAgICAgICAqIHRoZSBkYXRhIHN0cmVhbSwgc28gdGhhdCB3ZSBjYW4gcHJvZHVjZSBzb21lIGtpbmQgb2YgaW1hZ2UuCisgICAgICAgKiBXZSB1c2UgYSBub252b2xhdGlsZSBmbGFnIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIHdhcm5pbmcgbWVzc2FnZQorICAgICAgICogYXBwZWFycyBwZXIgZGF0YSBzZWdtZW50LgorICAgICAgICovCisgICAgICBpZiAoISBjaW5mby0+ZW50cm9weS0+aW5zdWZmaWNpZW50X2RhdGEpIHsKKwlXQVJOTVMoY2luZm8sIEpXUk5fSElUX01BUktFUik7CisJY2luZm8tPmVudHJvcHktPmluc3VmZmljaWVudF9kYXRhID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIC8qIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHplcm8gYml0cyAqLworICAgICAgZ2V0X2J1ZmZlciA8PD0gTUlOX0dFVF9CSVRTIC0gYml0c19sZWZ0OworICAgICAgYml0c19sZWZ0ID0gTUlOX0dFVF9CSVRTOworICAgIH0KKyAgfQorCisgIC8qIFVubG9hZCB0aGUgbG9jYWwgcmVnaXN0ZXJzICovCisgIHN0YXRlLT5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGU7CisgIHN0YXRlLT5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXI7CisgIHN0YXRlLT5nZXRfYnVmZmVyID0gZ2V0X2J1ZmZlcjsKKyAgc3RhdGUtPmJpdHNfbGVmdCA9IGJpdHNfbGVmdDsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogT3V0LW9mLWxpbmUgY29kZSBmb3IgSHVmZm1hbiBjb2RlIGRlY29kaW5nLgorICogU2VlIGpkaHVmZi5oIGZvciBpbmZvIGFib3V0IHVzYWdlLgorICovCisKK0dMT0JBTChpbnQpCitqcGVnX2h1ZmZfZGVjb2RlIChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwKKwkJICByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwKKwkJICBkX2Rlcml2ZWRfdGJsICogaHRibCwgaW50IG1pbl9iaXRzKQoreworICByZWdpc3RlciBpbnQgbCA9IG1pbl9iaXRzOworICByZWdpc3RlciBJTlQzMiBjb2RlOworCisgIC8qIEhVRkZfREVDT0RFIGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGNvZGUgaXMgYXQgbGVhc3QgbWluX2JpdHMgKi8KKyAgLyogYml0cyBsb25nLCBzbyBmZXRjaCB0aGF0IG1hbnkgYml0cyBpbiBvbmUgc3dvb3AuICovCisKKyAgQ0hFQ0tfQklUX0JVRkZFUigqc3RhdGUsIGwsIHJldHVybiAtMSk7CisgIGNvZGUgPSBHRVRfQklUUyhsKTsKKworICAvKiBDb2xsZWN0IHRoZSByZXN0IG9mIHRoZSBIdWZmbWFuIGNvZGUgb25lIGJpdCBhdCBhIHRpbWUuICovCisgIC8qIFRoaXMgaXMgcGVyIEZpZ3VyZSBGLjE2IGluIHRoZSBKUEVHIHNwZWMuICovCisKKyAgd2hpbGUgKGNvZGUgPiBodGJsLT5tYXhjb2RlW2xdKSB7CisgICAgY29kZSA8PD0gMTsKKyAgICBDSEVDS19CSVRfQlVGRkVSKCpzdGF0ZSwgMSwgcmV0dXJuIC0xKTsKKyAgICBjb2RlIHw9IEdFVF9CSVRTKDEpOworICAgIGwrKzsKKyAgfQorCisgIC8qIFVubG9hZCB0aGUgbG9jYWwgcmVnaXN0ZXJzICovCisgIHN0YXRlLT5nZXRfYnVmZmVyID0gZ2V0X2J1ZmZlcjsKKyAgc3RhdGUtPmJpdHNfbGVmdCA9IGJpdHNfbGVmdDsKKworICAvKiBXaXRoIGdhcmJhZ2UgaW5wdXQgd2UgbWF5IHJlYWNoIHRoZSBzZW50aW5lbCB2YWx1ZSBsID0gMTcuICovCisKKyAgaWYgKGwgPiAxNikgeworICAgIFdBUk5NUyhzdGF0ZS0+Y2luZm8sIEpXUk5fSFVGRl9CQURfQ09ERSk7CisgICAgcmV0dXJuIDA7CQkJLyogZmFrZSBhIHplcm8gYXMgdGhlIHNhZmVzdCByZXN1bHQgKi8KKyAgfQorCisgIHJldHVybiBodGJsLT5wdWItPmh1ZmZ2YWxbIChpbnQpIChjb2RlICsgaHRibC0+dmFsb2Zmc2V0W2xdKSBdOworfQorCisKKy8qCisgKiBGaWd1cmUgRi4xMjogZXh0ZW5kIHNpZ24gYml0LgorICogT24gc29tZSBtYWNoaW5lcywgYSBzaGlmdCBhbmQgYWRkIHdpbGwgYmUgZmFzdGVyIHRoYW4gYSB0YWJsZSBsb29rdXAuCisgKi8KKworI2lmZGVmIEFWT0lEX1RBQkxFUworCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCAoMTw8KChzKS0xKSkgPyAoeCkgKyAoKCgtMSk8PChzKSkgKyAxKSA6ICh4KSkKKworI2Vsc2UKKworI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgZXh0ZW5kX3Rlc3Rbc10gPyAoeCkgKyBleHRlbmRfb2Zmc2V0W3NdIDogKHgpKQorCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF90ZXN0WzE2XSA9ICAgLyogZW50cnkgbiBpcyAyKioobi0xKSAqLworICB7IDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAorICAgIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCB9OworCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF9vZmZzZXRbMTZdID0gLyogZW50cnkgbiBpcyAoLTEgPDwgbikgKyAxICovCisgIHsgMCwgKCgtMSk8PDEpICsgMSwgKCgtMSk8PDIpICsgMSwgKCgtMSk8PDMpICsgMSwgKCgtMSk8PDQpICsgMSwKKyAgICAoKC0xKTw8NSkgKyAxLCAoKC0xKTw8NikgKyAxLCAoKC0xKTw8NykgKyAxLCAoKC0xKTw8OCkgKyAxLAorICAgICgoLTEpPDw5KSArIDEsICgoLTEpPDwxMCkgKyAxLCAoKC0xKTw8MTEpICsgMSwgKCgtMSk8PDEyKSArIDEsCisgICAgKCgtMSk8PDEzKSArIDEsICgoLTEpPDwxNCkgKyAxLCAoKC0xKTw8MTUpICsgMSB9OworCisjZW5kaWYgLyogQVZPSURfVEFCTEVTICovCisKKworLyoKKyAqIENoZWNrIGZvciBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBkZWNvZGVyLgorICogUmV0dXJucyBGQUxTRSBpZiBtdXN0IHN1c3BlbmQuCisgKi8KKworTE9DQUwoYm9vbGVhbikKK3Byb2Nlc3NfcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgY2k7CisKKyAgLyogVGhyb3cgYXdheSBhbnkgdW51c2VkIGJpdHMgcmVtYWluaW5nIGluIGJpdCBidWZmZXI7ICovCisgIC8qIGluY2x1ZGUgYW55IGZ1bGwgYnl0ZXMgaW4gbmV4dF9tYXJrZXIncyBjb3VudCBvZiBkaXNjYXJkZWQgYnl0ZXMgKi8KKyAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICs9IGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCAvIDg7CisgIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCA9IDA7CisKKyAgLyogQWR2YW5jZSBwYXN0IHRoZSBSU1RuIG1hcmtlciAqLworICBpZiAoISAoKmNpbmZvLT5tYXJrZXItPnJlYWRfcmVzdGFydF9tYXJrZXIpIChjaW5mbykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworCisgIC8qIFJlc2V0IHJlc3RhcnQgY291bnRlciAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworCisgIC8qIFJlc2V0IG91dC1vZi1kYXRhIGZsYWcsIHVubGVzcyByZWFkX3Jlc3RhcnRfbWFya2VyIGxlZnQgdXMgc21hY2sgdXAKKyAgICogYWdhaW5zdCBhIG1hcmtlci4gIEluIHRoYXQgY2FzZSB3ZSB3aWxsIGVuZCB1cCB0cmVhdGluZyB0aGUgbmV4dCBkYXRhCisgICAqIHNlZ21lbnQgYXMgZW1wdHksIGFuZCB3ZSBjYW4gYXZvaWQgcHJvZHVjaW5nIGJvZ3VzIG91dHB1dCBwaXhlbHMgYnkKKyAgICogbGVhdmluZyB0aGUgZmxhZyBzZXQuCisgICAqLworICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkKKyAgICBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEgPSBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRGVjb2RlIGFuZCByZXR1cm4gb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCisgKiBUaGUgY29lZmZpY2llbnRzIGFyZSByZW9yZGVyZWQgZnJvbSB6aWd6YWcgb3JkZXIgaW50byBuYXR1cmFsIGFycmF5IG9yZGVyLAorICogYnV0IGFyZSBub3QgZGVxdWFudGl6ZWQuCisgKgorICogVGhlIGkndGggYmxvY2sgb2YgdGhlIE1DVSBpcyBzdG9yZWQgaW50byB0aGUgYmxvY2sgcG9pbnRlZCB0byBieQorICogTUNVX2RhdGFbaV0uICBXRSBBU1NVTUUgVEhJUyBBUkVBIEhBUyBCRUVOIFpFUk9FRCBCWSBUSEUgQ0FMTEVSLgorICogKFdob2xlc2FsZSB6ZXJvaW5nIGlzIHVzdWFsbHkgYSBsaXR0bGUgZmFzdGVyIHRoYW4gcmV0YWlsLi4uKQorICoKKyAqIFJldHVybnMgRkFMU0UgaWYgZGF0YSBzb3VyY2UgcmVxdWVzdGVkIHN1c3BlbnNpb24uICBJbiB0aGF0IGNhc2Ugbm8KKyAqIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcGVybWFuZW50IHN0YXRlLiAgKEV4Y2VwdGlvbjogc29tZSBvdXRwdXQKKyAqIGNvZWZmaWNpZW50cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYXNzaWduZWQuICBUaGlzIGlzIGhhcm1sZXNzIGZvcgorICogdGhpcyBtb2R1bGUsIHNpbmNlIHdlJ2xsIGp1c3QgcmUtYXNzaWduIHRoZW0gb24gdGhlIG5leHQgY2FsbC4pCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitkZWNvZGVfbWN1IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBibGtuOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIHNhdmFibGVfc3RhdGUgc3RhdGU7CisKKyAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCisgICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEFTU0lHTl9TVEFURShzdGF0ZSwgZW50cm9weS0+c2F2ZWQpOworCisgICAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLworCisgICAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICAgIEpCTE9DS1JPVyBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworICAgICAgZF9kZXJpdmVkX3RibCAqIGRjdGJsID0gZW50cm9weS0+ZGNfY3VyX3RibHNbYmxrbl07CisgICAgICBkX2Rlcml2ZWRfdGJsICogYWN0YmwgPSBlbnRyb3B5LT5hY19jdXJfdGJsc1tibGtuXTsKKyAgICAgIHJlZ2lzdGVyIGludCBzLCBrLCByOworCisgICAgICAvKiBEZWNvZGUgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KKworICAgICAgLyogU2VjdGlvbiBGLjIuMi4xOiBkZWNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgKi8KKyAgICAgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBkY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDEpOworICAgICAgaWYgKHMpIHsKKwlDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCXIgPSBHRVRfQklUUyhzKTsKKwlzID0gSFVGRl9FWFRFTkQociwgcyk7CisgICAgICB9CisKKyAgICAgIGlmIChlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0pIHsKKwkvKiBDb252ZXJ0IERDIGRpZmZlcmVuY2UgdG8gYWN0dWFsIHZhbHVlLCB1cGRhdGUgbGFzdF9kY192YWwgKi8KKwlpbnQgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisJcyArPSBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV07CisJc3RhdGUubGFzdF9kY192YWxbY2ldID0gczsKKwkvKiBPdXRwdXQgdGhlIERDIGNvZWZmaWNpZW50IChhc3N1bWVzIGpwZWdfbmF0dXJhbF9vcmRlclswXSA9IDApICovCisJKCpibG9jaylbMF0gPSAoSkNPRUYpIHM7CisgICAgICB9CisKKyAgICAgIGlmIChlbnRyb3B5LT5hY19uZWVkZWRbYmxrbl0pIHsKKworCS8qIFNlY3Rpb24gRi4yLjIuMjogZGVjb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgKi8KKwkvKiBTaW5jZSB6ZXJvZXMgYXJlIHNraXBwZWQsIG91dHB1dCBhcmVhIG11c3QgYmUgY2xlYXJlZCBiZWZvcmVoYW5kICovCisJZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKKwkgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBhY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDIpOworICAgICAgCisJICByID0gcyA+PiA0OworCSAgcyAmPSAxNTsKKyAgICAgIAorCSAgaWYgKHMpIHsKKwkgICAgayArPSByOworCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCSAgICByID0gR0VUX0JJVFMocyk7CisJICAgIHMgPSBIVUZGX0VYVEVORChyLCBzKTsKKwkgICAgLyogT3V0cHV0IGNvZWZmaWNpZW50IGluIG5hdHVyYWwgKGRlemlnemFnZ2VkKSBvcmRlci4KKwkgICAgICogTm90ZTogdGhlIGV4dHJhIGVudHJpZXMgaW4ganBlZ19uYXR1cmFsX29yZGVyW10gd2lsbCBzYXZlIHVzCisJICAgICAqIGlmIGsgPj0gRENUU0laRTIsIHdoaWNoIGNvdWxkIGhhcHBlbiBpZiB0aGUgZGF0YSBpcyBjb3JydXB0ZWQuCisJICAgICAqLworCSAgICAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dID0gKEpDT0VGKSBzOworCSAgfSBlbHNlIHsKKwkgICAgaWYgKHIgIT0gMTUpCisJICAgICAgYnJlYWs7CisJICAgIGsgKz0gMTU7CisJICB9CisJfQorCisgICAgICB9IGVsc2UgeworCisJLyogU2VjdGlvbiBGLjIuMi4yOiBkZWNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyAqLworCS8qIEluIHRoaXMgcGF0aCB3ZSBqdXN0IGRpc2NhcmQgdGhlIHZhbHVlcyAqLworCWZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisJICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgYWN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwzKTsKKyAgICAgIAorCSAgciA9IHMgPj4gNDsKKwkgIHMgJj0gMTU7CisgICAgICAKKwkgIGlmIChzKSB7CisJICAgIGsgKz0gcjsKKwkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwkgICAgRFJPUF9CSVRTKHMpOworCSAgfSBlbHNlIHsKKwkgICAgaWYgKHIgIT0gMTUpCisJICAgICAgYnJlYWs7CisJICAgIGsgKz0gMTU7CisJICB9CisJfQorCisgICAgICB9CisgICAgfQorCisgICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlKTsKKyAgfQorCisgIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZy4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2h1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OworICBpbnQgaTsKKworICBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YoaHVmZl9lbnRyb3B5X2RlY29kZXIpKTsKKyAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICopIGVudHJvcHk7CisgIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19odWZmX2RlY29kZXI7CisgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdTsKKworICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2ldID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamRodWZmLmggYi9jb21tb24vanBlZy9qZGh1ZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE5YjZjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamRodWZmLmgKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBqZGh1ZmYuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9ucyBmb3IgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzCisgKiB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgc2VxdWVudGlhbCBkZWNvZGVyIChqZGh1ZmYuYykgYW5kIHRoZQorICogcHJvZ3Jlc3NpdmUgZGVjb2RlciAoamRwaHVmZi5jKS4gIE5vIG90aGVyIG1vZHVsZXMgbmVlZCB0byBzZWUgdGhlc2UuCisgKi8KKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsCWpNa0REZXJpdmVkCisjZGVmaW5lIGpwZWdfZmlsbF9iaXRfYnVmZmVyCWpGaWxCaXRCdWYKKyNkZWZpbmUganBlZ19odWZmX2RlY29kZQlqSHVmRGVjb2RlCisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCisKKy8qIERlcml2ZWQgZGF0YSBjb25zdHJ1Y3RlZCBmb3IgZWFjaCBIdWZmbWFuIHRhYmxlICovCisKKyNkZWZpbmUgSFVGRl9MT09LQUhFQUQJOAkvKiAjIG9mIGJpdHMgb2YgbG9va2FoZWFkICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogQmFzaWMgdGFibGVzOiAoZWxlbWVudCBbMF0gb2YgZWFjaCBhcnJheSBpcyB1bnVzZWQpICovCisgIElOVDMyIG1heGNvZGVbMThdOwkJLyogbGFyZ2VzdCBjb2RlIG9mIGxlbmd0aCBrICgtMSBpZiBub25lKSAqLworICAvKiAobWF4Y29kZVsxN10gaXMgYSBzZW50aW5lbCB0byBlbnN1cmUganBlZ19odWZmX2RlY29kZSB0ZXJtaW5hdGVzKSAqLworICBJTlQzMiB2YWxvZmZzZXRbMTddOwkJLyogaHVmZnZhbFtdIG9mZnNldCBmb3IgY29kZXMgb2YgbGVuZ3RoIGsgKi8KKyAgLyogdmFsb2Zmc2V0W2tdID0gaHVmZnZhbFtdIGluZGV4IG9mIDFzdCBzeW1ib2wgb2YgY29kZSBsZW5ndGggaywgbGVzcworICAgKiB0aGUgc21hbGxlc3QgY29kZSBvZiBsZW5ndGggazsgc28gZ2l2ZW4gYSBjb2RlIG9mIGxlbmd0aCBrLCB0aGUKKyAgICogY29ycmVzcG9uZGluZyBzeW1ib2wgaXMgaHVmZnZhbFtjb2RlICsgdmFsb2Zmc2V0W2tdXQorICAgKi8KKworICAvKiBMaW5rIHRvIHB1YmxpYyBIdWZmbWFuIHRhYmxlIChuZWVkZWQgb25seSBpbiBqcGVnX2h1ZmZfZGVjb2RlKSAqLworICBKSFVGRl9UQkwgKnB1YjsKKworICAvKiBMb29rYWhlYWQgdGFibGVzOiBpbmRleGVkIGJ5IHRoZSBuZXh0IEhVRkZfTE9PS0FIRUFEIGJpdHMgb2YKKyAgICogdGhlIGlucHV0IGRhdGEgc3RyZWFtLiAgSWYgdGhlIG5leHQgSHVmZm1hbiBjb2RlIGlzIG5vIG1vcmUKKyAgICogdGhhbiBIVUZGX0xPT0tBSEVBRCBiaXRzIGxvbmcsIHdlIGNhbiBvYnRhaW4gaXRzIGxlbmd0aCBhbmQKKyAgICogdGhlIGNvcnJlc3BvbmRpbmcgc3ltYm9sIGRpcmVjdGx5IGZyb20gdGhlc2UgdGFibGVzLgorICAgKi8KKyAgaW50IGxvb2tfbmJpdHNbMTw8SFVGRl9MT09LQUhFQURdOyAvKiAjIGJpdHMsIG9yIDAgaWYgdG9vIGxvbmcgKi8KKyAgVUlOVDggbG9va19zeW1bMTw8SFVGRl9MT09LQUhFQURdOyAvKiBzeW1ib2wsIG9yIHVudXNlZCAqLworfSBkX2Rlcml2ZWRfdGJsOworCisvKiBFeHBhbmQgYSBIdWZmbWFuIHRhYmxlIGRlZmluaXRpb24gaW50byB0aGUgZGVyaXZlZCBmb3JtYXQgKi8KK0VYVEVSTih2b2lkKSBqcGVnX21ha2VfZF9kZXJpdmVkX3RibAorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCisJICAgICBkX2Rlcml2ZWRfdGJsICoqIHBkdGJsKSk7CisKKworLyoKKyAqIEZldGNoaW5nIHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gaXMgYSB0aW1lLWNyaXRpY2FsIG9wZXJhdGlvbgorICogZm9yIHRoZSBIdWZmbWFuIGRlY29kZXJzLiAgV2UgaW1wbGVtZW50IGl0IHdpdGggYSBjb21iaW5hdGlvbiBvZiBpbmxpbmUKKyAqIG1hY3JvcyBhbmQgb3V0LW9mLWxpbmUgc3Vicm91dGluZXMuICBOb3RlIHRoYXQgTiAodGhlIG51bWJlciBvZiBiaXRzCisgKiBkZW1hbmRlZCBhdCBvbmUgdGltZSkgbmV2ZXIgZXhjZWVkcyAxNSBmb3IgSlBFRyB1c2UuCisgKgorICogV2UgcmVhZCBzb3VyY2UgYnl0ZXMgaW50byBnZXRfYnVmZmVyIGFuZCBkb2xlIG91dCBiaXRzIGFzIG5lZWRlZC4KKyAqIElmIGdldF9idWZmZXIgYWxyZWFkeSBjb250YWlucyBlbm91Z2ggYml0cywgdGhleSBhcmUgZmV0Y2hlZCBpbi1saW5lCisgKiBieSB0aGUgbWFjcm9zIENIRUNLX0JJVF9CVUZGRVIgYW5kIEdFVF9CSVRTLiAgV2hlbiB0aGVyZSBhcmVuJ3QgZW5vdWdoCisgKiBiaXRzLCBqcGVnX2ZpbGxfYml0X2J1ZmZlciBpcyBjYWxsZWQ7IGl0IHdpbGwgYXR0ZW1wdCB0byBmaWxsIGdldF9idWZmZXIKKyAqIGFzIGZ1bGwgYXMgcG9zc2libGUgKG5vdCBqdXN0IHRvIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQ7IHRoaXMKKyAqIHByZWZldGNoaW5nIHJlZHVjZXMgdGhlIG92ZXJoZWFkIGNvc3Qgb2YgY2FsbGluZyBqcGVnX2ZpbGxfYml0X2J1ZmZlcikuCisgKiBOb3RlIHRoYXQganBlZ19maWxsX2JpdF9idWZmZXIgbWF5IHJldHVybiBGQUxTRSB0byBpbmRpY2F0ZSBzdXNwZW5zaW9uLgorICogT24gVFJVRSByZXR1cm4sIGpwZWdfZmlsbF9iaXRfYnVmZmVyIGd1YXJhbnRlZXMgdGhhdCBnZXRfYnVmZmVyIGNvbnRhaW5zCisgKiBhdCBsZWFzdCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBiaXRzIC0tLSBkdW1teSB6ZXJvZXMgYXJlIGluc2VydGVkIGlmCisgKiBuZWNlc3NhcnkuCisgKi8KKwordHlwZWRlZiBJTlQzMiBiaXRfYnVmX3R5cGU7CS8qIHR5cGUgb2YgYml0LWV4dHJhY3Rpb24gYnVmZmVyICovCisjZGVmaW5lIEJJVF9CVUZfU0laRSAgMzIJLyogc2l6ZSBvZiBidWZmZXIgaW4gYml0cyAqLworCisvKiBJZiBsb25nIGlzID4gMzIgYml0cyBvbiB5b3VyIG1hY2hpbmUsIGFuZCBzaGlmdGluZy9tYXNraW5nIGxvbmdzIGlzCisgKiByZWFzb25hYmx5IGZhc3QsIG1ha2luZyBiaXRfYnVmX3R5cGUgYmUgbG9uZyBhbmQgc2V0dGluZyBCSVRfQlVGX1NJWkUKKyAqIGFwcHJvcHJpYXRlbHkgc2hvdWxkIGJlIGEgd2luLiAgVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBkZWZpbmUgdGhlIHNpemUKKyAqIHdpdGggc29tZXRoaW5nIGxpa2UgICNkZWZpbmUgQklUX0JVRl9TSVpFIChzaXplb2YoYml0X2J1Zl90eXBlKSo4KQorICogYmVjYXVzZSBub3QgYWxsIG1hY2hpbmVzIG1lYXN1cmUgc2l6ZW9mIGluIDgtYml0IGJ5dGVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsJCS8qIEJpdHJlYWRpbmcgc3RhdGUgc2F2ZWQgYWNyb3NzIE1DVXMgKi8KKyAgYml0X2J1Zl90eXBlIGdldF9idWZmZXI7CS8qIGN1cnJlbnQgYml0LWV4dHJhY3Rpb24gYnVmZmVyICovCisgIGludCBiaXRzX2xlZnQ7CQkvKiAjIG9mIHVudXNlZCBiaXRzIGluIGl0ICovCit9IGJpdHJlYWRfcGVybV9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgewkJLyogQml0cmVhZGluZyB3b3JraW5nIHN0YXRlIHdpdGhpbiBhbiBNQ1UgKi8KKyAgLyogQ3VycmVudCBkYXRhIHNvdXJjZSBsb2NhdGlvbiAqLworICAvKiBXZSBuZWVkIGEgY29weSwgcmF0aGVyIHRoYW4gbXVuZ2luZyB0aGUgb3JpZ2luYWwsIGluIGNhc2Ugb2Ygc3VzcGVuc2lvbiAqLworICBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGU7IC8qID0+IG5leHQgYnl0ZSB0byByZWFkIGZyb20gc291cmNlICovCisgIHNpemVfdCBieXRlc19pbl9idWZmZXI7CS8qICMgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHNvdXJjZSBidWZmZXIgKi8KKyAgLyogQml0IGlucHV0IGJ1ZmZlciAtLS0gbm90ZSB0aGVzZSB2YWx1ZXMgYXJlIGtlcHQgaW4gcmVnaXN0ZXIgdmFyaWFibGVzLAorICAgKiBub3QgaW4gdGhpcyBzdHJ1Y3QsIGluc2lkZSB0aGUgaW5uZXIgbG9vcHMuCisgICAqLworICBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsJLyogY3VycmVudCBiaXQtZXh0cmFjdGlvbiBidWZmZXIgKi8KKyAgaW50IGJpdHNfbGVmdDsJCS8qICMgb2YgdW51c2VkIGJpdHMgaW4gaXQgKi8KKyAgLyogUG9pbnRlciBuZWVkZWQgYnkganBlZ19maWxsX2JpdF9idWZmZXIuICovCisgIGpfZGVjb21wcmVzc19wdHIgY2luZm87CS8qIGJhY2sgbGluayB0byBkZWNvbXByZXNzIG1hc3RlciByZWNvcmQgKi8KK30gYml0cmVhZF93b3JraW5nX3N0YXRlOworCisvKiBNYWNyb3MgdG8gZGVjbGFyZSBhbmQgbG9hZC9zYXZlIGJpdHJlYWQgbG9jYWwgdmFyaWFibGVzLiAqLworI2RlZmluZSBCSVRSRUFEX1NUQVRFX1ZBUlMgIFwKKwlyZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsgIFwKKwlyZWdpc3RlciBpbnQgYml0c19sZWZ0OyAgXAorCWJpdHJlYWRfd29ya2luZ19zdGF0ZSBicl9zdGF0ZQorCisjZGVmaW5lIEJJVFJFQURfTE9BRF9TVEFURShjaW5mb3AscGVybXN0YXRlKSAgXAorCWJyX3N0YXRlLmNpbmZvID0gY2luZm9wOyBcCisJYnJfc3RhdGUubmV4dF9pbnB1dF9ieXRlID0gY2luZm9wLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsgXAorCWJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvcC0+c3JjLT5ieXRlc19pbl9idWZmZXI7IFwKKwlnZXRfYnVmZmVyID0gcGVybXN0YXRlLmdldF9idWZmZXI7IFwKKwliaXRzX2xlZnQgPSBwZXJtc3RhdGUuYml0c19sZWZ0OworCisjZGVmaW5lIEJJVFJFQURfU0FWRV9TVEFURShjaW5mb3AscGVybXN0YXRlKSAgXAorCWNpbmZvcC0+c3JjLT5uZXh0X2lucHV0X2J5dGUgPSBicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGU7IFwKKwljaW5mb3AtPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyOyBcCisJcGVybXN0YXRlLmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOyBcCisJcGVybXN0YXRlLmJpdHNfbGVmdCA9IGJpdHNfbGVmdAorCisvKgorICogVGhlc2UgbWFjcm9zIHByb3ZpZGUgdGhlIGluLWxpbmUgcG9ydGlvbiBvZiBiaXQgZmV0Y2hpbmcuCisgKiBVc2UgQ0hFQ0tfQklUX0JVRkZFUiB0byBlbnN1cmUgdGhlcmUgYXJlIE4gYml0cyBpbiBnZXRfYnVmZmVyCisgKiBiZWZvcmUgdXNpbmcgR0VUX0JJVFMsIFBFRUtfQklUUywgb3IgRFJPUF9CSVRTLgorICogVGhlIHZhcmlhYmxlcyBnZXRfYnVmZmVyIGFuZCBiaXRzX2xlZnQgYXJlIGFzc3VtZWQgdG8gYmUgbG9jYWxzLAorICogYnV0IHRoZSBzdGF0ZSBzdHJ1Y3QgbWlnaHQgbm90IGJlIChqcGVnX2h1ZmZfZGVjb2RlIG5lZWRzIHRoaXMpLgorICoJQ0hFQ0tfQklUX0JVRkZFUihzdGF0ZSxuLGFjdGlvbik7CisgKgkJRW5zdXJlIHRoZXJlIGFyZSBOIGJpdHMgaW4gZ2V0X2J1ZmZlcjsgaWYgc3VzcGVuZCwgdGFrZSBhY3Rpb24uCisgKiAgICAgIHZhbCA9IEdFVF9CSVRTKG4pOworICoJCUZldGNoIG5leHQgTiBiaXRzLgorICogICAgICB2YWwgPSBQRUVLX0JJVFMobik7CisgKgkJRmV0Y2ggbmV4dCBOIGJpdHMgd2l0aG91dCByZW1vdmluZyB0aGVtIGZyb20gdGhlIGJ1ZmZlci4KKyAqCURST1BfQklUUyhuKTsKKyAqCQlEaXNjYXJkIG5leHQgTiBiaXRzLgorICogVGhlIHZhbHVlIE4gc2hvdWxkIGJlIGEgc2ltcGxlIHZhcmlhYmxlLCBub3QgYW4gZXhwcmVzc2lvbiwgYmVjYXVzZSBpdAorICogaXMgZXZhbHVhdGVkIG11bHRpcGxlIHRpbWVzLgorICovCisKKyNkZWZpbmUgQ0hFQ0tfQklUX0JVRkZFUihzdGF0ZSxuYml0cyxhY3Rpb24pIFwKKwl7IGlmIChiaXRzX2xlZnQgPCAobmJpdHMpKSB7ICBcCisJICAgIGlmICghIGpwZWdfZmlsbF9iaXRfYnVmZmVyKCYoc3RhdGUpLGdldF9idWZmZXIsYml0c19sZWZ0LG5iaXRzKSkgIFwKKwkgICAgICB7IGFjdGlvbjsgfSAgXAorCSAgICBnZXRfYnVmZmVyID0gKHN0YXRlKS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSAoc3RhdGUpLmJpdHNfbGVmdDsgfSB9CisKKyNkZWZpbmUgR0VUX0JJVFMobmJpdHMpIFwKKwkoKChpbnQpIChnZXRfYnVmZmVyID4+IChiaXRzX2xlZnQgLT0gKG5iaXRzKSkpKSAmICgoMTw8KG5iaXRzKSktMSkpCisKKyNkZWZpbmUgUEVFS19CSVRTKG5iaXRzKSBcCisJKCgoaW50KSAoZ2V0X2J1ZmZlciA+PiAoYml0c19sZWZ0IC0gIChuYml0cykpKSkgJiAoKDE8PChuYml0cykpLTEpKQorCisjZGVmaW5lIERST1BfQklUUyhuYml0cykgXAorCShiaXRzX2xlZnQgLT0gKG5iaXRzKSkKKworLyogTG9hZCB1cCB0aGUgYml0IGJ1ZmZlciB0byBhIGRlcHRoIG9mIGF0IGxlYXN0IG5iaXRzICovCitFWFRFUk4oYm9vbGVhbikganBlZ19maWxsX2JpdF9idWZmZXIKKwlKUFAoKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLCByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwKKwkgICAgIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsIGludCBuYml0cykpOworCisKKy8qCisgKiBDb2RlIGZvciBleHRyYWN0aW5nIG5leHQgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZnJvbSBpbnB1dCBiaXQgc3RyZWFtLgorICogQWdhaW4sIHRoaXMgaXMgdGltZS1jcml0aWNhbCBhbmQgd2UgbWFrZSB0aGUgbWFpbiBwYXRocyBiZSBtYWNyb3MuCisgKgorICogV2UgdXNlIGEgbG9va2FoZWFkIHRhYmxlIHRvIHByb2Nlc3MgY29kZXMgb2YgdXAgdG8gSFVGRl9MT09LQUhFQUQgYml0cworICogd2l0aG91dCBsb29waW5nLiAgVXN1YWxseSwgbW9yZSB0aGFuIDk1JSBvZiB0aGUgSHVmZm1hbiBjb2RlcyB3aWxsIGJlIDgKKyAqIG9yIGZld2VyIGJpdHMgbG9uZy4gIFRoZSBmZXcgb3Zlcmxlbmd0aCBjb2RlcyBhcmUgaGFuZGxlZCB3aXRoIGEgbG9vcCwKKyAqIHdoaWNoIG5lZWQgbm90IGJlIGlubGluZSBjb2RlLgorICoKKyAqIE5vdGVzIGFib3V0IHRoZSBIVUZGX0RFQ09ERSBtYWNybzoKKyAqIDEuIE5lYXIgdGhlIGVuZCBvZiB0aGUgZGF0YSBzZWdtZW50LCB3ZSBtYXkgZmFpbCB0byBnZXQgZW5vdWdoIGJpdHMKKyAqICAgIGZvciBhIGxvb2thaGVhZC4gIEluIHRoYXQgY2FzZSwgd2UgZG8gaXQgdGhlIGhhcmQgd2F5LgorICogMi4gSWYgdGhlIGxvb2thaGVhZCB0YWJsZSBjb250YWlucyBubyBlbnRyeSwgdGhlIG5leHQgY29kZSBtdXN0IGJlCisgKiAgICBtb3JlIHRoYW4gSFVGRl9MT09LQUhFQUQgYml0cyBsb25nLgorICogMy4ganBlZ19odWZmX2RlY29kZSByZXR1cm5zIC0xIGlmIGZvcmNlZCB0byBzdXNwZW5kLgorICovCisKKyNkZWZpbmUgSFVGRl9ERUNPREUocmVzdWx0LHN0YXRlLGh0YmwsZmFpbGFjdGlvbixzbG93bGFiZWwpIFwKK3sgcmVnaXN0ZXIgaW50IG5iLCBsb29rOyBcCisgIGlmIChiaXRzX2xlZnQgPCBIVUZGX0xPT0tBSEVBRCkgeyBcCisgICAgaWYgKCEganBlZ19maWxsX2JpdF9idWZmZXIoJnN0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LCAwKSkge2ZhaWxhY3Rpb247fSBcCisgICAgZ2V0X2J1ZmZlciA9IHN0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IHN0YXRlLmJpdHNfbGVmdDsgXAorICAgIGlmIChiaXRzX2xlZnQgPCBIVUZGX0xPT0tBSEVBRCkgeyBcCisgICAgICBuYiA9IDE7IGdvdG8gc2xvd2xhYmVsOyBcCisgICAgfSBcCisgIH0gXAorICBsb29rID0gUEVFS19CSVRTKEhVRkZfTE9PS0FIRUFEKTsgXAorICBpZiAoKG5iID0gaHRibC0+bG9va19uYml0c1tsb29rXSkgIT0gMCkgeyBcCisgICAgRFJPUF9CSVRTKG5iKTsgXAorICAgIHJlc3VsdCA9IGh0YmwtPmxvb2tfc3ltW2xvb2tdOyBcCisgIH0gZWxzZSB7IFwKKyAgICBuYiA9IEhVRkZfTE9PS0FIRUFEKzE7IFwKK3Nsb3dsYWJlbDogXAorICAgIGlmICgocmVzdWx0PWpwZWdfaHVmZl9kZWNvZGUoJnN0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LGh0YmwsbmIpKSA8IDApIFwKKwl7IGZhaWxhY3Rpb247IH0gXAorICAgIGdldF9idWZmZXIgPSBzdGF0ZS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSBzdGF0ZS5iaXRzX2xlZnQ7IFwKKyAgfSBcCit9CisKKy8qIE91dC1vZi1saW5lIGNhc2UgZm9yIEh1ZmZtYW4gY29kZSBmZXRjaGluZyAqLworRVhURVJOKGludCkganBlZ19odWZmX2RlY29kZQorCUpQUCgoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLAorCSAgICAgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwgZF9kZXJpdmVkX3RibCAqIGh0YmwsIGludCBtaW5fYml0cykpOwpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamRpbnB1dC5jIGIvY29tbW9uL2pwZWcvamRpbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMmFjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZGlucHV0LmMKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiBqZGlucHV0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBpbnB1dCBjb250cm9sIGxvZ2ljIGZvciB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggY29udHJvbGxpbmcgdGhlIGRlY29tcHJlc3NvcidzIGlucHV0CisgKiBwcm9jZXNzaW5nIChtYXJrZXIgcmVhZGluZyBhbmQgY29lZmZpY2llbnQgZGVjb2RpbmcpLiAgVGhlIGFjdHVhbCBpbnB1dAorICogcmVhZGluZyBpcyBkb25lIGluIGpkbWFya2VyLmMsIGpkaHVmZi5jLCBhbmQgamRwaHVmZi5jLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBQcml2YXRlIHN0YXRlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBib29sZWFuIGluaGVhZGVyczsJCS8qIFRSVUUgdW50aWwgZmlyc3QgU09TIGlzIHJlYWNoZWQgKi8KK30gbXlfaW5wdXRfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9pbnB1dF9jb250cm9sbGVyICogbXlfaW5wdXRjdGxfcHRyOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoaW50KSBjb25zdW1lX21hcmtlcnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKworLyoKKyAqIFJvdXRpbmVzIHRvIGNhbGN1bGF0ZSB2YXJpb3VzIHF1YW50aXRpZXMgcmVsYXRlZCB0byB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UuCisgKi8KKworTE9DQUwodm9pZCkKK2luaXRpYWxfc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBDYWxsZWQgb25jZSwgd2hlbiBmaXJzdCBTT1MgbWFya2VyIGlzIHJlYWNoZWQgKi8KK3sKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBJIGNhbiBoYW5kbGUgKi8KKyAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTiB8fAorICAgICAgKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04pCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfSU1BR0VfVE9PX0JJRywgKHVuc2lnbmVkIGludCkgSlBFR19NQVhfRElNRU5TSU9OKTsKKworICAvKiBGb3Igbm93LCBwcmVjaXNpb24gbXVzdCBtYXRjaCBjb21waWxlZC1pbiB2YWx1ZS4uLiAqLworICBpZiAoY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IEJJVFNfSU5fSlNBTVBMRSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJFQ0lTSU9OLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24pOworCisgIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIGNvbXBvbmVudHMgd29uJ3QgZXhjZWVkIGludGVybmFsIGFycmF5IHNpemVzICovCisgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUE9ORU5UUykKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKKwkgICAgIE1BWF9DT01QT05FTlRTKTsKKworICAvKiBDb21wdXRlIG1heGltdW0gc2FtcGxpbmcgZmFjdG9yczsgY2hlY2sgZmFjdG9yIHZhbGlkaXR5ICovCisgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IDE7CisgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IDE7CisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IgfHwKKwljb21wcHRyLT52X3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfU0FNUExJTkcpOworICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IsCisJCQkJICAgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcik7CisgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKKwkJCQkgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgfQorCisgIC8qIFdlIGluaXRpYWxpemUgRENUX3NjYWxlZF9zaXplIGFuZCBtaW5fRENUX3NjYWxlZF9zaXplIHRvIERDVFNJWkUuCisgICAqIEluIHRoZSBmdWxsIGRlY29tcHJlc3NvciwgdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgamRtYXN0ZXIuYzsKKyAgICogYnV0IGluIHRoZSB0cmFuc2NvZGVyLCBqZG1hc3Rlci5jIGlzIG5vdCB1c2VkLCBzbyB3ZSBtdXN0IGRvIGl0IGhlcmUuCisgICAqLworICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7CisKKyAgLyogQ29tcHV0ZSBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHMgKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworICAgIC8qIFNpemUgaW4gRENUIGJsb2NrcyAqLworICAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICAvKiBkb3duc2FtcGxlZF93aWR0aCBhbmQgZG93bnNhbXBsZWRfaGVpZ2h0IHdpbGwgYWxzbyBiZSBvdmVycmlkZGVuIGJ5CisgICAgICogamRtYXN0ZXIuYyBpZiB3ZSBhcmUgZG9pbmcgZnVsbCBkZWNvbXByZXNzaW9uLiAgVGhlIHRyYW5zY29kZXIgbGlicmFyeQorICAgICAqIGRvZXNuJ3QgdXNlIHRoZXNlIHZhbHVlcywgYnV0IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIG1pZ2h0LgorICAgICAqLworICAgIC8qIFNpemUgaW4gc2FtcGxlcyAqLworICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpOworICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7CisgICAgLyogTWFyayBjb21wb25lbnQgbmVlZGVkLCB1bnRpbCBjb2xvciBjb252ZXJzaW9uIHNheXMgb3RoZXJ3aXNlICovCisgICAgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCA9IFRSVUU7CisgICAgLyogTWFyayBubyBxdWFudGl6YXRpb24gdGFibGUgeWV0IHNhdmVkIGZvciBjb21wb25lbnQgKi8KKyAgICBjb21wcHRyLT5xdWFudF90YWJsZSA9IE5VTEw7CisgIH0KKworICAvKiBDb21wdXRlIG51bWJlciBvZiBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93cy4gKi8KKyAgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyA9IChKRElNRU5TSU9OKQorICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisJCSAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOworCisgIC8qIERlY2lkZSB3aGV0aGVyIGZpbGUgY29udGFpbnMgbXVsdGlwbGUgc2NhbnMgKi8KKyAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuIDwgY2luZm8tPm51bV9jb21wb25lbnRzIHx8IGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQorICAgIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zID0gVFJVRTsKKyAgZWxzZQorICAgIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7Cit9CisKKworTE9DQUwodm9pZCkKK3Blcl9zY2FuX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhIEpQRUcgc2NhbiAqLworLyogY2luZm8tPmNvbXBzX2luX3NjYW4gYW5kIGNpbmZvLT5jdXJfY29tcF9pbmZvW10gd2VyZSBzZXQgZnJvbSBTT1MgbWFya2VyICovCit7CisgIGludCBjaSwgbWN1YmxrcywgdG1wOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID09IDEpIHsKKyAgICAKKyAgICAvKiBOb25pbnRlcmxlYXZlZCAoc2luZ2xlLWNvbXBvbmVudCkgc2NhbiAqLworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXTsKKyAgICAKKyAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLworICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisgICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworICAgIAorICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FuLCBhbHdheXMgb25lIGJsb2NrIHBlciBNQ1UgKi8KKyAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSAxOworICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSAxOworICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSAxOworICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSAxOworICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FucywgaXQgaXMgY29udmVuaWVudCB0byBkZWZpbmUgbGFzdF9yb3dfaGVpZ2h0CisgICAgICogYXMgdGhlIG51bWJlciBvZiBibG9jayByb3dzIHByZXNlbnQgaW4gdGhlIGxhc3QgaU1DVSByb3cuCisgICAgICovCisgICAgdG1wID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOworICAgIAorICAgIC8qIFByZXBhcmUgYXJyYXkgZGVzY3JpYmluZyBNQ1UgY29tcG9zaXRpb24gKi8KKyAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDE7CisgICAgY2luZm8tPk1DVV9tZW1iZXJzaGlwWzBdID0gMDsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgICAvKiBJbnRlcmxlYXZlZCAobXVsdGktY29tcG9uZW50KSBzY2FuICovCisgICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuIDw9IDAgfHwgY2luZm8tPmNvbXBzX2luX3NjYW4gPiBNQVhfQ09NUFNfSU5fU0NBTikKKyAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPmNvbXBzX2luX3NjYW4sCisJICAgICAgIE1BWF9DT01QU19JTl9TQ0FOKTsKKyAgICAKKyAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLworICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKKyAgICBjaW5mby0+TUNVX3Jvd3NfaW5fc2NhbiA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKKyAgICAKKyAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDA7CisgICAgCisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICAvKiBTYW1wbGluZyBmYWN0b3JzIGdpdmUgIyBvZiBibG9ja3Mgb2YgY29tcG9uZW50IGluIGVhY2ggTUNVICovCisgICAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gY29tcHB0ci0+TUNVX3dpZHRoICogY29tcHB0ci0+TUNVX2hlaWdodDsKKyAgICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisgICAgICAvKiBGaWd1cmUgbnVtYmVyIG9mIG5vbi1kdW1teSBibG9ja3MgaW4gbGFzdCBNQ1UgY29sdW1uICYgcm93ICovCisgICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX3dpZHRoKTsKKyAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX3dpZHRoOworICAgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSB0bXA7CisgICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV9oZWlnaHQpOworICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1VfaGVpZ2h0OworICAgICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOworICAgICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLworICAgICAgbWN1YmxrcyA9IGNvbXBwdHItPk1DVV9ibG9ja3M7CisgICAgICBpZiAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKyBtY3VibGtzID4gRF9NQVhfQkxPQ0tTX0lOX01DVSkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9NQ1VfU0laRSk7CisgICAgICB3aGlsZSAobWN1Ymxrcy0tID4gMCkgeworCWNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtjaW5mby0+YmxvY2tzX2luX01DVSsrXSA9IGNpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorfQorCisKKy8qCisgKiBTYXZlIGF3YXkgYSBjb3B5IG9mIHRoZSBRLXRhYmxlIHJlZmVyZW5jZWQgYnkgZWFjaCBjb21wb25lbnQgcHJlc2VudAorICogaW4gdGhlIGN1cnJlbnQgc2NhbiwgdW5sZXNzIGFscmVhZHkgc2F2ZWQgZHVyaW5nIGEgcHJpb3Igc2Nhbi4KKyAqCisgKiBJbiBhIG11bHRpcGxlLXNjYW4gSlBFRyBmaWxlLCB0aGUgZW5jb2RlciBjb3VsZCBhc3NpZ24gZGlmZmVyZW50IGNvbXBvbmVudHMKKyAqIHRoZSBzYW1lIFEtdGFibGUgc2xvdCBudW1iZXIsIGJ1dCBjaGFuZ2UgdGFibGUgZGVmaW5pdGlvbnMgYmV0d2VlbiBzY2FucworICogc28gdGhhdCBlYWNoIGNvbXBvbmVudCB1c2VzIGEgZGlmZmVyZW50IFEtdGFibGUuICAoVGhlIElKRyBlbmNvZGVyIGlzIG5vdAorICogY3VycmVudGx5IGNhcGFibGUgb2YgZG9pbmcgdGhpcywgYnV0IG90aGVyIGVuY29kZXJzIG1pZ2h0LikgIFNpbmNlIHdlIHdhbnQKKyAqIHRvIGJlIGFibGUgdG8gZGVxdWFudGl6ZSBhbGwgdGhlIGNvbXBvbmVudHMgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgdGhpcworICogbWVhbnMgdGhhdCB3ZSBoYXZlIHRvIHNhdmUgYXdheSB0aGUgdGFibGUgYWN0dWFsbHkgdXNlZCBmb3IgZWFjaCBjb21wb25lbnQuCisgKiBXZSBkbyB0aGlzIGJ5IGNvcHlpbmcgdGhlIHRhYmxlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbiBjb250YWluaW5nCisgKiB0aGUgY29tcG9uZW50LgorICogVGhlIEpQRUcgc3BlYyBwcm9oaWJpdHMgdGhlIGVuY29kZXIgZnJvbSBjaGFuZ2luZyB0aGUgY29udGVudHMgb2YgYSBRLXRhYmxlCisgKiBzbG90IGJldHdlZW4gc2NhbnMgb2YgYSBjb21wb25lbnQgdXNpbmcgdGhhdCBzbG90LiAgSWYgdGhlIGVuY29kZXIgZG9lcyBzbworICogYW55d2F5LCB0aGlzIGRlY29kZXIgd2lsbCBzaW1wbHkgdXNlIHRoZSBRLXRhYmxlIHZhbHVlcyB0aGF0IHdlcmUgY3VycmVudAorICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBzY2FuIGZvciB0aGUgY29tcG9uZW50LgorICoKKyAqIFRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbG9va3Mgb25seSBhdCB0aGUgc2F2ZWQgcXVhbnQgdGFibGVzLAorICogbm90IGF0IHRoZSBjdXJyZW50IFEtdGFibGUgc2xvdHMuCisgKi8KKworTE9DQUwodm9pZCkKK2xhdGNoX3F1YW50X3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaW50IGNpLCBxdGJsbm87CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpRVUFOVF9UQkwgKiBxdGJsOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICAvKiBObyB3b3JrIGlmIHdlIGFscmVhZHkgc2F2ZWQgUS10YWJsZSBmb3IgdGhpcyBjb21wb25lbnQgKi8KKyAgICBpZiAoY29tcHB0ci0+cXVhbnRfdGFibGUgIT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworICAgIC8qIE1ha2Ugc3VyZSBzcGVjaWZpZWQgcXVhbnRpemF0aW9uIHRhYmxlIGlzIHByZXNlbnQgKi8KKyAgICBxdGJsbm8gPSBjb21wcHRyLT5xdWFudF90Ymxfbm87CisgICAgaWYgKHF0YmxubyA8IDAgfHwgcXRibG5vID49IE5VTV9RVUFOVF9UQkxTIHx8CisJY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub10gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX1FVQU5UX1RBQkxFLCBxdGJsbm8pOworICAgIC8qIE9LLCBzYXZlIGF3YXkgdGhlIHF1YW50aXphdGlvbiB0YWJsZSAqLworICAgIHF0YmwgPSAoSlFVQU5UX1RCTCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihKUVVBTlRfVEJMKSk7CisgICAgTUVNQ09QWShxdGJsLCBjaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSwgU0laRU9GKEpRVUFOVF9UQkwpKTsKKyAgICBjb21wcHRyLT5xdWFudF90YWJsZSA9IHF0Ymw7CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgaW5wdXQgbW9kdWxlcyB0byByZWFkIGEgc2NhbiBvZiBjb21wcmVzc2VkIGRhdGEuCisgKiBUaGUgZmlyc3QgY2FsbCB0byB0aGlzIGlzIGRvbmUgYnkgamRtYXN0ZXIuYyBhZnRlciBpbml0aWFsaXppbmcKKyAqIHRoZSBlbnRpcmUgZGVjb21wcmVzc29yIChkdXJpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKS4KKyAqIFN1YnNlcXVlbnQgY2FsbHMgY29tZSBmcm9tIGNvbnN1bWVfbWFya2VycywgYmVsb3cuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9pbnB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisgIGxhdGNoX3F1YW50X3RhYmxlcyhjaW5mbyk7CisgICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICgqY2luZm8tPmNvZWYtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7CisgIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCA9IGNpbmZvLT5jb2VmLT5jb25zdW1lX2RhdGE7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhZnRlciBpbnB1dHRpbmcgYSBjb21wcmVzc2VkLWRhdGEgc2Nhbi4KKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIGFmdGVyIGl0J3MgcmVhZCBhbGwKKyAqIHRoZSBleHBlY3RlZCBkYXRhIG9mIHRoZSBzY2FuLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKK30KKworCisvKgorICogUmVhZCBKUEVHIG1hcmtlcnMgYmVmb3JlLCBiZXR3ZWVuLCBvciBhZnRlciBjb21wcmVzc2VkLWRhdGEgc2NhbnMuCisgKiBDaGFuZ2Ugc3RhdGUgYXMgbmVjZXNzYXJ5IHdoZW4gYSBuZXcgc2NhbiBpcyByZWFjaGVkLgorICogUmV0dXJuIHZhbHVlIGlzIEpQRUdfU1VTUEVOREVELCBKUEVHX1JFQUNIRURfU09TLCBvciBKUEVHX1JFQUNIRURfRU9JLgorICoKKyAqIFRoZSBjb25zdW1lX2lucHV0IG1ldGhvZCBwb2ludGVyIHBvaW50cyBlaXRoZXIgaGVyZSBvciB0byB0aGUKKyAqIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBjb25zdW1lX2RhdGEgcm91dGluZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKyAqIHdlIGFyZSByZWFkaW5nIGEgY29tcHJlc3NlZCBkYXRhIHNlZ21lbnQgb3IgaW50ZXItc2VnbWVudCBtYXJrZXJzLgorICovCisKK01FVEhPRERFRihpbnQpCitjb25zdW1lX21hcmtlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lucHV0Y3RsX3B0ciBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpIGNpbmZvLT5pbnB1dGN0bDsKKyAgaW50IHZhbDsKKworICBpZiAoaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCkgLyogQWZ0ZXIgaGl0dGluZyBFT0ksIHJlYWQgbm8gZnVydGhlciAqLworICAgIHJldHVybiBKUEVHX1JFQUNIRURfRU9JOworCisgIHZhbCA9ICgqY2luZm8tPm1hcmtlci0+cmVhZF9tYXJrZXJzKSAoY2luZm8pOworCisgIHN3aXRjaCAodmFsKSB7CisgIGNhc2UgSlBFR19SRUFDSEVEX1NPUzoJLyogRm91bmQgU09TICovCisgICAgaWYgKGlucHV0Y3RsLT5pbmhlYWRlcnMpIHsJLyogMXN0IFNPUyAqLworICAgICAgaW5pdGlhbF9zZXR1cChjaW5mbyk7CisgICAgICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gRkFMU0U7CisgICAgICAvKiBOb3RlOiBzdGFydF9pbnB1dF9wYXNzIG11c3QgYmUgY2FsbGVkIGJ5IGpkbWFzdGVyLmMKKyAgICAgICAqIGJlZm9yZSBhbnkgbW9yZSBpbnB1dCBjYW4gYmUgY29uc3VtZWQuICBqZGFwaW1pbi5jIGlzCisgICAgICAgKiByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIHRoaXMgc2VxdWVuY2luZy4KKyAgICAgICAqLworICAgIH0gZWxzZSB7CQkJLyogMm5kIG9yIGxhdGVyIFNPUyBtYXJrZXIgKi8KKyAgICAgIGlmICghIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfRU9JX0VYUEVDVEVEKTsgLyogT29wcywgSSB3YXNuJ3QgZXhwZWN0aW5nIHRoaXMhICovCisgICAgICBzdGFydF9pbnB1dF9wYXNzKGNpbmZvKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSlBFR19SRUFDSEVEX0VPSToJLyogRm91bmQgRU9JICovCisgICAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IFRSVUU7CisgICAgaWYgKGlucHV0Y3RsLT5pbmhlYWRlcnMpIHsJLyogVGFibGVzLW9ubHkgZGF0YXN0cmVhbSwgYXBwYXJlbnRseSAqLworICAgICAgaWYgKGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCisJRVJSRVhJVChjaW5mbywgSkVSUl9TT0ZfTk9fU09TKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogUHJldmVudCBpbmZpbml0ZSBsb29wIGluIGNvZWYgY3RscidzIGRlY29tcHJlc3NfZGF0YSByb3V0aW5lCisgICAgICAgKiBpZiB1c2VyIHNldCBvdXRwdXRfc2Nhbl9udW1iZXIgbGFyZ2VyIHRoYW4gbnVtYmVyIG9mIHNjYW5zLgorICAgICAgICovCisgICAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA+IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcikKKwljaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID0gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBKUEVHX1NVU1BFTkRFRDoKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiB2YWw7Cit9CisKKworLyoKKyAqIFJlc2V0IHN0YXRlIHRvIGJlZ2luIGEgZnJlc2ggZGF0YXN0cmVhbS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Jlc2V0X2lucHV0X2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lucHV0Y3RsX3B0ciBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpIGNpbmZvLT5pbnB1dGN0bDsKKworICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfaW5wdXQgPSBjb25zdW1lX21hcmtlcnM7CisgIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7IC8qICJ1bmtub3duIiB3b3VsZCBiZSBiZXR0ZXIgKi8KKyAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IEZBTFNFOworICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gVFJVRTsKKyAgLyogUmVzZXQgb3RoZXIgbW9kdWxlcyAqLworICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgKCpjaW5mby0+bWFya2VyLT5yZXNldF9tYXJrZXJfcmVhZGVyKSAoY2luZm8pOworICAvKiBSZXNldCBwcm9ncmVzc2lvbiBzdGF0ZSAtLSB3b3VsZCBiZSBjbGVhbmVyIGlmIGVudHJvcHkgZGVjb2RlciBkaWQgdGhpcyAqLworICBjaW5mby0+Y29lZl9iaXRzID0gTlVMTDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgaW5wdXQgY29udHJvbGxlciBtb2R1bGUuCisgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IG9uY2UsIHdoZW4gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9pbnB1dF9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9pbnB1dGN0bF9wdHIgaW5wdXRjdGw7CisKKyAgLyogQ3JlYXRlIHN1Ym9iamVjdCBpbiBwZXJtYW5lbnQgcG9vbCAqLworICBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCisJCQkJU0laRU9GKG15X2lucHV0X2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPmlucHV0Y3RsID0gKHN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgKikgaW5wdXRjdGw7CisgIC8qIEluaXRpYWxpemUgbWV0aG9kIHBvaW50ZXJzICovCisgIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKKyAgaW5wdXRjdGwtPnB1Yi5yZXNldF9pbnB1dF9jb250cm9sbGVyID0gcmVzZXRfaW5wdXRfY29udHJvbGxlcjsKKyAgaW5wdXRjdGwtPnB1Yi5zdGFydF9pbnB1dF9wYXNzID0gc3RhcnRfaW5wdXRfcGFzczsKKyAgaW5wdXRjdGwtPnB1Yi5maW5pc2hfaW5wdXRfcGFzcyA9IGZpbmlzaF9pbnB1dF9wYXNzOworICAvKiBJbml0aWFsaXplIHN0YXRlOiBjYW4ndCB1c2UgcmVzZXRfaW5wdXRfY29udHJvbGxlciBzaW5jZSB3ZSBkb24ndAorICAgKiB3YW50IHRvIHRyeSB0byByZXNldCBvdGhlciBtb2R1bGVzIHlldC4KKyAgICovCisgIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7IC8qICJ1bmtub3duIiB3b3VsZCBiZSBiZXR0ZXIgKi8KKyAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IEZBTFNFOworICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pkbWFpbmN0LmMgYi9jb21tb24vanBlZy9qZG1haW5jdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzk1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZG1haW5jdC5jCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICogamRtYWluY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyIGZvciBkZWNvbXByZXNzaW9uLgorICogVGhlIG1haW4gYnVmZmVyIGxpZXMgYmV0d2VlbiB0aGUgSlBFRyBkZWNvbXByZXNzb3IgcHJvcGVyIGFuZCB0aGUKKyAqIHBvc3QtcHJvY2Vzc29yOyBpdCBob2xkcyBkb3duc2FtcGxlZCBkYXRhIGluIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKgorICogTm90ZSB0aGF0IHRoaXMgY29kZSBpcyBieXBhc3NlZCBpbiByYXctZGF0YSBtb2RlLCBzaW5jZSB0aGUgYXBwbGljYXRpb24KKyAqIHN1cHBsaWVzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBtYWluIGJ1ZmZlciBpbiB0aGF0IGNhc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBJbiB0aGUgY3VycmVudCBzeXN0ZW0gZGVzaWduLCB0aGUgbWFpbiBidWZmZXIgbmVlZCBuZXZlciBiZSBhIGZ1bGwtaW1hZ2UKKyAqIGJ1ZmZlcjsgYW55IGZ1bGwtaGVpZ2h0IGJ1ZmZlcnMgd2lsbCBiZSBmb3VuZCBpbnNpZGUgdGhlIGNvZWZmaWNpZW50IG9yCisgKiBwb3N0cHJvY2Vzc2luZyBjb250cm9sbGVycy4gIE5vbmV0aGVsZXNzLCB0aGUgbWFpbiBjb250cm9sbGVyIGlzIG5vdAorICogdHJpdmlhbC4gIEl0cyByZXNwb25zaWJpbGl0eSBpcyB0byBwcm92aWRlIGNvbnRleHQgcm93cyBmb3IgdXBzYW1wbGluZy8KKyAqIHJlc2NhbGluZywgYW5kIGRvaW5nIHRoaXMgaW4gYW4gZWZmaWNpZW50IGZhc2hpb24gaXMgYSBiaXQgdHJpY2t5LgorICoKKyAqIFBvc3Rwcm9jZXNzb3IgaW5wdXQgZGF0YSBpcyBjb3VudGVkIGluICJyb3cgZ3JvdXBzIi4gIEEgcm93IGdyb3VwCisgKiBpcyBkZWZpbmVkIHRvIGJlICh2X3NhbXBfZmFjdG9yICogRENUX3NjYWxlZF9zaXplIC8gbWluX0RDVF9zY2FsZWRfc2l6ZSkKKyAqIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LiAgKFdlIHJlcXVpcmUgRENUX3NjYWxlZF9zaXplIHZhbHVlcyB0byBiZQorICogY2hvc2VuIHN1Y2ggdGhhdCB0aGVzZSBudW1iZXJzIGFyZSBpbnRlZ2Vycy4gIEluIHByYWN0aWNlIERDVF9zY2FsZWRfc2l6ZQorICogdmFsdWVzIHdpbGwgbGlrZWx5IGJlIHBvd2VycyBvZiB0d28sIHNvIHdlIGFjdHVhbGx5IGhhdmUgdGhlIHN0cm9uZ2VyCisgKiBjb25kaXRpb24gdGhhdCBEQ1Rfc2NhbGVkX3NpemUgLyBtaW5fRENUX3NjYWxlZF9zaXplIGlzIGFuIGludGVnZXIuKQorICogVXBzYW1wbGluZyB3aWxsIHR5cGljYWxseSBwcm9kdWNlIG1heF92X3NhbXBfZmFjdG9yIHBpeGVsIHJvd3MgZnJvbSBlYWNoCisgKiByb3cgZ3JvdXAgKHRpbWVzIGFueSBhZGRpdGlvbmFsIHNjYWxlIGZhY3RvciB0aGF0IHRoZSB1cHNhbXBsZXIgaXMKKyAqIGFwcGx5aW5nKS4KKyAqCisgKiBUaGUgY29lZmZpY2llbnQgY29udHJvbGxlciB3aWxsIGRlbGl2ZXIgZGF0YSB0byB1cyBvbmUgaU1DVSByb3cgYXQgYSB0aW1lOworICogZWFjaCBpTUNVIHJvdyBjb250YWlucyB2X3NhbXBfZmFjdG9yICogRENUX3NjYWxlZF9zaXplIHNhbXBsZSByb3dzLCBvcgorICogZXhhY3RseSBtaW5fRENUX3NjYWxlZF9zaXplIHJvdyBncm91cHMuICAoVGhpcyBhbW91bnQgb2YgZGF0YSBjb3JyZXNwb25kcworICogdG8gb25lIHJvdyBvZiBNQ1VzIHdoZW4gdGhlIGltYWdlIGlzIGZ1bGx5IGludGVybGVhdmVkLikgIE5vdGUgdGhhdCB0aGUKKyAqIG51bWJlciBvZiBzYW1wbGUgcm93cyB2YXJpZXMgYWNyb3NzIGNvbXBvbmVudHMsIGJ1dCB0aGUgbnVtYmVyIG9mIHJvdworICogZ3JvdXBzIGRvZXMgbm90LiAgU29tZSBnYXJiYWdlIHNhbXBsZSByb3dzIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgbGFzdCBpTUNVCisgKiByb3cgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuCisgKgorICogRGVwZW5kaW5nIG9uIHRoZSB2ZXJ0aWNhbCBzY2FsaW5nIGFsZ29yaXRobSB1c2VkLCB0aGUgdXBzYW1wbGVyIG1heSBuZWVkCisgKiBhY2Nlc3MgdG8gdGhlIHNhbXBsZSByb3cocykgYWJvdmUgYW5kIGJlbG93IGl0cyBjdXJyZW50IGlucHV0IHJvdyBncm91cC4KKyAqIFRoZSB1cHNhbXBsZXIgaXMgcmVxdWlyZWQgdG8gc2V0IG5lZWRfY29udGV4dF9yb3dzIFRSVUUgYXQgZ2xvYmFsIHNlbGVjdGlvbgorICogdGltZSBpZiBzby4gIFdoZW4gbmVlZF9jb250ZXh0X3Jvd3MgaXMgRkFMU0UsIHRoaXMgY29udHJvbGxlciBjYW4gc2ltcGx5CisgKiBvYnRhaW4gb25lIGlNQ1Ugcm93IGF0IGEgdGltZSBmcm9tIHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIGFuZCBkb2xlIGl0CisgKiBvdXQgYXMgcm93IGdyb3VwcyB0byB0aGUgcG9zdHByb2Nlc3Nvci4KKyAqCisgKiBXaGVuIG5lZWRfY29udGV4dF9yb3dzIGlzIFRSVUUsIHRoaXMgY29udHJvbGxlciBndWFyYW50ZWVzIHRoYXQgdGhlIGJ1ZmZlcgorICogcGFzc2VkIHRvIHBvc3Rwcm9jZXNzaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSByb3cgZ3JvdXAncyB3b3J0aCBvZiBzYW1wbGVzCisgKiBhYm92ZSBhbmQgYmVsb3cgdGhlIHJvdyBncm91cChzKSBiZWluZyBwcm9jZXNzZWQuICBOb3RlIHRoYXQgdGhlIGNvbnRleHQKKyAqIHJvd3MgImFib3ZlIiB0aGUgZmlyc3QgcGFzc2VkIHJvdyBncm91cCBhcHBlYXIgYXQgbmVnYXRpdmUgcm93IG9mZnNldHMgaW4KKyAqIHRoZSBwYXNzZWQgYnVmZmVyLiAgQXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgdGhlIHJlcXVpcmVkCisgKiBjb250ZXh0IHJvd3MgYXJlIG1hbnVmYWN0dXJlZCBieSBkdXBsaWNhdGluZyB0aGUgZmlyc3Qgb3IgbGFzdCByZWFsIHNhbXBsZQorICogcm93OyB0aGlzIGF2b2lkcyBoYXZpbmcgc3BlY2lhbCBjYXNlcyBpbiB0aGUgdXBzYW1wbGluZyBpbm5lciBsb29wcy4KKyAqCisgKiBUaGUgYW1vdW50IG9mIGNvbnRleHQgaXMgZml4ZWQgYXQgb25lIHJvdyBncm91cCBqdXN0IGJlY2F1c2UgdGhhdCdzIGEKKyAqIGNvbnZlbmllbnQgbnVtYmVyIGZvciB0aGlzIGNvbnRyb2xsZXIgdG8gd29yayB3aXRoLiAgVGhlIGV4aXN0aW5nCisgKiB1cHNhbXBsZXJzIHJlYWxseSBvbmx5IG5lZWQgb25lIHNhbXBsZSByb3cgb2YgY29udGV4dC4gIEFuIHVwc2FtcGxlcgorICogc3VwcG9ydGluZyBhcmJpdHJhcnkgb3V0cHV0IHJlc2NhbGluZyBtaWdodCB3aXNoIGZvciBtb3JlIHRoYW4gb25lIHJvdworICogZ3JvdXAgb2YgY29udGV4dCB3aGVuIHNocmlua2luZyB0aGUgaW1hZ2U7IHRvdWdoLCB3ZSBkb24ndCBoYW5kbGUgdGhhdC4KKyAqIChUaGlzIGlzIGp1c3RpZmllZCBieSB0aGUgYXNzdW1wdGlvbiB0aGF0IGRvd25zaXppbmcgd2lsbCBiZSBoYW5kbGVkIG1vc3RseQorICogYnkgYWRqdXN0aW5nIHRoZSBEQ1Rfc2NhbGVkX3NpemUgdmFsdWVzLCBzbyB0aGF0IHRoZSBhY3R1YWwgc2NhbGUgZmFjdG9yIGF0CisgKiB0aGUgdXBzYW1wbGUgc3RlcCBuZWVkbid0IGJlIG11Y2ggbGVzcyB0aGFuIG9uZS4pCisgKgorICogVG8gcHJvdmlkZSB0aGUgZGVzaXJlZCBjb250ZXh0LCB3ZSBoYXZlIHRvIHJldGFpbiB0aGUgbGFzdCB0d28gcm93IGdyb3VwcworICogb2Ygb25lIGlNQ1Ugcm93IHdoaWxlIHJlYWRpbmcgaW4gdGhlIG5leHQgaU1DVSByb3cuICAoVGhlIGxhc3Qgcm93IGdyb3VwCisgKiBjYW4ndCBiZSBwcm9jZXNzZWQgdW50aWwgd2UgaGF2ZSBhbm90aGVyIHJvdyBncm91cCBmb3IgaXRzIGJlbG93LWNvbnRleHQsCisgKiBhbmQgc28gd2UgaGF2ZSB0byBzYXZlIHRoZSBuZXh0LXRvLWxhc3QgZ3JvdXAgdG9vIGZvciBpdHMgYWJvdmUtY29udGV4dC4pCisgKiBXZSBjb3VsZCBkbyB0aGlzIG1vc3Qgc2ltcGx5IGJ5IGNvcHlpbmcgZGF0YSBhcm91bmQgaW4gb3VyIGJ1ZmZlciwgYnV0CisgKiB0aGF0J2QgYmUgdmVyeSBzbG93LiAgV2UgY2FuIGF2b2lkIGNvcHlpbmcgYW55IGRhdGEgYnkgY3JlYXRpbmcgYSByYXRoZXIKKyAqIHN0cmFuZ2UgcG9pbnRlciBzdHJ1Y3R1cmUuICBIZXJlJ3MgaG93IGl0IHdvcmtzLiAgV2UgYWxsb2NhdGUgYSB3b3Jrc3BhY2UKKyAqIGNvbnNpc3Rpbmcgb2YgTSsyIHJvdyBncm91cHMgKHdoZXJlIE0gPSBtaW5fRENUX3NjYWxlZF9zaXplIGlzIHRoZSBudW1iZXIKKyAqIG9mIHJvdyBncm91cHMgcGVyIGlNQ1Ugcm93KS4gIFdlIGNyZWF0ZSB0d28gc2V0cyBvZiByZWR1bmRhbnQgcG9pbnRlcnMgdG8KKyAqIHRoZSB3b3Jrc3BhY2UuICBMYWJlbGluZyB0aGUgcGh5c2ljYWwgcm93IGdyb3VwcyAwIHRvIE0rMSwgdGhlIHN5bnRoZXNpemVkCisgKiBwb2ludGVyIGxpc3RzIGxvb2sgbGlrZSB0aGlzOgorICogICAgICAgICAgICAgICAgICAgTSsxICAgICAgICAgICAgICAgICAgICAgICAgICBNLTEKKyAqIG1hc3RlciBwb2ludGVyIC0tPiAwICAgICAgICAgbWFzdGVyIHBvaW50ZXIgLS0+IDAKKyAqICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAqICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisgKiAgICAgICAgICAgICAgICAgICBNLTMgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMworICogICAgICAgICAgICAgICAgICAgTS0yICAgICAgICAgICAgICAgICAgICAgICAgICAgTQorICogICAgICAgICAgICAgICAgICAgTS0xICAgICAgICAgICAgICAgICAgICAgICAgICBNKzEKKyAqICAgICAgICAgICAgICAgICAgICBNICAgICAgICAgICAgICAgICAgICAgICAgICAgTS0yCisgKiAgICAgICAgICAgICAgICAgICBNKzEgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMQorICogICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICogV2UgcmVhZCBhbHRlcm5hdGUgaU1DVSByb3dzIHVzaW5nIGVhY2ggbWFzdGVyIHBvaW50ZXI7IHRodXMgdGhlIGxhc3QgdHdvCisgKiByb3cgZ3JvdXBzIG9mIHRoZSBwcmV2aW91cyBpTUNVIHJvdyByZW1haW4gdW4tb3ZlcndyaXR0ZW4gaW4gdGhlIHdvcmtzcGFjZS4KKyAqIFRoZSBwb2ludGVyIGxpc3RzIGFyZSBzZXQgdXAgc28gdGhhdCB0aGUgcmVxdWlyZWQgY29udGV4dCByb3dzIGFwcGVhciB0bworICogYmUgYWRqYWNlbnQgdG8gdGhlIHByb3BlciBwbGFjZXMgd2hlbiB3ZSBwYXNzIHRoZSBwb2ludGVyIGxpc3RzIHRvIHRoZQorICogdXBzYW1wbGVyLgorICoKKyAqIFRoZSBhYm92ZSBwaWN0dXJlcyBkZXNjcmliZSB0aGUgbm9ybWFsIHN0YXRlIG9mIHRoZSBwb2ludGVyIGxpc3RzLgorICogQXQgdG9wIGFuZCBib3R0b20gb2YgdGhlIGltYWdlLCB3ZSBkaWRkbGUgdGhlIHBvaW50ZXIgbGlzdHMgdG8gZHVwbGljYXRlCisgKiB0aGUgZmlyc3Qgb3IgbGFzdCBzYW1wbGUgcm93IGFzIG5lY2Vzc2FyeSAodGhpcyBpcyBjaGVhcGVyIHRoYW4gY29weWluZworICogc2FtcGxlIHJvd3MgYXJvdW5kKS4KKyAqCisgKiBUaGlzIHNjaGVtZSBicmVha3MgZG93biBpZiBNIDwgMiwgaWUsIG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgMS4gIEluIHRoYXQKKyAqIHNpdHVhdGlvbiBlYWNoIGlNQ1Ugcm93IHByb3ZpZGVzIG9ubHkgb25lIHJvdyBncm91cCBzbyB0aGUgYnVmZmVyaW5nIGxvZ2ljCisgKiBtdXN0IGJlIGRpZmZlcmVudCAoZWcsIHdlIG11c3QgcmVhZCB0d28gaU1DVSByb3dzIGJlZm9yZSB3ZSBjYW4gZW1pdCB0aGUKKyAqIGZpcnN0IHJvdyBncm91cCkuICBGb3Igbm93LCB3ZSBzaW1wbHkgZG8gbm90IHN1cHBvcnQgcHJvdmlkaW5nIGNvbnRleHQKKyAqIHJvd3Mgd2hlbiBtaW5fRENUX3NjYWxlZF9zaXplIGlzIDEuICBUaGF0IGNvbWJpbmF0aW9uIHNlZW1zIHVubGlrZWx5IHRvCisgKiBiZSB3b3J0aCBwcm92aWRpbmcgLS0tIGlmIHNvbWVvbmUgd2FudHMgYSAxLzh0aC1zaXplIHByZXZpZXcsIHRoZXkgcHJvYmFibHkKKyAqIHdhbnQgaXQgcXVpY2sgYW5kIGRpcnR5LCBzbyBhIGNvbnRleHQtZnJlZSB1cHNhbXBsZXIgaXMgc3VmZmljaWVudC4KKyAqLworCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogUG9pbnRlciB0byBhbGxvY2F0ZWQgd29ya3NwYWNlIChNIG9yIE0rMiByb3cgZ3JvdXBzKS4gKi8KKyAgSlNBTVBBUlJBWSBidWZmZXJbTUFYX0NPTVBPTkVOVFNdOworCisgIGJvb2xlYW4gYnVmZmVyX2Z1bGw7CQkvKiBIYXZlIHdlIGdvdHRlbiBhbiBpTUNVIHJvdyBmcm9tIGRlY29kZXI/ICovCisgIEpESU1FTlNJT04gcm93Z3JvdXBfY3RyOwkvKiBjb3VudHMgcm93IGdyb3VwcyBvdXRwdXQgdG8gcG9zdHByb2Nlc3NvciAqLworCisgIC8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIG9ubHkgdXNlZCBpbiB0aGUgY29udGV4dCBjYXNlLiAqLworCisgIC8qIFRoZXNlIGFyZSB0aGUgbWFzdGVyIHBvaW50ZXJzIHRvIHRoZSBmdW5ueS1vcmRlciBwb2ludGVyIGxpc3RzLiAqLworICBKU0FNUElNQUdFIHhidWZmZXJbMl07CS8qIHBvaW50ZXJzIHRvIHdlaXJkIHBvaW50ZXIgbGlzdHMgKi8KKworICBpbnQgd2hpY2hwdHI7CQkJLyogaW5kaWNhdGVzIHdoaWNoIHBvaW50ZXIgc2V0IGlzIG5vdyBpbiB1c2UgKi8KKyAgaW50IGNvbnRleHRfc3RhdGU7CQkvKiBwcm9jZXNzX2RhdGEgc3RhdGUgbWFjaGluZSBzdGF0dXMgKi8KKyAgSkRJTUVOU0lPTiByb3dncm91cHNfYXZhaWw7CS8qIHJvdyBncm91cHMgYXZhaWxhYmxlIHRvIHBvc3Rwcm9jZXNzb3IgKi8KKyAgSkRJTUVOU0lPTiBpTUNVX3Jvd19jdHI7CS8qIGNvdW50cyBpTUNVIHJvd3MgdG8gZGV0ZWN0IGltYWdlIHRvcC9ib3QgKi8KK30gbXlfbWFpbl9jb250cm9sbGVyOworCit0eXBlZGVmIG15X21haW5fY29udHJvbGxlciAqIG15X21haW5fcHRyOworCisvKiBjb250ZXh0X3N0YXRlIHZhbHVlczogKi8KKyNkZWZpbmUgQ1RYX1BSRVBBUkVfRk9SX0lNQ1UJMAkvKiBuZWVkIHRvIHByZXBhcmUgZm9yIE1DVSByb3cgKi8KKyNkZWZpbmUgQ1RYX1BST0NFU1NfSU1DVQkxCS8qIGZlZWRpbmcgaU1DVSB0byBwb3N0cHJvY2Vzc29yICovCisjZGVmaW5lIENUWF9QT1NUUE9ORURfUk9XCTIJLyogZmVlZGluZyBwb3N0cG9uZWQgcm93IGdyb3VwICovCisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4KKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKwkgICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLCBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CitNRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX2NvbnRleHRfbWFpbgorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorCSAgICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKK01FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfY3JhbmtfcG9zdAorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorCSAgICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKKyNlbmRpZgorCisKK0xPQ0FMKHZvaWQpCithbGxvY19mdW5ueV9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZnVubnkgcG9pbnRlciBsaXN0cy4KKyAqIFRoaXMgaXMgZG9uZSBvbmx5IG9uY2UsIG5vdCBvbmNlIHBlciBwYXNzLgorICovCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworICBpbnQgY2ksIHJncm91cDsKKyAgaW50IE0gPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlNBTVBBUlJBWSB4YnVmOworCisgIC8qIEdldCB0b3AtbGV2ZWwgc3BhY2UgZm9yIGNvbXBvbmVudCBhcnJheSBwb2ludGVycy4KKyAgICogV2UgYWxsb2MgYm90aCBhcnJheXMgd2l0aCBvbmUgY2FsbCB0byBzYXZlIGEgZmV3IGN5Y2xlcy4KKyAgICovCisgIG1haW4tPnhidWZmZXJbMF0gPSAoSlNBTVBJTUFHRSkKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCWNpbmZvLT5udW1fY29tcG9uZW50cyAqIDIgKiBTSVpFT0YoSlNBTVBBUlJBWSkpOworICBtYWluLT54YnVmZmVyWzFdID0gbWFpbi0+eGJ1ZmZlclswXSArIGNpbmZvLT5udW1fY29tcG9uZW50czsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisgICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLworICAgIC8qIEdldCBzcGFjZSBmb3IgcG9pbnRlciBsaXN0cyAtLS0gTSs0IHJvdyBncm91cHMgaW4gZWFjaCBsaXN0LgorICAgICAqIFdlIGFsbG9jIGJvdGggcG9pbnRlciBsaXN0cyB3aXRoIG9uZSBjYWxsIHRvIHNhdmUgYSBmZXcgY3ljbGVzLgorICAgICAqLworICAgIHhidWYgPSAoSlNBTVBBUlJBWSkKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAyICogKHJncm91cCAqIChNICsgNCkpICogU0laRU9GKEpTQU1QUk9XKSk7CisgICAgeGJ1ZiArPSByZ3JvdXA7CQkvKiB3YW50IG9uZSByb3cgZ3JvdXAgYXQgbmVnYXRpdmUgb2Zmc2V0cyAqLworICAgIG1haW4tPnhidWZmZXJbMF1bY2ldID0geGJ1ZjsKKyAgICB4YnVmICs9IHJncm91cCAqIChNICsgNCk7CisgICAgbWFpbi0+eGJ1ZmZlclsxXVtjaV0gPSB4YnVmOworICB9Cit9CisKKworTE9DQUwodm9pZCkKK21ha2VfZnVubnlfcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBDcmVhdGUgdGhlIGZ1bm55IHBvaW50ZXIgbGlzdHMgZGlzY3Vzc2VkIGluIHRoZSBjb21tZW50cyBhYm92ZS4KKyAqIFRoZSBhY3R1YWwgd29ya3NwYWNlIGlzIGFscmVhZHkgYWxsb2NhdGVkIChpbiBtYWluLT5idWZmZXIpLAorICogYW5kIHRoZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXIgbGlzdHMgaXMgYWxsb2NhdGVkIHRvby4KKyAqIFRoaXMgcm91dGluZSBqdXN0IGZpbGxzIGluIHRoZSBjdXJpb3VzbHkgb3JkZXJlZCBsaXN0cy4KKyAqIFRoaXMgd2lsbCBiZSByZXBlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGFzcy4KKyAqLworeworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKyAgaW50IGNpLCBpLCByZ3JvdXA7CisgIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpTQU1QQVJSQVkgYnVmLCB4YnVmMCwgeGJ1ZjE7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLworICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KKyAgICB4YnVmMCA9IG1haW4tPnhidWZmZXJbMF1bY2ldOworICAgIHhidWYxID0gbWFpbi0+eGJ1ZmZlclsxXVtjaV07CisgICAgLyogRmlyc3QgY29weSB0aGUgd29ya3NwYWNlIHBvaW50ZXJzIGFzLWlzICovCisgICAgYnVmID0gbWFpbi0+YnVmZmVyW2NpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwICogKE0gKyAyKTsgaSsrKSB7CisgICAgICB4YnVmMFtpXSA9IHhidWYxW2ldID0gYnVmW2ldOworICAgIH0KKyAgICAvKiBJbiB0aGUgc2Vjb25kIGxpc3QsIHB1dCB0aGUgbGFzdCBmb3VyIHJvdyBncm91cHMgaW4gc3dhcHBlZCBvcmRlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXAgKiAyOyBpKyspIHsKKyAgICAgIHhidWYxW3Jncm91cCooTS0yKSArIGldID0gYnVmW3Jncm91cCpNICsgaV07CisgICAgICB4YnVmMVtyZ3JvdXAqTSArIGldID0gYnVmW3Jncm91cCooTS0yKSArIGldOworICAgIH0KKyAgICAvKiBUaGUgd3JhcGFyb3VuZCBwb2ludGVycyBhdCB0b3AgYW5kIGJvdHRvbSB3aWxsIGJlIGZpbGxlZCBsYXRlcgorICAgICAqIChzZWUgc2V0X3dyYXBhcm91bmRfcG9pbnRlcnMsIGJlbG93KS4gIEluaXRpYWxseSB3ZSB3YW50IHRoZSAiYWJvdmUiCisgICAgICogcG9pbnRlcnMgdG8gZHVwbGljYXRlIHRoZSBmaXJzdCBhY3R1YWwgZGF0YSBsaW5lLiAgVGhpcyBvbmx5IG5lZWRzCisgICAgICogdG8gaGFwcGVuIGluIHhidWZmZXJbMF0uCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHJncm91cDsgaSsrKSB7CisgICAgICB4YnVmMFtpIC0gcmdyb3VwXSA9IHhidWYwWzBdOworICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitzZXRfd3JhcGFyb3VuZF9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFNldCB1cCB0aGUgIndyYXBhcm91bmQiIHBvaW50ZXJzIGF0IHRvcCBhbmQgYm90dG9tIG9mIHRoZSBwb2ludGVyIGxpc3RzLgorICogVGhpcyBjaGFuZ2VzIHRoZSBwb2ludGVyIGxpc3Qgc3RhdGUgZnJvbSB0b3Atb2YtaW1hZ2UgdG8gdGhlIG5vcm1hbCBzdGF0ZS4KKyAqLworeworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKyAgaW50IGNpLCBpLCByZ3JvdXA7CisgIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpTQU1QQVJSQVkgeGJ1ZjAsIHhidWYxOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KKyAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCisgICAgeGJ1ZjAgPSBtYWluLT54YnVmZmVyWzBdW2NpXTsKKyAgICB4YnVmMSA9IG1haW4tPnhidWZmZXJbMV1bY2ldOworICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXA7IGkrKykgeworICAgICAgeGJ1ZjBbaSAtIHJncm91cF0gPSB4YnVmMFtyZ3JvdXAqKE0rMSkgKyBpXTsKKyAgICAgIHhidWYxW2kgLSByZ3JvdXBdID0geGJ1ZjFbcmdyb3VwKihNKzEpICsgaV07CisgICAgICB4YnVmMFtyZ3JvdXAqKE0rMikgKyBpXSA9IHhidWYwW2ldOworICAgICAgeGJ1ZjFbcmdyb3VwKihNKzIpICsgaV0gPSB4YnVmMVtpXTsKKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorc2V0X2JvdHRvbV9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIENoYW5nZSB0aGUgcG9pbnRlciBsaXN0cyB0byBkdXBsaWNhdGUgdGhlIGxhc3Qgc2FtcGxlIHJvdyBhdCB0aGUgYm90dG9tCisgKiBvZiB0aGUgaW1hZ2UuICB3aGljaHB0ciBpbmRpY2F0ZXMgd2hpY2ggeGJ1ZmZlciBob2xkcyB0aGUgZmluYWwgaU1DVSByb3cuCisgKiBBbHNvIHNldHMgcm93Z3JvdXBzX2F2YWlsIHRvIGluZGljYXRlIG51bWJlciBvZiBub25kdW1teSByb3cgZ3JvdXBzIGluIHJvdy4KKyAqLworeworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKyAgaW50IGNpLCBpLCByZ3JvdXAsIGlNQ1VoZWlnaHQsIHJvd3NfbGVmdDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlNBTVBBUlJBWSB4YnVmOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQ291bnQgc2FtcGxlIHJvd3MgaW4gb25lIGlNQ1Ugcm93IGFuZCBpbiBvbmUgcm93IGdyb3VwICovCisgICAgaU1DVWhlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisgICAgcmdyb3VwID0gaU1DVWhlaWdodCAvIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICAgIC8qIENvdW50IG5vbmR1bW15IHNhbXBsZSByb3dzIHJlbWFpbmluZyBmb3IgdGhpcyBjb21wb25lbnQgKi8KKyAgICByb3dzX2xlZnQgPSAoaW50KSAoY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ICUgKEpESU1FTlNJT04pIGlNQ1VoZWlnaHQpOworICAgIGlmIChyb3dzX2xlZnQgPT0gMCkgcm93c19sZWZ0ID0gaU1DVWhlaWdodDsKKyAgICAvKiBDb3VudCBub25kdW1teSByb3cgZ3JvdXBzLiAgU2hvdWxkIGdldCBzYW1lIGFuc3dlciBmb3IgZWFjaCBjb21wb25lbnQsCisgICAgICogc28gd2UgbmVlZCBvbmx5IGRvIGl0IG9uY2UuCisgICAgICovCisgICAgaWYgKGNpID09IDApIHsKKyAgICAgIG1haW4tPnJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSAoKHJvd3NfbGVmdC0xKSAvIHJncm91cCArIDEpOworICAgIH0KKyAgICAvKiBEdXBsaWNhdGUgdGhlIGxhc3QgcmVhbCBzYW1wbGUgcm93IHJncm91cCoyIHRpbWVzOyB0aGlzIHBhZHMgb3V0IHRoZQorICAgICAqIGxhc3QgcGFydGlhbCByb3dncm91cCBhbmQgZW5zdXJlcyBhdCBsZWFzdCBvbmUgZnVsbCByb3dncm91cCBvZiBjb250ZXh0LgorICAgICAqLworICAgIHhidWYgPSBtYWluLT54YnVmZmVyW21haW4tPndoaWNocHRyXVtjaV07CisgICAgZm9yIChpID0gMDsgaSA8IHJncm91cCAqIDI7IGkrKykgeworICAgICAgeGJ1Zltyb3dzX2xlZnQgKyBpXSA9IHhidWZbcm93c19sZWZ0LTFdOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfbWFpbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworCisgIHN3aXRjaCAocGFzc19tb2RlKSB7CisgIGNhc2UgSkJVRl9QQVNTX1RIUlU6CisgICAgaWYgKGNpbmZvLT51cHNhbXBsZS0+bmVlZF9jb250ZXh0X3Jvd3MpIHsKKyAgICAgIG1haW4tPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfY29udGV4dF9tYWluOworICAgICAgbWFrZV9mdW5ueV9wb2ludGVycyhjaW5mbyk7IC8qIENyZWF0ZSB0aGUgeGJ1ZmZlcltdIGxpc3RzICovCisgICAgICBtYWluLT53aGljaHB0ciA9IDA7CS8qIFJlYWQgZmlyc3QgaU1DVSByb3cgaW50byB4YnVmZmVyWzBdICovCisgICAgICBtYWluLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BSRVBBUkVfRk9SX0lNQ1U7CisgICAgICBtYWluLT5pTUNVX3Jvd19jdHIgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvKiBTaW1wbGUgY2FzZSB3aXRoIG5vIGNvbnRleHQgbmVlZGVkICovCisgICAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluOworICAgIH0KKyAgICBtYWluLT5idWZmZXJfZnVsbCA9IEZBTFNFOwkvKiBNYXJrIGJ1ZmZlciBlbXB0eSAqLworICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgICAgYnJlYWs7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgIGNhc2UgSkJVRl9DUkFOS19ERVNUOgorICAgIC8qIEZvciBsYXN0IHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiwganVzdCBjcmFuayB0aGUgcG9zdHByb2Nlc3NvciAqLworICAgIG1haW4tPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfY3JhbmtfcG9zdDsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YS4KKyAqIFRoaXMgaGFuZGxlcyB0aGUgc2ltcGxlIGNhc2Ugd2hlcmUgbm8gY29udGV4dCBpcyByZXF1aXJlZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Byb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJCSAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisgIEpESU1FTlNJT04gcm93Z3JvdXBzX2F2YWlsOworCisgIC8qIFJlYWQgaW5wdXQgZGF0YSBpZiB3ZSBoYXZlbid0IGZpbGxlZCB0aGUgbWFpbiBidWZmZXIgeWV0ICovCisgIGlmICghIG1haW4tPmJ1ZmZlcl9mdWxsKSB7CisgICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+ZGVjb21wcmVzc19kYXRhKSAoY2luZm8sIG1haW4tPmJ1ZmZlcikpCisgICAgICByZXR1cm47CQkJLyogc3VzcGVuc2lvbiBmb3JjZWQsIGNhbiBkbyBub3RoaW5nIG1vcmUgKi8KKyAgICBtYWluLT5idWZmZXJfZnVsbCA9IFRSVUU7CS8qIE9LLCB3ZSBoYXZlIGFuIGlNQ1Ugcm93IHRvIHdvcmsgd2l0aCAqLworICB9CisKKyAgLyogVGhlcmUgYXJlIGFsd2F5cyBtaW5fRENUX3NjYWxlZF9zaXplIHJvdyBncm91cHMgaW4gYW4gaU1DVSByb3cuICovCisgIHJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgLyogTm90ZTogYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHdlIG1heSBwYXNzIGV4dHJhIGdhcmJhZ2Ugcm93IGdyb3VwcworICAgKiB0byB0aGUgcG9zdHByb2Nlc3Nvci4gIFRoZSBwb3N0cHJvY2Vzc29yIGhhcyB0byBjaGVjayBmb3IgYm90dG9tCisgICAqIG9mIGltYWdlIGFueXdheSAoYXQgcm93IHJlc29sdXRpb24pLCBzbyBubyBwb2ludCBpbiB1cyBkb2luZyBpdCB0b28uCisgICAqLworCisgIC8qIEZlZWQgdGhlIHBvc3Rwcm9jZXNzb3IgKi8KKyAgKCpjaW5mby0+cG9zdC0+cG9zdF9wcm9jZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+YnVmZmVyLAorCQkJCSAgICAgJm1haW4tPnJvd2dyb3VwX2N0ciwgcm93Z3JvdXBzX2F2YWlsLAorCQkJCSAgICAgb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKKworICAvKiBIYXMgcG9zdHByb2Nlc3NvciBjb25zdW1lZCBhbGwgdGhlIGRhdGEgeWV0PyBJZiBzbywgbWFyayBidWZmZXIgZW1wdHkgKi8KKyAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA+PSByb3dncm91cHNfYXZhaWwpIHsKKyAgICBtYWluLT5idWZmZXJfZnVsbCA9IEZBTFNFOworICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgIH0KK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEuCisgKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgY29udGV4dCByb3dzIG11c3QgYmUgcHJvdmlkZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcm9jZXNzX2RhdGFfY29udGV4dF9tYWluIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJCSAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworCisgIC8qIFJlYWQgaW5wdXQgZGF0YSBpZiB3ZSBoYXZlbid0IGZpbGxlZCB0aGUgbWFpbiBidWZmZXIgeWV0ICovCisgIGlmICghIG1haW4tPmJ1ZmZlcl9mdWxsKSB7CisgICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+ZGVjb21wcmVzc19kYXRhKSAoY2luZm8sCisJCQkJCSAgIG1haW4tPnhidWZmZXJbbWFpbi0+d2hpY2hwdHJdKSkKKyAgICAgIHJldHVybjsJCQkvKiBzdXNwZW5zaW9uIGZvcmNlZCwgY2FuIGRvIG5vdGhpbmcgbW9yZSAqLworICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gVFJVRTsJLyogT0ssIHdlIGhhdmUgYW4gaU1DVSByb3cgdG8gd29yayB3aXRoICovCisgICAgbWFpbi0+aU1DVV9yb3dfY3RyKys7CS8qIGNvdW50IHJvd3MgcmVjZWl2ZWQgKi8KKyAgfQorCisgIC8qIFBvc3Rwcm9jZXNzb3IgdHlwaWNhbGx5IHdpbGwgbm90IHN3YWxsb3cgYWxsIHRoZSBpbnB1dCBkYXRhIGl0IGlzIGhhbmRlZAorICAgKiBpbiBvbmUgY2FsbCAoZHVlIHRvIGZpbGxpbmcgdGhlIG91dHB1dCBidWZmZXIgZmlyc3QpLiAgTXVzdCBiZSBwcmVwYXJlZAorICAgKiB0byBleGl0IGFuZCByZXN0YXJ0LiAgVGhpcyBzd2l0Y2ggbGV0cyB1cyBrZWVwIHRyYWNrIG9mIGhvdyBmYXIgd2UgZ290LgorICAgKiBOb3RlIHRoYXQgZWFjaCBjYXNlIGZhbGxzIHRocm91Z2ggdG8gdGhlIG5leHQgb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgorICAgKi8KKyAgc3dpdGNoIChtYWluLT5jb250ZXh0X3N0YXRlKSB7CisgIGNhc2UgQ1RYX1BPU1RQT05FRF9ST1c6CisgICAgLyogQ2FsbCBwb3N0cHJvY2Vzc29yIHVzaW5nIHByZXZpb3VzbHkgc2V0IHBvaW50ZXJzIGZvciBwb3N0cG9uZWQgcm93ICovCisgICAgKCpjaW5mby0+cG9zdC0+cG9zdF9wcm9jZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+eGJ1ZmZlclttYWluLT53aGljaHB0cl0sCisJCQkmbWFpbi0+cm93Z3JvdXBfY3RyLCBtYWluLT5yb3dncm91cHNfYXZhaWwsCisJCQlvdXRwdXRfYnVmLCBvdXRfcm93X2N0ciwgb3V0X3Jvd3NfYXZhaWwpOworICAgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPCBtYWluLT5yb3dncm91cHNfYXZhaWwpCisgICAgICByZXR1cm47CQkJLyogTmVlZCB0byBzdXNwZW5kICovCisgICAgbWFpbi0+Y29udGV4dF9zdGF0ZSA9IENUWF9QUkVQQVJFX0ZPUl9JTUNVOworICAgIGlmICgqb3V0X3Jvd19jdHIgPj0gb3V0X3Jvd3NfYXZhaWwpCisgICAgICByZXR1cm47CQkJLyogUG9zdHByb2Nlc3NvciBleGFjdGx5IGZpbGxlZCBvdXRwdXQgYnVmICovCisgICAgLypGQUxMVEhST1VHSCovCisgIGNhc2UgQ1RYX1BSRVBBUkVfRk9SX0lNQ1U6CisgICAgLyogUHJlcGFyZSB0byBwcm9jZXNzIGZpcnN0IE0tMSByb3cgZ3JvdXBzIG9mIHRoaXMgaU1DVSByb3cgKi8KKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOworICAgIG1haW4tPnJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgLSAxKTsKKyAgICAvKiBDaGVjayBmb3IgYm90dG9tIG9mIGltYWdlOiBpZiBzbywgdHdlYWsgcG9pbnRlcnMgdG8gImR1cGxpY2F0ZSIKKyAgICAgKiB0aGUgbGFzdCBzYW1wbGUgcm93LCBhbmQgYWRqdXN0IHJvd2dyb3Vwc19hdmFpbCB0byBpZ25vcmUgcGFkZGluZyByb3dzLgorICAgICAqLworICAgIGlmIChtYWluLT5pTUNVX3Jvd19jdHIgPT0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykKKyAgICAgIHNldF9ib3R0b21fcG9pbnRlcnMoY2luZm8pOworICAgIG1haW4tPmNvbnRleHRfc3RhdGUgPSBDVFhfUFJPQ0VTU19JTUNVOworICAgIC8qRkFMTFRIUk9VR0gqLworICBjYXNlIENUWF9QUk9DRVNTX0lNQ1U6CisgICAgLyogQ2FsbCBwb3N0cHJvY2Vzc29yIHVzaW5nIHByZXZpb3VzbHkgc2V0IHBvaW50ZXJzICovCisgICAgKCpjaW5mby0+cG9zdC0+cG9zdF9wcm9jZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+eGJ1ZmZlclttYWluLT53aGljaHB0cl0sCisJCQkmbWFpbi0+cm93Z3JvdXBfY3RyLCBtYWluLT5yb3dncm91cHNfYXZhaWwsCisJCQlvdXRwdXRfYnVmLCBvdXRfcm93X2N0ciwgb3V0X3Jvd3NfYXZhaWwpOworICAgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPCBtYWluLT5yb3dncm91cHNfYXZhaWwpCisgICAgICByZXR1cm47CQkJLyogTmVlZCB0byBzdXNwZW5kICovCisgICAgLyogQWZ0ZXIgdGhlIGZpcnN0IGlNQ1UsIGNoYW5nZSB3cmFwYXJvdW5kIHBvaW50ZXJzIHRvIG5vcm1hbCBzdGF0ZSAqLworICAgIGlmIChtYWluLT5pTUNVX3Jvd19jdHIgPT0gMSkKKyAgICAgIHNldF93cmFwYXJvdW5kX3BvaW50ZXJzKGNpbmZvKTsKKyAgICAvKiBQcmVwYXJlIHRvIGxvYWQgbmV3IGlNQ1Ugcm93IHVzaW5nIG90aGVyIHhidWZmZXIgbGlzdCAqLworICAgIG1haW4tPndoaWNocHRyIF49IDE7CS8qIDA9PjEgb3IgMT0+MCAqLworICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gRkFMU0U7CisgICAgLyogU3RpbGwgbmVlZCB0byBwcm9jZXNzIGxhc3Qgcm93IGdyb3VwIG9mIHRoaXMgaU1DVSByb3csICovCisgICAgLyogd2hpY2ggaXMgc2F2ZWQgYXQgaW5kZXggTSsxIG9mIHRoZSBvdGhlciB4YnVmZmVyICovCisgICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gKEpESU1FTlNJT04pIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSArIDEpOworICAgIG1haW4tPnJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAyKTsKKyAgICBtYWluLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BPU1RQT05FRF9ST1c7CisgIH0KK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEuCisgKiBGaW5hbCBwYXNzIG9mIHR3by1wYXNzIHF1YW50aXphdGlvbjoganVzdCBjYWxsIHRoZSBwb3N0cHJvY2Vzc29yLgorICogU291cmNlIGRhdGEgd2lsbCBiZSB0aGUgcG9zdHByb2Nlc3NvciBjb250cm9sbGVyJ3MgaW50ZXJuYWwgYnVmZmVyLgorICovCisKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKworTUVUSE9EREVGKHZvaWQpCitwcm9jZXNzX2RhdGFfY3JhbmtfcG9zdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkJIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCit7CisgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIChKU0FNUElNQUdFKSBOVUxMLAorCQkJCSAgICAgKEpESU1FTlNJT04gKikgTlVMTCwgKEpESU1FTlNJT04pIDAsCisJCQkJICAgICBvdXRwdXRfYnVmLCBvdXRfcm93X2N0ciwgb3V0X3Jvd3NfYXZhaWwpOworfQorCisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgbWFpbiBidWZmZXIgY29udHJvbGxlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2RfbWFpbl9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X21haW5fcHRyIG1haW47CisgIGludCBjaSwgcmdyb3VwLCBuZ3JvdXBzOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIG1haW4gPSAobXlfbWFpbl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfbWFpbl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5tYWluID0gKHN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyICopIG1haW47CisgIG1haW4tPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19tYWluOworCisgIGlmIChuZWVkX2Z1bGxfYnVmZmVyKQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKworICAvKiBBbGxvY2F0ZSB0aGUgd29ya3NwYWNlLgorICAgKiBuZ3JvdXBzIGlzIHRoZSBudW1iZXIgb2Ygcm93IGdyb3VwcyB3ZSBuZWVkLgorICAgKi8KKyAgaWYgKGNpbmZvLT51cHNhbXBsZS0+bmVlZF9jb250ZXh0X3Jvd3MpIHsKKyAgICBpZiAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPCAyKSAvKiB1bnN1cHBvcnRlZCwgc2VlIGNvbW1lbnRzIGFib3ZlICovCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOworICAgIGFsbG9jX2Z1bm55X3BvaW50ZXJzKGNpbmZvKTsgLyogQWxsb2Mgc3BhY2UgZm9yIHhidWZmZXJbXSBsaXN0cyAqLworICAgIG5ncm91cHMgPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSArIDI7CisgIH0gZWxzZSB7CisgICAgbmdyb3VwcyA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICB9CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLworICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KKyAgICBtYWluLT5idWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisJCQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSwKKwkJCSAoSkRJTUVOU0lPTikgKHJncm91cCAqIG5ncm91cHMpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamRtYXJrZXIuYyBiL2NvbW1vbi9qcGVnL2pkbWFya2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjY2E4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pkbWFya2VyLmMKQEAgLTAsMCArMSwxMzYwIEBACisvKgorICogamRtYXJrZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIGRlY29kZSBKUEVHIGRhdGFzdHJlYW0gbWFya2Vycy4KKyAqIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgYXJpc2VzIGZyb20gb3VyIGRlc2lyZSB0byBzdXBwb3J0IGlucHV0CisgKiBzdXNwZW5zaW9uOiBpZiBub3QgYWxsIG9mIHRoZSBkYXRhIGZvciBhIG1hcmtlciBpcyBhdmFpbGFibGUsCisgKiB3ZSBtdXN0IGV4aXQgYmFjayB0byB0aGUgYXBwbGljYXRpb24uICBPbiByZXN1bXB0aW9uLCB3ZSByZXByb2Nlc3MKKyAqIHRoZSBtYXJrZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKK3R5cGVkZWYgZW51bSB7CQkJLyogSlBFRyBtYXJrZXIgY29kZXMgKi8KKyAgTV9TT0YwICA9IDB4YzAsCisgIE1fU09GMSAgPSAweGMxLAorICBNX1NPRjIgID0gMHhjMiwKKyAgTV9TT0YzICA9IDB4YzMsCisgIAorICBNX1NPRjUgID0gMHhjNSwKKyAgTV9TT0Y2ICA9IDB4YzYsCisgIE1fU09GNyAgPSAweGM3LAorICAKKyAgTV9KUEcgICA9IDB4YzgsCisgIE1fU09GOSAgPSAweGM5LAorICBNX1NPRjEwID0gMHhjYSwKKyAgTV9TT0YxMSA9IDB4Y2IsCisgIAorICBNX1NPRjEzID0gMHhjZCwKKyAgTV9TT0YxNCA9IDB4Y2UsCisgIE1fU09GMTUgPSAweGNmLAorICAKKyAgTV9ESFQgICA9IDB4YzQsCisgIAorICBNX0RBQyAgID0gMHhjYywKKyAgCisgIE1fUlNUMCAgPSAweGQwLAorICBNX1JTVDEgID0gMHhkMSwKKyAgTV9SU1QyICA9IDB4ZDIsCisgIE1fUlNUMyAgPSAweGQzLAorICBNX1JTVDQgID0gMHhkNCwKKyAgTV9SU1Q1ICA9IDB4ZDUsCisgIE1fUlNUNiAgPSAweGQ2LAorICBNX1JTVDcgID0gMHhkNywKKyAgCisgIE1fU09JICAgPSAweGQ4LAorICBNX0VPSSAgID0gMHhkOSwKKyAgTV9TT1MgICA9IDB4ZGEsCisgIE1fRFFUICAgPSAweGRiLAorICBNX0ROTCAgID0gMHhkYywKKyAgTV9EUkkgICA9IDB4ZGQsCisgIE1fREhQICAgPSAweGRlLAorICBNX0VYUCAgID0gMHhkZiwKKyAgCisgIE1fQVBQMCAgPSAweGUwLAorICBNX0FQUDEgID0gMHhlMSwKKyAgTV9BUFAyICA9IDB4ZTIsCisgIE1fQVBQMyAgPSAweGUzLAorICBNX0FQUDQgID0gMHhlNCwKKyAgTV9BUFA1ICA9IDB4ZTUsCisgIE1fQVBQNiAgPSAweGU2LAorICBNX0FQUDcgID0gMHhlNywKKyAgTV9BUFA4ICA9IDB4ZTgsCisgIE1fQVBQOSAgPSAweGU5LAorICBNX0FQUDEwID0gMHhlYSwKKyAgTV9BUFAxMSA9IDB4ZWIsCisgIE1fQVBQMTIgPSAweGVjLAorICBNX0FQUDEzID0gMHhlZCwKKyAgTV9BUFAxNCA9IDB4ZWUsCisgIE1fQVBQMTUgPSAweGVmLAorICAKKyAgTV9KUEcwICA9IDB4ZjAsCisgIE1fSlBHMTMgPSAweGZkLAorICBNX0NPTSAgID0gMHhmZSwKKyAgCisgIE1fVEVNICAgPSAweDAxLAorICAKKyAgTV9FUlJPUiA9IDB4MTAwCit9IEpQRUdfTUFSS0VSOworCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIEFwcGxpY2F0aW9uLW92ZXJyaWRhYmxlIG1hcmtlciBwcm9jZXNzaW5nIG1ldGhvZHMgKi8KKyAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCBwcm9jZXNzX0NPTTsKKyAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCBwcm9jZXNzX0FQUG5bMTZdOworCisgIC8qIExpbWl0IG9uIG1hcmtlciBkYXRhIGxlbmd0aCB0byBzYXZlIGZvciBlYWNoIG1hcmtlciB0eXBlICovCisgIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXRfQ09NOworICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0X0FQUG5bMTZdOworCisgIC8qIFN0YXR1cyBvZiBDT00vQVBQbiBtYXJrZXIgc2F2aW5nICovCisgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBjdXJfbWFya2VyOwkvKiBOVUxMIGlmIG5vdCBwcm9jZXNzaW5nIGEgbWFya2VyICovCisgIHVuc2lnbmVkIGludCBieXRlc19yZWFkOwkJLyogZGF0YSBieXRlcyByZWFkIHNvIGZhciBpbiBtYXJrZXIgKi8KKyAgLyogTm90ZTogY3VyX21hcmtlciBpcyBub3QgbGlua2VkIGludG8gbWFya2VyX2xpc3QgdW50aWwgaXQncyBhbGwgcmVhZC4gKi8KK30gbXlfbWFya2VyX3JlYWRlcjsKKwordHlwZWRlZiBteV9tYXJrZXJfcmVhZGVyICogbXlfbWFya2VyX3B0cjsKKworCisvKgorICogTWFjcm9zIGZvciBmZXRjaGluZyBkYXRhIGZyb20gdGhlIGRhdGEgc291cmNlIG1vZHVsZS4KKyAqCisgKiBBdCBhbGwgdGltZXMsIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSBhbmQgLT5ieXRlc19pbl9idWZmZXIgcmVmbGVjdAorICogdGhlIGN1cnJlbnQgcmVzdGFydCBwb2ludDsgd2UgdXBkYXRlIHRoZW0gb25seSB3aGVuIHdlIGhhdmUgcmVhY2hlZCBhCisgKiBzdWl0YWJsZSBwbGFjZSB0byByZXN0YXJ0IGlmIGEgc3VzcGVuc2lvbiBvY2N1cnMuCisgKi8KKworLyogRGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBsb2NhbCBjb3BpZXMgb2YgaW5wdXQgcG9pbnRlci9jb3VudCAqLworI2RlZmluZSBJTlBVVF9WQVJTKGNpbmZvKSAgXAorCXN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgKiBkYXRhc3JjID0gKGNpbmZvKS0+c3JjOyAgXAorCWNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZSA9IGRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZTsgIFwKKwlzaXplX3QgYnl0ZXNfaW5fYnVmZmVyID0gZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyCisKKy8qIFVubG9hZCB0aGUgbG9jYWwgY29waWVzIC0tLSBkbyB0aGlzIG9ubHkgYXQgYSByZXN0YXJ0IGJvdW5kYXJ5ICovCisjZGVmaW5lIElOUFVUX1NZTkMoY2luZm8pICBcCisJKCBkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGUsICBcCisJICBkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXIgKQorCisvKiBSZWxvYWQgdGhlIGxvY2FsIGNvcGllcyAtLS0gdXNlZCBvbmx5IGluIE1BS0VfQllURV9BVkFJTCAqLworI2RlZmluZSBJTlBVVF9SRUxPQUQoY2luZm8pICBcCisJKCBuZXh0X2lucHV0X2J5dGUgPSBkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGUsICBcCisJICBieXRlc19pbl9idWZmZXIgPSBkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIgKQorCisvKiBJbnRlcm5hbCBtYWNybyBmb3IgSU5QVVRfQllURSBhbmQgSU5QVVRfMkJZVEVTOiBtYWtlIGEgYnl0ZSBhdmFpbGFibGUuCisgKiBOb3RlIHdlIGRvICpub3QqIGRvIElOUFVUX1NZTkMgYmVmb3JlIGNhbGxpbmcgZmlsbF9pbnB1dF9idWZmZXIsCisgKiBidXQgd2UgbXVzdCByZWxvYWQgdGhlIGxvY2FsIGNvcGllcyBhZnRlciBhIHN1Y2Nlc3NmdWwgZmlsbC4KKyAqLworI2RlZmluZSBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKSAgXAorCWlmIChieXRlc19pbl9idWZmZXIgPT0gMCkgeyAgXAorCSAgaWYgKCEgKCpkYXRhc3JjLT5maWxsX2lucHV0X2J1ZmZlcikgKGNpbmZvKSkgIFwKKwkgICAgeyBhY3Rpb247IH0gIFwKKwkgIElOUFVUX1JFTE9BRChjaW5mbyk7ICBcCisJfQorCisvKiBSZWFkIGEgYnl0ZSBpbnRvIHZhcmlhYmxlIFYuCisgKiBJZiBtdXN0IHN1c3BlbmQsIHRha2UgdGhlIHNwZWNpZmllZCBhY3Rpb24gKHR5cGljYWxseSAicmV0dXJuIEZBTFNFIikuCisgKi8KKyNkZWZpbmUgSU5QVVRfQllURShjaW5mbyxWLGFjdGlvbikgIFwKKwlNQUtFU1RNVCggTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbik7IFwKKwkJICBieXRlc19pbl9idWZmZXItLTsgXAorCQkgIFYgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsgKQorCisvKiBBcyBhYm92ZSwgYnV0IHJlYWQgdHdvIGJ5dGVzIGludGVycHJldGVkIGFzIGFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyLgorICogViBzaG91bGQgYmUgZGVjbGFyZWQgdW5zaWduZWQgaW50IG9yIHBlcmhhcHMgSU5UMzIuCisgKi8KKyNkZWZpbmUgSU5QVVRfMkJZVEVTKGNpbmZvLFYsYWN0aW9uKSAgXAorCU1BS0VTVE1UKCBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKTsgXAorCQkgIGJ5dGVzX2luX2J1ZmZlci0tOyBcCisJCSAgViA9ICgodW5zaWduZWQgaW50KSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKSkgPDwgODsgXAorCQkgIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pOyBcCisJCSAgYnl0ZXNfaW5fYnVmZmVyLS07IFwKKwkJICBWICs9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOyApCisKKworLyoKKyAqIFJvdXRpbmVzIHRvIHByb2Nlc3MgSlBFRyBtYXJrZXJzLgorICoKKyAqIEVudHJ5IGNvbmRpdGlvbjogSlBFRyBtYXJrZXIgaXRzZWxmIGhhcyBiZWVuIHJlYWQgYW5kIGl0cyBjb2RlIHNhdmVkCisgKiAgIGluIGNpbmZvLT51bnJlYWRfbWFya2VyOyBpbnB1dCByZXN0YXJ0IHBvaW50IGlzIGp1c3QgYWZ0ZXIgdGhlIG1hcmtlci4KKyAqCisgKiBFeGl0OiBpZiByZXR1cm4gVFJVRSwgaGF2ZSByZWFkIGFuZCBwcm9jZXNzZWQgYW55IHBhcmFtZXRlcnMsIGFuZCBoYXZlCisgKiAgIHVwZGF0ZWQgdGhlIHJlc3RhcnQgcG9pbnQgdG8gcG9pbnQgYWZ0ZXIgdGhlIHBhcmFtZXRlcnMuCisgKiAgIElmIHJldHVybiBGQUxTRSwgd2FzIGZvcmNlZCB0byBzdXNwZW5kIGJlZm9yZSByZWFjaGluZyBlbmQgb2YKKyAqICAgbWFya2VyIHBhcmFtZXRlcnM7IHJlc3RhcnQgcG9pbnQgaGFzIG5vdCBiZWVuIG1vdmVkLiAgU2FtZSByb3V0aW5lCisgKiAgIHdpbGwgYmUgY2FsbGVkIGFnYWluIGFmdGVyIGFwcGxpY2F0aW9uIHN1cHBsaWVzIG1vcmUgaW5wdXQgZGF0YS4KKyAqCisgKiBUaGlzIGFwcHJvYWNoIHRvIHN1c3BlbnNpb24gYXNzdW1lcyB0aGF0IGFsbCBvZiBhIG1hcmtlcidzIHBhcmFtZXRlcnMKKyAqIGNhbiBmaXQgaW50byBhIHNpbmdsZSBpbnB1dCBidWZmZXJsb2FkLiAgVGhpcyBzaG91bGQgaG9sZCBmb3IgIm5vcm1hbCIKKyAqIG1hcmtlcnMuICBTb21lIENPTS9BUFBuIG1hcmtlcnMgbWlnaHQgaGF2ZSBsYXJnZSBwYXJhbWV0ZXIgc2VnbWVudHMKKyAqIHRoYXQgbWlnaHQgbm90IGZpdC4gIElmIHdlIGFyZSBzaW1wbHkgZHJvcHBpbmcgc3VjaCBhIG1hcmtlciwgd2UgdXNlCisgKiBza2lwX2lucHV0X2RhdGEgdG8gZ2V0IHBhc3QgaXQsIGFuZCB0aGVyZWJ5IHB1dCB0aGUgcHJvYmxlbSBvbiB0aGUKKyAqIHNvdXJjZSBtYW5hZ2VyJ3Mgc2hvdWxkZXJzLiAgSWYgd2UgYXJlIHNhdmluZyB0aGUgbWFya2VyJ3MgY29udGVudHMKKyAqIGludG8gbWVtb3J5LCB3ZSB1c2UgYSBzbGlnaHRseSBkaWZmZXJlbnQgY29udmVudGlvbjogd2hlbiBmb3JjZWQgdG8KKyAqIHN1c3BlbmQsIHRoZSBtYXJrZXIgcHJvY2Vzc29yIHVwZGF0ZXMgdGhlIHJlc3RhcnQgcG9pbnQgdG8gdGhlIGVuZCBvZgorICogd2hhdCBpdCdzIGNvbnN1bWVkIChpZSwgdGhlIGVuZCBvZiB0aGUgYnVmZmVyKSBiZWZvcmUgcmV0dXJuaW5nIEZBTFNFLgorICogT24gcmVzdW1wdGlvbiwgY2luZm8tPnVucmVhZF9tYXJrZXIgc3RpbGwgY29udGFpbnMgdGhlIG1hcmtlciBjb2RlLAorICogYnV0IHRoZSBkYXRhIHNvdXJjZSB3aWxsIHBvaW50IHRvIHRoZSBuZXh0IGNodW5rIG9mIG1hcmtlciBkYXRhLgorICogVGhlIG1hcmtlciBwcm9jZXNzb3IgbXVzdCByZXRhaW4gaW50ZXJuYWwgc3RhdGUgdG8gZGVhbCB3aXRoIHRoaXMuCisgKgorICogTm90ZSB0aGF0IHdlIGRvbid0IGJvdGhlciB0byBhdm9pZCBkdXBsaWNhdGUgdHJhY2UgbWVzc2FnZXMgaWYgYQorICogc3VzcGVuc2lvbiBvY2N1cnMgd2l0aGluIG1hcmtlciBwYXJhbWV0ZXJzLiAgT3RoZXIgc2lkZSBlZmZlY3RzCisgKiByZXF1aXJlIG1vcmUgY2FyZS4KKyAqLworCisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfc29pIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhbiBTT0kgbWFya2VyICovCit7CisgIGludCBpOworICAKKyAgVFJBQ0VNUyhjaW5mbywgMSwgSlRSQ19TT0kpOworCisgIGlmIChjaW5mby0+bWFya2VyLT5zYXdfU09JKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfU09JX0RVUExJQ0FURSk7CisKKyAgLyogUmVzZXQgYWxsIHBhcmFtZXRlcnMgdGhhdCBhcmUgZGVmaW5lZCB0byBiZSByZXNldCBieSBTT0kgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykgeworICAgIGNpbmZvLT5hcml0aF9kY19MW2ldID0gMDsKKyAgICBjaW5mby0+YXJpdGhfZGNfVVtpXSA9IDE7CisgICAgY2luZm8tPmFyaXRoX2FjX0tbaV0gPSA1OworICB9CisgIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gMDsKKworICAvKiBTZXQgaW5pdGlhbCBhc3N1bXB0aW9ucyBmb3IgY29sb3JzcGFjZSBldGMgKi8KKworICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19VTktOT1dOOworICBjaW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IEZBTFNFOyAvKiBBc3N1bWUgbm9uLUNDSVIgc2FtcGxpbmc/Pz8gKi8KKworICBjaW5mby0+c2F3X0pGSUZfbWFya2VyID0gRkFMU0U7CisgIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSAxOyAvKiBzZXQgZGVmYXVsdCBKRklGIEFQUDAgdmFsdWVzICovCisgIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSAxOworICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMDsKKyAgY2luZm8tPlhfZGVuc2l0eSA9IDE7CisgIGNpbmZvLT5ZX2RlbnNpdHkgPSAxOworICBjaW5mby0+c2F3X0Fkb2JlX21hcmtlciA9IEZBTFNFOworICBjaW5mby0+QWRvYmVfdHJhbnNmb3JtID0gMDsKKworICBjaW5mby0+bWFya2VyLT5zYXdfU09JID0gVFJVRTsKKworICByZXR1cm4gVFJVRTsKK30KKworCitMT0NBTChib29sZWFuKQorZ2V0X3NvZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc19wcm9nLCBib29sZWFuIGlzX2FyaXRoKQorLyogUHJvY2VzcyBhIFNPRm4gbWFya2VyICovCit7CisgIElOVDMyIGxlbmd0aDsKKyAgaW50IGMsIGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBpc19wcm9nOworICBjaW5mby0+YXJpdGhfY29kZSA9IGlzX2FyaXRoOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworCisgIElOUFVUX0JZVEUoY2luZm8sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiwgcmV0dXJuIEZBTFNFKTsKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBjaW5mby0+aW1hZ2VfaGVpZ2h0LCByZXR1cm4gRkFMU0UpOworICBJTlBVVF8yQllURVMoY2luZm8sIGNpbmZvLT5pbWFnZV93aWR0aCwgcmV0dXJuIEZBTFNFKTsKKyAgSU5QVVRfQllURShjaW5mbywgY2luZm8tPm51bV9jb21wb25lbnRzLCByZXR1cm4gRkFMU0UpOworCisgIGxlbmd0aCAtPSA4OworCisgIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX1NPRiwgY2luZm8tPnVucmVhZF9tYXJrZXIsCisJICAgKGludCkgY2luZm8tPmltYWdlX3dpZHRoLCAoaW50KSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAorCSAgIGNpbmZvLT5udW1fY29tcG9uZW50cyk7CisKKyAgaWYgKGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9TT0ZfRFVQTElDQVRFKTsKKworICAvKiBXZSBkb24ndCBzdXBwb3J0IGZpbGVzIGluIHdoaWNoIHRoZSBpbWFnZSBoZWlnaHQgaXMgaW5pdGlhbGx5IHNwZWNpZmllZCAqLworICAvKiBhcyAwIGFuZCBpcyBsYXRlciByZWRlZmluZWQgYnkgRE5MLiAgQXMgbG9uZyBhcyB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQsICAqLworICAvKiBtaWdodCBhcyB3ZWxsIGhhdmUgYSBnZW5lcmFsIHNhbml0eSBjaGVjay4gKi8KKyAgaWYgKGNpbmZvLT5pbWFnZV9oZWlnaHQgPD0gMCB8fCBjaW5mby0+aW1hZ2Vfd2lkdGggPD0gMAorICAgICAgfHwgY2luZm8tPm51bV9jb21wb25lbnRzIDw9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9FTVBUWV9JTUFHRSk7CisKKyAgaWYgKGxlbmd0aCAhPSAoY2luZm8tPm51bV9jb21wb25lbnRzICogMykpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKKworICBpZiAoY2luZm8tPmNvbXBfaW5mbyA9PSBOVUxMKQkvKiBkbyBvbmx5IG9uY2UsIGV2ZW4gaWYgc3VzcGVuZCAqLworICAgIGNpbmZvLT5jb21wX2luZm8gPSAoanBlZ19jb21wb25lbnRfaW5mbyAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorCQkJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCSBjaW5mby0+bnVtX2NvbXBvbmVudHMgKiBTSVpFT0YoanBlZ19jb21wb25lbnRfaW5mbykpOworICAKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICBjb21wcHRyLT5jb21wb25lbnRfaW5kZXggPSBjaTsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQsIHJldHVybiBGQUxTRSk7CisgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gKGMgPj4gNCkgJiAxNTsKKyAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yID0gKGMgICAgICkgJiAxNTsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBjb21wcHRyLT5xdWFudF90Ymxfbm8sIHJldHVybiBGQUxTRSk7CisKKyAgICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19TT0ZfQ09NUE9ORU5ULAorCSAgICAgY29tcHB0ci0+Y29tcG9uZW50X2lkLCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAorCSAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKKyAgfQorCisgIGNpbmZvLT5tYXJrZXItPnNhd19TT0YgPSBUUlVFOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCitMT0NBTChib29sZWFuKQorZ2V0X3NvcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFByb2Nlc3MgYSBTT1MgbWFya2VyICovCit7CisgIElOVDMyIGxlbmd0aDsKKyAgaW50IGksIGNpLCBuLCBjLCBjYzsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIGlmICghIGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9TT1NfTk9fU09GKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKworICBJTlBVVF9CWVRFKGNpbmZvLCBuLCByZXR1cm4gRkFMU0UpOyAvKiBOdW1iZXIgb2YgY29tcG9uZW50cyAqLworCisgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1NPUywgbik7CisKKyAgaWYgKGxlbmd0aCAhPSAobiAqIDIgKyA2KSB8fCBuIDwgMSB8fCBuID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKKworICBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IG47CisKKyAgLyogQ29sbGVjdCB0aGUgY29tcG9uZW50LXNwZWMgcGFyYW1ldGVycyAqLworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBjYywgcmV0dXJuIEZBTFNFKTsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICAgIAorICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgaWYgKGNjID09IGNvbXBwdHItPmNvbXBvbmVudF9pZCkKKwlnb3RvIGlkX2ZvdW5kOworICAgIH0KKworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9DT01QT05FTlRfSUQsIGNjKTsKKworICBpZF9mb3VuZDoKKworICAgIGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldID0gY29tcHB0cjsKKyAgICBjb21wcHRyLT5kY190Ymxfbm8gPSAoYyA+PiA0KSAmIDE1OworICAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChjICAgICApICYgMTU7CisgICAgCisgICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfU09TX0NPTVBPTkVOVCwgY2MsCisJICAgICBjb21wcHRyLT5kY190Ymxfbm8sIGNvbXBwdHItPmFjX3RibF9ubyk7CisgIH0KKworICAvKiBDb2xsZWN0IHRoZSBhZGRpdGlvbmFsIHNjYW4gcGFyYW1ldGVycyBTcywgU2UsIEFoL0FsLiAqLworICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICBjaW5mby0+U3MgPSBjOworICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICBjaW5mby0+U2UgPSBjOworICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICBjaW5mby0+QWggPSAoYyA+PiA0KSAmIDE1OworICBjaW5mby0+QWwgPSAoYyAgICAgKSAmIDE1OworCisgIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX1NPU19QQVJBTVMsIGNpbmZvLT5TcywgY2luZm8tPlNlLAorCSAgIGNpbmZvLT5BaCwgY2luZm8tPkFsKTsKKworICAvKiBQcmVwYXJlIHRvIHNjYW4gZGF0YSAmIHJlc3RhcnQgbWFya2VycyAqLworICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtID0gMDsKKworICAvKiBDb3VudCBhbm90aGVyIFNPUyBtYXJrZXIgKi8KKyAgY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyKys7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQKKworTE9DQUwoYm9vbGVhbikKK2dldF9kYWMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGEgREFDIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIGludCBpbmRleCwgdmFsOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgbGVuZ3RoIC09IDI7CisgIAorICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgIElOUFVUX0JZVEUoY2luZm8sIGluZGV4LCByZXR1cm4gRkFMU0UpOworICAgIElOUFVUX0JZVEUoY2luZm8sIHZhbCwgcmV0dXJuIEZBTFNFKTsKKworICAgIGxlbmd0aCAtPSAyOworCisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfREFDLCBpbmRleCwgdmFsKTsKKworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gKDIqTlVNX0FSSVRIX1RCTFMpKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfREFDX0lOREVYLCBpbmRleCk7CisKKyAgICBpZiAoaW5kZXggPj0gTlVNX0FSSVRIX1RCTFMpIHsgLyogZGVmaW5lIEFDIHRhYmxlICovCisgICAgICBjaW5mby0+YXJpdGhfYWNfS1tpbmRleC1OVU1fQVJJVEhfVEJMU10gPSAoVUlOVDgpIHZhbDsKKyAgICB9IGVsc2UgewkJCS8qIGRlZmluZSBEQyB0YWJsZSAqLworICAgICAgY2luZm8tPmFyaXRoX2RjX0xbaW5kZXhdID0gKFVJTlQ4KSAodmFsICYgMHgwRik7CisgICAgICBjaW5mby0+YXJpdGhfZGNfVVtpbmRleF0gPSAoVUlOVDgpICh2YWwgPj4gNCk7CisgICAgICBpZiAoY2luZm8tPmFyaXRoX2RjX0xbaW5kZXhdID4gY2luZm8tPmFyaXRoX2RjX1VbaW5kZXhdKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0RBQ19WQUxVRSwgdmFsKTsKKyAgICB9CisgIH0KKworICBpZiAobGVuZ3RoICE9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbHNlIC8qICEgRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVEICovCisKKyNkZWZpbmUgZ2V0X2RhYyhjaW5mbykgIHNraXBfdmFyaWFibGUoY2luZm8pCisKKyNlbmRpZiAvKiBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQgKi8KKworCitMT0NBTChib29sZWFuKQorZ2V0X2RodCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFByb2Nlc3MgYSBESFQgbWFya2VyICovCit7CisgIElOVDMyIGxlbmd0aDsKKyAgVUlOVDggYml0c1sxN107CisgIFVJTlQ4IGh1ZmZ2YWxbMjU2XTsKKyAgaW50IGksIGluZGV4LCBjb3VudDsKKyAgSkhVRkZfVEJMICoqaHRibHB0cjsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgIGxlbmd0aCAtPSAyOworICAKKyAgd2hpbGUgKGxlbmd0aCA+IDE2KSB7CisgICAgSU5QVVRfQllURShjaW5mbywgaW5kZXgsIHJldHVybiBGQUxTRSk7CisKKyAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19ESFQsIGluZGV4KTsKKyAgICAgIAorICAgIGJpdHNbMF0gPSAwOworICAgIGNvdW50ID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKKyAgICAgIElOUFVUX0JZVEUoY2luZm8sIGJpdHNbaV0sIHJldHVybiBGQUxTRSk7CisgICAgICBjb3VudCArPSBiaXRzW2ldOworICAgIH0KKworICAgIGxlbmd0aCAtPSAxICsgMTY7CisKKyAgICBUUkFDRU1TOChjaW5mbywgMiwgSlRSQ19IVUZGQklUUywKKwkgICAgIGJpdHNbMV0sIGJpdHNbMl0sIGJpdHNbM10sIGJpdHNbNF0sCisJICAgICBiaXRzWzVdLCBiaXRzWzZdLCBiaXRzWzddLCBiaXRzWzhdKTsKKyAgICBUUkFDRU1TOChjaW5mbywgMiwgSlRSQ19IVUZGQklUUywKKwkgICAgIGJpdHNbOV0sIGJpdHNbMTBdLCBiaXRzWzExXSwgYml0c1sxMl0sCisJICAgICBiaXRzWzEzXSwgYml0c1sxNF0sIGJpdHNbMTVdLCBiaXRzWzE2XSk7CisKKyAgICAvKiBIZXJlIHdlIGp1c3QgZG8gbWluaW1hbCB2YWxpZGF0aW9uIG9mIHRoZSBjb3VudHMgdG8gYXZvaWQgd2Fsa2luZworICAgICAqIG9mZiB0aGUgZW5kIG9mIG91ciB0YWJsZSBzcGFjZS4gIGpkaHVmZi5jIHdpbGwgY2hlY2sgbW9yZSBjYXJlZnVsbHkuCisgICAgICovCisgICAgaWYgKGNvdW50ID4gMjU2IHx8ICgoSU5UMzIpIGNvdW50KSA+IGxlbmd0aCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICBJTlBVVF9CWVRFKGNpbmZvLCBodWZmdmFsW2ldLCByZXR1cm4gRkFMU0UpOworCisgICAgbGVuZ3RoIC09IGNvdW50OworCisgICAgaWYgKGluZGV4ICYgMHgxMCkgewkJLyogQUMgdGFibGUgZGVmaW5pdGlvbiAqLworICAgICAgaW5kZXggLT0gMHgxMDsKKyAgICAgIGh0YmxwdHIgPSAmY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOworICAgIH0gZWxzZSB7CQkJLyogREMgdGFibGUgZGVmaW5pdGlvbiAqLworICAgICAgaHRibHB0ciA9ICZjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpbmRleF07CisgICAgfQorCisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBOVU1fSFVGRl9UQkxTKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfREhUX0lOREVYLCBpbmRleCk7CisKKyAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKKyAgICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgCisgICAgTUVNQ09QWSgoKmh0YmxwdHIpLT5iaXRzLCBiaXRzLCBTSVpFT0YoKCpodGJscHRyKS0+Yml0cykpOworICAgIE1FTUNPUFkoKCpodGJscHRyKS0+aHVmZnZhbCwgaHVmZnZhbCwgU0laRU9GKCgqaHRibHB0ciktPmh1ZmZ2YWwpKTsKKyAgfQorCisgIGlmIChsZW5ndGggIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCitMT0NBTChib29sZWFuKQorZ2V0X2RxdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFByb2Nlc3MgYSBEUVQgbWFya2VyICovCit7CisgIElOVDMyIGxlbmd0aDsKKyAgaW50IG4sIGksIHByZWM7CisgIHVuc2lnbmVkIGludCB0bXA7CisgIEpRVUFOVF9UQkwgKnF1YW50X3B0cjsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgIGxlbmd0aCAtPSAyOworCisgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgSU5QVVRfQllURShjaW5mbywgbiwgcmV0dXJuIEZBTFNFKTsKKyAgICBwcmVjID0gbiA+PiA0OworICAgIG4gJj0gMHgwRjsKKworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0RRVCwgbiwgcHJlYyk7CisKKyAgICBpZiAobiA+PSBOVU1fUVVBTlRfVEJMUykKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RRVF9JTkRFWCwgbik7CisgICAgICAKKyAgICBpZiAoY2luZm8tPnF1YW50X3RibF9wdHJzW25dID09IE5VTEwpCisgICAgICBjaW5mby0+cXVhbnRfdGJsX3B0cnNbbl0gPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICBxdWFudF9wdHIgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbbl07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgICAgaWYgKHByZWMpCisJSU5QVVRfMkJZVEVTKGNpbmZvLCB0bXAsIHJldHVybiBGQUxTRSk7CisgICAgICBlbHNlCisJSU5QVVRfQllURShjaW5mbywgdG1wLCByZXR1cm4gRkFMU0UpOworICAgICAgLyogV2UgY29udmVydCB0aGUgemlnemFnLW9yZGVyIHRhYmxlIHRvIG5hdHVyYWwgYXJyYXkgb3JkZXIuICovCisgICAgICBxdWFudF9wdHItPnF1YW50dmFsW2pwZWdfbmF0dXJhbF9vcmRlcltpXV0gPSAoVUlOVDE2KSB0bXA7CisgICAgfQorCisgICAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID49IDIpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSArPSA4KSB7CisJVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfUVVBTlRWQUxTLAorCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpXSwgICBxdWFudF9wdHItPnF1YW50dmFsW2krMV0sCisJCSBxdWFudF9wdHItPnF1YW50dmFsW2krMl0sIHF1YW50X3B0ci0+cXVhbnR2YWxbaSszXSwKKwkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs0XSwgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzVdLAorCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzZdLCBxdWFudF9wdHItPnF1YW50dmFsW2krN10pOworICAgICAgfQorICAgIH0KKworICAgIGxlbmd0aCAtPSBEQ1RTSVpFMisxOworICAgIGlmIChwcmVjKSBsZW5ndGggLT0gRENUU0laRTI7CisgIH0KKworICBpZiAobGVuZ3RoICE9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2dldF9kcmkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGEgRFJJIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIHVuc2lnbmVkIGludCB0bXA7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICAKKyAgaWYgKGxlbmd0aCAhPSA0KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCB0bXAsIHJldHVybiBGQUxTRSk7CisKKyAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfRFJJLCB0bXApOworCisgIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gdG1wOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogUm91dGluZXMgZm9yIHByb2Nlc3NpbmcgQVBQbiBhbmQgQ09NIG1hcmtlcnMuCisgKiBUaGVzZSBhcmUgZWl0aGVyIHNhdmVkIGluIG1lbW9yeSBvciBkaXNjYXJkZWQsIHBlciBhcHBsaWNhdGlvbiByZXF1ZXN0LgorICogQVBQMCBhbmQgQVBQMTQgYXJlIHNwZWNpYWxseSBjaGVja2VkIHRvIHNlZSBpZiB0aGV5IGFyZQorICogSkZJRiBhbmQgQWRvYmUgbWFya2VycywgcmVzcGVjdGl2ZWx5LgorICovCisKKyNkZWZpbmUgQVBQMF9EQVRBX0xFTgkxNAkvKiBMZW5ndGggb2YgaW50ZXJlc3RpbmcgZGF0YSBpbiBBUFAwICovCisjZGVmaW5lIEFQUDE0X0RBVEFfTEVOCTEyCS8qIExlbmd0aCBvZiBpbnRlcmVzdGluZyBkYXRhIGluIEFQUDE0ICovCisjZGVmaW5lIEFQUE5fREFUQV9MRU4JMTQJLyogTXVzdCBiZSB0aGUgbGFyZ2VzdCBvZiB0aGUgYWJvdmUhISAqLworCisKK0xPQ0FMKHZvaWQpCitleGFtaW5lX2FwcDAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpPQ1RFVCBGQVIgKiBkYXRhLAorCSAgICAgIHVuc2lnbmVkIGludCBkYXRhbGVuLCBJTlQzMiByZW1haW5pbmcpCisvKiBFeGFtaW5lIGZpcnN0IGZldyBieXRlcyBmcm9tIGFuIEFQUDAuCisgKiBUYWtlIGFwcHJvcHJpYXRlIGFjdGlvbiBpZiBpdCBpcyBhIEpGSUYgbWFya2VyLgorICogZGF0YWxlbiBpcyAjIG9mIGJ5dGVzIGF0IGRhdGFbXSwgcmVtYWluaW5nIGlzIGxlbmd0aCBvZiByZXN0IG9mIG1hcmtlciBkYXRhLgorICovCit7CisgIElOVDMyIHRvdGFsbGVuID0gKElOVDMyKSBkYXRhbGVuICsgcmVtYWluaW5nOworCisgIGlmIChkYXRhbGVuID49IEFQUDBfREFUQV9MRU4gJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzBdKSA9PSAweDRBICYmCisgICAgICBHRVRKT0NURVQoZGF0YVsxXSkgPT0gMHg0NiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMl0pID09IDB4NDkgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzNdKSA9PSAweDQ2ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVs0XSkgPT0gMCkgeworICAgIC8qIEZvdW5kIEpGSUYgQVBQMCBtYXJrZXI6IHNhdmUgaW5mbyAqLworICAgIGNpbmZvLT5zYXdfSkZJRl9tYXJrZXIgPSBUUlVFOworICAgIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSBHRVRKT0NURVQoZGF0YVs1XSk7CisgICAgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbiA9IEdFVEpPQ1RFVChkYXRhWzZdKTsKKyAgICBjaW5mby0+ZGVuc2l0eV91bml0ID0gR0VUSk9DVEVUKGRhdGFbN10pOworICAgIGNpbmZvLT5YX2RlbnNpdHkgPSAoR0VUSk9DVEVUKGRhdGFbOF0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbOV0pOworICAgIGNpbmZvLT5ZX2RlbnNpdHkgPSAoR0VUSk9DVEVUKGRhdGFbMTBdKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzExXSk7CisgICAgLyogQ2hlY2sgdmVyc2lvbi4KKyAgICAgKiBNYWpvciB2ZXJzaW9uIG11c3QgYmUgMSwgYW55dGhpbmcgZWxzZSBzaWduYWxzIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UuCisgICAgICogKFdlIHVzZWQgdG8gdHJlYXQgdGhpcyBhcyBhbiBlcnJvciwgYnV0IG5vdyBpdCdzIGEgbm9uZmF0YWwgd2FybmluZywKKyAgICAgKiBiZWNhdXNlIHNvbWUgYm96byBhdCBIaWphYWsgY291bGRuJ3QgcmVhZCB0aGUgc3BlYy4pCisgICAgICogTWlub3IgdmVyc2lvbiBzaG91bGQgYmUgMC4uMiwgYnV0IHByb2Nlc3MgYW55d2F5IGlmIG5ld2VyLgorICAgICAqLworICAgIGlmIChjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uICE9IDEpCisgICAgICBXQVJOTVMyKGNpbmZvLCBKV1JOX0pGSUZfTUFKT1IsCisJICAgICAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiwgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbik7CisgICAgLyogR2VuZXJhdGUgdHJhY2UgbWVzc2FnZXMgKi8KKyAgICBUUkFDRU1TNShjaW5mbywgMSwgSlRSQ19KRklGLAorCSAgICAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiwgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbiwKKwkgICAgIGNpbmZvLT5YX2RlbnNpdHksIGNpbmZvLT5ZX2RlbnNpdHksIGNpbmZvLT5kZW5zaXR5X3VuaXQpOworICAgIC8qIFZhbGlkYXRlIHRodW1ibmFpbCBkaW1lbnNpb25zIGFuZCBpc3N1ZSBhcHByb3ByaWF0ZSBtZXNzYWdlcyAqLworICAgIGlmIChHRVRKT0NURVQoZGF0YVsxMl0pIHwgR0VUSk9DVEVUKGRhdGFbMTNdKSkKKyAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0pGSUZfVEhVTUJOQUlMLAorCSAgICAgICBHRVRKT0NURVQoZGF0YVsxMl0pLCBHRVRKT0NURVQoZGF0YVsxM10pKTsKKyAgICB0b3RhbGxlbiAtPSBBUFAwX0RBVEFfTEVOOworICAgIGlmICh0b3RhbGxlbiAhPQorCSgoSU5UMzIpR0VUSk9DVEVUKGRhdGFbMTJdKSAqIChJTlQzMilHRVRKT0NURVQoZGF0YVsxM10pICogKElOVDMyKSAzKSkKKyAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0pGSUZfQkFEVEhVTUJOQUlMU0laRSwgKGludCkgdG90YWxsZW4pOworICB9IGVsc2UgaWYgKGRhdGFsZW4gPj0gNiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NEEgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzFdKSA9PSAweDQ2ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVsyXSkgPT0gMHg1OCAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbM10pID09IDB4NTggJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzRdKSA9PSAwKSB7CisgICAgLyogRm91bmQgSkZJRiAiSkZYWCIgZXh0ZW5zaW9uIEFQUDAgbWFya2VyICovCisgICAgLyogVGhlIGxpYnJhcnkgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyB3aXRoIHRoZXNlLAorICAgICAqIGJ1dCB3ZSB0cnkgdG8gcHJvZHVjZSBhIGhlbHBmdWwgdHJhY2UgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKEdFVEpPQ1RFVChkYXRhWzVdKSkgeworICAgIGNhc2UgMHgxMDoKKyAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1RIVU1CX0pQRUcsIChpbnQpIHRvdGFsbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMToKKyAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1RIVU1CX1BBTEVUVEUsIChpbnQpIHRvdGFsbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMzoKKyAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1RIVU1CX1JHQiwgKGludCkgdG90YWxsZW4pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0pGSUZfRVhURU5TSU9OLAorCSAgICAgICBHRVRKT0NURVQoZGF0YVs1XSksIChpbnQpIHRvdGFsbGVuKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBTdGFydCBvZiBBUFAwIGRvZXMgbm90IG1hdGNoICJKRklGIiBvciAiSkZYWCIsIG9yIHRvbyBzaG9ydCAqLworICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0FQUDAsIChpbnQpIHRvdGFsbGVuKTsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitleGFtaW5lX2FwcDE0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKT0NURVQgRkFSICogZGF0YSwKKwkgICAgICAgdW5zaWduZWQgaW50IGRhdGFsZW4sIElOVDMyIHJlbWFpbmluZykKKy8qIEV4YW1pbmUgZmlyc3QgZmV3IGJ5dGVzIGZyb20gYW4gQVBQMTQuCisgKiBUYWtlIGFwcHJvcHJpYXRlIGFjdGlvbiBpZiBpdCBpcyBhbiBBZG9iZSBtYXJrZXIuCisgKiBkYXRhbGVuIGlzICMgb2YgYnl0ZXMgYXQgZGF0YVtdLCByZW1haW5pbmcgaXMgbGVuZ3RoIG9mIHJlc3Qgb2YgbWFya2VyIGRhdGEuCisgKi8KK3sKKyAgdW5zaWduZWQgaW50IHZlcnNpb24sIGZsYWdzMCwgZmxhZ3MxLCB0cmFuc2Zvcm07CisKKyAgaWYgKGRhdGFsZW4gPj0gQVBQMTRfREFUQV9MRU4gJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzBdKSA9PSAweDQxICYmCisgICAgICBHRVRKT0NURVQoZGF0YVsxXSkgPT0gMHg2NCAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMl0pID09IDB4NkYgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzNdKSA9PSAweDYyICYmCisgICAgICBHRVRKT0NURVQoZGF0YVs0XSkgPT0gMHg2NSkgeworICAgIC8qIEZvdW5kIEFkb2JlIEFQUDE0IG1hcmtlciAqLworICAgIHZlcnNpb24gPSAoR0VUSk9DVEVUKGRhdGFbNV0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbNl0pOworICAgIGZsYWdzMCA9IChHRVRKT0NURVQoZGF0YVs3XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVs4XSk7CisgICAgZmxhZ3MxID0gKEdFVEpPQ1RFVChkYXRhWzldKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzEwXSk7CisgICAgdHJhbnNmb3JtID0gR0VUSk9DVEVUKGRhdGFbMTFdKTsKKyAgICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19BRE9CRSwgdmVyc2lvbiwgZmxhZ3MwLCBmbGFnczEsIHRyYW5zZm9ybSk7CisgICAgY2luZm8tPnNhd19BZG9iZV9tYXJrZXIgPSBUUlVFOworICAgIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0gPSAoVUlOVDgpIHRyYW5zZm9ybTsKKyAgfSBlbHNlIHsKKyAgICAvKiBTdGFydCBvZiBBUFAxNCBkb2VzIG5vdCBtYXRjaCAiQWRvYmUiLCBvciB0b28gc2hvcnQgKi8KKyAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19BUFAxNCwgKGludCkgKGRhdGFsZW4gKyByZW1haW5pbmcpKTsKKyAgfQorfQorCisKK01FVEhPRERFRihib29sZWFuKQorZ2V0X2ludGVyZXN0aW5nX2FwcG4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGFuIEFQUDAgb3IgQVBQMTQgbWFya2VyIHdpdGhvdXQgc2F2aW5nIGl0ICovCit7CisgIElOVDMyIGxlbmd0aDsKKyAgSk9DVEVUIGJbQVBQTl9EQVRBX0xFTl07CisgIHVuc2lnbmVkIGludCBpLCBudW10b3JlYWQ7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICBsZW5ndGggLT0gMjsKKworICAvKiBnZXQgdGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIG1hcmtlciBkYXRhICovCisgIGlmIChsZW5ndGggPj0gQVBQTl9EQVRBX0xFTikKKyAgICBudW10b3JlYWQgPSBBUFBOX0RBVEFfTEVOOworICBlbHNlIGlmIChsZW5ndGggPiAwKQorICAgIG51bXRvcmVhZCA9ICh1bnNpZ25lZCBpbnQpIGxlbmd0aDsKKyAgZWxzZQorICAgIG51bXRvcmVhZCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBudW10b3JlYWQ7IGkrKykKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBiW2ldLCByZXR1cm4gRkFMU0UpOworICBsZW5ndGggLT0gbnVtdG9yZWFkOworCisgIC8qIHByb2Nlc3MgaXQgKi8KKyAgc3dpdGNoIChjaW5mby0+dW5yZWFkX21hcmtlcikgeworICBjYXNlIE1fQVBQMDoKKyAgICBleGFtaW5lX2FwcDAoY2luZm8sIChKT0NURVQgRkFSICopIGIsIG51bXRvcmVhZCwgbGVuZ3RoKTsKKyAgICBicmVhazsKKyAgY2FzZSBNX0FQUDE0OgorICAgIGV4YW1pbmVfYXBwMTQoY2luZm8sIChKT0NURVQgRkFSICopIGIsIG51bXRvcmVhZCwgbGVuZ3RoKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICAvKiBjYW4ndCBnZXQgaGVyZSB1bmxlc3MganBlZ19zYXZlX21hcmtlcnMgY2hvb3NlcyB3cm9uZyBwcm9jZXNzb3IgKi8KKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIpOworICAgIGJyZWFrOworICB9CisKKyAgLyogc2tpcCBhbnkgcmVtYWluaW5nIGRhdGEgLS0gY291bGQgYmUgbG90cyAqLworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgaWYgKGxlbmd0aCA+IDApCisgICAgKCpjaW5mby0+c3JjLT5za2lwX2lucHV0X2RhdGEpIChjaW5mbywgKGxvbmcpIGxlbmd0aCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworI2lmZGVmIFNBVkVfTUFSS0VSU19TVVBQT1JURUQKKworTUVUSE9EREVGKGJvb2xlYW4pCitzYXZlX21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFNhdmUgYW4gQVBQbiBvciBDT00gbWFya2VyIGludG8gdGhlIG1hcmtlciBsaXN0ICovCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7CisgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBjdXJfbWFya2VyID0gbWFya2VyLT5jdXJfbWFya2VyOworICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZCwgZGF0YV9sZW5ndGg7CisgIEpPQ1RFVCBGQVIgKiBkYXRhOworICBJTlQzMiBsZW5ndGggPSAwOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBpZiAoY3VyX21hcmtlciA9PSBOVUxMKSB7CisgICAgLyogYmVnaW4gcmVhZGluZyBhIG1hcmtlciAqLworICAgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICAgIGxlbmd0aCAtPSAyOworICAgIGlmIChsZW5ndGggPj0gMCkgewkJLyogd2F0Y2ggb3V0IGZvciBib2d1cyBsZW5ndGggd29yZCAqLworICAgICAgLyogZmlndXJlIG91dCBob3cgbXVjaCB3ZSB3YW50IHRvIHNhdmUgKi8KKyAgICAgIHVuc2lnbmVkIGludCBsaW1pdDsKKyAgICAgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAoaW50KSBNX0NPTSkKKwlsaW1pdCA9IG1hcmtlci0+bGVuZ3RoX2xpbWl0X0NPTTsKKyAgICAgIGVsc2UKKwlsaW1pdCA9IG1hcmtlci0+bGVuZ3RoX2xpbWl0X0FQUG5bY2luZm8tPnVucmVhZF9tYXJrZXIgLSAoaW50KSBNX0FQUDBdOworICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpIGxlbmd0aCA8IGxpbWl0KQorCWxpbWl0ID0gKHVuc2lnbmVkIGludCkgbGVuZ3RoOworICAgICAgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIG1hcmtlciBpdGVtICovCisgICAgICBjdXJfbWFya2VyID0gKGpwZWdfc2F2ZWRfbWFya2VyX3B0cikKKwkoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICBTSVpFT0Yoc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCkgKyBsaW1pdCk7CisgICAgICBjdXJfbWFya2VyLT5uZXh0ID0gTlVMTDsKKyAgICAgIGN1cl9tYXJrZXItPm1hcmtlciA9IChVSU5UOCkgY2luZm8tPnVucmVhZF9tYXJrZXI7CisgICAgICBjdXJfbWFya2VyLT5vcmlnaW5hbF9sZW5ndGggPSAodW5zaWduZWQgaW50KSBsZW5ndGg7CisgICAgICBjdXJfbWFya2VyLT5kYXRhX2xlbmd0aCA9IGxpbWl0OworICAgICAgLyogZGF0YSBhcmVhIGlzIGp1c3QgYmV5b25kIHRoZSBqcGVnX21hcmtlcl9zdHJ1Y3QgKi8KKyAgICAgIGRhdGEgPSBjdXJfbWFya2VyLT5kYXRhID0gKEpPQ1RFVCBGQVIgKikgKGN1cl9tYXJrZXIgKyAxKTsKKyAgICAgIG1hcmtlci0+Y3VyX21hcmtlciA9IGN1cl9tYXJrZXI7CisgICAgICBtYXJrZXItPmJ5dGVzX3JlYWQgPSAwOworICAgICAgYnl0ZXNfcmVhZCA9IDA7CisgICAgICBkYXRhX2xlbmd0aCA9IGxpbWl0OworICAgIH0gZWxzZSB7CisgICAgICAvKiBkZWFsIHdpdGggYm9ndXMgbGVuZ3RoIHdvcmQgKi8KKyAgICAgIGJ5dGVzX3JlYWQgPSBkYXRhX2xlbmd0aCA9IDA7CisgICAgICBkYXRhID0gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogcmVzdW1lIHJlYWRpbmcgYSBtYXJrZXIgKi8KKyAgICBieXRlc19yZWFkID0gbWFya2VyLT5ieXRlc19yZWFkOworICAgIGRhdGFfbGVuZ3RoID0gY3VyX21hcmtlci0+ZGF0YV9sZW5ndGg7CisgICAgZGF0YSA9IGN1cl9tYXJrZXItPmRhdGEgKyBieXRlc19yZWFkOworICB9CisKKyAgd2hpbGUgKGJ5dGVzX3JlYWQgPCBkYXRhX2xlbmd0aCkgeworICAgIElOUFVUX1NZTkMoY2luZm8pOwkJLyogbW92ZSB0aGUgcmVzdGFydCBwb2ludCB0byBoZXJlICovCisgICAgbWFya2VyLT5ieXRlc19yZWFkID0gYnl0ZXNfcmVhZDsKKyAgICAvKiBJZiB0aGVyZSdzIG5vdCBhdCBsZWFzdCBvbmUgYnl0ZSBpbiBidWZmZXIsIHN1c3BlbmQgKi8KKyAgICBNQUtFX0JZVEVfQVZBSUwoY2luZm8sIHJldHVybiBGQUxTRSk7CisgICAgLyogQ29weSBieXRlcyB3aXRoIHJlYXNvbmFibGUgcmFwaWRpdHkgKi8KKyAgICB3aGlsZSAoYnl0ZXNfcmVhZCA8IGRhdGFfbGVuZ3RoICYmIGJ5dGVzX2luX2J1ZmZlciA+IDApIHsKKyAgICAgICpkYXRhKysgPSAqbmV4dF9pbnB1dF9ieXRlKys7CisgICAgICBieXRlc19pbl9idWZmZXItLTsKKyAgICAgIGJ5dGVzX3JlYWQrKzsKKyAgICB9CisgIH0KKworICAvKiBEb25lIHJlYWRpbmcgd2hhdCB3ZSB3YW50IHRvIHJlYWQgKi8KKyAgaWYgKGN1cl9tYXJrZXIgIT0gTlVMTCkgewkvKiB3aWxsIGJlIE5VTEwgaWYgYm9ndXMgbGVuZ3RoIHdvcmQgKi8KKyAgICAvKiBBZGQgbmV3IG1hcmtlciB0byBlbmQgb2YgbGlzdCAqLworICAgIGlmIChjaW5mby0+bWFya2VyX2xpc3QgPT0gTlVMTCkgeworICAgICAgY2luZm8tPm1hcmtlcl9saXN0ID0gY3VyX21hcmtlcjsKKyAgICB9IGVsc2UgeworICAgICAganBlZ19zYXZlZF9tYXJrZXJfcHRyIHByZXYgPSBjaW5mby0+bWFya2VyX2xpc3Q7CisgICAgICB3aGlsZSAocHJldi0+bmV4dCAhPSBOVUxMKQorCXByZXYgPSBwcmV2LT5uZXh0OworICAgICAgcHJldi0+bmV4dCA9IGN1cl9tYXJrZXI7CisgICAgfQorICAgIC8qIFJlc2V0IHBvaW50ZXIgJiBjYWxjIHJlbWFpbmluZyBkYXRhIGxlbmd0aCAqLworICAgIGRhdGEgPSBjdXJfbWFya2VyLT5kYXRhOworICAgIGxlbmd0aCA9IGN1cl9tYXJrZXItPm9yaWdpbmFsX2xlbmd0aCAtIGRhdGFfbGVuZ3RoOworICB9CisgIC8qIFJlc2V0IHRvIGluaXRpYWwgc3RhdGUgZm9yIG5leHQgbWFya2VyICovCisgIG1hcmtlci0+Y3VyX21hcmtlciA9IE5VTEw7CisKKyAgLyogUHJvY2VzcyB0aGUgbWFya2VyIGlmIGludGVyZXN0aW5nOyBlbHNlIGp1c3QgbWFrZSBhIGdlbmVyaWMgdHJhY2UgbXNnICovCisgIHN3aXRjaCAoY2luZm8tPnVucmVhZF9tYXJrZXIpIHsKKyAgY2FzZSBNX0FQUDA6CisgICAgZXhhbWluZV9hcHAwKGNpbmZvLCBkYXRhLCBkYXRhX2xlbmd0aCwgbGVuZ3RoKTsKKyAgICBicmVhazsKKyAgY2FzZSBNX0FQUDE0OgorICAgIGV4YW1pbmVfYXBwMTQoY2luZm8sIGRhdGEsIGRhdGFfbGVuZ3RoLCBsZW5ndGgpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX01JU0NfTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlciwKKwkgICAgIChpbnQpIChkYXRhX2xlbmd0aCArIGxlbmd0aCkpOworICAgIGJyZWFrOworICB9CisKKyAgLyogc2tpcCBhbnkgcmVtYWluaW5nIGRhdGEgLS0gY291bGQgYmUgbG90cyAqLworICBJTlBVVF9TWU5DKGNpbmZvKTsJCS8qIGRvIGJlZm9yZSBza2lwX2lucHV0X2RhdGEgKi8KKyAgaWYgKGxlbmd0aCA+IDApCisgICAgKCpjaW5mby0+c3JjLT5za2lwX2lucHV0X2RhdGEpIChjaW5mbywgKGxvbmcpIGxlbmd0aCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBTQVZFX01BUktFUlNfU1VQUE9SVEVEICovCisKKworTUVUSE9EREVGKGJvb2xlYW4pCitza2lwX3ZhcmlhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2tpcCBvdmVyIGFuIHVua25vd24gb3IgdW5pbnRlcmVzdGluZyB2YXJpYWJsZS1sZW5ndGggbWFya2VyICovCit7CisgIElOVDMyIGxlbmd0aDsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgIGxlbmd0aCAtPSAyOworICAKKyAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfTUlTQ19NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyLCAoaW50KSBsZW5ndGgpOworCisgIElOUFVUX1NZTkMoY2luZm8pOwkJLyogZG8gYmVmb3JlIHNraXBfaW5wdXRfZGF0YSAqLworICBpZiAobGVuZ3RoID4gMCkKKyAgICAoKmNpbmZvLT5zcmMtPnNraXBfaW5wdXRfZGF0YSkgKGNpbmZvLCAobG9uZykgbGVuZ3RoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRmluZCB0aGUgbmV4dCBKUEVHIG1hcmtlciwgc2F2ZSBpdCBpbiBjaW5mby0+dW5yZWFkX21hcmtlci4KKyAqIFJldHVybnMgRkFMU0UgaWYgaGFkIHRvIHN1c3BlbmQgYmVmb3JlIHJlYWNoaW5nIGEgbWFya2VyOworICogaW4gdGhhdCBjYXNlIGNpbmZvLT51bnJlYWRfbWFya2VyIGlzIHVuY2hhbmdlZC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHJlc3VsdCBtaWdodCBub3QgYmUgYSB2YWxpZCBtYXJrZXIgY29kZSwKKyAqIGJ1dCBpdCB3aWxsIG5ldmVyIGJlIDAgb3IgRkYuCisgKi8KKworTE9DQUwoYm9vbGVhbikKK25leHRfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpbnQgYzsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgZm9yICg7OykgeworICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgICAgLyogU2tpcCBhbnkgbm9uLUZGIGJ5dGVzLgorICAgICAqIFRoaXMgbWF5IGxvb2sgYSBiaXQgaW5lZmZpY2llbnQsIGJ1dCBpdCB3aWxsIG5vdCBvY2N1ciBpbiBhIHZhbGlkIGZpbGUuCisgICAgICogV2Ugc3luYyBhZnRlciBlYWNoIGRpc2NhcmRlZCBieXRlIHNvIHRoYXQgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlCisgICAgICogY2FuIGRpc2NhcmQgdGhlIGJ5dGUgZnJvbSBpdHMgYnVmZmVyLgorICAgICAqLworICAgIHdoaWxlIChjICE9IDB4RkYpIHsKKyAgICAgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcysrOworICAgICAgSU5QVVRfU1lOQyhjaW5mbyk7CisgICAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICAgIH0KKyAgICAvKiBUaGlzIGxvb3Agc3dhbGxvd3MgYW55IGR1cGxpY2F0ZSBGRiBieXRlcy4gIEV4dHJhIEZGcyBhcmUgbGVnYWwgYXMKKyAgICAgKiBwYWQgYnl0ZXMsIHNvIGRvbid0IGNvdW50IHRoZW0gaW4gZGlzY2FyZGVkX2J5dGVzLiAgV2UgYXNzdW1lIHRoZXJlCisgICAgICogd2lsbCBub3QgYmUgc28gbWFueSBjb25zZWN1dGl2ZSBGRiBieXRlcyBhcyB0byBvdmVyZmxvdyBhIHN1c3BlbmRpbmcKKyAgICAgKiBkYXRhIHNvdXJjZSdzIGlucHV0IGJ1ZmZlci4KKyAgICAgKi8KKyAgICBkbyB7CisgICAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICAgIH0gd2hpbGUgKGMgPT0gMHhGRik7CisgICAgaWYgKGMgIT0gMCkKKyAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIGEgdmFsaWQgbWFya2VyLCBleGl0IGxvb3AgKi8KKyAgICAvKiBSZWFjaCBoZXJlIGlmIHdlIGZvdW5kIGEgc3R1ZmZlZC16ZXJvIGRhdGEgc2VxdWVuY2UgKEZGLzAwKS4KKyAgICAgKiBEaXNjYXJkIGl0IGFuZCBsb29wIGJhY2sgdG8gdHJ5IGFnYWluLgorICAgICAqLworICAgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyArPSAyOworICAgIElOUFVUX1NZTkMoY2luZm8pOworICB9CisKKyAgaWYgKGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyAhPSAwKSB7CisgICAgV0FSTk1TMihjaW5mbywgSldSTl9FWFRSQU5FT1VTX0RBVEEsIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcywgYyk7CisgICAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzID0gMDsKKyAgfQorCisgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gYzsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2ZpcnN0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIExpa2UgbmV4dF9tYXJrZXIsIGJ1dCB1c2VkIHRvIG9idGFpbiB0aGUgaW5pdGlhbCBTT0kgbWFya2VyLiAqLworLyogRm9yIHRoaXMgbWFya2VyLCB3ZSBkbyBub3QgYWxsb3cgcHJlY2VkaW5nIGdhcmJhZ2Ugb3IgZmlsbDsgb3RoZXJ3aXNlLAorICogd2UgbWlnaHQgd2VsbCBzY2FuIGFuIGVudGlyZSBpbnB1dCBmaWxlIGJlZm9yZSByZWFsaXppbmcgaXQgYWluJ3QgSlBFRy4KKyAqIElmIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHByb2Nlc3Mgbm9uLUpGSUYgZmlsZXMsIGl0IG11c3Qgc2VlayB0byB0aGUKKyAqIFNPSSBiZWZvcmUgY2FsbGluZyB0aGUgSlBFRyBsaWJyYXJ5LgorICovCit7CisgIGludCBjLCBjMjsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgSU5QVVRfQllURShjaW5mbywgYzIsIHJldHVybiBGQUxTRSk7CisgIGlmIChjICE9IDB4RkYgfHwgYzIgIT0gKGludCkgTV9TT0kpCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfTk9fU09JLCBjLCBjMik7CisKKyAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSBjMjsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIFJlYWQgbWFya2VycyB1bnRpbCBTT1Mgb3IgRU9JLgorICoKKyAqIFJldHVybnMgc2FtZSBjb2RlcyBhcyBhcmUgZGVmaW5lZCBmb3IganBlZ19jb25zdW1lX2lucHV0OgorICogSlBFR19TVVNQRU5ERUQsIEpQRUdfUkVBQ0hFRF9TT1MsIG9yIEpQRUdfUkVBQ0hFRF9FT0kuCisgKi8KKworTUVUSE9EREVGKGludCkKK3JlYWRfbWFya2VycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogT3V0ZXIgbG9vcCByZXBlYXRzIG9uY2UgZm9yIGVhY2ggbWFya2VyLiAqLworICBmb3IgKDs7KSB7CisgICAgLyogQ29sbGVjdCB0aGUgbWFya2VyIHByb3BlciwgdW5sZXNzIHdlIGFscmVhZHkgZGlkLiAqLworICAgIC8qIE5COiBmaXJzdF9tYXJrZXIoKSBlbmZvcmNlcyB0aGUgcmVxdWlyZW1lbnQgdGhhdCBTT0kgYXBwZWFyIGZpcnN0LiAqLworICAgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7CisgICAgICBpZiAoISBjaW5mby0+bWFya2VyLT5zYXdfU09JKSB7CisJaWYgKCEgZmlyc3RfbWFya2VyKGNpbmZvKSkKKwkgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIH0gZWxzZSB7CisJaWYgKCEgbmV4dF9tYXJrZXIoY2luZm8pKQorCSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgfQorICAgIH0KKyAgICAvKiBBdCB0aGlzIHBvaW50IGNpbmZvLT51bnJlYWRfbWFya2VyIGNvbnRhaW5zIHRoZSBtYXJrZXIgY29kZSBhbmQgdGhlCisgICAgICogaW5wdXQgcG9pbnQgaXMganVzdCBwYXN0IHRoZSBtYXJrZXIgcHJvcGVyLCBidXQgYmVmb3JlIGFueSBwYXJhbWV0ZXJzLgorICAgICAqIEEgc3VzcGVuc2lvbiB3aWxsIGNhdXNlIHVzIHRvIHJldHVybiB3aXRoIHRoaXMgc3RhdGUgc3RpbGwgdHJ1ZS4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKGNpbmZvLT51bnJlYWRfbWFya2VyKSB7CisgICAgY2FzZSBNX1NPSToKKyAgICAgIGlmICghIGdldF9zb2koY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NPRjA6CQkvKiBCYXNlbGluZSAqLworICAgIGNhc2UgTV9TT0YxOgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgSHVmZm1hbiAqLworICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgRkFMU0UsIEZBTFNFKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9TT0YyOgkJLyogUHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KKyAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIFRSVUUsIEZBTFNFKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9TT0Y5OgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLworICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgRkFMU0UsIFRSVUUpKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NPRjEwOgkJLyogUHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KKyAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIFRSVUUsIFRSVUUpKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworCisgICAgLyogQ3VycmVudGx5IHVuc3VwcG9ydGVkIFNPRm4gdHlwZXMgKi8KKyAgICBjYXNlIE1fU09GMzoJCS8qIExvc3NsZXNzLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjU6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y2OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjc6CQkvKiBEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fSlBHOgkJCS8qIFJlc2VydmVkIGZvciBKUEVHIGV4dGVuc2lvbnMgKi8KKyAgICBjYXNlIE1fU09GMTE6CQkvKiBMb3NzbGVzcywgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxMzoJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjE0OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjE1OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBhcml0aG1ldGljICovCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9TT0ZfVU5TVVBQT1JURUQsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NPUzoKKyAgICAgIGlmICghIGdldF9zb3MoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsJLyogcHJvY2Vzc2VkIHRoZSBtYXJrZXIgKi8KKyAgICAgIHJldHVybiBKUEVHX1JFQUNIRURfU09TOworICAgIAorICAgIGNhc2UgTV9FT0k6CisgICAgICBUUkFDRU1TKGNpbmZvLCAxLCBKVFJDX0VPSSk7CisgICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CS8qIHByb2Nlc3NlZCB0aGUgbWFya2VyICovCisgICAgICByZXR1cm4gSlBFR19SRUFDSEVEX0VPSTsKKyAgICAgIAorICAgIGNhc2UgTV9EQUM6CisgICAgICBpZiAoISBnZXRfZGFjKGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgTV9ESFQ6CisgICAgICBpZiAoISBnZXRfZGh0KGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgTV9EUVQ6CisgICAgICBpZiAoISBnZXRfZHF0KGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgTV9EUkk6CisgICAgICBpZiAoISBnZXRfZHJpKGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgTV9BUFAwOgorICAgIGNhc2UgTV9BUFAxOgorICAgIGNhc2UgTV9BUFAyOgorICAgIGNhc2UgTV9BUFAzOgorICAgIGNhc2UgTV9BUFA0OgorICAgIGNhc2UgTV9BUFA1OgorICAgIGNhc2UgTV9BUFA2OgorICAgIGNhc2UgTV9BUFA3OgorICAgIGNhc2UgTV9BUFA4OgorICAgIGNhc2UgTV9BUFA5OgorICAgIGNhc2UgTV9BUFAxMDoKKyAgICBjYXNlIE1fQVBQMTE6CisgICAgY2FzZSBNX0FQUDEyOgorICAgIGNhc2UgTV9BUFAxMzoKKyAgICBjYXNlIE1fQVBQMTQ6CisgICAgY2FzZSBNX0FQUDE1OgorICAgICAgaWYgKCEgKCooKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXIpLT5wcm9jZXNzX0FQUG5bCisJCWNpbmZvLT51bnJlYWRfbWFya2VyIC0gKGludCkgTV9BUFAwXSkgKGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgTV9DT006CisgICAgICBpZiAoISAoKigobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlciktPnByb2Nlc3NfQ09NKSAoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1JTVDA6CQkvKiB0aGVzZSBhcmUgYWxsIHBhcmFtZXRlcmxlc3MgKi8KKyAgICBjYXNlIE1fUlNUMToKKyAgICBjYXNlIE1fUlNUMjoKKyAgICBjYXNlIE1fUlNUMzoKKyAgICBjYXNlIE1fUlNUNDoKKyAgICBjYXNlIE1fUlNUNToKKyAgICBjYXNlIE1fUlNUNjoKKyAgICBjYXNlIE1fUlNUNzoKKyAgICBjYXNlIE1fVEVNOgorICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfUEFSTUxFU1NfTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlcik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9ETkw6CQkJLyogSWdub3JlIEROTCAuLi4gcGVyaGFwcyB0aGUgd3JvbmcgdGhpbmcgKi8KKyAgICAgIGlmICghIHNraXBfdmFyaWFibGUoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoJCQkvKiBtdXN0IGJlIERIUCwgRVhQLCBKUEduLCBvciBSRVNuICovCisgICAgICAvKiBGb3Igbm93LCB3ZSB0cmVhdCB0aGUgcmVzZXJ2ZWQgbWFya2VycyBhcyBmYXRhbCBlcnJvcnMgc2luY2UgdGhleSBhcmUKKyAgICAgICAqIGxpa2VseSB0byBiZSB1c2VkIHRvIHNpZ25hbCBpbmNvbXBhdGlibGUgSlBFRyBQYXJ0IDMgZXh0ZW5zaW9ucy4KKyAgICAgICAqIE9uY2UgdGhlIEpQRUcgMyB2ZXJzaW9uLW51bWJlciBtYXJrZXIgaXMgd2VsbCBkZWZpbmVkLCB0aGlzIGNvZGUKKyAgICAgICAqIG91Z2h0IHRvIGNoYW5nZSEKKyAgICAgICAqLworICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVU5LTk9XTl9NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBTdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIG1hcmtlciwgc28gcmVzZXQgc3RhdGUgdmFyaWFibGUgKi8KKyAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CisgIH0gLyogZW5kIGxvb3AgKi8KK30KKworCisvKgorICogUmVhZCBhIHJlc3RhcnQgbWFya2VyLCB3aGljaCBpcyBleHBlY3RlZCB0byBhcHBlYXIgbmV4dCBpbiB0aGUgZGF0YXN0cmVhbTsKKyAqIGlmIHRoZSBtYXJrZXIgaXMgbm90IHRoZXJlLCB0YWtlIGFwcHJvcHJpYXRlIHJlY292ZXJ5IGFjdGlvbi4KKyAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuc2lvbiBpcyByZXF1aXJlZC4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgZW50cm9weSBkZWNvZGVyIGFmdGVyIGl0IGhhcyByZWFkIGFuIGFwcHJvcHJpYXRlCisgKiBudW1iZXIgb2YgTUNVcy4gIGNpbmZvLT51bnJlYWRfbWFya2VyIG1heSBiZSBub256ZXJvIGlmIHRoZSBlbnRyb3B5IGRlY29kZXIKKyAqIGhhcyBhbHJlYWR5IHJlYWQgYSBtYXJrZXIgZnJvbSB0aGUgZGF0YSBzb3VyY2UuICBVbmRlciBub3JtYWwgY29uZGl0aW9ucworICogY2luZm8tPnVucmVhZF9tYXJrZXIgd2lsbCBiZSByZXNldCB0byAwIGJlZm9yZSByZXR1cm5pbmc7IGlmIG5vdCByZXNldCwKKyAqIGl0IGhvbGRzIGEgbWFya2VyIHdoaWNoIHRoZSBkZWNvZGVyIHdpbGwgYmUgdW5hYmxlIHRvIHJlYWQgcGFzdC4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK3JlYWRfcmVzdGFydF9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIE9idGFpbiBhIG1hcmtlciB1bmxlc3Mgd2UgYWxyZWFkeSBkaWQuICovCisgIC8qIE5vdGUgdGhhdCBuZXh0X21hcmtlciB3aWxsIGNvbXBsYWluIGlmIGl0IHNraXBzIGFueSBkYXRhLiAqLworICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkgeworICAgIGlmICghIG5leHRfbWFya2VyKGNpbmZvKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PQorICAgICAgKChpbnQpIE1fUlNUMCArIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0pKSB7CisgICAgLyogTm9ybWFsIGNhc2UgLS0tIHN3YWxsb3cgdGhlIG1hcmtlciBhbmQgbGV0IGVudHJvcHkgZGVjb2RlciBjb250aW51ZSAqLworICAgIFRSQUNFTVMxKGNpbmZvLCAzLCBKVFJDX1JTVCwgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSk7CisgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOworICB9IGVsc2UgeworICAgIC8qIFVoLW9oLCB0aGUgcmVzdGFydCBtYXJrZXJzIGhhdmUgYmVlbiBtZXNzZWQgdXAuICovCisgICAgLyogTGV0IHRoZSBkYXRhIHNvdXJjZSBtYW5hZ2VyIGRldGVybWluZSBob3cgdG8gcmVzeW5jLiAqLworICAgIGlmICghICgqY2luZm8tPnNyYy0+cmVzeW5jX3RvX3Jlc3RhcnQpIChjaW5mbywKKwkJCQkJICAgIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0pKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogVXBkYXRlIG5leHQtcmVzdGFydCBzdGF0ZSAqLworICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtID0gKGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0gKyAxKSAmIDc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgcmVzeW5jX3RvX3Jlc3RhcnQgbWV0aG9kIGZvciBkYXRhIHNvdXJjZSBtYW5hZ2VycworICogdG8gdXNlIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhbnkgYmV0dGVyIGFwcHJvYWNoLiAgU29tZSBkYXRhIHNvdXJjZSBtYW5hZ2VycworICogbWF5IGJlIGFibGUgdG8gYmFjayB1cCwgb3IgbWF5IGhhdmUgYWRkaXRpb25hbCBrbm93bGVkZ2UgYWJvdXQgdGhlIGRhdGEKKyAqIHdoaWNoIHBlcm1pdHMgYSBtb3JlIGludGVsbGlnZW50IHJlY292ZXJ5IHN0cmF0ZWd5OyBzdWNoIG1hbmFnZXJzIHdvdWxkCisgKiBwcmVzdW1hYmx5IHN1cHBseSB0aGVpciBvd24gcmVzeW5jIG1ldGhvZC4KKyAqCisgKiByZWFkX3Jlc3RhcnRfbWFya2VyIGNhbGxzIHJlc3luY190b19yZXN0YXJ0IGlmIGl0IGZpbmRzIGEgbWFya2VyIG90aGVyIHRoYW4KKyAqIHRoZSByZXN0YXJ0IG1hcmtlciBpdCB3YXMgZXhwZWN0aW5nLiAgKFRoaXMgY29kZSBpcyAqbm90KiB1c2VkIHVubGVzcworICogYSBub256ZXJvIHJlc3RhcnQgaW50ZXJ2YWwgaGFzIGJlZW4gZGVjbGFyZWQuKSAgY2luZm8tPnVucmVhZF9tYXJrZXIgaXMKKyAqIHRoZSBtYXJrZXIgY29kZSBhY3R1YWxseSBmb3VuZCAobWlnaHQgYmUgYW55dGhpbmcsIGV4Y2VwdCAwIG9yIEZGKS4KKyAqIFRoZSBkZXNpcmVkIHJlc3RhcnQgbWFya2VyIG51bWJlciAoMC4uNykgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLgorICogVGhpcyByb3V0aW5lIGlzIHN1cHBvc2VkIHRvIGFwcGx5IHdoYXRldmVyIGVycm9yIHJlY292ZXJ5IHN0cmF0ZWd5IHNlZW1zCisgKiBhcHByb3ByaWF0ZSBpbiBvcmRlciB0byBwb3NpdGlvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBuZXh0IGRhdGEgc2VnbWVudC4KKyAqIE5vdGUgdGhhdCBjaW5mby0+dW5yZWFkX21hcmtlciBpcyB0cmVhdGVkIGFzIGEgbWFya2VyIGFwcGVhcmluZyBiZWZvcmUKKyAqIHRoZSBjdXJyZW50IGRhdGEtc291cmNlIGlucHV0IHBvaW50OyB1c3VhbGx5IGl0IHNob3VsZCBiZSByZXNldCB0byB6ZXJvCisgKiBiZWZvcmUgcmV0dXJuaW5nLgorICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5zaW9uIGlzIHJlcXVpcmVkLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgc3Vic3RhbnRpYWxseSBjb25zdHJhaW5lZCBieSB3YW50aW5nIHRvIHRyZWF0IHRoZQorICogaW5wdXQgYXMgYSBkYXRhIHN0cmVhbTsgdGhpcyBtZWFucyB3ZSBjYW4ndCBiYWNrIHVwLiAgVGhlcmVmb3JlLCB3ZSBoYXZlCisgKiBvbmx5IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyB0byB3b3JrIHdpdGg6CisgKiAgIDEuIFNpbXBseSBkaXNjYXJkIHRoZSBtYXJrZXIgYW5kIGxldCB0aGUgZW50cm9weSBkZWNvZGVyIHJlc3VtZSBhdCBuZXh0CisgKiAgICAgIGJ5dGUgb2YgZmlsZS4KKyAqICAgMi4gUmVhZCBmb3J3YXJkIHVudGlsIHdlIGZpbmQgYW5vdGhlciBtYXJrZXIsIGRpc2NhcmRpbmcgaW50ZXJ2ZW5pbmcKKyAqICAgICAgZGF0YS4gIChJbiB0aGVvcnkgd2UgY291bGQgbG9vayBhaGVhZCB3aXRoaW4gdGhlIGN1cnJlbnQgYnVmZmVybG9hZCwKKyAqICAgICAgd2l0aG91dCBoYXZpbmcgdG8gZGlzY2FyZCBkYXRhIGlmIHdlIGRvbid0IGZpbmQgdGhlIGRlc2lyZWQgbWFya2VyLgorICogICAgICBUaGlzIGlkZWEgaXMgbm90IGltcGxlbWVudGVkIGhlcmUsIGluIHBhcnQgYmVjYXVzZSBpdCBtYWtlcyBiZWhhdmlvcgorICogICAgICBkZXBlbmRlbnQgb24gYnVmZmVyIHNpemUgYW5kIGNoYW5jZSBidWZmZXItYm91bmRhcnkgcG9zaXRpb25zLikKKyAqICAgMy4gTGVhdmUgdGhlIG1hcmtlciB1bnJlYWQgKGJ5IGZhaWxpbmcgdG8gemVybyBjaW5mby0+dW5yZWFkX21hcmtlcikuCisgKiAgICAgIFRoaXMgd2lsbCBjYXVzZSB0aGUgZW50cm9weSBkZWNvZGVyIHRvIHByb2Nlc3MgYW4gZW1wdHkgZGF0YSBzZWdtZW50LAorICogICAgICBpbnNlcnRpbmcgZHVtbXkgemVyb2VzLCBhbmQgdGhlbiB3ZSB3aWxsIHJlcHJvY2VzcyB0aGUgbWFya2VyLgorICoKKyAqICMyIGlzIGFwcHJvcHJpYXRlIGlmIHdlIHRoaW5rIHRoZSBkZXNpcmVkIG1hcmtlciBsaWVzIGFoZWFkLCB3aGlsZSAjMyBpcworICogYXBwcm9wcmlhdGUgaWYgdGhlIGZvdW5kIG1hcmtlciBpcyBhIGZ1dHVyZSByZXN0YXJ0IG1hcmtlciAoaW5kaWNhdGluZworICogdGhhdCB3ZSBoYXZlIG1pc3NlZCB0aGUgZGVzaXJlZCByZXN0YXJ0IG1hcmtlciwgcHJvYmFibHkgYmVjYXVzZSBpdCBnb3QKKyAqIGNvcnJ1cHRlZCkuCisgKiBXZSBhcHBseSAjMiBvciAjMyBpZiB0aGUgZm91bmQgbWFya2VyIGlzIGEgcmVzdGFydCBtYXJrZXIgbm8gbW9yZSB0aGFuCisgKiB0d28gY291bnRzIGJlaGluZCBvciBhaGVhZCBvZiB0aGUgZXhwZWN0ZWQgb25lLiAgV2UgYWxzbyBhcHBseSAjMiBpZiB0aGUKKyAqIGZvdW5kIG1hcmtlciBpcyBub3QgYSBsZWdhbCBKUEVHIG1hcmtlciBjb2RlIChpdCdzIGNlcnRhaW5seSBib2d1cyBkYXRhKS4KKyAqIElmIHRoZSBmb3VuZCBtYXJrZXIgaXMgYSByZXN0YXJ0IG1hcmtlciBtb3JlIHRoYW4gMiBjb3VudHMgYXdheSwgd2UgZG8gIzEKKyAqICh0b28gbXVjaCByaXNrIHRoYXQgdGhlIG1hcmtlciBpcyBlcnJvbmVvdXM7IHdpdGggbHVjayB3ZSB3aWxsIGJlIGFibGUgdG8KKyAqIHJlc3luYyBhdCBzb21lIGZ1dHVyZSBwb2ludCkuCisgKiBGb3IgYW55IHZhbGlkIG5vbi1yZXN0YXJ0IEpQRUcgbWFya2VyLCB3ZSBhcHBseSAjMy4gIFRoaXMga2VlcHMgdXMgZnJvbQorICogb3ZlcnJ1bm5pbmcgdGhlIGVuZCBvZiBhIHNjYW4uICBBbiBpbXBsZW1lbnRhdGlvbiBsaW1pdGVkIHRvIHNpbmdsZS1zY2FuCisgKiBmaWxlcyBtaWdodCBmaW5kIGl0IGJldHRlciB0byBhcHBseSAjMiBmb3IgbWFya2VycyBvdGhlciB0aGFuIEVPSSwgc2luY2UKKyAqIGFueSBvdGhlciBtYXJrZXIgd291bGQgaGF2ZSB0byBiZSBib2d1cyBkYXRhIGluIHRoYXQgY2FzZS4KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfcmVzeW5jX3RvX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkKQoreworICBpbnQgbWFya2VyID0gY2luZm8tPnVucmVhZF9tYXJrZXI7CisgIGludCBhY3Rpb24gPSAxOworICAKKyAgLyogQWx3YXlzIHB1dCB1cCBhIHdhcm5pbmcuICovCisgIFdBUk5NUzIoY2luZm8sIEpXUk5fTVVTVF9SRVNZTkMsIG1hcmtlciwgZGVzaXJlZCk7CisgIAorICAvKiBPdXRlciBsb29wIGhhbmRsZXMgcmVwZWF0ZWQgZGVjaXNpb24gYWZ0ZXIgc2Nhbm5pbmcgZm9yd2FyZC4gKi8KKyAgZm9yICg7OykgeworICAgIGlmIChtYXJrZXIgPCAoaW50KSBNX1NPRjApCisgICAgICBhY3Rpb24gPSAyOwkJLyogaW52YWxpZCBtYXJrZXIgKi8KKyAgICBlbHNlIGlmIChtYXJrZXIgPCAoaW50KSBNX1JTVDAgfHwgbWFya2VyID4gKGludCkgTV9SU1Q3KQorICAgICAgYWN0aW9uID0gMzsJCS8qIHZhbGlkIG5vbi1yZXN0YXJ0IG1hcmtlciAqLworICAgIGVsc2UgeworICAgICAgaWYgKG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkKzEpICYgNykpIHx8CisJICBtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZCsyKSAmIDcpKSkKKwlhY3Rpb24gPSAzOwkJLyogb25lIG9mIHRoZSBuZXh0IHR3byBleHBlY3RlZCByZXN0YXJ0cyAqLworICAgICAgZWxzZSBpZiAobWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQtMSkgJiA3KSkgfHwKKwkgICAgICAgbWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQtMikgJiA3KSkpCisJYWN0aW9uID0gMjsJCS8qIGEgcHJpb3IgcmVzdGFydCwgc28gYWR2YW5jZSAqLworICAgICAgZWxzZQorCWFjdGlvbiA9IDE7CQkvKiBkZXNpcmVkIHJlc3RhcnQgb3IgdG9vIGZhciBhd2F5ICovCisgICAgfQorICAgIFRSQUNFTVMyKGNpbmZvLCA0LCBKVFJDX1JFQ09WRVJZX0FDVElPTiwgbWFya2VyLCBhY3Rpb24pOworICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgY2FzZSAxOgorICAgICAgLyogRGlzY2FyZCBtYXJrZXIgYW5kIGxldCBlbnRyb3B5IGRlY29kZXIgcmVzdW1lIHByb2Nlc3NpbmcuICovCisgICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIDI6CisgICAgICAvKiBTY2FuIHRvIHRoZSBuZXh0IG1hcmtlciwgYW5kIHJlcGVhdCB0aGUgZGVjaXNpb24gbG9vcC4gKi8KKyAgICAgIGlmICghIG5leHRfbWFya2VyKGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBtYXJrZXIgPSBjaW5mby0+dW5yZWFkX21hcmtlcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIC8qIFJldHVybiB3aXRob3V0IGFkdmFuY2luZyBwYXN0IHRoaXMgbWFya2VyLiAqLworICAgICAgLyogRW50cm9weSBkZWNvZGVyIHdpbGwgYmUgZm9yY2VkIHRvIHByb2Nlc3MgYW4gZW1wdHkgc2VnbWVudC4gKi8KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfSAvKiBlbmQgbG9vcCAqLworfQorCisKKy8qCisgKiBSZXNldCBtYXJrZXIgcHJvY2Vzc2luZyBzdGF0ZSB0byBiZWdpbiBhIGZyZXNoIGRhdGFzdHJlYW0uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCityZXNldF9tYXJrZXJfcmVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworCisgIGNpbmZvLT5jb21wX2luZm8gPSBOVUxMOwkJLyogdW50aWwgYWxsb2NhdGVkIGJ5IGdldF9zb2YgKi8KKyAgY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID0gMDsJCS8qIG5vIFNPUyBzZWVuIHlldCAqLworICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CQkvKiBubyBwZW5kaW5nIG1hcmtlciAqLworICBtYXJrZXItPnB1Yi5zYXdfU09JID0gRkFMU0U7CQkvKiBzZXQgaW50ZXJuYWwgc3RhdGUgdG9vICovCisgIG1hcmtlci0+cHViLnNhd19TT0YgPSBGQUxTRTsKKyAgbWFya2VyLT5wdWIuZGlzY2FyZGVkX2J5dGVzID0gMDsKKyAgbWFya2VyLT5jdXJfbWFya2VyID0gTlVMTDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgbWFya2VyIHJlYWRlciBtb2R1bGUuCisgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IG9uY2UsIHdoZW4gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9tYXJrZXJfcmVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlcjsKKyAgaW50IGk7CisKKyAgLyogQ3JlYXRlIHN1Ym9iamVjdCBpbiBwZXJtYW5lbnQgcG9vbCAqLworICBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQlTSVpFT0YobXlfbWFya2VyX3JlYWRlcikpOworICBjaW5mby0+bWFya2VyID0gKHN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgKikgbWFya2VyOworICAvKiBJbml0aWFsaXplIHB1YmxpYyBtZXRob2QgcG9pbnRlcnMgKi8KKyAgbWFya2VyLT5wdWIucmVzZXRfbWFya2VyX3JlYWRlciA9IHJlc2V0X21hcmtlcl9yZWFkZXI7CisgIG1hcmtlci0+cHViLnJlYWRfbWFya2VycyA9IHJlYWRfbWFya2VyczsKKyAgbWFya2VyLT5wdWIucmVhZF9yZXN0YXJ0X21hcmtlciA9IHJlYWRfcmVzdGFydF9tYXJrZXI7CisgIC8qIEluaXRpYWxpemUgQ09NL0FQUG4gcHJvY2Vzc2luZy4KKyAgICogQnkgZGVmYXVsdCwgd2UgZXhhbWluZSBhbmQgdGhlbiBkaXNjYXJkIEFQUDAgYW5kIEFQUDE0LAorICAgKiBidXQgc2ltcGx5IGRpc2NhcmQgQ09NIGFuZCBhbGwgb3RoZXIgQVBQbi4KKyAgICovCisgIG1hcmtlci0+cHJvY2Vzc19DT00gPSBza2lwX3ZhcmlhYmxlOworICBtYXJrZXItPmxlbmd0aF9saW1pdF9DT00gPSAwOworICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIG1hcmtlci0+cHJvY2Vzc19BUFBuW2ldID0gc2tpcF92YXJpYWJsZTsKKyAgICBtYXJrZXItPmxlbmd0aF9saW1pdF9BUFBuW2ldID0gMDsKKyAgfQorICBtYXJrZXItPnByb2Nlc3NfQVBQblswXSA9IGdldF9pbnRlcmVzdGluZ19hcHBuOworICBtYXJrZXItPnByb2Nlc3NfQVBQblsxNF0gPSBnZXRfaW50ZXJlc3RpbmdfYXBwbjsKKyAgLyogUmVzZXQgbWFya2VyIHByb2Nlc3Npbmcgc3RhdGUgKi8KKyAgcmVzZXRfbWFya2VyX3JlYWRlcihjaW5mbyk7Cit9CisKKworLyoKKyAqIENvbnRyb2wgc2F2aW5nIG9mIENPTSBhbmQgQVBQbiBtYXJrZXJzIGludG8gbWFya2VyX2xpc3QuCisgKi8KKworI2lmZGVmIFNBVkVfTUFSS0VSU19TVVBQT1JURUQKKworR0xPQkFMKHZvaWQpCitqcGVnX3NhdmVfbWFya2VycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAorCQkgICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0KQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworICBsb25nIG1heGxlbmd0aDsKKyAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCBwcm9jZXNzb3I7CisKKyAgLyogTGVuZ3RoIGxpbWl0IG11c3RuJ3QgYmUgbGFyZ2VyIHRoYW4gd2hhdCB3ZSBjYW4gYWxsb2NhdGUKKyAgICogKHNob3VsZCBvbmx5IGJlIGEgY29uY2VybiBpbiBhIDE2LWJpdCBlbnZpcm9ubWVudCkuCisgICAqLworICBtYXhsZW5ndGggPSBjaW5mby0+bWVtLT5tYXhfYWxsb2NfY2h1bmsgLSBTSVpFT0Yoc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCk7CisgIGlmICgoKGxvbmcpIGxlbmd0aF9saW1pdCkgPiBtYXhsZW5ndGgpCisgICAgbGVuZ3RoX2xpbWl0ID0gKHVuc2lnbmVkIGludCkgbWF4bGVuZ3RoOworCisgIC8qIENob29zZSBwcm9jZXNzb3Igcm91dGluZSB0byB1c2UuCisgICAqIEFQUDAvQVBQMTQgaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cy4KKyAgICovCisgIGlmIChsZW5ndGhfbGltaXQpIHsKKyAgICBwcm9jZXNzb3IgPSBzYXZlX21hcmtlcjsKKyAgICAvKiBJZiBzYXZpbmcgQVBQMC9BUFAxNCwgc2F2ZSBhdCBsZWFzdCBlbm91Z2ggZm9yIG91ciBpbnRlcm5hbCB1c2UuICovCisgICAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMCAmJiBsZW5ndGhfbGltaXQgPCBBUFAwX0RBVEFfTEVOKQorICAgICAgbGVuZ3RoX2xpbWl0ID0gQVBQMF9EQVRBX0xFTjsKKyAgICBlbHNlIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDE0ICYmIGxlbmd0aF9saW1pdCA8IEFQUDE0X0RBVEFfTEVOKQorICAgICAgbGVuZ3RoX2xpbWl0ID0gQVBQMTRfREFUQV9MRU47CisgIH0gZWxzZSB7CisgICAgcHJvY2Vzc29yID0gc2tpcF92YXJpYWJsZTsKKyAgICAvKiBJZiBkaXNjYXJkaW5nIEFQUDAvQVBQMTQsIHVzZSBvdXIgcmVndWxhciBvbi10aGUtZmx5IHByb2Nlc3Nvci4gKi8KKyAgICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAwIHx8IG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMTQpCisgICAgICBwcm9jZXNzb3IgPSBnZXRfaW50ZXJlc3RpbmdfYXBwbjsKKyAgfQorCisgIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0NPTSkgeworICAgIG1hcmtlci0+cHJvY2Vzc19DT00gPSBwcm9jZXNzb3I7CisgICAgbWFya2VyLT5sZW5ndGhfbGltaXRfQ09NID0gbGVuZ3RoX2xpbWl0OworICB9IGVsc2UgaWYgKG1hcmtlcl9jb2RlID49IChpbnQpIE1fQVBQMCAmJiBtYXJrZXJfY29kZSA8PSAoaW50KSBNX0FQUDE1KSB7CisgICAgbWFya2VyLT5wcm9jZXNzX0FQUG5bbWFya2VyX2NvZGUgLSAoaW50KSBNX0FQUDBdID0gcHJvY2Vzc29yOworICAgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0FQUG5bbWFya2VyX2NvZGUgLSAoaW50KSBNX0FQUDBdID0gbGVuZ3RoX2xpbWl0OworICB9IGVsc2UKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgbWFya2VyX2NvZGUpOworfQorCisjZW5kaWYgLyogU0FWRV9NQVJLRVJTX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbnN0YWxsIGEgc3BlY2lhbCBwcm9jZXNzaW5nIG1ldGhvZCBmb3IgQ09NIG9yIEFQUG4gbWFya2Vycy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKKwkJCSAgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2Qgcm91dGluZSkKK3sKKyAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKKworICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9DT00pCisgICAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHJvdXRpbmU7CisgIGVsc2UgaWYgKG1hcmtlcl9jb2RlID49IChpbnQpIE1fQVBQMCAmJiBtYXJrZXJfY29kZSA8PSAoaW50KSBNX0FQUDE1KQorICAgIG1hcmtlci0+cHJvY2Vzc19BUFBuW21hcmtlcl9jb2RlIC0gKGludCkgTV9BUFAwXSA9IHJvdXRpbmU7CisgIGVsc2UKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgbWFya2VyX2NvZGUpOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamRtYXN0ZXIuYyBiL2NvbW1vbi9qcGVnL2pkbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwMmM1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pkbWFzdGVyLmMKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiBqZG1hc3Rlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbWFzdGVyIGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KKyAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjb25jZXJuZWQgd2l0aCBzZWxlY3RpbmcgdGhlIG1vZHVsZXMgdG8gYmUgZXhlY3V0ZWQKKyAqIGFuZCB3aXRoIGRldGVybWluaW5nIHRoZSBudW1iZXIgb2YgcGFzc2VzIGFuZCB0aGUgd29yayB0byBiZSBkb25lIGluIGVhY2gKKyAqIHBhc3MuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIGludCBwYXNzX251bWJlcjsJCS8qICMgb2YgcGFzc2VzIGNvbXBsZXRlZCAqLworCisgIGJvb2xlYW4gdXNpbmdfbWVyZ2VkX3Vwc2FtcGxlOyAvKiBUUlVFIGlmIHVzaW5nIG1lcmdlZCB1cHNhbXBsZS9jY29udmVydCAqLworCisgIC8qIFNhdmVkIHJlZmVyZW5jZXMgdG8gaW5pdGlhbGl6ZWQgcXVhbnRpemVyIG1vZHVsZXMsCisgICAqIGluIGNhc2Ugd2UgbmVlZCB0byBzd2l0Y2ggbW9kZXMuCisgICAqLworICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKiBxdWFudGl6ZXJfMXBhc3M7CisgIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIHF1YW50aXplcl8ycGFzczsKK30gbXlfZGVjb21wX21hc3RlcjsKKwordHlwZWRlZiBteV9kZWNvbXBfbWFzdGVyICogbXlfbWFzdGVyX3B0cjsKKworCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgbWVyZ2VkIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gc2hvdWxkIGJlIHVzZWQuCisgKiBDUlVDSUFMOiB0aGlzIG11c3QgbWF0Y2ggdGhlIGFjdHVhbCBjYXBhYmlsaXRpZXMgb2YgamRtZXJnZS5jIQorICovCisKK0xPQ0FMKGJvb2xlYW4pCit1c2VfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECisgIC8qIE1lcmdpbmcgaXMgdGhlIGVxdWl2YWxlbnQgb2YgcGxhaW4gYm94LWZpbHRlciB1cHNhbXBsaW5nICovCisgIGlmIChjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyB8fCBjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykKKyAgICByZXR1cm4gRkFMU0U7CisgIC8qIGpkbWVyZ2UuYyBvbmx5IHN1cHBvcnRzIFlDQz0+UkdCIGNvbG9yIGNvbnZlcnNpb24gKi8KKyAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19ZQ2JDciB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMyB8fAorICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCIHx8CisgICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8qIGFuZCBpdCBvbmx5IGhhbmRsZXMgMmgxdiBvciAyaDJ2IHNhbXBsaW5nIHJhdGlvcyAqLworICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yICE9IDIgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciAhPSAxIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgIT0gMSB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID4gIDIgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciAhPSAxIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgIT0gMSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8qIGZ1cnRoZXJtb3JlLCBpdCBkb2Vzbid0IHdvcmsgaWYgd2UndmUgc2NhbGVkIHRoZSBJRENUcyBkaWZmZXJlbnRseSAqLworICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5EQ1Rfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0uRENUX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLkRDVF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8qID8/PyBhbHNvIG5lZWQgdG8gdGVzdCBmb3IgdXBzYW1wbGUtdGltZSByZXNjYWxpbmcsIHdoZW4gJiBpZiBzdXBwb3J0ZWQgKi8KKyAgcmV0dXJuIFRSVUU7CQkJLyogYnkgZ29sbHksIGl0J2xsIHdvcmsuLi4gKi8KKyNlbHNlCisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisKKy8qCisgKiBDb21wdXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGFuZCByZWxhdGVkIHZhbHVlcy4KKyAqIE5PVEU6IHRoaXMgaXMgZXhwb3J0ZWQgZm9yIHBvc3NpYmxlIHVzZSBieSBhcHBsaWNhdGlvbi4KKyAqIEhlbmNlIGl0IG11c3RuJ3QgZG8gYW55dGhpbmcgdGhhdCBjYW4ndCBiZSBkb25lIHR3aWNlLgorICogQWxzbyBub3RlIHRoYXQgaXQgbWF5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIG1hc3RlciBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQhCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBtYXN0ZXIgc2VsZWN0aW9uIHBoYXNlICovCit7CisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisjZW5kaWYKKworICAvKiBQcmV2ZW50IGFwcGxpY2F0aW9uIGZyb20gY2FsbGluZyBtZSBhdCB3cm9uZyB0aW1lcyAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUkVBRFkpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKKworICAvKiBDb21wdXRlIGFjdHVhbCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBhbmQgRENUIHNjYWxpbmcgY2hvaWNlcy4gKi8KKyAgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA4IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSkgeworICAgIC8qIFByb3ZpZGUgMS84IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDhMKTsKKyAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgOEwpOworICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gMTsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogNCA8PSBjaW5mby0+c2NhbGVfZGVub20pIHsKKyAgICAvKiBQcm92aWRlIDEvNCBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCA0TCk7CisgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDRMKTsKKyAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IDI7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDIgPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7CisgICAgLyogUHJvdmlkZSAxLzIgc2NhbGluZyAqLworICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgMkwpOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCAyTCk7CisgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSA0OworICB9IGVsc2UgeworICAgIC8qIFByb3ZpZGUgMS8xIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7CisgIH0KKyAgLyogSW4gc2VsZWN0aW5nIHRoZSBhY3R1YWwgRENUIHNjYWxpbmcgZm9yIGVhY2ggY29tcG9uZW50LCB3ZSB0cnkgdG8KKyAgICogc2NhbGUgdXAgdGhlIGNocm9tYSBjb21wb25lbnRzIHZpYSBJRENUIHNjYWxpbmcgcmF0aGVyIHRoYW4gdXBzYW1wbGluZy4KKyAgICogVGhpcyBzYXZlcyB0aW1lIGlmIHRoZSB1cHNhbXBsZXIgZ2V0cyB0byB1c2UgMToxIHNjYWxpbmcuCisgICAqIE5vdGUgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgc3VwcG9ydGVkIERDVCBzY2FsaW5ncyBhcmUgcG93ZXJzIG9mIDIuCisgICAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGludCBzc2l6ZSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICAgIHdoaWxlIChzc2l6ZSA8IERDVFNJWkUgJiYKKwkgICAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIHNzaXplICogMiA8PQorCSAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkgJiYKKwkgICAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIHNzaXplICogMiA8PQorCSAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkpIHsKKyAgICAgIHNzaXplID0gc3NpemUgKiAyOworICAgIH0KKyAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBzc2l6ZTsKKyAgfQorCisgIC8qIFJlY29tcHV0ZSBkb3duc2FtcGxlZCBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHM7CisgICAqIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGtub3cgdGhlc2UgaWYgdXNpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuCisgICAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIFNpemUgaW4gc2FtcGxlcywgYWZ0ZXIgSURDVCBzY2FsaW5nICovCisgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqCisJCSAgICAobG9uZykgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICoKKwkJICAgIChsb25nKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSksCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgfQorCisjZWxzZSAvKiAhSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLworCisgIC8qIEhhcmR3aXJlIGl0IHRvICJubyBzY2FsaW5nIiAqLworICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOworICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgIC8qIGpkaW5wdXQuYyBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBEQ1Rfc2NhbGVkX3NpemUgdG8gRENUU0laRSwKKyAgICogYW5kIGhhcyBjb21wdXRlZCB1bnNjYWxlZCBkb3duc2FtcGxlZF93aWR0aCBhbmQgZG93bnNhbXBsZWRfaGVpZ2h0LgorICAgKi8KKworI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KKworICAvKiBSZXBvcnQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gc2VsZWN0ZWQgY29sb3JzcGFjZS4gKi8KKyAgLyogUHJvYmFibHkgdGhpcyBzaG91bGQgYmUgaW4gdGhlIGNvbG9yIGNvbnZlcnNpb24gbW9kdWxlLi4uICovCisgIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgeworICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfUkdCOgorI2lmIFJHQl9QSVhFTFNJWkUgIT0gMworICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IFJHQl9QSVhFTFNJWkU7CisgICAgYnJlYWs7CisjZW5kaWYgLyogZWxzZSBzaGFyZSBjb2RlIHdpdGggWUNiQ3IgKi8KKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMzsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfQ01ZSzoKKyAgY2FzZSBKQ1NfWUNDSzoKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OworICAgIGJyZWFrOworICBkZWZhdWx0OgkJCS8qIGVsc2UgbXVzdCBiZSBzYW1lIGNvbG9yc3BhY2UgYXMgaW4gZmlsZSAqLworICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICBicmVhazsKKyAgfQorICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPSAoY2luZm8tPnF1YW50aXplX2NvbG9ycyA/IDEgOgorCQkJICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzKTsKKworICAvKiBTZWUgaWYgdXBzYW1wbGVyIHdpbGwgd2FudCB0byBlbWl0IG1vcmUgdGhhbiBvbmUgcm93IGF0IGEgdGltZSAqLworICBpZiAodXNlX21lcmdlZF91cHNhbXBsZShjaW5mbykpCisgICAgY2luZm8tPnJlY19vdXRidWZfaGVpZ2h0ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICBlbHNlCisgICAgY2luZm8tPnJlY19vdXRidWZfaGVpZ2h0ID0gMTsKK30KKworCisvKgorICogU2V2ZXJhbCBkZWNvbXByZXNzaW9uIHByb2Nlc3NlcyBuZWVkIHRvIHJhbmdlLWxpbWl0IHZhbHVlcyB0byB0aGUgcmFuZ2UKKyAqIDAuLk1BWEpTQU1QTEU7IHRoZSBpbnB1dCB2YWx1ZSBtYXkgZmFsbCBzb21ld2hhdCBvdXRzaWRlIHRoaXMgcmFuZ2UKKyAqIGR1ZSB0byBub2lzZSBpbnRyb2R1Y2VkIGJ5IHF1YW50aXphdGlvbiwgcm91bmRvZmYgZXJyb3IsIGV0Yy4gIFRoZXNlCisgKiBwcm9jZXNzZXMgYXJlIGlubmVyIGxvb3BzIGFuZCBuZWVkIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUuICBPbiBtb3N0CisgKiBtYWNoaW5lcywgcGFydGljdWxhcmx5IENQVXMgd2l0aCBwaXBlbGluZXMgb3IgaW5zdHJ1Y3Rpb24gcHJlZmV0Y2gsCisgKiBhIChzdWJzY3JpcHQtY2hlY2stbGVzcykgQyB0YWJsZSBsb29rdXAKKyAqCQl4ID0gc2FtcGxlX3JhbmdlX2xpbWl0W3hdOworICogaXMgZmFzdGVyIHRoYW4gZXhwbGljaXQgdGVzdHMKKyAqCQlpZiAoeCA8IDApICB4ID0gMDsKKyAqCQllbHNlIGlmICh4ID4gTUFYSlNBTVBMRSkgIHggPSBNQVhKU0FNUExFOworICogVGhlc2UgcHJvY2Vzc2VzIGFsbCB1c2UgYSBjb21tb24gdGFibGUgcHJlcGFyZWQgYnkgdGhlIHJvdXRpbmUgYmVsb3cuCisgKgorICogRm9yIG1vc3Qgc3RlcHMgd2UgY2FuIG1hdGhlbWF0aWNhbGx5IGd1YXJhbnRlZSB0aGF0IHRoZSBpbml0aWFsIHZhbHVlCisgKiBvZiB4IGlzIHdpdGhpbiBNQVhKU0FNUExFKzEgb2YgdGhlIGxlZ2FsIHJhbmdlLCBzbyBhIHRhYmxlIHJ1bm5pbmcgZnJvbQorICogLShNQVhKU0FNUExFKzEpIHRvIDIqTUFYSlNBTVBMRSsxIGlzIHN1ZmZpY2llbnQuICBCdXQgZm9yIHRoZSBpbml0aWFsCisgKiBsaW1pdGluZyBzdGVwIChqdXN0IGFmdGVyIHRoZSBJRENUKSwgYSB3aWxkbHkgb3V0LW9mLXJhbmdlIHZhbHVlIGlzIAorICogcG9zc2libGUgaWYgdGhlIGlucHV0IGRhdGEgaXMgY29ycnVwdC4gIFRvIGF2b2lkIGFueSBjaGFuY2Ugb2YgaW5kZXhpbmcKKyAqIG9mZiB0aGUgZW5kIG9mIG1lbW9yeSBhbmQgZ2V0dGluZyBhIGJhZC1wb2ludGVyIHRyYXAsIHdlIHBlcmZvcm0gdGhlCisgKiBwb3N0LUlEQ1QgbGltaXRpbmcgdGh1czoKKyAqCQl4ID0gcmFuZ2VfbGltaXRbeCAmIE1BU0tdOworICogd2hlcmUgTUFTSyBpcyAyIGJpdHMgd2lkZXIgdGhhbiBsZWdhbCBzYW1wbGUgZGF0YSwgaWUgMTAgYml0cyBmb3IgOC1iaXQKKyAqIHNhbXBsZXMuICBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyB0aGlzIGlzIG1vcmUgdGhhbiBlbm91Z2ggcmFuZ2UgYW5kCisgKiBhIGNvcnJlY3Qgb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkOyB3aXRoIGJvZ3VzIGlucHV0IGRhdGEgdGhlIG1hc2sgd2lsbAorICogY2F1c2Ugd3JhcGFyb3VuZCwgYW5kIHdlIHdpbGwgc2FmZWx5IGdlbmVyYXRlIGEgYm9ndXMtYnV0LWluLXJhbmdlIG91dHB1dC4KKyAqIEZvciB0aGUgcG9zdC1JRENUIHN0ZXAsIHdlIHdhbnQgdG8gY29udmVydCB0aGUgZGF0YSBmcm9tIHNpZ25lZCB0byB1bnNpZ25lZAorICogcmVwcmVzZW50YXRpb24gYnkgYWRkaW5nIENFTlRFUkpTQU1QTEUgYXQgdGhlIHNhbWUgdGltZSB0aGF0IHdlIGxpbWl0IGl0LgorICogU28gdGhlIHBvc3QtSURDVCBsaW1pdGluZyB0YWJsZSBlbmRzIHVwIGxvb2tpbmcgbGlrZSB0aGlzOgorICogICBDRU5URVJKU0FNUExFLENFTlRFUkpTQU1QTEUrMSwuLi4sTUFYSlNBTVBMRSwKKyAqICAgTUFYSlNBTVBMRSAocmVwZWF0IDIqKE1BWEpTQU1QTEUrMSktQ0VOVEVSSlNBTVBMRSB0aW1lcyksCisgKiAgIDAgICAgICAgICAgKHJlcGVhdCAyKihNQVhKU0FNUExFKzEpLUNFTlRFUkpTQU1QTEUgdGltZXMpLAorICogICAwLDEsLi4uLENFTlRFUkpTQU1QTEUtMQorICogTmVnYXRpdmUgaW5wdXRzIHNlbGVjdCB2YWx1ZXMgZnJvbSB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgdGFibGUgYWZ0ZXIKKyAqIG1hc2tpbmcuCisgKgorICogV2UgY2FuIHNhdmUgc29tZSBzcGFjZSBieSBvdmVybGFwcGluZyB0aGUgc3RhcnQgb2YgdGhlIHBvc3QtSURDVCB0YWJsZQorICogd2l0aCB0aGUgc2ltcGxlciByYW5nZSBsaW1pdGluZyB0YWJsZS4gIFRoZSBwb3N0LUlEQ1QgdGFibGUgYmVnaW5zIGF0CisgKiBzYW1wbGVfcmFuZ2VfbGltaXQgKyBDRU5URVJKU0FNUExFLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgdGFibGUgaXMgYWxsb2NhdGVkIGluIG5lYXIgZGF0YSBzcGFjZSBvbiBQQ3M7IGl0J3Mgc21hbGwKKyAqIGVub3VnaCBhbmQgdXNlZCBvZnRlbiBlbm91Z2ggdG8ganVzdGlmeSB0aGlzLgorICovCisKK0xPQ0FMKHZvaWQpCitwcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIHNhbXBsZV9yYW5nZV9saW1pdCB0YWJsZSAqLworeworICBKU0FNUExFICogdGFibGU7CisgIGludCBpOworCisgIHRhYmxlID0gKEpTQU1QTEUgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkoNSAqIChNQVhKU0FNUExFKzEpICsgQ0VOVEVSSlNBTVBMRSkgKiBTSVpFT0YoSlNBTVBMRSkpOworICB0YWJsZSArPSAoTUFYSlNBTVBMRSsxKTsJLyogYWxsb3cgbmVnYXRpdmUgc3Vic2NyaXB0cyBvZiBzaW1wbGUgdGFibGUgKi8KKyAgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdCA9IHRhYmxlOworICAvKiBGaXJzdCBzZWdtZW50IG9mICJzaW1wbGUiIHRhYmxlOiBsaW1pdFt4XSA9IDAgZm9yIHggPCAwICovCisgIE1FTVpFUk8odGFibGUgLSAoTUFYSlNBTVBMRSsxKSwgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSlNBTVBMRSkpOworICAvKiBNYWluIHBhcnQgb2YgInNpbXBsZSIgdGFibGU6IGxpbWl0W3hdID0geCAqLworICBmb3IgKGkgPSAwOyBpIDw9IE1BWEpTQU1QTEU7IGkrKykKKyAgICB0YWJsZVtpXSA9IChKU0FNUExFKSBpOworICB0YWJsZSArPSBDRU5URVJKU0FNUExFOwkvKiBQb2ludCB0byB3aGVyZSBwb3N0LUlEQ1QgdGFibGUgc3RhcnRzICovCisgIC8qIEVuZCBvZiBzaW1wbGUgdGFibGUsIHJlc3Qgb2YgZmlyc3QgaGFsZiBvZiBwb3N0LUlEQ1QgdGFibGUgKi8KKyAgZm9yIChpID0gQ0VOVEVSSlNBTVBMRTsgaSA8IDIqKE1BWEpTQU1QTEUrMSk7IGkrKykKKyAgICB0YWJsZVtpXSA9IE1BWEpTQU1QTEU7CisgIC8qIFNlY29uZCBoYWxmIG9mIHBvc3QtSURDVCB0YWJsZSAqLworICBNRU1aRVJPKHRhYmxlICsgKDIgKiAoTUFYSlNBTVBMRSsxKSksCisJICAoMiAqIChNQVhKU0FNUExFKzEpIC0gQ0VOVEVSSlNBTVBMRSkgKiBTSVpFT0YoSlNBTVBMRSkpOworICBNRU1DT1BZKHRhYmxlICsgKDQgKiAoTUFYSlNBTVBMRSsxKSAtIENFTlRFUkpTQU1QTEUpLAorCSAgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdCwgQ0VOVEVSSlNBTVBMRSAqIFNJWkVPRihKU0FNUExFKSk7Cit9CisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgZGVjb21wcmVzc2lvbiBtb2R1bGVzLgorICogVGhpcyBpcyBkb25lIG9uY2UgYXQganBlZ19zdGFydF9kZWNvbXByZXNzIHRpbWUuICBXZSBkZXRlcm1pbmUKKyAqIHdoaWNoIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgaW5pdGlhbGl6YXRpb24gY2FsbHMuCisgKiBXZSBhbHNvIGluaXRpYWxpemUgdGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlIHRvIGJlZ2luIGNvbnN1bWluZyBkYXRhLgorICoKKyAqIFNpbmNlIGpwZWdfcmVhZF9oZWFkZXIgaGFzIGZpbmlzaGVkLCB3ZSBrbm93IHdoYXQgaXMgaW4gdGhlIFNPRgorICogYW5kIChmaXJzdCkgU09TIG1hcmtlcnMuICBXZSBhbHNvIGhhdmUgYWxsIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIKKyAqIHNldHRpbmdzLgorICovCisKK0xPQ0FMKHZvaWQpCittYXN0ZXJfc2VsZWN0aW9uIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworICBib29sZWFuIHVzZV9jX2J1ZmZlcjsKKyAgbG9uZyBzYW1wbGVzcGVycm93OworICBKRElNRU5TSU9OIGpkX3NhbXBsZXNwZXJyb3c7CisKKyAgLyogSW5pdGlhbGl6ZSBkaW1lbnNpb25zIGFuZCBvdGhlciBzdHVmZiAqLworICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOworICBwcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlKGNpbmZvKTsKKworICAvKiBXaWR0aCBvZiBhbiBvdXRwdXQgc2NhbmxpbmUgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIEpESU1FTlNJT04uICovCisgIHNhbXBsZXNwZXJyb3cgPSAobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCAqIChsb25nKSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisgIGpkX3NhbXBsZXNwZXJyb3cgPSAoSkRJTUVOU0lPTikgc2FtcGxlc3BlcnJvdzsKKyAgaWYgKChsb25nKSBqZF9zYW1wbGVzcGVycm93ICE9IHNhbXBsZXNwZXJyb3cpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7CisKKyAgLyogSW5pdGlhbGl6ZSBteSBwcml2YXRlIHN0YXRlICovCisgIG1hc3Rlci0+cGFzc19udW1iZXIgPSAwOworICBtYXN0ZXItPnVzaW5nX21lcmdlZF91cHNhbXBsZSA9IHVzZV9tZXJnZWRfdXBzYW1wbGUoY2luZm8pOworCisgIC8qIENvbG9yIHF1YW50aXplciBzZWxlY3Rpb24gKi8KKyAgbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3MgPSBOVUxMOworICBtYXN0ZXItPnF1YW50aXplcl8ycGFzcyA9IE5VTEw7CisgIC8qIE5vIG1vZGUgY2hhbmdlcyBpZiBub3QgdXNpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KKyAgaWYgKCEgY2luZm8tPnF1YW50aXplX2NvbG9ycyB8fCAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgeworICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBGQUxTRTsKKyAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7CisgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOworICB9CisgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7CisgICAgaWYgKGNpbmZvLT5yYXdfZGF0YV9vdXQpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOworICAgIC8qIDItcGFzcyBxdWFudGl6ZXIgb25seSB3b3JrcyBpbiAzLWNvbXBvbmVudCBjb2xvciBzcGFjZS4gKi8KKyAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICE9IDMpIHsKKyAgICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBUUlVFOworICAgICAgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCA9IEZBTFNFOworICAgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOworICAgICAgY2luZm8tPmNvbG9ybWFwID0gTlVMTDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5jb2xvcm1hcCAhPSBOVUxMKSB7CisgICAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSkgeworICAgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBUUlVFOworICAgIH0KKworICAgIGlmIChjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50KSB7CisjaWZkZWYgUVVBTlRfMVBBU1NfU1VQUE9SVEVECisgICAgICBqaW5pdF8xcGFzc19xdWFudGl6ZXIoY2luZm8pOworICAgICAgbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3MgPSBjaW5mby0+Y3F1YW50aXplOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIFdlIHVzZSB0aGUgMi1wYXNzIGNvZGUgdG8gbWFwIHRvIGV4dGVybmFsIGNvbG9ybWFwcy4gKi8KKyAgICBpZiAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCB8fCBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50KSB7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgICAgICBqaW5pdF8ycGFzc19xdWFudGl6ZXIoY2luZm8pOworICAgICAgbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3MgPSBjaW5mby0+Y3F1YW50aXplOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0KKyAgICAvKiBJZiBib3RoIHF1YW50aXplcnMgYXJlIGluaXRpYWxpemVkLCB0aGUgMi1wYXNzIG9uZSBpcyBsZWZ0IGFjdGl2ZTsKKyAgICAgKiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3Igc3RhcnRpbmcgd2l0aCBxdWFudGl6YXRpb24gdG8gYW4gZXh0ZXJuYWwgbWFwLgorICAgICAqLworICB9CisKKyAgLyogUG9zdC1wcm9jZXNzaW5nOiBpbiBwYXJ0aWN1bGFyLCBjb2xvciBjb252ZXJzaW9uIGZpcnN0ICovCisgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpIHsKKyAgICBpZiAobWFzdGVyLT51c2luZ19tZXJnZWRfdXBzYW1wbGUpIHsKKyNpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAorICAgICAgamluaXRfbWVyZ2VkX3Vwc2FtcGxlcihjaW5mbyk7IC8qIGRvZXMgY29sb3IgY29udmVyc2lvbiB0b28gKi8KKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIoY2luZm8pOworICAgICAgamluaXRfdXBzYW1wbGVyKGNpbmZvKTsKKyAgICB9CisgICAgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIoY2luZm8sIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpOworICB9CisgIC8qIEludmVyc2UgRENUICovCisgIGppbml0X2ludmVyc2VfZGN0KGNpbmZvKTsKKyAgLyogRW50cm9weSBkZWNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgamluaXRfaHVmZl9kZWNvZGVyKGNpbmZvKTsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgcHJpbmNpcGFsIGJ1ZmZlciBjb250cm9sbGVycy4gKi8KKyAgdXNlX2NfYnVmZmVyID0gY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMgfHwgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlOworICBqaW5pdF9kX2NvZWZfY29udHJvbGxlcihjaW5mbywgdXNlX2NfYnVmZmVyKTsKKworICBpZiAoISBjaW5mby0+cmF3X2RhdGFfb3V0KQorICAgIGppbml0X2RfbWFpbl9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOworCisgIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCisgICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIGlucHV0IHNpZGUgb2YgZGVjb21wcmVzc29yIHRvIGNvbnN1bWUgZmlyc3Qgc2Nhbi4gKi8KKyAgKCpjaW5mby0+aW5wdXRjdGwtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7CisKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgLyogSWYganBlZ19zdGFydF9kZWNvbXByZXNzIHdpbGwgcmVhZCB0aGUgd2hvbGUgZmlsZSwgaW5pdGlhbGl6ZQorICAgKiBwcm9ncmVzcyBtb25pdG9yaW5nIGFwcHJvcHJpYXRlbHkuICBUaGUgaW5wdXQgc3RlcCBpcyBjb3VudGVkCisgICAqIGFzIG9uZSBwYXNzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmICEgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlICYmCisgICAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgeworICAgIGludCBuc2NhbnM7CisgICAgLyogRXN0aW1hdGUgbnVtYmVyIG9mIHNjYW5zIHRvIHNldCBwYXNzX2xpbWl0LiAqLworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworICAgICAgLyogQXJiaXRyYXJpbHkgZXN0aW1hdGUgMiBpbnRlcmxlYXZlZCBEQyBzY2FucyArIDMgQUMgc2NhbnMvY29tcG9uZW50LiAqLworICAgICAgbnNjYW5zID0gMiArIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZvciBhIG5vbnByb2dyZXNzaXZlIG11bHRpc2NhbiBmaWxlLCBlc3RpbWF0ZSAxIHNjYW4gcGVyIGNvbXBvbmVudC4gKi8KKyAgICAgIG5zY2FucyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICB9CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAwTDsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAqIG5zY2FuczsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSAwOworICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPyAzIDogMik7CisgICAgLyogQ291bnQgdGhlIGlucHV0IHBhc3MgYXMgZG9uZSAqLworICAgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKKyAgfQorI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLworfQorCisKKy8qCisgKiBQZXItcGFzcyBzZXR1cC4KKyAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBvdXRwdXQgcGFzcy4gIFdlIGRldGVybWluZSB3aGljaAorICogbW9kdWxlcyB3aWxsIGJlIGFjdGl2ZSBkdXJpbmcgdGhpcyBwYXNzIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUKKyAqIHN0YXJ0X3Bhc3MgY2FsbHMuICBXZSBhbHNvIHNldCBpc19kdW1teV9wYXNzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhpcworICogaXMgYSAicmVhbCIgb3V0cHV0IHBhc3Mgb3IgYSBkdW1teSBwYXNzIGZvciBjb2xvciBxdWFudGl6YXRpb24uCisgKiAoSW4gdGhlIGxhdHRlciBjYXNlLCBqZGFwaXN0ZC5jIHdpbGwgY3JhbmsgdGhlIHBhc3MgdG8gY29tcGxldGlvbi4pCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKKworICBpZiAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcykgeworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorICAgIC8qIEZpbmFsIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiAqLworICAgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsKKyAgICAoKmNpbmZvLT5jcXVhbnRpemUtPnN0YXJ0X3Bhc3MpIChjaW5mbywgRkFMU0UpOworICAgICgqY2luZm8tPnBvc3QtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKKyAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycyAmJiBjaW5mby0+Y29sb3JtYXAgPT0gTlVMTCkgeworICAgICAgLyogU2VsZWN0IG5ldyBxdWFudGl6YXRpb24gbWV0aG9kICovCisgICAgICBpZiAoY2luZm8tPnR3b19wYXNzX3F1YW50aXplICYmIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpIHsKKwljaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3M7CisJbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQpIHsKKwljaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3M7CisgICAgICB9IGVsc2UgeworCUVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOworICAgICAgfQorICAgIH0KKyAgICAoKmNpbmZvLT5pZGN0LT5zdGFydF9wYXNzKSAoY2luZm8pOworICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X291dHB1dF9wYXNzKSAoY2luZm8pOworICAgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpIHsKKyAgICAgIGlmICghIG1hc3Rlci0+dXNpbmdfbWVyZ2VkX3Vwc2FtcGxlKQorCSgqY2luZm8tPmNjb252ZXJ0LT5zdGFydF9wYXNzKSAoY2luZm8pOworICAgICAgKCpjaW5mby0+dXBzYW1wbGUtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKKwkoKmNpbmZvLT5jcXVhbnRpemUtPnN0YXJ0X3Bhc3MpIChjaW5mbywgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyk7CisgICAgICAoKmNpbmZvLT5wb3N0LT5zdGFydF9wYXNzKSAoY2luZm8sCisJICAgIChtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID8gSkJVRl9TQVZFX0FORF9QQVNTIDogSkJVRl9QQVNTX1RIUlUpKTsKKyAgICAgICgqY2luZm8tPm1haW4tPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9QQVNTX1RIUlUpOworICAgIH0KKyAgfQorCisgIC8qIFNldCB1cCBwcm9ncmVzcyBtb25pdG9yJ3MgcGFzcyBpbmZvIGlmIHByZXNlbnQgKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gbWFzdGVyLT5wYXNzX251bWJlcjsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXIgKworCQkJCSAgICAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA/IDIgOiAxKTsKKyAgICAvKiBJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB3ZSBhc3N1bWUgb25lIG1vcmUgb3V0cHV0IHBhc3MgaWYgRU9JIG5vdAorICAgICAqIHlldCByZWFjaGVkLCBidXQgbm8gbW9yZSBwYXNzZXMgaWYgRU9JIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICovCisgICAgaWYgKGNpbmZvLT5idWZmZXJlZF9pbWFnZSAmJiAhIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpIHsKKyAgICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzICs9IChjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID8gMiA6IDEpOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgZW5kIG9mIGFuIG91dHB1dCBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX291dHB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworCisgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQorICAgICgqY2luZm8tPmNxdWFudGl6ZS0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7CisgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKK30KKworCisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisKKy8qCisgKiBTd2l0Y2ggdG8gYSBuZXcgZXh0ZXJuYWwgY29sb3JtYXAgYmV0d2VlbiBvdXRwdXQgcGFzc2VzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19uZXdfY29sb3JtYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisKKyAgLyogUHJldmVudCBhcHBsaWNhdGlvbiBmcm9tIGNhbGxpbmcgbWUgYXQgd3JvbmcgdGltZXMgKi8KKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0JVRklNQUdFKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgJiYgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCAmJgorICAgICAgY2luZm8tPmNvbG9ybWFwICE9IE5VTEwpIHsKKyAgICAvKiBTZWxlY3QgMi1wYXNzIHF1YW50aXplciBmb3IgZXh0ZXJuYWwgY29sb3JtYXAgdXNlICovCisgICAgY2luZm8tPmNxdWFudGl6ZSA9IG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzOworICAgIC8qIE5vdGlmeSBxdWFudGl6ZXIgb2YgY29sb3JtYXAgY2hhbmdlICovCisgICAgKCpjaW5mby0+Y3F1YW50aXplLT5uZXdfY29sb3JfbWFwKSAoY2luZm8pOworICAgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsgLyoganVzdCBpbiBjYXNlICovCisgIH0gZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOworfQorCisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgbWFzdGVyIGRlY29tcHJlc3Npb24gY29udHJvbCBhbmQgc2VsZWN0IGFjdGl2ZSBtb2R1bGVzLgorICogVGhpcyBpcyBwZXJmb3JtZWQgYXQgdGhlIHN0YXJ0IG9mIGpwZWdfc3RhcnRfZGVjb21wcmVzcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X21hc3Rlcl9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlcjsKKworICBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YobXlfZGVjb21wX21hc3RlcikpOworICBjaW5mby0+bWFzdGVyID0gKHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgKikgbWFzdGVyOworICBtYXN0ZXItPnB1Yi5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcyA9IHByZXBhcmVfZm9yX291dHB1dF9wYXNzOworICBtYXN0ZXItPnB1Yi5maW5pc2hfb3V0cHV0X3Bhc3MgPSBmaW5pc2hfb3V0cHV0X3Bhc3M7CisKKyAgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IEZBTFNFOworCisgIG1hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamRtZXJnZS5jIGIvY29tbW9uL2pwZWcvamRtZXJnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDQ0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZG1lcmdlLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qCisgKiBqZG1lcmdlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBtZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBjb21iaW5lcyBmdW5jdGlvbnMgZnJvbSBqZHNhbXBsZS5jIGFuZCBqZGNvbG9yLmM7CisgKiByZWFkIHRob3NlIGZpbGVzIGZpcnN0IHRvIHVuZGVyc3RhbmQgd2hhdCdzIGdvaW5nIG9uLgorICoKKyAqIFdoZW4gdGhlIGNocm9tYSBjb21wb25lbnRzIGFyZSB0byBiZSB1cHNhbXBsZWQgYnkgc2ltcGxlIHJlcGxpY2F0aW9uCisgKiAoaWUsIGJveCBmaWx0ZXJpbmcpLCB3ZSBjYW4gc2F2ZSBzb21lIHdvcmsgaW4gY29sb3IgY29udmVyc2lvbiBieQorICogY2FsY3VsYXRpbmcgYWxsIHRoZSBvdXRwdXQgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gYSBwYWlyIG9mIGNocm9tYQorICogc2FtcGxlcyBhdCBvbmUgdGltZS4gIEluIHRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucworICoJUiA9IFkgICAgICAgICAgICsgSzEgKiBDcgorICoJRyA9IFkgKyBLMiAqIENiICsgSzMgKiBDcgorICoJQiA9IFkgKyBLNCAqIENiCisgKiBvbmx5IHRoZSBZIHRlcm0gdmFyaWVzIGFtb25nIHRoZSBncm91cCBvZiBwaXhlbHMgY29ycmVzcG9uZGluZyB0byBhIHBhaXIKKyAqIG9mIGNocm9tYSBzYW1wbGVzLCBzbyB0aGUgcmVzdCBvZiB0aGUgdGVybXMgY2FuIGJlIGNhbGN1bGF0ZWQganVzdCBvbmNlLgorICogQXQgdHlwaWNhbCBzYW1wbGluZyByYXRpb3MsIHRoaXMgZWxpbWluYXRlcyBoYWxmIG9yIHRocmVlLXF1YXJ0ZXJzIG9mIHRoZQorICogbXVsdGlwbGljYXRpb25zIG5lZWRlZCBmb3IgY29sb3IgY29udmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgY3VycmVudGx5IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBjYXNlczoKKyAqCVlDYkNyID0+IFJHQiBjb2xvciBjb252ZXJzaW9uIG9ubHkuCisgKglTYW1wbGluZyByYXRpb3Mgb2YgMmgxdiBvciAyaDJ2LgorICoJTm8gc2NhbGluZyBuZWVkZWQgYXQgdXBzYW1wbGUgdGltZS4KKyAqCUNvcm5lci1hbGlnbmVkIChub24tQ0NJUjYwMSkgc2FtcGxpbmcgYWxpZ25tZW50LgorICogT3RoZXIgc3BlY2lhbCBjYXNlcyBjb3VsZCBiZSBhZGRlZCwgYnV0IGluIG1vc3QgYXBwbGljYXRpb25zIHRoZXNlIGFyZQorICogdGhlIG9ubHkgY29tbW9uIGNhc2VzLiAgKEZvciB1bmNvbW1vbiBjYXNlcyB3ZSBmYWxsIGJhY2sgb24gdGhlIG1vcmUKKyAqIGdlbmVyYWwgY29kZSBpbiBqZHNhbXBsZS5jIGFuZCBqZGNvbG9yLmMuKQorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECisKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ191cHNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogUG9pbnRlciB0byByb3V0aW5lIHRvIGRvIGFjdHVhbCB1cHNhbXBsaW5nL2NvbnZlcnNpb24gb2Ygb25lIHJvdyBncm91cCAqLworICBKTUVUSE9EKHZvaWQsIHVwbWV0aG9kLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCisJCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpKTsKKworICAvKiBQcml2YXRlIHN0YXRlIGZvciBZQ0MtPlJHQiBjb252ZXJzaW9uICovCisgIGludCAqIENyX3JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIFIgY29udmVyc2lvbiAqLworICBpbnQgKiBDYl9iX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDYiB0byBCIGNvbnZlcnNpb24gKi8KKyAgSU5UMzIgKiBDcl9nX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDciB0byBHIGNvbnZlcnNpb24gKi8KKyAgSU5UMzIgKiBDYl9nX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDYiB0byBHIGNvbnZlcnNpb24gKi8KKworICAvKiBGb3IgMjoxIHZlcnRpY2FsIHNhbXBsaW5nLCB3ZSBwcm9kdWNlIHR3byBvdXRwdXQgcm93cyBhdCBhIHRpbWUuCisgICAqIFdlIG5lZWQgYSAic3BhcmUiIHJvdyBidWZmZXIgdG8gaG9sZCB0aGUgc2Vjb25kIG91dHB1dCByb3cgaWYgdGhlCisgICAqIGFwcGxpY2F0aW9uIHByb3ZpZGVzIGp1c3QgYSBvbmUtcm93IGJ1ZmZlcjsgd2UgYWxzbyB1c2UgdGhlIHNwYXJlCisgICAqIHRvIGRpc2NhcmQgdGhlIGR1bW15IGxhc3Qgcm93IGlmIHRoZSBpbWFnZSBoZWlnaHQgaXMgb2RkLgorICAgKi8KKyAgSlNBTVBST1cgc3BhcmVfcm93OworICBib29sZWFuIHNwYXJlX2Z1bGw7CQkvKiBUIGlmIHNwYXJlIGJ1ZmZlciBpcyBvY2N1cGllZCAqLworCisgIEpESU1FTlNJT04gb3V0X3Jvd193aWR0aDsJLyogc2FtcGxlcyBwZXIgb3V0cHV0IHJvdyAqLworICBKRElNRU5TSU9OIHJvd3NfdG9fZ287CS8qIGNvdW50cyByb3dzIHJlbWFpbmluZyBpbiBpbWFnZSAqLworfSBteV91cHNhbXBsZXI7CisKK3R5cGVkZWYgbXlfdXBzYW1wbGVyICogbXlfdXBzYW1wbGVfcHRyOworCisjZGVmaW5lIFNDQUxFQklUUwkxNgkvKiBzcGVlZGllc3QgcmlnaHQtc2hpZnQgb24gc29tZSBtYWNoaW5lcyAqLworI2RlZmluZSBPTkVfSEFMRgkoKElOVDMyKSAxIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KQkJKChJTlQzMikgKCh4KSAqICgxTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKworLyoKKyAqIEluaXRpYWxpemUgdGFibGVzIGZvciBZQ0MtPlJHQiBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCisgKiBUaGlzIGlzIHRha2VuIGRpcmVjdGx5IGZyb20gamRjb2xvci5jOyBzZWUgdGhhdCBmaWxlIGZvciBtb3JlIGluZm8uCisgKi8KKworTE9DQUwodm9pZCkKK2J1aWxkX3ljY19yZ2JfdGFibGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgaW50IGk7CisgIElOVDMyIHg7CisgIFNISUZUX1RFTVBTCisKKyAgdXBzYW1wbGUtPkNyX3JfdGFiID0gKGludCAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7CisgIHVwc2FtcGxlLT5DYl9iX3RhYiA9IChpbnQgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKGludCkpOworICB1cHNhbXBsZS0+Q3JfZ190YWIgPSAoSU5UMzIgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKElOVDMyKSk7CisgIHVwc2FtcGxlLT5DYl9nX3RhYiA9IChJTlQzMiAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKKworICBmb3IgKGkgPSAwLCB4ID0gLUNFTlRFUkpTQU1QTEU7IGkgPD0gTUFYSlNBTVBMRTsgaSsrLCB4KyspIHsKKyAgICAvKiBpIGlzIHRoZSBhY3R1YWwgaW5wdXQgcGl4ZWwgdmFsdWUsIGluIHRoZSByYW5nZSAwLi5NQVhKU0FNUExFICovCisgICAgLyogVGhlIENiIG9yIENyIHZhbHVlIHdlIGFyZSB0aGlua2luZyBvZiBpcyB4ID0gaSAtIENFTlRFUkpTQU1QTEUgKi8KKyAgICAvKiBDcj0+UiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjQwMjAwICogeCAqLworICAgIHVwc2FtcGxlLT5Dcl9yX3RhYltpXSA9IChpbnQpCisJCSAgICBSSUdIVF9TSElGVChGSVgoMS40MDIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7CisgICAgLyogQ2I9PkIgdmFsdWUgaXMgbmVhcmVzdCBpbnQgdG8gMS43NzIwMCAqIHggKi8KKyAgICB1cHNhbXBsZS0+Q2JfYl90YWJbaV0gPSAoaW50KQorCQkgICAgUklHSFRfU0hJRlQoRklYKDEuNzcyMDApICogeCArIE9ORV9IQUxGLCBTQ0FMRUJJVFMpOworICAgIC8qIENyPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC43MTQxNCAqIHggKi8KKyAgICB1cHNhbXBsZS0+Q3JfZ190YWJbaV0gPSAoLSBGSVgoMC43MTQxNCkpICogeDsKKyAgICAvKiBDYj0+RyB2YWx1ZSBpcyBzY2FsZWQtdXAgLTAuMzQ0MTQgKiB4ICovCisgICAgLyogV2UgYWxzbyBhZGQgaW4gT05FX0hBTEYgc28gdGhhdCBuZWVkIG5vdCBkbyBpdCBpbiBpbm5lciBsb29wICovCisgICAgdXBzYW1wbGUtPkNiX2dfdGFiW2ldID0gKC0gRklYKDAuMzQ0MTQpKSAqIHggKyBPTkVfSEFMRjsKKyAgfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhbiB1cHNhbXBsaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX21lcmdlZF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworCisgIC8qIE1hcmsgdGhlIHNwYXJlIGJ1ZmZlciBlbXB0eSAqLworICB1cHNhbXBsZS0+c3BhcmVfZnVsbCA9IEZBTFNFOworICAvKiBJbml0aWFsaXplIHRvdGFsLWhlaWdodCBjb3VudGVyIGZvciBkZXRlY3RpbmcgYm90dG9tIG9mIGltYWdlICovCisgIHVwc2FtcGxlLT5yb3dzX3RvX2dvID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7Cit9CisKKworLyoKKyAqIENvbnRyb2wgcm91dGluZSB0byBkbyB1cHNhbXBsaW5nIChhbmQgY29sb3IgY29udmVyc2lvbikuCisgKgorICogVGhlIGNvbnRyb2wgcm91dGluZSBqdXN0IGhhbmRsZXMgdGhlIHJvdyBidWZmZXJpbmcgY29uc2lkZXJhdGlvbnMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCittZXJnZWRfMnZfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQorLyogMjoxIHZlcnRpY2FsIHNhbXBsaW5nIGNhc2U6IG1heSBuZWVkIGEgc3BhcmUgcm93LiAqLworeworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIEpTQU1QUk9XIHdvcmtfcHRyc1syXTsKKyAgSkRJTUVOU0lPTiBudW1fcm93czsJCS8qIG51bWJlciBvZiByb3dzIHJldHVybmVkIHRvIGNhbGxlciAqLworCisgIGlmICh1cHNhbXBsZS0+c3BhcmVfZnVsbCkgeworICAgIC8qIElmIHdlIGhhdmUgYSBzcGFyZSByb3cgc2F2ZWQgZnJvbSBhIHByZXZpb3VzIGN5Y2xlLCBqdXN0IHJldHVybiBpdC4gKi8KKyAgICBqY29weV9zYW1wbGVfcm93cygmIHVwc2FtcGxlLT5zcGFyZV9yb3csIDAsIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsIDAsCisJCSAgICAgIDEsIHVwc2FtcGxlLT5vdXRfcm93X3dpZHRoKTsKKyAgICBudW1fcm93cyA9IDE7CisgICAgdXBzYW1wbGUtPnNwYXJlX2Z1bGwgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBGaWd1cmUgbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuIHRvIGNhbGxlci4gKi8KKyAgICBudW1fcm93cyA9IDI7CisgICAgLyogTm90IG1vcmUgdGhhbiB0aGUgZGlzdGFuY2UgdG8gdGhlIGVuZCBvZiB0aGUgaW1hZ2UuICovCisgICAgaWYgKG51bV9yb3dzID4gdXBzYW1wbGUtPnJvd3NfdG9fZ28pCisgICAgICBudW1fcm93cyA9IHVwc2FtcGxlLT5yb3dzX3RvX2dvOworICAgIC8qIEFuZCBub3QgbW9yZSB0aGFuIHdoYXQgdGhlIGNsaWVudCBjYW4gYWNjZXB0OiAqLworICAgIG91dF9yb3dzX2F2YWlsIC09ICpvdXRfcm93X2N0cjsKKyAgICBpZiAobnVtX3Jvd3MgPiBvdXRfcm93c19hdmFpbCkKKyAgICAgIG51bV9yb3dzID0gb3V0X3Jvd3NfYXZhaWw7CisgICAgLyogQ3JlYXRlIG91dHB1dCBwb2ludGVyIGFycmF5IGZvciB1cHNhbXBsZXIuICovCisgICAgd29ya19wdHJzWzBdID0gb3V0cHV0X2J1Zlsqb3V0X3Jvd19jdHJdOworICAgIGlmIChudW1fcm93cyA+IDEpIHsKKyAgICAgIHdvcmtfcHRyc1sxXSA9IG91dHB1dF9idWZbKm91dF9yb3dfY3RyICsgMV07CisgICAgfSBlbHNlIHsKKyAgICAgIHdvcmtfcHRyc1sxXSA9IHVwc2FtcGxlLT5zcGFyZV9yb3c7CisgICAgICB1cHNhbXBsZS0+c3BhcmVfZnVsbCA9IFRSVUU7CisgICAgfQorICAgIC8qIE5vdyBkbyB0aGUgdXBzYW1wbGluZy4gKi8KKyAgICAoKnVwc2FtcGxlLT51cG1ldGhvZCkgKGNpbmZvLCBpbnB1dF9idWYsICppbl9yb3dfZ3JvdXBfY3RyLCB3b3JrX3B0cnMpOworICB9CisKKyAgLyogQWRqdXN0IGNvdW50cyAqLworICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7CisgIHVwc2FtcGxlLT5yb3dzX3RvX2dvIC09IG51bV9yb3dzOworICAvKiBXaGVuIHRoZSBidWZmZXIgaXMgZW1wdGllZCwgZGVjbGFyZSB0aGlzIGlucHV0IHJvdyBncm91cCBjb25zdW1lZCAqLworICBpZiAoISB1cHNhbXBsZS0+c3BhcmVfZnVsbCkKKyAgICAoKmluX3Jvd19ncm91cF9jdHIpKys7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCittZXJnZWRfMXZfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQorLyogMToxIHZlcnRpY2FsIHNhbXBsaW5nIGNhc2U6IG11Y2ggZWFzaWVyLCBuZXZlciBuZWVkIGEgc3BhcmUgcm93LiAqLworeworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisKKyAgLyogSnVzdCBkbyB0aGUgdXBzYW1wbGluZy4gKi8KKyAgKCp1cHNhbXBsZS0+dXBtZXRob2QpIChjaW5mbywgaW5wdXRfYnVmLCAqaW5fcm93X2dyb3VwX2N0ciwKKwkJCSBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyKTsKKyAgLyogQWRqdXN0IGNvdW50cyAqLworICAoKm91dF9yb3dfY3RyKSsrOworICAoKmluX3Jvd19ncm91cF9jdHIpKys7Cit9CisKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcm91dGluZXMgaW52b2tlZCBieSB0aGUgY29udHJvbCByb3V0aW5lcyB0byBkbworICogdGhlIGFjdHVhbCB1cHNhbXBsaW5nL2NvbnZlcnNpb24uICBPbmUgcm93IGdyb3VwIGlzIHByb2Nlc3NlZCBwZXIgY2FsbC4KKyAqCisgKiBOb3RlOiBzaW5jZSB3ZSBtYXkgYmUgd3JpdGluZyBkaXJlY3RseSBpbnRvIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGJ1ZmZlcnMsCisgKiB3ZSBoYXZlIHRvIGJlIGhvbmVzdCBhYm91dCB0aGUgb3V0cHV0IHdpZHRoOyB3ZSBjYW4ndCBhc3N1bWUgdGhlIGJ1ZmZlcgorICogaGFzIGJlZW4gcm91bmRlZCB1cCB0byBhbiBldmVuIHdpZHRoLgorICovCisKKworLyoKKyAqIFVwc2FtcGxlIGFuZCBjb2xvciBjb252ZXJ0IGZvciB0aGUgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2MV9tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCisJCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKKyAgaW50IGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICBKRElNRU5TSU9OIGNvbDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7CisgIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKKyAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7CisgIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOworICBTSElGVF9URU1QUworCisgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07CisgIG91dHB0ciA9IG91dHB1dF9idWZbMF07CisgIC8qIExvb3AgZm9yIGVhY2ggcGFpciBvZiBvdXRwdXQgcGl4ZWxzICovCisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aCA+PiAxOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIC8qIERvIHRoZSBjaHJvbWEgcGFydCBvZiB0aGUgY2FsY3VsYXRpb24gKi8KKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgLyogRmV0Y2ggMiBZIHZhbHVlcyBhbmQgZW1pdCAyIHBpeGVscyAqLworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOworICB9CisgIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCisgIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgeworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKTsKKyAgICBvdXRwdHJbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cltSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgfQorfQorCisKKy8qCisgKiBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjJfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgcmVnaXN0ZXIgaW50IHksIGNyZWQsIGNncmVlbiwgY2JsdWU7CisgIGludCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjE7CisgIEpTQU1QUk9XIGlucHRyMDAsIGlucHRyMDEsIGlucHRyMSwgaW5wdHIyOworICBKRElNRU5TSU9OIGNvbDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7CisgIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKKyAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7CisgIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOworICBTSElGVF9URU1QUworCisgIGlucHRyMDAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyXTsKKyAgaW5wdHIwMSA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjIgKyAxXTsKKyAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07CisgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdOworICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXTsKKyAgLyogTG9vcCBmb3IgZWFjaCBncm91cCBvZiBvdXRwdXQgcGl4ZWxzICovCisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aCA+PiAxOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIC8qIERvIHRoZSBjaHJvbWEgcGFydCBvZiB0aGUgY2FsY3VsYXRpb24gKi8KKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgLyogRmV0Y2ggNCBZIHZhbHVlcyBhbmQgZW1pdCA0IHBpeGVscyAqLworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKKyAgICBvdXRwdHIwW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMFtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMFtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIwICs9IFJHQl9QSVhFTFNJWkU7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOworICAgIG91dHB0cjBbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHIwW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIG91dHB0cjAgKz0gUkdCX1BJWEVMU0laRTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7CisgICAgb3V0cHRyMVtSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cjFbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cjFbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgb3V0cHRyMSArPSBSR0JfUElYRUxTSVpFOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKKyAgICBvdXRwdHIxW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMVtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIxICs9IFJHQl9QSVhFTFNJWkU7CisgIH0KKyAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KKyAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7CisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKTsKKyAgICBvdXRwdHIwW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMFtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMFtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDEpOworICAgIG91dHB0cjFbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHIxW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHIxW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICB9Cit9CisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBtZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uLgorICoKKyAqIE5COiB0aGlzIGlzIGNhbGxlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXRlcm1pbmVkIGJ5IHVzZV9tZXJnZWRfdXBzYW1wbGUoKQorICogaW4gamRtYXN0ZXIuYy4gIFRoYXQgcm91dGluZSBNVVNUIGNvcnJlc3BvbmQgdG8gdGhlIGFjdHVhbCBjYXBhYmlsaXRpZXMKKyAqIG9mIHRoaXMgbW9kdWxlOyBubyBzYWZldHkgY2hlY2tzIGFyZSBtYWRlIGhlcmUuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9tZXJnZWRfdXBzYW1wbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGU7CisKKyAgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X3Vwc2FtcGxlcikpOworICBjaW5mby0+dXBzYW1wbGUgPSAoc3RydWN0IGpwZWdfdXBzYW1wbGVyICopIHVwc2FtcGxlOworICB1cHNhbXBsZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX21lcmdlZF91cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IEZBTFNFOworCisgIHVwc2FtcGxlLT5vdXRfcm93X3dpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKworICBpZiAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID09IDIpIHsKKyAgICB1cHNhbXBsZS0+cHViLnVwc2FtcGxlID0gbWVyZ2VkXzJ2X3Vwc2FtcGxlOworICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjJfbWVyZ2VkX3Vwc2FtcGxlOworICAgIC8qIEFsbG9jYXRlIGEgc3BhcmUgcm93IGJ1ZmZlciAqLworICAgIHVwc2FtcGxlLT5zcGFyZV9yb3cgPSAoSlNBTVBST1cpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkoc2l6ZV90KSAodXBzYW1wbGUtPm91dF9yb3dfd2lkdGggKiBTSVpFT0YoSlNBTVBMRSkpKTsKKyAgfSBlbHNlIHsKKyAgICB1cHNhbXBsZS0+cHViLnVwc2FtcGxlID0gbWVyZ2VkXzF2X3Vwc2FtcGxlOworICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjFfbWVyZ2VkX3Vwc2FtcGxlOworICAgIC8qIE5vIHNwYXJlIHJvdyBuZWVkZWQgKi8KKyAgICB1cHNhbXBsZS0+c3BhcmVfcm93ID0gTlVMTDsKKyAgfQorCisgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOworfQorCisjZW5kaWYgLyogVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pkcGh1ZmYuYyBiL2NvbW1vbi9qcGVnL2pkcGh1ZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY3ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamRwaHVmZi5jCkBAIC0wLDAgKzEsNjY4IEBACisvKgorICogamRwaHVmZi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzIGZvciBwcm9ncmVzc2l2ZSBKUEVHLgorICoKKyAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIGlucHV0IHN1c3BlbnNpb24uCisgKiBJZiB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGJhY2sKKyAqIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlIHZhcmlhYmxlcworICogaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZSBwZXJtYW5lbnQKKyAqIHN0b3JhZ2Ugb25seSB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhbiBNQ1UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpkaHVmZi5jICovCisKKworI2lmZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisKKy8qCisgKiBFeHBhbmRlZCBlbnRyb3B5IGRlY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGRlY29kaW5nLgorICoKKyAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKKyAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJCS8qIHJlbWFpbmluZyBFT0JzIGluIEVPQlJVTiAqLworICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOwkvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCit9IHNhdmFibGVfc3RhdGU7CisKKy8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KKyAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQorICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgorICovCisKKyNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgorI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCisjZWxzZQorI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAorCSgoZGVzdCkuRU9CUlVOID0gKHNyYykuRU9CUlVOLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQorI2VuZGlmCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIGxvYWRlZCBpbnRvIGxvY2FsIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBlYWNoIE1DVS4KKyAgICogSW4gY2FzZSBvZiBzdXNwZW5zaW9uLCB3ZSBleGl0IFdJVEhPVVQgdXBkYXRpbmcgdGhlbS4KKyAgICovCisgIGJpdHJlYWRfcGVybV9zdGF0ZSBiaXRzdGF0ZTsJLyogQml0IGJ1ZmZlciBhdCBzdGFydCBvZiBNQ1UgKi8KKyAgc2F2YWJsZV9zdGF0ZSBzYXZlZDsJCS8qIE90aGVyIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworCisgIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCisgIGRfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyAgZF9kZXJpdmVkX3RibCAqIGFjX2Rlcml2ZWRfdGJsOyAvKiBhY3RpdmUgdGFibGUgZHVyaW5nIGFuIEFDIHNjYW4gKi8KK30gcGh1ZmZfZW50cm9weV9kZWNvZGVyOworCit0eXBlZGVmIHBodWZmX2VudHJvcHlfZGVjb2RlciAqIHBodWZmX2VudHJvcHlfcHRyOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfRENfZmlyc3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfRENfcmVmaW5lIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CitNRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9BQ19yZWZpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfcGh1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGJvb2xlYW4gaXNfRENfYmFuZCwgYmFkOworICBpbnQgY2ksIGNvZWZpLCB0Ymw7CisgIGludCAqY29lZl9iaXRfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKworICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKKworICAvKiBWYWxpZGF0ZSBzY2FuIHBhcmFtZXRlcnMgKi8KKyAgYmFkID0gRkFMU0U7CisgIGlmIChpc19EQ19iYW5kKSB7CisgICAgaWYgKGNpbmZvLT5TZSAhPSAwKQorICAgICAgYmFkID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBuZWVkIG5vdCBjaGVjayBTcy9TZSA8IDAgc2luY2UgdGhleSBjYW1lIGZyb20gdW5zaWduZWQgYnl0ZXMgKi8KKyAgICBpZiAoY2luZm8tPlNzID4gY2luZm8tPlNlIHx8IGNpbmZvLT5TZSA+PSBEQ1RTSVpFMikKKyAgICAgIGJhZCA9IFRSVUU7CisgICAgLyogQUMgc2NhbnMgbWF5IGhhdmUgb25seSBvbmUgY29tcG9uZW50ICovCisgICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuICE9IDEpCisgICAgICBiYWQgPSBUUlVFOworICB9CisgIGlmIChjaW5mby0+QWggIT0gMCkgeworICAgIC8qIFN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW46IG11c3QgaGF2ZSBBbCA9IEFoLTEuICovCisgICAgaWYgKGNpbmZvLT5BbCAhPSBjaW5mby0+QWgtMSkKKyAgICAgIGJhZCA9IFRSVUU7CisgIH0KKyAgaWYgKGNpbmZvLT5BbCA+IDEzKQkJLyogbmVlZCBub3QgY2hlY2sgZm9yIDwgMCAqLworICAgIGJhZCA9IFRSVUU7CisgIC8qIEFyZ3VhYmx5IHRoZSBtYXhpbXVtIEFsIHZhbHVlIHNob3VsZCBiZSBsZXNzIHRoYW4gMTMgZm9yIDgtYml0IHByZWNpc2lvbiwKKyAgICogYnV0IHRoZSBzcGVjIGRvZXNuJ3Qgc2F5IHNvLCBhbmQgd2UgdHJ5IHRvIGJlIGxpYmVyYWwgYWJvdXQgd2hhdCB3ZQorICAgKiBhY2NlcHQuICBOb3RlOiBsYXJnZSBBbCB2YWx1ZXMgY291bGQgcmVzdWx0IGluIG91dC1vZi1yYW5nZSBEQworICAgKiBjb2VmZmljaWVudHMgZHVyaW5nIGVhcmx5IHNjYW5zLCBsZWFkaW5nIHRvIGJpemFycmUgZGlzcGxheXMgZHVlIHRvCisgICAqIG92ZXJmbG93cyBpbiB0aGUgSURDVCBtYXRoLiAgQnV0IHdlIHdvbid0IGNyYXNoLgorICAgKi8KKyAgaWYgKGJhZCkKKyAgICBFUlJFWElUNChjaW5mbywgSkVSUl9CQURfUFJPR1JFU1NJT04sCisJICAgICBjaW5mby0+U3MsIGNpbmZvLT5TZSwgY2luZm8tPkFoLCBjaW5mby0+QWwpOworICAvKiBVcGRhdGUgcHJvZ3Jlc3Npb24gc3RhdHVzLCBhbmQgdmVyaWZ5IHRoYXQgc2NhbiBvcmRlciBpcyBsZWdhbC4KKyAgICogTm90ZSB0aGF0IGludGVyLXNjYW4gaW5jb25zaXN0ZW5jaWVzIGFyZSB0cmVhdGVkIGFzIHdhcm5pbmdzCisgICAqIG5vdCBmYXRhbCBlcnJvcnMgLi4uIG5vdCBjbGVhciBpZiB0aGlzIGlzIHJpZ2h0IHdheSB0byBiZWhhdmUuCisgICAqLworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGludCBjaW5kZXggPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0tPmNvbXBvbmVudF9pbmRleDsKKyAgICBjb2VmX2JpdF9wdHIgPSAmIGNpbmZvLT5jb2VmX2JpdHNbY2luZGV4XVswXTsKKyAgICBpZiAoIWlzX0RDX2JhbmQgJiYgY29lZl9iaXRfcHRyWzBdIDwgMCkgLyogQUMgd2l0aG91dCBwcmlvciBEQyBzY2FuICovCisgICAgICBXQVJOTVMyKGNpbmZvLCBKV1JOX0JPR1VTX1BST0dSRVNTSU9OLCBjaW5kZXgsIDApOworICAgIGZvciAoY29lZmkgPSBjaW5mby0+U3M7IGNvZWZpIDw9IGNpbmZvLT5TZTsgY29lZmkrKykgeworICAgICAgaW50IGV4cGVjdGVkID0gKGNvZWZfYml0X3B0cltjb2VmaV0gPCAwKSA/IDAgOiBjb2VmX2JpdF9wdHJbY29lZmldOworICAgICAgaWYgKGNpbmZvLT5BaCAhPSBleHBlY3RlZCkKKwlXQVJOTVMyKGNpbmZvLCBKV1JOX0JPR1VTX1BST0dSRVNTSU9OLCBjaW5kZXgsIGNvZWZpKTsKKyAgICAgIGNvZWZfYml0X3B0cltjb2VmaV0gPSBjaW5mby0+QWw7CisgICAgfQorICB9CisKKyAgLyogU2VsZWN0IE1DVSBkZWNvZGluZyByb3V0aW5lICovCisgIGlmIChjaW5mby0+QWggPT0gMCkgeworICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0RDX2ZpcnN0OworICAgIGVsc2UKKyAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9BQ19maXJzdDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfRENfYmFuZCkKKyAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9EQ19yZWZpbmU7CisgICAgZWxzZQorICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0FDX3JlZmluZTsKKyAgfQorCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICAvKiBNYWtlIHN1cmUgcmVxdWVzdGVkIHRhYmxlcyBhcmUgcHJlc2VudCwgYW5kIGNvbXB1dGUgZGVyaXZlZCB0YWJsZXMuCisgICAgICogV2UgbWF5IGJ1aWxkIHNhbWUgZGVyaXZlZCB0YWJsZSBtb3JlIHRoYW4gb25jZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZS4KKyAgICAgKi8KKyAgICBpZiAoaXNfRENfYmFuZCkgeworICAgICAgaWYgKGNpbmZvLT5BaCA9PSAwKSB7CS8qIERDIHJlZmluZW1lbnQgbmVlZHMgbm8gdGFibGUgKi8KKwl0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87CisJanBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIHRibCwKKwkJCQkmIGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOworICAgICAganBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCB0YmwsCisJCQkgICAgICAmIGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdKTsKKyAgICAgIC8qIHJlbWVtYmVyIHRoZSBzaW5nbGUgYWN0aXZlIHRhYmxlICovCisgICAgICBlbnRyb3B5LT5hY19kZXJpdmVkX3RibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdOworICAgIH0KKyAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLworICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOworICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KKyAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7CisKKyAgLyogSW5pdGlhbGl6ZSBwcml2YXRlIHN0YXRlIHZhcmlhYmxlcyAqLworICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSAwOworCisgIC8qIEluaXRpYWxpemUgcmVzdGFydCBjb3VudGVyICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Cit9CisKKworLyoKKyAqIEZpZ3VyZSBGLjEyOiBleHRlbmQgc2lnbiBiaXQuCisgKiBPbiBzb21lIG1hY2hpbmVzLCBhIHNoaWZ0IGFuZCBhZGQgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhIHRhYmxlIGxvb2t1cC4KKyAqLworCisjaWZkZWYgQVZPSURfVEFCTEVTCisKKyNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8ICgxPDwoKHMpLTEpKSA/ICh4KSArICgoKC0xKTw8KHMpKSArIDEpIDogKHgpKQorCisjZWxzZQorCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCBleHRlbmRfdGVzdFtzXSA/ICh4KSArIGV4dGVuZF9vZmZzZXRbc10gOiAoeCkpCisKK3N0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX3Rlc3RbMTZdID0gICAvKiBlbnRyeSBuIGlzIDIqKihuLTEpICovCisgIHsgMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCisgICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwIH07CisKK3N0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX29mZnNldFsxNl0gPSAvKiBlbnRyeSBuIGlzICgtMSA8PCBuKSArIDEgKi8KKyAgeyAwLCAoKC0xKTw8MSkgKyAxLCAoKC0xKTw8MikgKyAxLCAoKC0xKTw8MykgKyAxLCAoKC0xKTw8NCkgKyAxLAorICAgICgoLTEpPDw1KSArIDEsICgoLTEpPDw2KSArIDEsICgoLTEpPDw3KSArIDEsICgoLTEpPDw4KSArIDEsCisgICAgKCgtMSk8PDkpICsgMSwgKCgtMSk8PDEwKSArIDEsICgoLTEpPDwxMSkgKyAxLCAoKC0xKTw8MTIpICsgMSwKKyAgICAoKC0xKTw8MTMpICsgMSwgKCgtMSk8PDE0KSArIDEsICgoLTEpPDwxNSkgKyAxIH07CisKKyNlbmRpZiAvKiBBVk9JRF9UQUJMRVMgKi8KKworCisvKgorICogQ2hlY2sgZm9yIGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIGRlY29kZXIuCisgKiBSZXR1cm5zIEZBTFNFIGlmIG11c3Qgc3VzcGVuZC4KKyAqLworCitMT0NBTChib29sZWFuKQorcHJvY2Vzc19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IGNpOworCisgIC8qIFRocm93IGF3YXkgYW55IHVudXNlZCBiaXRzIHJlbWFpbmluZyBpbiBiaXQgYnVmZmVyOyAqLworICAvKiBpbmNsdWRlIGFueSBmdWxsIGJ5dGVzIGluIG5leHRfbWFya2VyJ3MgY291bnQgb2YgZGlzY2FyZGVkIGJ5dGVzICovCisgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyArPSBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgLyA4OworICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOworCisgIC8qIEFkdmFuY2UgcGFzdCB0aGUgUlNUbiBtYXJrZXIgKi8KKyAgaWYgKCEgKCpjaW5mby0+bWFya2VyLT5yZWFkX3Jlc3RhcnRfbWFya2VyKSAoY2luZm8pKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKKyAgLyogUmUtaW5pdCBFT0IgcnVuIGNvdW50LCB0b28gKi8KKyAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gMDsKKworICAvKiBSZXNldCByZXN0YXJ0IGNvdW50ZXIgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKworICAvKiBSZXNldCBvdXQtb2YtZGF0YSBmbGFnLCB1bmxlc3MgcmVhZF9yZXN0YXJ0X21hcmtlciBsZWZ0IHVzIHNtYWNrIHVwCisgICAqIGFnYWluc3QgYSBtYXJrZXIuICBJbiB0aGF0IGNhc2Ugd2Ugd2lsbCBlbmQgdXAgdHJlYXRpbmcgdGhlIG5leHQgZGF0YQorICAgKiBzZWdtZW50IGFzIGVtcHR5LCBhbmQgd2UgY2FuIGF2b2lkIHByb2R1Y2luZyBib2d1cyBvdXRwdXQgcGl4ZWxzIGJ5CisgICAqIGxlYXZpbmcgdGhlIGZsYWcgc2V0LgorICAgKi8KKyAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApCisgICAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIEh1ZmZtYW4gTUNVIGRlY29kaW5nLgorICogRWFjaCBvZiB0aGVzZSByb3V0aW5lcyBkZWNvZGVzIGFuZCByZXR1cm5zIG9uZSBNQ1UncyB3b3J0aCBvZgorICogSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4gCisgKiBUaGUgY29lZmZpY2llbnRzIGFyZSByZW9yZGVyZWQgZnJvbSB6aWd6YWcgb3JkZXIgaW50byBuYXR1cmFsIGFycmF5IG9yZGVyLAorICogYnV0IGFyZSBub3QgZGVxdWFudGl6ZWQuCisgKgorICogVGhlIGkndGggYmxvY2sgb2YgdGhlIE1DVSBpcyBzdG9yZWQgaW50byB0aGUgYmxvY2sgcG9pbnRlZCB0byBieQorICogTUNVX2RhdGFbaV0uICBXRSBBU1NVTUUgVEhJUyBBUkVBIElTIElOSVRJQUxMWSBaRVJPRUQgQlkgVEhFIENBTExFUi4KKyAqCisgKiBXZSByZXR1cm4gRkFMU0UgaWYgZGF0YSBzb3VyY2UgcmVxdWVzdGVkIHN1c3BlbnNpb24uICBJbiB0aGF0IGNhc2Ugbm8KKyAqIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcGVybWFuZW50IHN0YXRlLiAgKEV4Y2VwdGlvbjogc29tZSBvdXRwdXQKKyAqIGNvZWZmaWNpZW50cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYXNzaWduZWQuICBUaGlzIGlzIGhhcm1sZXNzIGZvcgorICogc3BlY3RyYWwgc2VsZWN0aW9uLCBzaW5jZSB3ZSdsbCBqdXN0IHJlLWFzc2lnbiB0aGVtIG9uIHRoZSBuZXh0IGNhbGwuCisgKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gQUMgcmVmaW5lbWVudCBoYXMgdG8gYmUgbW9yZSBjYXJlZnVsLCBob3dldmVyLikKKyAqLworCisvKgorICogTUNVIGRlY29kaW5nIGZvciBEQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCisgKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitkZWNvZGVfbWN1X0RDX2ZpcnN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICByZWdpc3RlciBpbnQgcywgcjsKKyAgaW50IGJsa24sIGNpOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEJJVFJFQURfU1RBVEVfVkFSUzsKKyAgc2F2YWJsZV9zdGF0ZSBzdGF0ZTsKKyAgZF9kZXJpdmVkX3RibCAqIHRibDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCisgICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEFTU0lHTl9TVEFURShzdGF0ZSwgZW50cm9weS0+c2F2ZWQpOworCisgICAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLworCisgICAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07CisgICAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICB0YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbY29tcHB0ci0+ZGNfdGJsX25vXTsKKworICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCisKKyAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCisgICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMSk7CisgICAgICBpZiAocykgeworCUNIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7CisJciA9IEdFVF9CSVRTKHMpOworCXMgPSBIVUZGX0VYVEVORChyLCBzKTsKKyAgICAgIH0KKworICAgICAgLyogQ29udmVydCBEQyBkaWZmZXJlbmNlIHRvIGFjdHVhbCB2YWx1ZSwgdXBkYXRlIGxhc3RfZGNfdmFsICovCisgICAgICBzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKKyAgICAgIHN0YXRlLmxhc3RfZGNfdmFsW2NpXSA9IHM7CisgICAgICAvKiBTY2FsZSBhbmQgb3V0cHV0IHRoZSBjb2VmZmljaWVudCAoYXNzdW1lcyBqcGVnX25hdHVyYWxfb3JkZXJbMF09MCkgKi8KKyAgICAgICgqYmxvY2spWzBdID0gKEpDT0VGKSAocyA8PCBBbCk7CisgICAgfQorCisgICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlKTsKKyAgfQorCisgIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGRlY29kaW5nIGZvciBBQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCisgKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitkZWNvZGVfbWN1X0FDX2ZpcnN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIHJlZ2lzdGVyIGludCBzLCBrLCByOworICB1bnNpZ25lZCBpbnQgRU9CUlVOOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEJJVFJFQURfU1RBVEVfVkFSUzsKKyAgZF9kZXJpdmVkX3RibCAqIHRibDsKKworICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCisJcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogSWYgd2UndmUgcnVuIG91dCBvZiBkYXRhLCBqdXN0IGxlYXZlIHRoZSBNQ1Ugc2V0IHRvIHplcm9lcy4KKyAgICogVGhpcyB3YXksIHdlIHJldHVybiB1bmlmb3JtIGdyYXkgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHNlZ21lbnQuCisgICAqLworICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKKworICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZS4KKyAgICAgKiBXZSBjYW4gYXZvaWQgbG9hZGluZy9zYXZpbmcgYml0cmVhZCBzdGF0ZSBpZiBpbiBhbiBFT0IgcnVuLgorICAgICAqLworICAgIEVPQlJVTiA9IGVudHJvcHktPnNhdmVkLkVPQlJVTjsJLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KKworICAgIC8qIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBibG9jayBwZXIgTUNVICovCisKKyAgICBpZiAoRU9CUlVOID4gMCkJCS8qIGlmIGl0J3MgYSBiYW5kIG9mIHplcm9lcy4uLiAqLworICAgICAgRU9CUlVOLS07CQkJLyogLi4ucHJvY2VzcyBpdCBub3cgKHdlIGRvIG5vdGhpbmcpICovCisgICAgZWxzZSB7CisgICAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgICAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKyAgICAgIHRibCA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsOworCisgICAgICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworCUhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwyKTsKKwlyID0gcyA+PiA0OworCXMgJj0gMTU7CisJaWYgKHMpIHsKKwkgIGsgKz0gcjsKKwkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7CisJICByID0gR0VUX0JJVFMocyk7CisJICBzID0gSFVGRl9FWFRFTkQociwgcyk7CisJICAvKiBTY2FsZSBhbmQgb3V0cHV0IGNvZWZmaWNpZW50IGluIG5hdHVyYWwgKGRlemlnemFnZ2VkKSBvcmRlciAqLworCSAgKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSA9IChKQ09FRikgKHMgPDwgQWwpOworCX0gZWxzZSB7CisJICBpZiAociA9PSAxNSkgewkvKiBaUkwgKi8KKwkgICAgayArPSAxNTsJCS8qIHNraXAgMTUgemVyb2VzIGluIGJhbmQgKi8KKwkgIH0gZWxzZSB7CQkvKiBFT0JyLCBydW4gbGVuZ3RoIGlzIDJeciArIGFwcGVuZGVkIGJpdHMgKi8KKwkgICAgRU9CUlVOID0gMSA8PCByOworCSAgICBpZiAocikgewkJLyogRU9CciwgciA+IDAgKi8KKwkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCByLCByZXR1cm4gRkFMU0UpOworCSAgICAgIHIgPSBHRVRfQklUUyhyKTsKKwkgICAgICBFT0JSVU4gKz0gcjsKKwkgICAgfQorCSAgICBFT0JSVU4tLTsJCS8qIHRoaXMgYmFuZCBpcyBwcm9jZXNzZWQgYXQgdGhpcyBtb21lbnQgKi8KKwkgICAgYnJlYWs7CQkvKiBmb3JjZSBlbmQtb2YtYmFuZCAqLworCSAgfQorCX0KKyAgICAgIH0KKworICAgICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICB9CisKKyAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KKyAgICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSBFT0JSVU47CS8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCisgIH0KKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgREMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KKyAqIE5vdGU6IHdlIGFzc3VtZSBzdWNoIHNjYW5zIGNhbiBiZSBtdWx0aS1jb21wb25lbnQsIGFsdGhvdWdoIHRoZSBzcGVjCisgKiBpcyBub3QgdmVyeSBjbGVhciBvbiB0aGUgcG9pbnQuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitkZWNvZGVfbWN1X0RDX3JlZmluZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sgICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBwMSA9IDEgPDwgY2luZm8tPkFsOwkvKiAxIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KKyAgaW50IGJsa247CisgIEpCTE9DS1JPVyBibG9jazsKKyAgQklUUkVBRF9TVEFURV9WQVJTOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBOb3Qgd29ydGggdGhlIGN5Y2xlcyB0byBjaGVjayBpbnN1ZmZpY2llbnRfZGF0YSBoZXJlLAorICAgKiBzaW5jZSB3ZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIGRhdGEgYW55d2F5IGlmIHdlIHJlYWQgemVyb2VzLgorICAgKi8KKworICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKworICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCisKKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworCisgICAgLyogRW5jb2RlZCBkYXRhIGlzIHNpbXBseSB0aGUgbmV4dCBiaXQgb2YgdGhlIHR3bydzLWNvbXBsZW1lbnQgREMgdmFsdWUgKi8KKyAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCByZXR1cm4gRkFMU0UpOworICAgIGlmIChHRVRfQklUUygxKSkKKyAgICAgICgqYmxvY2spWzBdIHw9IHAxOworICAgIC8qIE5vdGU6IHNpbmNlIHdlIHVzZSB8PSwgcmVwZWF0aW5nIHRoZSBhc3NpZ25tZW50IGxhdGVyIGlzIHNhZmUgKi8KKyAgfQorCisgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworCisgIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGRlY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9BQ19yZWZpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7ICAgCisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgU2UgPSBjaW5mby0+U2U7CisgIGludCBwMSA9IDEgPDwgY2luZm8tPkFsOwkvKiAxIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KKyAgaW50IG0xID0gKC0xKSA8PCBjaW5mby0+QWw7CS8qIC0xIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KKyAgcmVnaXN0ZXIgaW50IHMsIGssIHI7CisgIHVuc2lnbmVkIGludCBFT0JSVU47CisgIEpCTE9DS1JPVyBibG9jazsKKyAgSkNPRUZQVFIgdGhpc2NvZWY7CisgIEJJVFJFQURfU1RBVEVfVkFSUzsKKyAgZF9kZXJpdmVkX3RibCAqIHRibDsKKyAgaW50IG51bV9uZXduejsKKyAgaW50IG5ld256X3Bvc1tEQ1RTSVpFMl07CisKKyAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwgZG9uJ3QgbW9kaWZ5IHRoZSBNQ1UuCisgICAqLworICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKKworICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLworICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgRU9CUlVOID0gZW50cm9weS0+c2F2ZWQuRU9CUlVOOyAvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworCisgICAgLyogVGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIGJsb2NrIHBlciBNQ1UgKi8KKyAgICBibG9jayA9IE1DVV9kYXRhWzBdOworICAgIHRibCA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsOworCisgICAgLyogSWYgd2UgYXJlIGZvcmNlZCB0byBzdXNwZW5kLCB3ZSBtdXN0IHVuZG8gdGhlIGFzc2lnbm1lbnRzIHRvIGFueSBuZXdseQorICAgICAqIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoZSBibG9jaywgYmVjYXVzZSBvdGhlcndpc2Ugd2UnZCBnZXQgY29uZnVzZWQKKyAgICAgKiBuZXh0IHRpbWUgYWJvdXQgd2hpY2ggY29lZmZpY2llbnRzIHdlcmUgYWxyZWFkeSBub256ZXJvLgorICAgICAqIEJ1dCB3ZSBuZWVkIG5vdCB1bmRvIGFkZGl0aW9uIG9mIGJpdHMgdG8gYWxyZWFkeS1ub256ZXJvIGNvZWZmaWNpZW50czsKKyAgICAgKiBpbnN0ZWFkLCB3ZSBjYW4gdGVzdCB0aGUgY3VycmVudCBiaXQgdG8gc2VlIGlmIHdlIGFscmVhZHkgZGlkIGl0LgorICAgICAqLworICAgIG51bV9uZXdueiA9IDA7CisKKyAgICAvKiBpbml0aWFsaXplIGNvZWZmaWNpZW50IGxvb3AgY291bnRlciB0byBzdGFydCBvZiBiYW5kICovCisgICAgayA9IGNpbmZvLT5TczsKKworICAgIGlmIChFT0JSVU4gPT0gMCkgeworICAgICAgZm9yICg7IGsgPD0gU2U7IGsrKykgeworCUhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIGdvdG8gdW5kb2l0LCBsYWJlbDMpOworCXIgPSBzID4+IDQ7CisJcyAmPSAxNTsKKwlpZiAocykgeworCSAgaWYgKHMgIT0gMSkJCS8qIHNpemUgb2YgbmV3IGNvZWYgc2hvdWxkIGFsd2F5cyBiZSAxICovCisJICAgIFdBUk5NUyhjaW5mbywgSldSTl9IVUZGX0JBRF9DT0RFKTsKKwkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKKwkgIGlmIChHRVRfQklUUygxKSkKKwkgICAgcyA9IHAxOwkJLyogbmV3bHkgbm9uemVybyBjb2VmIGlzIHBvc2l0aXZlICovCisJICBlbHNlCisJICAgIHMgPSBtMTsJCS8qIG5ld2x5IG5vbnplcm8gY29lZiBpcyBuZWdhdGl2ZSAqLworCX0gZWxzZSB7CisJICBpZiAociAhPSAxNSkgeworCSAgICBFT0JSVU4gPSAxIDw8IHI7CS8qIEVPQnIsIHJ1biBsZW5ndGggaXMgMl5yICsgYXBwZW5kZWQgYml0cyAqLworCSAgICBpZiAocikgeworCSAgICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHIsIGdvdG8gdW5kb2l0KTsKKwkgICAgICByID0gR0VUX0JJVFMocik7CisJICAgICAgRU9CUlVOICs9IHI7CisJICAgIH0KKwkgICAgYnJlYWs7CQkvKiByZXN0IG9mIGJsb2NrIGlzIGhhbmRsZWQgYnkgRU9CIGxvZ2ljICovCisJICB9CisJICAvKiBub3RlIHMgPSAwIGZvciBwcm9jZXNzaW5nIFpSTCAqLworCX0KKwkvKiBBZHZhbmNlIG92ZXIgYWxyZWFkeS1ub256ZXJvIGNvZWZzIGFuZCByIHN0aWxsLXplcm8gY29lZnMsCisJICogYXBwZW5kaW5nIGNvcnJlY3Rpb24gYml0cyB0byB0aGUgbm9uemVyb2VzLiAgQSBjb3JyZWN0aW9uIGJpdCBpcyAxCisJICogaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjb2VmZmljaWVudCBtdXN0IGJlIGluY3JlYXNlZC4KKwkgKi8KKwlkbyB7CisJICB0aGlzY29lZiA9ICpibG9jayArIGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKKwkgIGlmICgqdGhpc2NvZWYgIT0gMCkgeworCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7CisJICAgIGlmIChHRVRfQklUUygxKSkgeworCSAgICAgIGlmICgoKnRoaXNjb2VmICYgcDEpID09IDApIHsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IHNldCBpdCAqLworCQlpZiAoKnRoaXNjb2VmID49IDApCisJCSAgKnRoaXNjb2VmICs9IHAxOworCQllbHNlCisJCSAgKnRoaXNjb2VmICs9IG0xOworCSAgICAgIH0KKwkgICAgfQorCSAgfSBlbHNlIHsKKwkgICAgaWYgKC0tciA8IDApCisJICAgICAgYnJlYWs7CQkvKiByZWFjaGVkIHRhcmdldCB6ZXJvIGNvZWZmaWNpZW50ICovCisJICB9CisJICBrKys7CisJfSB3aGlsZSAoayA8PSBTZSk7CisJaWYgKHMpIHsKKwkgIGludCBwb3MgPSBqcGVnX25hdHVyYWxfb3JkZXJba107CisJICAvKiBPdXRwdXQgbmV3bHkgbm9uemVybyBjb2VmZmljaWVudCAqLworCSAgKCpibG9jaylbcG9zXSA9IChKQ09FRikgczsKKwkgIC8qIFJlbWVtYmVyIGl0cyBwb3NpdGlvbiBpbiBjYXNlIHdlIGhhdmUgdG8gc3VzcGVuZCAqLworCSAgbmV3bnpfcG9zW251bV9uZXdueisrXSA9IHBvczsKKwl9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKEVPQlJVTiA+IDApIHsKKyAgICAgIC8qIFNjYW4gYW55IHJlbWFpbmluZyBjb2VmZmljaWVudCBwb3NpdGlvbnMgYWZ0ZXIgdGhlIGVuZC1vZi1iYW5kCisgICAgICAgKiAodGhlIGxhc3QgbmV3bHkgbm9uemVybyBjb2VmZmljaWVudCwgaWYgYW55KS4gIEFwcGVuZCBhIGNvcnJlY3Rpb24KKyAgICAgICAqIGJpdCB0byBlYWNoIGFscmVhZHktbm9uemVybyBjb2VmZmljaWVudC4gIEEgY29ycmVjdGlvbiBiaXQgaXMgMQorICAgICAgICogaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjb2VmZmljaWVudCBtdXN0IGJlIGluY3JlYXNlZC4KKyAgICAgICAqLworICAgICAgZm9yICg7IGsgPD0gU2U7IGsrKykgeworCXRoaXNjb2VmID0gKmJsb2NrICsganBlZ19uYXR1cmFsX29yZGVyW2tdOworCWlmICgqdGhpc2NvZWYgIT0gMCkgeworCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOworCSAgaWYgKEdFVF9CSVRTKDEpKSB7CisJICAgIGlmICgoKnRoaXNjb2VmICYgcDEpID09IDApIHsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IGNoYW5nZWQgaXQgKi8KKwkgICAgICBpZiAoKnRoaXNjb2VmID49IDApCisJCSp0aGlzY29lZiArPSBwMTsKKwkgICAgICBlbHNlCisJCSp0aGlzY29lZiArPSBtMTsKKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIC8qIENvdW50IG9uZSBibG9jayBjb21wbGV0ZWQgaW4gRU9CIHJ1biAqLworICAgICAgRU9CUlVOLS07CisgICAgfQorCisgICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSBFT0JSVU47IC8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCisgIH0KKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7CisKK3VuZG9pdDoKKyAgLyogUmUtemVybyBhbnkgb3V0cHV0IGNvZWZmaWNpZW50cyB0aGF0IHdlIG1hZGUgbmV3bHkgbm9uemVybyAqLworICB3aGlsZSAobnVtX25ld256ID4gMCkKKyAgICAoKmJsb2NrKVtuZXduel9wb3NbLS1udW1fbmV3bnpdXSA9IDA7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfcGh1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weTsKKyAgaW50ICpjb2VmX2JpdF9wdHI7CisgIGludCBjaSwgaTsKKworICBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKHBodWZmX2VudHJvcHlfZGVjb2RlcikpOworICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKikgZW50cm9weTsKKyAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3BodWZmX2RlY29kZXI7CisKKyAgLyogTWFyayBkZXJpdmVkIHRhYmxlcyB1bmFsbG9jYXRlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgZW50cm9weS0+ZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKKyAgfQorCisgIC8qIENyZWF0ZSBwcm9ncmVzc2lvbiBzdGF0dXMgdGFibGUgKi8KKyAgY2luZm8tPmNvZWZfYml0cyA9IChpbnQgKCopW0RDVFNJWkUyXSkKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCWNpbmZvLT5udW1fY29tcG9uZW50cypEQ1RTSVpFMipTSVpFT0YoaW50KSk7CisgIGNvZWZfYml0X3B0ciA9ICYgY2luZm8tPmNvZWZfYml0c1swXVswXTsKKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKKyAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykKKyAgICAgICpjb2VmX2JpdF9wdHIrKyA9IC0xOworfQorCisjZW5kaWYgLyogRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pkcG9zdGN0LmMgYi9jb21tb24vanBlZy9qZHBvc3RjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTU2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZHBvc3RjdC5jCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogamRwb3N0Y3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNvbXByZXNzaW9uIHBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCisgKiBUaGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgdXBzYW1wbGluZywgY29sb3IgY29udmVyc2lvbiwgYW5kIGNvbG9yCisgKiBxdWFudGl6YXRpb24vcmVkdWN0aW9uIHN0ZXBzOyBzcGVjaWZpY2FsbHksIGl0IGNvbnRyb2xzIHRoZSBidWZmZXJpbmcKKyAqIGJldHdlZW4gdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBhbmQgY29sb3IgcXVhbnRpemF0aW9uL3JlZHVjdGlvbi4KKyAqCisgKiBJZiBubyBjb2xvciBxdWFudGl6YXRpb24vcmVkdWN0aW9uIGlzIHJlcXVpcmVkLCB0aGVuIHRoaXMgbW9kdWxlIGhhcyBubworICogd29yayB0byBkbywgYW5kIGl0IGp1c3QgaGFuZHMgb2ZmIHRvIHRoZSB1cHNhbXBsZS9jb2xvciBjb252ZXJzaW9uIGNvZGUuCisgKiBBbiBpbnRlZ3JhdGVkIHVwc2FtcGxlL2NvbnZlcnQvcXVhbnRpemUgcHJvY2VzcyB3b3VsZCByZXBsYWNlIHRoaXMgbW9kdWxlCisgKiBlbnRpcmVseS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBDb2xvciBxdWFudGl6YXRpb24gc291cmNlIGJ1ZmZlcjogdGhpcyBob2xkcyBvdXRwdXQgZGF0YSBmcm9tCisgICAqIHRoZSB1cHNhbXBsZS9jb2xvciBjb252ZXJzaW9uIHN0ZXAgdG8gYmUgcGFzc2VkIHRvIHRoZSBxdWFudGl6ZXIuCisgICAqIEZvciB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24sIHdlIG5lZWQgYSBmdWxsLWltYWdlIGJ1ZmZlcjsKKyAgICogZm9yIG9uZS1wYXNzIG9wZXJhdGlvbiwgYSBzdHJpcCBidWZmZXIgaXMgc3VmZmljaWVudC4KKyAgICovCisgIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2U7CS8qIHZpcnR1YWwgYXJyYXksIG9yIE5VTEwgaWYgb25lLXBhc3MgKi8KKyAgSlNBTVBBUlJBWSBidWZmZXI7CQkvKiBzdHJpcCBidWZmZXIsIG9yIGN1cnJlbnQgc3RyaXAgb2YgdmlydHVhbCAqLworICBKRElNRU5TSU9OIHN0cmlwX2hlaWdodDsJLyogYnVmZmVyIHNpemUgaW4gcm93cyAqLworICAvKiBmb3IgdHdvLXBhc3MgbW9kZSBvbmx5OiAqLworICBKRElNRU5TSU9OIHN0YXJ0aW5nX3JvdzsJLyogcm93ICMgb2YgZmlyc3Qgcm93IGluIGN1cnJlbnQgc3RyaXAgKi8KKyAgSkRJTUVOU0lPTiBuZXh0X3JvdzsJCS8qIGluZGV4IG9mIG5leHQgcm93IHRvIGZpbGwvZW1wdHkgaW4gc3RyaXAgKi8KK30gbXlfcG9zdF9jb250cm9sbGVyOworCit0eXBlZGVmIG15X3Bvc3RfY29udHJvbGxlciAqIG15X3Bvc3RfcHRyOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYodm9pZCkgcG9zdF9wcm9jZXNzXzFwYXNzCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCSAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorTUVUSE9EREVGKHZvaWQpIHBvc3RfcHJvY2Vzc19wcmVwYXNzCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCSAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworTUVUSE9EREVGKHZvaWQpIHBvc3RfcHJvY2Vzc18ycGFzcworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKKyNlbmRpZgorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfZHBvc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKworICBzd2l0Y2ggKHBhc3NfbW9kZSkgeworICBjYXNlIEpCVUZfUEFTU19USFJVOgorICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7CisgICAgICAvKiBTaW5nbGUtcGFzcyBwcm9jZXNzaW5nIHdpdGggY29sb3IgcXVhbnRpemF0aW9uLiAqLworICAgICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gcG9zdF9wcm9jZXNzXzFwYXNzOworICAgICAgLyogV2UgY291bGQgYmUgZG9pbmcgYnVmZmVyZWQtaW1hZ2Ugb3V0cHV0IGJlZm9yZSBzdGFydGluZyBhIDItcGFzcworICAgICAgICogY29sb3IgcXVhbnRpemF0aW9uOyBpbiB0aGF0IGNhc2UsIGppbml0X2RfcG9zdF9jb250cm9sbGVyIGRpZCBub3QKKyAgICAgICAqIGFsbG9jYXRlIGEgc3RyaXAgYnVmZmVyLiAgVXNlIHRoZSB2aXJ0dWFsLWFycmF5IGJ1ZmZlciBhcyB3b3Jrc3BhY2UuCisgICAgICAgKi8KKyAgICAgIGlmIChwb3N0LT5idWZmZXIgPT0gTlVMTCkgeworCXBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorCSAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBwb3N0LT53aG9sZV9pbWFnZSwKKwkgICAoSkRJTUVOU0lPTikgMCwgcG9zdC0+c3RyaXBfaGVpZ2h0LCBUUlVFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogRm9yIHNpbmdsZS1wYXNzIHByb2Nlc3Npbmcgd2l0aG91dCBjb2xvciBxdWFudGl6YXRpb24sCisgICAgICAgKiBJIGhhdmUgbm8gd29yayB0byBkbzsganVzdCBjYWxsIHRoZSB1cHNhbXBsZXIgZGlyZWN0bHkuCisgICAgICAgKi8KKyAgICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IGNpbmZvLT51cHNhbXBsZS0+dXBzYW1wbGU7CisgICAgfQorICAgIGJyZWFrOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorICBjYXNlIEpCVUZfU0FWRV9BTkRfUEFTUzoKKyAgICAvKiBGaXJzdCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24gKi8KKyAgICBpZiAocG9zdC0+d2hvbGVfaW1hZ2UgPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBwb3N0X3Byb2Nlc3NfcHJlcGFzczsKKyAgICBicmVhazsKKyAgY2FzZSBKQlVGX0NSQU5LX0RFU1Q6CisgICAgLyogU2Vjb25kIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiAqLworICAgIGlmIChwb3N0LT53aG9sZV9pbWFnZSA9PSBOVUxMKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IHBvc3RfcHJvY2Vzc18ycGFzczsKKyAgICBicmVhazsKKyNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgYnJlYWs7CisgIH0KKyAgcG9zdC0+c3RhcnRpbmdfcm93ID0gcG9zdC0+bmV4dF9yb3cgPSAwOworfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgb25lLXBhc3MgKHN0cmlwIGJ1ZmZlcikgY2FzZS4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgY29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbiBhcyB3ZWxsIGFzIG9uZS1wYXNzIHF1YW50aXphdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bvc3RfcHJvY2Vzc18xcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCit7CisgIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OworICBKRElNRU5TSU9OIG51bV9yb3dzLCBtYXhfcm93czsKKworICAvKiBGaWxsIHRoZSBidWZmZXIsIGJ1dCBub3QgbW9yZSB0aGFuIHdoYXQgd2UgY2FuIGR1bXAgb3V0IGluIG9uZSBnby4gKi8KKyAgLyogTm90ZSB3ZSByZWx5IG9uIHRoZSB1cHNhbXBsZXIgdG8gZGV0ZWN0IGJvdHRvbSBvZiBpbWFnZS4gKi8KKyAgbWF4X3Jvd3MgPSBvdXRfcm93c19hdmFpbCAtICpvdXRfcm93X2N0cjsKKyAgaWYgKG1heF9yb3dzID4gcG9zdC0+c3RyaXBfaGVpZ2h0KQorICAgIG1heF9yb3dzID0gcG9zdC0+c3RyaXBfaGVpZ2h0OworICBudW1fcm93cyA9IDA7CisgICgqY2luZm8tPnVwc2FtcGxlLT51cHNhbXBsZSkgKGNpbmZvLAorCQlpbnB1dF9idWYsIGluX3Jvd19ncm91cF9jdHIsIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCXBvc3QtPmJ1ZmZlciwgJm51bV9yb3dzLCBtYXhfcm93cyk7CisgIC8qIFF1YW50aXplIGFuZCBlbWl0IGRhdGEuICovCisgICgqY2luZm8tPmNxdWFudGl6ZS0+Y29sb3JfcXVhbnRpemUpIChjaW5mbywKKwkJcG9zdC0+YnVmZmVyLCBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLCAoaW50KSBudW1fcm93cyk7CisgICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKK30KKworCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgZmlyc3QgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uLgorICovCisKK01FVEhPRERFRih2b2lkKQorcG9zdF9wcm9jZXNzX3ByZXBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCit7CisgIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OworICBKRElNRU5TSU9OIG9sZF9uZXh0X3JvdywgbnVtX3Jvd3M7CisKKyAgLyogUmVwb3NpdGlvbiB2aXJ0dWFsIGJ1ZmZlciBpZiBhdCBzdGFydCBvZiBzdHJpcC4gKi8KKyAgaWYgKHBvc3QtPm5leHRfcm93ID09IDApIHsKKyAgICBwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIHBvc3QtPndob2xlX2ltYWdlLAorCSBwb3N0LT5zdGFydGluZ19yb3csIHBvc3QtPnN0cmlwX2hlaWdodCwgVFJVRSk7CisgIH0KKworICAvKiBVcHNhbXBsZSBzb21lIGRhdGEgKHVwIHRvIGEgc3RyaXAgaGVpZ2h0J3Mgd29ydGgpLiAqLworICBvbGRfbmV4dF9yb3cgPSBwb3N0LT5uZXh0X3JvdzsKKyAgKCpjaW5mby0+dXBzYW1wbGUtPnVwc2FtcGxlKSAoY2luZm8sCisJCWlucHV0X2J1ZiwgaW5fcm93X2dyb3VwX2N0ciwgaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJcG9zdC0+YnVmZmVyLCAmcG9zdC0+bmV4dF9yb3csIHBvc3QtPnN0cmlwX2hlaWdodCk7CisKKyAgLyogQWxsb3cgcXVhbnRpemVyIHRvIHNjYW4gbmV3IGRhdGEuICBObyBkYXRhIGlzIGVtaXR0ZWQsICovCisgIC8qIGJ1dCB3ZSBhZHZhbmNlIG91dF9yb3dfY3RyIHNvIG91dGVyIGxvb3AgY2FuIHRlbGwgd2hlbiB3ZSdyZSBkb25lLiAqLworICBpZiAocG9zdC0+bmV4dF9yb3cgPiBvbGRfbmV4dF9yb3cpIHsKKyAgICBudW1fcm93cyA9IHBvc3QtPm5leHRfcm93IC0gb2xkX25leHRfcm93OworICAgICgqY2luZm8tPmNxdWFudGl6ZS0+Y29sb3JfcXVhbnRpemUpIChjaW5mbywgcG9zdC0+YnVmZmVyICsgb2xkX25leHRfcm93LAorCQkJCQkgKEpTQU1QQVJSQVkpIE5VTEwsIChpbnQpIG51bV9yb3dzKTsKKyAgICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7CisgIH0KKworICAvKiBBZHZhbmNlIGlmIHdlIGZpbGxlZCB0aGUgc3RyaXAuICovCisgIGlmIChwb3N0LT5uZXh0X3JvdyA+PSBwb3N0LT5zdHJpcF9oZWlnaHQpIHsKKyAgICBwb3N0LT5zdGFydGluZ19yb3cgKz0gcG9zdC0+c3RyaXBfaGVpZ2h0OworICAgIHBvc3QtPm5leHRfcm93ID0gMDsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2Vjb25kIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bvc3RfcHJvY2Vzc18ycGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCit7CisgIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OworICBKRElNRU5TSU9OIG51bV9yb3dzLCBtYXhfcm93czsKKworICAvKiBSZXBvc2l0aW9uIHZpcnR1YWwgYnVmZmVyIGlmIGF0IHN0YXJ0IG9mIHN0cmlwLiAqLworICBpZiAocG9zdC0+bmV4dF9yb3cgPT0gMCkgeworICAgIHBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgcG9zdC0+d2hvbGVfaW1hZ2UsCisJIHBvc3QtPnN0YXJ0aW5nX3JvdywgcG9zdC0+c3RyaXBfaGVpZ2h0LCBGQUxTRSk7CisgIH0KKworICAvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIHJvd3MgdG8gZW1pdC4gKi8KKyAgbnVtX3Jvd3MgPSBwb3N0LT5zdHJpcF9oZWlnaHQgLSBwb3N0LT5uZXh0X3JvdzsgLyogYXZhaWxhYmxlIGluIHN0cmlwICovCisgIG1heF9yb3dzID0gb3V0X3Jvd3NfYXZhaWwgLSAqb3V0X3Jvd19jdHI7IC8qIGF2YWlsYWJsZSBpbiBvdXRwdXQgYXJlYSAqLworICBpZiAobnVtX3Jvd3MgPiBtYXhfcm93cykKKyAgICBudW1fcm93cyA9IG1heF9yb3dzOworICAvKiBXZSBoYXZlIHRvIGNoZWNrIGJvdHRvbSBvZiBpbWFnZSBoZXJlLCBjYW4ndCBkZXBlbmQgb24gdXBzYW1wbGVyLiAqLworICBtYXhfcm93cyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0IC0gcG9zdC0+c3RhcnRpbmdfcm93OworICBpZiAobnVtX3Jvd3MgPiBtYXhfcm93cykKKyAgICBudW1fcm93cyA9IG1heF9yb3dzOworCisgIC8qIFF1YW50aXplIGFuZCBlbWl0IGRhdGEuICovCisgICgqY2luZm8tPmNxdWFudGl6ZS0+Y29sb3JfcXVhbnRpemUpIChjaW5mbywKKwkJcG9zdC0+YnVmZmVyICsgcG9zdC0+bmV4dF9yb3csIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsCisJCShpbnQpIG51bV9yb3dzKTsKKyAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOworCisgIC8qIEFkdmFuY2UgaWYgd2UgZmlsbGVkIHRoZSBzdHJpcC4gKi8KKyAgcG9zdC0+bmV4dF9yb3cgKz0gbnVtX3Jvd3M7CisgIGlmIChwb3N0LT5uZXh0X3JvdyA+PSBwb3N0LT5zdHJpcF9oZWlnaHQpIHsKKyAgICBwb3N0LT5zdGFydGluZ19yb3cgKz0gcG9zdC0+c3RyaXBfaGVpZ2h0OworICAgIHBvc3QtPm5leHRfcm93ID0gMDsKKyAgfQorfQorCisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgcG9zdHByb2Nlc3NpbmcgY29udHJvbGxlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2RfcG9zdF9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X3Bvc3RfcHRyIHBvc3Q7CisKKyAgcG9zdCA9IChteV9wb3N0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9wb3N0X2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPnBvc3QgPSAoc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgKikgcG9zdDsKKyAgcG9zdC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2Rwb3N0OworICBwb3N0LT53aG9sZV9pbWFnZSA9IE5VTEw7CS8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCisgIHBvc3QtPmJ1ZmZlciA9IE5VTEw7CQkvKiBmbGFnIGZvciBubyBzdHJpcCBidWZmZXIgKi8KKworICAvKiBDcmVhdGUgdGhlIHF1YW50aXphdGlvbiBidWZmZXIsIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgIC8qIFRoZSBidWZmZXIgc3RyaXAgaGVpZ2h0IGlzIG1heF92X3NhbXBfZmFjdG9yLCB3aGljaCBpcyB0eXBpY2FsbHkKKyAgICAgKiBhbiBlZmZpY2llbnQgbnVtYmVyIG9mIHJvd3MgZm9yIHVwc2FtcGxpbmcgdG8gcmV0dXJuLgorICAgICAqIChJbiB0aGUgcHJlc2VuY2Ugb2Ygb3V0cHV0IHJlc2NhbGluZywgd2UgbWlnaHQgd2FudCB0byBiZSBzbWFydGVyPykKKyAgICAgKi8KKyAgICBwb3N0LT5zdHJpcF9oZWlnaHQgPSAoSkRJTUVOU0lPTikgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAgIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7CisgICAgICAvKiBUd28tcGFzcyBjb2xvciBxdWFudGl6YXRpb246IG5lZWQgZnVsbC1pbWFnZSBzdG9yYWdlLiAqLworICAgICAgLyogV2Ugcm91bmQgdXAgdGhlIG51bWJlciBvZiByb3dzIHRvIGEgbXVsdGlwbGUgb2YgdGhlIHN0cmlwIGhlaWdodC4gKi8KKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgICAgIHBvc3QtPndob2xlX2ltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorCSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodCwKKwkJCQkobG9uZykgcG9zdC0+c3RyaXBfaGVpZ2h0KSwKKwkgcG9zdC0+c3RyaXBfaGVpZ2h0KTsKKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE9uZS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbjoganVzdCBtYWtlIGEgc3RyaXAgYnVmZmVyLiAqLworICAgICAgcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cywKKwkgcG9zdC0+c3RyaXBfaGVpZ2h0KTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pkc2FtcGxlLmMgYi9jb21tb24vanBlZy9qZHNhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZmZlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZHNhbXBsZS5jCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogamRzYW1wbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHVwc2FtcGxpbmcgcm91dGluZXMuCisgKgorICogVXBzYW1wbGluZyBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKKyAqIGlzIGRlZmluZWQgdG8gYmUgKHZfc2FtcF9mYWN0b3IgKiBEQ1Rfc2NhbGVkX3NpemUgLyBtaW5fRENUX3NjYWxlZF9zaXplKQorICogc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICBVcHNhbXBsaW5nIHdpbGwgbm9ybWFsbHkgcHJvZHVjZQorICogbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBmcm9tIGVhY2ggcm93IGdyb3VwIChidXQgdGhpcyBjb3VsZCB2YXJ5CisgKiBpZiB0aGUgdXBzYW1wbGVyIGlzIGFwcGx5aW5nIGEgc2NhbGUgZmFjdG9yIG9mIGl0cyBvd24pLgorICoKKyAqIEFuIGV4Y2VsbGVudCByZWZlcmVuY2UgZm9yIGltYWdlIHJlc2FtcGxpbmcgaXMKKyAqICAgRGlnaXRhbCBJbWFnZSBXYXJwaW5nLCBHZW9yZ2UgV29sYmVyZywgMTk5MC4KKyAqICAgUHViLiBieSBJRUVFIENvbXB1dGVyIFNvY2lldHkgUHJlc3MsIExvcyBBbGFtaXRvcywgQ0EuIElTQk4gMC04MTg2LTg5NDQtNy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUG9pbnRlciB0byByb3V0aW5lIHRvIHVwc2FtcGxlIGEgc2luZ2xlIGNvbXBvbmVudCAqLwordHlwZWRlZiBKTUVUSE9EKHZvaWQsIHVwc2FtcGxlMV9wdHIsCisJCShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikpOworCisvKiBQcml2YXRlIHN1Ym9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBDb2xvciBjb252ZXJzaW9uIGJ1ZmZlci4gIFdoZW4gdXNpbmcgc2VwYXJhdGUgdXBzYW1wbGluZyBhbmQgY29sb3IKKyAgICogY29udmVyc2lvbiBzdGVwcywgdGhpcyBidWZmZXIgaG9sZHMgb25lIHVwc2FtcGxlZCByb3cgZ3JvdXAgdW50aWwgaXQKKyAgICogaGFzIGJlZW4gY29sb3IgY29udmVydGVkIGFuZCBvdXRwdXQuCisgICAqIE5vdGU6IHdlIGRvIG5vdCBhbGxvY2F0ZSBhbnkgc3RvcmFnZSBmb3IgY29tcG9uZW50KHMpIHdoaWNoIGFyZSBmdWxsLXNpemUsCisgICAqIGllIGRvIG5vdCBuZWVkIHJlc2NhbGluZy4gIFRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IG9mIGNvbG9yX2J1ZltdIGlzCisgICAqIHNpbXBseSBzZXQgdG8gcG9pbnQgdG8gdGhlIGlucHV0IGRhdGEgYXJyYXksIHRoZXJlYnkgYXZvaWRpbmcgY29weWluZy4KKyAgICovCisgIEpTQU1QQVJSQVkgY29sb3JfYnVmW01BWF9DT01QT05FTlRTXTsKKworICAvKiBQZXItY29tcG9uZW50IHVwc2FtcGxpbmcgbWV0aG9kIHBvaW50ZXJzICovCisgIHVwc2FtcGxlMV9wdHIgbWV0aG9kc1tNQVhfQ09NUE9ORU5UU107CisKKyAgaW50IG5leHRfcm93X291dDsJCS8qIGNvdW50cyByb3dzIGVtaXR0ZWQgZnJvbSBjb2xvcl9idWYgKi8KKyAgSkRJTUVOU0lPTiByb3dzX3RvX2dvOwkvKiBjb3VudHMgcm93cyByZW1haW5pbmcgaW4gaW1hZ2UgKi8KKworICAvKiBIZWlnaHQgb2YgYW4gaW5wdXQgcm93IGdyb3VwIGZvciBlYWNoIGNvbXBvbmVudC4gKi8KKyAgaW50IHJvd2dyb3VwX2hlaWdodFtNQVhfQ09NUE9ORU5UU107CisKKyAgLyogVGhlc2UgYXJyYXlzIHNhdmUgcGl4ZWwgZXhwYW5zaW9uIGZhY3RvcnMgc28gdGhhdCBpbnRfZXhwYW5kIG5lZWQgbm90CisgICAqIHJlY29tcHV0ZSB0aGVtIGVhY2ggdGltZS4gIFRoZXkgYXJlIHVudXNlZCBmb3Igb3RoZXIgdXBzYW1wbGluZyBtZXRob2RzLgorICAgKi8KKyAgVUlOVDggaF9leHBhbmRbTUFYX0NPTVBPTkVOVFNdOworICBVSU5UOCB2X2V4cGFuZFtNQVhfQ09NUE9ORU5UU107Cit9IG15X3Vwc2FtcGxlcjsKKwordHlwZWRlZiBteV91cHNhbXBsZXIgKiBteV91cHNhbXBsZV9wdHI7CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGFuIHVwc2FtcGxpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKworICAvKiBNYXJrIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciBlbXB0eSAqLworICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAvKiBJbml0aWFsaXplIHRvdGFsLWhlaWdodCBjb3VudGVyIGZvciBkZXRlY3RpbmcgYm90dG9tIG9mIGltYWdlICovCisgIHVwc2FtcGxlLT5yb3dzX3RvX2dvID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7Cit9CisKKworLyoKKyAqIENvbnRyb2wgcm91dGluZSB0byBkbyB1cHNhbXBsaW5nIChhbmQgY29sb3IgY29udmVyc2lvbikuCisgKgorICogSW4gdGhpcyB2ZXJzaW9uIHdlIHVwc2FtcGxlIGVhY2ggY29tcG9uZW50IGluZGVwZW5kZW50bHkuCisgKiBXZSB1cHNhbXBsZSBvbmUgcm93IGdyb3VwIGludG8gdGhlIGNvbnZlcnNpb24gYnVmZmVyLCB0aGVuIGFwcGx5CisgKiBjb2xvciBjb252ZXJzaW9uIGEgcm93IGF0IGEgdGltZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3NlcF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkgICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkgICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpESU1FTlNJT04gbnVtX3Jvd3M7CisKKyAgLyogRmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIsIGlmIGl0J3MgZW1wdHkgKi8KKyAgaWYgKHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgPj0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICAvKiBJbnZva2UgcGVyLWNvbXBvbmVudCB1cHNhbXBsZSBtZXRob2QuICBOb3RpY2Ugd2UgcGFzcyBhIFBPSU5URVIKKyAgICAgICAqIHRvIGNvbG9yX2J1ZltjaV0sIHNvIHRoYXQgZnVsbHNpemVfdXBzYW1wbGUgY2FuIGNoYW5nZSBpdC4KKyAgICAgICAqLworICAgICAgKCp1cHNhbXBsZS0+bWV0aG9kc1tjaV0pIChjaW5mbywgY29tcHB0ciwKKwlpbnB1dF9idWZbY2ldICsgKCppbl9yb3dfZ3JvdXBfY3RyICogdXBzYW1wbGUtPnJvd2dyb3VwX2hlaWdodFtjaV0pLAorCXVwc2FtcGxlLT5jb2xvcl9idWYgKyBjaSk7CisgICAgfQorICAgIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgPSAwOworICB9CisKKyAgLyogQ29sb3ItY29udmVydCBhbmQgZW1pdCByb3dzICovCisKKyAgLyogSG93IG1hbnkgd2UgaGF2ZSBpbiB0aGUgYnVmZmVyOiAqLworICBudW1fcm93cyA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yIC0gdXBzYW1wbGUtPm5leHRfcm93X291dCk7CisgIC8qIE5vdCBtb3JlIHRoYW4gdGhlIGRpc3RhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIGltYWdlLiAgTmVlZCB0aGlzIHRlc3QKKyAgICogaW4gY2FzZSB0aGUgaW1hZ2UgaGVpZ2h0IGlzIG5vdCBhIG11bHRpcGxlIG9mIG1heF92X3NhbXBfZmFjdG9yOgorICAgKi8KKyAgaWYgKG51bV9yb3dzID4gdXBzYW1wbGUtPnJvd3NfdG9fZ28pIAorICAgIG51bV9yb3dzID0gdXBzYW1wbGUtPnJvd3NfdG9fZ287CisgIC8qIEFuZCBub3QgbW9yZSB0aGFuIHdoYXQgdGhlIGNsaWVudCBjYW4gYWNjZXB0OiAqLworICBvdXRfcm93c19hdmFpbCAtPSAqb3V0X3Jvd19jdHI7CisgIGlmIChudW1fcm93cyA+IG91dF9yb3dzX2F2YWlsKQorICAgIG51bV9yb3dzID0gb3V0X3Jvd3NfYXZhaWw7CisKKyAgKCpjaW5mby0+Y2NvbnZlcnQtPmNvbG9yX2NvbnZlcnQpIChjaW5mbywgdXBzYW1wbGUtPmNvbG9yX2J1ZiwKKwkJCQkgICAgIChKRElNRU5TSU9OKSB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0LAorCQkJCSAgICAgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwKKwkJCQkgICAgIChpbnQpIG51bV9yb3dzKTsKKworICAvKiBBZGp1c3QgY291bnRzICovCisgICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKKyAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gLT0gbnVtX3Jvd3M7CisgIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgKz0gbnVtX3Jvd3M7CisgIC8qIFdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0aWVkLCBkZWNsYXJlIHRoaXMgaW5wdXQgcm93IGdyb3VwIGNvbnN1bWVkICovCisgIGlmICh1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID49IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikKKyAgICAoKmluX3Jvd19ncm91cF9jdHIpKys7Cit9CisKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcm91dGluZXMgaW52b2tlZCBieSBzZXBfdXBzYW1wbGUgdG8gdXBzYW1wbGUgcGl4ZWwgdmFsdWVzCisgKiBvZiBhIHNpbmdsZSBjb21wb25lbnQuICBPbmUgcm93IGdyb3VwIGlzIHByb2Nlc3NlZCBwZXIgY2FsbC4KKyAqLworCisKKy8qCisgKiBGb3IgZnVsbC1zaXplIGNvbXBvbmVudHMsIHdlIGp1c3QgbWFrZSBjb2xvcl9idWZbY2ldIHBvaW50IGF0IHRoZQorICogaW5wdXQgYnVmZmVyLCBhbmQgdGh1cyBhdm9pZCBjb3B5aW5nIGFueSBkYXRhLiAgTm90ZSB0aGF0IHRoaXMgaXMKKyAqIHNhZmUgb25seSBiZWNhdXNlIHNlcF91cHNhbXBsZSBkb2Vzbid0IGRlY2xhcmUgdGhlIGlucHV0IHJvdyBncm91cAorICogImNvbnN1bWVkIiB1bnRpbCB3ZSBhcmUgZG9uZSBjb2xvciBjb252ZXJ0aW5nIGFuZCBlbWl0dGluZyBpdC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2Z1bGxzaXplX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICAqb3V0cHV0X2RhdGFfcHRyID0gaW5wdXRfZGF0YTsKK30KKworCisvKgorICogVGhpcyBpcyBhIG5vLW9wIHZlcnNpb24gdXNlZCBmb3IgInVuaW50ZXJlc3RpbmciIGNvbXBvbmVudHMuCisgKiBUaGVzZSBjb21wb25lbnRzIHdpbGwgbm90IGJlIHJlZmVyZW5jZWQgYnkgY29sb3IgY29udmVyc2lvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK25vb3BfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgICpvdXRwdXRfZGF0YV9wdHIgPSBOVUxMOwkvKiBzYWZldHkgY2hlY2sgKi8KK30KKworCisvKgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgYW55IGludGVncmFsIHNhbXBsaW5nIHJhdGlvcy4KKyAqIFRoaXMgaXMgbm90IHVzZWQgZm9yIHR5cGljYWwgSlBFRyBmaWxlcywgc28gaXQgbmVlZCBub3QgYmUgZmFzdC4KKyAqIE5vciwgZm9yIHRoYXQgbWF0dGVyLCBpcyBpdCBwYXJ0aWN1bGFybHkgYWNjdXJhdGU6IHRoZSBhbGdvcml0aG0gaXMKKyAqIHNpbXBsZSByZXBsaWNhdGlvbiBvZiB0aGUgaW5wdXQgcGl4ZWwgb250byB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQKKyAqIHBpeGVscy4gIFRoZSBoaS1mYWx1dGluIHNhbXBsaW5nIGxpdGVyYXR1cmUgcmVmZXJzIHRvIHRoaXMgYXMgYQorICogImJveCBmaWx0ZXIiLiAgQSBib3ggZmlsdGVyIHRlbmRzIHRvIGludHJvZHVjZSB2aXNpYmxlIGFydGlmYWN0cywKKyAqIHNvIGlmIHlvdSBhcmUgYWN0dWFsbHkgZ29pbmcgdG8gdXNlIDM6MSBvciA0OjEgc2FtcGxpbmcgcmF0aW9zCisgKiB5b3Ugd291bGQgYmUgd2VsbCBhZHZpc2VkIHRvIGltcHJvdmUgdGhpcyBjb2RlLgorICovCisKK01FVEhPRERFRih2b2lkKQoraW50X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgaW52YWx1ZTsKKyAgcmVnaXN0ZXIgaW50IGg7CisgIEpTQU1QUk9XIG91dGVuZDsKKyAgaW50IGhfZXhwYW5kLCB2X2V4cGFuZDsKKyAgaW50IGlucm93LCBvdXRyb3c7CisKKyAgaF9leHBhbmQgPSB1cHNhbXBsZS0+aF9leHBhbmRbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKKyAgdl9leHBhbmQgPSB1cHNhbXBsZS0+dl9leHBhbmRbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKKworICBpbnJvdyA9IG91dHJvdyA9IDA7CisgIHdoaWxlIChvdXRyb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICAvKiBHZW5lcmF0ZSBvbmUgb3V0cHV0IHJvdyB3aXRoIHByb3BlciBob3Jpem9udGFsIGV4cGFuc2lvbiAqLworICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKKyAgICBvdXRlbmQgPSBvdXRwdHIgKyBjaW5mby0+b3V0cHV0X3dpZHRoOworICAgIHdoaWxlIChvdXRwdHIgPCBvdXRlbmQpIHsKKyAgICAgIGludmFsdWUgPSAqaW5wdHIrKzsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLworICAgICAgZm9yIChoID0gaF9leHBhbmQ7IGggPiAwOyBoLS0pIHsKKwkqb3V0cHRyKysgPSBpbnZhbHVlOworICAgICAgfQorICAgIH0KKyAgICAvKiBHZW5lcmF0ZSBhbnkgYWRkaXRpb25hbCBvdXRwdXQgcm93cyBieSBkdXBsaWNhdGluZyB0aGUgZmlyc3Qgb25lICovCisgICAgaWYgKHZfZXhwYW5kID4gMSkgeworICAgICAgamNvcHlfc2FtcGxlX3Jvd3Mob3V0cHV0X2RhdGEsIG91dHJvdywgb3V0cHV0X2RhdGEsIG91dHJvdysxLAorCQkJdl9leHBhbmQtMSwgY2luZm8tPm91dHB1dF93aWR0aCk7CisgICAgfQorICAgIGlucm93Kys7CisgICAgb3V0cm93ICs9IHZfZXhwYW5kOworICB9Cit9CisKKworLyoKKyAqIEZhc3QgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCisgKiBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjFfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7CisgIEpTQU1QUk9XIG91dGVuZDsKKyAgaW50IGlucm93OworCisgIGZvciAoaW5yb3cgPSAwOyBpbnJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsgaW5yb3crKykgeworICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbaW5yb3ddOworICAgIG91dGVuZCA9IG91dHB0ciArIGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgICAgd2hpbGUgKG91dHB0ciA8IG91dGVuZCkgeworICAgICAgaW52YWx1ZSA9ICppbnB0cisrOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOworICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogRmFzdCBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KKyAqIEl0J3Mgc3RpbGwgYSBib3ggZmlsdGVyLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2Ml91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKK3sKKyAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgaW52YWx1ZTsKKyAgSlNBTVBST1cgb3V0ZW5kOworICBpbnQgaW5yb3csIG91dHJvdzsKKworICBpbnJvdyA9IG91dHJvdyA9IDA7CisgIHdoaWxlIChvdXRyb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgb3V0ZW5kID0gb3V0cHRyICsgY2luZm8tPm91dHB1dF93aWR0aDsKKyAgICB3aGlsZSAob3V0cHRyIDwgb3V0ZW5kKSB7CisgICAgICBpbnZhbHVlID0gKmlucHRyKys7CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7CisgICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOworICAgIH0KKyAgICBqY29weV9zYW1wbGVfcm93cyhvdXRwdXRfZGF0YSwgb3V0cm93LCBvdXRwdXRfZGF0YSwgb3V0cm93KzEsCisJCSAgICAgIDEsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOworICAgIGlucm93Kys7CisgICAgb3V0cm93ICs9IDI7CisgIH0KK30KKworCisvKgorICogRmFuY3kgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCisgKgorICogVGhlIHVwc2FtcGxpbmcgYWxnb3JpdGhtIGlzIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gcGl4ZWwgY2VudGVycywKKyAqIGFsc28ga25vd24gYXMgYSAidHJpYW5nbGUgZmlsdGVyIi4gIFRoaXMgaXMgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbgorICogc3BlZWQgYW5kIHZpc3VhbCBxdWFsaXR5LiAgVGhlIGNlbnRlcnMgb2YgdGhlIG91dHB1dCBwaXhlbHMgYXJlIDEvNCBhbmQgMy80CisgKiBvZiB0aGUgd2F5IGJldHdlZW4gaW5wdXQgcGl4ZWwgY2VudGVycy4KKyAqCisgKiBBIG5vdGUgYWJvdXQgdGhlICJiaWFzIiBjYWxjdWxhdGlvbnM6IHdoZW4gcm91bmRpbmcgZnJhY3Rpb25hbCB2YWx1ZXMgdG8KKyAqIGludGVnZXIsIHdlIGRvIG5vdCB3YW50IHRvIGFsd2F5cyByb3VuZCAwLjUgdXAgdG8gdGhlIG5leHQgaW50ZWdlci4KKyAqIElmIHdlIGRpZCB0aGF0LCB3ZSdkIGludHJvZHVjZSBhIG5vdGljZWFibGUgYmlhcyB0b3dhcmRzIGxhcmdlciB2YWx1ZXMuCisgKiBJbnN0ZWFkLCB0aGlzIGNvZGUgaXMgYXJyYW5nZWQgc28gdGhhdCAwLjUgd2lsbCBiZSByb3VuZGVkIHVwIG9yIGRvd24gYXQKKyAqIGFsdGVybmF0ZSBwaXhlbCBsb2NhdGlvbnMgKGEgc2ltcGxlIG9yZGVyZWQgZGl0aGVyIHBhdHRlcm4pLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2MV9mYW5jeV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGludmFsdWU7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sY3RyOworICBpbnQgaW5yb3c7CisKKyAgZm9yIChpbnJvdyA9IDA7IGlucm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOyBpbnJvdysrKSB7CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtpbnJvd107CisgICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW4gKi8KKyAgICBpbnZhbHVlID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisgICAgKm91dHB0cisrID0gKEpTQU1QTEUpIGludmFsdWU7CisgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cikgKyAyKSA+PiAyKTsKKworICAgIGZvciAoY29sY3RyID0gY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgeworICAgICAgLyogR2VuZXJhbCBjYXNlOiAzLzQgKiBuZWFyZXIgcGl4ZWwgKyAxLzQgKiBmdXJ0aGVyIHBpeGVsICovCisgICAgICBpbnZhbHVlID0gR0VUSlNBTVBMRSgqaW5wdHIrKykgKiAzOworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSArIEdFVEpTQU1QTEUoaW5wdHJbLTJdKSArIDEpID4+IDIpOworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSArIEdFVEpTQU1QTEUoKmlucHRyKSArIDIpID4+IDIpOworICAgIH0KKworICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbGFzdCBjb2x1bW4gKi8KKyAgICBpbnZhbHVlID0gR0VUSlNBTVBMRSgqaW5wdHIpOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKiAzICsgR0VUSlNBTVBMRShpbnB0clstMV0pICsgMSkgPj4gMik7CisgICAgKm91dHB0cisrID0gKEpTQU1QTEUpIGludmFsdWU7CisgIH0KK30KKworCisvKgorICogRmFuY3kgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCisgKiBBZ2FpbiBhIHRyaWFuZ2xlIGZpbHRlcjsgc2VlIGNvbW1lbnRzIGZvciBoMnYxIGNhc2UsIGFib3ZlLgorICoKKyAqIEl0IGlzIE9LIGZvciB1cyB0byByZWZlcmVuY2UgdGhlIGFkamFjZW50IGlucHV0IHJvd3MgYmVjYXVzZSB3ZSBkZW1hbmRlZAorICogY29udGV4dCBmcm9tIHRoZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyIChzZWUgaW5pdGlhbGl6YXRpb24gY29kZSkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX2ZhbmN5X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgb3V0cHRyOworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisgIHJlZ2lzdGVyIGludCB0aGlzY29sc3VtLCBsYXN0Y29sc3VtLCBuZXh0Y29sc3VtOworI2Vsc2UKKyAgcmVnaXN0ZXIgSU5UMzIgdGhpc2NvbHN1bSwgbGFzdGNvbHN1bSwgbmV4dGNvbHN1bTsKKyNlbmRpZgorICByZWdpc3RlciBKRElNRU5TSU9OIGNvbGN0cjsKKyAgaW50IGlucm93LCBvdXRyb3csIHY7CisKKyAgaW5yb3cgPSBvdXRyb3cgPSAwOworICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgZm9yICh2ID0gMDsgdiA8IDI7IHYrKykgeworICAgICAgLyogaW5wdHIwIHBvaW50cyB0byBuZWFyZXN0IGlucHV0IHJvdywgaW5wdHIxIHBvaW50cyB0byBuZXh0IG5lYXJlc3QgKi8KKyAgICAgIGlucHRyMCA9IGlucHV0X2RhdGFbaW5yb3ddOworICAgICAgaWYgKHYgPT0gMCkJCS8qIG5leHQgbmVhcmVzdCBpcyByb3cgYWJvdmUgKi8KKwlpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93LTFdOworICAgICAgZWxzZQkJCS8qIG5leHQgbmVhcmVzdCBpcyByb3cgYmVsb3cgKi8KKwlpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOworICAgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93KytdOworCisgICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLworICAgICAgdGhpc2NvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICBuZXh0Y29sc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspICogMyArIEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiA0ICsgOCkgPj4gNCk7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIG5leHRjb2xzdW0gKyA3KSA+PiA0KTsKKyAgICAgIGxhc3Rjb2xzdW0gPSB0aGlzY29sc3VtOyB0aGlzY29sc3VtID0gbmV4dGNvbHN1bTsKKworICAgICAgZm9yIChjb2xjdHIgPSBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7CisJLyogR2VuZXJhbCBjYXNlOiAzLzQgKiBuZWFyZXIgcGl4ZWwgKyAxLzQgKiBmdXJ0aGVyIHBpeGVsIGluIGVhY2ggKi8KKwkvKiBkaW1lbnNpb24sIHRodXMgOS8xNiwgMy8xNiwgMy8xNiwgMS8xNiBvdmVyYWxsICovCisJbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7CisJKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBsYXN0Y29sc3VtICsgOCkgPj4gNCk7CisJKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBuZXh0Y29sc3VtICsgNykgPj4gNCk7CisJbGFzdGNvbHN1bSA9IHRoaXNjb2xzdW07IHRoaXNjb2xzdW0gPSBuZXh0Y29sc3VtOworICAgICAgfQorCisgICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIGxhc3Rjb2xzdW0gKyA4KSA+PiA0KTsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiA0ICsgNykgPj4gNCk7CisgICAgfQorICAgIGlucm93Kys7CisgIH0KK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHVwc2FtcGxpbmcuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF91cHNhbXBsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZTsKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKyAgYm9vbGVhbiBuZWVkX2J1ZmZlciwgZG9fZmFuY3k7CisgIGludCBoX2luX2dyb3VwLCB2X2luX2dyb3VwLCBoX291dF9ncm91cCwgdl9vdXRfZ3JvdXA7CisKKyAgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X3Vwc2FtcGxlcikpOworICBjaW5mby0+dXBzYW1wbGUgPSAoc3RydWN0IGpwZWdfdXBzYW1wbGVyICopIHVwc2FtcGxlOworICB1cHNhbXBsZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3Vwc2FtcGxlOworICB1cHNhbXBsZS0+cHViLnVwc2FtcGxlID0gc2VwX3Vwc2FtcGxlOworICB1cHNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gRkFMU0U7IC8qIHVudGlsIHdlIGZpbmQgb3V0IGRpZmZlcmVudGx5ICovCisKKyAgaWYgKGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nKQkvKiB0aGlzIGlzbid0IHN1cHBvcnRlZCAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0NJUjYwMV9OT1RJTVBMKTsKKworICAvKiBqZG1haW5jdC5jIGRvZXNuJ3Qgc3VwcG9ydCBjb250ZXh0IHJvd3Mgd2hlbiBtaW5fRENUX3NjYWxlZF9zaXplID0gMSwKKyAgICogc28gZG9uJ3QgYXNrIGZvciBpdC4KKyAgICovCisgIGRvX2ZhbmN5ID0gY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgJiYgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPiAxOworCisgIC8qIFZlcmlmeSB3ZSBjYW4gaGFuZGxlIHRoZSBzYW1wbGluZyBmYWN0b3JzLCBzZWxlY3QgcGVyLWNvbXBvbmVudCBtZXRob2RzLAorICAgKiBhbmQgY3JlYXRlIHN0b3JhZ2UgYXMgbmVlZGVkLgorICAgKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBDb21wdXRlIHNpemUgb2YgYW4gImlucHV0IGdyb3VwIiBhZnRlciBJRENUIHNjYWxpbmcuICBUaGlzIG1hbnkgc2FtcGxlcworICAgICAqIGFyZSB0byBiZSBjb252ZXJ0ZWQgdG8gbWF4X2hfc2FtcF9mYWN0b3IgKiBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbHMuCisgICAgICovCisgICAgaF9pbl9ncm91cCA9IChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisJCSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgICB2X2luX2dyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KKwkJIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICAgIGhfb3V0X2dyb3VwID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yOworICAgIHZfb3V0X2dyb3VwID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAgIHVwc2FtcGxlLT5yb3dncm91cF9oZWlnaHRbY2ldID0gdl9pbl9ncm91cDsgLyogc2F2ZSBmb3IgdXNlIGxhdGVyICovCisgICAgbmVlZF9idWZmZXIgPSBUUlVFOworICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpIHsKKyAgICAgIC8qIERvbid0IGJvdGhlciB0byB1cHNhbXBsZSBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKyAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IG5vb3BfdXBzYW1wbGU7CisgICAgICBuZWVkX2J1ZmZlciA9IEZBTFNFOworICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCA9PSBoX291dF9ncm91cCAmJiB2X2luX2dyb3VwID09IHZfb3V0X2dyb3VwKSB7CisgICAgICAvKiBGdWxsc2l6ZSBjb21wb25lbnRzIGNhbiBiZSBwcm9jZXNzZWQgd2l0aG91dCBhbnkgd29yay4gKi8KKyAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX3Vwc2FtcGxlOworICAgICAgbmVlZF9idWZmZXIgPSBGQUxTRTsKKyAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgKiAyID09IGhfb3V0X2dyb3VwICYmCisJICAgICAgIHZfaW5fZ3JvdXAgPT0gdl9vdXRfZ3JvdXApIHsKKyAgICAgIC8qIFNwZWNpYWwgY2FzZXMgZm9yIDJoMXYgdXBzYW1wbGluZyAqLworICAgICAgaWYgKGRvX2ZhbmN5ICYmIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID4gMikKKwl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX2ZhbmN5X3Vwc2FtcGxlOworICAgICAgZWxzZQorCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfdXBzYW1wbGU7CisgICAgfSBlbHNlIGlmIChoX2luX2dyb3VwICogMiA9PSBoX291dF9ncm91cCAmJgorCSAgICAgICB2X2luX2dyb3VwICogMiA9PSB2X291dF9ncm91cCkgeworICAgICAgLyogU3BlY2lhbCBjYXNlcyBmb3IgMmgydiB1cHNhbXBsaW5nICovCisgICAgICBpZiAoZG9fZmFuY3kgJiYgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPiAyKSB7CisJdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml9mYW5jeV91cHNhbXBsZTsKKwl1cHNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKKyAgICAgIH0gZWxzZQorCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfdXBzYW1wbGU7CisgICAgfSBlbHNlIGlmICgoaF9vdXRfZ3JvdXAgJSBoX2luX2dyb3VwKSA9PSAwICYmCisJICAgICAgICh2X291dF9ncm91cCAlIHZfaW5fZ3JvdXApID09IDApIHsKKyAgICAgIC8qIEdlbmVyaWMgaW50ZWdyYWwtZmFjdG9ycyB1cHNhbXBsaW5nIG1ldGhvZCAqLworICAgICAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaW50X3Vwc2FtcGxlOworICAgICAgdXBzYW1wbGUtPmhfZXhwYW5kW2NpXSA9IChVSU5UOCkgKGhfb3V0X2dyb3VwIC8gaF9pbl9ncm91cCk7CisgICAgICB1cHNhbXBsZS0+dl9leHBhbmRbY2ldID0gKFVJTlQ4KSAodl9vdXRfZ3JvdXAgLyB2X2luX2dyb3VwKTsKKyAgICB9IGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRlJBQ1RfU0FNUExFX05PVElNUEwpOworICAgIGlmIChuZWVkX2J1ZmZlcikgeworICAgICAgdXBzYW1wbGUtPmNvbG9yX2J1ZltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoLAorCQkJCShsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pkdHJhbnMuYyBiL2NvbW1vbi9qcGVnL2pkdHJhbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzBhYjcxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamR0cmFucy5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogamR0cmFucy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbGlicmFyeSByb3V0aW5lcyBmb3IgdHJhbnNjb2RpbmcgZGVjb21wcmVzc2lvbiwKKyAqIHRoYXQgaXMsIHJlYWRpbmcgcmF3IERDVCBjb2VmZmljaWVudCBhcnJheXMgZnJvbSBhbiBpbnB1dCBKUEVHIGZpbGUuCisgKiBUaGUgcm91dGluZXMgaW4gamRhcGltaW4uYyB3aWxsIGFsc28gYmUgbmVlZGVkIGJ5IGEgdHJhbnNjb2Rlci4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK0xPQ0FMKHZvaWQpIHRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24gSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKworLyoKKyAqIFJlYWQgdGhlIGNvZWZmaWNpZW50IGFycmF5cyBmcm9tIGEgSlBFRyBmaWxlLgorICoganBlZ19yZWFkX2hlYWRlciBtdXN0IGJlIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyB0aGlzLgorICoKKyAqIFRoZSBlbnRpcmUgaW1hZ2UgaXMgcmVhZCBpbnRvIGEgc2V0IG9mIHZpcnR1YWwgY29lZmZpY2llbnQtYmxvY2sgYXJyYXlzLAorICogb25lIHBlciBjb21wb25lbnQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YKKyAqIHZpcnR1YWwtYXJyYXkgZGVzY3JpcHRvcnMuICBUaGVzZSBjYW4gYmUgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgdmlhIHRoZQorICogSlBFRyBtZW1vcnkgbWFuYWdlciwgb3IgaGFuZGVkIG9mZiB0byBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgorICogVG8gcmVsZWFzZSB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSB2aXJ0dWFsIGFycmF5cywgY2FsbAorICoganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHdoZW4gZG9uZSB3aXRoIHRoZSBkYXRhLgorICoKKyAqIEFuIGFsdGVybmF0aXZlIHVzYWdlIGlzIHRvIHNpbXBseSBvYnRhaW4gYWNjZXNzIHRvIHRoZSBjb2VmZmljaWVudCBhcnJheXMKKyAqIGR1cmluZyBhIGJ1ZmZlcmVkLWltYWdlLW1vZGUgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24uICBUaGlzIGlzIGFsbG93ZWQKKyAqIGFmdGVyIGFueSBqcGVnX2ZpbmlzaF9vdXRwdXQoKSBjYWxsLiAgVGhlIGFycmF5cyBjYW4gYmUgYWNjZXNzZWQgdW50aWwKKyAqIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBpcyBjYWxsZWQuICAoTm90ZSB0aGF0IGFueSBjYWxsIHRvIHRoZSBsaWJyYXJ5CisgKiBtYXkgcmVwb3NpdGlvbiB0aGUgYXJyYXlzLCBzbyBkb24ndCByZWx5IG9uIGFjY2Vzc192aXJ0X2JhcnJheSgpIHJlc3VsdHMKKyAqIHRvIHN0YXkgdmFsaWQgYWNyb3NzIGxpYnJhcnkgY2FsbHMuKQorICoKKyAqIFJldHVybnMgTlVMTCBpZiBzdXNwZW5kZWQuICBUaGlzIGNhc2UgbmVlZCBiZSBjaGVja2VkIG9ubHkgaWYKKyAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgorICovCisKK0dMT0JBTChqdmlydF9iYXJyYXlfcHRyICopCitqcGVnX3JlYWRfY29lZmZpY2llbnRzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkVBRFkpIHsKKyAgICAvKiBGaXJzdCBjYWxsOiBpbml0aWFsaXplIGFjdGl2ZSBtb2R1bGVzICovCisgICAgdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbihjaW5mbyk7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRENPRUZTOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRENPRUZTKSB7CisgICAgLyogQWJzb3JiIHdob2xlIGZpbGUgaW50byB0aGUgY29lZiBidWZmZXIgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICBpbnQgcmV0Y29kZTsKKyAgICAgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkKKwkoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIC8qIEFic29yYiBzb21lIG1vcmUgaW5wdXQgKi8KKyAgICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKTsKKyAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQorCXJldHVybiBOVUxMOworICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX0VPSSkKKwlicmVhazsKKyAgICAgIC8qIEFkdmFuY2UgcHJvZ3Jlc3MgY291bnRlciBpZiBhcHByb3ByaWF0ZSAqLworICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmCisJICAocmV0Y29kZSA9PSBKUEVHX1JPV19DT01QTEVURUQgfHwgcmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfU09TKSkgeworCWlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgeworCSAgLyogc3RhcnR1cCB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KKwkgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCArPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKKwl9CisgICAgICB9CisgICAgfQorICAgIC8qIFNldCBzdGF0ZSBzbyB0aGF0IGpwZWdfZmluaXNoX2RlY29tcHJlc3MgZG9lcyB0aGUgcmlnaHQgdGhpbmcgKi8KKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOworICB9CisgIC8qIEF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGJlIGluIHN0YXRlIERTVEFURV9TVE9QUElORyBpZiBiZWluZyB1c2VkCisgICAqIHN0YW5kYWxvbmUsIG9yIGluIHN0YXRlIERTVEFURV9CVUZJTUFHRSBpZiBiZWluZyBpbnZva2VkIHRvIGdldCBhY2Nlc3MKKyAgICogdG8gdGhlIGNvZWZmaWNpZW50cyBkdXJpbmcgYSBmdWxsIGJ1ZmZlcmVkLWltYWdlLW1vZGUgZGVjb21wcmVzc2lvbi4KKyAgICovCisgIGlmICgoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfU1RPUFBJTkcgfHwKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9CVUZJTUFHRSkgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgcmV0dXJuIGNpbmZvLT5jb2VmLT5jb2VmX2FycmF5czsKKyAgfQorICAvKiBPb3BzLCBpbXByb3BlciB1c2FnZSAqLworICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICByZXR1cm4gTlVMTDsJCQkvKiBrZWVwIGNvbXBpbGVyIGhhcHB5ICovCit9CisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgZGVjb21wcmVzc2lvbiBtb2R1bGVzIGZvciB0cmFuc2NvZGluZy4KKyAqIFRoaXMgc3Vic3RpdHV0ZXMgZm9yIGpkbWFzdGVyLmMncyBpbml0aWFsaXphdGlvbiBvZiB0aGUgZnVsbCBkZWNvbXByZXNzb3IuCisgKi8KKworTE9DQUwodm9pZCkKK3RyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBidWZmZXJlZC1pbWFnZSBvcGVyYXRpb24uICovCisgIGNpbmZvLT5idWZmZXJlZF9pbWFnZSA9IFRSVUU7CisKKyAgLyogRW50cm9weSBkZWNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgamluaXRfaHVmZl9kZWNvZGVyKGNpbmZvKTsKKyAgfQorCisgIC8qIEFsd2F5cyBnZXQgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlci4gKi8KKyAgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIFRSVUUpOworCisgIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCisgICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIGlucHV0IHNpZGUgb2YgZGVjb21wcmVzc29yIHRvIGNvbnN1bWUgZmlyc3Qgc2Nhbi4gKi8KKyAgKCpjaW5mby0+aW5wdXRjdGwtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7CisKKyAgLyogSW5pdGlhbGl6ZSBwcm9ncmVzcyBtb25pdG9yaW5nLiAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBpbnQgbnNjYW5zOworICAgIC8qIEVzdGltYXRlIG51bWJlciBvZiBzY2FucyB0byBzZXQgcGFzc19saW1pdC4gKi8KKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyAgICAgIC8qIEFyYml0cmFyaWx5IGVzdGltYXRlIDIgaW50ZXJsZWF2ZWQgREMgc2NhbnMgKyAzIEFDIHNjYW5zL2NvbXBvbmVudC4gKi8KKyAgICAgIG5zY2FucyA9IDIgKyAzICogY2luZm8tPm51bV9jb21wb25lbnRzOworICAgIH0gZWxzZSBpZiAoY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMpIHsKKyAgICAgIC8qIEZvciBhIG5vbnByb2dyZXNzaXZlIG11bHRpc2NhbiBmaWxlLCBlc3RpbWF0ZSAxIHNjYW4gcGVyIGNvbXBvbmVudC4gKi8KKyAgICAgIG5zY2FucyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICB9IGVsc2UgeworICAgICAgbnNjYW5zID0gMTsKKyAgICB9CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAwTDsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAqIG5zY2FuczsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSAwOworICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gMTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamVycm9yLmMgYi9jb21tb24vanBlZy9qZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGE3YmU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamVycm9yLmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBqZXJyb3IuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHNpbXBsZSBlcnJvci1yZXBvcnRpbmcgYW5kIHRyYWNlLW1lc3NhZ2Ugcm91dGluZXMuCisgKiBUaGVzZSBhcmUgc3VpdGFibGUgZm9yIFVuaXgtbGlrZSBzeXN0ZW1zIGFuZCBvdGhlcnMgd2hlcmUgd3JpdGluZyB0bworICogc3RkZXJyIGlzIHRoZSByaWdodCB0aGluZyB0byBkby4gIE1hbnkgYXBwbGljYXRpb25zIHdpbGwgd2FudCB0byByZXBsYWNlCisgKiBzb21lIG9yIGFsbCBvZiB0aGVzZSByb3V0aW5lcy4KKyAqCisgKiBJZiB5b3UgZGVmaW5lIFVTRV9XSU5ET1dTX01FU1NBR0VCT1ggaW4gamNvbmZpZy5oIG9yIGluIHRoZSBtYWtlZmlsZSwKKyAqIHlvdSBnZXQgYSBXaW5kb3dzLXNwZWNpZmljIGhhY2sgdG8gZGlzcGxheSBlcnJvciBtZXNzYWdlcyBpbiBhIGRpYWxvZyBib3guCisgKiBJdCBhaW4ndCBtdWNoLCBidXQgaXQgYmVhdHMgZHJvcHBpbmcgZXJyb3IgbWVzc2FnZXMgaW50byB0aGUgYml0IGJ1Y2tldCwKKyAqIHdoaWNoIGlzIHdoYXQgaGFwcGVucyB0byBvdXRwdXQgdG8gc3RkZXJyIHVuZGVyIG1vc3QgV2luZG93cyBDIGNvbXBpbGVycy4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgdXNlZCBieSBib3RoIHRoZSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjb2RlLgorICovCisKKy8qIHRoaXMgaXMgbm90IGEgY29yZSBsaWJyYXJ5IG1vZHVsZSwgc28gaXQgZG9lc24ndCBkZWZpbmUgSlBFR19JTlRFUk5BTFMgKi8KKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqdmVyc2lvbi5oIgorI2luY2x1ZGUgImplcnJvci5oIgorCisjaWZkZWYgVVNFX1dJTkRPV1NfTUVTU0FHRUJPWAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIEVYSVRfRkFJTFVSRQkJLyogZGVmaW5lIGV4aXQoKSBjb2RlcyBpZiBub3QgcHJvdmlkZWQgKi8KKyNkZWZpbmUgRVhJVF9GQUlMVVJFICAxCisjZW5kaWYKKworCisvKgorICogQ3JlYXRlIHRoZSBtZXNzYWdlIHN0cmluZyB0YWJsZS4KKyAqIFdlIGRvIHRoaXMgZnJvbSB0aGUgbWFzdGVyIG1lc3NhZ2UgbGlzdCBpbiBqZXJyb3IuaCBieSByZS1yZWFkaW5nCisgKiBqZXJyb3IuaCB3aXRoIGEgc3VpdGFibGUgZGVmaW5pdGlvbiBmb3IgbWFjcm8gSk1FU1NBR0UuCisgKiBUaGUgbWVzc2FnZSB0YWJsZSBpcyBtYWRlIGFuIGV4dGVybmFsIHN5bWJvbCBqdXN0IGluIGNhc2UgYW55IGFwcGxpY2F0aW9ucworICogd2FudCB0byByZWZlciB0byBpdCBkaXJlY3RseS4KKyAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlCWpNc2dUYWJsZQorI2VuZGlmCisKKyNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCXN0cmluZyAsCisKK2NvbnN0IGNoYXIgKiBjb25zdCBqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlW10gPSB7CisjaW5jbHVkZSAiamVycm9yLmgiCisgIE5VTEwKK307CisKKworLyoKKyAqIEVycm9yIGV4aXQgaGFuZGxlcjogbXVzdCBub3QgcmV0dXJuIHRvIGNhbGxlci4KKyAqCisgKiBBcHBsaWNhdGlvbnMgbWF5IG92ZXJyaWRlIHRoaXMgaWYgdGhleSB3YW50IHRvIGdldCBjb250cm9sIGJhY2sgYWZ0ZXIKKyAqIGFuIGVycm9yLiAgVHlwaWNhbGx5IG9uZSB3b3VsZCBsb25nam1wIHNvbWV3aGVyZSBpbnN0ZWFkIG9mIGV4aXRpbmcuCisgKiBUaGUgc2V0am1wIGJ1ZmZlciBjYW4gYmUgbWFkZSBhIHByaXZhdGUgZmllbGQgd2l0aGluIGFuIGV4cGFuZGVkIGVycm9yCisgKiBoYW5kbGVyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGUgaW5mbyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZQorICogaXMgc3RvcmVkIGluIHRoZSBlcnJvciBvYmplY3QsIHNvIHlvdSBjYW4gZ2VuZXJhdGUgdGhlIG1lc3NhZ2Ugbm93IG9yCisgKiBsYXRlciwgYXQgeW91ciBjb252ZW5pZW5jZS4KKyAqIFlvdSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlIEpQRUcgb2JqZWN0IGlzIGNsZWFuZWQgdXAgKHdpdGgganBlZ19hYm9ydAorICogb3IganBlZ19kZXN0cm95KSBhdCBzb21lIHBvaW50LgorICovCisKK01FVEhPRERFRih2b2lkKQorZXJyb3JfZXhpdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBBbHdheXMgZGlzcGxheSB0aGUgbWVzc2FnZSAqLworICAoKmNpbmZvLT5lcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOworCisgIC8qIExldCB0aGUgbWVtb3J5IG1hbmFnZXIgZGVsZXRlIGFueSB0ZW1wIGZpbGVzIGJlZm9yZSB3ZSBkaWUgKi8KKyAganBlZ19kZXN0cm95KGNpbmZvKTsKKworICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKworLyoKKyAqIEFjdHVhbCBvdXRwdXQgb2YgYW4gZXJyb3Igb3IgdHJhY2UgbWVzc2FnZS4KKyAqIEFwcGxpY2F0aW9ucyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gc2VuZCBKUEVHIG1lc3NhZ2VzIHNvbWV3aGVyZQorICogb3RoZXIgdGhhbiBzdGRlcnIuCisgKgorICogT24gV2luZG93cywgcHJpbnRpbmcgdG8gc3RkZXJyIGlzIGdlbmVyYWxseSBjb21wbGV0ZWx5IHVzZWxlc3MsCisgKiBzbyB3ZSBwcm92aWRlIG9wdGlvbmFsIGNvZGUgdG8gcHJvZHVjZSBhbiBlcnJvci1kaWFsb2cgcG9wdXAuCisgKiBNb3N0IFdpbmRvd3MgYXBwbGljYXRpb25zIHdpbGwgc3RpbGwgcHJlZmVyIHRvIG92ZXJyaWRlIHRoaXMgcm91dGluZSwKKyAqIGJ1dCBpZiB0aGV5IGRvbid0LCBpdCdsbCBkbyBzb21ldGhpbmcgYXQgbGVhc3QgbWFyZ2luYWxseSB1c2VmdWwuCisgKgorICogTk9URTogdG8gdXNlIHRoZSBsaWJyYXJ5IGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoZQorICogQyBzdGRpbyBsaWJyYXJ5LCB5b3UgbWF5IGhhdmUgdG8gZGVsZXRlIHRoZSBjYWxsIHRvIGZwcmludGYoKSBlbnRpcmVseSwKKyAqIG5vdCBqdXN0IG5vdCB1c2UgdGhpcyByb3V0aW5lLgorICovCisKK01FVEhPRERFRih2b2lkKQorb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgY2hhciBidWZmZXJbSk1TR19MRU5HVEhfTUFYXTsKKworICAvKiBDcmVhdGUgdGhlIG1lc3NhZ2UgKi8KKyAgKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkgKGNpbmZvLCBidWZmZXIpOworCisjaWZkZWYgVVNFX1dJTkRPV1NfTUVTU0FHRUJPWAorICAvKiBEaXNwbGF5IGl0IGluIGEgbWVzc2FnZSBkaWFsb2cgYm94ICovCisgIE1lc3NhZ2VCb3goR2V0QWN0aXZlV2luZG93KCksIGJ1ZmZlciwgIkpQRUcgTGlicmFyeSBFcnJvciIsCisJICAgICBNQl9PSyB8IE1CX0lDT05FUlJPUik7CisjZWxzZQorICAvKiBTZW5kIGl0IHRvIHN0ZGVyciwgYWRkaW5nIGEgbmV3bGluZSAqLworICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBidWZmZXIpOworI2VuZGlmCit9CisKKworLyoKKyAqIERlY2lkZSB3aGV0aGVyIHRvIGVtaXQgYSB0cmFjZSBvciB3YXJuaW5nIG1lc3NhZ2UuCisgKiBtc2dfbGV2ZWwgaXMgb25lIG9mOgorICogICAtMTogcmVjb3ZlcmFibGUgY29ycnVwdC1kYXRhIHdhcm5pbmcsIG1heSB3YW50IHRvIGFib3J0LgorICogICAgMDogaW1wb3J0YW50IGFkdmlzb3J5IG1lc3NhZ2VzIChhbHdheXMgZGlzcGxheSB0byB1c2VyKS4KKyAqICAgIDE6IGZpcnN0IGxldmVsIG9mIHRyYWNpbmcgZGV0YWlsLgorICogICAgMiwzLC4uLjogc3VjY2Vzc2l2ZWx5IG1vcmUgZGV0YWlsZWQgdHJhY2luZyBtZXNzYWdlcy4KKyAqIEFuIGFwcGxpY2F0aW9uIG1pZ2h0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIGl0IHdhbnRlZCB0byBhYm9ydCBvbiB3YXJuaW5ncworICogb3IgY2hhbmdlIHRoZSBwb2xpY3kgYWJvdXQgd2hpY2ggbWVzc2FnZXMgdG8gZGlzcGxheS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2VtaXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgbXNnX2xldmVsKQoreworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOworCisgIGlmIChtc2dfbGV2ZWwgPCAwKSB7CisgICAgLyogSXQncyBhIHdhcm5pbmcgbWVzc2FnZS4gIFNpbmNlIGNvcnJ1cHQgZmlsZXMgbWF5IGdlbmVyYXRlIG1hbnkgd2FybmluZ3MsCisgICAgICogdGhlIHBvbGljeSBpbXBsZW1lbnRlZCBoZXJlIGlzIHRvIHNob3cgb25seSB0aGUgZmlyc3Qgd2FybmluZywKKyAgICAgKiB1bmxlc3MgdHJhY2VfbGV2ZWwgPj0gMy4KKyAgICAgKi8KKyAgICBpZiAoZXJyLT5udW1fd2FybmluZ3MgPT0gMCB8fCBlcnItPnRyYWNlX2xldmVsID49IDMpCisgICAgICAoKmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7CisgICAgLyogQWx3YXlzIGNvdW50IHdhcm5pbmdzIGluIG51bV93YXJuaW5ncy4gKi8KKyAgICBlcnItPm51bV93YXJuaW5ncysrOworICB9IGVsc2UgeworICAgIC8qIEl0J3MgYSB0cmFjZSBtZXNzYWdlLiAgU2hvdyBpdCBpZiB0cmFjZV9sZXZlbCA+PSBtc2dfbGV2ZWwuICovCisgICAgaWYgKGVyci0+dHJhY2VfbGV2ZWwgPj0gbXNnX2xldmVsKQorICAgICAgKCplcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOworICB9Cit9CisKKworLyoKKyAqIEZvcm1hdCBhIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGUgbW9zdCByZWNlbnQgSlBFRyBlcnJvciBvciBtZXNzYWdlLgorICogVGhlIG1lc3NhZ2UgaXMgc3RvcmVkIGludG8gYnVmZmVyLCB3aGljaCBzaG91bGQgYmUgYXQgbGVhc3QgSk1TR19MRU5HVEhfTUFYCisgKiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0IG5vICdcbicgY2hhcmFjdGVyIGlzIGFkZGVkIHRvIHRoZSBzdHJpbmcuCisgKiBGZXcgYXBwbGljYXRpb25zIHNob3VsZCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICovCisKK01FVEhPRERFRih2b2lkKQorZm9ybWF0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikKK3sKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKKyAgaW50IG1zZ19jb2RlID0gZXJyLT5tc2dfY29kZTsKKyAgY29uc3QgY2hhciAqIG1zZ3RleHQgPSBOVUxMOworICBjb25zdCBjaGFyICogbXNncHRyOworICBjaGFyIGNoOworICBib29sZWFuIGlzc3RyaW5nOworCisgIC8qIExvb2sgdXAgbWVzc2FnZSBzdHJpbmcgaW4gcHJvcGVyIHRhYmxlICovCisgIGlmIChtc2dfY29kZSA+IDAgJiYgbXNnX2NvZGUgPD0gZXJyLT5sYXN0X2pwZWdfbWVzc2FnZSkgeworICAgIG1zZ3RleHQgPSBlcnItPmpwZWdfbWVzc2FnZV90YWJsZVttc2dfY29kZV07CisgIH0gZWxzZSBpZiAoZXJyLT5hZGRvbl9tZXNzYWdlX3RhYmxlICE9IE5VTEwgJiYKKwkgICAgIG1zZ19jb2RlID49IGVyci0+Zmlyc3RfYWRkb25fbWVzc2FnZSAmJgorCSAgICAgbXNnX2NvZGUgPD0gZXJyLT5sYXN0X2FkZG9uX21lc3NhZ2UpIHsKKyAgICBtc2d0ZXh0ID0gZXJyLT5hZGRvbl9tZXNzYWdlX3RhYmxlW21zZ19jb2RlIC0gZXJyLT5maXJzdF9hZGRvbl9tZXNzYWdlXTsKKyAgfQorCisgIC8qIERlZmVuZCBhZ2FpbnN0IGJvZ3VzIG1lc3NhZ2UgbnVtYmVyICovCisgIGlmIChtc2d0ZXh0ID09IE5VTEwpIHsKKyAgICBlcnItPm1zZ19wYXJtLmlbMF0gPSBtc2dfY29kZTsKKyAgICBtc2d0ZXh0ID0gZXJyLT5qcGVnX21lc3NhZ2VfdGFibGVbMF07CisgIH0KKworICAvKiBDaGVjayBmb3Igc3RyaW5nIHBhcmFtZXRlciwgYXMgaW5kaWNhdGVkIGJ5ICVzIGluIHRoZSBtZXNzYWdlIHRleHQgKi8KKyAgaXNzdHJpbmcgPSBGQUxTRTsKKyAgbXNncHRyID0gbXNndGV4dDsKKyAgd2hpbGUgKChjaCA9ICptc2dwdHIrKykgIT0gJ1wwJykgeworICAgIGlmIChjaCA9PSAnJScpIHsKKyAgICAgIGlmICgqbXNncHRyID09ICdzJykgaXNzdHJpbmcgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogRm9ybWF0IHRoZSBtZXNzYWdlIGludG8gdGhlIHBhc3NlZCBidWZmZXIgKi8KKyAgaWYgKGlzc3RyaW5nKQorICAgIHNwcmludGYoYnVmZmVyLCBtc2d0ZXh0LCBlcnItPm1zZ19wYXJtLnMpOworICBlbHNlCisgICAgc3ByaW50ZihidWZmZXIsIG1zZ3RleHQsCisJICAgIGVyci0+bXNnX3Bhcm0uaVswXSwgZXJyLT5tc2dfcGFybS5pWzFdLAorCSAgICBlcnItPm1zZ19wYXJtLmlbMl0sIGVyci0+bXNnX3Bhcm0uaVszXSwKKwkgICAgZXJyLT5tc2dfcGFybS5pWzRdLCBlcnItPm1zZ19wYXJtLmlbNV0sCisJICAgIGVyci0+bXNnX3Bhcm0uaVs2XSwgZXJyLT5tc2dfcGFybS5pWzddKTsKK30KKworCisvKgorICogUmVzZXQgZXJyb3Igc3RhdGUgdmFyaWFibGVzIGF0IHN0YXJ0IG9mIGEgbmV3IGltYWdlLgorICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIGNvbXByZXNzaW9uIHN0YXJ0dXAgdG8gcmVzZXQgdHJhY2UvZXJyb3IKKyAqIHByb2Nlc3NpbmcgdG8gZGVmYXVsdCBzdGF0ZSwgd2l0aG91dCBsb3NpbmcgYW55IGFwcGxpY2F0aW9uLXNwZWNpZmljCisgKiBtZXRob2QgcG9pbnRlcnMuICBBbiBhcHBsaWNhdGlvbiBtaWdodCBwb3NzaWJseSB3YW50IHRvIG92ZXJyaWRlCisgKiB0aGlzIG1ldGhvZCBpZiBpdCBoYXMgYWRkaXRpb25hbCBlcnJvciBwcm9jZXNzaW5nIHN0YXRlLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmVzZXRfZXJyb3JfbWdyIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIGNpbmZvLT5lcnItPm51bV93YXJuaW5ncyA9IDA7CisgIC8qIHRyYWNlX2xldmVsIGlzIG5vdCByZXNldCBzaW5jZSBpdCBpcyBhbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBwYXJhbWV0ZXIgKi8KKyAgY2luZm8tPmVyci0+bXNnX2NvZGUgPSAwOwkvKiBtYXkgYmUgdXNlZnVsIGFzIGEgZmxhZyBmb3IgIm5vIGVycm9yIiAqLworfQorCisKKy8qCisgKiBGaWxsIGluIHRoZSBzdGFuZGFyZCBlcnJvci1oYW5kbGluZyBtZXRob2RzIGluIGEganBlZ19lcnJvcl9tZ3Igb2JqZWN0LgorICogVHlwaWNhbCBjYWxsIGlzOgorICoJc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOworICoJc3RydWN0IGpwZWdfZXJyb3JfbWdyIGVycjsKKyAqCisgKgljaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmZXJyKTsKKyAqIGFmdGVyIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBtYXkgb3ZlcnJpZGUgc29tZSBvZiB0aGUgbWV0aG9kcy4KKyAqLworCitHTE9CQUwoc3RydWN0IGpwZWdfZXJyb3JfbWdyICopCitqcGVnX3N0ZF9lcnJvciAoc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyKQoreworICBlcnItPmVycm9yX2V4aXQgPSBlcnJvcl9leGl0OworICBlcnItPmVtaXRfbWVzc2FnZSA9IGVtaXRfbWVzc2FnZTsKKyAgZXJyLT5vdXRwdXRfbWVzc2FnZSA9IG91dHB1dF9tZXNzYWdlOworICBlcnItPmZvcm1hdF9tZXNzYWdlID0gZm9ybWF0X21lc3NhZ2U7CisgIGVyci0+cmVzZXRfZXJyb3JfbWdyID0gcmVzZXRfZXJyb3JfbWdyOworCisgIGVyci0+dHJhY2VfbGV2ZWwgPSAwOwkJLyogZGVmYXVsdCA9IG5vIHRyYWNpbmcgKi8KKyAgZXJyLT5udW1fd2FybmluZ3MgPSAwOwkvKiBubyB3YXJuaW5ncyBlbWl0dGVkIHlldCAqLworICBlcnItPm1zZ19jb2RlID0gMDsJCS8qIG1heSBiZSB1c2VmdWwgYXMgYSBmbGFnIGZvciAibm8gZXJyb3IiICovCisKKyAgLyogSW5pdGlhbGl6ZSBtZXNzYWdlIHRhYmxlIHBvaW50ZXJzICovCisgIGVyci0+anBlZ19tZXNzYWdlX3RhYmxlID0ganBlZ19zdGRfbWVzc2FnZV90YWJsZTsKKyAgZXJyLT5sYXN0X2pwZWdfbWVzc2FnZSA9IChpbnQpIEpNU0dfTEFTVE1TR0NPREUgLSAxOworCisgIGVyci0+YWRkb25fbWVzc2FnZV90YWJsZSA9IE5VTEw7CisgIGVyci0+Zmlyc3RfYWRkb25fbWVzc2FnZSA9IDA7CS8qIGZvciBzYWZldHkgKi8KKyAgZXJyLT5sYXN0X2FkZG9uX21lc3NhZ2UgPSAwOworCisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qZXJyb3IuaCBiL2NvbW1vbi9qcGVnL2plcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMmZmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZXJyb3IuaApAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqIGplcnJvci5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZXJyb3IgYW5kIG1lc3NhZ2UgY29kZXMgZm9yIHRoZSBKUEVHIGxpYnJhcnkuCisgKiBFZGl0IHRoaXMgZmlsZSB0byBhZGQgbmV3IGNvZGVzLCBvciB0byB0cmFuc2xhdGUgdGhlIG1lc3NhZ2Ugc3RyaW5ncyB0bworICogc29tZSBvdGhlciBsYW5ndWFnZS4KKyAqIEEgc2V0IG9mIGVycm9yLXJlcG9ydGluZyBtYWNyb3MgYXJlIGRlZmluZWQgdG9vLiAgU29tZSBhcHBsaWNhdGlvbnMgdXNpbmcKKyAqIHRoZSBKUEVHIGxpYnJhcnkgbWF5IHdpc2ggdG8gaW5jbHVkZSB0aGlzIGZpbGUgdG8gZ2V0IHRoZSBlcnJvciBjb2RlcworICogYW5kL29yIHRoZSBtYWNyb3MuCisgKi8KKworLyoKKyAqIFRvIGRlZmluZSB0aGUgZW51bSBsaXN0IG9mIG1lc3NhZ2UgY29kZXMsIGluY2x1ZGUgdGhpcyBmaWxlIHdpdGhvdXQKKyAqIGRlZmluaW5nIG1hY3JvIEpNRVNTQUdFLiAgVG8gY3JlYXRlIGEgbWVzc2FnZSBzdHJpbmcgdGFibGUsIGluY2x1ZGUgaXQKKyAqIGFnYWluIHdpdGggYSBzdWl0YWJsZSBKTUVTU0FHRSBkZWZpbml0aW9uIChzZWUgamVycm9yLmMgZm9yIGFuIGV4YW1wbGUpLgorICovCisjaWZuZGVmIEpNRVNTQUdFCisjaWZuZGVmIEpFUlJPUl9ICisvKiBGaXJzdCB0aW1lIHRocm91Z2gsIGRlZmluZSB0aGUgZW51bSBsaXN0ICovCisjZGVmaW5lIEpNQUtFX0VOVU1fTElTVAorI2Vsc2UKKy8qIFJlcGVhdGVkIGluY2x1c2lvbnMgb2YgdGhpcyBmaWxlIGFyZSBuby1vcHMgdW5sZXNzIEpNRVNTQUdFIGlzIGRlZmluZWQgKi8KKyNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCisjZW5kaWYgLyogSkVSUk9SX0ggKi8KKyNlbmRpZiAvKiBKTUVTU0FHRSAqLworCisjaWZkZWYgSk1BS0VfRU5VTV9MSVNUCisKK3R5cGVkZWYgZW51bSB7CisKKyNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCWNvZGUgLAorCisjZW5kaWYgLyogSk1BS0VfRU5VTV9MSVNUICovCisKK0pNRVNTQUdFKEpNU0dfTk9NRVNTQUdFLCAiQm9ndXMgbWVzc2FnZSBjb2RlICVkIikgLyogTXVzdCBiZSBmaXJzdCBlbnRyeSEgKi8KKworLyogRm9yIG1haW50ZW5hbmNlIGNvbnZlbmllbmNlLCBsaXN0IGlzIGFscGhhYmV0aWNhbCBieSBtZXNzYWdlIGNvZGUgbmFtZSAqLworSk1FU1NBR0UoSkVSUl9BUklUSF9OT1RJTVBMLAorCSAiU29ycnksIHRoZXJlIGFyZSBsZWdhbCByZXN0cmljdGlvbnMgb24gYXJpdGhtZXRpYyBjb2RpbmciKQorSk1FU1NBR0UoSkVSUl9CQURfQUxJR05fVFlQRSwgIkFMSUdOX1RZUEUgaXMgd3JvbmcsIHBsZWFzZSBmaXgiKQorSk1FU1NBR0UoSkVSUl9CQURfQUxMT0NfQ0hVTkssICJNQVhfQUxMT0NfQ0hVTksgaXMgd3JvbmcsIHBsZWFzZSBmaXgiKQorSk1FU1NBR0UoSkVSUl9CQURfQlVGRkVSX01PREUsICJCb2d1cyBidWZmZXIgY29udHJvbCBtb2RlIikKK0pNRVNTQUdFKEpFUlJfQkFEX0NPTVBPTkVOVF9JRCwgIkludmFsaWQgY29tcG9uZW50IElEICVkIGluIFNPUyIpCitKTUVTU0FHRShKRVJSX0JBRF9EQ1RfQ09FRiwgIkRDVCBjb2VmZmljaWVudCBvdXQgb2YgcmFuZ2UiKQorSk1FU1NBR0UoSkVSUl9CQURfRENUU0laRSwgIklEQ1Qgb3V0cHV0IGJsb2NrIHNpemUgJWQgbm90IHN1cHBvcnRlZCIpCitKTUVTU0FHRShKRVJSX0JBRF9IVUZGX1RBQkxFLCAiQm9ndXMgSHVmZm1hbiB0YWJsZSBkZWZpbml0aW9uIikKK0pNRVNTQUdFKEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UsICJCb2d1cyBpbnB1dCBjb2xvcnNwYWNlIikKK0pNRVNTQUdFKEpFUlJfQkFEX0pfQ09MT1JTUEFDRSwgIkJvZ3VzIEpQRUcgY29sb3JzcGFjZSIpCitKTUVTU0FHRShKRVJSX0JBRF9MRU5HVEgsICJCb2d1cyBtYXJrZXIgbGVuZ3RoIikKK0pNRVNTQUdFKEpFUlJfQkFEX0xJQl9WRVJTSU9OLAorCSAiV3JvbmcgSlBFRyBsaWJyYXJ5IHZlcnNpb246IGxpYnJhcnkgaXMgJWQsIGNhbGxlciBleHBlY3RzICVkIikKK0pNRVNTQUdFKEpFUlJfQkFEX01DVV9TSVpFLCAiU2FtcGxpbmcgZmFjdG9ycyB0b28gbGFyZ2UgZm9yIGludGVybGVhdmVkIHNjYW4iKQorSk1FU1NBR0UoSkVSUl9CQURfUE9PTF9JRCwgIkludmFsaWQgbWVtb3J5IHBvb2wgY29kZSAlZCIpCitKTUVTU0FHRShKRVJSX0JBRF9QUkVDSVNJT04sICJVbnN1cHBvcnRlZCBKUEVHIGRhdGEgcHJlY2lzaW9uICVkIikKK0pNRVNTQUdFKEpFUlJfQkFEX1BST0dSRVNTSU9OLAorCSAiSW52YWxpZCBwcm9ncmVzc2l2ZSBwYXJhbWV0ZXJzIFNzPSVkIFNlPSVkIEFoPSVkIEFsPSVkIikKK0pNRVNTQUdFKEpFUlJfQkFEX1BST0dfU0NSSVBULAorCSAiSW52YWxpZCBwcm9ncmVzc2l2ZSBwYXJhbWV0ZXJzIGF0IHNjYW4gc2NyaXB0IGVudHJ5ICVkIikKK0pNRVNTQUdFKEpFUlJfQkFEX1NBTVBMSU5HLCAiQm9ndXMgc2FtcGxpbmcgZmFjdG9ycyIpCitKTUVTU0FHRShKRVJSX0JBRF9TQ0FOX1NDUklQVCwgIkludmFsaWQgc2NhbiBzY3JpcHQgYXQgZW50cnkgJWQiKQorSk1FU1NBR0UoSkVSUl9CQURfU1RBVEUsICJJbXByb3BlciBjYWxsIHRvIEpQRUcgbGlicmFyeSBpbiBzdGF0ZSAlZCIpCitKTUVTU0FHRShKRVJSX0JBRF9TVFJVQ1RfU0laRSwKKwkgIkpQRUcgcGFyYW1ldGVyIHN0cnVjdCBtaXNtYXRjaDogbGlicmFyeSB0aGlua3Mgc2l6ZSBpcyAldSwgY2FsbGVyIGV4cGVjdHMgJXUiKQorSk1FU1NBR0UoSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MsICJCb2d1cyB2aXJ0dWFsIGFycmF5IGFjY2VzcyIpCitKTUVTU0FHRShKRVJSX0JVRkZFUl9TSVpFLCAiQnVmZmVyIHBhc3NlZCB0byBKUEVHIGxpYnJhcnkgaXMgdG9vIHNtYWxsIikKK0pNRVNTQUdFKEpFUlJfQ0FOVF9TVVNQRU5ELCAiU3VzcGVuc2lvbiBub3QgYWxsb3dlZCBoZXJlIikKK0pNRVNTQUdFKEpFUlJfQ0NJUjYwMV9OT1RJTVBMLCAiQ0NJUjYwMSBzYW1wbGluZyBub3QgaW1wbGVtZW50ZWQgeWV0IikKK0pNRVNTQUdFKEpFUlJfQ09NUE9ORU5UX0NPVU5ULCAiVG9vIG1hbnkgY29sb3IgY29tcG9uZW50czogJWQsIG1heCAlZCIpCitKTUVTU0FHRShKRVJSX0NPTlZFUlNJT05fTk9USU1QTCwgIlVuc3VwcG9ydGVkIGNvbG9yIGNvbnZlcnNpb24gcmVxdWVzdCIpCitKTUVTU0FHRShKRVJSX0RBQ19JTkRFWCwgIkJvZ3VzIERBQyBpbmRleCAlZCIpCitKTUVTU0FHRShKRVJSX0RBQ19WQUxVRSwgIkJvZ3VzIERBQyB2YWx1ZSAweCV4IikKK0pNRVNTQUdFKEpFUlJfREhUX0lOREVYLCAiQm9ndXMgREhUIGluZGV4ICVkIikKK0pNRVNTQUdFKEpFUlJfRFFUX0lOREVYLCAiQm9ndXMgRFFUIGluZGV4ICVkIikKK0pNRVNTQUdFKEpFUlJfRU1QVFlfSU1BR0UsICJFbXB0eSBKUEVHIGltYWdlIChETkwgbm90IHN1cHBvcnRlZCkiKQorSk1FU1NBR0UoSkVSUl9FTVNfUkVBRCwgIlJlYWQgZnJvbSBFTVMgZmFpbGVkIikKK0pNRVNTQUdFKEpFUlJfRU1TX1dSSVRFLCAiV3JpdGUgdG8gRU1TIGZhaWxlZCIpCitKTUVTU0FHRShKRVJSX0VPSV9FWFBFQ1RFRCwgIkRpZG4ndCBleHBlY3QgbW9yZSB0aGFuIG9uZSBzY2FuIikKK0pNRVNTQUdFKEpFUlJfRklMRV9SRUFELCAiSW5wdXQgZmlsZSByZWFkIGVycm9yIikKK0pNRVNTQUdFKEpFUlJfRklMRV9XUklURSwgIk91dHB1dCBmaWxlIHdyaXRlIGVycm9yIC0tLSBvdXQgb2YgZGlzayBzcGFjZT8iKQorSk1FU1NBR0UoSkVSUl9GUkFDVF9TQU1QTEVfTk9USU1QTCwgIkZyYWN0aW9uYWwgc2FtcGxpbmcgbm90IGltcGxlbWVudGVkIHlldCIpCitKTUVTU0FHRShKRVJSX0hVRkZfQ0xFTl9PVkVSRkxPVywgIkh1ZmZtYW4gY29kZSBzaXplIHRhYmxlIG92ZXJmbG93IikKK0pNRVNTQUdFKEpFUlJfSFVGRl9NSVNTSU5HX0NPREUsICJNaXNzaW5nIEh1ZmZtYW4gY29kZSB0YWJsZSBlbnRyeSIpCitKTUVTU0FHRShKRVJSX0lNQUdFX1RPT19CSUcsICJNYXhpbXVtIHN1cHBvcnRlZCBpbWFnZSBkaW1lbnNpb24gaXMgJXUgcGl4ZWxzIikKK0pNRVNTQUdFKEpFUlJfSU5QVVRfRU1QVFksICJFbXB0eSBpbnB1dCBmaWxlIikKK0pNRVNTQUdFKEpFUlJfSU5QVVRfRU9GLCAiUHJlbWF0dXJlIGVuZCBvZiBpbnB1dCBmaWxlIikKK0pNRVNTQUdFKEpFUlJfTUlTTUFUQ0hFRF9RVUFOVF9UQUJMRSwKKwkgIkNhbm5vdCB0cmFuc2NvZGUgZHVlIHRvIG11bHRpcGxlIHVzZSBvZiBxdWFudGl6YXRpb24gdGFibGUgJWQiKQorSk1FU1NBR0UoSkVSUl9NSVNTSU5HX0RBVEEsICJTY2FuIHNjcmlwdCBkb2VzIG5vdCB0cmFuc21pdCBhbGwgZGF0YSIpCitKTUVTU0FHRShKRVJSX01PREVfQ0hBTkdFLCAiSW52YWxpZCBjb2xvciBxdWFudGl6YXRpb24gbW9kZSBjaGFuZ2UiKQorSk1FU1NBR0UoSkVSUl9OT1RJTVBMLCAiTm90IGltcGxlbWVudGVkIHlldCIpCitKTUVTU0FHRShKRVJSX05PVF9DT01QSUxFRCwgIlJlcXVlc3RlZCBmZWF0dXJlIHdhcyBvbWl0dGVkIGF0IGNvbXBpbGUgdGltZSIpCitKTUVTU0FHRShKRVJSX05PX0JBQ0tJTkdfU1RPUkUsICJCYWNraW5nIHN0b3JlIG5vdCBzdXBwb3J0ZWQiKQorSk1FU1NBR0UoSkVSUl9OT19IVUZGX1RBQkxFLCAiSHVmZm1hbiB0YWJsZSAweCUwMnggd2FzIG5vdCBkZWZpbmVkIikKK0pNRVNTQUdFKEpFUlJfTk9fSU1BR0UsICJKUEVHIGRhdGFzdHJlYW0gY29udGFpbnMgbm8gaW1hZ2UiKQorSk1FU1NBR0UoSkVSUl9OT19RVUFOVF9UQUJMRSwgIlF1YW50aXphdGlvbiB0YWJsZSAweCUwMnggd2FzIG5vdCBkZWZpbmVkIikKK0pNRVNTQUdFKEpFUlJfTk9fU09JLCAiTm90IGEgSlBFRyBmaWxlOiBzdGFydHMgd2l0aCAweCUwMnggMHglMDJ4IikKK0pNRVNTQUdFKEpFUlJfT1VUX09GX01FTU9SWSwgIkluc3VmZmljaWVudCBtZW1vcnkgKGNhc2UgJWQpIikKK0pNRVNTQUdFKEpFUlJfUVVBTlRfQ09NUE9ORU5UUywKKwkgIkNhbm5vdCBxdWFudGl6ZSBtb3JlIHRoYW4gJWQgY29sb3IgY29tcG9uZW50cyIpCitKTUVTU0FHRShKRVJSX1FVQU5UX0ZFV19DT0xPUlMsICJDYW5ub3QgcXVhbnRpemUgdG8gZmV3ZXIgdGhhbiAlZCBjb2xvcnMiKQorSk1FU1NBR0UoSkVSUl9RVUFOVF9NQU5ZX0NPTE9SUywgIkNhbm5vdCBxdWFudGl6ZSB0byBtb3JlIHRoYW4gJWQgY29sb3JzIikKK0pNRVNTQUdFKEpFUlJfU09GX0RVUExJQ0FURSwgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogdHdvIFNPRiBtYXJrZXJzIikKK0pNRVNTQUdFKEpFUlJfU09GX05PX1NPUywgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogbWlzc2luZyBTT1MgbWFya2VyIikKK0pNRVNTQUdFKEpFUlJfU09GX1VOU1VQUE9SVEVELCAiVW5zdXBwb3J0ZWQgSlBFRyBwcm9jZXNzOiBTT0YgdHlwZSAweCUwMngiKQorSk1FU1NBR0UoSkVSUl9TT0lfRFVQTElDQVRFLCAiSW52YWxpZCBKUEVHIGZpbGUgc3RydWN0dXJlOiB0d28gU09JIG1hcmtlcnMiKQorSk1FU1NBR0UoSkVSUl9TT1NfTk9fU09GLCAiSW52YWxpZCBKUEVHIGZpbGUgc3RydWN0dXJlOiBTT1MgYmVmb3JlIFNPRiIpCitKTUVTU0FHRShKRVJSX1RGSUxFX0NSRUFURSwgIkZhaWxlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUgJXMiKQorSk1FU1NBR0UoSkVSUl9URklMRV9SRUFELCAiUmVhZCBmYWlsZWQgb24gdGVtcG9yYXJ5IGZpbGUiKQorSk1FU1NBR0UoSkVSUl9URklMRV9TRUVLLCAiU2VlayBmYWlsZWQgb24gdGVtcG9yYXJ5IGZpbGUiKQorSk1FU1NBR0UoSkVSUl9URklMRV9XUklURSwKKwkgIldyaXRlIGZhaWxlZCBvbiB0ZW1wb3JhcnkgZmlsZSAtLS0gb3V0IG9mIGRpc2sgc3BhY2U/IikKK0pNRVNTQUdFKEpFUlJfVE9PX0xJVFRMRV9EQVRBLCAiQXBwbGljYXRpb24gdHJhbnNmZXJyZWQgdG9vIGZldyBzY2FubGluZXMiKQorSk1FU1NBR0UoSkVSUl9VTktOT1dOX01BUktFUiwgIlVuc3VwcG9ydGVkIG1hcmtlciB0eXBlIDB4JTAyeCIpCitKTUVTU0FHRShKRVJSX1ZJUlRVQUxfQlVHLCAiVmlydHVhbCBhcnJheSBjb250cm9sbGVyIG1lc3NlZCB1cCIpCitKTUVTU0FHRShKRVJSX1dJRFRIX09WRVJGTE9XLCAiSW1hZ2UgdG9vIHdpZGUgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24iKQorSk1FU1NBR0UoSkVSUl9YTVNfUkVBRCwgIlJlYWQgZnJvbSBYTVMgZmFpbGVkIikKK0pNRVNTQUdFKEpFUlJfWE1TX1dSSVRFLCAiV3JpdGUgdG8gWE1TIGZhaWxlZCIpCitKTUVTU0FHRShKTVNHX0NPUFlSSUdIVCwgSkNPUFlSSUdIVCkKK0pNRVNTQUdFKEpNU0dfVkVSU0lPTiwgSlZFUlNJT04pCitKTUVTU0FHRShKVFJDXzE2QklUX1RBQkxFUywKKwkgIkNhdXRpb246IHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIHRvbyBjb2Fyc2UgZm9yIGJhc2VsaW5lIEpQRUciKQorSk1FU1NBR0UoSlRSQ19BRE9CRSwKKwkgIkFkb2JlIEFQUDE0IG1hcmtlcjogdmVyc2lvbiAlZCwgZmxhZ3MgMHglMDR4IDB4JTA0eCwgdHJhbnNmb3JtICVkIikKK0pNRVNTQUdFKEpUUkNfQVBQMCwgIlVua25vd24gQVBQMCBtYXJrZXIgKG5vdCBKRklGKSwgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfQVBQMTQsICJVbmtub3duIEFQUDE0IG1hcmtlciAobm90IEFkb2JlKSwgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfREFDLCAiRGVmaW5lIEFyaXRobWV0aWMgVGFibGUgMHglMDJ4OiAweCUwMngiKQorSk1FU1NBR0UoSlRSQ19ESFQsICJEZWZpbmUgSHVmZm1hbiBUYWJsZSAweCUwMngiKQorSk1FU1NBR0UoSlRSQ19EUVQsICJEZWZpbmUgUXVhbnRpemF0aW9uIFRhYmxlICVkICBwcmVjaXNpb24gJWQiKQorSk1FU1NBR0UoSlRSQ19EUkksICJEZWZpbmUgUmVzdGFydCBJbnRlcnZhbCAldSIpCitKTUVTU0FHRShKVFJDX0VNU19DTE9TRSwgIkZyZWVkIEVNUyBoYW5kbGUgJXUiKQorSk1FU1NBR0UoSlRSQ19FTVNfT1BFTiwgIk9idGFpbmVkIEVNUyBoYW5kbGUgJXUiKQorSk1FU1NBR0UoSlRSQ19FT0ksICJFbmQgT2YgSW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19IVUZGQklUUywgIiAgICAgICAgJTNkICUzZCAlM2QgJTNkICUzZCAlM2QgJTNkICUzZCIpCitKTUVTU0FHRShKVFJDX0pGSUYsICJKRklGIEFQUDAgbWFya2VyOiB2ZXJzaW9uICVkLiUwMmQsIGRlbnNpdHkgJWR4JWQgICVkIikKK0pNRVNTQUdFKEpUUkNfSkZJRl9CQURUSFVNQk5BSUxTSVpFLAorCSAiV2FybmluZzogdGh1bWJuYWlsIGltYWdlIHNpemUgZG9lcyBub3QgbWF0Y2ggZGF0YSBsZW5ndGggJXUiKQorSk1FU1NBR0UoSlRSQ19KRklGX0VYVEVOU0lPTiwKKwkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogdHlwZSAweCUwMngsIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX0pGSUZfVEhVTUJOQUlMLCAiICAgIHdpdGggJWQgeCAlZCB0aHVtYm5haWwgaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19NSVNDX01BUktFUiwgIk1pc2NlbGxhbmVvdXMgbWFya2VyIDB4JTAyeCwgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfUEFSTUxFU1NfTUFSS0VSLCAiVW5leHBlY3RlZCBtYXJrZXIgMHglMDJ4IikKK0pNRVNTQUdFKEpUUkNfUVVBTlRWQUxTLCAiICAgICAgICAlNHUgJTR1ICU0dSAlNHUgJTR1ICU0dSAlNHUgJTR1IikKK0pNRVNTQUdFKEpUUkNfUVVBTlRfM19OQ09MT1JTLCAiUXVhbnRpemluZyB0byAlZCA9ICVkKiVkKiVkIGNvbG9ycyIpCitKTUVTU0FHRShKVFJDX1FVQU5UX05DT0xPUlMsICJRdWFudGl6aW5nIHRvICVkIGNvbG9ycyIpCitKTUVTU0FHRShKVFJDX1FVQU5UX1NFTEVDVEVELCAiU2VsZWN0ZWQgJWQgY29sb3JzIGZvciBxdWFudGl6YXRpb24iKQorSk1FU1NBR0UoSlRSQ19SRUNPVkVSWV9BQ1RJT04sICJBdCBtYXJrZXIgMHglMDJ4LCByZWNvdmVyeSBhY3Rpb24gJWQiKQorSk1FU1NBR0UoSlRSQ19SU1QsICJSU1QlZCIpCitKTUVTU0FHRShKVFJDX1NNT09USF9OT1RJTVBMLAorCSAiU21vb3RoaW5nIG5vdCBzdXBwb3J0ZWQgd2l0aCBub25zdGFuZGFyZCBzYW1wbGluZyByYXRpb3MiKQorSk1FU1NBR0UoSlRSQ19TT0YsICJTdGFydCBPZiBGcmFtZSAweCUwMng6IHdpZHRoPSV1LCBoZWlnaHQ9JXUsIGNvbXBvbmVudHM9JWQiKQorSk1FU1NBR0UoSlRSQ19TT0ZfQ09NUE9ORU5ULCAiICAgIENvbXBvbmVudCAlZDogJWRoeCVkdiBxPSVkIikKK0pNRVNTQUdFKEpUUkNfU09JLCAiU3RhcnQgb2YgSW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19TT1MsICJTdGFydCBPZiBTY2FuOiAlZCBjb21wb25lbnRzIikKK0pNRVNTQUdFKEpUUkNfU09TX0NPTVBPTkVOVCwgIiAgICBDb21wb25lbnQgJWQ6IGRjPSVkIGFjPSVkIikKK0pNRVNTQUdFKEpUUkNfU09TX1BBUkFNUywgIiAgU3M9JWQsIFNlPSVkLCBBaD0lZCwgQWw9JWQiKQorSk1FU1NBR0UoSlRSQ19URklMRV9DTE9TRSwgIkNsb3NlZCB0ZW1wb3JhcnkgZmlsZSAlcyIpCitKTUVTU0FHRShKVFJDX1RGSUxFX09QRU4sICJPcGVuZWQgdGVtcG9yYXJ5IGZpbGUgJXMiKQorSk1FU1NBR0UoSlRSQ19USFVNQl9KUEVHLAorCSAiSkZJRiBleHRlbnNpb24gbWFya2VyOiBKUEVHLWNvbXByZXNzZWQgdGh1bWJuYWlsIGltYWdlLCBsZW5ndGggJXUiKQorSk1FU1NBR0UoSlRSQ19USFVNQl9QQUxFVFRFLAorCSAiSkZJRiBleHRlbnNpb24gbWFya2VyOiBwYWxldHRlIHRodW1ibmFpbCBpbWFnZSwgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfVEhVTUJfUkdCLAorCSAiSkZJRiBleHRlbnNpb24gbWFya2VyOiBSR0IgdGh1bWJuYWlsIGltYWdlLCBsZW5ndGggJXUiKQorSk1FU1NBR0UoSlRSQ19VTktOT1dOX0lEUywKKwkgIlVucmVjb2duaXplZCBjb21wb25lbnQgSURzICVkICVkICVkLCBhc3N1bWluZyBZQ2JDciIpCitKTUVTU0FHRShKVFJDX1hNU19DTE9TRSwgIkZyZWVkIFhNUyBoYW5kbGUgJXUiKQorSk1FU1NBR0UoSlRSQ19YTVNfT1BFTiwgIk9idGFpbmVkIFhNUyBoYW5kbGUgJXUiKQorSk1FU1NBR0UoSldSTl9BRE9CRV9YRk9STSwgIlVua25vd24gQWRvYmUgY29sb3IgdHJhbnNmb3JtIGNvZGUgJWQiKQorSk1FU1NBR0UoSldSTl9CT0dVU19QUk9HUkVTU0lPTiwKKwkgIkluY29uc2lzdGVudCBwcm9ncmVzc2lvbiBzZXF1ZW5jZSBmb3IgY29tcG9uZW50ICVkIGNvZWZmaWNpZW50ICVkIikKK0pNRVNTQUdFKEpXUk5fRVhUUkFORU9VU19EQVRBLAorCSAiQ29ycnVwdCBKUEVHIGRhdGE6ICV1IGV4dHJhbmVvdXMgYnl0ZXMgYmVmb3JlIG1hcmtlciAweCUwMngiKQorSk1FU1NBR0UoSldSTl9ISVRfTUFSS0VSLCAiQ29ycnVwdCBKUEVHIGRhdGE6IHByZW1hdHVyZSBlbmQgb2YgZGF0YSBzZWdtZW50IikKK0pNRVNTQUdFKEpXUk5fSFVGRl9CQURfQ09ERSwgIkNvcnJ1cHQgSlBFRyBkYXRhOiBiYWQgSHVmZm1hbiBjb2RlIikKK0pNRVNTQUdFKEpXUk5fSkZJRl9NQUpPUiwgIldhcm5pbmc6IHVua25vd24gSkZJRiByZXZpc2lvbiBudW1iZXIgJWQuJTAyZCIpCitKTUVTU0FHRShKV1JOX0pQRUdfRU9GLCAiUHJlbWF0dXJlIGVuZCBvZiBKUEVHIGZpbGUiKQorSk1FU1NBR0UoSldSTl9NVVNUX1JFU1lOQywKKwkgIkNvcnJ1cHQgSlBFRyBkYXRhOiBmb3VuZCBtYXJrZXIgMHglMDJ4IGluc3RlYWQgb2YgUlNUJWQiKQorSk1FU1NBR0UoSldSTl9OT1RfU0VRVUVOVElBTCwgIkludmFsaWQgU09TIHBhcmFtZXRlcnMgZm9yIHNlcXVlbnRpYWwgSlBFRyIpCitKTUVTU0FHRShKV1JOX1RPT19NVUNIX0RBVEEsICJBcHBsaWNhdGlvbiB0cmFuc2ZlcnJlZCB0b28gbWFueSBzY2FubGluZXMiKQorCisjaWZkZWYgSk1BS0VfRU5VTV9MSVNUCisKKyAgSk1TR19MQVNUTVNHQ09ERQorfSBKX01FU1NBR0VfQ09ERTsKKworI3VuZGVmIEpNQUtFX0VOVU1fTElTVAorI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLworCisvKiBaYXAgSk1FU1NBR0UgbWFjcm8gc28gdGhhdCBmdXR1cmUgcmUtaW5jbHVzaW9ucyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQgKi8KKyN1bmRlZiBKTUVTU0FHRQorCisKKyNpZm5kZWYgSkVSUk9SX0gKKyNkZWZpbmUgSkVSUk9SX0gKKworLyogTWFjcm9zIHRvIHNpbXBsaWZ5IHVzaW5nIHRoZSBlcnJvciBhbmQgdHJhY2UgbWVzc2FnZSBzdHVmZiAqLworLyogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBlaXRoZXIgdHlwZSBvZiBjaW5mbyBwb2ludGVyICovCisKKy8qIEZhdGFsIGVycm9ycyAocHJpbnQgbWVzc2FnZSBhbmQgZXhpdCkgKi8KKyNkZWZpbmUgRVJSRVhJVChjaW5mbyxjb2RlKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKKyNkZWZpbmUgRVJSRVhJVDEoY2luZm8sY29kZSxwMSkgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCisjZGVmaW5lIEVSUkVYSVQyKGNpbmZvLGNvZGUscDEscDIpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQorI2RlZmluZSBFUlJFWElUMyhjaW5mbyxjb2RlLHAxLHAyLHAzKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzJdID0gKHAzKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKKyNkZWZpbmUgRVJSRVhJVDQoY2luZm8sY29kZSxwMSxwMixwMyxwNCkgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsyXSA9IChwMyksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVszXSA9IChwNCksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCisjZGVmaW5lIEVSUkVYSVRTKGNpbmZvLGNvZGUsc3RyKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgc3RybmNweSgoY2luZm8pLT5lcnItPm1zZ19wYXJtLnMsIChzdHIpLCBKTVNHX1NUUl9QQVJNX01BWCksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCisKKyNkZWZpbmUgTUFLRVNUTVQoc3R1ZmYpCQlkbyB7IHN0dWZmIH0gd2hpbGUgKDApCisKKy8qIE5vbmZhdGFsIGVycm9ycyAod2UgY2FuIGtlZXAgZ29pbmcsIGJ1dCB0aGUgZGF0YSBpcyBwcm9iYWJseSBjb3JydXB0KSAqLworI2RlZmluZSBXQVJOTVMoY2luZm8sY29kZSkgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAtMSkpCisjZGVmaW5lIFdBUk5NUzEoY2luZm8sY29kZSxwMSkgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAtMSkpCisjZGVmaW5lIFdBUk5NUzIoY2luZm8sY29kZSxwMSxwMikgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAtMSkpCisKKy8qIEluZm9ybWF0aW9uYWwvZGVidWdnaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIFRSQUNFTVMoY2luZm8sbHZsLGNvZGUpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpKQorI2RlZmluZSBUUkFDRU1TMShjaW5mbyxsdmwsY29kZSxwMSkgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSkpCisjZGVmaW5lIFRSQUNFTVMyKGNpbmZvLGx2bCxjb2RlLHAxLHAyKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKKyNkZWZpbmUgVFJBQ0VNUzMoY2luZm8sbHZsLGNvZGUscDEscDIscDMpICBcCisgIE1BS0VTVE1UKGludCAqIF9tcCA9IChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaTsgXAorCSAgIF9tcFswXSA9IChwMSk7IF9tcFsxXSA9IChwMik7IF9tcFsyXSA9IChwMyk7IFwKKwkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCisJICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQorI2RlZmluZSBUUkFDRU1TNChjaW5mbyxsdmwsY29kZSxwMSxwMixwMyxwNCkgIFwKKyAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCisJICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgX21wWzNdID0gKHA0KTsgXAorCSAgIChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSk7IFwKKwkgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpOyApCisjZGVmaW5lIFRSQUNFTVM1KGNpbmZvLGx2bCxjb2RlLHAxLHAyLHAzLHA0LHA1KSAgXAorICBNQUtFU1RNVChpbnQgKiBfbXAgPSAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmk7IFwKKwkgICBfbXBbMF0gPSAocDEpOyBfbXBbMV0gPSAocDIpOyBfbXBbMl0gPSAocDMpOyBfbXBbM10gPSAocDQpOyBcCisJICAgX21wWzRdID0gKHA1KTsgXAorCSAgIChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSk7IFwKKwkgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpOyApCisjZGVmaW5lIFRSQUNFTVM4KGNpbmZvLGx2bCxjb2RlLHAxLHAyLHAzLHA0LHA1LHA2LHA3LHA4KSAgXAorICBNQUtFU1RNVChpbnQgKiBfbXAgPSAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmk7IFwKKwkgICBfbXBbMF0gPSAocDEpOyBfbXBbMV0gPSAocDIpOyBfbXBbMl0gPSAocDMpOyBfbXBbM10gPSAocDQpOyBcCisJICAgX21wWzRdID0gKHA1KTsgX21wWzVdID0gKHA2KTsgX21wWzZdID0gKHA3KTsgX21wWzddID0gKHA4KTsgXAorCSAgIChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSk7IFwKKwkgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpOyApCisjZGVmaW5lIFRSQUNFTVNTKGNpbmZvLGx2bCxjb2RlLHN0cikgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIHN0cm5jcHkoKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5zLCAoc3RyKSwgSk1TR19TVFJfUEFSTV9NQVgpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpKQorCisjZW5kaWYgLyogSkVSUk9SX0ggKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pmZGN0Zmx0LmMgYi9jb21tb24vanBlZy9qZmRjdGZsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDdhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZmRjdGZsdC5jCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogamZkY3RmbHQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmxvYXRpbmctcG9pbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgbW9yZSBhY2N1cmF0ZSB0aGFuIGVpdGhlciBvZiB0aGUgaW50ZWdlcgorICogRENUIGltcGxlbWVudGF0aW9ucy4gIEhvd2V2ZXIsIGl0IG1heSBub3QgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIG9uIGFsbAorICogbWFjaGluZXMgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBpbiByb3VuZG9mZiBiZWhhdmlvci4gIFNwZWVkIHdpbGwgZGVwZW5kCisgKiBvbiB0aGUgaGFyZHdhcmUncyBmbG9hdGluZyBwb2ludCBjYXBhY2l0eS4KKyAqCisgKiBBIDItRCBEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIERDVCBvbiBlYWNoIHJvdyBmb2xsb3dlZCBieSAxLUQgRENUCisgKiBvbiBlYWNoIGNvbHVtbi4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlCisgKiBtdWNoIG1vcmUgY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFyYWksIEFndWksIGFuZCBOYWthamltYSdzIGFsZ29yaXRobSBmb3IKKyAqIHNjYWxlZCBEQ1QuICBUaGVpciBvcmlnaW5hbCBwYXBlciAoVHJhbnMuIElFSUNFIEUtNzEoMTEpOjEwOTUpIGlzIGluCisgKiBKYXBhbmVzZSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHRoZSBQZW5uZWJha2VyICYgTWl0Y2hlbGwKKyAqIEpQRUcgdGV4dGJvb2sgKHNlZSBSRUZFUkVOQ0VTIHNlY3Rpb24gaW4gZmlsZSBSRUFETUUpLiAgVGhlIGZvbGxvd2luZyBjb2RlCisgKiBpcyBiYXNlZCBkaXJlY3RseSBvbiBmaWd1cmUgNC04IGluIFAmTS4KKyAqIFdoaWxlIGFuIDgtcG9pbnQgRENUIGNhbm5vdCBiZSBkb25lIGluIGxlc3MgdGhhbiAxMSBtdWx0aXBsaWVzLCBpdCBpcworICogcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgY29tcHV0YXRpb24gc28gdGhhdCBtYW55IG9mIHRoZSBtdWx0aXBsaWVzIGFyZQorICogc2ltcGxlIHNjYWxpbmdzIG9mIHRoZSBmaW5hbCBvdXRwdXRzLiAgVGhlc2UgbXVsdGlwbGllcyBjYW4gdGhlbiBiZQorICogZm9sZGVkIGludG8gdGhlIG11bHRpcGxpY2F0aW9ucyBvciBkaXZpc2lvbnMgYnkgdGhlIEpQRUcgcXVhbnRpemF0aW9uCisgKiB0YWJsZSBlbnRyaWVzLiAgVGhlIEFBJk4gbWV0aG9kIGxlYXZlcyBvbmx5IDUgbXVsdGlwbGllcyBhbmQgMjkgYWRkcworICogdG8gYmUgZG9uZSBpbiB0aGUgRENUIGl0c2VsZi4KKyAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHdpdGggYSBmaXhlZC1wb2ludAorICogaW1wbGVtZW50YXRpb24sIGFjY3VyYWN5IGlzIGxvc3QgZHVlIHRvIGltcHJlY2lzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAqIHNjYWxlZCBxdWFudGl6YXRpb24gdmFsdWVzLiAgSG93ZXZlciwgdGhhdCBwcm9ibGVtIGRvZXMgbm90IGFyaXNlIGlmCisgKiB3ZSB1c2UgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gb25lIGJsb2NrIG9mIHNhbXBsZXMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfZmxvYXQgKEZBU1RfRkxPQVQgKiBkYXRhKQoreworICBGQVNUX0ZMT0FUIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIEZBU1RfRkxPQVQgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIEZBU1RfRkxPQVQgejEsIHoyLCB6MywgejQsIHo1LCB6MTEsIHoxMzsKKyAgRkFTVF9GTE9BVCAqZGF0YXB0cjsKKyAgaW50IGN0cjsKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIHRtcDAgPSBkYXRhcHRyWzBdICsgZGF0YXB0cls3XTsKKyAgICB0bXA3ID0gZGF0YXB0clswXSAtIGRhdGFwdHJbN107CisgICAgdG1wMSA9IGRhdGFwdHJbMV0gKyBkYXRhcHRyWzZdOworICAgIHRtcDYgPSBkYXRhcHRyWzFdIC0gZGF0YXB0cls2XTsKKyAgICB0bXAyID0gZGF0YXB0clsyXSArIGRhdGFwdHJbNV07CisgICAgdG1wNSA9IGRhdGFwdHJbMl0gLSBkYXRhcHRyWzVdOworICAgIHRtcDMgPSBkYXRhcHRyWzNdICsgZGF0YXB0cls0XTsKKyAgICB0bXA0ID0gZGF0YXB0clszXSAtIGRhdGFwdHJbNF07CisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIAorICAgIGRhdGFwdHJbMF0gPSB0bXAxMCArIHRtcDExOyAvKiBwaGFzZSAzICovCisgICAgZGF0YXB0cls0XSA9IHRtcDEwIC0gdG1wMTE7CisgICAgCisgICAgejEgPSAodG1wMTIgKyB0bXAxMykgKiAoKEZBU1RfRkxPQVQpIDAuNzA3MTA2NzgxKTsgLyogYzQgKi8KKyAgICBkYXRhcHRyWzJdID0gdG1wMTMgKyB6MTsJLyogcGhhc2UgNSAqLworICAgIGRhdGFwdHJbNl0gPSB0bXAxMyAtIHoxOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCisgICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKKyAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OworCisgICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KKyAgICB6NSA9ICh0bXAxMCAtIHRtcDEyKSAqICgoRkFTVF9GTE9BVCkgMC4zODI2ODM0MzMpOyAvKiBjNiAqLworICAgIHoyID0gKChGQVNUX0ZMT0FUKSAwLjU0MTE5NjEwMCkgKiB0bXAxMCArIHo1OyAvKiBjMi1jNiAqLworICAgIHo0ID0gKChGQVNUX0ZMT0FUKSAxLjMwNjU2Mjk2NSkgKiB0bXAxMiArIHo1OyAvKiBjMitjNiAqLworICAgIHozID0gdG1wMTEgKiAoKEZBU1RfRkxPQVQpIDAuNzA3MTA2NzgxKTsgLyogYzQgKi8KKworICAgIHoxMSA9IHRtcDcgKyB6MzsJCS8qIHBoYXNlIDUgKi8KKyAgICB6MTMgPSB0bXA3IC0gejM7CisKKyAgICBkYXRhcHRyWzVdID0gejEzICsgejI7CS8qIHBoYXNlIDYgKi8KKyAgICBkYXRhcHRyWzNdID0gejEzIC0gejI7CisgICAgZGF0YXB0clsxXSA9IHoxMSArIHo0OworICAgIGRhdGFwdHJbN10gPSB6MTEgLSB6NDsKKworICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDcgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIAorICAgIGRhdGFwdHJbRENUU0laRSowXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSB0bXAxMCAtIHRtcDExOworICAgIAorICAgIHoxID0gKHRtcDEyICsgdG1wMTMpICogKChGQVNUX0ZMT0FUKSAwLjcwNzEwNjc4MSk7IC8qIGM0ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gdG1wMTMgKyB6MTsgLyogcGhhc2UgNSAqLworICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IHRtcDEzIC0gejE7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OworICAgIHRtcDEyID0gdG1wNiArIHRtcDc7CisKKyAgICAvKiBUaGUgcm90YXRvciBpcyBtb2RpZmllZCBmcm9tIGZpZyA0LTggdG8gYXZvaWQgZXh0cmEgbmVnYXRpb25zLiAqLworICAgIHo1ID0gKHRtcDEwIC0gdG1wMTIpICogKChGQVNUX0ZMT0FUKSAwLjM4MjY4MzQzMyk7IC8qIGM2ICovCisgICAgejIgPSAoKEZBU1RfRkxPQVQpIDAuNTQxMTk2MTAwKSAqIHRtcDEwICsgejU7IC8qIGMyLWM2ICovCisgICAgejQgPSAoKEZBU1RfRkxPQVQpIDEuMzA2NTYyOTY1KSAqIHRtcDEyICsgejU7IC8qIGMyK2M2ICovCisgICAgejMgPSB0bXAxMSAqICgoRkFTVF9GTE9BVCkgMC43MDcxMDY3ODEpOyAvKiBjNCAqLworCisgICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLworICAgIHoxMyA9IHRtcDcgLSB6MzsKKworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IHoxMyArIHoyOyAvKiBwaGFzZSA2ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gejEzIC0gejI7CisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gejExICsgejQ7CisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gejExIC0gejQ7CisKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgIH0KK30KKworI2VuZGlmIC8qIERDVF9GTE9BVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pmZGN0ZnN0LmMgYi9jb21tb24vanBlZy9qZmRjdGZzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYjM3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZmRjdGZzdC5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogamZkY3Rmc3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuCisgKgorICogQSAyLUQgRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBEQ1Qgb24gZWFjaCByb3cgZm9sbG93ZWQgYnkgMS1EIERDVAorICogb24gZWFjaCBjb2x1bW4uICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZQorICogbXVjaCBtb3JlIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCisgKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgorICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCisgKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQorICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCisgKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKKyAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKKyAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKKyAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgorICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKKyAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCisgKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGZpeGVkLXBvaW50IG1hdGgsCisgKiBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlZAorICogcXVhbnRpemF0aW9uIHZhbHVlcy4gIFRoZSBzbWFsbGVyIHRoZSBxdWFudGl6YXRpb24gdGFibGUgZW50cnksIHRoZSBsZXNzCisgKiBwcmVjaXNlIHRoZSBzY2FsZWQgdmFsdWUsIHNvIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyB3b3JzZSB3aXRoIGhpZ2gtCisgKiBxdWFsaXR5LXNldHRpbmcgZmlsZXMgdGhhbiB3aXRoIGxvdy1xdWFsaXR5IG9uZXMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyogU2NhbGluZyBkZWNpc2lvbnMgYXJlIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUgTEwmTSBhbGdvcml0aG07CisgKiBzZWUgamZkY3RpbnQuYyBmb3IgbW9yZSBkZXRhaWxzLiAgSG93ZXZlciwgd2UgY2hvb3NlIHRvIGRlc2NhbGUKKyAqIChyaWdodCBzaGlmdCkgbXVsdGlwbGljYXRpb24gcHJvZHVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBmb3JtZWQsCisgKiByYXRoZXIgdGhhbiBjYXJyeWluZyBhZGRpdGlvbmFsIGZyYWN0aW9uYWwgYml0cyBpbnRvIHN1YnNlcXVlbnQgYWRkaXRpb25zLgorICogVGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSBzbGlnaHRseSwgYnV0IGl0IGxldHMgdXMgc2F2ZSBhIGZldyBzaGlmdHMuCisgKiBNb3JlIGltcG9ydGFudGx5LCAxNi1iaXQgYXJpdGhtZXRpYyBpcyB0aGVuIGFkZXF1YXRlIChmb3IgOC1iaXQgc2FtcGxlcykKKyAqIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIHRoZSBtdWx0aXBsaWNhdGlvbnMgcHJvcGVyOyB0aGlzIHNhdmVzIGEgZ29vZCBkZWFsCisgKiBvZiB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCisgKgorICogQWdhaW4gdG8gc2F2ZSBhIGZldyBzaGlmdHMsIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBiZXR3ZWVuIHBhc3MgMSBhbmQKKyAqIHBhc3MgMiBhcmUgbm90IHVwc2NhbGVkLCBidXQgYXJlIHJlcHJlc2VudGVkIG9ubHkgdG8gaW50ZWdyYWwgcHJlY2lzaW9uLgorICoKKyAqIEEgZmluYWwgY29tcHJvbWlzZSBpcyB0byByZXByZXNlbnQgdGhlIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50cyB0byBvbmx5CisgKiA4IGZyYWN0aW9uYWwgYml0cywgcmF0aGVyIHRoYW4gMTMuICBUaGlzIHNhdmVzIHNvbWUgc2hpZnRpbmcgd29yayBvbiBzb21lCisgKiBtYWNoaW5lcywgYW5kIG1heSBhbHNvIHJlZHVjZSB0aGUgY29zdCBvZiBtdWx0aXBsaWNhdGlvbiAoc2luY2UgdGhlcmUKKyAqIGFyZSBmZXdlciBvbmUtYml0cyBpbiB0aGUgY29uc3RhbnRzKS4KKyAqLworCisjZGVmaW5lIENPTlNUX0JJVFMgIDgKKworCisvKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKKyAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgorICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KKyAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KKyAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCisgKi8KKworI2lmIENPTlNUX0JJVFMgPT0gOAorI2RlZmluZSBGSVhfMF8zODI2ODM0MzMgICgoSU5UMzIpICAgOTgpCQkvKiBGSVgoMC4zODI2ODM0MzMpICovCisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgKChJTlQzMikgIDEzOSkJCS8qIEZJWCgwLjU0MTE5NjEwMCkgKi8KKyNkZWZpbmUgRklYXzBfNzA3MTA2NzgxICAoKElOVDMyKSAgMTgxKQkJLyogRklYKDAuNzA3MTA2NzgxKSAqLworI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgICgoSU5UMzIpICAzMzQpCQkvKiBGSVgoMS4zMDY1NjI5NjUpICovCisjZWxzZQorI2RlZmluZSBGSVhfMF8zODI2ODM0MzMgIEZJWCgwLjM4MjY4MzQzMykKKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICBGSVgoMC41NDExOTYxMDApCisjZGVmaW5lIEZJWF8wXzcwNzEwNjc4MSAgRklYKDAuNzA3MTA2NzgxKQorI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgIEZJWCgxLjMwNjU2Mjk2NSkKKyNlbmRpZgorCisKKy8qIFdlIGNhbiBnYWluIGEgbGl0dGxlIG1vcmUgc3BlZWQsIHdpdGggYSBmdXJ0aGVyIGNvbXByb21pc2UgaW4gYWNjdXJhY3ksCisgKiBieSBvbWl0dGluZyB0aGUgYWRkaXRpb24gaW4gYSBkZXNjYWxpbmcgc2hpZnQuICBUaGlzIHlpZWxkcyBhbiBpbmNvcnJlY3RseQorICogcm91bmRlZCByZXN1bHQgaGFsZiB0aGUgdGltZS4uLgorICovCisKKyNpZm5kZWYgVVNFX0FDQ1VSQVRFX1JPVU5ESU5HCisjdW5kZWYgREVTQ0FMRQorI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKHgsIG4pCisjZW5kaWYKKworCisvKiBNdWx0aXBseSBhIERDVEVMRU0gdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQsIGFuZCBpbW1lZGlhdGVseQorICogZGVzY2FsZSB0byB5aWVsZCBhIERDVEVMRU0gcmVzdWx0LgorICovCisKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKChEQ1RFTEVNKSBERVNDQUxFKCh2YXIpICogKGNvbnN0KSwgQ09OU1RfQklUUykpCisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0X2lmYXN0IChEQ1RFTEVNICogZGF0YSkKK3sKKyAgRENURUxFTSB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBEQ1RFTEVNIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBEQ1RFTEVNIHoxLCB6MiwgejMsIHo0LCB6NSwgejExLCB6MTM7CisgIERDVEVMRU0gKmRhdGFwdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107CisgICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOworICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKKyAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07CisgICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOworICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKKyAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07CisgICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyWzBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLworICAgIGRhdGFwdHJbNF0gPSB0bXAxMCAtIHRtcDExOworICAgIAorICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KKyAgICBkYXRhcHRyWzJdID0gdG1wMTMgKyB6MTsJLyogcGhhc2UgNSAqLworICAgIGRhdGFwdHJbNl0gPSB0bXAxMyAtIHoxOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCisgICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKKyAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OworCisgICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KKyAgICB6NSA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWF8wXzM4MjY4MzQzMyk7IC8qIGM2ICovCisgICAgejIgPSBNVUxUSVBMWSh0bXAxMCwgRklYXzBfNTQxMTk2MTAwKSArIHo1OyAvKiBjMi1jNiAqLworICAgIHo0ID0gTVVMVElQTFkodG1wMTIsIEZJWF8xXzMwNjU2Mjk2NSkgKyB6NTsgLyogYzIrYzYgKi8KKyAgICB6MyA9IE1VTFRJUExZKHRtcDExLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLworCisgICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLworICAgIHoxMyA9IHRtcDcgLSB6MzsKKworICAgIGRhdGFwdHJbNV0gPSB6MTMgKyB6MjsJLyogcGhhc2UgNiAqLworICAgIGRhdGFwdHJbM10gPSB6MTMgLSB6MjsKKyAgICBkYXRhcHRyWzFdID0gejExICsgejQ7CisgICAgZGF0YXB0cls3XSA9IHoxMSAtIHo0OworCisgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IHRtcDEwIC0gdG1wMTE7CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IHRtcDEzICsgejE7IC8qIHBoYXNlIDUgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSB0bXAxMyAtIHoxOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCisgICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKKyAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OworCisgICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KKyAgICB6NSA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWF8wXzM4MjY4MzQzMyk7IC8qIGM2ICovCisgICAgejIgPSBNVUxUSVBMWSh0bXAxMCwgRklYXzBfNTQxMTk2MTAwKSArIHo1OyAvKiBjMi1jNiAqLworICAgIHo0ID0gTVVMVElQTFkodG1wMTIsIEZJWF8xXzMwNjU2Mjk2NSkgKyB6NTsgLyogYzIrYzYgKi8KKyAgICB6MyA9IE1VTFRJUExZKHRtcDExLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLworCisgICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLworICAgIHoxMyA9IHRtcDcgLSB6MzsKKworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IHoxMyArIHoyOyAvKiBwaGFzZSA2ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gejEzIC0gejI7CisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gejExICsgejQ7CisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gejExIC0gejQ7CisKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgIH0KK30KKworI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pmZGN0aW50LmMgYi9jb21tb24vanBlZy9qZmRjdGludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNzhiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qZmRjdGludC5jCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogamZkY3RpbnQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGZvcndhcmQgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4KKyAqCisgKiBBIDItRCBEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIERDVCBvbiBlYWNoIHJvdyBmb2xsb3dlZCBieSAxLUQgRENUCisgKiBvbiBlYWNoIGNvbHVtbi4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlCisgKiBtdWNoIG1vcmUgY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGFuIGFsZ29yaXRobSBkZXNjcmliZWQgaW4KKyAqICAgQy4gTG9lZmZsZXIsIEEuIExpZ3RlbmJlcmcgYW5kIEcuIE1vc2NoeXR6LCAiUHJhY3RpY2FsIEZhc3QgMS1EIERDVAorICogICBBbGdvcml0aG1zIHdpdGggMTEgTXVsdGlwbGljYXRpb25zIiwgUHJvYy4gSW50J2wuIENvbmYuIG9uIEFjb3VzdGljcywKKyAqICAgU3BlZWNoLCBhbmQgU2lnbmFsIFByb2Nlc3NpbmcgMTk4OSAoSUNBU1NQICc4OSksIHBwLiA5ODgtOTkxLgorICogVGhlIHByaW1hcnkgYWxnb3JpdGhtIGRlc2NyaWJlZCB0aGVyZSB1c2VzIDExIG11bHRpcGxpZXMgYW5kIDI5IGFkZHMuCisgKiBXZSB1c2UgdGhlaXIgYWx0ZXJuYXRlIG1ldGhvZCB3aXRoIDEyIG11bHRpcGxpZXMgYW5kIDMyIGFkZHMuCisgKiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgbm8gZGF0YSBwYXRoIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUKKyAqIG11bHRpcGxpY2F0aW9uOyB0aGlzIGFsbG93cyBhIHZlcnkgc2ltcGxlIGFuZCBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBpbgorICogc2NhbGVkIGZpeGVkLXBvaW50IGFyaXRobWV0aWMsIHdpdGggYSBtaW5pbWFsIG51bWJlciBvZiBzaGlmdHMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyoKKyAqIFRoZSBwb29wIG9uIHRoaXMgc2NhbGluZyBzdHVmZiBpcyBhcyBmb2xsb3dzOgorICoKKyAqIEVhY2ggMS1EIERDVCBzdGVwIHByb2R1Y2VzIG91dHB1dHMgd2hpY2ggYXJlIGEgZmFjdG9yIG9mIHNxcnQoTikKKyAqIGxhcmdlciB0aGFuIHRoZSB0cnVlIERDVCBvdXRwdXRzLiAgVGhlIGZpbmFsIG91dHB1dHMgYXJlIHRoZXJlZm9yZQorICogYSBmYWN0b3Igb2YgTiBsYXJnZXIgdGhhbiBkZXNpcmVkOyBzaW5jZSBOPTggdGhpcyBjYW4gYmUgY3VyZWQgYnkKKyAqIGEgc2ltcGxlIHJpZ2h0IHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGFsZ29yaXRobS4gIFRoZSBhZHZhbnRhZ2Ugb2YKKyAqIHRoaXMgYXJyYW5nZW1lbnQgaXMgdGhhdCB3ZSBzYXZlIHR3byBtdWx0aXBsaWNhdGlvbnMgcGVyIDEtRCBEQ1QsCisgKiBiZWNhdXNlIHRoZSB5MCBhbmQgeTQgb3V0cHV0cyBuZWVkIG5vdCBiZSBkaXZpZGVkIGJ5IHNxcnQoTikuCisgKiBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgZmFjdG9yIG9mIDggaXMgcmVtb3ZlZCBieSB0aGUgcXVhbnRpemF0aW9uIHN0ZXAKKyAqIChpbiBqY2RjdG1nci5jKSwgTk9UIGluIHRoaXMgbW9kdWxlLgorICoKKyAqIFdlIGhhdmUgdG8gZG8gYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uIG9mIHRoZSBpbnRlZ2VyIGlucHV0cywgd2hpY2gKKyAqIGlzIG5vIHByb2JsZW0sIGFuZCBtdWx0aXBsaWNhdGlvbiBieSBmcmFjdGlvbmFsIGNvbnN0YW50cywgd2hpY2ggaXMKKyAqIGEgcHJvYmxlbSB0byBkbyBpbiBpbnRlZ2VyIGFyaXRobWV0aWMuICBXZSBtdWx0aXBseSBhbGwgdGhlIGNvbnN0YW50cworICogYnkgQ09OU1RfU0NBTEUgYW5kIGNvbnZlcnQgdGhlbSB0byBpbnRlZ2VyIGNvbnN0YW50cyAodGh1cyByZXRhaW5pbmcKKyAqIENPTlNUX0JJVFMgYml0cyBvZiBwcmVjaXNpb24gaW4gdGhlIGNvbnN0YW50cykuICBBZnRlciBkb2luZyBhCisgKiBtdWx0aXBsaWNhdGlvbiB3ZSBoYXZlIHRvIGRpdmlkZSB0aGUgcHJvZHVjdCBieSBDT05TVF9TQ0FMRSwgd2l0aCBwcm9wZXIKKyAqIHJvdW5kaW5nLCB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG91dHB1dC4gIFRoaXMgZGl2aXNpb24gY2FuIGJlIGRvbmUKKyAqIGNoZWFwbHkgYXMgYSByaWdodCBzaGlmdCBvZiBDT05TVF9CSVRTIGJpdHMuICBXZSBwb3N0cG9uZSBzaGlmdGluZworICogYXMgbG9uZyBhcyBwb3NzaWJsZSBzbyB0aGF0IHBhcnRpYWwgc3VtcyBjYW4gYmUgYWRkZWQgdG9nZXRoZXIgd2l0aAorICogZnVsbCBmcmFjdGlvbmFsIHByZWNpc2lvbi4KKyAqCisgKiBUaGUgb3V0cHV0cyBvZiB0aGUgZmlyc3QgcGFzcyBhcmUgc2NhbGVkIHVwIGJ5IFBBU1MxX0JJVFMgYml0cyBzbyB0aGF0CisgKiB0aGV5IGFyZSByZXByZXNlbnRlZCB0byBiZXR0ZXItdGhhbi1pbnRlZ3JhbCBwcmVjaXNpb24uICBUaGVzZSBvdXRwdXRzCisgKiByZXF1aXJlIEJJVFNfSU5fSlNBTVBMRSArIFBBU1MxX0JJVFMgKyAzIGJpdHM7IHRoaXMgZml0cyBpbiBhIDE2LWJpdCB3b3JkCisgKiB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLiAgKEZvciAxMi1iaXQgc2FtcGxlIGRhdGEsIHRoZSBpbnRlcm1lZGlhdGUKKyAqIGFycmF5IGlzIElOVDMyIGFueXdheS4pCisgKgorICogVG8gYXZvaWQgb3ZlcmZsb3cgb2YgdGhlIDMyLWJpdCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBpbiBwYXNzIDIsIHdlIG11c3QKKyAqIGhhdmUgQklUU19JTl9KU0FNUExFICsgQ09OU1RfQklUUyArIFBBU1MxX0JJVFMgPD0gMjYuICBFcnJvciBhbmFseXNpcworICogc2hvd3MgdGhhdCB0aGUgdmFsdWVzIGdpdmVuIGJlbG93IGFyZSB0aGUgbW9zdCBlZmZlY3RpdmUuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDIKKyNlbHNlCisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCisjZW5kaWYKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDEzCisjZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAgKChJTlQzMikgIDI0NDYpCS8qIEZJWCgwLjI5ODYzMTMzNikgKi8KKyNkZWZpbmUgRklYXzBfMzkwMTgwNjQ0ICAoKElOVDMyKSAgMzE5NikJLyogRklYKDAuMzkwMTgwNjQ0KSAqLworI2RlZmluZSBGSVhfMF81NDExOTYxMDAgICgoSU5UMzIpICA0NDMzKQkvKiBGSVgoMC41NDExOTYxMDApICovCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgKChJTlQzMikgIDYyNzApCS8qIEZJWCgwLjc2NTM2Njg2NSkgKi8KKyNkZWZpbmUgRklYXzBfODk5OTc2MjIzICAoKElOVDMyKSAgNzM3MykJLyogRklYKDAuODk5OTc2MjIzKSAqLworI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgICgoSU5UMzIpICA5NjMzKQkvKiBGSVgoMS4xNzU4NzU2MDIpICovCisjZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAgKChJTlQzMikgIDEyMjk5KQkvKiBGSVgoMS41MDEzMjExMTApICovCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgKChJTlQzMikgIDE1MTM3KQkvKiBGSVgoMS44NDc3NTkwNjUpICovCisjZGVmaW5lIEZJWF8xXzk2MTU3MDU2MCAgKChJTlQzMikgIDE2MDY5KQkvKiBGSVgoMS45NjE1NzA1NjApICovCisjZGVmaW5lIEZJWF8yXzA1MzExOTg2OSAgKChJTlQzMikgIDE2ODE5KQkvKiBGSVgoMi4wNTMxMTk4NjkpICovCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgKChJTlQzMikgIDIwOTk1KQkvKiBGSVgoMi41NjI5MTU0NDcpICovCisjZGVmaW5lIEZJWF8zXzA3MjcxMTAyNiAgKChJTlQzMikgIDI1MTcyKQkvKiBGSVgoMy4wNzI3MTEwMjYpICovCisjZWxzZQorI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgIEZJWCgwLjI5ODYzMTMzNikKKyNkZWZpbmUgRklYXzBfMzkwMTgwNjQ0ICBGSVgoMC4zOTAxODA2NDQpCisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgRklYKDAuNTQxMTk2MTAwKQorI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgIEZJWCgwLjc2NTM2Njg2NSkKKyNkZWZpbmUgRklYXzBfODk5OTc2MjIzICBGSVgoMC44OTk5NzYyMjMpCisjZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiAgRklYKDEuMTc1ODc1NjAyKQorI2RlZmluZSBGSVhfMV81MDEzMjExMTAgIEZJWCgxLjUwMTMyMTExMCkKKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICBGSVgoMS44NDc3NTkwNjUpCisjZGVmaW5lIEZJWF8xXzk2MTU3MDU2MCAgRklYKDEuOTYxNTcwNTYwKQorI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgIEZJWCgyLjA1MzExOTg2OSkKKyNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICBGSVgoMi41NjI5MTU0NDcpCisjZGVmaW5lIEZJWF8zXzA3MjcxMTAyNiAgRklYKDMuMDcyNzExMDI2KQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYW4gSU5UMzIgdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQgdG8geWllbGQgYW4gSU5UMzIgcmVzdWx0LgorICogRm9yIDgtYml0IHNhbXBsZXMgd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZywgYWxsIHRoZSB2YXJpYWJsZQorICogYW5kIGNvbnN0YW50IHZhbHVlcyBpbnZvbHZlZCBhcmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgd2lkZSwgc28gYQorICogMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgZnVsbCAzMngzMiBtdWx0aXBseS4KKyAqIEZvciAxMi1iaXQgc2FtcGxlcywgYSBmdWxsIDMyLWJpdCBtdWx0aXBsaWNhdGlvbiB3aWxsIGJlIG5lZWRlZC4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpCisjZWxzZQorI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQorI2VuZGlmCisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0X2lzbG93IChEQ1RFTEVNICogZGF0YSkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0LCB6NTsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENUOyAqLworICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIHRtcDAgPSBkYXRhcHRyWzBdICsgZGF0YXB0cls3XTsKKyAgICB0bXA3ID0gZGF0YXB0clswXSAtIGRhdGFwdHJbN107CisgICAgdG1wMSA9IGRhdGFwdHJbMV0gKyBkYXRhcHRyWzZdOworICAgIHRtcDYgPSBkYXRhcHRyWzFdIC0gZGF0YXB0cls2XTsKKyAgICB0bXAyID0gZGF0YXB0clsyXSArIGRhdGFwdHJbNV07CisgICAgdG1wNSA9IGRhdGFwdHJbMl0gLSBkYXRhcHRyWzVdOworICAgIHRtcDMgPSBkYXRhcHRyWzNdICsgZGF0YXB0cls0XTsKKyAgICB0bXA0ID0gZGF0YXB0clszXSAtIGRhdGFwdHJbNF07CisgICAgCisgICAgLyogRXZlbiBwYXJ0IHBlciBMTCZNIGZpZ3VyZSAxIC0tLSBub3RlIHRoYXQgcHVibGlzaGVkIGZpZ3VyZSBpcyBmYXVsdHk7CisgICAgICogcm90YXRvciAic3FydCgyKSpjMSIgc2hvdWxkIGJlICJzcXJ0KDIpKmM2Ii4KKyAgICAgKi8KKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIAorICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkgKCh0bXAxMCArIHRtcDExKSA8PCBQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzRdID0gKERDVEVMRU0pICgodG1wMTAgLSB0bXAxMSkgPDwgUEFTUzFfQklUUyk7CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF81NDExOTYxMDApOworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEzLCBGSVhfMF83NjUzNjY4NjUpLAorCQkJCSAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls2XSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTIsIC0gRklYXzFfODQ3NzU5MDY1KSwKKwkJCQkgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIAorICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgOCAtLS0gbm90ZSBwYXBlciBvbWl0cyBmYWN0b3Igb2Ygc3FydCgyKS4KKyAgICAgKiBjSyByZXByZXNlbnRzIGNvcyhLKnBpLzE2KS4KKyAgICAgKiBpMC4uaTMgaW4gdGhlIHBhcGVyIGFyZSB0bXA0Li50bXA3IGhlcmUuCisgICAgICovCisgICAgCisgICAgejEgPSB0bXA0ICsgdG1wNzsKKyAgICB6MiA9IHRtcDUgKyB0bXA2OworICAgIHozID0gdG1wNCArIHRtcDY7CisgICAgejQgPSB0bXA1ICsgdG1wNzsKKyAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIAorICAgIHRtcDQgPSBNVUxUSVBMWSh0bXA0LCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXA1ID0gTVVMVElQTFkodG1wNSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCisgICAgdG1wNiA9IE1VTFRJUExZKHRtcDYsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLworICAgIHRtcDcgPSBNVUxUSVBMWSh0bXA3LCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KKyAgICAKKyAgICB6MyArPSB6NTsKKyAgICB6NCArPSB6NTsKKyAgICAKKyAgICBkYXRhcHRyWzddID0gKERDVEVMRU0pIERFU0NBTEUodG1wNCArIHoxICsgejMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDUgKyB6MiArIHo0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA2ICsgejIgKyB6MywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNyArIHoxICsgejQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgCisgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgcmVtb3ZlIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAKKyAgICogYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDcgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgCisgICAgLyogRXZlbiBwYXJ0IHBlciBMTCZNIGZpZ3VyZSAxIC0tLSBub3RlIHRoYXQgcHVibGlzaGVkIGZpZ3VyZSBpcyBmYXVsdHk7CisgICAgICogcm90YXRvciAic3FydCgyKSpjMSIgc2hvdWxkIGJlICJzcXJ0KDIpKmM2Ii4KKyAgICAgKi8KKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIAorICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEwICsgdG1wMTEsIFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEwIC0gdG1wMTEsIFBBU1MxX0JJVFMpOworICAgIAorICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEzLCBGSVhfMF83NjUzNjY4NjUpLAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTIsIC0gRklYXzFfODQ3NzU5MDY1KSwKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDggLS0tIG5vdGUgcGFwZXIgb21pdHMgZmFjdG9yIG9mIHNxcnQoMikuCisgICAgICogY0sgcmVwcmVzZW50cyBjb3MoSypwaS8xNikuCisgICAgICogaTAuLmkzIGluIHRoZSBwYXBlciBhcmUgdG1wNC4udG1wNyBoZXJlLgorICAgICAqLworICAgIAorICAgIHoxID0gdG1wNCArIHRtcDc7CisgICAgejIgPSB0bXA1ICsgdG1wNjsKKyAgICB6MyA9IHRtcDQgKyB0bXA2OworICAgIHo0ID0gdG1wNSArIHRtcDc7CisgICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KKyAgICAKKyAgICB0bXA0ID0gTVVMVElQTFkodG1wNCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCisgICAgdG1wNSA9IE1VTFRJUExZKHRtcDUsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLworICAgIHRtcDYgPSBNVUxUSVBMWSh0bXA2LCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KKyAgICB0bXA3ID0gTVVMVElQTFkodG1wNywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KKyAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCisgICAgCisgICAgejMgKz0gejU7CisgICAgejQgKz0gejU7CisgICAgCisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gKERDVEVMRU0pIERFU0NBTEUodG1wNCArIHoxICsgejMsCisJCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjVdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNSArIHoyICsgejQsCisJCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNiArIHoyICsgejMsCisJCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNyArIHoxICsgejQsCisJCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfSVNMT1dfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qaWRjdGZsdC5jIGIvY29tbW9uL2pwZWcvamlkY3RmbHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTg4Y2UzCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamlkY3RmbHQuYwpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIGppZGN0Zmx0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZsb2F0aW5nLXBvaW50IGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogaW52ZXJzZSBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiAgSW4gdGhlIElKRyBjb2RlLCB0aGlzIHJvdXRpbmUKKyAqIG11c3QgYWxzbyBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIG9mIHRoZSBpbnB1dCBjb2VmZmljaWVudHMuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgbW9yZSBhY2N1cmF0ZSB0aGFuIGVpdGhlciBvZiB0aGUgaW50ZWdlcgorICogSURDVCBpbXBsZW1lbnRhdGlvbnMuICBIb3dldmVyLCBpdCBtYXkgbm90IGdpdmUgdGhlIHNhbWUgcmVzdWx0cyBvbiBhbGwKKyAqIG1hY2hpbmVzIGJlY2F1c2Ugb2YgZGlmZmVyZW5jZXMgaW4gcm91bmRvZmYgYmVoYXZpb3IuICBTcGVlZCB3aWxsIGRlcGVuZAorICogb24gdGhlIGhhcmR3YXJlJ3MgZmxvYXRpbmcgcG9pbnQgY2FwYWNpdHkuCisgKgorICogQSAyLUQgSURDVCBjYW4gYmUgZG9uZSBieSAxLUQgSURDVCBvbiBlYWNoIGNvbHVtbiBmb2xsb3dlZCBieSAxLUQgSURDVAorICogb24gZWFjaCByb3cgKG9yIHZpY2UgdmVyc2EsIGJ1dCBpdCdzIG1vcmUgY29udmVuaWVudCB0byBlbWl0IGEgcm93IGF0CisgKiBhIHRpbWUpLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUgbXVjaCBtb3JlCisgKiBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgorICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KKyAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAorICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKKyAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgorICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCisgKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCisgKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCisgKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KKyAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCisgKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgorICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBhIGZpeGVkLXBvaW50CisgKiBpbXBsZW1lbnRhdGlvbiwgYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICogc2NhbGVkIHF1YW50aXphdGlvbiB2YWx1ZXMuICBIb3dldmVyLCB0aGF0IHByb2JsZW0gZG9lcyBub3QgYXJpc2UgaWYKKyAqIHdlIHVzZSBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQorICogZW50cnk7IHByb2R1Y2UgYSBmbG9hdCByZXN1bHQuCisgKi8KKworI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICAoKChGQVNUX0ZMT0FUKSAoY29lZikpICogKHF1YW50dmFsKSkKKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF9mbG9hdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIEZBU1RfRkxPQVQgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgRkFTVF9GTE9BVCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgRkFTVF9GTE9BVCB6NSwgejEwLCB6MTEsIHoxMiwgejEzOworICBKQ09FRlBUUiBpbnB0cjsKKyAgRkxPQVRfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIEZBU1RfRkxPQVQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl07IC8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKEZMT0FUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGN0ci0tKSB7CisgICAgLyogRHVlIHRvIHF1YW50aXphdGlvbiwgd2Ugd2lsbCB1c3VhbGx5IGZpbmQgdGhhdCBtYW55IG9mIHRoZSBpbnB1dAorICAgICAqIGNvZWZmaWNpZW50cyBhcmUgemVybywgZXNwZWNpYWxseSB0aGUgQUMgdGVybXMuICBXZSBjYW4gZXhwbG9pdCB0aGlzCisgICAgICogYnkgc2hvcnQtY2lyY3VpdGluZyB0aGUgSURDVCBjYWxjdWxhdGlvbiBmb3IgYW55IGNvbHVtbiBpbiB3aGljaCBhbGwKKyAgICAgKiB0aGUgQUMgdGVybXMgYXJlIHplcm8uICBJbiB0aGF0IGNhc2UgZWFjaCBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlCisgICAgICogREMgY29lZmZpY2llbnQgKHdpdGggc2NhbGUgZmFjdG9yIGFzIG5lZWRlZCkuCisgICAgICogV2l0aCB0eXBpY2FsIGltYWdlcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcywgaGFsZiBvciBtb3JlIG9mIHRoZQorICAgICAqIGNvbHVtbiBEQ1QgY2FsY3VsYXRpb25zIGNhbiBiZSBzaW1wbGlmaWVkIHRoaXMgd2F5LgorICAgICAqLworICAgIAorICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCisJaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNF0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBGQVNUX0ZMT0FUIGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICAgIAorICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo0XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo1XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo2XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo3XSA9IGRjdmFsOworICAgICAgCisgICAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICAgIHF1YW50cHRyKys7CisgICAgICB3c3B0cisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7CisgICAgdG1wMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOwkvKiBwaGFzZSAzICovCisgICAgdG1wMTEgPSB0bXAwIC0gdG1wMjsKKworICAgIHRtcDEzID0gdG1wMSArIHRtcDM7CS8qIHBoYXNlcyA1LTMgKi8KKyAgICB0bXAxMiA9ICh0bXAxIC0gdG1wMykgKiAoKEZBU1RfRkxPQVQpIDEuNDE0MjEzNTYyKSAtIHRtcDEzOyAvKiAyKmM0ICovCisKKyAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOworICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXA0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB0bXA1ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB0bXA2ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB0bXA3ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKKworICAgIHoxMyA9IHRtcDYgKyB0bXA1OwkJLyogcGhhc2UgNiAqLworICAgIHoxMCA9IHRtcDYgLSB0bXA1OworICAgIHoxMSA9IHRtcDQgKyB0bXA3OworICAgIHoxMiA9IHRtcDQgLSB0bXA3OworCisgICAgdG1wNyA9IHoxMSArIHoxMzsJCS8qIHBoYXNlIDUgKi8KKyAgICB0bXAxMSA9ICh6MTEgLSB6MTMpICogKChGQVNUX0ZMT0FUKSAxLjQxNDIxMzU2Mik7IC8qIDIqYzQgKi8KKworICAgIHo1ID0gKHoxMCArIHoxMikgKiAoKEZBU1RfRkxPQVQpIDEuODQ3NzU5MDY1KTsgLyogMipjMiAqLworICAgIHRtcDEwID0gKChGQVNUX0ZMT0FUKSAxLjA4MjM5MjIwMCkgKiB6MTIgLSB6NTsgLyogMiooYzItYzYpICovCisgICAgdG1wMTIgPSAoKEZBU1RfRkxPQVQpIC0yLjYxMzEyNTkzMCkgKiB6MTAgKyB6NTsgLyogLTIqKGMyK2M2KSAqLworCisgICAgdG1wNiA9IHRtcDEyIC0gdG1wNzsJLyogcGhhc2UgMiAqLworICAgIHRtcDUgPSB0bXAxMSAtIHRtcDY7CisgICAgdG1wNCA9IHRtcDEwICsgdG1wNTsKKworICAgIHdzcHRyW0RDVFNJWkUqMF0gPSB0bXAwICsgdG1wNzsKKyAgICB3c3B0cltEQ1RTSVpFKjddID0gdG1wMCAtIHRtcDc7CisgICAgd3NwdHJbRENUU0laRSoxXSA9IHRtcDEgKyB0bXA2OworICAgIHdzcHRyW0RDVFNJWkUqNl0gPSB0bXAxIC0gdG1wNjsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gdG1wMiArIHRtcDU7CisgICAgd3NwdHJbRENUU0laRSo1XSA9IHRtcDIgLSB0bXA1OworICAgIHdzcHRyW0RDVFNJWkUqNF0gPSB0bXAzICsgdG1wNDsKKyAgICB3c3B0cltEQ1RTSVpFKjNdID0gdG1wMyAtIHRtcDQ7CisKKyAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICBxdWFudHB0cisrOworICAgIHdzcHRyKys7CisgIH0KKyAgCisgIC8qIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisgIC8qIE5vdGUgdGhhdCB3ZSBtdXN0IGRlc2NhbGUgdGhlIHJlc3VsdHMgYnkgYSBmYWN0b3Igb2YgOCA9PSAyKiozLiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKyAgICAvKiBSb3dzIG9mIHplcm9lcyBjYW4gYmUgZXhwbG9pdGVkIGluIHRoZSBzYW1lIHdheSBhcyB3ZSBkaWQgd2l0aCBjb2x1bW5zLgorICAgICAqIEhvd2V2ZXIsIHRoZSBjb2x1bW4gY2FsY3VsYXRpb24gaGFzIGNyZWF0ZWQgbWFueSBub256ZXJvIEFDIHRlcm1zLCBzbworICAgICAqIHRoZSBzaW1wbGlmaWNhdGlvbiBhcHBsaWVzIGxlc3Mgb2Z0ZW4gKHR5cGljYWxseSA1JSB0byAxMCUgb2YgdGhlIHRpbWUpLgorICAgICAqIEFuZCB0ZXN0aW5nIGZsb2F0cyBmb3IgemVybyBpcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSwgc28gd2UgZG9uJ3QgYm90aGVyLgorICAgICAqLworICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMTAgPSB3c3B0clswXSArIHdzcHRyWzRdOworICAgIHRtcDExID0gd3NwdHJbMF0gLSB3c3B0cls0XTsKKworICAgIHRtcDEzID0gd3NwdHJbMl0gKyB3c3B0cls2XTsKKyAgICB0bXAxMiA9ICh3c3B0clsyXSAtIHdzcHRyWzZdKSAqICgoRkFTVF9GTE9BVCkgMS40MTQyMTM1NjIpIC0gdG1wMTM7CisKKyAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsKKyAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsKKyAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKKyAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MTMgPSB3c3B0cls1XSArIHdzcHRyWzNdOworICAgIHoxMCA9IHdzcHRyWzVdIC0gd3NwdHJbM107CisgICAgejExID0gd3NwdHJbMV0gKyB3c3B0cls3XTsKKyAgICB6MTIgPSB3c3B0clsxXSAtIHdzcHRyWzddOworCisgICAgdG1wNyA9IHoxMSArIHoxMzsKKyAgICB0bXAxMSA9ICh6MTEgLSB6MTMpICogKChGQVNUX0ZMT0FUKSAxLjQxNDIxMzU2Mik7CisKKyAgICB6NSA9ICh6MTAgKyB6MTIpICogKChGQVNUX0ZMT0FUKSAxLjg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KKyAgICB0bXAxMCA9ICgoRkFTVF9GTE9BVCkgMS4wODIzOTIyMDApICogejEyIC0gejU7IC8qIDIqKGMyLWM2KSAqLworICAgIHRtcDEyID0gKChGQVNUX0ZMT0FUKSAtMi42MTMxMjU5MzApICogejEwICsgejU7IC8qIC0yKihjMitjNikgKi8KKworICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CisgICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKKyAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBzY2FsZSBkb3duIGJ5IGEgZmFjdG9yIG9mIDggYW5kIHJhbmdlLWxpbWl0ICovCisKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDAgKyB0bXA3KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMCAtIHRtcDcpLCAzKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAxICsgdG1wNiksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDEgLSB0bXA2KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMiArIHRtcDUpLCAzKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAyIC0gdG1wNSksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDMgKyB0bXA0KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMyAtIHRtcDQpLCAzKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgCisgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfRkxPQVRfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qaWRjdGZzdC5jIGIvY29tbW9uL2pwZWcvamlkY3Rmc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmE0MjE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamlkY3Rmc3QuYwpAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIGppZGN0ZnN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZhc3QsIG5vdCBzbyBhY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogaW52ZXJzZSBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiAgSW4gdGhlIElKRyBjb2RlLCB0aGlzIHJvdXRpbmUKKyAqIG11c3QgYWxzbyBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIG9mIHRoZSBpbnB1dCBjb2VmZmljaWVudHMuCisgKgorICogQSAyLUQgSURDVCBjYW4gYmUgZG9uZSBieSAxLUQgSURDVCBvbiBlYWNoIGNvbHVtbiBmb2xsb3dlZCBieSAxLUQgSURDVAorICogb24gZWFjaCByb3cgKG9yIHZpY2UgdmVyc2EsIGJ1dCBpdCdzIG1vcmUgY29udmVuaWVudCB0byBlbWl0IGEgcm93IGF0CisgKiBhIHRpbWUpLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUgbXVjaCBtb3JlCisgKiBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgorICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KKyAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAorICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKKyAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgorICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCisgKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCisgKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCisgKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KKyAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCisgKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgorICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBmaXhlZC1wb2ludCBtYXRoLAorICogYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2FsZWQKKyAqIHF1YW50aXphdGlvbiB2YWx1ZXMuICBUaGUgc21hbGxlciB0aGUgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJ5LCB0aGUgbGVzcworICogcHJlY2lzZSB0aGUgc2NhbGVkIHZhbHVlLCBzbyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgd29yc2Ugd2l0aCBoaWdoLQorICogcXVhbGl0eS1zZXR0aW5nIGZpbGVzIHRoYW4gd2l0aCBsb3ctcXVhbGl0eSBvbmVzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qIFNjYWxpbmcgZGVjaXNpb25zIGFyZSBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgaW4gdGhlIExMJk0gYWxnb3JpdGhtOworICogc2VlIGppZGN0aW50LmMgZm9yIG1vcmUgZGV0YWlscy4gIEhvd2V2ZXIsIHdlIGNob29zZSB0byBkZXNjYWxlCisgKiAocmlnaHQgc2hpZnQpIG11bHRpcGxpY2F0aW9uIHByb2R1Y3RzIGFzIHNvb24gYXMgdGhleSBhcmUgZm9ybWVkLAorICogcmF0aGVyIHRoYW4gY2FycnlpbmcgYWRkaXRpb25hbCBmcmFjdGlvbmFsIGJpdHMgaW50byBzdWJzZXF1ZW50IGFkZGl0aW9ucy4KKyAqIFRoaXMgY29tcHJvbWlzZXMgYWNjdXJhY3kgc2xpZ2h0bHksIGJ1dCBpdCBsZXRzIHVzIHNhdmUgYSBmZXcgc2hpZnRzLgorICogTW9yZSBpbXBvcnRhbnRseSwgMTYtYml0IGFyaXRobWV0aWMgaXMgdGhlbiBhZGVxdWF0ZSAoZm9yIDgtYml0IHNhbXBsZXMpCisgKiBldmVyeXdoZXJlIGV4Y2VwdCBpbiB0aGUgbXVsdGlwbGljYXRpb25zIHByb3BlcjsgdGhpcyBzYXZlcyBhIGdvb2QgZGVhbAorICogb2Ygd29yayBvbiAxNi1iaXQtaW50IG1hY2hpbmVzLgorICoKKyAqIFRoZSBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgYXJlIG5vdCBpbnRlZ2VycyBiZWNhdXNlIHRoZSBBQSZOIHNjYWxpbmcKKyAqIGZhY3RvcnMgaGF2ZSBiZWVuIGluY29ycG9yYXRlZC4gIFdlIHJlcHJlc2VudCB0aGVtIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTLAorICogc28gdGhhdCB0aGUgZmlyc3QgYW5kIHNlY29uZCBJRENUIHJvdW5kcyBoYXZlIHRoZSBzYW1lIGlucHV0IHNjYWxpbmcuCisgKiBGb3IgOC1iaXQgSlNBTVBMRXMsIHdlIGNob29zZSBJRkFTVF9TQ0FMRV9CSVRTID0gUEFTUzFfQklUUyBzbyBhcyB0bworICogYXZvaWQgYSBkZXNjYWxpbmcgc2hpZnQ7IHRoaXMgY29tcHJvbWlzZXMgYWNjdXJhY3kgcmF0aGVyIGRyYXN0aWNhbGx5CisgKiBmb3Igc21hbGwgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJpZXMsIGJ1dCBpdCBzYXZlcyBhIGxvdCBvZiBzaGlmdHMuCisgKiBGb3IgMTItYml0IEpTQU1QTEVzLCB0aGVyZSdzIG5vIGhvcGUgb2YgdXNpbmcgMTZ4MTYgbXVsdGlwbGllcyBhbnl3YXksCisgKiBzbyB3ZSB1c2UgYSBtdWNoIGxhcmdlciBzY2FsaW5nIGZhY3RvciB0byBwcmVzZXJ2ZSBhY2N1cmFjeS4KKyAqCisgKiBBIGZpbmFsIGNvbXByb21pc2UgaXMgdG8gcmVwcmVzZW50IHRoZSBtdWx0aXBsaWNhdGl2ZSBjb25zdGFudHMgdG8gb25seQorICogOCBmcmFjdGlvbmFsIGJpdHMsIHJhdGhlciB0aGFuIDEzLiAgVGhpcyBzYXZlcyBzb21lIHNoaWZ0aW5nIHdvcmsgb24gc29tZQorICogbWFjaGluZXMsIGFuZCBtYXkgYWxzbyByZWR1Y2UgdGhlIGNvc3Qgb2YgbXVsdGlwbGljYXRpb24gKHNpbmNlIHRoZXJlCisgKiBhcmUgZmV3ZXIgb25lLWJpdHMgaW4gdGhlIGNvbnN0YW50cykuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIENPTlNUX0JJVFMgIDgKKyNkZWZpbmUgUEFTUzFfQklUUyAgMgorI2Vsc2UKKyNkZWZpbmUgQ09OU1RfQklUUyAgOAorI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLworI2VuZGlmCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSA4CisjZGVmaW5lIEZJWF8xXzA4MjM5MjIwMCAgKChJTlQzMikgIDI3NykJCS8qIEZJWCgxLjA4MjM5MjIwMCkgKi8KKyNkZWZpbmUgRklYXzFfNDE0MjEzNTYyICAoKElOVDMyKSAgMzYyKQkJLyogRklYKDEuNDE0MjEzNTYyKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICA0NzMpCQkvKiBGSVgoMS44NDc3NTkwNjUpICovCisjZGVmaW5lIEZJWF8yXzYxMzEyNTkzMCAgKChJTlQzMikgIDY2OSkJCS8qIEZJWCgyLjYxMzEyNTkzMCkgKi8KKyNlbHNlCisjZGVmaW5lIEZJWF8xXzA4MjM5MjIwMCAgRklYKDEuMDgyMzkyMjAwKQorI2RlZmluZSBGSVhfMV80MTQyMTM1NjIgIEZJWCgxLjQxNDIxMzU2MikKKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICBGSVgoMS44NDc3NTkwNjUpCisjZGVmaW5lIEZJWF8yXzYxMzEyNTkzMCAgRklYKDIuNjEzMTI1OTMwKQorI2VuZGlmCisKKworLyogV2UgY2FuIGdhaW4gYSBsaXR0bGUgbW9yZSBzcGVlZCwgd2l0aCBhIGZ1cnRoZXIgY29tcHJvbWlzZSBpbiBhY2N1cmFjeSwKKyAqIGJ5IG9taXR0aW5nIHRoZSBhZGRpdGlvbiBpbiBhIGRlc2NhbGluZyBzaGlmdC4gIFRoaXMgeWllbGRzIGFuIGluY29ycmVjdGx5CisgKiByb3VuZGVkIHJlc3VsdCBoYWxmIHRoZSB0aW1lLi4uCisgKi8KKworI2lmbmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKKyN1bmRlZiBERVNDQUxFCisjZGVmaW5lIERFU0NBTEUoeCxuKSAgUklHSFRfU0hJRlQoeCwgbikKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGEgRENURUxFTSB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCwgYW5kIGltbWVkaWF0ZWx5CisgKiBkZXNjYWxlIHRvIHlpZWxkIGEgRENURUxFTSByZXN1bHQuCisgKi8KKworI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKERDVEVMRU0pIERFU0NBTEUoKHZhcikgKiAoY29uc3QpLCBDT05TVF9CSVRTKSkKKworCisvKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKKyAqIGVudHJ5OyBwcm9kdWNlIGEgRENURUxFTSByZXN1bHQuICBGb3IgOC1iaXQgZGF0YSBhIDE2eDE2LT4xNgorICogbXVsdGlwbGljYXRpb24gd2lsbCBkby4gIEZvciAxMi1iaXQgZGF0YSwgdGhlIG11bHRpcGxpZXIgdGFibGUgaXMKKyAqIGRlY2xhcmVkIElOVDMyLCBzbyBhIDMyLWJpdCBtdWx0aXBseSB3aWxsIGJlIHVzZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElGQVNUX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCisjZWxzZQorI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICBcCisJREVTQ0FMRSgoY29lZikqKHF1YW50dmFsKSwgSUZBU1RfU0NBTEVfQklUUy1QQVNTMV9CSVRTKQorI2VuZGlmCisKKworLyogTGlrZSBERVNDQUxFLCBidXQgYXBwbGllcyB0byBhIERDVEVMRU0gYW5kIHByb2R1Y2VzIGFuIGludC4KKyAqIFdlIGFzc3VtZSB0aGF0IGludCByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCBpZiBJTlQzMiByaWdodCBzaGlmdCBpcy4KKyAqLworCisjaWZkZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKyNkZWZpbmUgSVNISUZUX1RFTVBTCURDVEVMRU0gaXNoaWZ0X3RlbXA7CisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgRENURUxFTUJJVFMgIDE2CQkvKiBEQ1RFTEVNIG1heSBiZSAxNiBvciAzMiBiaXRzICovCisjZWxzZQorI2RlZmluZSBEQ1RFTEVNQklUUyAgMzIJCS8qIERDVEVMRU0gbXVzdCBiZSAzMiBiaXRzICovCisjZW5kaWYKKyNkZWZpbmUgSVJJR0hUX1NISUZUKHgsc2hmdCkgIFwKKyAgICAoKGlzaGlmdF90ZW1wID0gKHgpKSA8IDAgPyBcCisgICAgIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpIHwgKCh+KChEQ1RFTEVNKSAwKSkgPDwgKERDVEVMRU1CSVRTLShzaGZ0KSkpIDogXAorICAgICAoaXNoaWZ0X3RlbXAgPj4gKHNoZnQpKSkKKyNlbHNlCisjZGVmaW5lIElTSElGVF9URU1QUworI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KQkoKHgpID4+IChzaGZ0KSkKKyNlbmRpZgorCisjaWZkZWYgVVNFX0FDQ1VSQVRFX1JPVU5ESU5HCisjZGVmaW5lIElERVNDQUxFKHgsbikgICgoaW50KSBJUklHSFRfU0hJRlQoKHgpICsgKDEgPDwgKChuKS0xKSksIG4pKQorI2Vsc2UKKyNkZWZpbmUgSURFU0NBTEUoeCxuKSAgKChpbnQpIElSSUdIVF9TSElGVCh4LCBuKSkKKyNlbmRpZgorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0X2lmYXN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgRENURUxFTSB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBEQ1RFTEVNIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBEQ1RFTEVNIHo1LCB6MTAsIHoxMSwgejEyLCB6MTM7CisgIEpDT0VGUFRSIGlucHRyOworICBJRkFTVF9NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgaW50ICogd3NwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgaW50IGN0cjsKKyAgaW50IHdvcmtzcGFjZVtEQ1RTSVpFMl07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUwkJCS8qIGZvciBERVNDQUxFICovCisgIElTSElGVF9URU1QUwkJCS8qIGZvciBJREVTQ0FMRSAqLworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElGQVNUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGN0ci0tKSB7CisgICAgLyogRHVlIHRvIHF1YW50aXphdGlvbiwgd2Ugd2lsbCB1c3VhbGx5IGZpbmQgdGhhdCBtYW55IG9mIHRoZSBpbnB1dAorICAgICAqIGNvZWZmaWNpZW50cyBhcmUgemVybywgZXNwZWNpYWxseSB0aGUgQUMgdGVybXMuICBXZSBjYW4gZXhwbG9pdCB0aGlzCisgICAgICogYnkgc2hvcnQtY2lyY3VpdGluZyB0aGUgSURDVCBjYWxjdWxhdGlvbiBmb3IgYW55IGNvbHVtbiBpbiB3aGljaCBhbGwKKyAgICAgKiB0aGUgQUMgdGVybXMgYXJlIHplcm8uICBJbiB0aGF0IGNhc2UgZWFjaCBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlCisgICAgICogREMgY29lZmZpY2llbnQgKHdpdGggc2NhbGUgZmFjdG9yIGFzIG5lZWRlZCkuCisgICAgICogV2l0aCB0eXBpY2FsIGltYWdlcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcywgaGFsZiBvciBtb3JlIG9mIHRoZQorICAgICAqIGNvbHVtbiBEQ1QgY2FsY3VsYXRpb25zIGNhbiBiZSBzaW1wbGlmaWVkIHRoaXMgd2F5LgorICAgICAqLworICAgIAorICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCisJaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNF0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBpbnQgZGN2YWwgPSAoaW50KSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworCisgICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjRdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjVdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjZdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjddID0gZGN2YWw7CisgICAgICAKKyAgICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgICAgcXVhbnRwdHIrKzsKKyAgICAgIHdzcHRyKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB0bXAyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB0bXAzID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDI7CS8qIHBoYXNlIDMgKi8KKyAgICB0bXAxMSA9IHRtcDAgLSB0bXAyOworCisgICAgdG1wMTMgPSB0bXAxICsgdG1wMzsJLyogcGhhc2VzIDUtMyAqLworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMSAtIHRtcDMsIEZJWF8xXzQxNDIxMzU2MikgLSB0bXAxMzsgLyogMipjNCAqLworCisgICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsKKyAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKKyAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wNCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgdG1wNSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgdG1wNiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgdG1wNyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisKKyAgICB6MTMgPSB0bXA2ICsgdG1wNTsJCS8qIHBoYXNlIDYgKi8KKyAgICB6MTAgPSB0bXA2IC0gdG1wNTsKKyAgICB6MTEgPSB0bXA0ICsgdG1wNzsKKyAgICB6MTIgPSB0bXA0IC0gdG1wNzsKKworICAgIHRtcDcgPSB6MTEgKyB6MTM7CQkvKiBwaGFzZSA1ICovCisgICAgdG1wMTEgPSBNVUxUSVBMWSh6MTEgLSB6MTMsIEZJWF8xXzQxNDIxMzU2Mik7IC8qIDIqYzQgKi8KKworICAgIHo1ID0gTVVMVElQTFkoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOyAvKiAyKmMyICovCisgICAgdG1wMTAgPSBNVUxUSVBMWSh6MTIsIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsgLyogMiooYzItYzYpICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh6MTAsIC0gRklYXzJfNjEzMTI1OTMwKSArIHo1OyAvKiAtMiooYzIrYzYpICovCisKKyAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwkvKiBwaGFzZSAyICovCisgICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKKyAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OworCisgICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpICh0bXAwICsgdG1wNyk7CisgICAgd3NwdHJbRENUU0laRSo3XSA9IChpbnQpICh0bXAwIC0gdG1wNyk7CisgICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpICh0bXAxICsgdG1wNik7CisgICAgd3NwdHJbRENUU0laRSo2XSA9IChpbnQpICh0bXAxIC0gdG1wNik7CisgICAgd3NwdHJbRENUU0laRSoyXSA9IChpbnQpICh0bXAyICsgdG1wNSk7CisgICAgd3NwdHJbRENUU0laRSo1XSA9IChpbnQpICh0bXAyIC0gdG1wNSk7CisgICAgd3NwdHJbRENUU0laRSo0XSA9IChpbnQpICh0bXAzICsgdG1wNCk7CisgICAgd3NwdHJbRENUU0laRSozXSA9IChpbnQpICh0bXAzIC0gdG1wNCk7CisKKyAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICBxdWFudHB0cisrOworICAgIHdzcHRyKys7CisgIH0KKyAgCisgIC8qIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisgIC8qIE5vdGUgdGhhdCB3ZSBtdXN0IGRlc2NhbGUgdGhlIHJlc3VsdHMgYnkgYSBmYWN0b3Igb2YgOCA9PSAyKiozLCAqLworICAvKiBhbmQgYWxzbyB1bmRvIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworICAgIC8qIFJvd3Mgb2YgemVyb2VzIGNhbiBiZSBleHBsb2l0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIGRpZCB3aXRoIGNvbHVtbnMuCisgICAgICogSG93ZXZlciwgdGhlIGNvbHVtbiBjYWxjdWxhdGlvbiBoYXMgY3JlYXRlZCBtYW55IG5vbnplcm8gQUMgdGVybXMsIHNvCisgICAgICogdGhlIHNpbXBsaWZpY2F0aW9uIGFwcGxpZXMgbGVzcyBvZnRlbiAodHlwaWNhbGx5IDUlIHRvIDEwJSBvZiB0aGUgdGltZSkuCisgICAgICogT24gbWFjaGluZXMgd2l0aCB2ZXJ5IGZhc3QgbXVsdGlwbGljYXRpb24sIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKKyAgICAgKiB0ZXN0IHRha2VzIG1vcmUgdGltZSB0aGFuIGl0J3Mgd29ydGguICBJbiB0aGF0IGNhc2UgdGhpcyBzZWN0aW9uCisgICAgICogbWF5IGJlIGNvbW1lbnRlZCBvdXQuCisgICAgICovCisgICAgCisjaWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKKyAgICBpZiAod3NwdHJbMV0gPT0gMCAmJiB3c3B0clsyXSA9PSAwICYmIHdzcHRyWzNdID09IDAgJiYgd3NwdHJbNF0gPT0gMCAmJgorCXdzcHRyWzVdID09IDAgJiYgd3NwdHJbNl0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCisJCQkJICAmIFJBTkdFX01BU0tdOworICAgICAgCisgICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsxXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzJdID0gZGN2YWw7CisgICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls0XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzVdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNl0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls3XSA9IGRjdmFsOworCisgICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgICAgICBjb250aW51ZTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDEwID0gKChEQ1RFTEVNKSB3c3B0clswXSArIChEQ1RFTEVNKSB3c3B0cls0XSk7CisgICAgdG1wMTEgPSAoKERDVEVMRU0pIHdzcHRyWzBdIC0gKERDVEVMRU0pIHdzcHRyWzRdKTsKKworICAgIHRtcDEzID0gKChEQ1RFTEVNKSB3c3B0clsyXSArIChEQ1RFTEVNKSB3c3B0cls2XSk7CisgICAgdG1wMTIgPSBNVUxUSVBMWSgoRENURUxFTSkgd3NwdHJbMl0gLSAoRENURUxFTSkgd3NwdHJbNl0sIEZJWF8xXzQxNDIxMzU2MikKKwkgICAgLSB0bXAxMzsKKworICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOworICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOworICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHoxMyA9IChEQ1RFTEVNKSB3c3B0cls1XSArIChEQ1RFTEVNKSB3c3B0clszXTsKKyAgICB6MTAgPSAoRENURUxFTSkgd3NwdHJbNV0gLSAoRENURUxFTSkgd3NwdHJbM107CisgICAgejExID0gKERDVEVMRU0pIHdzcHRyWzFdICsgKERDVEVMRU0pIHdzcHRyWzddOworICAgIHoxMiA9IChEQ1RFTEVNKSB3c3B0clsxXSAtIChEQ1RFTEVNKSB3c3B0cls3XTsKKworICAgIHRtcDcgPSB6MTEgKyB6MTM7CQkvKiBwaGFzZSA1ICovCisgICAgdG1wMTEgPSBNVUxUSVBMWSh6MTEgLSB6MTMsIEZJWF8xXzQxNDIxMzU2Mik7IC8qIDIqYzQgKi8KKworICAgIHo1ID0gTVVMVElQTFkoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOyAvKiAyKmMyICovCisgICAgdG1wMTAgPSBNVUxUSVBMWSh6MTIsIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsgLyogMiooYzItYzYpICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh6MTAsIC0gRklYXzJfNjEzMTI1OTMwKSArIHo1OyAvKiAtMiooYzIrYzYpICovCisKKyAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwkvKiBwaGFzZSAyICovCisgICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKKyAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBzY2FsZSBkb3duIGJ5IGEgZmFjdG9yIG9mIDggYW5kIHJhbmdlLWxpbWl0ICovCisKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwICsgdG1wNywgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzddID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMCAtIHRtcDcsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDEgKyB0bXA2LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAxIC0gdG1wNiwgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiArIHRtcDUsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDIgLSB0bXA1LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzICsgdG1wNCwgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMyAtIHRtcDQsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworCisgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfSUZBU1RfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qaWRjdGludC5jIGIvY29tbW9uL2pwZWcvamlkY3RpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJiMzIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvamlkY3RpbnQuYwpAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIGppZGN0aW50LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuICBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgcm91dGluZQorICogbXVzdCBhbHNvIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0IGNvZWZmaWNpZW50cy4KKyAqCisgKiBBIDItRCBJRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBJRENUIG9uIGVhY2ggY29sdW1uIGZvbGxvd2VkIGJ5IDEtRCBJRENUCisgKiBvbiBlYWNoIHJvdyAob3IgdmljZSB2ZXJzYSwgYnV0IGl0J3MgbW9yZSBjb252ZW5pZW50IHRvIGVtaXQgYSByb3cgYXQKKyAqIGEgdGltZSkuICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZSBtdWNoIG1vcmUKKyAqIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbGdvcml0aG0gZGVzY3JpYmVkIGluCisgKiAgIEMuIExvZWZmbGVyLCBBLiBMaWd0ZW5iZXJnIGFuZCBHLiBNb3NjaHl0eiwgIlByYWN0aWNhbCBGYXN0IDEtRCBEQ1QKKyAqICAgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9ucyIsIFByb2MuIEludCdsLiBDb25mLiBvbiBBY291c3RpY3MsCisgKiAgIFNwZWVjaCwgYW5kIFNpZ25hbCBQcm9jZXNzaW5nIDE5ODkgKElDQVNTUCAnODkpLCBwcC4gOTg4LTk5MS4KKyAqIFRoZSBwcmltYXJ5IGFsZ29yaXRobSBkZXNjcmliZWQgdGhlcmUgdXNlcyAxMSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzLgorICogV2UgdXNlIHRoZWlyIGFsdGVybmF0ZSBtZXRob2Qgd2l0aCAxMiBtdWx0aXBsaWVzIGFuZCAzMiBhZGRzLgorICogVGhlIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IG5vIGRhdGEgcGF0aCBjb250YWlucyBtb3JlIHRoYW4gb25lCisgKiBtdWx0aXBsaWNhdGlvbjsgdGhpcyBhbGxvd3MgYSB2ZXJ5IHNpbXBsZSBhbmQgYWNjdXJhdGUgaW1wbGVtZW50YXRpb24gaW4KKyAqIHNjYWxlZCBmaXhlZC1wb2ludCBhcml0aG1ldGljLCB3aXRoIGEgbWluaW1hbCBudW1iZXIgb2Ygc2hpZnRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qCisgKiBUaGUgcG9vcCBvbiB0aGlzIHNjYWxpbmcgc3R1ZmYgaXMgYXMgZm9sbG93czoKKyAqCisgKiBFYWNoIDEtRCBJRENUIHN0ZXAgcHJvZHVjZXMgb3V0cHV0cyB3aGljaCBhcmUgYSBmYWN0b3Igb2Ygc3FydChOKQorICogbGFyZ2VyIHRoYW4gdGhlIHRydWUgSURDVCBvdXRwdXRzLiAgVGhlIGZpbmFsIG91dHB1dHMgYXJlIHRoZXJlZm9yZQorICogYSBmYWN0b3Igb2YgTiBsYXJnZXIgdGhhbiBkZXNpcmVkOyBzaW5jZSBOPTggdGhpcyBjYW4gYmUgY3VyZWQgYnkKKyAqIGEgc2ltcGxlIHJpZ2h0IHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGFsZ29yaXRobS4gIFRoZSBhZHZhbnRhZ2Ugb2YKKyAqIHRoaXMgYXJyYW5nZW1lbnQgaXMgdGhhdCB3ZSBzYXZlIHR3byBtdWx0aXBsaWNhdGlvbnMgcGVyIDEtRCBJRENULAorICogYmVjYXVzZSB0aGUgeTAgYW5kIHk0IGlucHV0cyBuZWVkIG5vdCBiZSBkaXZpZGVkIGJ5IHNxcnQoTikuCisgKgorICogV2UgaGF2ZSB0byBkbyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gb2YgdGhlIGludGVnZXIgaW5wdXRzLCB3aGljaAorICogaXMgbm8gcHJvYmxlbSwgYW5kIG11bHRpcGxpY2F0aW9uIGJ5IGZyYWN0aW9uYWwgY29uc3RhbnRzLCB3aGljaCBpcworICogYSBwcm9ibGVtIHRvIGRvIGluIGludGVnZXIgYXJpdGhtZXRpYy4gIFdlIG11bHRpcGx5IGFsbCB0aGUgY29uc3RhbnRzCisgKiBieSBDT05TVF9TQ0FMRSBhbmQgY29udmVydCB0aGVtIHRvIGludGVnZXIgY29uc3RhbnRzICh0aHVzIHJldGFpbmluZworICogQ09OU1RfQklUUyBiaXRzIG9mIHByZWNpc2lvbiBpbiB0aGUgY29uc3RhbnRzKS4gIEFmdGVyIGRvaW5nIGEKKyAqIG11bHRpcGxpY2F0aW9uIHdlIGhhdmUgdG8gZGl2aWRlIHRoZSBwcm9kdWN0IGJ5IENPTlNUX1NDQUxFLCB3aXRoIHByb3BlcgorICogcm91bmRpbmcsIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3Qgb3V0cHV0LiAgVGhpcyBkaXZpc2lvbiBjYW4gYmUgZG9uZQorICogY2hlYXBseSBhcyBhIHJpZ2h0IHNoaWZ0IG9mIENPTlNUX0JJVFMgYml0cy4gIFdlIHBvc3Rwb25lIHNoaWZ0aW5nCisgKiBhcyBsb25nIGFzIHBvc3NpYmxlIHNvIHRoYXQgcGFydGlhbCBzdW1zIGNhbiBiZSBhZGRlZCB0b2dldGhlciB3aXRoCisgKiBmdWxsIGZyYWN0aW9uYWwgcHJlY2lzaW9uLgorICoKKyAqIFRoZSBvdXRwdXRzIG9mIHRoZSBmaXJzdCBwYXNzIGFyZSBzY2FsZWQgdXAgYnkgUEFTUzFfQklUUyBiaXRzIHNvIHRoYXQKKyAqIHRoZXkgYXJlIHJlcHJlc2VudGVkIHRvIGJldHRlci10aGFuLWludGVncmFsIHByZWNpc2lvbi4gIFRoZXNlIG91dHB1dHMKKyAqIHJlcXVpcmUgQklUU19JTl9KU0FNUExFICsgUEFTUzFfQklUUyArIDMgYml0czsgdGhpcyBmaXRzIGluIGEgMTYtYml0IHdvcmQKKyAqIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcuICAoVG8gc2NhbGUgdXAgMTItYml0IHNhbXBsZSBkYXRhIGZ1cnRoZXIsIGFuCisgKiBpbnRlcm1lZGlhdGUgSU5UMzIgYXJyYXkgd291bGQgYmUgbmVlZGVkLikKKyAqCisgKiBUbyBhdm9pZCBvdmVyZmxvdyBvZiB0aGUgMzItYml0IGludGVybWVkaWF0ZSByZXN1bHRzIGluIHBhc3MgMiwgd2UgbXVzdAorICogaGF2ZSBCSVRTX0lOX0pTQU1QTEUgKyBDT05TVF9CSVRTICsgUEFTUzFfQklUUyA8PSAyNi4gIEVycm9yIGFuYWx5c2lzCisgKiBzaG93cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgYXJlIHRoZSBtb3N0IGVmZmVjdGl2ZS4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgQ09OU1RfQklUUyAgMTMKKyNkZWZpbmUgUEFTUzFfQklUUyAgMgorI2Vsc2UKKyNkZWZpbmUgQ09OU1RfQklUUyAgMTMKKyNkZWZpbmUgUEFTUzFfQklUUyAgMQkJLyogbG9zZSBhIGxpdHRsZSBwcmVjaXNpb24gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyNlbmRpZgorCisvKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKKyAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgorICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KKyAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KKyAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCisgKi8KKworI2lmIENPTlNUX0JJVFMgPT0gMTMKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICAoKElOVDMyKSAgMjQ0NikJLyogRklYKDAuMjk4NjMxMzM2KSAqLworI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgICgoSU5UMzIpICAzMTk2KQkvKiBGSVgoMC4zOTAxODA2NDQpICovCisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgKChJTlQzMikgIDQ0MzMpCS8qIEZJWCgwLjU0MTE5NjEwMCkgKi8KKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoKElOVDMyKSAgNjI3MCkJLyogRklYKDAuNzY1MzY2ODY1KSAqLworI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCisjZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiAgKChJTlQzMikgIDk2MzMpCS8qIEZJWCgxLjE3NTg3NTYwMikgKi8KKyNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICAoKElOVDMyKSAgMTIyOTkpCS8qIEZJWCgxLjUwMTMyMTExMCkgKi8KKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KKyNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICAoKElOVDMyKSAgMTYwNjkpCS8qIEZJWCgxLjk2MTU3MDU2MCkgKi8KKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICAoKElOVDMyKSAgMTY4MTkpCS8qIEZJWCgyLjA1MzExOTg2OSkgKi8KKyNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KKyNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICAoKElOVDMyKSAgMjUxNzIpCS8qIEZJWCgzLjA3MjcxMTAyNikgKi8KKyNlbHNlCisjZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAgRklYKDAuMjk4NjMxMzM2KQorI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgIEZJWCgwLjM5MDE4MDY0NCkKKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICBGSVgoMC41NDExOTYxMDApCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgRklYKDAuNzY1MzY2ODY1KQorI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgIEZJWCgwLjg5OTk3NjIyMykKKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICBGSVgoMS4xNzU4NzU2MDIpCisjZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAgRklYKDEuNTAxMzIxMTEwKQorI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKKyNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICBGSVgoMS45NjE1NzA1NjApCisjZGVmaW5lIEZJWF8yXzA1MzExOTg2OSAgRklYKDIuMDUzMTE5ODY5KQorI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgIEZJWCgyLjU2MjkxNTQ0NykKKyNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICBGSVgoMy4wNzI3MTEwMjYpCisjZW5kaWYKKworCisvKiBNdWx0aXBseSBhbiBJTlQzMiB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCB0byB5aWVsZCBhbiBJTlQzMiByZXN1bHQuCisgKiBGb3IgOC1iaXQgc2FtcGxlcyB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLCBhbGwgdGhlIHZhcmlhYmxlCisgKiBhbmQgY29uc3RhbnQgdmFsdWVzIGludm9sdmVkIGFyZSBubyBtb3JlIHRoYW4gMTYgYml0cyB3aWRlLCBzbyBhCisgKiAxNngxNi0+MzIgYml0IG11bHRpcGx5IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBmdWxsIDMyeDMyIG11bHRpcGx5LgorICogRm9yIDEyLWJpdCBzYW1wbGVzLCBhIGZ1bGwgMzItYml0IG11bHRpcGxpY2F0aW9uIHdpbGwgYmUgbmVlZGVkLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkKKyNlbHNlCisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgodmFyKSAqIChjb25zdCkpCisjZW5kaWYKKworCisvKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKKyAqIGVudHJ5OyBwcm9kdWNlIGFuIGludCByZXN1bHQuICBJbiB0aGlzIG1vZHVsZSwgYm90aCBpbnB1dHMgYW5kIHJlc3VsdAorICogYXJlIDE2IGJpdHMgb3IgbGVzcywgc28gZWl0aGVyIGludCBvciBzaG9ydCBtdWx0aXBseSB3aWxsIHdvcmsuCisgKi8KKworI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICAoKChJU0xPV19NVUxUX1RZUEUpIChjb2VmKSkgKiAocXVhbnR2YWwpKQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0X2lzbG93IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0LCB6NTsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBJRENUOyAqLworICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGN0ci0tKSB7CisgICAgLyogRHVlIHRvIHF1YW50aXphdGlvbiwgd2Ugd2lsbCB1c3VhbGx5IGZpbmQgdGhhdCBtYW55IG9mIHRoZSBpbnB1dAorICAgICAqIGNvZWZmaWNpZW50cyBhcmUgemVybywgZXNwZWNpYWxseSB0aGUgQUMgdGVybXMuICBXZSBjYW4gZXhwbG9pdCB0aGlzCisgICAgICogYnkgc2hvcnQtY2lyY3VpdGluZyB0aGUgSURDVCBjYWxjdWxhdGlvbiBmb3IgYW55IGNvbHVtbiBpbiB3aGljaCBhbGwKKyAgICAgKiB0aGUgQUMgdGVybXMgYXJlIHplcm8uICBJbiB0aGF0IGNhc2UgZWFjaCBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlCisgICAgICogREMgY29lZmZpY2llbnQgKHdpdGggc2NhbGUgZmFjdG9yIGFzIG5lZWRlZCkuCisgICAgICogV2l0aCB0eXBpY2FsIGltYWdlcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcywgaGFsZiBvciBtb3JlIG9mIHRoZQorICAgICAqIGNvbHVtbiBEQ1QgY2FsY3VsYXRpb25zIGNhbiBiZSBzaW1wbGlmaWVkIHRoaXMgd2F5LgorICAgICAqLworICAgIAorICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCisJaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNF0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBpbnQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pIDw8IFBBU1MxX0JJVFM7CisgICAgICAKKyAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqN10gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBxdWFudHB0cisrOworICAgICAgd3NwdHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQ6IHJldmVyc2UgdGhlIGV2ZW4gcGFydCBvZiB0aGUgZm9yd2FyZCBEQ1QuICovCisgICAgLyogVGhlIHJvdGF0b3IgaXMgc3FydCgyKSpjKC02KS4gKi8KKyAgICAKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworICAgIAorICAgIHoxID0gTVVMVElQTFkoejIgKyB6MywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICB0bXAyID0gejEgKyBNVUxUSVBMWSh6MywgLSBGSVhfMV84NDc3NTkwNjUpOworICAgIHRtcDMgPSB6MSArIE1VTFRJUExZKHoyLCBGSVhfMF83NjUzNjY4NjUpOworICAgIAorICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7CisKKyAgICB0bXAwID0gKHoyICsgejMpIDw8IENPTlNUX0JJVFM7CisgICAgdG1wMSA9ICh6MiAtIHozKSA8PCBDT05TVF9CSVRTOworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4OyB0aGUgbWF0cml4IGlzIHVuaXRhcnkgYW5kIGhlbmNlIGl0cworICAgICAqIHRyYW5zcG9zZSBpcyBpdHMgaW52ZXJzZS4gIGkwLi5pMyBhcmUgeTcseTUseTMseTEgcmVzcGVjdGl2ZWx5LgorICAgICAqLworICAgIAorICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworICAgIHRtcDEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHRtcDMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIAorICAgIHoxID0gdG1wMCArIHRtcDM7CisgICAgejIgPSB0bXAxICsgdG1wMjsKKyAgICB6MyA9IHRtcDAgKyB0bXAyOworICAgIHo0ID0gdG1wMSArIHRtcDM7CisgICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KKyAgICAKKyAgICB0bXAwID0gTVVMVElQTFkodG1wMCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCisgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KKyAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCisgICAgCisgICAgejMgKz0gejU7CisgICAgejQgKz0gejU7CisgICAgCisgICAgdG1wMCArPSB6MSArIHozOworICAgIHRtcDEgKz0gejIgKyB6NDsKKyAgICB0bXAyICs9IHoyICsgejM7CisgICAgdG1wMyArPSB6MSArIHo0OworICAgIAorICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogaW5wdXRzIGFyZSB0bXAxMC4udG1wMTMsIHRtcDAuLnRtcDMgKi8KKyAgICAKKyAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSo3XSA9IChpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDExICsgdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjZdID0gKGludCkgREVTQ0FMRSh0bXAxMSAtIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSoyXSA9IChpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqNV0gPSAoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgREVTQ0FMRSh0bXAxMyArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSo0XSA9IChpbnQpIERFU0NBTEUodG1wMTMgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIAorICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgIHF1YW50cHRyKys7CisgICAgd3NwdHIrKzsKKyAgfQorICAKKyAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKyAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCisgIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisgICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KKyAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KKyAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KKyAgICAgKiBPbiBtYWNoaW5lcyB3aXRoIHZlcnkgZmFzdCBtdWx0aXBsaWNhdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQorICAgICAqIHRlc3QgdGFrZXMgbW9yZSB0aW1lIHRoYW4gaXQncyB3b3J0aC4gIEluIHRoYXQgY2FzZSB0aGlzIHNlY3Rpb24KKyAgICAgKiBtYXkgYmUgY29tbWVudGVkIG91dC4KKyAgICAgKi8KKyAgICAKKyNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAorICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls0XSA9PSAwICYmCisJd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCisJCQkJICAmIFJBTkdFX01BU0tdOworICAgICAgCisgICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsxXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzJdID0gZGN2YWw7CisgICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls0XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzVdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNl0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls3XSA9IGRjdmFsOworCisgICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgICAgICBjb250aW51ZTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQ6IHJldmVyc2UgdGhlIGV2ZW4gcGFydCBvZiB0aGUgZm9yd2FyZCBEQ1QuICovCisgICAgLyogVGhlIHJvdGF0b3IgaXMgc3FydCgyKSpjKC02KS4gKi8KKyAgICAKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbMl07CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzZdOworICAgIAorICAgIHoxID0gTVVMVElQTFkoejIgKyB6MywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICB0bXAyID0gejEgKyBNVUxUSVBMWSh6MywgLSBGSVhfMV84NDc3NTkwNjUpOworICAgIHRtcDMgPSB6MSArIE1VTFRJUExZKHoyLCBGSVhfMF83NjUzNjY4NjUpOworICAgIAorICAgIHRtcDAgPSAoKElOVDMyKSB3c3B0clswXSArIChJTlQzMikgd3NwdHJbNF0pIDw8IENPTlNUX0JJVFM7CisgICAgdG1wMSA9ICgoSU5UMzIpIHdzcHRyWzBdIC0gKElOVDMyKSB3c3B0cls0XSkgPDwgQ09OU1RfQklUUzsKKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIAorICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgODsgdGhlIG1hdHJpeCBpcyB1bml0YXJ5IGFuZCBoZW5jZSBpdHMKKyAgICAgKiB0cmFuc3Bvc2UgaXMgaXRzIGludmVyc2UuICBpMC4uaTMgYXJlIHk3LHk1LHkzLHkxIHJlc3BlY3RpdmVseS4KKyAgICAgKi8KKyAgICAKKyAgICB0bXAwID0gKElOVDMyKSB3c3B0cls3XTsKKyAgICB0bXAxID0gKElOVDMyKSB3c3B0cls1XTsKKyAgICB0bXAyID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB0bXAzID0gKElOVDMyKSB3c3B0clsxXTsKKyAgICAKKyAgICB6MSA9IHRtcDAgKyB0bXAzOworICAgIHoyID0gdG1wMSArIHRtcDI7CisgICAgejMgPSB0bXAwICsgdG1wMjsKKyAgICB6NCA9IHRtcDEgKyB0bXAzOworICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCisgICAgCisgICAgdG1wMCA9IE1VTFRJUExZKHRtcDAsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLworICAgIHRtcDEgPSBNVUxUSVBMWSh0bXAxLCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KKyAgICB0bXAyID0gTVVMVElQTFkodG1wMiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCisgICAgdG1wMyA9IE1VTFRJUExZKHRtcDMsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLworICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KKyAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLworICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCisgICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLworICAgIAorICAgIHozICs9IHo1OworICAgIHo0ICs9IHo1OworICAgIAorICAgIHRtcDAgKz0gejEgKyB6MzsKKyAgICB0bXAxICs9IHoyICsgejQ7CisgICAgdG1wMiArPSB6MiArIHozOworICAgIHRtcDMgKz0gejEgKyB6NDsKKyAgICAKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IGlucHV0cyBhcmUgdG1wMTAuLnRtcDEzLCB0bXAwLi50bXAzICovCisgICAgCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDMsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMywKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTEgKyB0bXAyLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMSAtIHRtcDIsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyICsgdG1wMSwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAxLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMyArIHRtcDAsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEzIC0gdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIAorICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvamlkY3RyZWQuYyBiL2NvbW1vbi9qcGVnL2ppZGN0cmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxZjNjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2ppZGN0cmVkLmMKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBqaWRjdHJlZC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW52ZXJzZS1EQ1Qgcm91dGluZXMgdGhhdCBwcm9kdWNlIHJlZHVjZWQtc2l6ZSBvdXRwdXQ6CisgKiBlaXRoZXIgNHg0LCAyeDIsIG9yIDF4MSBwaXhlbHMgZnJvbSBhbiA4eDggRENUIGJsb2NrLgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgTG9lZmZsZXIsIExpZ3RlbmJlcmcgYW5kIE1vc2NoeXR6IChMTCZNKQorICogYWxnb3JpdGhtIHVzZWQgaW4gamlkY3RpbnQuYy4gIFdlIHNpbXBseSByZXBsYWNlIGVhY2ggOC10by04IDEtRCBJRENUIHN0ZXAKKyAqIHdpdGggYW4gOC10by00IHN0ZXAgdGhhdCBwcm9kdWNlcyB0aGUgZm91ciBhdmVyYWdlcyBvZiB0d28gYWRqYWNlbnQgb3V0cHV0cworICogKG9yIGFuIDgtdG8tMiBzdGVwIHByb2R1Y2luZyB0d28gYXZlcmFnZXMgb2YgZm91ciBvdXRwdXRzLCBmb3IgMngyIG91dHB1dCkuCisgKiBUaGVzZSBzdGVwcyB3ZXJlIGRlcml2ZWQgYnkgY29tcHV0aW5nIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBhdCB0aGUgZW5kCisgKiBvZiB0aGUgbm9ybWFsIExMJk0gY29kZSwgdGhlbiBzaW1wbGlmeWluZyBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICoKKyAqIDF4MSBpcyB0cml2aWFsOiBqdXN0IHRha2UgdGhlIERDIGNvZWZmaWNpZW50IGRpdmlkZWQgYnkgOC4KKyAqCisgKiBTZWUgamlkY3RpbnQuYyBmb3IgYWRkaXRpb25hbCBjb21tZW50cy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKiBTY2FsaW5nIGlzIHRoZSBzYW1lIGFzIGluIGppZGN0aW50LmMuICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLworI2VuZGlmCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSAxMworI2RlZmluZSBGSVhfMF8yMTExNjQyNDMgICgoSU5UMzIpICAxNzMwKQkvKiBGSVgoMC4yMTExNjQyNDMpICovCisjZGVmaW5lIEZJWF8wXzUwOTc5NTU3OSAgKChJTlQzMikgIDQxNzYpCS8qIEZJWCgwLjUwOTc5NTU3OSkgKi8KKyNkZWZpbmUgRklYXzBfNjAxMzQ0ODg3ICAoKElOVDMyKSAgNDkyNikJLyogRklYKDAuNjAxMzQ0ODg3KSAqLworI2RlZmluZSBGSVhfMF83MjA5NTk4MjIgICgoSU5UMzIpICA1OTA2KQkvKiBGSVgoMC43MjA5NTk4MjIpICovCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgKChJTlQzMikgIDYyNzApCS8qIEZJWCgwLjc2NTM2Njg2NSkgKi8KKyNkZWZpbmUgRklYXzBfODUwNDMwMDk1ICAoKElOVDMyKSAgNjk2NykJLyogRklYKDAuODUwNDMwMDk1KSAqLworI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCisjZGVmaW5lIEZJWF8xXzA2MTU5NDMzNyAgKChJTlQzMikgIDg2OTcpCS8qIEZJWCgxLjA2MTU5NDMzNykgKi8KKyNkZWZpbmUgRklYXzFfMjcyNzU4NTgwICAoKElOVDMyKSAgMTA0MjYpCS8qIEZJWCgxLjI3Mjc1ODU4MCkgKi8KKyNkZWZpbmUgRklYXzFfNDUxNzc0OTgxICAoKElOVDMyKSAgMTE4OTMpCS8qIEZJWCgxLjQ1MTc3NDk4MSkgKi8KKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KKyNkZWZpbmUgRklYXzJfMTcyNzM0ODAzICAoKElOVDMyKSAgMTc3OTkpCS8qIEZJWCgyLjE3MjczNDgwMykgKi8KKyNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KKyNkZWZpbmUgRklYXzNfNjI0NTA5Nzg1ICAoKElOVDMyKSAgMjk2OTIpCS8qIEZJWCgzLjYyNDUwOTc4NSkgKi8KKyNlbHNlCisjZGVmaW5lIEZJWF8wXzIxMTE2NDI0MyAgRklYKDAuMjExMTY0MjQzKQorI2RlZmluZSBGSVhfMF81MDk3OTU1NzkgIEZJWCgwLjUwOTc5NTU3OSkKKyNkZWZpbmUgRklYXzBfNjAxMzQ0ODg3ICBGSVgoMC42MDEzNDQ4ODcpCisjZGVmaW5lIEZJWF8wXzcyMDk1OTgyMiAgRklYKDAuNzIwOTU5ODIyKQorI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgIEZJWCgwLjc2NTM2Njg2NSkKKyNkZWZpbmUgRklYXzBfODUwNDMwMDk1ICBGSVgoMC44NTA0MzAwOTUpCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQorI2RlZmluZSBGSVhfMV8wNjE1OTQzMzcgIEZJWCgxLjA2MTU5NDMzNykKKyNkZWZpbmUgRklYXzFfMjcyNzU4NTgwICBGSVgoMS4yNzI3NTg1ODApCisjZGVmaW5lIEZJWF8xXzQ1MTc3NDk4MSAgRklYKDEuNDUxNzc0OTgxKQorI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKKyNkZWZpbmUgRklYXzJfMTcyNzM0ODAzICBGSVgoMi4xNzI3MzQ4MDMpCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQorI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgIEZJWCgzLjYyNDUwOTc4NSkKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KKyAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKKyAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKKyAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCisgKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQorI2Vsc2UKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKKyNlbmRpZgorCisKKy8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQorICogZW50cnk7IHByb2R1Y2UgYW4gaW50IHJlc3VsdC4gIEluIHRoaXMgbW9kdWxlLCBib3RoIGlucHV0cyBhbmQgcmVzdWx0CisgKiBhcmUgMTYgYml0cyBvciBsZXNzLCBzbyBlaXRoZXIgaW50IG9yIHNob3J0IG11bHRpcGx5IHdpbGwgd29yay4KKyAqLworCisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElTTE9XX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgNHg0IG91dHB1dCBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF80eDQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMiwgdG1wMTAsIHRtcDEyOworICBJTlQzMiB6MSwgejIsIHozLCB6NDsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlW0RDVFNJWkUqNF07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyssIGN0ci0tKSB7CisgICAgLyogRG9uJ3QgYm90aGVyIHRvIHByb2Nlc3MgY29sdW1uIDQsIGJlY2F1c2Ugc2Vjb25kIHBhc3Mgd29uJ3QgdXNlIGl0ICovCisgICAgaWYgKGN0ciA9PSBEQ1RTSVpFLTQpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYgaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybzsgd2UgbmVlZCBub3QgZXhhbWluZSB0ZXJtIDQgZm9yIDR4NCBvdXRwdXQgKi8KKyAgICAgIGludCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSkgPDwgUEFTUzFfQklUUzsKKyAgICAgIAorICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOworICAgICAgCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMCA8PD0gKENPTlNUX0JJVFMrMSk7CisgICAgCisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKKworICAgIHRtcDIgPSBNVUxUSVBMWSh6MiwgRklYXzFfODQ3NzU5MDY1KSArIE1VTFRJUExZKHozLCAtIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDAgLSB0bXAyOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisgICAgCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIAorICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF8yMTExNjQyNDMpIC8qIHNxcnQoMikgKiAoYzMtYzEpICovCisJICsgTVVMVElQTFkoejIsIEZJWF8xXzQ1MTc3NDk4MSkgLyogc3FydCgyKSAqIChjMytjNykgKi8KKwkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMl8xNzI3MzQ4MDMpIC8qIHNxcnQoMikgKiAoLWMxLWM1KSAqLworCSArIE1VTFRJUExZKHo0LCBGSVhfMV8wNjE1OTQzMzcpOyAvKiBzcXJ0KDIpICogKGM1K2M3KSAqLworICAgIAorICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF81MDk3OTU1NzkpIC8qIHNxcnQoMikgKiAoYzctYzUpICovCisJICsgTVVMVElQTFkoejIsIC0gRklYXzBfNjAxMzQ0ODg3KSAvKiBzcXJ0KDIpICogKGM1LWMxKSAqLworCSArIE1VTFRJUExZKHozLCBGSVhfMF84OTk5NzYyMjMpIC8qIHNxcnQoMikgKiAoYzMtYzcpICovCisJICsgTVVMVElQTFkoejQsIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoYzErYzMpICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKyAgICAKKyAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKKyAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKKyAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKKyAgfQorICAKKyAgLyogUGFzcyAyOiBwcm9jZXNzIDQgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDQ7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKyAgICAvKiBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIGEgemVybyByb3cgdGVzdCBpcyB3b3J0aHdoaWxlIGhlcmUgLi4uICovCisKKyNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAorICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJgorCXdzcHRyWzVdID09IDAgJiYgd3NwdHJbNl0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSB3c3B0clswXSwgUEFTUzFfQklUUyszKQorCQkJCSAgJiBSQU5HRV9NQVNLXTsKKyAgICAgIAorICAgICAgb3V0cHRyWzBdID0gZGN2YWw7CisgICAgICBvdXRwdHJbMV0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsyXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzNdID0gZGN2YWw7CisgICAgICAKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDAgPSAoKElOVDMyKSB3c3B0clswXSkgPDwgKENPTlNUX0JJVFMrMSk7CisgICAgCisgICAgdG1wMiA9IE1VTFRJUExZKChJTlQzMikgd3NwdHJbMl0sIEZJWF8xXzg0Nzc1OTA2NSkKKwkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzZdLCAtIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDAgLSB0bXAyOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisgICAgCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzddOworICAgIHoyID0gKElOVDMyKSB3c3B0cls1XTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbM107CisgICAgejQgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIAorICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF8yMTExNjQyNDMpIC8qIHNxcnQoMikgKiAoYzMtYzEpICovCisJICsgTVVMVElQTFkoejIsIEZJWF8xXzQ1MTc3NDk4MSkgLyogc3FydCgyKSAqIChjMytjNykgKi8KKwkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMl8xNzI3MzQ4MDMpIC8qIHNxcnQoMikgKiAoLWMxLWM1KSAqLworCSArIE1VTFRJUExZKHo0LCBGSVhfMV8wNjE1OTQzMzcpOyAvKiBzcXJ0KDIpICogKGM1K2M3KSAqLworICAgIAorICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF81MDk3OTU1NzkpIC8qIHNxcnQoMikgKiAoYzctYzUpICovCisJICsgTVVMVElQTFkoejIsIC0gRklYXzBfNjAxMzQ0ODg3KSAvKiBzcXJ0KDIpICogKGM1LWMxKSAqLworCSArIE1VTFRJUExZKHozLCBGSVhfMF84OTk5NzYyMjMpIC8qIHNxcnQoMikgKiAoYzMtYzcpICovCisJICsgTVVMVElQTFkoejQsIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoYzErYzMpICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKyAgICAKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMiwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDIsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgCisgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMngyIG91dHB1dCBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF8yeDIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMTAsIHoxOworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbRENUU0laRSoyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKywgY3RyLS0pIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gcHJvY2VzcyBjb2x1bW5zIDIsNCw2ICovCisgICAgaWYgKGN0ciA9PSBEQ1RTSVpFLTIgfHwgY3RyID09IERDVFNJWkUtNCB8fCBjdHIgPT0gRENUU0laRS02KQorICAgICAgY29udGludWU7CisgICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybzsgd2UgbmVlZCBub3QgZXhhbWluZSB0ZXJtcyAyLDQsNiBmb3IgMngyIG91dHB1dCAqLworICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOworICAgICAgCisgICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7CisgICAgICAKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMTAgPSB6MSA8PCAoQ09OU1RfQklUUysyKTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF83MjA5NTk4MjIpOyAvKiBzcXJ0KDIpICogKGM3LWM1K2MzLWMxKSAqLworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB0bXAwICs9IE1VTFRJUExZKHoxLCBGSVhfMF84NTA0MzAwOTUpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNStjNykgKi8KKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgLSBGSVhfMV8yNzI3NTg1ODApOyAvKiBzcXJ0KDIpICogKC1jMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgRklYXzNfNjI0NTA5Nzg1KTsgLyogc3FydCgyKSAqIChjMStjMytjNStjNykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzIpOworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzIpOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3MgMiByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgMjsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgYSB6ZXJvIHJvdyB0ZXN0IGlzIHdvcnRod2hpbGUgaGVyZSAuLi4gKi8KKworI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCisgICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls1XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCisJCQkJICAmIFJBTkdFX01BU0tdOworICAgICAgCisgICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsxXSA9IGRjdmFsOworICAgICAgCisgICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgICAgICBjb250aW51ZTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB0bXAxMCA9ICgoSU5UMzIpIHdzcHRyWzBdKSA8PCAoQ09OU1RfQklUUysyKTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMCA9IE1VTFRJUExZKChJTlQzMikgd3NwdHJbN10sIC0gRklYXzBfNzIwOTU5ODIyKSAvKiBzcXJ0KDIpICogKGM3LWM1K2MzLWMxKSAqLworCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbNV0sIEZJWF8wXzg1MDQzMDA5NSkgLyogc3FydCgyKSAqICgtYzErYzMrYzUrYzcpICovCisJICsgTVVMVElQTFkoKElOVDMyKSB3c3B0clszXSwgLSBGSVhfMV8yNzI3NTg1ODApIC8qIHNxcnQoMikgKiAoLWMxK2MzLWM1LWM3KSAqLworCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbMV0sIEZJWF8zXzYyNDUwOTc4NSk7IC8qIHNxcnQoMikgKiAoYzErYzMrYzUrYzcpICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKyAgICAKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysyKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDAsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMikKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIAorICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDF4MSBvdXRwdXQgYmxvY2suCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfMXgxIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIGludCBkY3ZhbDsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIFNISUZUX1RFTVBTCisKKyAgLyogV2UgaGFyZGx5IG5lZWQgYW4gaW52ZXJzZSBEQ1Qgcm91dGluZSBmb3IgdGhpczoganVzdCB0YWtlIHRoZQorICAgKiBhdmVyYWdlIHBpeGVsIHZhbHVlLCB3aGljaCBpcyBvbmUtZWlnaHRoIG9mIHRoZSBEQyBjb2VmZmljaWVudC4KKyAgICovCisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIGRjdmFsID0gREVRVUFOVElaRShjb2VmX2Jsb2NrWzBdLCBxdWFudHB0clswXSk7CisgIGRjdmFsID0gKGludCkgREVTQ0FMRSgoSU5UMzIpIGRjdmFsLCAzKTsKKworICBvdXRwdXRfYnVmWzBdW291dHB1dF9jb2xdID0gcmFuZ2VfbGltaXRbZGN2YWwgJiBSQU5HRV9NQVNLXTsKK30KKworI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2ppbmNsdWRlLmggYi9jb21tb24vanBlZy9qaW5jbHVkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNGYxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qaW5jbHVkZS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBqaW5jbHVkZS5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgZXhpc3RzIHRvIHByb3ZpZGUgYSBzaW5nbGUgcGxhY2UgdG8gZml4IGFueSBwcm9ibGVtcyB3aXRoCisgKiBpbmNsdWRpbmcgdGhlIHdyb25nIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgKENvbW1vbiBwcm9ibGVtcyBhcmUgdGFrZW4KKyAqIGNhcmUgb2YgYnkgdGhlIHN0YW5kYXJkIGpjb25maWcgc3ltYm9scywgYnV0IG9uIHJlYWxseSB3ZWlyZCBzeXN0ZW1zCisgKiB5b3UgbWF5IGhhdmUgdG8gZWRpdCB0aGlzIGZpbGUuKQorICoKKyAqIE5PVEU6IHRoaXMgZmlsZSBpcyBOT1QgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgYnkgYXBwbGljYXRpb25zIHVzaW5nIHRoZQorICogSlBFRyBsaWJyYXJ5LiAgTW9zdCBhcHBsaWNhdGlvbnMgbmVlZCBvbmx5IGluY2x1ZGUganBlZ2xpYi5oLgorICovCisKKworLyogSW5jbHVkZSBhdXRvLWNvbmZpZyBmaWxlIHRvIGZpbmQgb3V0IHdoaWNoIHN5c3RlbSBpbmNsdWRlIGZpbGVzIHdlIG5lZWQuICovCisKKyNpbmNsdWRlICJqY29uZmlnLmgiCQkvKiBhdXRvIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworI2RlZmluZSBKQ09ORklHX0lOQ0xVREVECS8qIHNvIHRoYXQganBlZ2xpYi5oIGRvZXNuJ3QgZG8gaXQgYWdhaW4gKi8KKworLyoKKyAqIFdlIG5lZWQgdGhlIE5VTEwgbWFjcm8gYW5kIHNpemVfdCB0eXBlZGVmLgorICogT24gYW4gQU5TSS1jb25mb3JtaW5nIHN5c3RlbSBpdCBpcyBzdWZmaWNpZW50IHRvIGluY2x1ZGUgPHN0ZGRlZi5oPi4KKyAqIE90aGVyd2lzZSwgd2UgZ2V0IHRoZW0gZnJvbSA8c3RkbGliLmg+IG9yIDxzdGRpby5oPjsgd2UgbWF5IGhhdmUgdG8KKyAqIHB1bGwgaW4gPHN5cy90eXBlcy5oPiBhcyB3ZWxsLgorICogTm90ZSB0aGF0IHRoZSBjb3JlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCByZXF1aXJlIDxzdGRpby5oPjsKKyAqIG9ubHkgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBhbmQgZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbW9kdWxlcyBkby4KKyAqIEJ1dCB3ZSBtdXN0IHB1bGwgaXQgaW4gYmVjYXVzZSBvZiB0aGUgcmVmZXJlbmNlcyB0byBGSUxFIGluIGpwZWdsaWIuaC4KKyAqIFlvdSBjYW4gcmVtb3ZlIHRob3NlIHJlZmVyZW5jZXMgaWYgeW91IHdhbnQgdG8gY29tcGlsZSB3aXRob3V0IDxzdGRpby5oPi4KKyAqLworCisjaWZkZWYgSEFWRV9TVERERUZfSAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIE5FRURfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIFdlIG5lZWQgbWVtb3J5IGNvcHlpbmcgYW5kIHplcm9pbmcgZnVuY3Rpb25zLCBwbHVzIHN0cm5jcHkoKS4KKyAqIEFOU0kgYW5kIFN5c3RlbSBWIGltcGxlbWVudGF0aW9ucyBkZWNsYXJlIHRoZXNlIGluIDxzdHJpbmcuaD4uCisgKiBCU0QgZG9lc24ndCBoYXZlIHRoZSBtZW0oKSBmdW5jdGlvbnMsIGJ1dCBpdCBkb2VzIGhhdmUgYmNvcHkoKS9iemVybygpLgorICogU29tZSBzeXN0ZW1zIG1heSBkZWNsYXJlIG1lbXNldCBhbmQgbWVtY3B5IGluIDxtZW1vcnkuaD4uCisgKgorICogTk9URTogd2UgYXNzdW1lIHRoZSBzaXplIHBhcmFtZXRlcnMgdG8gdGhlc2UgZnVuY3Rpb25zIGFyZSBvZiB0eXBlIHNpemVfdC4KKyAqIENoYW5nZSB0aGUgY2FzdHMgaW4gdGhlc2UgbWFjcm9zIGlmIG5vdCEKKyAqLworCisjaWZkZWYgTkVFRF9CU0RfU1RSSU5HUworCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2RlZmluZSBNRU1aRVJPKHRhcmdldCxzaXplKQliemVybygodm9pZCAqKSh0YXJnZXQpLCAoc2l6ZV90KShzaXplKSkKKyNkZWZpbmUgTUVNQ09QWShkZXN0LHNyYyxzaXplKQliY29weSgoY29uc3Qgdm9pZCAqKShzcmMpLCAodm9pZCAqKShkZXN0KSwgKHNpemVfdCkoc2l6ZSkpCisKKyNlbHNlIC8qIG5vdCBCU0QsIGFzc3VtZSBBTlNJL1N5c1Ygc3RyaW5nIGxpYiAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZGVmaW5lIE1FTVpFUk8odGFyZ2V0LHNpemUpCW1lbXNldCgodm9pZCAqKSh0YXJnZXQpLCAwLCAoc2l6ZV90KShzaXplKSkKKyNkZWZpbmUgTUVNQ09QWShkZXN0LHNyYyxzaXplKQltZW1jcHkoKHZvaWQgKikoZGVzdCksIChjb25zdCB2b2lkICopKHNyYyksIChzaXplX3QpKHNpemUpKQorCisjZW5kaWYKKworLyoKKyAqIEluIEFOU0kgQywgYW5kIGluZGVlZCBhbnkgcmF0aW9uYWwgaW1wbGVtZW50YXRpb24sIHNpemVfdCBpcyBhbHNvIHRoZQorICogdHlwZSByZXR1cm5lZCBieSBzaXplb2YoKS4gIEhvd2V2ZXIsIGl0IHNlZW1zIHRoZXJlIGFyZSBzb21lIGlycmF0aW9uYWwKKyAqIGltcGxlbWVudGF0aW9ucyBvdXQgdGhlcmUsIGluIHdoaWNoIHNpemVvZigpIHJldHVybnMgYW4gaW50IGV2ZW4gdGhvdWdoCisgKiBzaXplX3QgaXMgZGVmaW5lZCBhcyBsb25nIG9yIHVuc2lnbmVkIGxvbmcuICBUbyBlbnN1cmUgY29uc2lzdGVudCByZXN1bHRzCisgKiB3ZSBhbHdheXMgdXNlIHRoaXMgU0laRU9GKCkgbWFjcm8gaW4gcGxhY2Ugb2YgdXNpbmcgc2l6ZW9mKCkgZGlyZWN0bHkuCisgKi8KKworI2RlZmluZSBTSVpFT0Yob2JqZWN0KQkoKHNpemVfdCkgc2l6ZW9mKG9iamVjdCkpCisKKy8qCisgKiBUaGUgbW9kdWxlcyB0aGF0IHVzZSBmcmVhZCgpIGFuZCBmd3JpdGUoKSBhbHdheXMgaW52b2tlIHRoZW0gdGhyb3VnaAorICogdGhlc2UgbWFjcm9zLiAgT24gc29tZSBzeXN0ZW1zIHlvdSBtYXkgbmVlZCB0byB0d2lkZGxlIHRoZSBhcmd1bWVudCBjYXN0cy4KKyAqIENBVVRJT046IGFyZ3VtZW50IG9yZGVyIGlzIGRpZmZlcmVudCBmcm9tIHVuZGVybHlpbmcgZnVuY3Rpb25zIQorICovCisKKyNkZWZpbmUgSkZSRUFEKGZpbGUsYnVmLHNpemVvZmJ1ZikgIFwKKyAgKChzaXplX3QpIGZyZWFkKCh2b2lkICopIChidWYpLCAoc2l6ZV90KSAxLCAoc2l6ZV90KSAoc2l6ZW9mYnVmKSwgKGZpbGUpKSkKKyNkZWZpbmUgSkZXUklURShmaWxlLGJ1ZixzaXplb2ZidWYpICBcCisgICgoc2l6ZV90KSBmd3JpdGUoKGNvbnN0IHZvaWQgKikgKGJ1ZiksIChzaXplX3QpIDEsIChzaXplX3QpIChzaXplb2ZidWYpLCAoZmlsZSkpKQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvam1lbW1nci5jIGIvY29tbW9uL2pwZWcvam1lbW1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDFiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qbWVtbWdyLmMKQEAgLTAsMCArMSwxMTE4IEBACisvKgorICogam1lbW1nci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEpQRUcgc3lzdGVtLWluZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VtZW50CisgKiByb3V0aW5lcy4gIFRoaXMgY29kZSBpcyB1c2FibGUgYWNyb3NzIGEgd2lkZSB2YXJpZXR5IG9mIG1hY2hpbmVzOyBtb3N0CisgKiBvZiB0aGUgc3lzdGVtIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gaXNvbGF0ZWQgaW4gYSBzZXBhcmF0ZSBmaWxlLgorICogVGhlIG1ham9yIGZ1bmN0aW9ucyBwcm92aWRlZCBoZXJlIGFyZToKKyAqICAgKiBwb29sLWJhc2VkIGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgb2YgbWVtb3J5OworICogICAqIHBvbGljeSBkZWNpc2lvbnMgYWJvdXQgaG93IHRvIGRpdmlkZSBhdmFpbGFibGUgbWVtb3J5IGFtb25nIHRoZQorICogICAgIHZpcnR1YWwgYXJyYXlzOworICogICAqIGNvbnRyb2wgbG9naWMgZm9yIHN3YXBwaW5nIHZpcnR1YWwgYXJyYXlzIGJldHdlZW4gbWFpbiBtZW1vcnkgYW5kCisgKiAgICAgYmFja2luZyBzdG9yYWdlLgorICogVGhlIHNlcGFyYXRlIHN5c3RlbS1kZXBlbmRlbnQgZmlsZSBwcm92aWRlcyB0aGUgYWN0dWFsIGJhY2tpbmctc3RvcmFnZQorICogYWNjZXNzIGNvZGUsIGFuZCBpdCBjb250YWlucyB0aGUgcG9saWN5IGRlY2lzaW9uIGFib3V0IGhvdyBtdWNoIHRvdGFsCisgKiBtYWluIG1lbW9yeSB0byB1c2UuCisgKiBUaGlzIGZpbGUgaXMgc3lzdGVtLWRlcGVuZGVudCBpbiB0aGUgc2Vuc2UgdGhhdCBzb21lIG9mIGl0cyBmdW5jdGlvbnMKKyAqIGFyZSB1bm5lY2Vzc2FyeSBpbiBzb21lIHN5c3RlbXMuICBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgZW5vdWdoIHZpcnR1YWwKKyAqIG1lbW9yeSBzbyB0aGF0IGJhY2tpbmcgc3RvcmFnZSB3aWxsIG5ldmVyIGJlIHVzZWQsIG11Y2ggb2YgdGhlIHZpcnR1YWwKKyAqIGFycmF5IGNvbnRyb2wgbG9naWMgY291bGQgYmUgcmVtb3ZlZC4gIChPZiBjb3Vyc2UsIGlmIHlvdSBoYXZlIHRoYXQgbXVjaAorICogbWVtb3J5IHRoZW4geW91IHNob3VsZG4ndCBjYXJlIGFib3V0IGEgbGl0dGxlIGJpdCBvZiB1bnVzZWQgY29kZS4uLikKKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjZGVmaW5lIEFNX01FTU9SWV9NQU5BR0VSCS8qIHdlIGRlZmluZSBqdmlydF9YYXJyYXlfY29udHJvbCBzdHJ1Y3RzICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIE5PX0dFVEVOVgorI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIGdldGVudigpICovCitleHRlcm4gY2hhciAqIGdldGVudiBKUFAoKGNvbnN0IGNoYXIgKiBuYW1lKSk7CisjZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBTb21lIGltcG9ydGFudCBub3RlczoKKyAqICAgVGhlIGFsbG9jYXRpb24gcm91dGluZXMgcHJvdmlkZWQgaGVyZSBtdXN0IG5ldmVyIHJldHVybiBOVUxMLgorICogICBUaGV5IHNob3VsZCBleGl0IHRvIGVycm9yX2V4aXQgaWYgdW5zdWNjZXNzZnVsLgorICoKKyAqICAgSXQncyBub3QgYSBnb29kIGlkZWEgdG8gdHJ5IHRvIG1lcmdlIHRoZSBzYXJyYXkgYW5kIGJhcnJheSByb3V0aW5lcywKKyAqICAgZXZlbiB0aG91Z2ggdGhleSBhcmUgdGV4dHVhbGx5IGFsbW9zdCB0aGUgc2FtZSwgYmVjYXVzZSBzYW1wbGVzIGFyZQorICogICB1c3VhbGx5IHN0b3JlZCBhcyBieXRlcyB3aGlsZSBjb2VmZmljaWVudHMgYXJlIHNob3J0cyBvciBpbnRzLiAgVGh1cywKKyAqICAgaW4gbWFjaGluZXMgd2hlcmUgYnl0ZSBwb2ludGVycyBoYXZlIGEgZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uIGZyb20KKyAqICAgd29yZCBwb2ludGVycywgdGhlIHJlc3VsdGluZyBtYWNoaW5lIGNvZGUgY291bGQgbm90IGJlIHRoZSBzYW1lLgorICovCisKKworLyoKKyAqIE1hbnkgbWFjaGluZXMgcmVxdWlyZSBzdG9yYWdlIGFsaWdubWVudDogbG9uZ3MgbXVzdCBzdGFydCBvbiA0LWJ5dGUKKyAqIGJvdW5kYXJpZXMsIGRvdWJsZXMgb24gOC1ieXRlIGJvdW5kYXJpZXMsIGV0Yy4gIE9uIHN1Y2ggbWFjaGluZXMsIG1hbGxvYygpCisgKiBhbHdheXMgcmV0dXJucyBwb2ludGVycyB0aGF0IGFyZSBtdWx0aXBsZXMgb2YgdGhlIHdvcnN0LWNhc2UgYWxpZ25tZW50CisgKiByZXF1aXJlbWVudCwgYW5kIHdlIGhhZCBiZXR0ZXIgZG8gc28gdG9vLgorICogVGhlcmUgaXNuJ3QgYW55IHJlYWxseSBwb3J0YWJsZSB3YXkgdG8gZGV0ZXJtaW5lIHRoZSB3b3JzdC1jYXNlIGFsaWdubWVudAorICogcmVxdWlyZW1lbnQuICBUaGlzIG1vZHVsZSBhc3N1bWVzIHRoYXQgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBpcworICogbXVsdGlwbGVzIG9mIHNpemVvZihBTElHTl9UWVBFKS4KKyAqIEJ5IGRlZmF1bHQsIHdlIGRlZmluZSBBTElHTl9UWVBFIGFzIGRvdWJsZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHNvbWUKKyAqIHdvcmtzdGF0aW9ucyAod2hlcmUgZG91YmxlcyByZWFsbHkgZG8gbmVlZCA4LWJ5dGUgYWxpZ25tZW50KSBhbmQgd2lsbCB3b3JrCisgKiBmaW5lIG9uIG5lYXJseSBldmVyeXRoaW5nLiAgSWYgeW91ciBtYWNoaW5lIGhhcyBsZXNzZXIgYWxpZ25tZW50IG5lZWRzLAorICogeW91IGNhbiBzYXZlIGEgZmV3IGJ5dGVzIGJ5IG1ha2luZyBBTElHTl9UWVBFIHNtYWxsZXIuCisgKiBUaGUgb25seSBwbGFjZSBJIGtub3cgb2Ygd2hlcmUgdGhpcyB3aWxsIE5PVCB3b3JrIGlzIGNlcnRhaW4gTWFjaW50b3NoCisgKiA2ODB4MCBjb21waWxlcnMgdGhhdCBkZWZpbmUgZG91YmxlIGFzIGEgMTAtYnl0ZSBJRUVFIGV4dGVuZGVkIGZsb2F0LgorICogRG9pbmcgMTAtYnl0ZSBhbGlnbm1lbnQgaXMgY291bnRlcnByb2R1Y3RpdmUgYmVjYXVzZSBsb25nd29yZHMgd29uJ3QgYmUKKyAqIGFsaWduZWQgd2VsbC4gIFB1dCAiI2RlZmluZSBBTElHTl9UWVBFIGxvbmciIGluIGpjb25maWcuaCBpZiB5b3UgaGF2ZQorICogc3VjaCBhIGNvbXBpbGVyLgorICovCisKKyNpZm5kZWYgQUxJR05fVFlQRQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gamNvbmZpZy5oICovCisjZGVmaW5lIEFMSUdOX1RZUEUgIGRvdWJsZQorI2VuZGlmCisKKworLyoKKyAqIFdlIGFsbG9jYXRlIG9iamVjdHMgZnJvbSAicG9vbHMiLCB3aGVyZSBlYWNoIHBvb2wgaXMgZ290dGVuIHdpdGggYSBzaW5nbGUKKyAqIHJlcXVlc3QgdG8ganBlZ19nZXRfc21hbGwoKSBvciBqcGVnX2dldF9sYXJnZSgpLiAgVGhlcmUgaXMgbm8gcGVyLW9iamVjdAorICogb3ZlcmhlYWQgd2l0aGluIGEgcG9vbCwgZXhjZXB0IGZvciBhbGlnbm1lbnQgcGFkZGluZy4gIEVhY2ggcG9vbCBoYXMgYQorICogaGVhZGVyIHdpdGggYSBsaW5rIHRvIHRoZSBuZXh0IHBvb2wgb2YgdGhlIHNhbWUgY2xhc3MuCisgKiBTbWFsbCBhbmQgbGFyZ2UgcG9vbCBoZWFkZXJzIGFyZSBpZGVudGljYWwgZXhjZXB0IHRoYXQgdGhlIGxhdHRlcidzCisgKiBsaW5rIHBvaW50ZXIgbXVzdCBiZSBGQVIgb24gODB4ODYgbWFjaGluZXMuCisgKiBOb3RpY2UgdGhhdCB0aGUgInJlYWwiIGhlYWRlciBmaWVsZHMgYXJlIHVuaW9uJ2VkIHdpdGggYSBkdW1teSBBTElHTl9UWVBFCisgKiBmaWVsZC4gIFRoaXMgZm9yY2VzIHRoZSBjb21waWxlciB0byBtYWtlIFNJWkVPRihzbWFsbF9wb29sX2hkcikgYSBtdWx0aXBsZQorICogb2YgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiBBTElHTl9UWVBFLgorICovCisKK3R5cGVkZWYgdW5pb24gc21hbGxfcG9vbF9zdHJ1Y3QgKiBzbWFsbF9wb29sX3B0cjsKKwordHlwZWRlZiB1bmlvbiBzbWFsbF9wb29sX3N0cnVjdCB7CisgIHN0cnVjdCB7CisgICAgc21hbGxfcG9vbF9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0IG9mIHBvb2xzICovCisgICAgc2l6ZV90IGJ5dGVzX3VzZWQ7CQkvKiBob3cgbWFueSBieXRlcyBhbHJlYWR5IHVzZWQgd2l0aGluIHBvb2wgKi8KKyAgICBzaXplX3QgYnl0ZXNfbGVmdDsJCS8qIGJ5dGVzIHN0aWxsIGF2YWlsYWJsZSBpbiB0aGlzIHBvb2wgKi8KKyAgfSBoZHI7CisgIEFMSUdOX1RZUEUgZHVtbXk7CQkvKiBpbmNsdWRlZCBpbiB1bmlvbiB0byBlbnN1cmUgYWxpZ25tZW50ICovCit9IHNtYWxsX3Bvb2xfaGRyOworCit0eXBlZGVmIHVuaW9uIGxhcmdlX3Bvb2xfc3RydWN0IEZBUiAqIGxhcmdlX3Bvb2xfcHRyOworCit0eXBlZGVmIHVuaW9uIGxhcmdlX3Bvb2xfc3RydWN0IHsKKyAgc3RydWN0IHsKKyAgICBsYXJnZV9wb29sX3B0ciBuZXh0OwkvKiBuZXh0IGluIGxpc3Qgb2YgcG9vbHMgKi8KKyAgICBzaXplX3QgYnl0ZXNfdXNlZDsJCS8qIGhvdyBtYW55IGJ5dGVzIGFscmVhZHkgdXNlZCB3aXRoaW4gcG9vbCAqLworICAgIHNpemVfdCBieXRlc19sZWZ0OwkJLyogYnl0ZXMgc3RpbGwgYXZhaWxhYmxlIGluIHRoaXMgcG9vbCAqLworICB9IGhkcjsKKyAgQUxJR05fVFlQRSBkdW1teTsJCS8qIGluY2x1ZGVkIGluIHVuaW9uIHRvIGVuc3VyZSBhbGlnbm1lbnQgKi8KK30gbGFyZ2VfcG9vbF9oZHI7CisKKworLyoKKyAqIEhlcmUgaXMgdGhlIGZ1bGwgZGVmaW5pdGlvbiBvZiBhIG1lbW9yeSBtYW5hZ2VyIG9iamVjdC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX21lbW9yeV9tZ3IgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRWFjaCBwb29sIGlkZW50aWZpZXIgKGxpZmV0aW1lIGNsYXNzKSBuYW1lcyBhIGxpbmtlZCBsaXN0IG9mIHBvb2xzLiAqLworICBzbWFsbF9wb29sX3B0ciBzbWFsbF9saXN0W0pQT09MX05VTVBPT0xTXTsKKyAgbGFyZ2VfcG9vbF9wdHIgbGFyZ2VfbGlzdFtKUE9PTF9OVU1QT09MU107CisKKyAgLyogU2luY2Ugd2Ugb25seSBoYXZlIG9uZSBsaWZldGltZSBjbGFzcyBvZiB2aXJ0dWFsIGFycmF5cywgb25seSBvbmUKKyAgICogbGlua2VkIGxpc3QgaXMgbmVjZXNzYXJ5IChmb3IgZWFjaCBkYXRhdHlwZSkuICBOb3RlIHRoYXQgdGhlIHZpcnR1YWwKKyAgICogYXJyYXkgY29udHJvbCBibG9ja3MgYmVpbmcgbGlua2VkIHRvZ2V0aGVyIGFyZSBhY3R1YWxseSBzdG9yZWQgc29tZXdoZXJlCisgICAqIGluIHRoZSBzbWFsbC1wb29sIGxpc3QuCisgICAqLworICBqdmlydF9zYXJyYXlfcHRyIHZpcnRfc2FycmF5X2xpc3Q7CisgIGp2aXJ0X2JhcnJheV9wdHIgdmlydF9iYXJyYXlfbGlzdDsKKworICAvKiBUaGlzIGNvdW50cyB0b3RhbCBzcGFjZSBvYnRhaW5lZCBmcm9tIGpwZWdfZ2V0X3NtYWxsL2xhcmdlICovCisgIGxvbmcgdG90YWxfc3BhY2VfYWxsb2NhdGVkOworCisgIC8qIGFsbG9jX3NhcnJheSBhbmQgYWxsb2NfYmFycmF5IHNldCB0aGlzIHZhbHVlIGZvciB1c2UgYnkgdmlydHVhbAorICAgKiBhcnJheSByb3V0aW5lcy4KKyAgICovCisgIEpESU1FTlNJT04gbGFzdF9yb3dzcGVyY2h1bms7CS8qIGZyb20gbW9zdCByZWNlbnQgYWxsb2Nfc2FycmF5L2JhcnJheSAqLworfSBteV9tZW1vcnlfbWdyOworCit0eXBlZGVmIG15X21lbW9yeV9tZ3IgKiBteV9tZW1fcHRyOworCisKKy8qCisgKiBUaGUgY29udHJvbCBibG9ja3MgZm9yIHZpcnR1YWwgYXJyYXlzLgorICogTm90ZSB0aGF0IHRoZXNlIGJsb2NrcyBhcmUgYWxsb2NhdGVkIGluIHRoZSAic21hbGwiIHBvb2wgYXJlYS4KKyAqIFN5c3RlbS1kZXBlbmRlbnQgaW5mbyBmb3IgdGhlIGFzc29jaWF0ZWQgYmFja2luZyBzdG9yZSAoaWYgYW55KSBpcyBoaWRkZW4KKyAqIGluc2lkZSB0aGUgYmFja2luZ19zdG9yZV9pbmZvIHN0cnVjdC4KKyAqLworCitzdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wgeworICBKU0FNUEFSUkFZIG1lbV9idWZmZXI7CS8qID0+IHRoZSBpbi1tZW1vcnkgYnVmZmVyICovCisgIEpESU1FTlNJT04gcm93c19pbl9hcnJheTsJLyogdG90YWwgdmlydHVhbCBhcnJheSBoZWlnaHQgKi8KKyAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93OwkvKiB3aWR0aCBvZiBhcnJheSAoYW5kIG9mIG1lbW9yeSBidWZmZXIpICovCisgIEpESU1FTlNJT04gbWF4YWNjZXNzOwkJLyogbWF4IHJvd3MgYWNjZXNzZWQgYnkgYWNjZXNzX3ZpcnRfc2FycmF5ICovCisgIEpESU1FTlNJT04gcm93c19pbl9tZW07CS8qIGhlaWdodCBvZiBtZW1vcnkgYnVmZmVyICovCisgIEpESU1FTlNJT04gcm93c3BlcmNodW5rOwkvKiBhbGxvY2F0aW9uIGNodW5rIHNpemUgaW4gbWVtX2J1ZmZlciAqLworICBKRElNRU5TSU9OIGN1cl9zdGFydF9yb3c7CS8qIGZpcnN0IGxvZ2ljYWwgcm93ICMgaW4gdGhlIGJ1ZmZlciAqLworICBKRElNRU5TSU9OIGZpcnN0X3VuZGVmX3JvdzsJLyogcm93ICMgb2YgZmlyc3QgdW5pbml0aWFsaXplZCByb3cgKi8KKyAgYm9vbGVhbiBwcmVfemVybzsJCS8qIHByZS16ZXJvIG1vZGUgcmVxdWVzdGVkPyAqLworICBib29sZWFuIGRpcnR5OwkJLyogZG8gY3VycmVudCBidWZmZXIgY29udGVudHMgbmVlZCB3cml0dGVuPyAqLworICBib29sZWFuIGJfc19vcGVuOwkJLyogaXMgYmFja2luZy1zdG9yZSBkYXRhIHZhbGlkPyAqLworICBqdmlydF9zYXJyYXlfcHRyIG5leHQ7CS8qIGxpbmsgdG8gbmV4dCB2aXJ0dWFsIHNhcnJheSBjb250cm9sIGJsb2NrICovCisgIGJhY2tpbmdfc3RvcmVfaW5mbyBiX3NfaW5mbzsJLyogU3lzdGVtLWRlcGVuZGVudCBjb250cm9sIGluZm8gKi8KK307CisKK3N0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCB7CisgIEpCTE9DS0FSUkFZIG1lbV9idWZmZXI7CS8qID0+IHRoZSBpbi1tZW1vcnkgYnVmZmVyICovCisgIEpESU1FTlNJT04gcm93c19pbl9hcnJheTsJLyogdG90YWwgdmlydHVhbCBhcnJheSBoZWlnaHQgKi8KKyAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3c7CS8qIHdpZHRoIG9mIGFycmF5IChhbmQgb2YgbWVtb3J5IGJ1ZmZlcikgKi8KKyAgSkRJTUVOU0lPTiBtYXhhY2Nlc3M7CQkvKiBtYXggcm93cyBhY2Nlc3NlZCBieSBhY2Nlc3NfdmlydF9iYXJyYXkgKi8KKyAgSkRJTUVOU0lPTiByb3dzX2luX21lbTsJLyogaGVpZ2h0IG9mIG1lbW9yeSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiByb3dzcGVyY2h1bms7CS8qIGFsbG9jYXRpb24gY2h1bmsgc2l6ZSBpbiBtZW1fYnVmZmVyICovCisgIEpESU1FTlNJT04gY3VyX3N0YXJ0X3JvdzsJLyogZmlyc3QgbG9naWNhbCByb3cgIyBpbiB0aGUgYnVmZmVyICovCisgIEpESU1FTlNJT04gZmlyc3RfdW5kZWZfcm93OwkvKiByb3cgIyBvZiBmaXJzdCB1bmluaXRpYWxpemVkIHJvdyAqLworICBib29sZWFuIHByZV96ZXJvOwkJLyogcHJlLXplcm8gbW9kZSByZXF1ZXN0ZWQ/ICovCisgIGJvb2xlYW4gZGlydHk7CQkvKiBkbyBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBuZWVkIHdyaXR0ZW4/ICovCisgIGJvb2xlYW4gYl9zX29wZW47CQkvKiBpcyBiYWNraW5nLXN0b3JlIGRhdGEgdmFsaWQ/ICovCisgIGp2aXJ0X2JhcnJheV9wdHIgbmV4dDsJLyogbGluayB0byBuZXh0IHZpcnR1YWwgYmFycmF5IGNvbnRyb2wgYmxvY2sgKi8KKyAgYmFja2luZ19zdG9yZV9pbmZvIGJfc19pbmZvOwkvKiBTeXN0ZW0tZGVwZW5kZW50IGNvbnRyb2wgaW5mbyAqLworfTsKKworCisjaWZkZWYgTUVNX1NUQVRTCQkvKiBvcHRpb25hbCBleHRyYSBzdHVmZiBmb3Igc3RhdGlzdGljcyAqLworCitMT0NBTCh2b2lkKQorcHJpbnRfbWVtX3N0YXRzIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkKQoreworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBzbWFsbF9wb29sX3B0ciBzaGRyX3B0cjsKKyAgbGFyZ2VfcG9vbF9wdHIgbGhkcl9wdHI7CisKKyAgLyogU2luY2UgdGhpcyBpcyBvbmx5IGEgZGVidWdnaW5nIHN0dWIsIHdlIGNhbiBjaGVhdCBhIGxpdHRsZSBieSB1c2luZworICAgKiBmcHJpbnRmIGRpcmVjdGx5IHJhdGhlciB0aGFuIGdvaW5nIHRocm91Z2ggdGhlIHRyYWNlIG1lc3NhZ2UgY29kZS4KKyAgICogVGhpcyBpcyBoZWxwZnVsIGJlY2F1c2UgbWVzc2FnZSBwYXJtIGFycmF5IGNhbid0IGhhbmRsZSBsb25ncy4KKyAgICovCisgIGZwcmludGYoc3RkZXJyLCAiRnJlZWluZyBwb29sICVkLCB0b3RhbCBzcGFjZSA9ICVsZFxuIiwKKwkgIHBvb2xfaWQsIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkKTsKKworICBmb3IgKGxoZHJfcHRyID0gbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdOyBsaGRyX3B0ciAhPSBOVUxMOworICAgICAgIGxoZHJfcHRyID0gbGhkcl9wdHItPmhkci5uZXh0KSB7CisgICAgZnByaW50ZihzdGRlcnIsICIgIExhcmdlIGNodW5rIHVzZWQgJWxkXG4iLAorCSAgICAobG9uZykgbGhkcl9wdHItPmhkci5ieXRlc191c2VkKTsKKyAgfQorCisgIGZvciAoc2hkcl9wdHIgPSBtZW0tPnNtYWxsX2xpc3RbcG9vbF9pZF07IHNoZHJfcHRyICE9IE5VTEw7CisgICAgICAgc2hkcl9wdHIgPSBzaGRyX3B0ci0+aGRyLm5leHQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgU21hbGwgY2h1bmsgdXNlZCAlbGQgZnJlZSAlbGRcbiIsCisJICAgIChsb25nKSBzaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQsCisJICAgIChsb25nKSBzaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQpOworICB9Cit9CisKKyNlbmRpZiAvKiBNRU1fU1RBVFMgKi8KKworCitMT0NBTCh2b2lkKQorb3V0X29mX21lbW9yeSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgd2hpY2gpCisvKiBSZXBvcnQgYW4gb3V0LW9mLW1lbW9yeSBlcnJvciBhbmQgc3RvcCBleGVjdXRpb24gKi8KKy8qIElmIHdlIGNvbXBpbGVkIE1FTV9TVEFUUyBzdXBwb3J0LCByZXBvcnQgYWxsb2MgcmVxdWVzdHMgYmVmb3JlIGR5aW5nICovCit7CisjaWZkZWYgTUVNX1NUQVRTCisgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMjsJLyogZm9yY2Ugc2VsZl9kZXN0cnVjdCB0byByZXBvcnQgc3RhdHMgKi8KKyNlbmRpZgorICBFUlJFWElUMShjaW5mbywgSkVSUl9PVVRfT0ZfTUVNT1JZLCB3aGljaCk7Cit9CisKKworLyoKKyAqIEFsbG9jYXRpb24gb2YgInNtYWxsIiBvYmplY3RzLgorICoKKyAqIEZvciB0aGVzZSwgd2UgdXNlIHBvb2xlZCBzdG9yYWdlLiAgV2hlbiBhIG5ldyBwb29sIG11c3QgYmUgY3JlYXRlZCwKKyAqIHdlIHRyeSB0byBnZXQgZW5vdWdoIHNwYWNlIGZvciB0aGUgY3VycmVudCByZXF1ZXN0IHBsdXMgYSAic2xvcCIgZmFjdG9yLAorICogd2hlcmUgdGhlIHNsb3Agd2lsbCBiZSB0aGUgYW1vdW50IG9mIGxlZnRvdmVyIHNwYWNlIGluIHRoZSBuZXcgcG9vbC4KKyAqIFRoZSBzcGVlZCB2cy4gc3BhY2UgdHJhZGVvZmYgaXMgbGFyZ2VseSBkZXRlcm1pbmVkIGJ5IHRoZSBzbG9wIHZhbHVlcy4KKyAqIEEgZGlmZmVyZW50IHNsb3AgdmFsdWUgaXMgcHJvdmlkZWQgZm9yIGVhY2ggcG9vbCBjbGFzcyAobGlmZXRpbWUpLAorICogYW5kIHdlIGFsc28gZGlzdGluZ3Vpc2ggdGhlIGZpcnN0IHBvb2wgb2YgYSBjbGFzcyBmcm9tIGxhdGVyIG9uZXMuCisgKiBOT1RFOiB0aGUgdmFsdWVzIGdpdmVuIHdvcmsgZmFpcmx5IHdlbGwgb24gYm90aCAxNi0gYW5kIDMyLWJpdC1pbnQKKyAqIG1hY2hpbmVzLCBidXQgbWF5IGJlIHRvbyBzbWFsbCBpZiBsb25ncyBhcmUgNjQgYml0cyBvciBtb3JlLgorICovCisKK3N0YXRpYyBjb25zdCBzaXplX3QgZmlyc3RfcG9vbF9zbG9wW0pQT09MX05VTVBPT0xTXSA9IAoreworCTE2MDAsCQkJLyogZmlyc3QgUEVSTUFORU5UIHBvb2wgKi8KKwkxNjAwMAkJCS8qIGZpcnN0IElNQUdFIHBvb2wgKi8KK307CisKK3N0YXRpYyBjb25zdCBzaXplX3QgZXh0cmFfcG9vbF9zbG9wW0pQT09MX05VTVBPT0xTXSA9IAoreworCTAsCQkJLyogYWRkaXRpb25hbCBQRVJNQU5FTlQgcG9vbHMgKi8KKwk1MDAwCQkJLyogYWRkaXRpb25hbCBJTUFHRSBwb29scyAqLworfTsKKworI2RlZmluZSBNSU5fU0xPUCAgNTAJCS8qIGdyZWF0ZXIgdGhhbiAwIHRvIGF2b2lkIGZ1dGlsZSBsb29waW5nICovCisKKworTUVUSE9EREVGKHZvaWQgKikKK2FsbG9jX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQorLyogQWxsb2NhdGUgYSAic21hbGwiIG9iamVjdCAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBzbWFsbF9wb29sX3B0ciBoZHJfcHRyLCBwcmV2X2hkcl9wdHI7CisgIGNoYXIgKiBkYXRhX3B0cjsKKyAgc2l6ZV90IG9kZF9ieXRlcywgbWluX3JlcXVlc3QsIHNsb3A7CisKKyAgLyogQ2hlY2sgZm9yIHVuc2F0aXNmaWFibGUgcmVxdWVzdCAoZG8gbm93IHRvIGVuc3VyZSBubyBvdmVyZmxvdyBiZWxvdykgKi8KKyAgaWYgKHNpemVvZm9iamVjdCA+IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKHNtYWxsX3Bvb2xfaGRyKSkpCisgICAgb3V0X29mX21lbW9yeShjaW5mbywgMSk7CS8qIHJlcXVlc3QgZXhjZWVkcyBtYWxsb2MncyBhYmlsaXR5ICovCisKKyAgLyogUm91bmQgdXAgdGhlIHJlcXVlc3RlZCBzaXplIHRvIGEgbXVsdGlwbGUgb2YgU0laRU9GKEFMSUdOX1RZUEUpICovCisgIG9kZF9ieXRlcyA9IHNpemVvZm9iamVjdCAlIFNJWkVPRihBTElHTl9UWVBFKTsKKyAgaWYgKG9kZF9ieXRlcyA+IDApCisgICAgc2l6ZW9mb2JqZWN0ICs9IFNJWkVPRihBTElHTl9UWVBFKSAtIG9kZF9ieXRlczsKKworICAvKiBTZWUgaWYgc3BhY2UgaXMgYXZhaWxhYmxlIGluIGFueSBleGlzdGluZyBwb29sICovCisgIGlmIChwb29sX2lkIDwgMCB8fCBwb29sX2lkID49IEpQT09MX05VTVBPT0xTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCisgIHByZXZfaGRyX3B0ciA9IE5VTEw7CisgIGhkcl9wdHIgPSBtZW0tPnNtYWxsX2xpc3RbcG9vbF9pZF07CisgIHdoaWxlIChoZHJfcHRyICE9IE5VTEwpIHsKKyAgICBpZiAoaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgPj0gc2l6ZW9mb2JqZWN0KQorICAgICAgYnJlYWs7CQkJLyogZm91bmQgcG9vbCB3aXRoIGVub3VnaCBzcGFjZSAqLworICAgIHByZXZfaGRyX3B0ciA9IGhkcl9wdHI7CisgICAgaGRyX3B0ciA9IGhkcl9wdHItPmhkci5uZXh0OworICB9CisKKyAgLyogVGltZSB0byBtYWtlIGEgbmV3IHBvb2w/ICovCisgIGlmIChoZHJfcHRyID09IE5VTEwpIHsKKyAgICAvKiBtaW5fcmVxdWVzdCBpcyB3aGF0IHdlIG5lZWQgbm93LCBzbG9wIGlzIHdoYXQgd2lsbCBiZSBsZWZ0b3ZlciAqLworICAgIG1pbl9yZXF1ZXN0ID0gc2l6ZW9mb2JqZWN0ICsgU0laRU9GKHNtYWxsX3Bvb2xfaGRyKTsKKyAgICBpZiAocHJldl9oZHJfcHRyID09IE5VTEwpCS8qIGZpcnN0IHBvb2wgaW4gY2xhc3M/ICovCisgICAgICBzbG9wID0gZmlyc3RfcG9vbF9zbG9wW3Bvb2xfaWRdOworICAgIGVsc2UKKyAgICAgIHNsb3AgPSBleHRyYV9wb29sX3Nsb3BbcG9vbF9pZF07CisgICAgLyogRG9uJ3QgYXNrIGZvciBtb3JlIHRoYW4gTUFYX0FMTE9DX0NIVU5LICovCisgICAgaWYgKHNsb3AgPiAoc2l6ZV90KSAoTUFYX0FMTE9DX0NIVU5LLW1pbl9yZXF1ZXN0KSkKKyAgICAgIHNsb3AgPSAoc2l6ZV90KSAoTUFYX0FMTE9DX0NIVU5LLW1pbl9yZXF1ZXN0KTsKKyAgICAvKiBUcnkgdG8gZ2V0IHNwYWNlLCBpZiBmYWlsIHJlZHVjZSBzbG9wIGFuZCB0cnkgYWdhaW4gKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICBoZHJfcHRyID0gKHNtYWxsX3Bvb2xfcHRyKSBqcGVnX2dldF9zbWFsbChjaW5mbywgbWluX3JlcXVlc3QgKyBzbG9wKTsKKyAgICAgIGlmIChoZHJfcHRyICE9IE5VTEwpCisJYnJlYWs7CisgICAgICBzbG9wIC89IDI7CisgICAgICBpZiAoc2xvcCA8IE1JTl9TTE9QKQkvKiBnaXZlIHVwIHdoZW4gaXQgZ2V0cyByZWFsIHNtYWxsICovCisJb3V0X29mX21lbW9yeShjaW5mbywgMik7IC8qIGpwZWdfZ2V0X3NtYWxsIGZhaWxlZCAqLworICAgIH0KKyAgICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCArPSBtaW5fcmVxdWVzdCArIHNsb3A7CisgICAgLyogU3VjY2VzcywgaW5pdGlhbGl6ZSB0aGUgbmV3IHBvb2wgaGVhZGVyIGFuZCBhZGQgdG8gZW5kIG9mIGxpc3QgKi8KKyAgICBoZHJfcHRyLT5oZHIubmV4dCA9IE5VTEw7CisgICAgaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgPSAwOworICAgIGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ID0gc2l6ZW9mb2JqZWN0ICsgc2xvcDsKKyAgICBpZiAocHJldl9oZHJfcHRyID09IE5VTEwpCS8qIGZpcnN0IHBvb2wgaW4gY2xhc3M/ICovCisgICAgICBtZW0tPnNtYWxsX2xpc3RbcG9vbF9pZF0gPSBoZHJfcHRyOworICAgIGVsc2UKKyAgICAgIHByZXZfaGRyX3B0ci0+aGRyLm5leHQgPSBoZHJfcHRyOworICB9CisKKyAgLyogT0ssIGFsbG9jYXRlIHRoZSBvYmplY3QgZnJvbSB0aGUgY3VycmVudCBwb29sICovCisgIGRhdGFfcHRyID0gKGNoYXIgKikgKGhkcl9wdHIgKyAxKTsgLyogcG9pbnQgdG8gZmlyc3QgZGF0YSBieXRlIGluIHBvb2wgKi8KKyAgZGF0YV9wdHIgKz0gaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQ7IC8qIHBvaW50IHRvIHBsYWNlIGZvciBvYmplY3QgKi8KKyAgaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgKz0gc2l6ZW9mb2JqZWN0OworICBoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCAtPSBzaXplb2ZvYmplY3Q7CisKKyAgcmV0dXJuICh2b2lkICopIGRhdGFfcHRyOworfQorCisKKy8qCisgKiBBbGxvY2F0aW9uIG9mICJsYXJnZSIgb2JqZWN0cy4KKyAqCisgKiBUaGUgZXh0ZXJuYWwgc2VtYW50aWNzIG9mIHRoZXNlIGFyZSB0aGUgc2FtZSBhcyAic21hbGwiIG9iamVjdHMsCisgKiBleGNlcHQgdGhhdCBGQVIgcG9pbnRlcnMgYXJlIHVzZWQgb24gODB4ODYuICBIb3dldmVyIHRoZSBwb29sCisgKiBtYW5hZ2VtZW50IGhldXJpc3RpY3MgYXJlIHF1aXRlIGRpZmZlcmVudC4gIFdlIGFzc3VtZSB0aGF0IGVhY2gKKyAqIHJlcXVlc3QgaXMgbGFyZ2UgZW5vdWdoIHRoYXQgaXQgbWF5IGFzIHdlbGwgYmUgcGFzc2VkIGRpcmVjdGx5IHRvCisgKiBqcGVnX2dldF9sYXJnZTsgdGhlIHBvb2wgbWFuYWdlbWVudCBqdXN0IGxpbmtzIGV2ZXJ5dGhpbmcgdG9nZXRoZXIKKyAqIHNvIHRoYXQgd2UgY2FuIGZyZWUgaXQgYWxsIG9uIGRlbWFuZC4KKyAqIE5vdGU6IHRoZSBtYWpvciB1c2Ugb2YgImxhcmdlIiBvYmplY3RzIGlzIGluIEpTQU1QQVJSQVkgYW5kIEpCTE9DS0FSUkFZCisgKiBzdHJ1Y3R1cmVzLiAgVGhlIHJvdXRpbmVzIHRoYXQgY3JlYXRlIHRoZXNlIHN0cnVjdHVyZXMgKHNlZSBiZWxvdykKKyAqIGRlbGliZXJhdGVseSBidW5jaCByb3dzIHRvZ2V0aGVyIHRvIGVuc3VyZSBhIGxhcmdlIHJlcXVlc3Qgc2l6ZS4KKyAqLworCitNRVRIT0RERUYodm9pZCBGQVIgKikKK2FsbG9jX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQorLyogQWxsb2NhdGUgYSAibGFyZ2UiIG9iamVjdCAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBsYXJnZV9wb29sX3B0ciBoZHJfcHRyOworICBzaXplX3Qgb2RkX2J5dGVzOworCisgIC8qIENoZWNrIGZvciB1bnNhdGlzZmlhYmxlIHJlcXVlc3QgKGRvIG5vdyB0byBlbnN1cmUgbm8gb3ZlcmZsb3cgYmVsb3cpICovCisgIGlmIChzaXplb2ZvYmplY3QgPiAoc2l6ZV90KSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihsYXJnZV9wb29sX2hkcikpKQorICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDMpOwkvKiByZXF1ZXN0IGV4Y2VlZHMgbWFsbG9jJ3MgYWJpbGl0eSAqLworCisgIC8qIFJvdW5kIHVwIHRoZSByZXF1ZXN0ZWQgc2l6ZSB0byBhIG11bHRpcGxlIG9mIFNJWkVPRihBTElHTl9UWVBFKSAqLworICBvZGRfYnl0ZXMgPSBzaXplb2ZvYmplY3QgJSBTSVpFT0YoQUxJR05fVFlQRSk7CisgIGlmIChvZGRfYnl0ZXMgPiAwKQorICAgIHNpemVvZm9iamVjdCArPSBTSVpFT0YoQUxJR05fVFlQRSkgLSBvZGRfYnl0ZXM7CisKKyAgLyogQWx3YXlzIG1ha2UgYSBuZXcgcG9vbCAqLworICBpZiAocG9vbF9pZCA8IDAgfHwgcG9vbF9pZCA+PSBKUE9PTF9OVU1QT09MUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLworCisgIGhkcl9wdHIgPSAobGFyZ2VfcG9vbF9wdHIpIGpwZWdfZ2V0X2xhcmdlKGNpbmZvLCBzaXplb2ZvYmplY3QgKworCQkJCQkgICAgU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSk7CisgIGlmIChoZHJfcHRyID09IE5VTEwpCisgICAgb3V0X29mX21lbW9yeShjaW5mbywgNCk7CS8qIGpwZWdfZ2V0X2xhcmdlIGZhaWxlZCAqLworICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCArPSBzaXplb2ZvYmplY3QgKyBTSVpFT0YobGFyZ2VfcG9vbF9oZHIpOworCisgIC8qIFN1Y2Nlc3MsIGluaXRpYWxpemUgdGhlIG5ldyBwb29sIGhlYWRlciBhbmQgYWRkIHRvIGxpc3QgKi8KKyAgaGRyX3B0ci0+aGRyLm5leHQgPSBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF07CisgIC8qIFdlIG1haW50YWluIHNwYWNlIGNvdW50cyBpbiBlYWNoIHBvb2wgaGVhZGVyIGZvciBzdGF0aXN0aWNhbCBwdXJwb3NlcywKKyAgICogZXZlbiB0aG91Z2ggdGhleSBhcmUgbm90IG5lZWRlZCBmb3IgYWxsb2NhdGlvbi4KKyAgICovCisgIGhkcl9wdHItPmhkci5ieXRlc191c2VkID0gc2l6ZW9mb2JqZWN0OworICBoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCA9IDA7CisgIG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXSA9IGhkcl9wdHI7CisKKyAgcmV0dXJuICh2b2lkIEZBUiAqKSAoaGRyX3B0ciArIDEpOyAvKiBwb2ludCB0byBmaXJzdCBkYXRhIGJ5dGUgaW4gcG9vbCAqLworfQorCisKKy8qCisgKiBDcmVhdGlvbiBvZiAyLUQgc2FtcGxlIGFycmF5cy4KKyAqIFRoZSBwb2ludGVycyBhcmUgaW4gbmVhciBoZWFwLCB0aGUgc2FtcGxlcyB0aGVtc2VsdmVzIGluIEZBUiBoZWFwLgorICoKKyAqIFRvIG1pbmltaXplIGFsbG9jYXRpb24gb3ZlcmhlYWQgYW5kIHRvIGFsbG93IEkvTyBvZiBsYXJnZSBjb250aWd1b3VzCisgKiBibG9ja3MsIHdlIGFsbG9jYXRlIHRoZSBzYW1wbGUgcm93cyBpbiBncm91cHMgb2YgYXMgbWFueSByb3dzIGFzIHBvc3NpYmxlCisgKiB3aXRob3V0IGV4Y2VlZGluZyBNQVhfQUxMT0NfQ0hVTksgdG90YWwgYnl0ZXMgcGVyIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAqIE5COiB0aGUgdmlydHVhbCBhcnJheSBjb250cm9sIHJvdXRpbmVzLCBsYXRlciBpbiB0aGlzIGZpbGUsIGtub3cgYWJvdXQKKyAqIHRoaXMgY2h1bmtpbmcgb2Ygcm93cy4gIFRoZSByb3dzcGVyY2h1bmsgdmFsdWUgaXMgbGVmdCBpbiB0aGUgbWVtIG1hbmFnZXIKKyAqIG9iamVjdCBzbyB0aGF0IGl0IGNhbiBiZSBzYXZlZCBhd2F5IGlmIHRoaXMgc2FycmF5IGlzIHRoZSB3b3Jrc3BhY2UgZm9yCisgKiBhIHZpcnR1YWwgYXJyYXkuCisgKi8KKworTUVUSE9EREVGKEpTQU1QQVJSQVkpCithbGxvY19zYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCisJICAgICAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MpCisvKiBBbGxvY2F0ZSBhIDItRCBzYW1wbGUgYXJyYXkgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgSlNBTVBBUlJBWSByZXN1bHQ7CisgIEpTQU1QUk9XIHdvcmtzcGFjZTsKKyAgSkRJTUVOU0lPTiByb3dzcGVyY2h1bmssIGN1cnJvdywgaTsKKyAgbG9uZyBsdGVtcDsKKworICAvKiBDYWxjdWxhdGUgbWF4ICMgb2Ygcm93cyBhbGxvd2VkIGluIG9uZSBhbGxvY2F0aW9uIGNodW5rICovCisgIGx0ZW1wID0gKE1BWF9BTExPQ19DSFVOSy1TSVpFT0YobGFyZ2VfcG9vbF9oZHIpKSAvCisJICAoKGxvbmcpIHNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSkpOworICBpZiAobHRlbXAgPD0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKKyAgaWYgKGx0ZW1wIDwgKGxvbmcpIG51bXJvd3MpCisgICAgcm93c3BlcmNodW5rID0gKEpESU1FTlNJT04pIGx0ZW1wOworICBlbHNlCisgICAgcm93c3BlcmNodW5rID0gbnVtcm93czsKKyAgbWVtLT5sYXN0X3Jvd3NwZXJjaHVuayA9IHJvd3NwZXJjaHVuazsKKworICAvKiBHZXQgc3BhY2UgZm9yIHJvdyBwb2ludGVycyAoc21hbGwgb2JqZWN0KSAqLworICByZXN1bHQgPSAoSlNBTVBBUlJBWSkgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCisJCQkJICAgIChzaXplX3QpIChudW1yb3dzICogU0laRU9GKEpTQU1QUk9XKSkpOworCisgIC8qIEdldCB0aGUgcm93cyB0aGVtc2VsdmVzIChsYXJnZSBvYmplY3RzKSAqLworICBjdXJyb3cgPSAwOworICB3aGlsZSAoY3Vycm93IDwgbnVtcm93cykgeworICAgIHJvd3NwZXJjaHVuayA9IE1JTihyb3dzcGVyY2h1bmssIG51bXJvd3MgLSBjdXJyb3cpOworICAgIHdvcmtzcGFjZSA9IChKU0FNUFJPVykgYWxsb2NfbGFyZ2UoY2luZm8sIHBvb2xfaWQsCisJKHNpemVfdCkgKChzaXplX3QpIHJvd3NwZXJjaHVuayAqIChzaXplX3QpIHNhbXBsZXNwZXJyb3cKKwkJICAqIFNJWkVPRihKU0FNUExFKSkpOworICAgIGZvciAoaSA9IHJvd3NwZXJjaHVuazsgaSA+IDA7IGktLSkgeworICAgICAgcmVzdWx0W2N1cnJvdysrXSA9IHdvcmtzcGFjZTsKKyAgICAgIHdvcmtzcGFjZSArPSBzYW1wbGVzcGVycm93OworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIENyZWF0aW9uIG9mIDItRCBjb2VmZmljaWVudC1ibG9jayBhcnJheXMuCisgKiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSBjb2RlIGZvciBzYW1wbGUgYXJyYXlzLCBhYm92ZS4KKyAqLworCitNRVRIT0RERUYoSkJMT0NLQVJSQVkpCithbGxvY19iYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCisJICAgICAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3csIEpESU1FTlNJT04gbnVtcm93cykKKy8qIEFsbG9jYXRlIGEgMi1EIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIEpCTE9DS0FSUkFZIHJlc3VsdDsKKyAgSkJMT0NLUk9XIHdvcmtzcGFjZTsKKyAgSkRJTUVOU0lPTiByb3dzcGVyY2h1bmssIGN1cnJvdywgaTsKKyAgbG9uZyBsdGVtcDsKKworICAvKiBDYWxjdWxhdGUgbWF4ICMgb2Ygcm93cyBhbGxvd2VkIGluIG9uZSBhbGxvY2F0aW9uIGNodW5rICovCisgIGx0ZW1wID0gKE1BWF9BTExPQ19DSFVOSy1TSVpFT0YobGFyZ2VfcG9vbF9oZHIpKSAvCisJICAoKGxvbmcpIGJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spKTsKKyAgaWYgKGx0ZW1wIDw9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7CisgIGlmIChsdGVtcCA8IChsb25nKSBudW1yb3dzKQorICAgIHJvd3NwZXJjaHVuayA9IChKRElNRU5TSU9OKSBsdGVtcDsKKyAgZWxzZQorICAgIHJvd3NwZXJjaHVuayA9IG51bXJvd3M7CisgIG1lbS0+bGFzdF9yb3dzcGVyY2h1bmsgPSByb3dzcGVyY2h1bms7CisKKyAgLyogR2V0IHNwYWNlIGZvciByb3cgcG9pbnRlcnMgKHNtYWxsIG9iamVjdCkgKi8KKyAgcmVzdWx0ID0gKEpCTE9DS0FSUkFZKSBhbGxvY19zbWFsbChjaW5mbywgcG9vbF9pZCwKKwkJCQkgICAgIChzaXplX3QpIChudW1yb3dzICogU0laRU9GKEpCTE9DS1JPVykpKTsKKworICAvKiBHZXQgdGhlIHJvd3MgdGhlbXNlbHZlcyAobGFyZ2Ugb2JqZWN0cykgKi8KKyAgY3Vycm93ID0gMDsKKyAgd2hpbGUgKGN1cnJvdyA8IG51bXJvd3MpIHsKKyAgICByb3dzcGVyY2h1bmsgPSBNSU4ocm93c3BlcmNodW5rLCBudW1yb3dzIC0gY3Vycm93KTsKKyAgICB3b3Jrc3BhY2UgPSAoSkJMT0NLUk9XKSBhbGxvY19sYXJnZShjaW5mbywgcG9vbF9pZCwKKwkoc2l6ZV90KSAoKHNpemVfdCkgcm93c3BlcmNodW5rICogKHNpemVfdCkgYmxvY2tzcGVycm93CisJCSAgKiBTSVpFT0YoSkJMT0NLKSkpOworICAgIGZvciAoaSA9IHJvd3NwZXJjaHVuazsgaSA+IDA7IGktLSkgeworICAgICAgcmVzdWx0W2N1cnJvdysrXSA9IHdvcmtzcGFjZTsKKyAgICAgIHdvcmtzcGFjZSArPSBibG9ja3NwZXJyb3c7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQWJvdXQgdmlydHVhbCBhcnJheSBtYW5hZ2VtZW50OgorICoKKyAqIFRoZSBhYm92ZSAibm9ybWFsIiBhcnJheSByb3V0aW5lcyBhcmUgb25seSB1c2VkIHRvIGFsbG9jYXRlIHN0cmlwIGJ1ZmZlcnMKKyAqIChhcyB3aWRlIGFzIHRoZSBpbWFnZSwgYnV0IGp1c3QgYSBmZXcgcm93cyBoaWdoKS4gIEZ1bGwtaW1hZ2Utc2l6ZWQgYnVmZmVycworICogYXJlIGhhbmRsZWQgYXMgInZpcnR1YWwiIGFycmF5cy4gIFRoZSBhcnJheSBpcyBzdGlsbCBhY2Nlc3NlZCBhIHN0cmlwIGF0IGEKKyAqIHRpbWUsIGJ1dCB0aGUgbWVtb3J5IG1hbmFnZXIgbXVzdCBzYXZlIHRoZSB3aG9sZSBhcnJheSBmb3IgcmVwZWF0ZWQKKyAqIGFjY2Vzc2VzLiAgVGhlIGludGVuZGVkIGltcGxlbWVudGF0aW9uIGlzIHRoYXQgdGhlcmUgaXMgYSBzdHJpcCBidWZmZXIgaW4KKyAqIG1lbW9yeSAoYXMgaGlnaCBhcyBpcyBwb3NzaWJsZSBnaXZlbiB0aGUgZGVzaXJlZCBtZW1vcnkgbGltaXQpLCBwbHVzIGEKKyAqIGJhY2tpbmcgZmlsZSB0aGF0IGhvbGRzIHRoZSByZXN0IG9mIHRoZSBhcnJheS4KKyAqCisgKiBUaGUgcmVxdWVzdF92aXJ0X2FycmF5IHJvdXRpbmVzIGFyZSB0b2xkIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBpbWFnZSBhbmQKKyAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgd2lsbCBiZSBhY2Nlc3NlZCBhdCBvbmNlLiAgVGhlIGluLW1lbW9yeQorICogYnVmZmVyIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIG1heGFjY2VzcyB2YWx1ZS4KKyAqCisgKiBUaGUgcmVxdWVzdCByb3V0aW5lcyBjcmVhdGUgY29udHJvbCBibG9ja3MgYnV0IG5vdCB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMuCisgKiBUaGF0IGlzIHBvc3Rwb25lZCB1bnRpbCByZWFsaXplX3ZpcnRfYXJyYXlzIGlzIGNhbGxlZC4gIEF0IHRoYXQgdGltZSB0aGUKKyAqIHRvdGFsIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgaXMga25vd24gKGFwcHJveGltYXRlbHksIGFueXdheSksIHNvIGZyZWUKKyAqIG1lbW9yeSBjYW4gYmUgZGl2aWRlZCB1cCBmYWlybHkuCisgKgorICogVGhlIGFjY2Vzc192aXJ0X2FycmF5IHJvdXRpbmVzIGFyZSByZXNwb25zaWJsZSBmb3IgbWFraW5nIGEgc3BlY2lmaWMgc3RyaXAKKyAqIGFyZWEgYWNjZXNzaWJsZSAoYWZ0ZXIgcmVhZGluZyBvciB3cml0aW5nIHRoZSBiYWNraW5nIGZpbGUsIGlmIG5lY2Vzc2FyeSkuCisgKiBOb3RlIHRoYXQgdGhlIGFjY2VzcyByb3V0aW5lcyBhcmUgdG9sZCB3aGV0aGVyIHRoZSBjYWxsZXIgaW50ZW5kcyB0byBtb2RpZnkKKyAqIHRoZSBhY2Nlc3NlZCBzdHJpcDsgZHVyaW5nIGEgcmVhZC1vbmx5IHBhc3MgdGhpcyBzYXZlcyBoYXZpbmcgdG8gcmV3cml0ZQorICogZGF0YSB0byBkaXNrLiAgVGhlIGFjY2VzcyByb3V0aW5lcyBhcmUgYWxzbyByZXNwb25zaWJsZSBmb3IgcHJlLXplcm9pbmcKKyAqIGFueSBuZXdseSBhY2Nlc3NlZCByb3dzLCBpZiBwcmUtemVyb2luZyB3YXMgcmVxdWVzdGVkLgorICoKKyAqIEluIGN1cnJlbnQgdXNhZ2UsIHRoZSBhY2Nlc3MgcmVxdWVzdHMgYXJlIHVzdWFsbHkgZm9yIG5vbm92ZXJsYXBwaW5nCisgKiBzdHJpcHM7IHRoYXQgaXMsIHN1Y2Nlc3NpdmUgYWNjZXNzIHN0YXJ0X3JvdyBudW1iZXJzIGRpZmZlciBieSBleGFjdGx5CisgKiBudW1fcm93cyA9IG1heGFjY2Vzcy4gIFRoaXMgbWVhbnMgd2UgY2FuIGdldCBnb29kIHBlcmZvcm1hbmNlIHdpdGggc2ltcGxlCisgKiBidWZmZXIgZHVtcC9yZWxvYWQgbG9naWMsIGJ5IG1ha2luZyB0aGUgaW4tbWVtb3J5IGJ1ZmZlciBiZSBhIG11bHRpcGxlCisgKiBvZiB0aGUgYWNjZXNzIGhlaWdodDsgdGhlbiB0aGVyZSB3aWxsIG5ldmVyIGJlIGFjY2Vzc2VzIGFjcm9zcyBidWZmZXJsb2FkCisgKiBib3VuZGFyaWVzLiAgVGhlIGNvZGUgd2lsbCBzdGlsbCB3b3JrIHdpdGggb3ZlcmxhcHBpbmcgYWNjZXNzIHJlcXVlc3RzLAorICogYnV0IGl0IGRvZXNuJ3QgaGFuZGxlIGJ1ZmZlcmxvYWQgb3ZlcmxhcHMgdmVyeSBlZmZpY2llbnRseS4KKyAqLworCisKK01FVEhPRERFRihqdmlydF9zYXJyYXlfcHRyKQorcmVxdWVzdF92aXJ0X3NhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgYm9vbGVhbiBwcmVfemVybywKKwkJICAgICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csIEpESU1FTlNJT04gbnVtcm93cywKKwkJICAgICBKRElNRU5TSU9OIG1heGFjY2VzcykKKy8qIFJlcXVlc3QgYSB2aXJ0dWFsIDItRCBzYW1wbGUgYXJyYXkgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAganZpcnRfc2FycmF5X3B0ciByZXN1bHQ7CisKKyAgLyogT25seSBJTUFHRS1saWZldGltZSB2aXJ0dWFsIGFycmF5cyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCAqLworICBpZiAocG9vbF9pZCAhPSBKUE9PTF9JTUFHRSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLworCisgIC8qIGdldCBjb250cm9sIGJsb2NrICovCisgIHJlc3VsdCA9IChqdmlydF9zYXJyYXlfcHRyKSBhbGxvY19zbWFsbChjaW5mbywgcG9vbF9pZCwKKwkJCQkJICBTSVpFT0Yoc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sKSk7CisKKyAgcmVzdWx0LT5tZW1fYnVmZmVyID0gTlVMTDsJLyogbWFya3MgYXJyYXkgbm90IHlldCByZWFsaXplZCAqLworICByZXN1bHQtPnJvd3NfaW5fYXJyYXkgPSBudW1yb3dzOworICByZXN1bHQtPnNhbXBsZXNwZXJyb3cgPSBzYW1wbGVzcGVycm93OworICByZXN1bHQtPm1heGFjY2VzcyA9IG1heGFjY2VzczsKKyAgcmVzdWx0LT5wcmVfemVybyA9IHByZV96ZXJvOworICByZXN1bHQtPmJfc19vcGVuID0gRkFMU0U7CS8qIG5vIGFzc29jaWF0ZWQgYmFja2luZy1zdG9yZSBvYmplY3QgKi8KKyAgcmVzdWx0LT5uZXh0ID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyAvKiBhZGQgdG8gbGlzdCBvZiB2aXJ0dWFsIGFycmF5cyAqLworICBtZW0tPnZpcnRfc2FycmF5X2xpc3QgPSByZXN1bHQ7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitNRVRIT0RERUYoanZpcnRfYmFycmF5X3B0cikKK3JlcXVlc3RfdmlydF9iYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIGJvb2xlYW4gcHJlX3plcm8sCisJCSAgICAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3csIEpESU1FTlNJT04gbnVtcm93cywKKwkJICAgICBKRElNRU5TSU9OIG1heGFjY2VzcykKKy8qIFJlcXVlc3QgYSB2aXJ0dWFsIDItRCBjb2VmZmljaWVudC1ibG9jayBhcnJheSAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBqdmlydF9iYXJyYXlfcHRyIHJlc3VsdDsKKworICAvKiBPbmx5IElNQUdFLWxpZmV0aW1lIHZpcnR1YWwgYXJyYXlzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkICovCisgIGlmIChwb29sX2lkICE9IEpQT09MX0lNQUdFKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCisKKyAgLyogZ2V0IGNvbnRyb2wgYmxvY2sgKi8KKyAgcmVzdWx0ID0gKGp2aXJ0X2JhcnJheV9wdHIpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAorCQkJCQkgIFNJWkVPRihzdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wpKTsKKworICByZXN1bHQtPm1lbV9idWZmZXIgPSBOVUxMOwkvKiBtYXJrcyBhcnJheSBub3QgeWV0IHJlYWxpemVkICovCisgIHJlc3VsdC0+cm93c19pbl9hcnJheSA9IG51bXJvd3M7CisgIHJlc3VsdC0+YmxvY2tzcGVycm93ID0gYmxvY2tzcGVycm93OworICByZXN1bHQtPm1heGFjY2VzcyA9IG1heGFjY2VzczsKKyAgcmVzdWx0LT5wcmVfemVybyA9IHByZV96ZXJvOworICByZXN1bHQtPmJfc19vcGVuID0gRkFMU0U7CS8qIG5vIGFzc29jaWF0ZWQgYmFja2luZy1zdG9yZSBvYmplY3QgKi8KKyAgcmVzdWx0LT5uZXh0ID0gbWVtLT52aXJ0X2JhcnJheV9saXN0OyAvKiBhZGQgdG8gbGlzdCBvZiB2aXJ0dWFsIGFycmF5cyAqLworICBtZW0tPnZpcnRfYmFycmF5X2xpc3QgPSByZXN1bHQ7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitNRVRIT0RERUYodm9pZCkKK3JlYWxpemVfdmlydF9hcnJheXMgKGpfY29tbW9uX3B0ciBjaW5mbykKKy8qIEFsbG9jYXRlIHRoZSBpbi1tZW1vcnkgYnVmZmVycyBmb3IgYW55IHVucmVhbGl6ZWQgdmlydHVhbCBhcnJheXMgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgbG9uZyBzcGFjZV9wZXJfbWluaGVpZ2h0LCBtYXhpbXVtX3NwYWNlLCBhdmFpbF9tZW07CisgIGxvbmcgbWluaGVpZ2h0cywgbWF4X21pbmhlaWdodHM7CisgIGp2aXJ0X3NhcnJheV9wdHIgc3B0cjsKKyAganZpcnRfYmFycmF5X3B0ciBicHRyOworCisgIC8qIENvbXB1dGUgdGhlIG1pbmltdW0gc3BhY2UgbmVlZGVkIChtYXhhY2Nlc3Mgcm93cyBpbiBlYWNoIGJ1ZmZlcikKKyAgICogYW5kIHRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCAoZnVsbCBpbWFnZSBoZWlnaHQgaW4gZWFjaCBidWZmZXIpLgorICAgKiBUaGVzZSBtYXkgYmUgb2YgdXNlIHRvIHRoZSBzeXN0ZW0tZGVwZW5kZW50IGpwZWdfbWVtX2F2YWlsYWJsZSByb3V0aW5lLgorICAgKi8KKyAgc3BhY2VfcGVyX21pbmhlaWdodCA9IDA7CisgIG1heGltdW1fc3BhY2UgPSAwOworICBmb3IgKHNwdHIgPSBtZW0tPnZpcnRfc2FycmF5X2xpc3Q7IHNwdHIgIT0gTlVMTDsgc3B0ciA9IHNwdHItPm5leHQpIHsKKyAgICBpZiAoc3B0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KKyAgICAgIHNwYWNlX3Blcl9taW5oZWlnaHQgKz0gKGxvbmcpIHNwdHItPm1heGFjY2VzcyAqCisJCQkgICAgIChsb25nKSBzcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOworICAgICAgbWF4aW11bV9zcGFjZSArPSAobG9uZykgc3B0ci0+cm93c19pbl9hcnJheSAqCisJCSAgICAgICAobG9uZykgc3B0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKKyAgICB9CisgIH0KKyAgZm9yIChicHRyID0gbWVtLT52aXJ0X2JhcnJheV9saXN0OyBicHRyICE9IE5VTEw7IGJwdHIgPSBicHRyLT5uZXh0KSB7CisgICAgaWYgKGJwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkgeyAvKiBpZiBub3QgcmVhbGl6ZWQgeWV0ICovCisgICAgICBzcGFjZV9wZXJfbWluaGVpZ2h0ICs9IChsb25nKSBicHRyLT5tYXhhY2Nlc3MgKgorCQkJICAgICAobG9uZykgYnB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7CisgICAgICBtYXhpbXVtX3NwYWNlICs9IChsb25nKSBicHRyLT5yb3dzX2luX2FycmF5ICoKKwkJICAgICAgIChsb25nKSBicHRyLT5ibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKTsKKyAgICB9CisgIH0KKworICBpZiAoc3BhY2VfcGVyX21pbmhlaWdodCA8PSAwKQorICAgIHJldHVybjsJCQkvKiBubyB1bnJlYWxpemVkIGFycmF5cywgbm8gd29yayAqLworCisgIC8qIERldGVybWluZSBhbW91bnQgb2YgbWVtb3J5IHRvIGFjdHVhbGx5IHVzZTsgdGhpcyBpcyBzeXN0ZW0tZGVwZW5kZW50LiAqLworICBhdmFpbF9tZW0gPSBqcGVnX21lbV9hdmFpbGFibGUoY2luZm8sIHNwYWNlX3Blcl9taW5oZWlnaHQsIG1heGltdW1fc3BhY2UsCisJCQkJIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkKTsKKworICAvKiBJZiB0aGUgbWF4aW11bSBzcGFjZSBuZWVkZWQgaXMgYXZhaWxhYmxlLCBtYWtlIGFsbCB0aGUgYnVmZmVycyBmdWxsCisgICAqIGhlaWdodDsgb3RoZXJ3aXNlIHBhcmNlbCBpdCBvdXQgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgbWluaGVpZ2h0cworICAgKiBpbiBlYWNoIGJ1ZmZlci4KKyAgICovCisgIGlmIChhdmFpbF9tZW0gPj0gbWF4aW11bV9zcGFjZSkKKyAgICBtYXhfbWluaGVpZ2h0cyA9IDEwMDAwMDAwMDBMOworICBlbHNlIHsKKyAgICBtYXhfbWluaGVpZ2h0cyA9IGF2YWlsX21lbSAvIHNwYWNlX3Blcl9taW5oZWlnaHQ7CisgICAgLyogSWYgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGVub3VnaCBzcGFjZSwgdHJ5IHRvIGdldCB0aGUgbWluaW11bQorICAgICAqIGFueXdheS4gIFRoaXMgYWxsb3dzIGEgInN0dWIiIGltcGxlbWVudGF0aW9uIG9mIGpwZWdfbWVtX2F2YWlsYWJsZSgpLgorICAgICAqLworICAgIGlmIChtYXhfbWluaGVpZ2h0cyA8PSAwKQorICAgICAgbWF4X21pbmhlaWdodHMgPSAxOworICB9CisKKyAgLyogQWxsb2NhdGUgdGhlIGluLW1lbW9yeSBidWZmZXJzIGFuZCBpbml0aWFsaXplIGJhY2tpbmcgc3RvcmUgYXMgbmVlZGVkLiAqLworCisgIGZvciAoc3B0ciA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgc3B0ciAhPSBOVUxMOyBzcHRyID0gc3B0ci0+bmV4dCkgeworICAgIGlmIChzcHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLworICAgICAgbWluaGVpZ2h0cyA9ICgobG9uZykgc3B0ci0+cm93c19pbl9hcnJheSAtIDFMKSAvIHNwdHItPm1heGFjY2VzcyArIDFMOworICAgICAgaWYgKG1pbmhlaWdodHMgPD0gbWF4X21pbmhlaWdodHMpIHsKKwkvKiBUaGlzIGJ1ZmZlciBmaXRzIGluIG1lbW9yeSAqLworCXNwdHItPnJvd3NfaW5fbWVtID0gc3B0ci0+cm93c19pbl9hcnJheTsKKyAgICAgIH0gZWxzZSB7CisJLyogSXQgZG9lc24ndCBmaXQgaW4gbWVtb3J5LCBjcmVhdGUgYmFja2luZyBzdG9yZS4gKi8KKwlzcHRyLT5yb3dzX2luX21lbSA9IChKRElNRU5TSU9OKSAobWF4X21pbmhlaWdodHMgKiBzcHRyLT5tYXhhY2Nlc3MpOworCWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlKGNpbmZvLCAmIHNwdHItPmJfc19pbmZvLAorCQkJCShsb25nKSBzcHRyLT5yb3dzX2luX2FycmF5ICoKKwkJCQkobG9uZykgc3B0ci0+c2FtcGxlc3BlcnJvdyAqCisJCQkJKGxvbmcpIFNJWkVPRihKU0FNUExFKSk7CisJc3B0ci0+Yl9zX29wZW4gPSBUUlVFOworICAgICAgfQorICAgICAgc3B0ci0+bWVtX2J1ZmZlciA9IGFsbG9jX3NhcnJheShjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgc3B0ci0+c2FtcGxlc3BlcnJvdywgc3B0ci0+cm93c19pbl9tZW0pOworICAgICAgc3B0ci0+cm93c3BlcmNodW5rID0gbWVtLT5sYXN0X3Jvd3NwZXJjaHVuazsKKyAgICAgIHNwdHItPmN1cl9zdGFydF9yb3cgPSAwOworICAgICAgc3B0ci0+Zmlyc3RfdW5kZWZfcm93ID0gMDsKKyAgICAgIHNwdHItPmRpcnR5ID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgZm9yIChicHRyID0gbWVtLT52aXJ0X2JhcnJheV9saXN0OyBicHRyICE9IE5VTEw7IGJwdHIgPSBicHRyLT5uZXh0KSB7CisgICAgaWYgKGJwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkgeyAvKiBpZiBub3QgcmVhbGl6ZWQgeWV0ICovCisgICAgICBtaW5oZWlnaHRzID0gKChsb25nKSBicHRyLT5yb3dzX2luX2FycmF5IC0gMUwpIC8gYnB0ci0+bWF4YWNjZXNzICsgMUw7CisgICAgICBpZiAobWluaGVpZ2h0cyA8PSBtYXhfbWluaGVpZ2h0cykgeworCS8qIFRoaXMgYnVmZmVyIGZpdHMgaW4gbWVtb3J5ICovCisJYnB0ci0+cm93c19pbl9tZW0gPSBicHRyLT5yb3dzX2luX2FycmF5OworICAgICAgfSBlbHNlIHsKKwkvKiBJdCBkb2Vzbid0IGZpdCBpbiBtZW1vcnksIGNyZWF0ZSBiYWNraW5nIHN0b3JlLiAqLworCWJwdHItPnJvd3NfaW5fbWVtID0gKEpESU1FTlNJT04pIChtYXhfbWluaGVpZ2h0cyAqIGJwdHItPm1heGFjY2Vzcyk7CisJanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUoY2luZm8sICYgYnB0ci0+Yl9zX2luZm8sCisJCQkJKGxvbmcpIGJwdHItPnJvd3NfaW5fYXJyYXkgKgorCQkJCShsb25nKSBicHRyLT5ibG9ja3NwZXJyb3cgKgorCQkJCShsb25nKSBTSVpFT0YoSkJMT0NLKSk7CisJYnB0ci0+Yl9zX29wZW4gPSBUUlVFOworICAgICAgfQorICAgICAgYnB0ci0+bWVtX2J1ZmZlciA9IGFsbG9jX2JhcnJheShjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgYnB0ci0+YmxvY2tzcGVycm93LCBicHRyLT5yb3dzX2luX21lbSk7CisgICAgICBicHRyLT5yb3dzcGVyY2h1bmsgPSBtZW0tPmxhc3Rfcm93c3BlcmNodW5rOworICAgICAgYnB0ci0+Y3VyX3N0YXJ0X3JvdyA9IDA7CisgICAgICBicHRyLT5maXJzdF91bmRlZl9yb3cgPSAwOworICAgICAgYnB0ci0+ZGlydHkgPSBGQUxTRTsKKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZG9fc2FycmF5X2lvIChqX2NvbW1vbl9wdHIgY2luZm8sIGp2aXJ0X3NhcnJheV9wdHIgcHRyLCBib29sZWFuIHdyaXRpbmcpCisvKiBEbyBiYWNraW5nIHN0b3JlIHJlYWQgb3Igd3JpdGUgb2YgYSB2aXJ0dWFsIHNhbXBsZSBhcnJheSAqLworeworICBsb25nIGJ5dGVzcGVycm93LCBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCwgcm93cywgdGhpc3JvdywgaTsKKworICBieXRlc3BlcnJvdyA9IChsb25nKSBwdHItPnNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSk7CisgIGZpbGVfb2Zmc2V0ID0gcHRyLT5jdXJfc3RhcnRfcm93ICogYnl0ZXNwZXJyb3c7CisgIC8qIExvb3AgdG8gcmVhZCBvciB3cml0ZSBlYWNoIGFsbG9jYXRpb24gY2h1bmsgaW4gbWVtX2J1ZmZlciAqLworICBmb3IgKGkgPSAwOyBpIDwgKGxvbmcpIHB0ci0+cm93c19pbl9tZW07IGkgKz0gcHRyLT5yb3dzcGVyY2h1bmspIHsKKyAgICAvKiBPbmUgY2h1bmssIGJ1dCBjaGVjayBmb3Igc2hvcnQgY2h1bmsgYXQgZW5kIG9mIGJ1ZmZlciAqLworICAgIHJvd3MgPSBNSU4oKGxvbmcpIHB0ci0+cm93c3BlcmNodW5rLCAobG9uZykgcHRyLT5yb3dzX2luX21lbSAtIGkpOworICAgIC8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBpcyBjdXJyZW50bHkgZGVmaW5lZCAqLworICAgIHRoaXNyb3cgPSAobG9uZykgcHRyLT5jdXJfc3RhcnRfcm93ICsgaTsKKyAgICByb3dzID0gTUlOKHJvd3MsIChsb25nKSBwdHItPmZpcnN0X3VuZGVmX3JvdyAtIHRoaXNyb3cpOworICAgIC8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBmaXRzIGluIGZpbGUgKi8KKyAgICByb3dzID0gTUlOKHJvd3MsIChsb25nKSBwdHItPnJvd3NfaW5fYXJyYXkgLSB0aGlzcm93KTsKKyAgICBpZiAocm93cyA8PSAwKQkJLyogdGhpcyBjaHVuayBtaWdodCBiZSBwYXN0IGVuZCBvZiBmaWxlISAqLworICAgICAgYnJlYWs7CisgICAgYnl0ZV9jb3VudCA9IHJvd3MgKiBieXRlc3BlcnJvdzsKKyAgICBpZiAod3JpdGluZykKKyAgICAgICgqcHRyLT5iX3NfaW5mby53cml0ZV9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKKwkJCQkJICAgICh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbaV0sCisJCQkJCSAgICBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7CisgICAgZWxzZQorICAgICAgKCpwdHItPmJfc19pbmZvLnJlYWRfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHB0ci0+Yl9zX2luZm8sCisJCQkJCSAgICh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbaV0sCisJCQkJCSAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKKyAgICBmaWxlX29mZnNldCArPSBieXRlX2NvdW50OworICB9Cit9CisKKworTE9DQUwodm9pZCkKK2RvX2JhcnJheV9pbyAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyIHB0ciwgYm9vbGVhbiB3cml0aW5nKQorLyogRG8gYmFja2luZyBzdG9yZSByZWFkIG9yIHdyaXRlIG9mIGEgdmlydHVhbCBjb2VmZmljaWVudC1ibG9jayBhcnJheSAqLworeworICBsb25nIGJ5dGVzcGVycm93LCBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCwgcm93cywgdGhpc3JvdywgaTsKKworICBieXRlc3BlcnJvdyA9IChsb25nKSBwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOworICBmaWxlX29mZnNldCA9IHB0ci0+Y3VyX3N0YXJ0X3JvdyAqIGJ5dGVzcGVycm93OworICAvKiBMb29wIHRvIHJlYWQgb3Igd3JpdGUgZWFjaCBhbGxvY2F0aW9uIGNodW5rIGluIG1lbV9idWZmZXIgKi8KKyAgZm9yIChpID0gMDsgaSA8IChsb25nKSBwdHItPnJvd3NfaW5fbWVtOyBpICs9IHB0ci0+cm93c3BlcmNodW5rKSB7CisgICAgLyogT25lIGNodW5rLCBidXQgY2hlY2sgZm9yIHNob3J0IGNodW5rIGF0IGVuZCBvZiBidWZmZXIgKi8KKyAgICByb3dzID0gTUlOKChsb25nKSBwdHItPnJvd3NwZXJjaHVuaywgKGxvbmcpIHB0ci0+cm93c19pbl9tZW0gLSBpKTsKKyAgICAvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gaXMgY3VycmVudGx5IGRlZmluZWQgKi8KKyAgICB0aGlzcm93ID0gKGxvbmcpIHB0ci0+Y3VyX3N0YXJ0X3JvdyArIGk7CisgICAgcm93cyA9IE1JTihyb3dzLCAobG9uZykgcHRyLT5maXJzdF91bmRlZl9yb3cgLSB0aGlzcm93KTsKKyAgICAvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gZml0cyBpbiBmaWxlICovCisgICAgcm93cyA9IE1JTihyb3dzLCAobG9uZykgcHRyLT5yb3dzX2luX2FycmF5IC0gdGhpc3Jvdyk7CisgICAgaWYgKHJvd3MgPD0gMCkJCS8qIHRoaXMgY2h1bmsgbWlnaHQgYmUgcGFzdCBlbmQgb2YgZmlsZSEgKi8KKyAgICAgIGJyZWFrOworICAgIGJ5dGVfY291bnQgPSByb3dzICogYnl0ZXNwZXJyb3c7CisgICAgaWYgKHdyaXRpbmcpCisgICAgICAoKnB0ci0+Yl9zX2luZm8ud3JpdGVfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHB0ci0+Yl9zX2luZm8sCisJCQkJCSAgICAodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW2ldLAorCQkJCQkgICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOworICAgIGVsc2UKKyAgICAgICgqcHRyLT5iX3NfaW5mby5yZWFkX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAorCQkJCQkgICAodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW2ldLAorCQkJCQkgICBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7CisgICAgZmlsZV9vZmZzZXQgKz0gYnl0ZV9jb3VudDsKKyAgfQorfQorCisKK01FVEhPRERFRihKU0FNUEFSUkFZKQorYWNjZXNzX3ZpcnRfc2FycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGp2aXJ0X3NhcnJheV9wdHIgcHRyLAorCQkgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gbnVtX3Jvd3MsCisJCSAgICBib29sZWFuIHdyaXRhYmxlKQorLyogQWNjZXNzIHRoZSBwYXJ0IG9mIGEgdmlydHVhbCBzYW1wbGUgYXJyYXkgc3RhcnRpbmcgYXQgc3RhcnRfcm93ICovCisvKiBhbmQgZXh0ZW5kaW5nIGZvciBudW1fcm93cyByb3dzLiAgd3JpdGFibGUgaXMgdHJ1ZSBpZiAgKi8KKy8qIGNhbGxlciBpbnRlbmRzIHRvIG1vZGlmeSB0aGUgYWNjZXNzZWQgYXJlYS4gKi8KK3sKKyAgSkRJTUVOU0lPTiBlbmRfcm93ID0gc3RhcnRfcm93ICsgbnVtX3Jvd3M7CisgIEpESU1FTlNJT04gdW5kZWZfcm93OworCisgIC8qIGRlYnVnZ2luZyBjaGVjayAqLworICBpZiAoZW5kX3JvdyA+IHB0ci0+cm93c19pbl9hcnJheSB8fCBudW1fcm93cyA+IHB0ci0+bWF4YWNjZXNzIHx8CisgICAgICBwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7CisKKyAgLyogTWFrZSB0aGUgZGVzaXJlZCBwYXJ0IG9mIHRoZSB2aXJ0dWFsIGFycmF5IGFjY2Vzc2libGUgKi8KKyAgaWYgKHN0YXJ0X3JvdyA8IHB0ci0+Y3VyX3N0YXJ0X3JvdyB8fAorICAgICAgZW5kX3JvdyA+IHB0ci0+Y3VyX3N0YXJ0X3JvdytwdHItPnJvd3NfaW5fbWVtKSB7CisgICAgaWYgKCEgcHRyLT5iX3Nfb3BlbikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVklSVFVBTF9CVUcpOworICAgIC8qIEZsdXNoIG9sZCBidWZmZXIgY29udGVudHMgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKHB0ci0+ZGlydHkpIHsKKyAgICAgIGRvX3NhcnJheV9pbyhjaW5mbywgcHRyLCBUUlVFKTsKKyAgICAgIHB0ci0+ZGlydHkgPSBGQUxTRTsKKyAgICB9CisgICAgLyogRGVjaWRlIHdoYXQgcGFydCBvZiB2aXJ0dWFsIGFycmF5IHRvIGFjY2Vzcy4KKyAgICAgKiBBbGdvcml0aG06IGlmIHRhcmdldCBhZGRyZXNzID4gY3VycmVudCB3aW5kb3csIGFzc3VtZSBmb3J3YXJkIHNjYW4sCisgICAgICogbG9hZCBzdGFydGluZyBhdCB0YXJnZXQgYWRkcmVzcy4gIElmIHRhcmdldCBhZGRyZXNzIDwgY3VycmVudCB3aW5kb3csCisgICAgICogYXNzdW1lIGJhY2t3YXJkIHNjYW4sIGxvYWQgc28gdGhhdCB0YXJnZXQgYXJlYSBpcyB0b3Agb2Ygd2luZG93LgorICAgICAqIE5vdGUgdGhhdCB3aGVuIHN3aXRjaGluZyBmcm9tIGZvcndhcmQgd3JpdGUgdG8gZm9yd2FyZCByZWFkLCB3aWxsIGhhdmUKKyAgICAgKiBzdGFydF9yb3cgPSAwLCBzbyB0aGUgbGltaXRpbmcgY2FzZSBhcHBsaWVzIGFuZCB3ZSBsb2FkIGZyb20gMCBhbnl3YXkuCisgICAgICovCisgICAgaWYgKHN0YXJ0X3JvdyA+IHB0ci0+Y3VyX3N0YXJ0X3JvdykgeworICAgICAgcHRyLT5jdXJfc3RhcnRfcm93ID0gc3RhcnRfcm93OworICAgIH0gZWxzZSB7CisgICAgICAvKiB1c2UgbG9uZyBhcml0aG1ldGljIGhlcmUgdG8gYXZvaWQgb3ZlcmZsb3cgJiB1bnNpZ25lZCBwcm9ibGVtcyAqLworICAgICAgbG9uZyBsdGVtcDsKKworICAgICAgbHRlbXAgPSAobG9uZykgZW5kX3JvdyAtIChsb25nKSBwdHItPnJvd3NfaW5fbWVtOworICAgICAgaWYgKGx0ZW1wIDwgMCkKKwlsdGVtcCA9IDA7CQkvKiBkb24ndCBmYWxsIG9mZiBmcm9udCBlbmQgb2YgZmlsZSAqLworICAgICAgcHRyLT5jdXJfc3RhcnRfcm93ID0gKEpESU1FTlNJT04pIGx0ZW1wOworICAgIH0KKyAgICAvKiBSZWFkIGluIHRoZSBzZWxlY3RlZCBwYXJ0IG9mIHRoZSBhcnJheS4KKyAgICAgKiBEdXJpbmcgdGhlIGluaXRpYWwgd3JpdGUgcGFzcywgd2Ugd2lsbCBkbyBubyBhY3R1YWwgcmVhZAorICAgICAqIGJlY2F1c2UgdGhlIHNlbGVjdGVkIHBhcnQgaXMgYWxsIHVuZGVmaW5lZC4KKyAgICAgKi8KKyAgICBkb19zYXJyYXlfaW8oY2luZm8sIHB0ciwgRkFMU0UpOworICB9CisgIC8qIEVuc3VyZSB0aGUgYWNjZXNzZWQgcGFydCBvZiB0aGUgYXJyYXkgaXMgZGVmaW5lZDsgcHJlemVybyBpZiBuZWVkZWQuCisgICAqIFRvIGltcHJvdmUgbG9jYWxpdHkgb2YgYWNjZXNzLCB3ZSBvbmx5IHByZXplcm8gdGhlIHBhcnQgb2YgdGhlIGFycmF5CisgICAqIHRoYXQgdGhlIGNhbGxlciBpcyBhYm91dCB0byBhY2Nlc3MsIG5vdCB0aGUgZW50aXJlIGluLW1lbW9yeSBhcnJheS4KKyAgICovCisgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IGVuZF9yb3cpIHsKKyAgICBpZiAocHRyLT5maXJzdF91bmRlZl9yb3cgPCBzdGFydF9yb3cpIHsKKyAgICAgIGlmICh3cml0YWJsZSkJCS8qIHdyaXRlciBza2lwcGVkIG92ZXIgYSBzZWN0aW9uIG9mIGFycmF5ICovCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOworICAgICAgdW5kZWZfcm93ID0gc3RhcnRfcm93OwkvKiBidXQgcmVhZGVyIGlzIGFsbG93ZWQgdG8gcmVhZCBhaGVhZCAqLworICAgIH0gZWxzZSB7CisgICAgICB1bmRlZl9yb3cgPSBwdHItPmZpcnN0X3VuZGVmX3JvdzsKKyAgICB9CisgICAgaWYgKHdyaXRhYmxlKQorICAgICAgcHRyLT5maXJzdF91bmRlZl9yb3cgPSBlbmRfcm93OworICAgIGlmIChwdHItPnByZV96ZXJvKSB7CisgICAgICBzaXplX3QgYnl0ZXNwZXJyb3cgPSAoc2l6ZV90KSBwdHItPnNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSk7CisgICAgICB1bmRlZl9yb3cgLT0gcHRyLT5jdXJfc3RhcnRfcm93OyAvKiBtYWtlIGluZGV4ZXMgcmVsYXRpdmUgdG8gYnVmZmVyICovCisgICAgICBlbmRfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsKKyAgICAgIHdoaWxlICh1bmRlZl9yb3cgPCBlbmRfcm93KSB7CisJanplcm9fZmFyKCh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbdW5kZWZfcm93XSwgYnl0ZXNwZXJyb3cpOworCXVuZGVmX3JvdysrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoISB3cml0YWJsZSkJCS8qIHJlYWRlciBsb29raW5nIGF0IHVuZGVmaW5lZCBkYXRhICovCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOworICAgIH0KKyAgfQorICAvKiBGbGFnIHRoZSBidWZmZXIgZGlydHkgaWYgY2FsbGVyIHdpbGwgd3JpdGUgaW4gaXQgKi8KKyAgaWYgKHdyaXRhYmxlKQorICAgIHB0ci0+ZGlydHkgPSBUUlVFOworICAvKiBSZXR1cm4gYWRkcmVzcyBvZiBwcm9wZXIgcGFydCBvZiB0aGUgYnVmZmVyICovCisgIHJldHVybiBwdHItPm1lbV9idWZmZXIgKyAoc3RhcnRfcm93IC0gcHRyLT5jdXJfc3RhcnRfcm93KTsKK30KKworCitNRVRIT0RERUYoSkJMT0NLQVJSQVkpCithY2Nlc3NfdmlydF9iYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciBwdHIsCisJCSAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBudW1fcm93cywKKwkJICAgIGJvb2xlYW4gd3JpdGFibGUpCisvKiBBY2Nlc3MgdGhlIHBhcnQgb2YgYSB2aXJ0dWFsIGJsb2NrIGFycmF5IHN0YXJ0aW5nIGF0IHN0YXJ0X3JvdyAqLworLyogYW5kIGV4dGVuZGluZyBmb3IgbnVtX3Jvd3Mgcm93cy4gIHdyaXRhYmxlIGlzIHRydWUgaWYgICovCisvKiBjYWxsZXIgaW50ZW5kcyB0byBtb2RpZnkgdGhlIGFjY2Vzc2VkIGFyZWEuICovCit7CisgIEpESU1FTlNJT04gZW5kX3JvdyA9IHN0YXJ0X3JvdyArIG51bV9yb3dzOworICBKRElNRU5TSU9OIHVuZGVmX3JvdzsKKworICAvKiBkZWJ1Z2dpbmcgY2hlY2sgKi8KKyAgaWYgKGVuZF9yb3cgPiBwdHItPnJvd3NfaW5fYXJyYXkgfHwgbnVtX3Jvd3MgPiBwdHItPm1heGFjY2VzcyB8fAorICAgICAgcHRyLT5tZW1fYnVmZmVyID09IE5VTEwpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOworCisgIC8qIE1ha2UgdGhlIGRlc2lyZWQgcGFydCBvZiB0aGUgdmlydHVhbCBhcnJheSBhY2Nlc3NpYmxlICovCisgIGlmIChzdGFydF9yb3cgPCBwdHItPmN1cl9zdGFydF9yb3cgfHwKKyAgICAgIGVuZF9yb3cgPiBwdHItPmN1cl9zdGFydF9yb3crcHRyLT5yb3dzX2luX21lbSkgeworICAgIGlmICghIHB0ci0+Yl9zX29wZW4pCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1ZJUlRVQUxfQlVHKTsKKyAgICAvKiBGbHVzaCBvbGQgYnVmZmVyIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChwdHItPmRpcnR5KSB7CisgICAgICBkb19iYXJyYXlfaW8oY2luZm8sIHB0ciwgVFJVRSk7CisgICAgICBwdHItPmRpcnR5ID0gRkFMU0U7CisgICAgfQorICAgIC8qIERlY2lkZSB3aGF0IHBhcnQgb2YgdmlydHVhbCBhcnJheSB0byBhY2Nlc3MuCisgICAgICogQWxnb3JpdGhtOiBpZiB0YXJnZXQgYWRkcmVzcyA+IGN1cnJlbnQgd2luZG93LCBhc3N1bWUgZm9yd2FyZCBzY2FuLAorICAgICAqIGxvYWQgc3RhcnRpbmcgYXQgdGFyZ2V0IGFkZHJlc3MuICBJZiB0YXJnZXQgYWRkcmVzcyA8IGN1cnJlbnQgd2luZG93LAorICAgICAqIGFzc3VtZSBiYWNrd2FyZCBzY2FuLCBsb2FkIHNvIHRoYXQgdGFyZ2V0IGFyZWEgaXMgdG9wIG9mIHdpbmRvdy4KKyAgICAgKiBOb3RlIHRoYXQgd2hlbiBzd2l0Y2hpbmcgZnJvbSBmb3J3YXJkIHdyaXRlIHRvIGZvcndhcmQgcmVhZCwgd2lsbCBoYXZlCisgICAgICogc3RhcnRfcm93ID0gMCwgc28gdGhlIGxpbWl0aW5nIGNhc2UgYXBwbGllcyBhbmQgd2UgbG9hZCBmcm9tIDAgYW55d2F5LgorICAgICAqLworICAgIGlmIChzdGFydF9yb3cgPiBwdHItPmN1cl9zdGFydF9yb3cpIHsKKyAgICAgIHB0ci0+Y3VyX3N0YXJ0X3JvdyA9IHN0YXJ0X3JvdzsKKyAgICB9IGVsc2UgeworICAgICAgLyogdXNlIGxvbmcgYXJpdGhtZXRpYyBoZXJlIHRvIGF2b2lkIG92ZXJmbG93ICYgdW5zaWduZWQgcHJvYmxlbXMgKi8KKyAgICAgIGxvbmcgbHRlbXA7CisKKyAgICAgIGx0ZW1wID0gKGxvbmcpIGVuZF9yb3cgLSAobG9uZykgcHRyLT5yb3dzX2luX21lbTsKKyAgICAgIGlmIChsdGVtcCA8IDApCisJbHRlbXAgPSAwOwkJLyogZG9uJ3QgZmFsbCBvZmYgZnJvbnQgZW5kIG9mIGZpbGUgKi8KKyAgICAgIHB0ci0+Y3VyX3N0YXJ0X3JvdyA9IChKRElNRU5TSU9OKSBsdGVtcDsKKyAgICB9CisgICAgLyogUmVhZCBpbiB0aGUgc2VsZWN0ZWQgcGFydCBvZiB0aGUgYXJyYXkuCisgICAgICogRHVyaW5nIHRoZSBpbml0aWFsIHdyaXRlIHBhc3MsIHdlIHdpbGwgZG8gbm8gYWN0dWFsIHJlYWQKKyAgICAgKiBiZWNhdXNlIHRoZSBzZWxlY3RlZCBwYXJ0IGlzIGFsbCB1bmRlZmluZWQuCisgICAgICovCisgICAgZG9fYmFycmF5X2lvKGNpbmZvLCBwdHIsIEZBTFNFKTsKKyAgfQorICAvKiBFbnN1cmUgdGhlIGFjY2Vzc2VkIHBhcnQgb2YgdGhlIGFycmF5IGlzIGRlZmluZWQ7IHByZXplcm8gaWYgbmVlZGVkLgorICAgKiBUbyBpbXByb3ZlIGxvY2FsaXR5IG9mIGFjY2Vzcywgd2Ugb25seSBwcmV6ZXJvIHRoZSBwYXJ0IG9mIHRoZSBhcnJheQorICAgKiB0aGF0IHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gYWNjZXNzLCBub3QgdGhlIGVudGlyZSBpbi1tZW1vcnkgYXJyYXkuCisgICAqLworICBpZiAocHRyLT5maXJzdF91bmRlZl9yb3cgPCBlbmRfcm93KSB7CisgICAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgc3RhcnRfcm93KSB7CisgICAgICBpZiAod3JpdGFibGUpCQkvKiB3cml0ZXIgc2tpcHBlZCBvdmVyIGEgc2VjdGlvbiBvZiBhcnJheSAqLworCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKyAgICAgIHVuZGVmX3JvdyA9IHN0YXJ0X3JvdzsJLyogYnV0IHJlYWRlciBpcyBhbGxvd2VkIHRvIHJlYWQgYWhlYWQgKi8KKyAgICB9IGVsc2UgeworICAgICAgdW5kZWZfcm93ID0gcHRyLT5maXJzdF91bmRlZl9yb3c7CisgICAgfQorICAgIGlmICh3cml0YWJsZSkKKyAgICAgIHB0ci0+Zmlyc3RfdW5kZWZfcm93ID0gZW5kX3JvdzsKKyAgICBpZiAocHRyLT5wcmVfemVybykgeworICAgICAgc2l6ZV90IGJ5dGVzcGVycm93ID0gKHNpemVfdCkgcHRyLT5ibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKTsKKyAgICAgIHVuZGVmX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7IC8qIG1ha2UgaW5kZXhlcyByZWxhdGl2ZSB0byBidWZmZXIgKi8KKyAgICAgIGVuZF9yb3cgLT0gcHRyLT5jdXJfc3RhcnRfcm93OworICAgICAgd2hpbGUgKHVuZGVmX3JvdyA8IGVuZF9yb3cpIHsKKwlqemVyb19mYXIoKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlclt1bmRlZl9yb3ddLCBieXRlc3BlcnJvdyk7CisJdW5kZWZfcm93Kys7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghIHdyaXRhYmxlKQkJLyogcmVhZGVyIGxvb2tpbmcgYXQgdW5kZWZpbmVkIGRhdGEgKi8KKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7CisgICAgfQorICB9CisgIC8qIEZsYWcgdGhlIGJ1ZmZlciBkaXJ0eSBpZiBjYWxsZXIgd2lsbCB3cml0ZSBpbiBpdCAqLworICBpZiAod3JpdGFibGUpCisgICAgcHRyLT5kaXJ0eSA9IFRSVUU7CisgIC8qIFJldHVybiBhZGRyZXNzIG9mIHByb3BlciBwYXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgcmV0dXJuIHB0ci0+bWVtX2J1ZmZlciArIChzdGFydF9yb3cgLSBwdHItPmN1cl9zdGFydF9yb3cpOworfQorCisKKy8qCisgKiBSZWxlYXNlIGFsbCBvYmplY3RzIGJlbG9uZ2luZyB0byBhIHNwZWNpZmllZCBwb29sLgorICovCisKK01FVEhPRERFRih2b2lkKQorZnJlZV9wb29sIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkKQoreworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBzbWFsbF9wb29sX3B0ciBzaGRyX3B0cjsKKyAgbGFyZ2VfcG9vbF9wdHIgbGhkcl9wdHI7CisgIHNpemVfdCBzcGFjZV9mcmVlZDsKKworICBpZiAocG9vbF9pZCA8IDAgfHwgcG9vbF9pZCA+PSBKUE9PTF9OVU1QT09MUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLworCisjaWZkZWYgTUVNX1NUQVRTCisgIGlmIChjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA+IDEpCisgICAgcHJpbnRfbWVtX3N0YXRzKGNpbmZvLCBwb29sX2lkKTsgLyogcHJpbnQgcG9vbCdzIG1lbW9yeSB1c2FnZSBzdGF0aXN0aWNzICovCisjZW5kaWYKKworICAvKiBJZiBmcmVlaW5nIElNQUdFIHBvb2wsIGNsb3NlIGFueSB2aXJ0dWFsIGFycmF5cyBmaXJzdCAqLworICBpZiAocG9vbF9pZCA9PSBKUE9PTF9JTUFHRSkgeworICAgIGp2aXJ0X3NhcnJheV9wdHIgc3B0cjsKKyAgICBqdmlydF9iYXJyYXlfcHRyIGJwdHI7CisKKyAgICBmb3IgKHNwdHIgPSBtZW0tPnZpcnRfc2FycmF5X2xpc3Q7IHNwdHIgIT0gTlVMTDsgc3B0ciA9IHNwdHItPm5leHQpIHsKKyAgICAgIGlmIChzcHRyLT5iX3Nfb3BlbikgewkvKiB0aGVyZSBtYXkgYmUgbm8gYmFja2luZyBzdG9yZSAqLworCXNwdHItPmJfc19vcGVuID0gRkFMU0U7CS8qIHByZXZlbnQgcmVjdXJzaXZlIGNsb3NlIGlmIGVycm9yICovCisJKCpzcHRyLT5iX3NfaW5mby5jbG9zZV9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgc3B0ci0+Yl9zX2luZm8pOworICAgICAgfQorICAgIH0KKyAgICBtZW0tPnZpcnRfc2FycmF5X2xpc3QgPSBOVUxMOworICAgIGZvciAoYnB0ciA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgYnB0ciAhPSBOVUxMOyBicHRyID0gYnB0ci0+bmV4dCkgeworICAgICAgaWYgKGJwdHItPmJfc19vcGVuKSB7CS8qIHRoZXJlIG1heSBiZSBubyBiYWNraW5nIHN0b3JlICovCisJYnB0ci0+Yl9zX29wZW4gPSBGQUxTRTsJLyogcHJldmVudCByZWN1cnNpdmUgY2xvc2UgaWYgZXJyb3IgKi8KKwkoKmJwdHItPmJfc19pbmZvLmNsb3NlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBicHRyLT5iX3NfaW5mbyk7CisgICAgICB9CisgICAgfQorICAgIG1lbS0+dmlydF9iYXJyYXlfbGlzdCA9IE5VTEw7CisgIH0KKworICAvKiBSZWxlYXNlIGxhcmdlIG9iamVjdHMgKi8KKyAgbGhkcl9wdHIgPSBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF07CisgIG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXSA9IE5VTEw7CisKKyAgd2hpbGUgKGxoZHJfcHRyICE9IE5VTEwpIHsKKyAgICBsYXJnZV9wb29sX3B0ciBuZXh0X2xoZHJfcHRyID0gbGhkcl9wdHItPmhkci5uZXh0OworICAgIHNwYWNlX2ZyZWVkID0gbGhkcl9wdHItPmhkci5ieXRlc191c2VkICsKKwkJICBsaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgKworCQkgIFNJWkVPRihsYXJnZV9wb29sX2hkcik7CisgICAganBlZ19mcmVlX2xhcmdlKGNpbmZvLCAodm9pZCBGQVIgKikgbGhkcl9wdHIsIHNwYWNlX2ZyZWVkKTsKKyAgICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCAtPSBzcGFjZV9mcmVlZDsKKyAgICBsaGRyX3B0ciA9IG5leHRfbGhkcl9wdHI7CisgIH0KKworICAvKiBSZWxlYXNlIHNtYWxsIG9iamVjdHMgKi8KKyAgc2hkcl9wdHIgPSBtZW0tPnNtYWxsX2xpc3RbcG9vbF9pZF07CisgIG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXSA9IE5VTEw7CisKKyAgd2hpbGUgKHNoZHJfcHRyICE9IE5VTEwpIHsKKyAgICBzbWFsbF9wb29sX3B0ciBuZXh0X3NoZHJfcHRyID0gc2hkcl9wdHItPmhkci5uZXh0OworICAgIHNwYWNlX2ZyZWVkID0gc2hkcl9wdHItPmhkci5ieXRlc191c2VkICsKKwkJICBzaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgKworCQkgIFNJWkVPRihzbWFsbF9wb29sX2hkcik7CisgICAganBlZ19mcmVlX3NtYWxsKGNpbmZvLCAodm9pZCAqKSBzaGRyX3B0ciwgc3BhY2VfZnJlZWQpOworICAgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkIC09IHNwYWNlX2ZyZWVkOworICAgIHNoZHJfcHRyID0gbmV4dF9zaGRyX3B0cjsKKyAgfQorfQorCisKKy8qCisgKiBDbG9zZSB1cCBzaG9wIGVudGlyZWx5LgorICogTm90ZSB0aGF0IHRoaXMgY2Fubm90IGJlIGNhbGxlZCB1bmxlc3MgY2luZm8tPm1lbSBpcyBub24tTlVMTC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3NlbGZfZGVzdHJ1Y3QgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgaW50IHBvb2w7CisKKyAgLyogQ2xvc2UgYWxsIGJhY2tpbmcgc3RvcmUsIHJlbGVhc2UgYWxsIG1lbW9yeS4KKyAgICogUmVsZWFzaW5nIHBvb2xzIGluIHJldmVyc2Ugb3JkZXIgbWlnaHQgaGVscCBhdm9pZCBmcmFnbWVudGF0aW9uCisgICAqIHdpdGggc29tZSAoYnJhaW4tZGFtYWdlZCkgbWFsbG9jIGxpYnJhcmllcy4KKyAgICovCisgIGZvciAocG9vbCA9IEpQT09MX05VTVBPT0xTLTE7IHBvb2wgPj0gSlBPT0xfUEVSTUFORU5UOyBwb29sLS0pIHsKKyAgICBmcmVlX3Bvb2woY2luZm8sIHBvb2wpOworICB9CisKKyAgLyogUmVsZWFzZSB0aGUgbWVtb3J5IG1hbmFnZXIgY29udHJvbCBibG9jayB0b28uICovCisgIGpwZWdfZnJlZV9zbWFsbChjaW5mbywgKHZvaWQgKikgY2luZm8tPm1lbSwgU0laRU9GKG15X21lbW9yeV9tZ3IpKTsKKyAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBlbnN1cmVzIEkgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlICovCisKKyAganBlZ19tZW1fdGVybShjaW5mbyk7CQkvKiBzeXN0ZW0tZGVwZW5kZW50IGNsZWFudXAgKi8KK30KKworCisvKgorICogTWVtb3J5IG1hbmFnZXIgaW5pdGlhbGl6YXRpb24uCisgKiBXaGVuIHRoaXMgaXMgY2FsbGVkLCBvbmx5IHRoZSBlcnJvciBtYW5hZ2VyIHBvaW50ZXIgaXMgdmFsaWQgaW4gY2luZm8hCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9tZW1vcnlfbWdyIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIG15X21lbV9wdHIgbWVtOworICBsb25nIG1heF90b191c2U7CisgIGludCBwb29sOworICBzaXplX3QgdGVzdF9tYWM7CisKKyAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBmb3Igc2FmZXR5IGlmIGluaXQgZmFpbHMgKi8KKworICAvKiBDaGVjayBmb3IgY29uZmlndXJhdGlvbiBlcnJvcnMuCisgICAqIFNJWkVPRihBTElHTl9UWVBFKSBzaG91bGQgYmUgYSBwb3dlciBvZiAyOyBvdGhlcndpc2UsIGl0IHByb2JhYmx5CisgICAqIGRvZXNuJ3QgcmVmbGVjdCBhbnkgcmVhbCBoYXJkd2FyZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQuCisgICAqIFRoZSB0ZXN0IGlzIGEgbGl0dGxlIHRyaWNreTogZm9yIFg+MCwgWCBhbmQgWC0xIGhhdmUgbm8gb25lLWJpdHMKKyAgICogaW4gY29tbW9uIGlmIGFuZCBvbmx5IGlmIFggaXMgYSBwb3dlciBvZiAyLCBpZSBoYXMgb25seSBvbmUgb25lLWJpdC4KKyAgICogU29tZSBjb21waWxlcnMgbWF5IGdpdmUgYW4gInVucmVhY2hhYmxlIGNvZGUiIHdhcm5pbmcgaGVyZTsgaWdub3JlIGl0LgorICAgKi8KKyAgaWYgKChTSVpFT0YoQUxJR05fVFlQRSkgJiAoU0laRU9GKEFMSUdOX1RZUEUpLTEpKSAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0FMSUdOX1RZUEUpOworICAvKiBNQVhfQUxMT0NfQ0hVTksgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIHR5cGUgc2l6ZV90LCBhbmQgbXVzdCBiZQorICAgKiBhIG11bHRpcGxlIG9mIFNJWkVPRihBTElHTl9UWVBFKS4KKyAgICogQWdhaW4sIGFuICJ1bnJlYWNoYWJsZSBjb2RlIiB3YXJuaW5nIG1heSBiZSBpZ25vcmVkIGhlcmUuCisgICAqIEJ1dCBhICJjb25zdGFudCB0b28gbGFyZ2UiIHdhcm5pbmcgbWVhbnMgeW91IG5lZWQgdG8gZml4IE1BWF9BTExPQ19DSFVOSy4KKyAgICovCisgIHRlc3RfbWFjID0gKHNpemVfdCkgTUFYX0FMTE9DX0NIVU5LOworICBpZiAoKGxvbmcpIHRlc3RfbWFjICE9IE1BWF9BTExPQ19DSFVOSyB8fAorICAgICAgKE1BWF9BTExPQ19DSFVOSyAlIFNJWkVPRihBTElHTl9UWVBFKSkgIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTExPQ19DSFVOSyk7CisKKyAgbWF4X3RvX3VzZSA9IGpwZWdfbWVtX2luaXQoY2luZm8pOyAvKiBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uICovCisKKyAgLyogQXR0ZW1wdCB0byBhbGxvY2F0ZSBtZW1vcnkgbWFuYWdlcidzIGNvbnRyb2wgYmxvY2sgKi8KKyAgbWVtID0gKG15X21lbV9wdHIpIGpwZWdfZ2V0X3NtYWxsKGNpbmZvLCBTSVpFT0YobXlfbWVtb3J5X21ncikpOworCisgIGlmIChtZW0gPT0gTlVMTCkgeworICAgIGpwZWdfbWVtX3Rlcm0oY2luZm8pOwkvKiBzeXN0ZW0tZGVwZW5kZW50IGNsZWFudXAgKi8KKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9PVVRfT0ZfTUVNT1JZLCAwKTsKKyAgfQorCisgIC8qIE9LLCBmaWxsIGluIHRoZSBtZXRob2QgcG9pbnRlcnMgKi8KKyAgbWVtLT5wdWIuYWxsb2Nfc21hbGwgPSBhbGxvY19zbWFsbDsKKyAgbWVtLT5wdWIuYWxsb2NfbGFyZ2UgPSBhbGxvY19sYXJnZTsKKyAgbWVtLT5wdWIuYWxsb2Nfc2FycmF5ID0gYWxsb2Nfc2FycmF5OworICBtZW0tPnB1Yi5hbGxvY19iYXJyYXkgPSBhbGxvY19iYXJyYXk7CisgIG1lbS0+cHViLnJlcXVlc3RfdmlydF9zYXJyYXkgPSByZXF1ZXN0X3ZpcnRfc2FycmF5OworICBtZW0tPnB1Yi5yZXF1ZXN0X3ZpcnRfYmFycmF5ID0gcmVxdWVzdF92aXJ0X2JhcnJheTsKKyAgbWVtLT5wdWIucmVhbGl6ZV92aXJ0X2FycmF5cyA9IHJlYWxpemVfdmlydF9hcnJheXM7CisgIG1lbS0+cHViLmFjY2Vzc192aXJ0X3NhcnJheSA9IGFjY2Vzc192aXJ0X3NhcnJheTsKKyAgbWVtLT5wdWIuYWNjZXNzX3ZpcnRfYmFycmF5ID0gYWNjZXNzX3ZpcnRfYmFycmF5OworICBtZW0tPnB1Yi5mcmVlX3Bvb2wgPSBmcmVlX3Bvb2w7CisgIG1lbS0+cHViLnNlbGZfZGVzdHJ1Y3QgPSBzZWxmX2Rlc3RydWN0OworCisgIC8qIE1ha2UgTUFYX0FMTE9DX0NIVU5LIGFjY2Vzc2libGUgdG8gb3RoZXIgbW9kdWxlcyAqLworICBtZW0tPnB1Yi5tYXhfYWxsb2NfY2h1bmsgPSBNQVhfQUxMT0NfQ0hVTks7CisKKyAgLyogSW5pdGlhbGl6ZSB3b3JraW5nIHN0YXRlICovCisgIG1lbS0+cHViLm1heF9tZW1vcnlfdG9fdXNlID0gbWF4X3RvX3VzZTsKKworICBmb3IgKHBvb2wgPSBKUE9PTF9OVU1QT09MUy0xOyBwb29sID49IEpQT09MX1BFUk1BTkVOVDsgcG9vbC0tKSB7CisgICAgbWVtLT5zbWFsbF9saXN0W3Bvb2xdID0gTlVMTDsKKyAgICBtZW0tPmxhcmdlX2xpc3RbcG9vbF0gPSBOVUxMOworICB9CisgIG1lbS0+dmlydF9zYXJyYXlfbGlzdCA9IE5VTEw7CisgIG1lbS0+dmlydF9iYXJyYXlfbGlzdCA9IE5VTEw7CisKKyAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgPSBTSVpFT0YobXlfbWVtb3J5X21ncik7CisKKyAgLyogRGVjbGFyZSBvdXJzZWx2ZXMgb3BlbiBmb3IgYnVzaW5lc3MgKi8KKyAgY2luZm8tPm1lbSA9ICYgbWVtLT5wdWI7CisKKyAgLyogQ2hlY2sgZm9yIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIEpQRUdNRU07IGlmIGZvdW5kLCBvdmVycmlkZSB0aGUKKyAgICogZGVmYXVsdCBtYXhfbWVtb3J5IHNldHRpbmcgZnJvbSBqcGVnX21lbV9pbml0LiAgTm90ZSB0aGF0IHRoZQorICAgKiBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtYXkgYWdhaW4gb3ZlcnJpZGUgdGhpcyB2YWx1ZS4KKyAgICogSWYgeW91ciBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IGdldGVudigpLCBkZWZpbmUgTk9fR0VURU5WIHRvIGRpc2FibGUKKyAgICogdGhpcyBmZWF0dXJlLgorICAgKi8KKyNpZm5kZWYgTk9fR0VURU5WCisgIHsgY2hhciAqIG1lbWVudjsKKworICAgIGlmICgobWVtZW52ID0gZ2V0ZW52KCJKUEVHTUVNIikpICE9IE5VTEwpIHsKKyAgICAgIGNoYXIgY2ggPSAneCc7CisKKyAgICAgIGlmIChzc2NhbmYobWVtZW52LCAiJWxkJWMiLCAmbWF4X3RvX3VzZSwgJmNoKSA+IDApIHsKKwlpZiAoY2ggPT0gJ20nIHx8IGNoID09ICdNJykKKwkgIG1heF90b191c2UgKj0gMTAwMEw7CisJbWVtLT5wdWIubWF4X21lbW9yeV90b191c2UgPSBtYXhfdG9fdXNlICogMTAwMEw7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvam1lbW5vYnMuYyBiL2NvbW1vbi9qcGVnL2ptZW1ub2JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4YzMzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2ptZW1ub2JzLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBqbWVtbm9icy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSByZWFsbHkgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeXN0ZW0tCisgKiBkZXBlbmRlbnQgcG9ydGlvbiBvZiB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlci4gIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGFzc3VtZXMgdGhhdCBubyBiYWNraW5nLXN0b3JlIGZpbGVzIGFyZSBuZWVkZWQ6IGFsbCByZXF1aXJlZCBzcGFjZQorICogY2FuIGJlIG9idGFpbmVkIGZyb20gbWFsbG9jKCkuCisgKiBUaGlzIGlzIHZlcnkgcG9ydGFibGUgaW4gdGhlIHNlbnNlIHRoYXQgaXQnbGwgY29tcGlsZSBvbiBhbG1vc3QgYW55dGhpbmcsCisgKiBidXQgeW91J2QgYmV0dGVyIGhhdmUgbG90cyBvZiBtYWluIG1lbW9yeSAob3IgdmlydHVhbCBtZW1vcnkpIGlmIHlvdSB3YW50CisgKiB0byBwcm9jZXNzIGJpZyBpbWFnZXMuCisgKiBOb3RlIHRoYXQgdGhlIG1heF9tZW1vcnlfdG9fdXNlIG9wdGlvbiBpcyBpZ25vcmVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIG1hbGxvYygpLGZyZWUoKSAqLworZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOworZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOworI2VuZGlmCisKKworLyoKKyAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKKyAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCisgKi8KKworR0xPQkFMKHZvaWQgKikKK2pwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZnJlZShvYmplY3QpOworfQorCisKKy8qCisgKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgorICogTkI6IGFsdGhvdWdoIHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucywKKyAqIHRoaXMgZmlsZSB3b24ndCBhY3R1YWxseSB3b3JrIGluIDgweDg2IHNtYWxsL21lZGl1bSBtb2RlbDsgYXQgbGVhc3QsCisgKiB5b3UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBwcm9jZXNzIHVzZWZ1bC1zaXplIGltYWdlcyBpbiBvbmx5IDY0S0IuCisgKi8KKworR0xPQkFMKHZvaWQgRkFSICopCitqcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgRkFSICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZnJlZShvYmplY3QpOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCisgKiBIZXJlIHdlIGFsd2F5cyBzYXksICJ3ZSBnb3QgYWxsIHlvdSB3YW50IGJ1ZCEiCisgKi8KKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQoreworICByZXR1cm4gbWF4X2J5dGVzX25lZWRlZDsKK30KKworCisvKgorICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCisgKiBTaW5jZSBqcGVnX21lbV9hdmFpbGFibGUgYWx3YXlzIHByb21pc2VkIHRoZSBtb29uLAorICogdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGFuZCB3ZSBjYW4ganVzdCBlcnJvciBvdXQuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQoreworICBFUlJFWElUKGNpbmZvLCBKRVJSX05PX0JBQ0tJTkdfU1RPUkUpOworfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCisgKiBjbGVhbnVwIHJlcXVpcmVkLiAgSGVyZSwgdGhlcmUgaXNuJ3QgYW55LgorICovCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICByZXR1cm4gMDsJCQkvKiBqdXN0IHNldCBtYXhfbWVtb3J5X3RvX3VzZSB0byAwICovCit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9qbWVtc3lzLmggYi9jb21tb24vanBlZy9qbWVtc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzYzZkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2ptZW1zeXMuaApAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIGptZW1zeXMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBpbmNsdWRlIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHN5c3RlbS1pbmRlcGVuZGVudAorICogYW5kIHN5c3RlbS1kZXBlbmRlbnQgcG9ydGlvbnMgb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBObyBvdGhlcgorICogbW9kdWxlcyBuZWVkIGluY2x1ZGUgaXQuICAoVGhlIHN5c3RlbS1pbmRlcGVuZGVudCBwb3J0aW9uIGlzIGptZW1tZ3IuYzsKKyAqIHRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudCBwb3J0aW9uLikKKyAqCisgKiBUaGlzIGZpbGUgd29ya3MgYXMtaXMgZm9yIHRoZSBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VycyBzdXBwbGllZAorICogaW4gdGhlIElKRyBkaXN0cmlidXRpb24uICBZb3UgbWF5IG5lZWQgdG8gbW9kaWZ5IGl0IGlmIHlvdSB3cml0ZSBhCisgKiBjdXN0b20gbWVtb3J5IG1hbmFnZXIuICBJZiBzeXN0ZW0tZGVwZW5kZW50IGNoYW5nZXMgYXJlIG5lZWRlZCBpbgorICogdGhpcyBmaWxlLCB0aGUgYmVzdCBtZXRob2QgaXMgdG8gI2lmZGVmIHRoZW0gYmFzZWQgb24gYSBjb25maWd1cmF0aW9uCisgKiBzeW1ib2wgc3VwcGxpZWQgaW4gamNvbmZpZy5oLCBhcyB3ZSBoYXZlIGRvbmUgd2l0aCBVU0VfTVNET1NfTUVNTUdSCisgKiBhbmQgVVNFX01BQ19NRU1NR1IuCisgKi8KKworCisvKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganBlZ19nZXRfc21hbGwJCWpHZXRTbWFsbAorI2RlZmluZSBqcGVnX2ZyZWVfc21hbGwJCWpGcmVlU21hbGwKKyNkZWZpbmUganBlZ19nZXRfbGFyZ2UJCWpHZXRMYXJnZQorI2RlZmluZSBqcGVnX2ZyZWVfbGFyZ2UJCWpGcmVlTGFyZ2UKKyNkZWZpbmUganBlZ19tZW1fYXZhaWxhYmxlCWpNZW1BdmFpbAorI2RlZmluZSBqcGVnX29wZW5fYmFja2luZ19zdG9yZQlqT3BlbkJhY2tTdG9yZQorI2RlZmluZSBqcGVnX21lbV9pbml0CQlqTWVtSW5pdAorI2RlZmluZSBqcGVnX21lbV90ZXJtCQlqTWVtVGVybQorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworCisvKgorICogVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBhbGxvY2F0ZSBhbmQgcmVsZWFzZSBzbWFsbCBjaHVua3Mgb2YKKyAqIG1lbW9yeS4gIChUeXBpY2FsbHkgdGhlIHRvdGFsIGFtb3VudCByZXF1ZXN0ZWQgdGhyb3VnaCBqcGVnX2dldF9zbWFsbCBpcworICogbm8gbW9yZSB0aGFuIDIwSyBvciBzbzsgdGhpcyB3aWxsIGJlIHJlcXVlc3RlZCBpbiBjaHVua3Mgb2YgYSBmZXcgSyBlYWNoLikKKyAqIEJlaGF2aW9yIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBmb3IgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zIG1hbGxvYworICogYW5kIGZyZWU7IGluIHBhcnRpY3VsYXIsIGpwZWdfZ2V0X3NtYWxsIG11c3QgcmV0dXJuIE5VTEwgb24gZmFpbHVyZS4KKyAqIE9uIG1vc3Qgc3lzdGVtcywgdGhlc2UgQVJFIG1hbGxvYyBhbmQgZnJlZS4gIGpwZWdfZnJlZV9zbWFsbCBpcyBwYXNzZWQgdGhlCisgKiBzaXplIG9mIHRoZSBvYmplY3QgYmVpbmcgZnJlZWQsIGp1c3QgaW4gY2FzZSBpdCdzIG5lZWRlZC4KKyAqIE9uIGFuIDgweDg2IG1hY2hpbmUgdXNpbmcgc21hbGwtZGF0YSBtZW1vcnkgbW9kZWwsIHRoZXNlIG1hbmFnZSBuZWFyIGhlYXAuCisgKi8KKworRVhURVJOKHZvaWQgKikganBlZ19nZXRfc21hbGwgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZyZWVfc21hbGwgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsCisJCQkJICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CisKKy8qCisgKiBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGFsbG9jYXRlIGFuZCByZWxlYXNlIGxhcmdlIGNodW5rcyBvZgorICogbWVtb3J5ICh1cCB0byB0aGUgdG90YWwgZnJlZSBzcGFjZSBkZXNpZ25hdGVkIGJ5IGpwZWdfbWVtX2F2YWlsYWJsZSkuCisgKiBUaGUgaW50ZXJmYWNlIGlzIHRoZSBzYW1lIGFzIGFib3ZlLCBleGNlcHQgdGhhdCBvbiBhbiA4MHg4NiBtYWNoaW5lLAorICogZmFyIHBvaW50ZXJzIGFyZSB1c2VkLiAgT24gbW9zdCBvdGhlciBtYWNoaW5lcyB0aGVzZSBhcmUgaWRlbnRpY2FsIHRvCisgKiB0aGUganBlZ19nZXQvZnJlZV9zbWFsbCByb3V0aW5lczsgYnV0IHdlIGtlZXAgdGhlbSBzZXBhcmF0ZSBhbnl3YXksCisgKiBpbiBjYXNlIGEgZGlmZmVyZW50IGFsbG9jYXRpb24gc3RyYXRlZ3kgaXMgZGVzaXJhYmxlIGZvciBsYXJnZSBjaHVua3MuCisgKi8KKworRVhURVJOKHZvaWQgRkFSICopIGpwZWdfZ2V0X2xhcmdlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCSAgICAgICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CitFWFRFUk4odm9pZCkganBlZ19mcmVlX2xhcmdlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwKKwkJCQkgIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKKworLyoKKyAqIFRoZSBtYWNybyBNQVhfQUxMT0NfQ0hVTksgZGVzaWduYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkKKyAqIGJlIHJlcXVlc3RlZCBpbiBhIHNpbmdsZSBjYWxsIHRvIGpwZWdfZ2V0X2xhcmdlIChhbmQganBlZ19nZXRfc21hbGwgZm9yIHRoYXQKKyAqIG1hdHRlciwgYnV0IHRoYXQgY2FzZSBzaG91bGQgbmV2ZXIgY29tZSBpbnRvIHBsYXkpLiAgVGhpcyBtYWNybyBpcyBuZWVkZWQKKyAqIHRvIG1vZGVsIHRoZSA2NEtiLXNlZ21lbnQtc2l6ZSBsaW1pdCBvZiBmYXIgYWRkcmVzc2luZyBvbiA4MHg4NiBtYWNoaW5lcy4KKyAqIE9uIHRob3NlIG1hY2hpbmVzLCB3ZSBleHBlY3QgdGhhdCBqY29uZmlnLmggd2lsbCBwcm92aWRlIGEgcHJvcGVyIHZhbHVlLgorICogT24gbWFjaGluZXMgd2l0aCAzMi1iaXQgZmxhdCBhZGRyZXNzIHNwYWNlcywgYW55IGxhcmdlIGNvbnN0YW50IG1heSBiZSB1c2VkLgorICoKKyAqIE5COiBqbWVtbWdyLmMgZXhwZWN0cyB0aGF0IE1BWF9BTExPQ19DSFVOSyB3aWxsIGJlIHJlcHJlc2VudGFibGUgYXMgdHlwZQorICogc2l6ZV90IGFuZCB3aWxsIGJlIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKGFsaWduX3R5cGUpLgorICovCisKKyNpZm5kZWYgTUFYX0FMTE9DX0NIVU5LCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KKyNkZWZpbmUgTUFYX0FMTE9DX0NIVU5LICAxMDAwMDAwMDAwTAorI2VuZGlmCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIHNwYWNlIHN0aWxsIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiBieQorICoganBlZ19nZXRfbGFyZ2UuICBJZiBtb3JlIHNwYWNlIHRoYW4gdGhpcyBpcyBuZWVkZWQsIGJhY2tpbmcgc3RvcmUgd2lsbCBiZQorICogdXNlZC4gIE5PVEU6IGFueSBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWQgbXVzdCBub3QgYmUgY291bnRlZC4KKyAqCisgKiBUaGVyZSBpcyBhIG1pbmltdW0gc3BhY2UgcmVxdWlyZW1lbnQsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1pbmltdW0KKyAqIGZlYXNpYmxlIGJ1ZmZlciBzaXplczsgam1lbW1nci5jIHdpbGwgcmVxdWVzdCB0aGF0IG11Y2ggc3BhY2UgZXZlbiBpZgorICoganBlZ19tZW1fYXZhaWxhYmxlIHJldHVybnMgemVyby4gIFRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCwgZW5vdWdoIHRvIGhvbGQKKyAqIGFsbCB3b3JraW5nIHN0b3JhZ2UgaW4gbWVtb3J5LCBpcyBhbHNvIHBhc3NlZCBpbiBjYXNlIGl0IGlzIHVzZWZ1bC4KKyAqIEZpbmFsbHksIHRoZSB0b3RhbCBzcGFjZSBhbHJlYWR5IGFsbG9jYXRlZCBpcyBwYXNzZWQuICBJZiBubyBiZXR0ZXIKKyAqIG1ldGhvZCBpcyBhdmFpbGFibGUsIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlIC0gYWxyZWFkeV9hbGxvY2F0ZWQKKyAqIGlzIG9mdGVuIGEgc3VpdGFibGUgY2FsY3VsYXRpb24uCisgKgorICogSXQgaXMgT0sgZm9yIGpwZWdfbWVtX2F2YWlsYWJsZSB0byB1bmRlcmVzdGltYXRlIHRoZSBzcGFjZSBhdmFpbGFibGUKKyAqICh0aGF0J2xsIGp1c3QgbGVhZCB0byBtb3JlIGJhY2tpbmctc3RvcmUgYWNjZXNzIHRoYW4gaXMgcmVhbGx5IG5lY2Vzc2FyeSkuCisgKiBIb3dldmVyLCBhbiBvdmVyZXN0aW1hdGUgd2lsbCBsZWFkIHRvIGZhaWx1cmUuICBIZW5jZSBpdCdzIHdpc2UgdG8gc3VidHJhY3QKKyAqIGEgc2xvcCBmYWN0b3IgZnJvbSB0aGUgdHJ1ZSBhdmFpbGFibGUgc3BhY2UuICA1JSBzaG91bGQgYmUgZW5vdWdoLgorICoKKyAqIE9uIG1hY2hpbmVzIHdpdGggbG90cyBvZiB2aXJ0dWFsIG1lbW9yeSwgYW55IGxhcmdlIGNvbnN0YW50IG1heSBiZSByZXR1cm5lZC4KKyAqIENvbnZlcnNlbHksIHplcm8gbWF5IGJlIHJldHVybmVkIHRvIGFsd2F5cyB1c2UgdGhlIG1pbmltdW0gYW1vdW50IG9mIG1lbW9yeS4KKyAqLworCitFWFRFUk4obG9uZykganBlZ19tZW1fYXZhaWxhYmxlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCSAgICAgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkJCSAgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLAorCQkJCSAgICAgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkpOworCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB3aGF0ZXZlciBzdGF0ZSBpcyBuZWVkZWQgdG8gYWNjZXNzIGEgc2luZ2xlCisgKiBiYWNraW5nLXN0b3JlIG9iamVjdC4gIFRoZSByZWFkL3dyaXRlL2Nsb3NlIG1ldGhvZCBwb2ludGVycyBhcmUgY2FsbGVkCisgKiBieSBqbWVtbWdyLmMgdG8gbWFuaXB1bGF0ZSB0aGUgYmFja2luZy1zdG9yZSBvYmplY3Q7IGFsbCBvdGhlciBmaWVsZHMKKyAqIGFyZSBwcml2YXRlIHRvIHRoZSBzeXN0ZW0tZGVwZW5kZW50IGJhY2tpbmcgc3RvcmUgcm91dGluZXMuCisgKi8KKworI2RlZmluZSBURU1QX05BTUVfTEVOR1RIICAgNjQJLyogbWF4IGxlbmd0aCBvZiBhIHRlbXBvcmFyeSBmaWxlJ3MgbmFtZSAqLworCisKKyNpZmRlZiBVU0VfTVNET1NfTUVNTUdSCQkvKiBET1Mtc3BlY2lmaWMganVuayAqLworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFhNU0g7CS8qIHR5cGUgb2YgZXh0ZW5kZWQtbWVtb3J5IGhhbmRsZXMgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgRU1TSDsJLyogdHlwZSBvZiBleHBhbmRlZC1tZW1vcnkgaGFuZGxlcyAqLworCit0eXBlZGVmIHVuaW9uIHsKKyAgc2hvcnQgZmlsZV9oYW5kbGU7CQkvKiBET1MgZmlsZSBoYW5kbGUgaWYgaXQncyBhIHRlbXAgZmlsZSAqLworICBYTVNIIHhtc19oYW5kbGU7CQkvKiBoYW5kbGUgaWYgaXQncyBhIGNodW5rIG9mIFhNUyAqLworICBFTVNIIGVtc19oYW5kbGU7CQkvKiBoYW5kbGUgaWYgaXQncyBhIGNodW5rIG9mIEVNUyAqLworfSBoYW5kbGVfdW5pb247CisKKyNlbmRpZiAvKiBVU0VfTVNET1NfTUVNTUdSICovCisKKyNpZmRlZiBVU0VfTUFDX01FTU1HUgkJLyogTWFjLXNwZWNpZmljIGp1bmsgKi8KKyNpbmNsdWRlIDxGaWxlcy5oPgorI2VuZGlmIC8qIFVTRV9NQUNfTUVNTUdSICovCisKKwordHlwZWRlZiBzdHJ1Y3QgYmFja2luZ19zdG9yZV9zdHJ1Y3QgKiBiYWNraW5nX3N0b3JlX3B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgYmFja2luZ19zdG9yZV9zdHJ1Y3QgeworICAvKiBNZXRob2RzIGZvciByZWFkaW5nL3dyaXRpbmcvY2xvc2luZyB0aGlzIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCisgIEpNRVRIT0Qodm9pZCwgcmVhZF9iYWNraW5nX3N0b3JlLCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCSAgICAgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCQkgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCQkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9iYWNraW5nX3N0b3JlLCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCSAgICAgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkJICAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJCQkgICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpKTsKKyAgSk1FVEhPRCh2b2lkLCBjbG9zZV9iYWNraW5nX3N0b3JlLCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCSAgICAgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pKTsKKworICAvKiBQcml2YXRlIGZpZWxkcyBmb3Igc3lzdGVtLWRlcGVuZGVudCBiYWNraW5nLXN0b3JlIG1hbmFnZW1lbnQgKi8KKyNpZmRlZiBVU0VfTVNET1NfTUVNTUdSCisgIC8qIEZvciB0aGUgTVMtRE9TIG1hbmFnZXIgKGptZW1kb3MuYyksIHdlIG5lZWQ6ICovCisgIGhhbmRsZV91bmlvbiBoYW5kbGU7CQkvKiByZWZlcmVuY2UgdG8gYmFja2luZy1zdG9yZSBzdG9yYWdlIG9iamVjdCAqLworICBjaGFyIHRlbXBfbmFtZVtURU1QX05BTUVfTEVOR1RIXTsgLyogbmFtZSBpZiBpdCdzIGEgZmlsZSAqLworI2Vsc2UKKyNpZmRlZiBVU0VfTUFDX01FTU1HUgorICAvKiBGb3IgdGhlIE1hYyBtYW5hZ2VyIChqbWVtbWFjLmMpLCB3ZSBuZWVkOiAqLworICBzaG9ydCB0ZW1wX2ZpbGU7CQkvKiBmaWxlIHJlZmVyZW5jZSBudW1iZXIgdG8gdGVtcCBmaWxlICovCisgIEZTU3BlYyB0ZW1wU3BlYzsJCS8qIHRoZSBGU1NwZWMgZm9yIHRoZSB0ZW1wIGZpbGUgKi8KKyAgY2hhciB0ZW1wX25hbWVbVEVNUF9OQU1FX0xFTkdUSF07IC8qIG5hbWUgaWYgaXQncyBhIGZpbGUgKi8KKyNlbHNlCisgIC8qIEZvciBhIHR5cGljYWwgaW1wbGVtZW50YXRpb24gd2l0aCB0ZW1wIGZpbGVzLCB3ZSBuZWVkOiAqLworICBGSUxFICogdGVtcF9maWxlOwkJLyogc3RkaW8gcmVmZXJlbmNlIHRvIHRlbXAgZmlsZSAqLworICBjaGFyIHRlbXBfbmFtZVtURU1QX05BTUVfTEVOR1RIXTsgLyogbmFtZSBvZiB0ZW1wIGZpbGUgKi8KKyNlbmRpZgorI2VuZGlmCit9IGJhY2tpbmdfc3RvcmVfaW5mbzsKKworCisvKgorICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuICBUaGlzIG11c3QgZmlsbCBpbiB0aGUKKyAqIHJlYWQvd3JpdGUvY2xvc2UgcG9pbnRlcnMgaW4gdGhlIG9iamVjdC4gIFRoZSByZWFkL3dyaXRlIHJvdXRpbmVzCisgKiBtYXkgdGFrZSBhbiBlcnJvciBleGl0IGlmIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBmaWxlIHNpemUgaXMgZXhjZWVkZWQuCisgKiAoSWYganBlZ19tZW1fYXZhaWxhYmxlIGFsd2F5cyByZXR1cm5zIGEgbGFyZ2UgdmFsdWUsIHRoaXMgcm91dGluZSBjYW4KKyAqIGp1c3QgdGFrZSBhbiBlcnJvciBleGl0LikKKyAqLworCitFWFRFUk4odm9pZCkganBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sCisJCQkJCSAgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCQkJICBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkpOworCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCisgKiBjbGVhbnVwIHJlcXVpcmVkLiAganBlZ19tZW1faW5pdCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgaXMKKyAqIGFsbG9jYXRlZCAoYW5kLCB0aGVyZWZvcmUsIG5vdGhpbmcgaW4gY2luZm8gaXMgb2YgdXNlIGV4Y2VwdCB0aGUgZXJyb3IKKyAqIG1hbmFnZXIgcG9pbnRlcikuICBJdCBzaG91bGQgcmV0dXJuIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSBmb3IKKyAqIG1heF9tZW1vcnlfdG9fdXNlOyB0aGlzIG1heSBzdWJzZXF1ZW50bHkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgc3Vycm91bmRpbmcKKyAqIGFwcGxpY2F0aW9uLiAgKE5vdGUgdGhhdCBtYXhfbWVtb3J5X3RvX3VzZSBpcyBvbmx5IGltcG9ydGFudCBpZgorICoganBlZ19tZW1fYXZhaWxhYmxlIGNob29zZXMgdG8gY29uc3VsdCBpdCAuLi4gbm8gb25lIGVsc2Ugd2lsbC4pCisgKiBqcGVnX21lbV90ZXJtIG1heSBhc3N1bWUgdGhhdCBhbGwgcmVxdWVzdGVkIG1lbW9yeSBoYXMgYmVlbiBmcmVlZCBhbmQgdGhhdAorICogYWxsIG9wZW5lZCBiYWNraW5nLXN0b3JlIG9iamVjdHMgaGF2ZSBiZWVuIGNsb3NlZC4KKyAqLworCitFWFRFUk4obG9uZykganBlZ19tZW1faW5pdCBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfbWVtX3Rlcm0gSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2ptb3JlY2ZnLmggYi9jb21tb24vanBlZy9qbW9yZWNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YTdkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qbW9yZWNmZy5oCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogam1vcmVjZmcuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgY3VzdG9taXplIHRoZQorICogSlBFRyBzb2Z0d2FyZSBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMgb3Igc3VwcG9ydCBtYWNoaW5lLWRlcGVuZGVudAorICogb3B0aW1pemF0aW9ucy4gIE1vc3QgdXNlcnMgd2lsbCBub3QgbmVlZCB0byB0b3VjaCB0aGlzIGZpbGUuCisgKi8KKworCisvKgorICogRGVmaW5lIEJJVFNfSU5fSlNBTVBMRSBhcyBlaXRoZXIKKyAqICAgOCAgIGZvciA4LWJpdCBzYW1wbGUgdmFsdWVzICh0aGUgdXN1YWwgc2V0dGluZykKKyAqICAgMTIgIGZvciAxMi1iaXQgc2FtcGxlIHZhbHVlcworICogT25seSA4IGFuZCAxMiBhcmUgbGVnYWwgZGF0YSBwcmVjaXNpb25zIGZvciBsb3NzeSBKUEVHIGFjY29yZGluZyB0byB0aGUKKyAqIEpQRUcgc3RhbmRhcmQsIGFuZCB0aGUgSUpHIGNvZGUgZG9lcyBub3Qgc3VwcG9ydCBhbnl0aGluZyBlbHNlIQorICogV2UgZG8gbm90IHN1cHBvcnQgcnVuLXRpbWUgc2VsZWN0aW9uIG9mIGRhdGEgcHJlY2lzaW9uLCBzb3JyeS4KKyAqLworCisjZGVmaW5lIEJJVFNfSU5fSlNBTVBMRSAgOAkvKiB1c2UgOCBvciAxMiAqLworCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBjb21wb25lbnRzIChjb2xvciBjaGFubmVscykgYWxsb3dlZCBpbiBKUEVHIGltYWdlLgorICogVG8gbWVldCB0aGUgbGV0dGVyIG9mIHRoZSBKUEVHIHNwZWMsIHNldCB0aGlzIHRvIDI1NS4gIEhvd2V2ZXIsIGRhcm4KKyAqIGZldyBhcHBsaWNhdGlvbnMgbmVlZCBtb3JlIHRoYW4gNCBjaGFubmVscyAobWF5YmUgNSBmb3IgQ01ZSyArIGFscGhhCisgKiBtYXNrKS4gIFdlIHJlY29tbWVuZCAxMCBhcyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZTsgdXNlIDQgaWYgeW91IGFyZQorICogcmVhbGx5IHNob3J0IG9uIG1lbW9yeS4gIChFYWNoIGFsbG93ZWQgY29tcG9uZW50IGNvc3RzIGEgaHVuZHJlZCBvciBzbworICogYnl0ZXMgb2Ygc3RvcmFnZSwgd2hldGhlciBhY3R1YWxseSB1c2VkIGluIGFuIGltYWdlIG9yIG5vdC4pCisgKi8KKworI2RlZmluZSBNQVhfQ09NUE9ORU5UUyAgMTAJLyogbWF4aW11bSBudW1iZXIgb2YgaW1hZ2UgY29tcG9uZW50cyAqLworCisKKy8qCisgKiBCYXNpYyBkYXRhIHR5cGVzLgorICogWW91IG1heSBuZWVkIHRvIGNoYW5nZSB0aGVzZSBpZiB5b3UgaGF2ZSBhIG1hY2hpbmUgd2l0aCB1bnVzdWFsIGRhdGEKKyAqIHR5cGUgc2l6ZXM7IGZvciBleGFtcGxlLCAiY2hhciIgbm90IDggYml0cywgInNob3J0IiBub3QgMTYgYml0cywKKyAqIG9yICJsb25nIiBub3QgMzIgYml0cy4gIFdlIGRvbid0IGNhcmUgd2hldGhlciAiaW50IiBpcyAxNiBvciAzMiBiaXRzLAorICogYnV0IGl0IGhhZCBiZXR0ZXIgYmUgYXQgbGVhc3QgMTYuCisgKi8KKworLyogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgc2FtcGxlIChwaXhlbCBlbGVtZW50IHZhbHVlKS4KKyAqIFdlIGZyZXF1ZW50bHkgYWxsb2NhdGUgbGFyZ2UgYXJyYXlzIG9mIHRoZXNlLCBzbyBpdCdzIGltcG9ydGFudCB0byBrZWVwCisgKiB0aGVtIHNtYWxsLiAgQnV0IGlmIHlvdSBoYXZlIG1lbW9yeSB0byBidXJuIGFuZCBhY2Nlc3MgdG8gY2hhciBvciBzaG9ydAorICogYXJyYXlzIGlzIHZlcnkgc2xvdyBvbiB5b3VyIGhhcmR3YXJlLCB5b3UgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhlc2UuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisvKiBKU0FNUExFIHNob3VsZCBiZSB0aGUgc21hbGxlc3QgdHlwZSB0aGF0IHdpbGwgaG9sZCB0aGUgdmFsdWVzIDAuLjI1NS4KKyAqIFlvdSBjYW4gdXNlIGEgc2lnbmVkIGNoYXIgYnkgaGF2aW5nIEdFVEpTQU1QTEUgbWFzayBpdCB3aXRoIDB4RkYuCisgKi8KKworI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgSlNBTVBMRTsKKyNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpKQorCisjZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCisKK3R5cGVkZWYgY2hhciBKU0FNUExFOworI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpKQorI2Vsc2UKKyNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpICYgMHhGRikKKyNlbmRpZiAvKiBDSEFSX0lTX1VOU0lHTkVEICovCisKKyNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKworI2RlZmluZSBNQVhKU0FNUExFCTI1NQorI2RlZmluZSBDRU5URVJKU0FNUExFCTEyOAorCisjZW5kaWYgLyogQklUU19JTl9KU0FNUExFID09IDggKi8KKworCisjaWYgQklUU19JTl9KU0FNUExFID09IDEyCisvKiBKU0FNUExFIHNob3VsZCBiZSB0aGUgc21hbGxlc3QgdHlwZSB0aGF0IHdpbGwgaG9sZCB0aGUgdmFsdWVzIDAuLjQwOTUuCisgKiBPbiBuZWFybHkgYWxsIG1hY2hpbmVzICJzaG9ydCIgd2lsbCBkbyBuaWNlbHkuCisgKi8KKwordHlwZWRlZiBzaG9ydCBKU0FNUExFOworI2RlZmluZSBHRVRKU0FNUExFKHZhbHVlKSAgKChpbnQpICh2YWx1ZSkpCisKKyNkZWZpbmUgTUFYSlNBTVBMRQk0MDk1CisjZGVmaW5lIENFTlRFUkpTQU1QTEUJMjA0OAorCisjZW5kaWYgLyogQklUU19JTl9KU0FNUExFID09IDEyICovCisKKworLyogUmVwcmVzZW50YXRpb24gb2YgYSBEQ1QgZnJlcXVlbmN5IGNvZWZmaWNpZW50LgorICogVGhpcyBzaG91bGQgYmUgYSBzaWduZWQgdmFsdWUgb2YgYXQgbGVhc3QgMTYgYml0czsgInNob3J0IiBpcyB1c3VhbGx5IE9LLgorICogQWdhaW4sIHdlIGFsbG9jYXRlIGxhcmdlIGFycmF5cyBvZiB0aGVzZSwgYnV0IHlvdSBjYW4gY2hhbmdlIHRvIGludAorICogaWYgeW91IGhhdmUgbWVtb3J5IHRvIGJ1cm4gYW5kICJzaG9ydCIgaXMgcmVhbGx5IHNsb3cuCisgKi8KKwordHlwZWRlZiBzaG9ydCBKQ09FRjsKKworCisvKiBDb21wcmVzc2VkIGRhdGFzdHJlYW1zIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgSk9DVEVULgorICogVGhlc2UgbXVzdCBiZSBFWEFDVExZIDggYml0cyB3aWRlLCBhdCBsZWFzdCBvbmNlIHRoZXkgYXJlIHdyaXR0ZW4gdG8KKyAqIGV4dGVybmFsIHN0b3JhZ2UuICBOb3RlIHRoYXQgd2hlbiB1c2luZyB0aGUgc3RkaW8gZGF0YSBzb3VyY2UvZGVzdGluYXRpb24KKyAqIG1hbmFnZXJzLCB0aGlzIGlzIGFsc28gdGhlIGRhdGEgdHlwZSBwYXNzZWQgdG8gZnJlYWQvZndyaXRlLgorICovCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEpPQ1RFVDsKKyNkZWZpbmUgR0VUSk9DVEVUKHZhbHVlKSAgKHZhbHVlKQorCisjZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCisKK3R5cGVkZWYgY2hhciBKT0NURVQ7CisjaWZkZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBHRVRKT0NURVQodmFsdWUpICAodmFsdWUpCisjZWxzZQorI2RlZmluZSBHRVRKT0NURVQodmFsdWUpICAoKHZhbHVlKSAmIDB4RkYpCisjZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLworCisjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCisKKworLyogVGhlc2UgdHlwZWRlZnMgYXJlIHVzZWQgZm9yIHZhcmlvdXMgdGFibGUgZW50cmllcyBhbmQgc28gZm9ydGguCisgKiBUaGV5IG11c3QgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyBzcGVjaWZpZWQ7IGJ1dCBtYWtpbmcgdGhlbSB0b28gYmlnCisgKiB3b24ndCBjb3N0IGEgaHVnZSBhbW91bnQgb2YgbWVtb3J5LCBzbyB3ZSBkb24ndCBwcm92aWRlIHNwZWNpYWwKKyAqIGV4dHJhY3Rpb24gY29kZSBsaWtlIHdlIGRpZCBmb3IgSlNBTVBMRS4gIChJbiBvdGhlciB3b3JkcywgdGhlc2UKKyAqIHR5cGVkZWZzIGxpdmUgYXQgYSBkaWZmZXJlbnQgcG9pbnQgb24gdGhlIHNwZWVkL3NwYWNlIHRyYWRlb2ZmIGN1cnZlLikKKyAqLworCisvKiBVSU5UOCBtdXN0IGhvbGQgYXQgbGVhc3QgdGhlIHZhbHVlcyAwLi4yNTUuICovCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVSU5UODsKKyNlbHNlIC8qIG5vdCBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKyNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECit0eXBlZGVmIGNoYXIgVUlOVDg7CisjZWxzZSAvKiBub3QgQ0hBUl9JU19VTlNJR05FRCAqLwordHlwZWRlZiBzaG9ydCBVSU5UODsKKyNlbmRpZiAvKiBDSEFSX0lTX1VOU0lHTkVEICovCisjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCisKKy8qIFVJTlQxNiBtdXN0IGhvbGQgYXQgbGVhc3QgdGhlIHZhbHVlcyAwLi42NTUzNS4gKi8KKworI2lmZGVmIEhBVkVfVU5TSUdORURfU0hPUlQKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OworI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfU0hPUlQgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQxNjsKKyNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX1NIT1JUICovCisKKy8qIElOVDE2IG11c3QgaG9sZCBhdCBsZWFzdCB0aGUgdmFsdWVzIC0zMjc2OC4uMzI3NjcuICovCisKKyNpZm5kZWYgWE1EX0gJCQkvKiBYMTEveG1kLmggY29ycmVjdGx5IGRlZmluZXMgSU5UMTYgKi8KK3R5cGVkZWYgc2hvcnQgSU5UMTY7CisjZW5kaWYKKworLyogSU5UMzIgbXVzdCBob2xkIGF0IGxlYXN0IHNpZ25lZCAzMi1iaXQgdmFsdWVzLiAqLworCisjaWZuZGVmIFhNRF9ICQkJLyogWDExL3htZC5oIGNvcnJlY3RseSBkZWZpbmVzIElOVDMyICovCit0eXBlZGVmIGxvbmcgSU5UMzI7CisjZW5kaWYKKworLyogRGF0YXR5cGUgdXNlZCBmb3IgaW1hZ2UgZGltZW5zaW9ucy4gIFRoZSBKUEVHIHN0YW5kYXJkIG9ubHkgc3VwcG9ydHMKKyAqIGltYWdlcyB1cCB0byA2NEsqNjRLIGR1ZSB0byAxNi1iaXQgZmllbGRzIGluIFNPRiBtYXJrZXJzLiAgVGhlcmVmb3JlCisgKiAidW5zaWduZWQgaW50IiBpcyBzdWZmaWNpZW50IG9uIGFsbCBtYWNoaW5lcy4gIEhvd2V2ZXIsIGlmIHlvdSBuZWVkIHRvCisgKiBoYW5kbGUgbGFyZ2VyIGltYWdlcyBhbmQgeW91IGRvbid0IG1pbmQgZGV2aWF0aW5nIGZyb20gdGhlIHNwZWMsIHlvdQorICogY2FuIGNoYW5nZSB0aGlzIGRhdGF0eXBlLgorICovCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IEpESU1FTlNJT047CisKKyNkZWZpbmUgSlBFR19NQVhfRElNRU5TSU9OICA2NTUwMEwgIC8qIGEgdGFkIHVuZGVyIDY0SyB0byBwcmV2ZW50IG92ZXJmbG93cyAqLworCisKKy8qIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBpbiBhbGwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYW5kIGV4dGVybiBkZWNsYXJhdGlvbnMuCisgKiBZb3UgY291bGQgbW9kaWZ5IHRoZW0gaWYgeW91IG5lZWQgdG8gY2hhbmdlIGZ1bmN0aW9uIGxpbmthZ2UgY29udmVudGlvbnM7CisgKiBpbiBwYXJ0aWN1bGFyLCB5b3UnbGwgbmVlZCB0byBkbyB0aGF0IHRvIG1ha2UgdGhlIGxpYnJhcnkgYSBXaW5kb3dzIERMTC4KKyAqIEFub3RoZXIgYXBwbGljYXRpb24gaXMgdG8gbWFrZSBhbGwgZnVuY3Rpb25zIGdsb2JhbCBmb3IgdXNlIHdpdGggZGVidWdnZXJzCisgKiBvciBjb2RlIHByb2ZpbGVycyB0aGF0IHJlcXVpcmUgaXQuCisgKi8KKworLyogYSBmdW5jdGlvbiBjYWxsZWQgdGhyb3VnaCBtZXRob2QgcG9pbnRlcnM6ICovCisjZGVmaW5lIE1FVEhPRERFRih0eXBlKQkJc3RhdGljIHR5cGUKKy8qIGEgZnVuY3Rpb24gdXNlZCBvbmx5IGluIGl0cyBtb2R1bGU6ICovCisjZGVmaW5lIExPQ0FMKHR5cGUpCQlzdGF0aWMgdHlwZQorLyogYSBmdW5jdGlvbiByZWZlcmVuY2VkIHRocnUgRVhURVJOczogKi8KKyNkZWZpbmUgR0xPQkFMKHR5cGUpCQl0eXBlCisvKiBhIHJlZmVyZW5jZSB0byBhIEdMT0JBTCBmdW5jdGlvbjogKi8KKyNkZWZpbmUgRVhURVJOKHR5cGUpCQlleHRlcm4gdHlwZQorCisKKy8qIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBkZWNsYXJlIGEgIm1ldGhvZCIsIHRoYXQgaXMsIGEgZnVuY3Rpb24gcG9pbnRlci4KKyAqIFdlIHdhbnQgdG8gc3VwcGx5IHByb3RvdHlwZSBwYXJhbWV0ZXJzIGlmIHRoZSBjb21waWxlciBjYW4gY29wZS4KKyAqIE5vdGUgdGhhdCB0aGUgYXJnbGlzdCBwYXJhbWV0ZXIgbXVzdCBiZSBwYXJlbnRoZXNpemVkIQorICogQWdhaW4sIHlvdSBjYW4gY3VzdG9taXplIHRoaXMgaWYgeW91IG5lZWQgc3BlY2lhbCBsaW5rYWdlIGtleXdvcmRzLgorICovCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSBhcmdsaXN0CisjZWxzZQorI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoKm1ldGhvZG5hbWUpICgpCisjZW5kaWYKKworCisvKiBIZXJlIGlzIHRoZSBwc2V1ZG8ta2V5d29yZCBmb3IgZGVjbGFyaW5nIHBvaW50ZXJzIHRoYXQgbXVzdCBiZSAiZmFyIgorICogb24gODB4ODYgbWFjaGluZXMuICBNb3N0IG9mIHRoZSBzcGVjaWFsaXplZCBjb2RpbmcgZm9yIDgweDg2IGlzIGhhbmRsZWQKKyAqIGJ5IGp1c3Qgc2F5aW5nICJGQVIgKiIgd2hlcmUgc3VjaCBhIHBvaW50ZXIgaXMgbmVlZGVkLiAgSW4gYSBmZXcgcGxhY2VzCisgKiBleHBsaWNpdCBjb2RpbmcgaXMgbmVlZGVkOyBzZWUgdXNlcyBvZiB0aGUgTkVFRF9GQVJfUE9JTlRFUlMgc3ltYm9sLgorICovCisKKyNpZmRlZiBORUVEX0ZBUl9QT0lOVEVSUworI2RlZmluZSBGQVIgIGZhcgorI2Vsc2UKKyNkZWZpbmUgRkFSCisjZW5kaWYKKworCisvKgorICogT24gYSBmZXcgc3lzdGVtcywgdHlwZSBib29sZWFuIGFuZC9vciBpdHMgdmFsdWVzIEZBTFNFLCBUUlVFIG1heSBhcHBlYXIKKyAqIGluIHN0YW5kYXJkIGhlYWRlciBmaWxlcy4gIE9yIHlvdSBtYXkgaGF2ZSBjb25mbGljdHMgd2l0aCBhcHBsaWNhdGlvbi0KKyAqIHNwZWNpZmljIGhlYWRlciBmaWxlcyB0aGF0IHlvdSB3YW50IHRvIGluY2x1ZGUgdG9nZXRoZXIgd2l0aCB0aGVzZSBmaWxlcy4KKyAqIERlZmluaW5nIEhBVkVfQk9PTEVBTiBiZWZvcmUgaW5jbHVkaW5nIGpwZWdsaWIuaCBzaG91bGQgbWFrZSBpdCB3b3JrLgorICovCisKKyNpZm5kZWYgSEFWRV9CT09MRUFOCit0eXBlZGVmIGludCBib29sZWFuOworI2VuZGlmCisjaWZuZGVmIEZBTFNFCQkJLyogaW4gY2FzZSB0aGVzZSBtYWNyb3MgYWxyZWFkeSBleGlzdCAqLworI2RlZmluZSBGQUxTRQkwCQkvKiB2YWx1ZXMgb2YgYm9vbGVhbiAqLworI2VuZGlmCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRQkxCisjZW5kaWYKKworCisvKgorICogVGhlIHJlbWFpbmluZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKKyAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBtb3N0IGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeS4KKyAqIFRvIG1pbmltaXplIGFwcGxpY2F0aW9uIG5hbWVzcGFjZSBwb2xsdXRpb24sIHRoZSBzeW1ib2xzIHdvbid0IGJlCisgKiBkZWZpbmVkIHVubGVzcyBKUEVHX0lOVEVSTkFMUyBvciBKUEVHX0lOVEVSTkFMX09QVElPTlMgaGFzIGJlZW4gZGVmaW5lZC4KKyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKyNkZWZpbmUgSlBFR19JTlRFUk5BTF9PUFRJT05TCisjZW5kaWYKKworI2lmZGVmIEpQRUdfSU5URVJOQUxfT1BUSU9OUworCisKKy8qCisgKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoZXRoZXIgdG8gaW5jbHVkZSB2YXJpb3VzIG9wdGlvbmFsIGZ1bmN0aW9ucy4KKyAqIFVuZGVmaW5pbmcgc29tZSBvZiB0aGVzZSBzeW1ib2xzIHdpbGwgcHJvZHVjZSBhIHNtYWxsZXIgYnV0IGxlc3MgY2FwYWJsZQorICogbGlicmFyeS4gIE5vdGUgdGhhdCB5b3UgY2FuIGxlYXZlIGNlcnRhaW4gc291cmNlIGZpbGVzIG91dCBvZiB0aGUKKyAqIGNvbXBpbGF0aW9uL2xpbmtpbmcgcHJvY2VzcyBpZiB5b3UndmUgI3VuZGVmJ2QgdGhlIGNvcnJlc3BvbmRpbmcgc3ltYm9scy4KKyAqIChZb3UgbWF5IEhBVkUgdG8gZG8gdGhhdCBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBudWxsIHNvdXJjZSBmaWxlcy4pCisgKi8KKworLyogQXJpdGhtZXRpYyBjb2RpbmcgaXMgdW5zdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMuICBDb21wbGFpbnRzIHRvIElCTS4gKi8KKworLyogQ2FwYWJpbGl0eSBvcHRpb25zIGNvbW1vbiB0byBlbmNvZGVyIGFuZCBkZWNvZGVyOiAqLworCisjZGVmaW5lIERDVF9JU0xPV19TVVBQT1JURUQJLyogc2xvdyBidXQgYWNjdXJhdGUgaW50ZWdlciBhbGdvcml0aG0gKi8KKyNkZWZpbmUgRENUX0lGQVNUX1NVUFBPUlRFRAkvKiBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QgKi8KKyNkZWZpbmUgRENUX0ZMT0FUX1NVUFBPUlRFRAkvKiBmbG9hdGluZy1wb2ludDogYWNjdXJhdGUsIGZhc3Qgb24gZmFzdCBIVyAqLworCisvKiBFbmNvZGVyIGNhcGFiaWxpdHkgb3B0aW9uczogKi8KKworI3VuZGVmICBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQgICAgLyogQXJpdGhtZXRpYyBjb2RpbmcgYmFjayBlbmQ/ICovCisjZGVmaW5lIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAvKiBNdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXM/ICovCisjZGVmaW5lIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECSAgICAvKiBQcm9ncmVzc2l2ZSBKUEVHPyAoUmVxdWlyZXMgTVVMVElTQ0FOKSovCisjZGVmaW5lIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAkgICAgLyogT3B0aW1pemF0aW9uIG9mIGVudHJvcHkgY29kaW5nIHBhcm1zPyAqLworLyogTm90ZTogaWYgeW91IHNlbGVjdGVkIDEyLWJpdCBkYXRhIHByZWNpc2lvbiwgaXQgaXMgZGFuZ2Vyb3VzIHRvIHR1cm4gb2ZmCisgKiBFTlRST1BZX09QVF9TVVBQT1JURUQuICBUaGUgc3RhbmRhcmQgSHVmZm1hbiB0YWJsZXMgYXJlIG9ubHkgZ29vZCBmb3IgOC1iaXQKKyAqIHByZWNpc2lvbiwgc28gamNodWZmLmMgbm9ybWFsbHkgdXNlcyBlbnRyb3B5IG9wdGltaXphdGlvbiB0byBjb21wdXRlCisgKiB1c2FibGUgdGFibGVzIGZvciBoaWdoZXIgcHJlY2lzaW9uLiAgSWYgeW91IGRvbid0IHdhbnQgdG8gZG8gb3B0aW1pemF0aW9uLAorICogeW91J2xsIGhhdmUgdG8gc3VwcGx5IGRpZmZlcmVudCBkZWZhdWx0IEh1ZmZtYW4gdGFibGVzLgorICogVGhlIGV4YWN0IHNhbWUgc3RhdGVtZW50cyBhcHBseSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRzogdGhlIGRlZmF1bHQgdGFibGVzCisgKiBkb24ndCB3b3JrIGZvciBwcm9ncmVzc2l2ZSBtb2RlLiAgKFRoaXMgbWF5IGdldCBmaXhlZCwgaG93ZXZlci4pCisgKi8KKyNkZWZpbmUgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRCAgIC8qIElucHV0IGltYWdlIHNtb290aGluZyBvcHRpb24/ICovCisKKy8qIERlY29kZXIgY2FwYWJpbGl0eSBvcHRpb25zOiAqLworCisjdW5kZWYgIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAgICAvKiBBcml0aG1ldGljIGNvZGluZyBiYWNrIGVuZD8gKi8KKyNkZWZpbmUgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEIC8qIE11bHRpcGxlLXNjYW4gSlBFRyBmaWxlcz8gKi8KKyNkZWZpbmUgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQJICAgIC8qIFByb2dyZXNzaXZlIEpQRUc/IChSZXF1aXJlcyBNVUxUSVNDQU4pKi8KKyNkZWZpbmUgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAkgICAgLyoganBlZ19zYXZlX21hcmtlcnMoKSBuZWVkZWQ/ICovCisjZGVmaW5lIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQgICAvKiBCbG9jayBzbW9vdGhpbmc/IChQcm9ncmVzc2l2ZSBvbmx5KSAqLworI2RlZmluZSBJRENUX1NDQUxJTkdfU1VQUE9SVEVECSAgICAvKiBPdXRwdXQgcmVzY2FsaW5nIHZpYSBJRENUPyAqLworI3VuZGVmICBVUFNBTVBMRV9TQ0FMSU5HX1NVUFBPUlRFRCAgLyogT3V0cHV0IHJlc2NhbGluZyBhdCB1cHNhbXBsZSBzdGFnZT8gKi8KKyNkZWZpbmUgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQgIC8qIEZhc3QgcGF0aCBmb3Igc2xvcHB5IHVwc2FtcGxpbmc/ICovCisjZGVmaW5lIFFVQU5UXzFQQVNTX1NVUFBPUlRFRAkgICAgLyogMS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbj8gKi8KKyNkZWZpbmUgUVVBTlRfMlBBU1NfU1VQUE9SVEVECSAgICAvKiAyLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uPyAqLworCisvKiBtb3JlIGNhcGFiaWxpdHkgb3B0aW9ucyBsYXRlciwgbm8gZG91YnQgKi8KKworCisvKgorICogT3JkZXJpbmcgb2YgUkdCIGRhdGEgaW4gc2NhbmxpbmVzIHBhc3NlZCB0byBvciBmcm9tIHRoZSBhcHBsaWNhdGlvbi4KKyAqIElmIHlvdXIgYXBwbGljYXRpb24gd2FudHMgdG8gZGVhbCB3aXRoIGRhdGEgaW4gdGhlIG9yZGVyIEIsRyxSLCBqdXN0CisgKiBjaGFuZ2UgdGhlc2UgbWFjcm9zLiAgWW91IGNhbiBhbHNvIGRlYWwgd2l0aCBmb3JtYXRzIHN1Y2ggYXMgUixHLEIsWAorICogKG9uZSBleHRyYSBieXRlIHBlciBwaXhlbCkgYnkgY2hhbmdpbmcgUkdCX1BJWEVMU0laRS4gIE5vdGUgdGhhdCBjaGFuZ2luZworICogdGhlIG9mZnNldHMgd2lsbCBhbHNvIGNoYW5nZSB0aGUgb3JkZXIgaW4gd2hpY2ggY29sb3JtYXAgZGF0YSBpcyBvcmdhbml6ZWQuCisgKiBSRVNUUklDVElPTlM6CisgKiAxLiBUaGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZyxkanBlZyBkbyBOT1Qgc3VwcG9ydCBtb2RpZmllZCBSR0IgZm9ybWF0cy4KKyAqIDIuIFRoZXNlIG1hY3JvcyBvbmx5IGFmZmVjdCBSR0I8PT5ZQ2JDciBjb2xvciBjb252ZXJzaW9uLCBzbyB0aGV5IGFyZSBub3QKKyAqICAgIHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIEpQRUcgY29sb3Igc3BhY2VzIG90aGVyIHRoYW4gWUNiQ3Igb3IgZ3JheXNjYWxlLgorICogMy4gVGhlIGNvbG9yIHF1YW50aXplciBtb2R1bGVzIHdpbGwgbm90IGJlaGF2ZSBkZXNpcmFibHkgaWYgUkdCX1BJWEVMU0laRQorICogICAgaXMgbm90IDMgKHRoZXkgZG9uJ3QgdW5kZXJzdGFuZCBhYm91dCBkdW1teSBjb2xvciBjb21wb25lbnRzISkuICBTbyB5b3UKKyAqICAgIGNhbid0IHVzZSBjb2xvciBxdWFudGl6YXRpb24gaWYgeW91IGNoYW5nZSB0aGF0IHZhbHVlLgorICovCisKKyNkZWZpbmUgUkdCX1JFRAkJMAkvKiBPZmZzZXQgb2YgUmVkIGluIGFuIFJHQiBzY2FubGluZSBlbGVtZW50ICovCisjZGVmaW5lIFJHQl9HUkVFTgkxCS8qIE9mZnNldCBvZiBHcmVlbiAqLworI2RlZmluZSBSR0JfQkxVRQkyCS8qIE9mZnNldCBvZiBCbHVlICovCisjZGVmaW5lIFJHQl9QSVhFTFNJWkUJMwkvKiBKU0FNUExFcyBwZXIgUkdCIHNjYW5saW5lIGVsZW1lbnQgKi8KKworCisvKiBEZWZpbml0aW9ucyBmb3Igc3BlZWQtcmVsYXRlZCBvcHRpbWl6YXRpb25zLiAqLworCisKKy8qIElmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgaW5saW5lIGZ1bmN0aW9ucywgZGVmaW5lIElOTElORQorICogYXMgdGhlIGlubGluZSBrZXl3b3JkOyBvdGhlcndpc2UgZGVmaW5lIGl0IGFzIGVtcHR5LgorICovCisKKyNpZm5kZWYgSU5MSU5FCisjaWZkZWYgX19HTlVDX18JCQkvKiBmb3IgaW5zdGFuY2UsIEdOVSBDIGtub3dzIGFib3V0IGlubGluZSAqLworI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXworI2VuZGlmCisjaWZuZGVmIElOTElORQorI2RlZmluZSBJTkxJTkUJCQkvKiBkZWZhdWx0IGlzIHRvIGRlZmluZSBpdCBhcyBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKiBPbiBzb21lIG1hY2hpbmVzIChub3RhYmx5IDY4MDAwIHNlcmllcykgImludCIgaXMgMzIgYml0cywgYnV0IG11bHRpcGx5aW5nCisgKiB0d28gMTYtYml0IHNob3J0cyBpcyBmYXN0ZXIgdGhhbiBtdWx0aXBseWluZyB0d28gaW50cy4gIERlZmluZSBNVUxUSVBMSUVSCisgKiBhcyBzaG9ydCBvbiBzdWNoIGEgbWFjaGluZS4gIE1VTFRJUExJRVIgbXVzdCBiZSBhdCBsZWFzdCAxNiBiaXRzIHdpZGUuCisgKi8KKworI2lmbmRlZiBNVUxUSVBMSUVSCisjZGVmaW5lIE1VTFRJUExJRVIgIGludAkJLyogdHlwZSBmb3IgZmFzdGVzdCBpbnRlZ2VyIG11bHRpcGx5ICovCisjZW5kaWYKKworCisvKiBGQVNUX0ZMT0FUIHNob3VsZCBiZSBlaXRoZXIgZmxvYXQgb3IgZG91YmxlLCB3aGljaGV2ZXIgaXMgZG9uZSBmYXN0ZXIKKyAqIGJ5IHlvdXIgY29tcGlsZXIuICAoTm90ZSB0aGF0IHRoaXMgdHlwZSBpcyBvbmx5IHVzZWQgaW4gdGhlIGZsb2F0aW5nIHBvaW50CisgKiBEQ1Qgcm91dGluZXMsIHNvIGl0IG9ubHkgbWF0dGVycyBpZiB5b3UndmUgZGVmaW5lZCBEQ1RfRkxPQVRfU1VQUE9SVEVELikKKyAqIFR5cGljYWxseSwgZmxvYXQgaXMgZmFzdGVyIGluIEFOU0kgQyBjb21waWxlcnMsIHdoaWxlIGRvdWJsZSBpcyBmYXN0ZXIgaW4KKyAqIHByZS1BTlNJIGNvbXBpbGVycyAoYmVjYXVzZSB0aGV5IGluc2lzdCBvbiBjb252ZXJ0aW5nIHRvIGRvdWJsZSBhbnl3YXkpLgorICogVGhlIGNvZGUgYmVsb3cgdGhlcmVmb3JlIGNob29zZXMgZmxvYXQgaWYgd2UgaGF2ZSBBTlNJLXN0eWxlIHByb3RvdHlwZXMuCisgKi8KKworI2lmbmRlZiBGQVNUX0ZMT0FUCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEZBU1RfRkxPQVQgIGZsb2F0CisjZWxzZQorI2RlZmluZSBGQVNUX0ZMT0FUICBkb3VibGUKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMX09QVElPTlMgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pwZWcuZHNwIGIvY29tbW9uL2pwZWcvanBlZy5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2ODU5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2pwZWcuZHNwCkBAIC0wLDAgKzEsMzIwIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImpwZWciIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQNCisNCitDRkc9anBlZyAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJqcGVnLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJqcGVnLm1hayIgQ0ZHPSJqcGVnIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImpwZWcgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSAianBlZyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAianBlZyAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxSZWxlYXNlXGpwZWciDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImpwZWcgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuLlxEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuLlxEZWJ1Z1xqcGVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDE5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgImpwZWcgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAianBlZyAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjYXBpbWluLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqY2FwaXN0ZC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNjb2VmY3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjY29sb3IuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjZGN0bWdyLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqY2h1ZmYuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjaW5pdC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNtYWluY3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjbWFya2VyLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqY21hc3Rlci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNvbWFwaS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNwYXJhbS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNwaHVmZi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNwcmVwY3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjc2FtcGxlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqY3RyYW5zLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZGFwaW1pbi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camRhcGlzdGQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkYXRhZHN0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZGF0YXNyYy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camRjb2VmY3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkY29sb3IuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkZGN0bWdyLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZGh1ZmYuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkaW5wdXQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkbWFpbmN0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZG1hcmtlci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camRtYXN0ZXIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkbWVyZ2UuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkcGh1ZmYuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpkcG9zdGN0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZHNhbXBsZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camR0cmFucy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camVycm9yLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZmRjdGZsdC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camZkY3Rmc3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpmZGN0aW50LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqaWRjdGZsdC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camlkY3Rmc3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGppZGN0aW50LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqaWRjdHJlZC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cam1lbW1nci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cam1lbW5vYnMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpxdWFudDEuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpxdWFudDIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGp1dGlscy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGpjaHVmZi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camNvbmZpZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camRjdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5camRodWZmLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqZXJyb3IuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGppbmNsdWRlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqbWVtc3lzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxqbW9yZWNmZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5canBlZ2ludC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5canBlZ2xpYi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5canZlcnNpb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvanBlZ2ludC5oIGIvY29tbW9uL2pwZWcvanBlZ2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YjAwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qcGVnaW50LmgKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBqcGVnaW50LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgdmFyaW91cyBKUEVHIG1vZHVsZXMuCisgKiBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlIGNvbnNpZGVyZWQgaW50ZXJuYWwgdG8gdGhlIEpQRUcgbGlicmFyeTsgbW9zdAorICogYXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IHNob3VsZG4ndCBuZWVkIHRvIGluY2x1ZGUgdGhpcyBmaWxlLgorICovCisKKworLyogRGVjbGFyYXRpb25zIGZvciBib3RoIGNvbXByZXNzaW9uICYgZGVjb21wcmVzc2lvbiAqLworCit0eXBlZGVmIGVudW0gewkJCS8qIE9wZXJhdGluZyBtb2RlcyBmb3IgYnVmZmVyIGNvbnRyb2xsZXJzICovCisJSkJVRl9QQVNTX1RIUlUsCQkvKiBQbGFpbiBzdHJpcHdpc2Ugb3BlcmF0aW9uICovCisJLyogUmVtYWluaW5nIG1vZGVzIHJlcXVpcmUgYSBmdWxsLWltYWdlIGJ1ZmZlciB0byBoYXZlIGJlZW4gY3JlYXRlZCAqLworCUpCVUZfU0FWRV9TT1VSQ0UsCS8qIFJ1biBzb3VyY2Ugc3Vib2JqZWN0IG9ubHksIHNhdmUgb3V0cHV0ICovCisJSkJVRl9DUkFOS19ERVNULAkvKiBSdW4gZGVzdCBzdWJvYmplY3Qgb25seSwgdXNpbmcgc2F2ZWQgZGF0YSAqLworCUpCVUZfU0FWRV9BTkRfUEFTUwkvKiBSdW4gYm90aCBzdWJvYmplY3RzLCBzYXZlIG91dHB1dCAqLworfSBKX0JVRl9NT0RFOworCisvKiBWYWx1ZXMgb2YgZ2xvYmFsX3N0YXRlIGZpZWxkIChqZGFwaS5jIGhhcyBzb21lIGRlcGVuZGVuY2llcyBvbiBvcmRlcmluZyEpICovCisjZGVmaW5lIENTVEFURV9TVEFSVAkxMDAJLyogYWZ0ZXIgY3JlYXRlX2NvbXByZXNzICovCisjZGVmaW5lIENTVEFURV9TQ0FOTklORwkxMDEJLyogc3RhcnRfY29tcHJlc3MgZG9uZSwgd3JpdGVfc2NhbmxpbmVzIE9LICovCisjZGVmaW5lIENTVEFURV9SQVdfT0sJMTAyCS8qIHN0YXJ0X2NvbXByZXNzIGRvbmUsIHdyaXRlX3Jhd19kYXRhIE9LICovCisjZGVmaW5lIENTVEFURV9XUkNPRUZTCTEwMwkvKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyBkb25lICovCisjZGVmaW5lIERTVEFURV9TVEFSVAkyMDAJLyogYWZ0ZXIgY3JlYXRlX2RlY29tcHJlc3MgKi8KKyNkZWZpbmUgRFNUQVRFX0lOSEVBREVSCTIwMQkvKiByZWFkaW5nIGhlYWRlciBtYXJrZXJzLCBubyBTT1MgeWV0ICovCisjZGVmaW5lIERTVEFURV9SRUFEWQkyMDIJLyogZm91bmQgU09TLCByZWFkeSBmb3Igc3RhcnRfZGVjb21wcmVzcyAqLworI2RlZmluZSBEU1RBVEVfUFJFTE9BRAkyMDMJLyogcmVhZGluZyBtdWx0aXNjYW4gZmlsZSBpbiBzdGFydF9kZWNvbXByZXNzKi8KKyNkZWZpbmUgRFNUQVRFX1BSRVNDQU4JMjA0CS8qIHBlcmZvcm1pbmcgZHVtbXkgcGFzcyBmb3IgMi1wYXNzIHF1YW50ICovCisjZGVmaW5lIERTVEFURV9TQ0FOTklORwkyMDUJLyogc3RhcnRfZGVjb21wcmVzcyBkb25lLCByZWFkX3NjYW5saW5lcyBPSyAqLworI2RlZmluZSBEU1RBVEVfUkFXX09LCTIwNgkvKiBzdGFydF9kZWNvbXByZXNzIGRvbmUsIHJlYWRfcmF3X2RhdGEgT0sgKi8KKyNkZWZpbmUgRFNUQVRFX0JVRklNQUdFCTIwNwkvKiBleHBlY3RpbmcganBlZ19zdGFydF9vdXRwdXQgKi8KKyNkZWZpbmUgRFNUQVRFX0JVRlBPU1QJMjA4CS8qIGxvb2tpbmcgZm9yIFNPUy9FT0kgaW4ganBlZ19maW5pc2hfb3V0cHV0ICovCisjZGVmaW5lIERTVEFURV9SRENPRUZTCTIwOQkvKiByZWFkaW5nIGZpbGUgaW4ganBlZ19yZWFkX2NvZWZmaWNpZW50cyAqLworI2RlZmluZSBEU1RBVEVfU1RPUFBJTkcJMjEwCS8qIGxvb2tpbmcgZm9yIEVPSSBpbiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzICovCisKKworLyogRGVjbGFyYXRpb25zIGZvciBjb21wcmVzc2lvbiBtb2R1bGVzICovCisKKy8qIE1hc3RlciBjb250cm9sIG1vZHVsZSAqLworc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgeworICBKTUVUSE9EKHZvaWQsIHByZXBhcmVfZm9yX3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHBhc3Nfc3RhcnR1cCwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworCisgIC8qIFN0YXRlIHZhcmlhYmxlcyBtYWRlIHZpc2libGUgdG8gb3RoZXIgbW9kdWxlcyAqLworICBib29sZWFuIGNhbGxfcGFzc19zdGFydHVwOwkvKiBUcnVlIGlmIHBhc3Nfc3RhcnR1cCBtdXN0IGJlIGNhbGxlZCAqLworICBib29sZWFuIGlzX2xhc3RfcGFzczsJCS8qIFRydWUgZHVyaW5nIGxhc3QgcGFzcyAqLworfTsKKworLyogTWFpbiBidWZmZXIgY29udHJvbCAoZG93bnNhbXBsZWQtZGF0YSBidWZmZXIpICovCitzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOworICBKTUVUSE9EKHZvaWQsIHByb2Nlc3NfZGF0YSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAorCQkJICAgICAgIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkpOworfTsKKworLyogQ29tcHJlc3Npb24gcHJlcHJvY2Vzc2luZyAoZG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlciBjb250cm9sKSAqLworc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKKyAgSk1FVEhPRCh2b2lkLCBwcmVfcHJvY2Vzc19kYXRhLCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJCQkJICAgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJCQkgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCQkJICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkJCSAgIEpESU1FTlNJT04gKm91dF9yb3dfZ3JvdXBfY3RyLAorCQkJCSAgIEpESU1FTlNJT04gb3V0X3Jvd19ncm91cHNfYXZhaWwpKTsKK307CisKKy8qIENvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sICovCitzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOworICBKTUVUSE9EKGJvb2xlYW4sIGNvbXByZXNzX2RhdGEsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZikpOworfTsKKworLyogQ29sb3JzcGFjZSBjb252ZXJzaW9uICovCitzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIGNvbG9yX2NvbnZlcnQsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQlKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkJCUpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKSk7Cit9OworCisvKiBEb3duc2FtcGxpbmcgKi8KK3N0cnVjdCBqcGVnX2Rvd25zYW1wbGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBkb3duc2FtcGxlLCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19pbmRleCwKKwkJCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBfaW5kZXgpKTsKKworICBib29sZWFuIG5lZWRfY29udGV4dF9yb3dzOwkvKiBUUlVFIGlmIG5lZWQgcm93cyBhYm92ZSAmIGJlbG93ICovCit9OworCisvKiBGb3J3YXJkIERDVCAoYWxzbyBjb250cm9scyBjb2VmZmljaWVudCBxdWFudGl6YXRpb24pICovCitzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIC8qIHBlcmhhcHMgdGhpcyBzaG91bGQgYmUgYW4gYXJyYXk/Pz8gKi8KKyAgSk1FVEhPRCh2b2lkLCBmb3J3YXJkX0RDVCwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCQkgICAgICBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKQkxPQ0tST1cgY29lZl9ibG9ja3MsCisJCQkgICAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisJCQkgICAgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpKTsKK307CisKKy8qIEVudHJvcHkgZW5jb2RpbmcgKi8KK3N0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzKSk7CisgIEpNRVRIT0QoYm9vbGVhbiwgZW5jb2RlX21jdSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworfTsKKworLyogTWFya2VyIHdyaXRpbmcgKi8KK3N0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgeworICBKTUVUSE9EKHZvaWQsIHdyaXRlX2ZpbGVfaGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9mcmFtZV9oZWFkZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHdyaXRlX3NjYW5faGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9maWxlX3RyYWlsZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHdyaXRlX3RhYmxlc19vbmx5LCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgLyogVGhlc2Ugcm91dGluZXMgYXJlIGV4cG9ydGVkIHRvIGFsbG93IGluc2VydGlvbiBvZiBleHRyYSBtYXJrZXJzICovCisgIC8qIFByb2JhYmx5IG9ubHkgQ09NIGFuZCBBUFBuIG1hcmtlcnMgc2hvdWxkIGJlIHdyaXR0ZW4gdGhpcyB3YXkgKi8KKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9tYXJrZXJfaGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGRhdGFsZW4pKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9tYXJrZXJfYnl0ZSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKSk7Cit9OworCisKKy8qIERlY2xhcmF0aW9ucyBmb3IgZGVjb21wcmVzc2lvbiBtb2R1bGVzICovCisKKy8qIE1hc3RlciBjb250cm9sIG1vZHVsZSAqLworc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciB7CisgIEpNRVRIT0Qodm9pZCwgcHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX291dHB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisgIC8qIFN0YXRlIHZhcmlhYmxlcyBtYWRlIHZpc2libGUgdG8gb3RoZXIgbW9kdWxlcyAqLworICBib29sZWFuIGlzX2R1bW15X3Bhc3M7CS8qIFRydWUgZHVyaW5nIDFzdCBwYXNzIGZvciAyLXBhc3MgcXVhbnQgKi8KK307CisKKy8qIElucHV0IGNvbnRyb2wgbW9kdWxlICovCitzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyIHsKKyAgSk1FVEhPRChpbnQsIGNvbnN1bWVfaW5wdXQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgcmVzZXRfaW5wdXRfY29udHJvbGxlciwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9pbnB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9pbnB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisgIC8qIFN0YXRlIHZhcmlhYmxlcyBtYWRlIHZpc2libGUgdG8gb3RoZXIgbW9kdWxlcyAqLworICBib29sZWFuIGhhc19tdWx0aXBsZV9zY2FuczsJLyogVHJ1ZSBpZiBmaWxlIGhhcyBtdWx0aXBsZSBzY2FucyAqLworICBib29sZWFuIGVvaV9yZWFjaGVkOwkJLyogVHJ1ZSB3aGVuIEVPSSBoYXMgYmVlbiBjb25zdW1lZCAqLworfTsKKworLyogTWFpbiBidWZmZXIgY29udHJvbCAoZG93bnNhbXBsZWQtZGF0YSBidWZmZXIpICovCitzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7CisgIEpNRVRIT0Qodm9pZCwgcHJvY2Vzc19kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkJICAgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKK307CisKKy8qIENvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sICovCitzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfaW5wdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRChpbnQsIGNvbnN1bWVfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9vdXRwdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRChpbnQsIGRlY29tcHJlc3NfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOworICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGNvZWZmaWNpZW50IHZpcnR1YWwgYXJyYXlzLCBvciBOVUxMIGlmIG5vbmUgKi8KKyAganZpcnRfYmFycmF5X3B0ciAqY29lZl9hcnJheXM7Cit9OworCisvKiBEZWNvbXByZXNzaW9uIHBvc3Rwcm9jZXNzaW5nIChjb2xvciBxdWFudGl6YXRpb24gYnVmZmVyIGNvbnRyb2wpICovCitzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7CisgIEpNRVRIT0Qodm9pZCwgcG9zdF9wcm9jZXNzX2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwKKwkJCQkgICAgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisJCQkJICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Cit9OworCisvKiBNYXJrZXIgcmVhZGluZyAmIHBhcnNpbmcgKi8KK3N0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgeworICBKTUVUSE9EKHZvaWQsIHJlc2V0X21hcmtlcl9yZWFkZXIsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIC8qIFJlYWQgbWFya2VycyB1bnRpbCBTT1Mgb3IgRU9JLgorICAgKiBSZXR1cm5zIHNhbWUgY29kZXMgYXMgYXJlIGRlZmluZWQgZm9yIGpwZWdfY29uc3VtZV9pbnB1dDoKKyAgICogSlBFR19TVVNQRU5ERUQsIEpQRUdfUkVBQ0hFRF9TT1MsIG9yIEpQRUdfUkVBQ0hFRF9FT0kuCisgICAqLworICBKTUVUSE9EKGludCwgcmVhZF9tYXJrZXJzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICAvKiBSZWFkIGEgcmVzdGFydCBtYXJrZXIgLS0tIGV4cG9ydGVkIGZvciB1c2UgYnkgZW50cm9weSBkZWNvZGVyIG9ubHkgKi8KKyAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCByZWFkX3Jlc3RhcnRfbWFya2VyOworCisgIC8qIFN0YXRlIG9mIG1hcmtlciByZWFkZXIgLS0tIG5vbWluYWxseSBpbnRlcm5hbCwgYnV0IGFwcGxpY2F0aW9ucworICAgKiBzdXBwbHlpbmcgQ09NIG9yIEFQUG4gaGFuZGxlcnMgbWlnaHQgbGlrZSB0byBrbm93IHRoZSBzdGF0ZS4KKyAgICovCisgIGJvb2xlYW4gc2F3X1NPSTsJCS8qIGZvdW5kIFNPST8gKi8KKyAgYm9vbGVhbiBzYXdfU09GOwkJLyogZm91bmQgU09GPyAqLworICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgZXhwZWN0ZWQgKDAtNykgKi8KKyAgdW5zaWduZWQgaW50IGRpc2NhcmRlZF9ieXRlczsJLyogIyBvZiBieXRlcyBza2lwcGVkIGxvb2tpbmcgZm9yIGEgbWFya2VyICovCit9OworCisvKiBFbnRyb3B5IGRlY29kaW5nICovCitzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoYm9vbGVhbiwgZGVjb2RlX21jdSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworCisgIC8qIFRoaXMgaXMgaGVyZSB0byBzaGFyZSBjb2RlIGJldHdlZW4gYmFzZWxpbmUgYW5kIHByb2dyZXNzaXZlIGRlY29kZXJzOyAqLworICAvKiBvdGhlciBtb2R1bGVzIHByb2JhYmx5IHNob3VsZCBub3QgdXNlIGl0ICovCisgIGJvb2xlYW4gaW5zdWZmaWNpZW50X2RhdGE7CS8qIHNldCBUUlVFIGFmdGVyIGVtaXR0aW5nIHdhcm5pbmcgKi8KK307CisKKy8qIEludmVyc2UgRENUIChhbHNvIHBlcmZvcm1zIGRlcXVhbnRpemF0aW9uKSAqLwordHlwZWRlZiBKTUVUSE9EKHZvaWQsIGludmVyc2VfRENUX21ldGhvZF9wdHIsCisJCShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworCitzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgLyogSXQgaXMgdXNlZnVsIHRvIGFsbG93IGVhY2ggY29tcG9uZW50IHRvIGhhdmUgYSBzZXBhcmF0ZSBJRENUIG1ldGhvZC4gKi8KKyAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVFtNQVhfQ09NUE9ORU5UU107Cit9OworCisvKiBVcHNhbXBsaW5nIChub3RlIHRoYXQgdXBzYW1wbGVyIG11c3QgYWxzbyBjYWxsIGNvbG9yIGNvbnZlcnRlcikgKi8KK3N0cnVjdCBqcGVnX3Vwc2FtcGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCB1cHNhbXBsZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwKKwkJCSAgIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJCQkgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisJCQkgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJCSAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKKworICBib29sZWFuIG5lZWRfY29udGV4dF9yb3dzOwkvKiBUUlVFIGlmIG5lZWQgcm93cyBhYm92ZSAmIGJlbG93ICovCit9OworCisvKiBDb2xvcnNwYWNlIGNvbnZlcnNpb24gKi8KK3N0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIGNvbG9yX2NvbnZlcnQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCUpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKwkJCQlKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykpOworfTsKKworLyogQ29sb3IgcXVhbnRpemF0aW9uIG9yIGNvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24gKi8KK3N0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pKTsKKyAgSk1FVEhPRCh2b2lkLCBjb2xvcl9xdWFudGl6ZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisJCQkJIGludCBudW1fcm93cykpOworICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIG5ld19jb2xvcl9tYXAsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Cit9OworCisKKy8qIE1pc2NlbGxhbmVvdXMgdXNlZnVsIG1hY3JvcyAqLworCisjdW5kZWYgTUFYCisjZGVmaW5lIE1BWChhLGIpCSgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisjdW5kZWYgTUlOCisjZGVmaW5lIE1JTihhLGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisKKworLyogV2UgYXNzdW1lIHRoYXQgcmlnaHQgc2hpZnQgY29ycmVzcG9uZHMgdG8gc2lnbmVkIGRpdmlzaW9uIGJ5IDIgd2l0aAorICogcm91bmRpbmcgdG93YXJkcyBtaW51cyBpbmZpbml0eS4gIFRoaXMgaXMgY29ycmVjdCBmb3IgdHlwaWNhbCAiYXJpdGhtZXRpYworICogc2hpZnQiIGluc3RydWN0aW9ucyB0aGF0IHNoaWZ0IGluIGNvcGllcyBvZiB0aGUgc2lnbiBiaXQuICBCdXQgc29tZQorICogQyBjb21waWxlcnMgaW1wbGVtZW50ID4+IHdpdGggYW4gdW5zaWduZWQgc2hpZnQuICBGb3IgdGhlc2UgbWFjaGluZXMgeW91CisgKiBtdXN0IGRlZmluZSBSSUdIVF9TSElGVF9JU19VTlNJR05FRC4KKyAqIFJJR0hUX1NISUZUIHByb3ZpZGVzIGEgcHJvcGVyIHNpZ25lZCByaWdodCBzaGlmdCBvZiBhbiBJTlQzMiBxdWFudGl0eS4KKyAqIEl0IGlzIG9ubHkgYXBwbGllZCB3aXRoIGNvbnN0YW50IHNoaWZ0IGNvdW50cy4gIFNISUZUX1RFTVBTIG11c3QgYmUKKyAqIGluY2x1ZGVkIGluIHRoZSB2YXJpYWJsZXMgb2YgYW55IHJvdXRpbmUgdXNpbmcgUklHSFRfU0hJRlQuCisgKi8KKworI2lmZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisjZGVmaW5lIFNISUZUX1RFTVBTCUlOVDMyIHNoaWZ0X3RlbXA7CisjZGVmaW5lIFJJR0hUX1NISUZUKHgsc2hmdCkgIFwKKwkoKHNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKKwkgKHNoaWZ0X3RlbXAgPj4gKHNoZnQpKSB8ICgofigoSU5UMzIpIDApKSA8PCAoMzItKHNoZnQpKSkgOiBcCisJIChzaGlmdF90ZW1wID4+IChzaGZ0KSkpCisjZWxzZQorI2RlZmluZSBTSElGVF9URU1QUworI2RlZmluZSBSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQorI2VuZGlmCisKKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGppbml0X2NvbXByZXNzX21hc3RlcglqSUNvbXByZXNzCisjZGVmaW5lIGppbml0X2NfbWFzdGVyX2NvbnRyb2wJaklDTWFzdGVyCisjZGVmaW5lIGppbml0X2NfbWFpbl9jb250cm9sbGVyCWpJQ01haW5DCisjZGVmaW5lIGppbml0X2NfcHJlcF9jb250cm9sbGVyCWpJQ1ByZXBDCisjZGVmaW5lIGppbml0X2NfY29lZl9jb250cm9sbGVyCWpJQ0NvZWZDCisjZGVmaW5lIGppbml0X2NvbG9yX2NvbnZlcnRlcglqSUNDb2xvcgorI2RlZmluZSBqaW5pdF9kb3duc2FtcGxlcglqSURvd25zYW1wbGVyCisjZGVmaW5lIGppbml0X2ZvcndhcmRfZGN0CWpJRkRDVAorI2RlZmluZSBqaW5pdF9odWZmX2VuY29kZXIJaklIRW5jb2RlcgorI2RlZmluZSBqaW5pdF9waHVmZl9lbmNvZGVyCWpJUEhFbmNvZGVyCisjZGVmaW5lIGppbml0X21hcmtlcl93cml0ZXIJaklNV3JpdGVyCisjZGVmaW5lIGppbml0X21hc3Rlcl9kZWNvbXByZXNzCWpJRE1hc3RlcgorI2RlZmluZSBqaW5pdF9kX21haW5fY29udHJvbGxlcglqSURNYWluQworI2RlZmluZSBqaW5pdF9kX2NvZWZfY29udHJvbGxlcglqSURDb2VmQworI2RlZmluZSBqaW5pdF9kX3Bvc3RfY29udHJvbGxlcglqSURQb3N0QworI2RlZmluZSBqaW5pdF9pbnB1dF9jb250cm9sbGVyCWpJSW5DdGxyCisjZGVmaW5lIGppbml0X21hcmtlcl9yZWFkZXIJaklNUmVhZGVyCisjZGVmaW5lIGppbml0X2h1ZmZfZGVjb2RlcglqSUhEZWNvZGVyCisjZGVmaW5lIGppbml0X3BodWZmX2RlY29kZXIJaklQSERlY29kZXIKKyNkZWZpbmUgamluaXRfaW52ZXJzZV9kY3QJaklJRENUCisjZGVmaW5lIGppbml0X3Vwc2FtcGxlcgkJaklVcHNhbXBsZXIKKyNkZWZpbmUgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIJaklEQ29sb3IKKyNkZWZpbmUgamluaXRfMXBhc3NfcXVhbnRpemVyCWpJMVF1YW50CisjZGVmaW5lIGppbml0XzJwYXNzX3F1YW50aXplcglqSTJRdWFudAorI2RlZmluZSBqaW5pdF9tZXJnZWRfdXBzYW1wbGVyCWpJTVVwc2FtcGxlcgorI2RlZmluZSBqaW5pdF9tZW1vcnlfbWdyCWpJTWVtTWdyCisjZGVmaW5lIGpkaXZfcm91bmRfdXAJCWpEaXZSb3VuZAorI2RlZmluZSBqcm91bmRfdXAJCWpSb3VuZAorI2RlZmluZSBqY29weV9zYW1wbGVfcm93cwlqQ29weVNhbXBsZXMKKyNkZWZpbmUgamNvcHlfYmxvY2tfcm93CQlqQ29weUJsb2NrcworI2RlZmluZSBqemVyb19mYXIJCWpaZXJvRmFyCisjZGVmaW5lIGpwZWdfemlnemFnX29yZGVyCWpaSUdUYWJsZQorI2RlZmluZSBqcGVnX25hdHVyYWxfb3JkZXIJalpBR1RhYmxlCisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCisKKy8qIENvbXByZXNzaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lcyAqLworRVhURVJOKHZvaWQpIGppbml0X2NvbXByZXNzX21hc3RlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfY19tYXN0ZXJfY29udHJvbCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgYm9vbGVhbiB0cmFuc2NvZGVfb25seSkpOworRVhURVJOKHZvaWQpIGppbml0X2NfbWFpbl9jb250cm9sbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7CitFWFRFUk4odm9pZCkgamluaXRfY19wcmVwX2NvbnRyb2xsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9jX2NvZWZfY29udHJvbGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOworRVhURVJOKHZvaWQpIGppbml0X2NvbG9yX2NvbnZlcnRlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfZG93bnNhbXBsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2ZvcndhcmRfZGN0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9odWZmX2VuY29kZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X3BodWZmX2VuY29kZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X21hcmtlcl93cml0ZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworLyogRGVjb21wcmVzc2lvbiBtb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKi8KK0VYVEVSTih2b2lkKSBqaW5pdF9tYXN0ZXJfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9kX21haW5fY29udHJvbGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7CitFWFRFUk4odm9pZCkgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOworRVhURVJOKHZvaWQpIGppbml0X2RfcG9zdF9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9pbnB1dF9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X21hcmtlcl9yZWFkZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfaHVmZl9kZWNvZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X3BodWZmX2RlY29kZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfaW52ZXJzZV9kY3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfdXBzYW1wbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2NvbG9yX2RlY29udmVydGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0XzFwYXNzX3F1YW50aXplciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF8ycGFzc19xdWFudGl6ZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfbWVyZ2VkX3Vwc2FtcGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKy8qIE1lbW9yeSBtYW5hZ2VyIGluaXRpYWxpemF0aW9uICovCitFWFRFUk4odm9pZCkgamluaXRfbWVtb3J5X21nciBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworCisvKiBVdGlsaXR5IHJvdXRpbmVzIGluIGp1dGlscy5jICovCitFWFRFUk4obG9uZykgamRpdl9yb3VuZF91cCBKUFAoKGxvbmcgYSwgbG9uZyBiKSk7CitFWFRFUk4obG9uZykganJvdW5kX3VwIEpQUCgobG9uZyBhLCBsb25nIGIpKTsKK0VYVEVSTih2b2lkKSBqY29weV9zYW1wbGVfcm93cyBKUFAoKEpTQU1QQVJSQVkgaW5wdXRfYXJyYXksIGludCBzb3VyY2Vfcm93LAorCQkJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9hcnJheSwgaW50IGRlc3Rfcm93LAorCQkJCSAgICBpbnQgbnVtX3Jvd3MsIEpESU1FTlNJT04gbnVtX2NvbHMpKTsKK0VYVEVSTih2b2lkKSBqY29weV9ibG9ja19yb3cgSlBQKChKQkxPQ0tST1cgaW5wdXRfcm93LCBKQkxPQ0tST1cgb3V0cHV0X3JvdywKKwkJCQkgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykpOworRVhURVJOKHZvaWQpIGp6ZXJvX2ZhciBKUFAoKHZvaWQgRkFSICogdGFyZ2V0LCBzaXplX3QgYnl0ZXN0b3plcm8pKTsKKy8qIENvbnN0YW50IHRhYmxlcyBpbiBqdXRpbHMuYyAqLworI2lmIDAJCQkJLyogVGhpcyB0YWJsZSBpcyBub3QgYWN0dWFsbHkgbmVlZGVkIGluIHY2YSAqLworZXh0ZXJuIGNvbnN0IGludCBqcGVnX3ppZ3phZ19vcmRlcltdOyAvKiBuYXR1cmFsIGNvZWYgb3JkZXIgdG8gemlnemFnIG9yZGVyICovCisjZW5kaWYKK2V4dGVybiBjb25zdCBpbnQganBlZ19uYXR1cmFsX29yZGVyW107IC8qIHppZ3phZyBjb2VmIG9yZGVyIHRvIG5hdHVyYWwgb3JkZXIgKi8KKworLyogU3VwcHJlc3MgdW5kZWZpbmVkLXN0cnVjdHVyZSBjb21wbGFpbnRzIGlmIG5lY2Vzc2FyeS4gKi8KKworI2lmZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCisjaWZuZGVmIEFNX01FTU9SWV9NQU5BR0VSCS8qIG9ubHkgam1lbW1nci5jIGRlZmluZXMgdGhlc2UgKi8KK3N0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9OworI2VuZGlmCisjZW5kaWYgLyogSU5DT01QTEVURV9UWVBFU19CUk9LRU4gKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2pwZWdsaWIuaCBiL2NvbW1vbi9qcGVnL2pwZWdsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWJlOGRkCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2pwZWcvanBlZ2xpYi5oCkBAIC0wLDAgKzEsMTA5NiBAQAorLyoKKyAqIGpwZWdsaWIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGFwcGxpY2F0aW9uIGludGVyZmFjZSBmb3IgdGhlIEpQRUcgbGlicmFyeS4KKyAqIE1vc3QgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IG5lZWQgb25seSBpbmNsdWRlIHRoaXMgZmlsZSwKKyAqIGFuZCBwZXJoYXBzIGplcnJvci5oIGlmIHRoZXkgd2FudCB0byBrbm93IHRoZSBleGFjdCBlcnJvciBjb2Rlcy4KKyAqLworCisjaWZuZGVmIEpQRUdMSUJfSAorI2RlZmluZSBKUEVHTElCX0gKKworLyoKKyAqIEZpcnN0IHdlIGluY2x1ZGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhhdCByZWNvcmQgaG93IHRoaXMKKyAqIGluc3RhbGxhdGlvbiBvZiB0aGUgSlBFRyBsaWJyYXJ5IGlzIHNldCB1cC4gIGpjb25maWcuaCBjYW4gYmUKKyAqIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZvciBtYW55IHN5c3RlbXMuICBqbW9yZWNmZy5oIGNvbnRhaW5zCisgKiBtYW51YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgbW9zdCBwZW9wbGUgbmVlZCBub3Qgd29ycnkgYWJvdXQuCisgKi8KKworI2lmbmRlZiBKQ09ORklHX0lOQ0xVREVECS8qIGluIGNhc2UgamluY2x1ZGUuaCBhbHJlYWR5IGRpZCAqLworI2luY2x1ZGUgImpjb25maWcuaCIJCS8qIHdpZGVseSB1c2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworI2VuZGlmCisjaW5jbHVkZSAiam1vcmVjZmcuaCIJCS8qIHNlbGRvbSBjaGFuZ2VkIG9wdGlvbnMgKi8KKworCisvKiBWZXJzaW9uIElEIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgorICogTWlnaHQgYmUgdXNlZnVsIGZvciB0ZXN0cyBsaWtlICIjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA2MCIuCisgKi8KKworI2RlZmluZSBKUEVHX0xJQl9WRVJTSU9OICA2MgkvKiBWZXJzaW9uIDZiICovCisKKworLyogVmFyaW91cyBjb25zdGFudHMgZGV0ZXJtaW5pbmcgdGhlIHNpemVzIG9mIHRoaW5ncy4KKyAqIEFsbCBvZiB0aGVzZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBKUEVHIHN0YW5kYXJkLCBzbyBkb24ndCBjaGFuZ2UgdGhlbQorICogaWYgeW91IHdhbnQgdG8gYmUgY29tcGF0aWJsZS4KKyAqLworCisjZGVmaW5lIERDVFNJWkUJCSAgICA4CS8qIFRoZSBiYXNpYyBEQ1QgYmxvY2sgaXMgOHg4IHNhbXBsZXMgKi8KKyNkZWZpbmUgRENUU0laRTIJICAgIDY0CS8qIERDVFNJWkUgc3F1YXJlZDsgIyBvZiBlbGVtZW50cyBpbiBhIGJsb2NrICovCisjZGVmaW5lIE5VTV9RVUFOVF9UQkxTICAgICAgNAkvKiBRdWFudGl6YXRpb24gdGFibGVzIGFyZSBudW1iZXJlZCAwLi4zICovCisjZGVmaW5lIE5VTV9IVUZGX1RCTFMgICAgICAgNAkvKiBIdWZmbWFuIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uMyAqLworI2RlZmluZSBOVU1fQVJJVEhfVEJMUyAgICAgIDE2CS8qIEFyaXRoLWNvZGluZyB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLjE1ICovCisjZGVmaW5lIE1BWF9DT01QU19JTl9TQ0FOICAgNAkvKiBKUEVHIGxpbWl0IG9uICMgb2YgY29tcG9uZW50cyBpbiBvbmUgc2NhbiAqLworI2RlZmluZSBNQVhfU0FNUF9GQUNUT1IgICAgIDQJLyogSlBFRyBsaW1pdCBvbiBzYW1wbGluZyBmYWN0b3JzICovCisvKiBVbmZvcnR1bmF0ZWx5LCBzb21lIGJvem8gYXQgQWRvYmUgc2F3IG5vIHJlYXNvbiB0byBiZSBib3VuZCBieSB0aGUgc3RhbmRhcmQ7CisgKiB0aGUgUG9zdFNjcmlwdCBEQ1QgZmlsdGVyIGNhbiBlbWl0IGZpbGVzIHdpdGggbWFueSBtb3JlIHRoYW4gMTAgYmxvY2tzL01DVS4KKyAqIElmIHlvdSBoYXBwZW4gdG8gcnVuIGFjcm9zcyBzdWNoIGEgZmlsZSwgeW91IGNhbiB1cCBEX01BWF9CTE9DS1NfSU5fTUNVCisgKiB0byBoYW5kbGUgaXQuICBXZSBldmVuIGxldCB5b3UgZG8gdGhpcyBmcm9tIHRoZSBqY29uZmlnLmggZmlsZS4gIEhvd2V2ZXIsCisgKiB3ZSBzdHJvbmdseSBkaXNjb3VyYWdlIGNoYW5naW5nIENfTUFYX0JMT0NLU19JTl9NQ1U7IGp1c3QgYmVjYXVzZSBBZG9iZQorICogc29tZXRpbWVzIGVtaXRzIG5vbmNvbXBsaWFudCBmaWxlcyBkb2Vzbid0IG1lYW4geW91IHNob3VsZCB0b28uCisgKi8KKyNkZWZpbmUgQ19NQVhfQkxPQ0tTX0lOX01DVSAgIDEwIC8qIGNvbXByZXNzb3IncyBsaW1pdCBvbiBibG9ja3MgcGVyIE1DVSAqLworI2lmbmRlZiBEX01BWF9CTE9DS1NfSU5fTUNVCisjZGVmaW5lIERfTUFYX0JMT0NLU19JTl9NQ1UgICAxMCAvKiBkZWNvbXByZXNzb3IncyBsaW1pdCBvbiBibG9ja3MgcGVyIE1DVSAqLworI2VuZGlmCisKKworLyogRGF0YSBzdHJ1Y3R1cmVzIGZvciBpbWFnZXMgKGFycmF5cyBvZiBzYW1wbGVzIGFuZCBvZiBEQ1QgY29lZmZpY2llbnRzKS4KKyAqIE9uIDgweDg2IG1hY2hpbmVzLCB0aGUgaW1hZ2UgYXJyYXlzIGFyZSB0b28gYmlnIGZvciBuZWFyIHBvaW50ZXJzLAorICogYnV0IHRoZSBwb2ludGVyIGFycmF5cyBjYW4gZml0IGluIG5lYXIgbWVtb3J5LgorICovCisKK3R5cGVkZWYgSlNBTVBMRSBGQVIgKkpTQU1QUk9XOwkvKiBwdHIgdG8gb25lIGltYWdlIHJvdyBvZiBwaXhlbCBzYW1wbGVzLiAqLwordHlwZWRlZiBKU0FNUFJPVyAqSlNBTVBBUlJBWTsJLyogcHRyIHRvIHNvbWUgcm93cyAoYSAyLUQgc2FtcGxlIGFycmF5KSAqLwordHlwZWRlZiBKU0FNUEFSUkFZICpKU0FNUElNQUdFOwkvKiBhIDMtRCBzYW1wbGUgYXJyYXk6IHRvcCBpbmRleCBpcyBjb2xvciAqLworCit0eXBlZGVmIEpDT0VGIEpCTE9DS1tEQ1RTSVpFMl07CS8qIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMgKi8KK3R5cGVkZWYgSkJMT0NLIEZBUiAqSkJMT0NLUk9XOwkvKiBwb2ludGVyIHRvIG9uZSByb3cgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCit0eXBlZGVmIEpCTE9DS1JPVyAqSkJMT0NLQVJSQVk7CQkvKiBhIDItRCBhcnJheSBvZiBjb2VmZmljaWVudCBibG9ja3MgKi8KK3R5cGVkZWYgSkJMT0NLQVJSQVkgKkpCTE9DS0lNQUdFOwkvKiBhIDMtRCBhcnJheSBvZiBjb2VmZmljaWVudCBibG9ja3MgKi8KKwordHlwZWRlZiBKQ09FRiBGQVIgKkpDT0VGUFRSOwkvKiB1c2VmdWwgaW4gYSBjb3VwbGUgb2YgcGxhY2VzICovCisKKworLyogVHlwZXMgZm9yIEpQRUcgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbmQgd29ya2luZyB0YWJsZXMuICovCisKKworLyogRENUIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMuICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogVGhpcyBhcnJheSBnaXZlcyB0aGUgY29lZmZpY2llbnQgcXVhbnRpemVycyBpbiBuYXR1cmFsIGFycmF5IG9yZGVyCisgICAqIChub3QgdGhlIHppZ3phZyBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBzdG9yZWQgaW4gYSBKUEVHIERRVCBtYXJrZXIpLgorICAgKiBDQVVUSU9OOiBJSkcgdmVyc2lvbnMgcHJpb3IgdG8gdjZhIGtlcHQgdGhpcyBhcnJheSBpbiB6aWd6YWcgb3JkZXIuCisgICAqLworICBVSU5UMTYgcXVhbnR2YWxbRENUU0laRTJdOwkvKiBxdWFudGl6YXRpb24gc3RlcCBmb3IgZWFjaCBjb2VmZmljaWVudCAqLworICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIEZBTFNFIHdoZW4KKyAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgVFJVRSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCisgICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gVFJVRS4KKyAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCisgICAqLworICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiBUUlVFIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCit9IEpRVUFOVF9UQkw7CisKKworLyogSHVmZm1hbiBjb2RpbmcgdGFibGVzLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIFRoZXNlIHR3byBmaWVsZHMgZGlyZWN0bHkgcmVwcmVzZW50IHRoZSBjb250ZW50cyBvZiBhIEpQRUcgREhUIG1hcmtlciAqLworICBVSU5UOCBiaXRzWzE3XTsJCS8qIGJpdHNba10gPSAjIG9mIHN5bWJvbHMgd2l0aCBjb2RlcyBvZiAqLworCQkJCS8qIGxlbmd0aCBrIGJpdHM7IGJpdHNbMF0gaXMgdW51c2VkICovCisgIFVJTlQ4IGh1ZmZ2YWxbMjU2XTsJCS8qIFRoZSBzeW1ib2xzLCBpbiBvcmRlciBvZiBpbmNyIGNvZGUgbGVuZ3RoICovCisgIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgRkFMU0Ugd2hlbgorICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCBUUlVFIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KKyAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byBUUlVFLgorICAgKiAoU2VlIGpwZWdfc3VwcHJlc3NfdGFibGVzIGZvciBhbiBleGFtcGxlLikKKyAgICovCisgIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIFRSVUUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KK30gSkhVRkZfVEJMOworCisKKy8qIEJhc2ljIGluZm8gYWJvdXQgb25lIGNvbXBvbmVudCAoY29sb3IgY2hhbm5lbCkuICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogVGhlc2UgdmFsdWVzIGFyZSBmaXhlZCBvdmVyIHRoZSB3aG9sZSBpbWFnZS4gKi8KKyAgLyogRm9yIGNvbXByZXNzaW9uLCB0aGV5IG11c3QgYmUgc3VwcGxpZWQgYnkgcGFyYW1ldGVyIHNldHVwOyAqLworICAvKiBmb3IgZGVjb21wcmVzc2lvbiwgdGhleSBhcmUgcmVhZCBmcm9tIHRoZSBTT0YgbWFya2VyLiAqLworICBpbnQgY29tcG9uZW50X2lkOwkJLyogaWRlbnRpZmllciBmb3IgdGhpcyBjb21wb25lbnQgKDAuLjI1NSkgKi8KKyAgaW50IGNvbXBvbmVudF9pbmRleDsJCS8qIGl0cyBpbmRleCBpbiBTT0Ygb3IgY2luZm8tPmNvbXBfaW5mb1tdICovCisgIGludCBoX3NhbXBfZmFjdG9yOwkJLyogaG9yaXpvbnRhbCBzYW1wbGluZyBmYWN0b3IgKDEuLjQpICovCisgIGludCB2X3NhbXBfZmFjdG9yOwkJLyogdmVydGljYWwgc2FtcGxpbmcgZmFjdG9yICgxLi40KSAqLworICBpbnQgcXVhbnRfdGJsX25vOwkJLyogcXVhbnRpemF0aW9uIHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLworICAvKiBUaGVzZSB2YWx1ZXMgbWF5IHZhcnkgYmV0d2VlbiBzY2Fucy4gKi8KKyAgLyogRm9yIGNvbXByZXNzaW9uLCB0aGV5IG11c3QgYmUgc3VwcGxpZWQgYnkgcGFyYW1ldGVyIHNldHVwOyAqLworICAvKiBmb3IgZGVjb21wcmVzc2lvbiwgdGhleSBhcmUgcmVhZCBmcm9tIHRoZSBTT1MgbWFya2VyLiAqLworICAvKiBUaGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlIHRoZXNlIHZhcmlhYmxlcy4gKi8KKyAgaW50IGRjX3RibF9ubzsJCS8qIERDIGVudHJvcHkgdGFibGUgc2VsZWN0b3IgKDAuLjMpICovCisgIGludCBhY190Ymxfbm87CQkvKiBBQyBlbnRyb3B5IHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLworICAKKyAgLyogUmVtYWluaW5nIGZpZWxkcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBwcml2YXRlIGJ5IGFwcGxpY2F0aW9ucy4gKi8KKyAgCisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gc3RhcnR1cDogKi8KKyAgLyogQ29tcG9uZW50J3Mgc2l6ZSBpbiBEQ1QgYmxvY2tzLgorICAgKiBBbnkgZHVtbXkgYmxvY2tzIGFkZGVkIHRvIGNvbXBsZXRlIGFuIE1DVSBhcmUgbm90IGNvdW50ZWQ7IHRoZXJlZm9yZQorICAgKiB0aGVzZSB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB3aGV0aGVyIGEgc2NhbiBpcyBpbnRlcmxlYXZlZCBvciBub3QuCisgICAqLworICBKRElNRU5TSU9OIHdpZHRoX2luX2Jsb2NrczsKKyAgSkRJTUVOU0lPTiBoZWlnaHRfaW5fYmxvY2tzOworICAvKiBTaXplIG9mIGEgRENUIGJsb2NrIGluIHNhbXBsZXMuICBBbHdheXMgRENUU0laRSBmb3IgY29tcHJlc3Npb24uCisgICAqIEZvciBkZWNvbXByZXNzaW9uIHRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBmcm9tIG9uZSBEQ1QgYmxvY2ssCisgICAqIHJlZmxlY3RpbmcgYW55IHNjYWxpbmcgd2UgY2hvb3NlIHRvIGFwcGx5IGR1cmluZyB0aGUgSURDVCBzdGVwLgorICAgKiBWYWx1ZXMgb2YgMSwyLDQsOCBhcmUgbGlrZWx5IHRvIGJlIHN1cHBvcnRlZC4gIE5vdGUgdGhhdCBkaWZmZXJlbnQKKyAgICogY29tcG9uZW50cyBtYXkgcmVjZWl2ZSBkaWZmZXJlbnQgSURDVCBzY2FsaW5ncy4KKyAgICovCisgIGludCBEQ1Rfc2NhbGVkX3NpemU7CisgIC8qIFRoZSBkb3duc2FtcGxlZCBkaW1lbnNpb25zIGFyZSB0aGUgY29tcG9uZW50J3MgYWN0dWFsLCB1bnBhZGRlZCBudW1iZXIKKyAgICogb2Ygc2FtcGxlcyBhdCB0aGUgbWFpbiBidWZmZXIgKHByZXByb2Nlc3NpbmcvY29tcHJlc3Npb24gaW50ZXJmYWNlKSwgdGh1cworICAgKiBkb3duc2FtcGxlZF93aWR0aCA9IGNlaWwoaW1hZ2Vfd2lkdGggKiBIaS9IbWF4KQorICAgKiBhbmQgc2ltaWxhcmx5IGZvciBoZWlnaHQuICBGb3IgZGVjb21wcmVzc2lvbiwgSURDVCBzY2FsaW5nIGlzIGluY2x1ZGVkLCBzbworICAgKiBkb3duc2FtcGxlZF93aWR0aCA9IGNlaWwoaW1hZ2Vfd2lkdGggKiBIaS9IbWF4ICogRENUX3NjYWxlZF9zaXplL0RDVFNJWkUpCisgICAqLworICBKRElNRU5TSU9OIGRvd25zYW1wbGVkX3dpZHRoOwkgLyogYWN0dWFsIHdpZHRoIGluIHNhbXBsZXMgKi8KKyAgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF9oZWlnaHQ7IC8qIGFjdHVhbCBoZWlnaHQgaW4gc2FtcGxlcyAqLworICAvKiBUaGlzIGZsYWcgaXMgdXNlZCBvbmx5IGZvciBkZWNvbXByZXNzaW9uLiAgSW4gY2FzZXMgd2hlcmUgc29tZSBvZiB0aGUKKyAgICogY29tcG9uZW50cyB3aWxsIGJlIGlnbm9yZWQgKGVnIGdyYXlzY2FsZSBvdXRwdXQgZnJvbSBZQ2JDciBpbWFnZSksCisgICAqIHdlIGNhbiBza2lwIG1vc3QgY29tcHV0YXRpb25zIGZvciB0aGUgdW51c2VkIGNvbXBvbmVudHMuCisgICAqLworICBib29sZWFuIGNvbXBvbmVudF9uZWVkZWQ7CS8qIGRvIHdlIG5lZWQgdGhlIHZhbHVlIG9mIHRoaXMgY29tcG9uZW50PyAqLworCisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgc2NhbiBvZiB0aGUgY29tcG9uZW50LiAqLworICAvKiBUaGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlIHRoZXNlIHZhcmlhYmxlcy4gKi8KKyAgaW50IE1DVV93aWR0aDsJCS8qIG51bWJlciBvZiBibG9ja3MgcGVyIE1DVSwgaG9yaXpvbnRhbGx5ICovCisgIGludCBNQ1VfaGVpZ2h0OwkJLyogbnVtYmVyIG9mIGJsb2NrcyBwZXIgTUNVLCB2ZXJ0aWNhbGx5ICovCisgIGludCBNQ1VfYmxvY2tzOwkJLyogTUNVX3dpZHRoICogTUNVX2hlaWdodCAqLworICBpbnQgTUNVX3NhbXBsZV93aWR0aDsJCS8qIE1DVSB3aWR0aCBpbiBzYW1wbGVzLCBNQ1Vfd2lkdGgqRENUX3NjYWxlZF9zaXplICovCisgIGludCBsYXN0X2NvbF93aWR0aDsJCS8qICMgb2Ygbm9uLWR1bW15IGJsb2NrcyBhY3Jvc3MgaW4gbGFzdCBNQ1UgKi8KKyAgaW50IGxhc3Rfcm93X2hlaWdodDsJCS8qICMgb2Ygbm9uLWR1bW15IGJsb2NrcyBkb3duIGluIGxhc3QgTUNVICovCisKKyAgLyogU2F2ZWQgcXVhbnRpemF0aW9uIHRhYmxlIGZvciBjb21wb25lbnQ7IE5VTEwgaWYgbm9uZSB5ZXQgc2F2ZWQuCisgICAqIFNlZSBqZGlucHV0LmMgY29tbWVudHMgYWJvdXQgdGhlIG5lZWQgZm9yIHRoaXMgaW5mb3JtYXRpb24uCisgICAqIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHVzZWQgb25seSBmb3IgZGVjb21wcmVzc2lvbi4KKyAgICovCisgIEpRVUFOVF9UQkwgKiBxdWFudF90YWJsZTsKKworICAvKiBQcml2YXRlIHBlci1jb21wb25lbnQgc3RvcmFnZSBmb3IgRENUIG9yIElEQ1Qgc3Vic3lzdGVtLiAqLworICB2b2lkICogZGN0X3RhYmxlOworfSBqcGVnX2NvbXBvbmVudF9pbmZvOworCisKKy8qIFRoZSBzY3JpcHQgZm9yIGVuY29kaW5nIGEgbXVsdGlwbGUtc2NhbiBmaWxlIGlzIGFuIGFycmF5IG9mIHRoZXNlOiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBjb21wc19pbl9zY2FuOwkJLyogbnVtYmVyIG9mIGNvbXBvbmVudHMgZW5jb2RlZCBpbiB0aGlzIHNjYW4gKi8KKyAgaW50IGNvbXBvbmVudF9pbmRleFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIHRoZWlyIFNPRi9jb21wX2luZm9bXSBpbmRleGVzICovCisgIGludCBTcywgU2U7CQkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBzcGVjdHJhbCBzZWxlY3Rpb24gcGFybXMgKi8KKyAgaW50IEFoLCBBbDsJCQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHN1Y2Nlc3NpdmUgYXBwcm94LiBwYXJtcyAqLworfSBqcGVnX3NjYW5faW5mbzsKKworLyogVGhlIGRlY29tcHJlc3NvciBjYW4gc2F2ZSBBUFBuIGFuZCBDT00gbWFya2VycyBpbiBhIGxpc3Qgb2YgdGhlc2U6ICovCisKK3R5cGVkZWYgc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCBGQVIgKiBqcGVnX3NhdmVkX21hcmtlcl9wdHI7CisKK3N0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QgeworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0LCBvciBOVUxMICovCisgIFVJTlQ4IG1hcmtlcjsJCQkvKiBtYXJrZXIgY29kZTogSlBFR19DT00sIG9yIEpQRUdfQVBQMCtuICovCisgIHVuc2lnbmVkIGludCBvcmlnaW5hbF9sZW5ndGg7CS8qICMgYnl0ZXMgb2YgZGF0YSBpbiB0aGUgZmlsZSAqLworICB1bnNpZ25lZCBpbnQgZGF0YV9sZW5ndGg7CS8qICMgYnl0ZXMgb2YgZGF0YSBzYXZlZCBhdCBkYXRhW10gKi8KKyAgSk9DVEVUIEZBUiAqIGRhdGE7CQkvKiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIG1hcmtlciAqLworICAvKiB0aGUgbWFya2VyIGxlbmd0aCB3b3JkIGlzIG5vdCBjb3VudGVkIGluIGRhdGFfbGVuZ3RoIG9yIG9yaWdpbmFsX2xlbmd0aCAqLworfTsKKworLyogS25vd24gY29sb3Igc3BhY2VzLiAqLworCit0eXBlZGVmIGVudW0geworCUpDU19VTktOT1dOLAkJLyogZXJyb3IvdW5zcGVjaWZpZWQgKi8KKwlKQ1NfR1JBWVNDQUxFLAkJLyogbW9ub2Nocm9tZSAqLworCUpDU19SR0IsCQkvKiByZWQvZ3JlZW4vYmx1ZSAqLworCUpDU19ZQ2JDciwJCS8qIFkvQ2IvQ3IgKGFsc28ga25vd24gYXMgWVVWKSAqLworCUpDU19DTVlLLAkJLyogQy9NL1kvSyAqLworCUpDU19ZQ0NLCQkvKiBZL0NiL0NyL0sgKi8KK30gSl9DT0xPUl9TUEFDRTsKKworLyogRENUL0lEQ1QgYWxnb3JpdGhtIG9wdGlvbnMuICovCisKK3R5cGVkZWYgZW51bSB7CisJSkRDVF9JU0xPVywJCS8qIHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtICovCisJSkRDVF9JRkFTVCwJCS8qIGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZCAqLworCUpEQ1RfRkxPQVQJCS8qIGZsb2F0aW5nLXBvaW50OiBhY2N1cmF0ZSwgZmFzdCBvbiBmYXN0IEhXICovCit9IEpfRENUX01FVEhPRDsKKworI2lmbmRlZiBKRENUX0RFRkFVTFQJCS8qIG1heSBiZSBvdmVycmlkZGVuIGluIGpjb25maWcuaCAqLworI2RlZmluZSBKRENUX0RFRkFVTFQgIEpEQ1RfSVNMT1cKKyNlbmRpZgorI2lmbmRlZiBKRENUX0ZBU1RFU1QJCS8qIG1heSBiZSBvdmVycmlkZGVuIGluIGpjb25maWcuaCAqLworI2RlZmluZSBKRENUX0ZBU1RFU1QgIEpEQ1RfSUZBU1QKKyNlbmRpZgorCisvKiBEaXRoZXJpbmcgb3B0aW9ucyBmb3IgZGVjb21wcmVzc2lvbi4gKi8KKwordHlwZWRlZiBlbnVtIHsKKwlKRElUSEVSX05PTkUsCQkvKiBubyBkaXRoZXJpbmcgKi8KKwlKRElUSEVSX09SREVSRUQsCS8qIHNpbXBsZSBvcmRlcmVkIGRpdGhlciAqLworCUpESVRIRVJfRlMJCS8qIEZsb3lkLVN0ZWluYmVyZyBlcnJvciBkaWZmdXNpb24gZGl0aGVyICovCit9IEpfRElUSEVSX01PREU7CisKKworLyogQ29tbW9uIGZpZWxkcyBiZXR3ZWVuIEpQRUcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gbWFzdGVyIHN0cnVjdHMuICovCisKKyNkZWZpbmUganBlZ19jb21tb25fZmllbGRzIFwKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyOwkvKiBFcnJvciBoYW5kbGVyIG1vZHVsZSAqL1wKKyAgc3RydWN0IGpwZWdfbWVtb3J5X21nciAqIG1lbTsJLyogTWVtb3J5IG1hbmFnZXIgbW9kdWxlICovXAorICBzdHJ1Y3QganBlZ19wcm9ncmVzc19tZ3IgKiBwcm9ncmVzczsgLyogUHJvZ3Jlc3MgbW9uaXRvciwgb3IgTlVMTCBpZiBub25lICovXAorICB2b2lkICogY2xpZW50X2RhdGE7CQkvKiBBdmFpbGFibGUgZm9yIHVzZSBieSBhcHBsaWNhdGlvbiAqL1wKKyAgYm9vbGVhbiBpc19kZWNvbXByZXNzb3I7CS8qIFNvIGNvbW1vbiBjb2RlIGNhbiB0ZWxsIHdoaWNoIGlzIHdoaWNoICovXAorICBpbnQgZ2xvYmFsX3N0YXRlCQkvKiBGb3IgY2hlY2tpbmcgY2FsbCBzZXF1ZW5jZSB2YWxpZGl0eSAqLworCisvKiBSb3V0aW5lcyB0aGF0IGFyZSB0byBiZSB1c2VkIGJ5IGJvdGggaGFsdmVzIG9mIHRoZSBsaWJyYXJ5IGFyZSBkZWNsYXJlZAorICogdG8gcmVjZWl2ZSBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUuICBUaGVyZSBhcmUgbm8gYWN0dWFsIGluc3RhbmNlcyBvZgorICoganBlZ19jb21tb25fc3RydWN0LCBvbmx5IG9mIGpwZWdfY29tcHJlc3Nfc3RydWN0IGFuZCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0LgorICovCitzdHJ1Y3QganBlZ19jb21tb25fc3RydWN0IHsKKyAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIGNvbW1vbiB0byBib3RoIG1hc3RlciBzdHJ1Y3QgdHlwZXMgKi8KKyAgLyogQWRkaXRpb25hbCBmaWVsZHMgZm9sbG93IGluIGFuIGFjdHVhbCBqcGVnX2NvbXByZXNzX3N0cnVjdCBvcgorICAgKiBqcGVnX2RlY29tcHJlc3Nfc3RydWN0LiAgQWxsIHRocmVlIHN0cnVjdHMgbXVzdCBhZ3JlZSBvbiB0aGVzZQorICAgKiBpbml0aWFsIGZpZWxkcyEgIChUaGlzIHdvdWxkIGJlIGEgbG90IGNsZWFuZXIgaW4gQysrLikKKyAgICovCit9OworCit0eXBlZGVmIHN0cnVjdCBqcGVnX2NvbW1vbl9zdHJ1Y3QgKiBqX2NvbW1vbl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCAqIGpfY29tcHJlc3NfcHRyOwordHlwZWRlZiBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCAqIGpfZGVjb21wcmVzc19wdHI7CisKKworLyogTWFzdGVyIHJlY29yZCBmb3IgYSBjb21wcmVzc2lvbiBpbnN0YW5jZSAqLworCitzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgeworICBqcGVnX2NvbW1vbl9maWVsZHM7CQkvKiBGaWVsZHMgc2hhcmVkIHdpdGgganBlZ19kZWNvbXByZXNzX3N0cnVjdCAqLworCisgIC8qIERlc3RpbmF0aW9uIGZvciBjb21wcmVzc2VkIGRhdGEgKi8KKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdDsKKworICAvKiBEZXNjcmlwdGlvbiBvZiBzb3VyY2UgaW1hZ2UgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIGZpbGxlZCBpbiBieQorICAgKiBvdXRlciBhcHBsaWNhdGlvbiBiZWZvcmUgc3RhcnRpbmcgY29tcHJlc3Npb24uICBpbl9jb2xvcl9zcGFjZSBtdXN0CisgICAqIGJlIGNvcnJlY3QgYmVmb3JlIHlvdSBjYW4gZXZlbiBjYWxsIGpwZWdfc2V0X2RlZmF1bHRzKCkuCisgICAqLworCisgIEpESU1FTlNJT04gaW1hZ2Vfd2lkdGg7CS8qIGlucHV0IGltYWdlIHdpZHRoICovCisgIEpESU1FTlNJT04gaW1hZ2VfaGVpZ2h0OwkvKiBpbnB1dCBpbWFnZSBoZWlnaHQgKi8KKyAgaW50IGlucHV0X2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gaW5wdXQgaW1hZ2UgKi8KKyAgSl9DT0xPUl9TUEFDRSBpbl9jb2xvcl9zcGFjZTsJLyogY29sb3JzcGFjZSBvZiBpbnB1dCBpbWFnZSAqLworCisgIGRvdWJsZSBpbnB1dF9nYW1tYTsJCS8qIGltYWdlIGdhbW1hIG9mIGlucHV0IGltYWdlICovCisKKyAgLyogQ29tcHJlc3Npb24gcGFyYW1ldGVycyAtLS0gdGhlc2UgZmllbGRzIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nCisgICAqIGpwZWdfc3RhcnRfY29tcHJlc3MoKS4gIFdlIHJlY29tbWVuZCBjYWxsaW5nIGpwZWdfc2V0X2RlZmF1bHRzKCkgdG8KKyAgICogaW5pdGlhbGl6ZSBldmVyeXRoaW5nIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMsIHRoZW4gY2hhbmdpbmcgYW55dGhpbmcKKyAgICogdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYWxseSB3YW50cyB0byBjaGFuZ2UuICBUaGF0IHdheSB5b3Ugd29uJ3QgZ2V0CisgICAqIGJ1cm50IHdoZW4gbmV3IHBhcmFtZXRlcnMgYXJlIGFkZGVkLiAgQWxzbyBub3RlIHRoYXQgdGhlcmUgYXJlIHNldmVyYWwKKyAgICogaGVscGVyIHJvdXRpbmVzIHRvIHNpbXBsaWZ5IGNoYW5naW5nIHBhcmFtZXRlcnMuCisgICAqLworCisgIGludCBkYXRhX3ByZWNpc2lvbjsJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIGltYWdlIGRhdGEgKi8KKworICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gSlBFRyBpbWFnZSAqLworICBKX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2U7IC8qIGNvbG9yc3BhY2Ugb2YgSlBFRyBpbWFnZSAqLworCisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wX2luZm87CisgIC8qIGNvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPRiAqLworICAKKyAgSlFVQU5UX1RCTCAqIHF1YW50X3RibF9wdHJzW05VTV9RVUFOVF9UQkxTXTsKKyAgLyogcHRycyB0byBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCisgIAorICBKSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOworICBKSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOworICAvKiBwdHJzIHRvIEh1ZmZtYW4gY29kaW5nIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLworICAKKyAgVUlOVDggYXJpdGhfZGNfTFtOVU1fQVJJVEhfVEJMU107IC8qIEwgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCisgIFVJTlQ4IGFyaXRoX2RjX1VbTlVNX0FSSVRIX1RCTFNdOyAvKiBVIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworICBVSU5UOCBhcml0aF9hY19LW05VTV9BUklUSF9UQkxTXTsgLyogS3ggdmFsdWVzIGZvciBBQyBhcml0aC1jb2RpbmcgdGFibGVzICovCisKKyAgaW50IG51bV9zY2FuczsJCS8qICMgb2YgZW50cmllcyBpbiBzY2FuX2luZm8gYXJyYXkgKi8KKyAgY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FuX2luZm87IC8qIHNjcmlwdCBmb3IgbXVsdGktc2NhbiBmaWxlLCBvciBOVUxMICovCisgIC8qIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHNjYW5faW5mbyBpcyBOVUxMLCB3aGljaCBjYXVzZXMgYSBzaW5nbGUtc2NhbgorICAgKiBzZXF1ZW50aWFsIEpQRUcgZmlsZSB0byBiZSBlbWl0dGVkLiAgVG8gY3JlYXRlIGEgbXVsdGktc2NhbiBmaWxlLAorICAgKiBzZXQgbnVtX3NjYW5zIGFuZCBzY2FuX2luZm8gdG8gcG9pbnQgdG8gYW4gYXJyYXkgb2Ygc2NhbiBkZWZpbml0aW9ucy4KKyAgICovCisKKyAgYm9vbGVhbiByYXdfZGF0YV9pbjsJCS8qIFRSVUU9Y2FsbGVyIHN1cHBsaWVzIGRvd25zYW1wbGVkIGRhdGEgKi8KKyAgYm9vbGVhbiBhcml0aF9jb2RlOwkJLyogVFJVRT1hcml0aG1ldGljIGNvZGluZywgRkFMU0U9SHVmZm1hbiAqLworICBib29sZWFuIG9wdGltaXplX2NvZGluZzsJLyogVFJVRT1vcHRpbWl6ZSBlbnRyb3B5IGVuY29kaW5nIHBhcm1zICovCisgIGJvb2xlYW4gQ0NJUjYwMV9zYW1wbGluZzsJLyogVFJVRT1maXJzdCBzYW1wbGVzIGFyZSBjb3NpdGVkICovCisgIGludCBzbW9vdGhpbmdfZmFjdG9yOwkJLyogMS4uMTAwLCBvciAwIGZvciBubyBpbnB1dCBzbW9vdGhpbmcgKi8KKyAgSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2Q7CS8qIERDVCBhbGdvcml0aG0gc2VsZWN0b3IgKi8KKworICAvKiBUaGUgcmVzdGFydCBpbnRlcnZhbCBjYW4gYmUgc3BlY2lmaWVkIGluIGFic29sdXRlIE1DVXMgYnkgc2V0dGluZworICAgKiByZXN0YXJ0X2ludGVydmFsLCBvciBpbiBNQ1Ugcm93cyBieSBzZXR0aW5nIHJlc3RhcnRfaW5fcm93cworICAgKiAoaW4gd2hpY2ggY2FzZSB0aGUgY29ycmVjdCByZXN0YXJ0X2ludGVydmFsIHdpbGwgYmUgZmlndXJlZAorICAgKiBmb3IgZWFjaCBzY2FuKS4KKyAgICovCisgIHVuc2lnbmVkIGludCByZXN0YXJ0X2ludGVydmFsOyAvKiBNQ1VzIHBlciByZXN0YXJ0LCBvciAwIGZvciBubyByZXN0YXJ0ICovCisgIGludCByZXN0YXJ0X2luX3Jvd3M7CQkvKiBpZiA+IDAsIE1DVSByb3dzIHBlciByZXN0YXJ0IGludGVydmFsICovCisKKyAgLyogUGFyYW1ldGVycyBjb250cm9sbGluZyBlbWlzc2lvbiBvZiBzcGVjaWFsIG1hcmtlcnMuICovCisKKyAgYm9vbGVhbiB3cml0ZV9KRklGX2hlYWRlcjsJLyogc2hvdWxkIGEgSkZJRiBtYXJrZXIgYmUgd3JpdHRlbj8gKi8KKyAgVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uOwkvKiBXaGF0IHRvIHdyaXRlIGZvciB0aGUgSkZJRiB2ZXJzaW9uIG51bWJlciAqLworICBVSU5UOCBKRklGX21pbm9yX3ZlcnNpb247CisgIC8qIFRoZXNlIHRocmVlIHZhbHVlcyBhcmUgbm90IHVzZWQgYnkgdGhlIEpQRUcgY29kZSwgbWVyZWx5IGNvcGllZCAqLworICAvKiBpbnRvIHRoZSBKRklGIEFQUDAgbWFya2VyLiAgZGVuc2l0eV91bml0IGNhbiBiZSAwIGZvciB1bmtub3duLCAqLworICAvKiAxIGZvciBkb3RzL2luY2gsIG9yIDIgZm9yIGRvdHMvY20uICBOb3RlIHRoYXQgdGhlIHBpeGVsIGFzcGVjdCAqLworICAvKiByYXRpbyBpcyBkZWZpbmVkIGJ5IFhfZGVuc2l0eS9ZX2RlbnNpdHkgZXZlbiB3aGVuIGRlbnNpdHlfdW5pdD0wLiAqLworICBVSU5UOCBkZW5zaXR5X3VuaXQ7CQkvKiBKRklGIGNvZGUgZm9yIHBpeGVsIHNpemUgdW5pdHMgKi8KKyAgVUlOVDE2IFhfZGVuc2l0eTsJCS8qIEhvcml6b250YWwgcGl4ZWwgZGVuc2l0eSAqLworICBVSU5UMTYgWV9kZW5zaXR5OwkJLyogVmVydGljYWwgcGl4ZWwgZGVuc2l0eSAqLworICBib29sZWFuIHdyaXRlX0Fkb2JlX21hcmtlcjsJLyogc2hvdWxkIGFuIEFkb2JlIG1hcmtlciBiZSB3cml0dGVuPyAqLworICAKKyAgLyogU3RhdGUgdmFyaWFibGU6IGluZGV4IG9mIG5leHQgc2NhbmxpbmUgdG8gYmUgd3JpdHRlbiB0bworICAgKiBqcGVnX3dyaXRlX3NjYW5saW5lcygpLiAgQXBwbGljYXRpb24gbWF5IHVzZSB0aGlzIHRvIGNvbnRyb2wgaXRzCisgICAqIHByb2Nlc3NpbmcgbG9vcCwgZS5nLiwgIndoaWxlIChuZXh0X3NjYW5saW5lIDwgaW1hZ2VfaGVpZ2h0KSIuCisgICAqLworCisgIEpESU1FTlNJT04gbmV4dF9zY2FubGluZTsJLyogMCAuLiBpbWFnZV9oZWlnaHQtMSAgKi8KKworICAvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBrbm93biB0aHJvdWdob3V0IGNvbXByZXNzb3IsIGJ1dCBnZW5lcmFsbHkKKyAgICogc2hvdWxkIG5vdCBiZSB0b3VjaGVkIGJ5IGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCisgICAqLworCisgIC8qCisgICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uIHN0YXJ0dXAKKyAgICovCisgIGJvb2xlYW4gcHJvZ3Jlc3NpdmVfbW9kZTsJLyogVFJVRSBpZiBzY2FuIHNjcmlwdCB1c2VzIHByb2dyZXNzaXZlIG1vZGUgKi8KKyAgaW50IG1heF9oX3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IGhfc2FtcF9mYWN0b3IgKi8KKyAgaW50IG1heF92X3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IHZfc2FtcF9mYWN0b3IgKi8KKworICBKRElNRU5TSU9OIHRvdGFsX2lNQ1Vfcm93czsJLyogIyBvZiBpTUNVIHJvd3MgdG8gYmUgaW5wdXQgdG8gY29lZiBjdGxyICovCisgIC8qIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIHJlY2VpdmVzIGRhdGEgaW4gdW5pdHMgb2YgTUNVIHJvd3MgYXMgZGVmaW5lZAorICAgKiBmb3IgZnVsbHkgaW50ZXJsZWF2ZWQgc2NhbnMgKHdoZXRoZXIgdGhlIEpQRUcgZmlsZSBpcyBpbnRlcmxlYXZlZCBvciBub3QpLgorICAgKiBUaGVyZSBhcmUgdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUgc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQgaW4gYW4KKyAgICogImlNQ1UiIChpbnRlcmxlYXZlZCBNQ1UpIHJvdy4KKyAgICovCisgIAorICAvKgorICAgKiBUaGVzZSBmaWVsZHMgYXJlIHZhbGlkIGR1cmluZyBhbnkgb25lIHNjYW4uCisgICAqIFRoZXkgZGVzY3JpYmUgdGhlIGNvbXBvbmVudHMgYW5kIE1DVXMgYWN0dWFsbHkgYXBwZWFyaW5nIGluIHRoZSBzY2FuLgorICAgKi8KKyAgaW50IGNvbXBzX2luX3NjYW47CQkvKiAjIG9mIEpQRUcgY29tcG9uZW50cyBpbiB0aGlzIHNjYW4gKi8KKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGN1cl9jb21wX2luZm9bTUFYX0NPTVBTX0lOX1NDQU5dOworICAvKiAqY3VyX2NvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPUyAqLworICAKKyAgSkRJTUVOU0lPTiBNQ1VzX3Blcl9yb3c7CS8qICMgb2YgTUNVcyBhY3Jvc3MgdGhlIGltYWdlICovCisgIEpESU1FTlNJT04gTUNVX3Jvd3NfaW5fc2NhbjsJLyogIyBvZiBNQ1Ugcm93cyBpbiB0aGUgaW1hZ2UgKi8KKyAgCisgIGludCBibG9ja3NfaW5fTUNVOwkJLyogIyBvZiBEQ1QgYmxvY2tzIHBlciBNQ1UgKi8KKyAgaW50IE1DVV9tZW1iZXJzaGlwW0NfTUFYX0JMT0NLU19JTl9NQ1VdOworICAvKiBNQ1VfbWVtYmVyc2hpcFtpXSBpcyBpbmRleCBpbiBjdXJfY29tcF9pbmZvIG9mIGNvbXBvbmVudCBvd25pbmcgKi8KKyAgLyogaSd0aCBibG9jayBpbiBhbiBNQ1UgKi8KKworICBpbnQgU3MsIFNlLCBBaCwgQWw7CQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHBhcmFtZXRlcnMgZm9yIHNjYW4gKi8KKworICAvKgorICAgKiBMaW5rcyB0byBjb21wcmVzc2lvbiBzdWJvYmplY3RzIChtZXRob2RzIGFuZCBwcml2YXRlIHZhcmlhYmxlcyBvZiBtb2R1bGVzKQorICAgKi8KKyAgc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgKiBtYXN0ZXI7CisgIHN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyICogbWFpbjsKKyAgc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgKiBwcmVwOworICBzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciAqIGNvZWY7CisgIHN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgKiBtYXJrZXI7CisgIHN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciAqIGNjb252ZXJ0OworICBzdHJ1Y3QganBlZ19kb3duc2FtcGxlciAqIGRvd25zYW1wbGU7CisgIHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0ICogZmRjdDsKKyAgc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyICogZW50cm9weTsKKyAganBlZ19zY2FuX2luZm8gKiBzY3JpcHRfc3BhY2U7IC8qIHdvcmtzcGFjZSBmb3IganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gKi8KKyAgaW50IHNjcmlwdF9zcGFjZV9zaXplOworfTsKKworCisvKiBNYXN0ZXIgcmVjb3JkIGZvciBhIGRlY29tcHJlc3Npb24gaW5zdGFuY2UgKi8KKworc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgeworICBqcGVnX2NvbW1vbl9maWVsZHM7CQkvKiBGaWVsZHMgc2hhcmVkIHdpdGgganBlZ19jb21wcmVzc19zdHJ1Y3QgKi8KKworICAvKiBTb3VyY2Ugb2YgY29tcHJlc3NlZCBkYXRhICovCisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgKiBzcmM7CisKKyAgLyogQmFzaWMgZGVzY3JpcHRpb24gb2YgaW1hZ2UgLS0tIGZpbGxlZCBpbiBieSBqcGVnX3JlYWRfaGVhZGVyKCkuICovCisgIC8qIEFwcGxpY2F0aW9uIG1heSBpbnNwZWN0IHRoZXNlIHZhbHVlcyB0byBkZWNpZGUgaG93IHRvIHByb2Nlc3MgaW1hZ2UuICovCisKKyAgSkRJTUVOU0lPTiBpbWFnZV93aWR0aDsJLyogbm9taW5hbCBpbWFnZSB3aWR0aCAoZnJvbSBTT0YgbWFya2VyKSAqLworICBKRElNRU5TSU9OIGltYWdlX2hlaWdodDsJLyogbm9taW5hbCBpbWFnZSBoZWlnaHQgKi8KKyAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIEpQRUcgaW1hZ2UgKi8KKyAgSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIG9mIEpQRUcgaW1hZ2UgKi8KKworICAvKiBEZWNvbXByZXNzaW9uIHByb2Nlc3NpbmcgcGFyYW1ldGVycyAtLS0gdGhlc2UgZmllbGRzIG11c3QgYmUgc2V0IGJlZm9yZQorICAgKiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgTm90ZSB0aGF0IGpwZWdfcmVhZF9oZWFkZXIoKSBpbml0aWFsaXplcworICAgKiB0aGVtIHRvIGRlZmF1bHQgdmFsdWVzLgorICAgKi8KKworICBKX0NPTE9SX1NQQUNFIG91dF9jb2xvcl9zcGFjZTsgLyogY29sb3JzcGFjZSBmb3Igb3V0cHV0ICovCisKKyAgdW5zaWduZWQgaW50IHNjYWxlX251bSwgc2NhbGVfZGVub207IC8qIGZyYWN0aW9uIGJ5IHdoaWNoIHRvIHNjYWxlIGltYWdlICovCisKKyAgZG91YmxlIG91dHB1dF9nYW1tYTsJCS8qIGltYWdlIGdhbW1hIHdhbnRlZCBpbiBvdXRwdXQgKi8KKworICBib29sZWFuIGJ1ZmZlcmVkX2ltYWdlOwkvKiBUUlVFPW11bHRpcGxlIG91dHB1dCBwYXNzZXMgKi8KKyAgYm9vbGVhbiByYXdfZGF0YV9vdXQ7CQkvKiBUUlVFPWRvd25zYW1wbGVkIGRhdGEgd2FudGVkICovCisKKyAgSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2Q7CS8qIElEQ1QgYWxnb3JpdGhtIHNlbGVjdG9yICovCisgIGJvb2xlYW4gZG9fZmFuY3lfdXBzYW1wbGluZzsJLyogVFJVRT1hcHBseSBmYW5jeSB1cHNhbXBsaW5nICovCisgIGJvb2xlYW4gZG9fYmxvY2tfc21vb3RoaW5nOwkvKiBUUlVFPWFwcGx5IGludGVyYmxvY2sgc21vb3RoaW5nICovCisKKyAgYm9vbGVhbiBxdWFudGl6ZV9jb2xvcnM7CS8qIFRSVUU9Y29sb3JtYXBwZWQgb3V0cHV0IHdhbnRlZCAqLworICAvKiB0aGUgZm9sbG93aW5nIGFyZSBpZ25vcmVkIGlmIG5vdCBxdWFudGl6ZV9jb2xvcnM6ICovCisgIEpfRElUSEVSX01PREUgZGl0aGVyX21vZGU7CS8qIHR5cGUgb2YgY29sb3IgZGl0aGVyaW5nIHRvIHVzZSAqLworICBib29sZWFuIHR3b19wYXNzX3F1YW50aXplOwkvKiBUUlVFPXVzZSB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gKi8KKyAgaW50IGRlc2lyZWRfbnVtYmVyX29mX2NvbG9yczsJLyogbWF4ICMgY29sb3JzIHRvIHVzZSBpbiBjcmVhdGVkIGNvbG9ybWFwICovCisgIC8qIHRoZXNlIGFyZSBzaWduaWZpY2FudCBvbmx5IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGU6ICovCisgIGJvb2xlYW4gZW5hYmxlXzFwYXNzX3F1YW50OwkvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiAxLXBhc3MgcXVhbnRpemVyICovCisgIGJvb2xlYW4gZW5hYmxlX2V4dGVybmFsX3F1YW50Oy8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIGV4dGVybmFsIGNvbG9ybWFwICovCisgIGJvb2xlYW4gZW5hYmxlXzJwYXNzX3F1YW50OwkvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiAyLXBhc3MgcXVhbnRpemVyICovCisKKyAgLyogRGVzY3JpcHRpb24gb2YgYWN0dWFsIG91dHB1dCBpbWFnZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgdG8gYXBwbGljYXRpb24uCisgICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgYnkganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCisgICAqIFlvdSBjYW4gYWxzbyB1c2UganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkgdG8gZGV0ZXJtaW5lIHRoZXNlIHZhbHVlcworICAgKiBpbiBhZHZhbmNlIG9mIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCisgICAqLworCisgIEpESU1FTlNJT04gb3V0cHV0X3dpZHRoOwkvKiBzY2FsZWQgaW1hZ2Ugd2lkdGggKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfaGVpZ2h0OwkvKiBzY2FsZWQgaW1hZ2UgaGVpZ2h0ICovCisgIGludCBvdXRfY29sb3JfY29tcG9uZW50czsJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIG91dF9jb2xvcl9zcGFjZSAqLworICBpbnQgb3V0cHV0X2NvbXBvbmVudHM7CS8qICMgb2YgY29sb3IgY29tcG9uZW50cyByZXR1cm5lZCAqLworICAvKiBvdXRwdXRfY29tcG9uZW50cyBpcyAxIChhIGNvbG9ybWFwIGluZGV4KSB3aGVuIHF1YW50aXppbmcgY29sb3JzOworICAgKiBvdGhlcndpc2UgaXQgZXF1YWxzIG91dF9jb2xvcl9jb21wb25lbnRzLgorICAgKi8KKyAgaW50IHJlY19vdXRidWZfaGVpZ2h0OwkvKiBtaW4gcmVjb21tZW5kZWQgaGVpZ2h0IG9mIHNjYW5saW5lIGJ1ZmZlciAqLworICAvKiBJZiB0aGUgYnVmZmVyIHBhc3NlZCB0byBqcGVnX3JlYWRfc2NhbmxpbmVzKCkgaXMgbGVzcyB0aGFuIHRoaXMgbWFueSByb3dzCisgICAqIGhpZ2gsIHNwYWNlIGFuZCB0aW1lIHdpbGwgYmUgd2FzdGVkIGR1ZSB0byB1bm5lY2Vzc2FyeSBkYXRhIGNvcHlpbmcuCisgICAqIFVzdWFsbHkgcmVjX291dGJ1Zl9oZWlnaHQgd2lsbCBiZSAxIG9yIDIsIGF0IG1vc3QgNC4KKyAgICovCisKKyAgLyogV2hlbiBxdWFudGl6aW5nIGNvbG9ycywgdGhlIG91dHB1dCBjb2xvcm1hcCBpcyBkZXNjcmliZWQgYnkgdGhlc2UgZmllbGRzLgorICAgKiBUaGUgYXBwbGljYXRpb24gY2FuIHN1cHBseSBhIGNvbG9ybWFwIGJ5IHNldHRpbmcgY29sb3JtYXAgbm9uLU5VTEwgYmVmb3JlCisgICAqIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzOyBvdGhlcndpc2UgYSBjb2xvcm1hcCBpcyBjcmVhdGVkIGR1cmluZworICAgKiBqcGVnX3N0YXJ0X2RlY29tcHJlc3Mgb3IganBlZ19zdGFydF9vdXRwdXQuCisgICAqIFRoZSBtYXAgaGFzIG91dF9jb2xvcl9jb21wb25lbnRzIHJvd3MgYW5kIGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzIGNvbHVtbnMuCisgICAqLworICBpbnQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnM7CS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHVzZSAqLworICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogVGhlIGNvbG9yIG1hcCBhcyBhIDItRCBwaXhlbCBhcnJheSAqLworCisgIC8qIFN0YXRlIHZhcmlhYmxlczogdGhlc2UgdmFyaWFibGVzIGluZGljYXRlIHRoZSBwcm9ncmVzcyBvZiBkZWNvbXByZXNzaW9uLgorICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IGV4YW1pbmUgdGhlc2UgYnV0IG11c3Qgbm90IG1vZGlmeSB0aGVtLgorICAgKi8KKworICAvKiBSb3cgaW5kZXggb2YgbmV4dCBzY2FubGluZSB0byBiZSByZWFkIGZyb20ganBlZ19yZWFkX3NjYW5saW5lcygpLgorICAgKiBBcHBsaWNhdGlvbiBtYXkgdXNlIHRoaXMgdG8gY29udHJvbCBpdHMgcHJvY2Vzc2luZyBsb29wLCBlLmcuLAorICAgKiAid2hpbGUgKG91dHB1dF9zY2FubGluZSA8IG91dHB1dF9oZWlnaHQpIi4KKyAgICovCisgIEpESU1FTlNJT04gb3V0cHV0X3NjYW5saW5lOwkvKiAwIC4uIG91dHB1dF9oZWlnaHQtMSAgKi8KKworICAvKiBDdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyIGFuZCBudW1iZXIgb2YgaU1DVSByb3dzIGNvbXBsZXRlZCBpbiBzY2FuLgorICAgKiBUaGVzZSBpbmRpY2F0ZSB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlLgorICAgKi8KKyAgaW50IGlucHV0X3NjYW5fbnVtYmVyOwkvKiBOdW1iZXIgb2YgU09TIG1hcmtlcnMgc2VlbiBzbyBmYXIgKi8KKyAgSkRJTUVOU0lPTiBpbnB1dF9pTUNVX3JvdzsJLyogTnVtYmVyIG9mIGlNQ1Ugcm93cyBjb21wbGV0ZWQgKi8KKworICAvKiBUaGUgIm91dHB1dCBzY2FuIG51bWJlciIgaXMgdGhlIG5vdGlvbmFsIHNjYW4gYmVpbmcgZGlzcGxheWVkIGJ5IHRoZQorICAgKiBvdXRwdXQgc2lkZS4gIFRoZSBkZWNvbXByZXNzb3Igd2lsbCBub3QgYWxsb3cgb3V0cHV0IHNjYW4vcm93IG51bWJlcgorICAgKiB0byBnZXQgYWhlYWQgb2YgaW5wdXQgc2Nhbi9yb3csIGJ1dCBpdCBjYW4gZmFsbCBhcmJpdHJhcmlseSBmYXIgYmVoaW5kLgorICAgKi8KKyAgaW50IG91dHB1dF9zY2FuX251bWJlcjsJLyogTm9taW5hbCBzY2FuIG51bWJlciBiZWluZyBkaXNwbGF5ZWQgKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfaU1DVV9yb3c7CS8qIE51bWJlciBvZiBpTUNVIHJvd3MgcmVhZCAqLworCisgIC8qIEN1cnJlbnQgcHJvZ3Jlc3Npb24gc3RhdHVzLiAgY29lZl9iaXRzW2NdW2ldIGluZGljYXRlcyB0aGUgcHJlY2lzaW9uCisgICAqIHdpdGggd2hpY2ggY29tcG9uZW50IGMncyBEQ1QgY29lZmZpY2llbnQgaSAoaW4gemlnemFnIG9yZGVyKSBpcyBrbm93bi4KKyAgICogSXQgaXMgLTEgd2hlbiBubyBkYXRhIGhhcyB5ZXQgYmVlbiByZWNlaXZlZCwgb3RoZXJ3aXNlIGl0IGlzIHRoZSBwb2ludAorICAgKiB0cmFuc2Zvcm0gKHNoaWZ0KSB2YWx1ZSBmb3IgdGhlIG1vc3QgcmVjZW50IHNjYW4gb2YgdGhlIGNvZWZmaWNpZW50CisgICAqICh0aHVzLCAwIGF0IGNvbXBsZXRpb24gb2YgdGhlIHByb2dyZXNzaW9uKS4KKyAgICogVGhpcyBwb2ludGVyIGlzIE5VTEwgd2hlbiByZWFkaW5nIGEgbm9uLXByb2dyZXNzaXZlIGZpbGUuCisgICAqLworICBpbnQgKCpjb2VmX2JpdHMpW0RDVFNJWkUyXTsJLyogLTEgb3IgY3VycmVudCBBbCB2YWx1ZSBmb3IgZWFjaCBjb2VmICovCisKKyAgLyogSW50ZXJuYWwgSlBFRyBwYXJhbWV0ZXJzIC0tLSB0aGUgYXBwbGljYXRpb24gdXN1YWxseSBuZWVkIG5vdCBsb29rIGF0CisgICAqIHRoZXNlIGZpZWxkcy4gIE5vdGUgdGhhdCB0aGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlCisgICAqIGFueSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGNoYW5nZSBiZXR3ZWVuIHNjYW5zLgorICAgKi8KKworICAvKiBRdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGVzIGFyZSBjYXJyaWVkIGZvcndhcmQgYWNyb3NzIGlucHV0CisgICAqIGRhdGFzdHJlYW1zIHdoZW4gcHJvY2Vzc2luZyBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zLgorICAgKi8KKworICBKUVVBTlRfVEJMICogcXVhbnRfdGJsX3B0cnNbTlVNX1FVQU5UX1RCTFNdOworICAvKiBwdHJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KKworICBKSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOworICBKSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOworICAvKiBwdHJzIHRvIEh1ZmZtYW4gY29kaW5nIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLworCisgIC8qIFRoZXNlIHBhcmFtZXRlcnMgYXJlIG5ldmVyIGNhcnJpZWQgYWNyb3NzIGRhdGFzdHJlYW1zLCBzaW5jZSB0aGV5CisgICAqIGFyZSBnaXZlbiBpbiBTT0YvU09TIG1hcmtlcnMgb3IgZGVmaW5lZCB0byBiZSByZXNldCBieSBTT0kuCisgICAqLworCisgIGludCBkYXRhX3ByZWNpc2lvbjsJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIGltYWdlIGRhdGEgKi8KKworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcF9pbmZvOworICAvKiBjb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT0YgKi8KKworICBib29sZWFuIHByb2dyZXNzaXZlX21vZGU7CS8qIFRSVUUgaWYgU09GbiBzcGVjaWZpZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLworICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiBUUlVFPWFyaXRobWV0aWMgY29kaW5nLCBGQUxTRT1IdWZmbWFuICovCisKKyAgVUlOVDggYXJpdGhfZGNfTFtOVU1fQVJJVEhfVEJMU107IC8qIEwgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCisgIFVJTlQ4IGFyaXRoX2RjX1VbTlVNX0FSSVRIX1RCTFNdOyAvKiBVIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworICBVSU5UOCBhcml0aF9hY19LW05VTV9BUklUSF9UQkxTXTsgLyogS3ggdmFsdWVzIGZvciBBQyBhcml0aC1jb2RpbmcgdGFibGVzICovCisKKyAgdW5zaWduZWQgaW50IHJlc3RhcnRfaW50ZXJ2YWw7IC8qIE1DVXMgcGVyIHJlc3RhcnQgaW50ZXJ2YWwsIG9yIDAgZm9yIG5vIHJlc3RhcnQgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgcmVjb3JkIGRhdGEgb2J0YWluZWQgZnJvbSBvcHRpb25hbCBtYXJrZXJzIHJlY29nbml6ZWQgYnkKKyAgICogdGhlIEpQRUcgbGlicmFyeS4KKyAgICovCisgIGJvb2xlYW4gc2F3X0pGSUZfbWFya2VyOwkvKiBUUlVFIGlmZiBhIEpGSUYgQVBQMCBtYXJrZXIgd2FzIGZvdW5kICovCisgIC8qIERhdGEgY29waWVkIGZyb20gSkZJRiBtYXJrZXI7IG9ubHkgdmFsaWQgaWYgc2F3X0pGSUZfbWFya2VyIGlzIFRSVUU6ICovCisgIFVJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbjsJLyogSkZJRiB2ZXJzaW9uIG51bWJlciAqLworICBVSU5UOCBKRklGX21pbm9yX3ZlcnNpb247CisgIFVJTlQ4IGRlbnNpdHlfdW5pdDsJCS8qIEpGSUYgY29kZSBmb3IgcGl4ZWwgc2l6ZSB1bml0cyAqLworICBVSU5UMTYgWF9kZW5zaXR5OwkJLyogSG9yaXpvbnRhbCBwaXhlbCBkZW5zaXR5ICovCisgIFVJTlQxNiBZX2RlbnNpdHk7CQkvKiBWZXJ0aWNhbCBwaXhlbCBkZW5zaXR5ICovCisgIGJvb2xlYW4gc2F3X0Fkb2JlX21hcmtlcjsJLyogVFJVRSBpZmYgYW4gQWRvYmUgQVBQMTQgbWFya2VyIHdhcyBmb3VuZCAqLworICBVSU5UOCBBZG9iZV90cmFuc2Zvcm07CS8qIENvbG9yIHRyYW5zZm9ybSBjb2RlIGZyb20gQWRvYmUgbWFya2VyICovCisKKyAgYm9vbGVhbiBDQ0lSNjAxX3NhbXBsaW5nOwkvKiBUUlVFPWZpcnN0IHNhbXBsZXMgYXJlIGNvc2l0ZWQgKi8KKworICAvKiBBc2lkZSBmcm9tIHRoZSBzcGVjaWZpYyBkYXRhIHJldGFpbmVkIGZyb20gQVBQbiBtYXJrZXJzIGtub3duIHRvIHRoZQorICAgKiBsaWJyYXJ5LCB0aGUgdW5pbnRlcnByZXRlZCBjb250ZW50cyBvZiBhbnkgb3IgYWxsIEFQUG4gYW5kIENPTSBtYXJrZXJzCisgICAqIGNhbiBiZSBzYXZlZCBpbiBhIGxpc3QgZm9yIGV4YW1pbmF0aW9uIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICovCisgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXJfbGlzdDsgLyogSGVhZCBvZiBsaXN0IG9mIHNhdmVkIG1hcmtlcnMgKi8KKworICAvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBrbm93biB0aHJvdWdob3V0IGRlY29tcHJlc3NvciwgYnV0IGdlbmVyYWxseQorICAgKiBzaG91bGQgbm90IGJlIHRvdWNoZWQgYnkgYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KKyAgICovCisKKyAgLyoKKyAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBkdXJpbmcgZGVjb21wcmVzc2lvbiBzdGFydHVwCisgICAqLworICBpbnQgbWF4X2hfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3QgaF9zYW1wX2ZhY3RvciAqLworICBpbnQgbWF4X3Zfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3Qgdl9zYW1wX2ZhY3RvciAqLworCisgIGludCBtaW5fRENUX3NjYWxlZF9zaXplOwkvKiBzbWFsbGVzdCBEQ1Rfc2NhbGVkX3NpemUgb2YgYW55IGNvbXBvbmVudCAqLworCisgIEpESU1FTlNJT04gdG90YWxfaU1DVV9yb3dzOwkvKiAjIG9mIGlNQ1Ugcm93cyBpbiBpbWFnZSAqLworICAvKiBUaGUgY29lZmZpY2llbnQgY29udHJvbGxlcidzIGlucHV0IGFuZCBvdXRwdXQgcHJvZ3Jlc3MgaXMgbWVhc3VyZWQgaW4KKyAgICogdW5pdHMgb2YgImlNQ1UiIChpbnRlcmxlYXZlZCBNQ1UpIHJvd3MuICBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgTUNVIHJvd3MKKyAgICogaW4gZnVsbHkgaW50ZXJsZWF2ZWQgSlBFRyBzY2FucywgYnV0IGFyZSB1c2VkIHdoZXRoZXIgdGhlIHNjYW4gaXMKKyAgICogaW50ZXJsZWF2ZWQgb3Igbm90LiAgV2UgZGVmaW5lIGFuIGlNQ1Ugcm93IGFzIHZfc2FtcF9mYWN0b3IgRENUIGJsb2NrCisgICAqIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICBUaGVyZWZvcmUsIHRoZSBJRENUIG91dHB1dCBjb250YWlucworICAgKiB2X3NhbXBfZmFjdG9yKkRDVF9zY2FsZWRfc2l6ZSBzYW1wbGUgcm93cyBvZiBhIGNvbXBvbmVudCBwZXIgaU1DVSByb3cuCisgICAqLworCisgIEpTQU1QTEUgKiBzYW1wbGVfcmFuZ2VfbGltaXQ7IC8qIHRhYmxlIGZvciBmYXN0IHJhbmdlLWxpbWl0aW5nICovCisKKyAgLyoKKyAgICogVGhlc2UgZmllbGRzIGFyZSB2YWxpZCBkdXJpbmcgYW55IG9uZSBzY2FuLgorICAgKiBUaGV5IGRlc2NyaWJlIHRoZSBjb21wb25lbnRzIGFuZCBNQ1VzIGFjdHVhbGx5IGFwcGVhcmluZyBpbiB0aGUgc2Nhbi4KKyAgICogTm90ZSB0aGF0IHRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbXVzdCBub3QgdXNlIHRoZXNlIGZpZWxkcy4KKyAgICovCisgIGludCBjb21wc19pbl9zY2FuOwkJLyogIyBvZiBKUEVHIGNvbXBvbmVudHMgaW4gdGhpcyBzY2FuICovCisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjdXJfY29tcF9pbmZvW01BWF9DT01QU19JTl9TQ0FOXTsKKyAgLyogKmN1cl9jb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT1MgKi8KKworICBKRElNRU5TSU9OIE1DVXNfcGVyX3JvdzsJLyogIyBvZiBNQ1VzIGFjcm9zcyB0aGUgaW1hZ2UgKi8KKyAgSkRJTUVOU0lPTiBNQ1Vfcm93c19pbl9zY2FuOwkvKiAjIG9mIE1DVSByb3dzIGluIHRoZSBpbWFnZSAqLworCisgIGludCBibG9ja3NfaW5fTUNVOwkJLyogIyBvZiBEQ1QgYmxvY2tzIHBlciBNQ1UgKi8KKyAgaW50IE1DVV9tZW1iZXJzaGlwW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworICAvKiBNQ1VfbWVtYmVyc2hpcFtpXSBpcyBpbmRleCBpbiBjdXJfY29tcF9pbmZvIG9mIGNvbXBvbmVudCBvd25pbmcgKi8KKyAgLyogaSd0aCBibG9jayBpbiBhbiBNQ1UgKi8KKworICBpbnQgU3MsIFNlLCBBaCwgQWw7CQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHBhcmFtZXRlcnMgZm9yIHNjYW4gKi8KKworICAvKiBUaGlzIGZpZWxkIGlzIHNoYXJlZCBiZXR3ZWVuIGVudHJvcHkgZGVjb2RlciBhbmQgbWFya2VyIHBhcnNlci4KKyAgICogSXQgaXMgZWl0aGVyIHplcm8gb3IgdGhlIGNvZGUgb2YgYSBKUEVHIG1hcmtlciB0aGF0IGhhcyBiZWVuCisgICAqIHJlYWQgZnJvbSB0aGUgZGF0YSBzb3VyY2UsIGJ1dCBoYXMgbm90IHlldCBiZWVuIHByb2Nlc3NlZC4KKyAgICovCisgIGludCB1bnJlYWRfbWFya2VyOworCisgIC8qCisgICAqIExpbmtzIHRvIGRlY29tcHJlc3Npb24gc3Vib2JqZWN0cyAobWV0aG9kcywgcHJpdmF0ZSB2YXJpYWJsZXMgb2YgbW9kdWxlcykKKyAgICovCisgIHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgKiBtYXN0ZXI7CisgIHN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyICogbWFpbjsKKyAgc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgKiBjb2VmOworICBzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciAqIHBvc3Q7CisgIHN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgKiBpbnB1dGN0bDsKKyAgc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciAqIG1hcmtlcjsKKyAgc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICogZW50cm9weTsKKyAgc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgKiBpZGN0OworICBzdHJ1Y3QganBlZ191cHNhbXBsZXIgKiB1cHNhbXBsZTsKKyAgc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgKiBjY29udmVydDsKKyAgc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICogY3F1YW50aXplOworfTsKKworCisvKiAiT2JqZWN0IiBkZWNsYXJhdGlvbnMgZm9yIEpQRUcgbW9kdWxlcyB0aGF0IG1heSBiZSBzdXBwbGllZCBvciBjYWxsZWQKKyAqIGRpcmVjdGx5IGJ5IHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KKyAqIEFzIHdpdGggYWxsIG9iamVjdHMgaW4gdGhlIEpQRUcgbGlicmFyeSwgdGhlc2Ugc3RydWN0cyBvbmx5IGRlZmluZSB0aGUKKyAqIHB1YmxpY2x5IHZpc2libGUgbWV0aG9kcyBhbmQgc3RhdGUgdmFyaWFibGVzIG9mIGEgbW9kdWxlLiAgQWRkaXRpb25hbAorICogcHJpdmF0ZSBmaWVsZHMgbWF5IGV4aXN0IGFmdGVyIHRoZSBwdWJsaWMgb25lcy4KKyAqLworCisKKy8qIEVycm9yIGhhbmRsZXIgb2JqZWN0ICovCisKK3N0cnVjdCBqcGVnX2Vycm9yX21nciB7CisgIC8qIEVycm9yIGV4aXQgaGFuZGxlcjogZG9lcyBub3QgcmV0dXJuIHRvIGNhbGxlciAqLworICBKTUVUSE9EKHZvaWQsIGVycm9yX2V4aXQsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKyAgLyogQ29uZGl0aW9uYWxseSBlbWl0IGEgdHJhY2Ugb3Igd2FybmluZyBtZXNzYWdlICovCisgIEpNRVRIT0Qodm9pZCwgZW1pdF9tZXNzYWdlLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgbXNnX2xldmVsKSk7CisgIC8qIFJvdXRpbmUgdGhhdCBhY3R1YWxseSBvdXRwdXRzIGEgdHJhY2Ugb3IgZXJyb3IgbWVzc2FnZSAqLworICBKTUVUSE9EKHZvaWQsIG91dHB1dF9tZXNzYWdlLCAoal9jb21tb25fcHRyIGNpbmZvKSk7CisgIC8qIEZvcm1hdCBhIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGUgbW9zdCByZWNlbnQgSlBFRyBlcnJvciBvciBtZXNzYWdlICovCisgIEpNRVRIT0Qodm9pZCwgZm9ybWF0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIgKiBidWZmZXIpKTsKKyNkZWZpbmUgSk1TR19MRU5HVEhfTUFYICAyMDAJLyogcmVjb21tZW5kZWQgc2l6ZSBvZiBmb3JtYXRfbWVzc2FnZSBidWZmZXIgKi8KKyAgLyogUmVzZXQgZXJyb3Igc3RhdGUgdmFyaWFibGVzIGF0IHN0YXJ0IG9mIGEgbmV3IGltYWdlICovCisgIEpNRVRIT0Qodm9pZCwgcmVzZXRfZXJyb3JfbWdyLCAoal9jb21tb25fcHRyIGNpbmZvKSk7CisgIAorICAvKiBUaGUgbWVzc2FnZSBJRCBjb2RlIGFuZCBhbnkgcGFyYW1ldGVycyBhcmUgc2F2ZWQgaGVyZS4KKyAgICogQSBtZXNzYWdlIGNhbiBoYXZlIG9uZSBzdHJpbmcgcGFyYW1ldGVyIG9yIHVwIHRvIDggaW50IHBhcmFtZXRlcnMuCisgICAqLworICBpbnQgbXNnX2NvZGU7CisjZGVmaW5lIEpNU0dfU1RSX1BBUk1fTUFYICA4MAorICB1bmlvbiB7CisgICAgaW50IGlbOF07CisgICAgY2hhciBzW0pNU0dfU1RSX1BBUk1fTUFYXTsKKyAgfSBtc2dfcGFybTsKKyAgCisgIC8qIFN0YW5kYXJkIHN0YXRlIHZhcmlhYmxlcyBmb3IgZXJyb3IgZmFjaWxpdHkgKi8KKyAgCisgIGludCB0cmFjZV9sZXZlbDsJCS8qIG1heCBtc2dfbGV2ZWwgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCAqLworICAKKyAgLyogRm9yIHJlY292ZXJhYmxlIGNvcnJ1cHQtZGF0YSBlcnJvcnMsIHdlIGVtaXQgYSB3YXJuaW5nIG1lc3NhZ2UsCisgICAqIGJ1dCBrZWVwIGdvaW5nIHVubGVzcyBlbWl0X21lc3NhZ2UgY2hvb3NlcyB0byBhYm9ydC4gIGVtaXRfbWVzc2FnZQorICAgKiBzaG91bGQgY291bnQgd2FybmluZ3MgaW4gbnVtX3dhcm5pbmdzLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uCisgICAqIGNhbiBjaGVjayBmb3IgYmFkIGRhdGEgYnkgc2VlaW5nIGlmIG51bV93YXJuaW5ncyBpcyBub256ZXJvIGF0IHRoZQorICAgKiBlbmQgb2YgcHJvY2Vzc2luZy4KKyAgICovCisgIGxvbmcgbnVtX3dhcm5pbmdzOwkJLyogbnVtYmVyIG9mIGNvcnJ1cHQtZGF0YSB3YXJuaW5ncyAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBwb2ludCB0byB0aGUgdGFibGUocykgb2YgZXJyb3IgbWVzc2FnZSBzdHJpbmdzLgorICAgKiBBbiBhcHBsaWNhdGlvbiBjYW4gY2hhbmdlIHRoZSB0YWJsZSBwb2ludGVyIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudAorICAgKiBtZXNzYWdlIGxpc3QgKHR5cGljYWxseSwgdG8gY2hhbmdlIHRoZSBsYW5ndWFnZSBpbiB3aGljaCBlcnJvcnMgYXJlCisgICAqIHJlcG9ydGVkKS4gIFNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIGFkZCBhZGRpdGlvbmFsIGVycm9yIGNvZGVzCisgICAqIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBKUEVHIGxpYnJhcnkgZXJyb3IgbWVjaGFuaXNtOyB0aGUgc2Vjb25kCisgICAqIHRhYmxlIHBvaW50ZXIgaXMgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLgorICAgKgorICAgKiBGaXJzdCB0YWJsZSBpbmNsdWRlcyBhbGwgZXJyb3JzIGdlbmVyYXRlZCBieSBKUEVHIGxpYnJhcnkgaXRzZWxmLgorICAgKiBFcnJvciBjb2RlIDAgaXMgcmVzZXJ2ZWQgZm9yIGEgIm5vIHN1Y2ggZXJyb3Igc3RyaW5nIiBtZXNzYWdlLgorICAgKi8KKyAgY29uc3QgY2hhciAqIGNvbnN0ICoganBlZ19tZXNzYWdlX3RhYmxlOyAvKiBMaWJyYXJ5IGVycm9ycyAqLworICBpbnQgbGFzdF9qcGVnX21lc3NhZ2U7ICAgIC8qIFRhYmxlIGNvbnRhaW5zIHN0cmluZ3MgMC4ubGFzdF9qcGVnX21lc3NhZ2UgKi8KKyAgLyogU2Vjb25kIHRhYmxlIGNhbiBiZSBhZGRlZCBieSBhcHBsaWNhdGlvbiAoc2VlIGNqcGVnL2RqcGVnIGZvciBleGFtcGxlKS4KKyAgICogSXQgY29udGFpbnMgc3RyaW5ncyBudW1iZXJlZCBmaXJzdF9hZGRvbl9tZXNzYWdlLi5sYXN0X2FkZG9uX21lc3NhZ2UuCisgICAqLworICBjb25zdCBjaGFyICogY29uc3QgKiBhZGRvbl9tZXNzYWdlX3RhYmxlOyAvKiBOb24tbGlicmFyeSBlcnJvcnMgKi8KKyAgaW50IGZpcnN0X2FkZG9uX21lc3NhZ2U7CS8qIGNvZGUgZm9yIGZpcnN0IHN0cmluZyBpbiBhZGRvbiB0YWJsZSAqLworICBpbnQgbGFzdF9hZGRvbl9tZXNzYWdlOwkvKiBjb2RlIGZvciBsYXN0IHN0cmluZyBpbiBhZGRvbiB0YWJsZSAqLworfTsKKworCisvKiBQcm9ncmVzcyBtb25pdG9yIG9iamVjdCAqLworCitzdHJ1Y3QganBlZ19wcm9ncmVzc19tZ3IgeworICBKTUVUSE9EKHZvaWQsIHByb2dyZXNzX21vbml0b3IsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworICBsb25nIHBhc3NfY291bnRlcjsJCS8qIHdvcmsgdW5pdHMgY29tcGxldGVkIGluIHRoaXMgcGFzcyAqLworICBsb25nIHBhc3NfbGltaXQ7CQkvKiB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cyBpbiB0aGlzIHBhc3MgKi8KKyAgaW50IGNvbXBsZXRlZF9wYXNzZXM7CQkvKiBwYXNzZXMgY29tcGxldGVkIHNvIGZhciAqLworICBpbnQgdG90YWxfcGFzc2VzOwkJLyogdG90YWwgbnVtYmVyIG9mIHBhc3NlcyBleHBlY3RlZCAqLworfTsKKworCisvKiBEYXRhIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgY29tcHJlc3Npb24gKi8KKworc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHsKKyAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworCisgIEpNRVRIT0Qodm9pZCwgaW5pdF9kZXN0aW5hdGlvbiwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoYm9vbGVhbiwgZW1wdHlfb3V0cHV0X2J1ZmZlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgdGVybV9kZXN0aW5hdGlvbiwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Cit9OworCisKKy8qIERhdGEgc291cmNlIG9iamVjdCBmb3IgZGVjb21wcmVzc2lvbiAqLworCitzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHsKKyAgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlOyAvKiA9PiBuZXh0IGJ5dGUgdG8gcmVhZCBmcm9tIGJ1ZmZlciAqLworICBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KKworICBKTUVUSE9EKHZvaWQsIGluaXRfc291cmNlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGJvb2xlYW4sIGZpbGxfaW5wdXRfYnVmZmVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHNraXBfaW5wdXRfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcgbnVtX2J5dGVzKSk7CisgIEpNRVRIT0QoYm9vbGVhbiwgcmVzeW5jX3RvX3Jlc3RhcnQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkpOworICBKTUVUSE9EKHZvaWQsIHRlcm1fc291cmNlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworfTsKKworCisvKiBNZW1vcnkgbWFuYWdlciBvYmplY3QuCisgKiBBbGxvY2F0ZXMgInNtYWxsIiBvYmplY3RzIChhIGZldyBLIHRvdGFsKSwgImxhcmdlIiBvYmplY3RzICh0ZW5zIG9mIEspLAorICogYW5kICJyZWFsbHkgYmlnIiBvYmplY3RzICh2aXJ0dWFsIGFycmF5cyB3aXRoIGJhY2tpbmcgc3RvcmUgaWYgbmVlZGVkKS4KKyAqIFRoZSBtZW1vcnkgbWFuYWdlciBkb2VzIG5vdCBhbGxvdyBpbmRpdmlkdWFsIG9iamVjdHMgdG8gYmUgZnJlZWQ7IHJhdGhlciwKKyAqIGVhY2ggY3JlYXRlZCBvYmplY3QgaXMgYXNzaWduZWQgdG8gYSBwb29sLCBhbmQgd2hvbGUgcG9vbHMgY2FuIGJlIGZyZWVkCisgKiBhdCBvbmNlLiAgVGhpcyBpcyBmYXN0ZXIgYW5kIG1vcmUgY29udmVuaWVudCB0aGFuIHJlbWVtYmVyaW5nIGV4YWN0bHkgd2hhdAorICogdG8gZnJlZSwgZXNwZWNpYWxseSB3aGVyZSBtYWxsb2MoKS9mcmVlKCkgYXJlIG5vdCB0b28gc3BlZWR5LgorICogTkI6IGFsbG9jIHJvdXRpbmVzIG5ldmVyIHJldHVybiBOVUxMLiAgVGhleSBleGl0IHRvIGVycm9yX2V4aXQgaWYgbm90CisgKiBzdWNjZXNzZnVsLgorICovCisKKyNkZWZpbmUgSlBPT0xfUEVSTUFORU5UCTAJLyogbGFzdHMgdW50aWwgbWFzdGVyIHJlY29yZCBpcyBkZXN0cm95ZWQgKi8KKyNkZWZpbmUgSlBPT0xfSU1BR0UJMQkvKiBsYXN0cyB1bnRpbCBkb25lIHdpdGggaW1hZ2UvZGF0YXN0cmVhbSAqLworI2RlZmluZSBKUE9PTF9OVU1QT09MUwkyCisKK3R5cGVkZWYgc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sICoganZpcnRfc2FycmF5X3B0cjsKK3R5cGVkZWYgc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sICoganZpcnRfYmFycmF5X3B0cjsKKworCitzdHJ1Y3QganBlZ19tZW1vcnlfbWdyIHsKKyAgLyogTWV0aG9kIHBvaW50ZXJzICovCisgIEpNRVRIT0Qodm9pZCAqLCBhbGxvY19zbWFsbCwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCisJCQkJc2l6ZV90IHNpemVvZm9iamVjdCkpOworICBKTUVUSE9EKHZvaWQgRkFSICosIGFsbG9jX2xhcmdlLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKKwkJCQkgICAgIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKKyAgSk1FVEhPRChKU0FNUEFSUkFZLCBhbGxvY19zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCQkJCSAgICAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LAorCQkJCSAgICAgSkRJTUVOU0lPTiBudW1yb3dzKSk7CisgIEpNRVRIT0QoSkJMT0NLQVJSQVksIGFsbG9jX2JhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCisJCQkJICAgICAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3csCisJCQkJICAgICAgSkRJTUVOU0lPTiBudW1yb3dzKSk7CisgIEpNRVRIT0QoanZpcnRfc2FycmF5X3B0ciwgcmVxdWVzdF92aXJ0X3NhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkJCSAgaW50IHBvb2xfaWQsCisJCQkJCQkgIGJvb2xlYW4gcHJlX3plcm8sCisJCQkJCQkgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywKKwkJCQkJCSAgSkRJTUVOU0lPTiBudW1yb3dzLAorCQkJCQkJICBKRElNRU5TSU9OIG1heGFjY2VzcykpOworICBKTUVUSE9EKGp2aXJ0X2JhcnJheV9wdHIsIHJlcXVlc3RfdmlydF9iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCisJCQkJCQkgIGludCBwb29sX2lkLAorCQkJCQkJICBib29sZWFuIHByZV96ZXJvLAorCQkJCQkJICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywKKwkJCQkJCSAgSkRJTUVOU0lPTiBudW1yb3dzLAorCQkJCQkJICBKRElNRU5TSU9OIG1heGFjY2VzcykpOworICBKTUVUSE9EKHZvaWQsIHJlYWxpemVfdmlydF9hcnJheXMsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKyAgSk1FVEhPRChKU0FNUEFSUkFZLCBhY2Nlc3NfdmlydF9zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCisJCQkJCSAgIGp2aXJ0X3NhcnJheV9wdHIgcHRyLAorCQkJCQkgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywKKwkJCQkJICAgSkRJTUVOU0lPTiBudW1fcm93cywKKwkJCQkJICAgYm9vbGVhbiB3cml0YWJsZSkpOworICBKTUVUSE9EKEpCTE9DS0FSUkFZLCBhY2Nlc3NfdmlydF9iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCisJCQkJCSAgICBqdmlydF9iYXJyYXlfcHRyIHB0ciwKKwkJCQkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LAorCQkJCQkgICAgSkRJTUVOU0lPTiBudW1fcm93cywKKwkJCQkJICAgIGJvb2xlYW4gd3JpdGFibGUpKTsKKyAgSk1FVEhPRCh2b2lkLCBmcmVlX3Bvb2wsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkKSk7CisgIEpNRVRIT0Qodm9pZCwgc2VsZl9kZXN0cnVjdCwgKGpfY29tbW9uX3B0ciBjaW5mbykpOworCisgIC8qIExpbWl0IG9uIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGlzIEpQRUcgb2JqZWN0LiAgKE5vdGUgdGhhdCB0aGlzIGlzCisgICAqIG1lcmVseSBhZHZpc29yeSwgbm90IGEgZ3VhcmFudGVlZCBtYXhpbXVtOyBpdCBvbmx5IGFmZmVjdHMgdGhlIHNwYWNlCisgICAqIHVzZWQgZm9yIHZpcnR1YWwtYXJyYXkgYnVmZmVycy4pICBNYXkgYmUgY2hhbmdlZCBieSBvdXRlciBhcHBsaWNhdGlvbgorICAgKiBhZnRlciBjcmVhdGluZyB0aGUgSlBFRyBvYmplY3QuCisgICAqLworICBsb25nIG1heF9tZW1vcnlfdG9fdXNlOworCisgIC8qIE1heGltdW0gYWxsb2NhdGlvbiByZXF1ZXN0IGFjY2VwdGVkIGJ5IGFsbG9jX2xhcmdlLiAqLworICBsb25nIG1heF9hbGxvY19jaHVuazsKK307CisKKworLyogUm91dGluZSBzaWduYXR1cmUgZm9yIGFwcGxpY2F0aW9uLXN1cHBsaWVkIG1hcmtlciBwcm9jZXNzaW5nIG1ldGhvZHMuCisgKiBOZWVkIG5vdCBwYXNzIG1hcmtlciBjb2RlIHNpbmNlIGl0IGlzIHN0b3JlZCBpbiBjaW5mby0+dW5yZWFkX21hcmtlci4KKyAqLwordHlwZWRlZiBKTUVUSE9EKGJvb2xlYW4sIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKworLyogRGVjbGFyYXRpb25zIGZvciByb3V0aW5lcyBjYWxsZWQgYnkgYXBwbGljYXRpb24uCisgKiBUaGUgSlBQIG1hY3JvIGhpZGVzIHByb3RvdHlwZSBwYXJhbWV0ZXJzIGZyb20gY29tcGlsZXJzIHRoYXQgY2FuJ3QgY29wZS4KKyAqIE5vdGUgSlBQIHJlcXVpcmVzIGRvdWJsZSBwYXJlbnRoZXNlcy4KKyAqLworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEpQUChhcmdsaXN0KQlhcmdsaXN0CisjZWxzZQorI2RlZmluZSBKUFAoYXJnbGlzdCkJKCkKKyNlbmRpZgorCisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLgorICogV2Ugc2hvcnRlbiBleHRlcm5hbCBuYW1lcyB0byBiZSB1bmlxdWUgaW4gdGhlIGZpcnN0IHNpeCBsZXR0ZXJzLCB3aGljaAorICogaXMgZ29vZCBlbm91Z2ggZm9yIGFsbCBrbm93biBzeXN0ZW1zLgorICogKElmIHlvdXIgY29tcGlsZXIgaXRzZWxmIG5lZWRzIG5hbWVzIHRvIGJlIHVuaXF1ZSBpbiBsZXNzIHRoYW4gMTUgCisgKiBjaGFyYWN0ZXJzLCB5b3UgYXJlIG91dCBvZiBsdWNrLiAgR2V0IGEgYmV0dGVyIGNvbXBpbGVyLikKKyAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqcGVnX3N0ZF9lcnJvcgkJalN0ZEVycm9yCisjZGVmaW5lIGpwZWdfQ3JlYXRlQ29tcHJlc3MJakNyZWFDb21wcmVzcworI2RlZmluZSBqcGVnX0NyZWF0ZURlY29tcHJlc3MJakNyZWFEZWNvbXByZXNzCisjZGVmaW5lIGpwZWdfZGVzdHJveV9jb21wcmVzcwlqRGVzdENvbXByZXNzCisjZGVmaW5lIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzCWpEZXN0RGVjb21wcmVzcworI2RlZmluZSBqcGVnX3N0ZGlvX2Rlc3QJCWpTdGREZXN0CisjZGVmaW5lIGpwZWdfc3RkaW9fc3JjCQlqU3RkU3JjCisjZGVmaW5lIGpwZWdfc2V0X2RlZmF1bHRzCWpTZXREZWZhdWx0cworI2RlZmluZSBqcGVnX3NldF9jb2xvcnNwYWNlCWpTZXRDb2xvcnNwYWNlCisjZGVmaW5lIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlCWpEZWZDb2xvcnNwYWNlCisjZGVmaW5lIGpwZWdfc2V0X3F1YWxpdHkJalNldFF1YWxpdHkKKyNkZWZpbmUganBlZ19zZXRfbGluZWFyX3F1YWxpdHkJalNldExRdWFsaXR5CisjZGVmaW5lIGpwZWdfYWRkX3F1YW50X3RhYmxlCWpBZGRRdWFudFRhYmxlCisjZGVmaW5lIGpwZWdfcXVhbGl0eV9zY2FsaW5nCWpRdWFsaXR5U2NhbGluZworI2RlZmluZSBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbglqU2ltUHJvZ3Jlc3MKKyNkZWZpbmUganBlZ19zdXBwcmVzc190YWJsZXMJalN1cHByZXNzVGFibGVzCisjZGVmaW5lIGpwZWdfYWxsb2NfcXVhbnRfdGFibGUJakFsY1FUYWJsZQorI2RlZmluZSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUJakFsY0hUYWJsZQorI2RlZmluZSBqcGVnX3N0YXJ0X2NvbXByZXNzCWpTdHJ0Q29tcHJlc3MKKyNkZWZpbmUganBlZ193cml0ZV9zY2FubGluZXMJaldydFNjYW5saW5lcworI2RlZmluZSBqcGVnX2ZpbmlzaF9jb21wcmVzcwlqRmluQ29tcHJlc3MKKyNkZWZpbmUganBlZ193cml0ZV9yYXdfZGF0YQlqV3J0UmF3RGF0YQorI2RlZmluZSBqcGVnX3dyaXRlX21hcmtlcglqV3J0TWFya2VyCisjZGVmaW5lIGpwZWdfd3JpdGVfbV9oZWFkZXIJaldydE1IZWFkZXIKKyNkZWZpbmUganBlZ193cml0ZV9tX2J5dGUJaldydE1CeXRlCisjZGVmaW5lIGpwZWdfd3JpdGVfdGFibGVzCWpXcnRUYWJsZXMKKyNkZWZpbmUganBlZ19yZWFkX2hlYWRlcglqUmVhZEhlYWRlcgorI2RlZmluZSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MJalN0cnREZWNvbXByZXNzCisjZGVmaW5lIGpwZWdfcmVhZF9zY2FubGluZXMJalJlYWRTY2FubGluZXMKKyNkZWZpbmUganBlZ19maW5pc2hfZGVjb21wcmVzcwlqRmluRGVjb21wcmVzcworI2RlZmluZSBqcGVnX3JlYWRfcmF3X2RhdGEJalJlYWRSYXdEYXRhCisjZGVmaW5lIGpwZWdfaGFzX211bHRpcGxlX3NjYW5zCWpIYXNNdWx0U2NuCisjZGVmaW5lIGpwZWdfc3RhcnRfb3V0cHV0CWpTdHJ0T3V0cHV0CisjZGVmaW5lIGpwZWdfZmluaXNoX291dHB1dAlqRmluT3V0cHV0CisjZGVmaW5lIGpwZWdfaW5wdXRfY29tcGxldGUJakluQ29tcGxldGUKKyNkZWZpbmUganBlZ19uZXdfY29sb3JtYXAJak5ld0NNYXAKKyNkZWZpbmUganBlZ19jb25zdW1lX2lucHV0CWpDb25zdW1lSW5wdXQKKyNkZWZpbmUganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zCWpDYWxjRGltZW5zaW9ucworI2RlZmluZSBqcGVnX3NhdmVfbWFya2VycwlqU2F2ZU1hcmtlcnMKKyNkZWZpbmUganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcglqU2V0TWFya2VyCisjZGVmaW5lIGpwZWdfcmVhZF9jb2VmZmljaWVudHMJalJlYWRDb2VmcworI2RlZmluZSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cwlqV3J0Q29lZnMKKyNkZWZpbmUganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMJakNvcHlDcml0CisjZGVmaW5lIGpwZWdfYWJvcnRfY29tcHJlc3MJakFicnRDb21wcmVzcworI2RlZmluZSBqcGVnX2Fib3J0X2RlY29tcHJlc3MJakFicnREZWNvbXByZXNzCisjZGVmaW5lIGpwZWdfYWJvcnQJCWpBYm9ydAorI2RlZmluZSBqcGVnX2Rlc3Ryb3kJCWpEZXN0cm95CisjZGVmaW5lIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQJalJlc3luY1Jlc3RhcnQKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKworLyogRGVmYXVsdCBlcnJvci1tYW5hZ2VtZW50IHNldHVwICovCitFWFRFUk4oc3RydWN0IGpwZWdfZXJyb3JfbWdyICopIGpwZWdfc3RkX2Vycm9yCisJSlBQKChzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIpKTsKKworLyogSW5pdGlhbGl6YXRpb24gb2YgSlBFRyBjb21wcmVzc2lvbiBvYmplY3RzLgorICoganBlZ19jcmVhdGVfY29tcHJlc3MoKSBhbmQganBlZ19jcmVhdGVfZGVjb21wcmVzcygpIGFyZSB0aGUgZXhwb3J0ZWQKKyAqIG5hbWVzIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCBjYWxsLiAgVGhlc2UgZXhwYW5kIHRvIGNhbGxzIG9uCisgKiBqcGVnX0NyZWF0ZUNvbXByZXNzIGFuZCBqcGVnX0NyZWF0ZURlY29tcHJlc3Mgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiBwYXNzZWQgZm9yIHZlcnNpb24gbWlzbWF0Y2ggY2hlY2tpbmcuCisgKiBOQjogeW91IG11c3Qgc2V0IHVwIHRoZSBlcnJvci1tYW5hZ2VyIEJFRk9SRSBjYWxsaW5nIGpwZWdfY3JlYXRlX3h4eC4KKyAqLworI2RlZmluZSBqcGVnX2NyZWF0ZV9jb21wcmVzcyhjaW5mbykgXAorICAgIGpwZWdfQ3JlYXRlQ29tcHJlc3MoKGNpbmZvKSwgSlBFR19MSUJfVkVSU0lPTiwgXAorCQkJKHNpemVfdCkgc2l6ZW9mKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCkpCisjZGVmaW5lIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoY2luZm8pIFwKKyAgICBqcGVnX0NyZWF0ZURlY29tcHJlc3MoKGNpbmZvKSwgSlBFR19MSUJfVkVSU0lPTiwgXAorCQkJICAoc2l6ZV90KSBzaXplb2Yoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QpKQorRVhURVJOKHZvaWQpIGpwZWdfQ3JlYXRlQ29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICBpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpKTsKK0VYVEVSTih2b2lkKSBqcGVnX0NyZWF0ZURlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQlpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpKTsKKy8qIERlc3RydWN0aW9uIG9mIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0cyAqLworRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveV9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19kZXN0cm95X2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIFN0YW5kYXJkIGRhdGEgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtYW5hZ2Vyczogc3RkaW8gc3RyZWFtcy4gKi8KKy8qIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3Igb3BlbmluZyB0aGUgZmlsZSBiZWZvcmUgYW5kIGNsb3NpbmcgYWZ0ZXIuICovCitFWFRFUk4odm9pZCkganBlZ19zdGRpb19kZXN0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBvdXRmaWxlKSk7CitFWFRFUk4odm9pZCkganBlZ19zdGRpb19zcmMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKSk7CisKKy8qIERlZmF1bHQgcGFyYW1ldGVyIHNldHVwIGZvciBjb21wcmVzc2lvbiAqLworRVhURVJOKHZvaWQpIGpwZWdfc2V0X2RlZmF1bHRzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKy8qIENvbXByZXNzaW9uIHBhcmFtZXRlciBzZXR1cCBhaWRzICovCitFWFRFUk4odm9pZCkganBlZ19zZXRfY29sb3JzcGFjZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgIEpfQ09MT1JfU1BBQ0UgY29sb3JzcGFjZSkpOworRVhURVJOKHZvaWQpIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX3NldF9xdWFsaXR5IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LAorCQkJCSAgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKK0VYVEVSTih2b2lkKSBqcGVnX3NldF9saW5lYXJfcXVhbGl0eSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGludCBzY2FsZV9mYWN0b3IsCisJCQkJCSAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOworRVhURVJOKHZvaWQpIGpwZWdfYWRkX3F1YW50X3RhYmxlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCisJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCisJCQkJICAgICAgIGludCBzY2FsZV9mYWN0b3IsCisJCQkJICAgICAgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKK0VYVEVSTihpbnQpIGpwZWdfcXVhbGl0eV9zY2FsaW5nIEpQUCgoaW50IHF1YWxpdHkpKTsKK0VYVEVSTih2b2lkKSBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19zdXBwcmVzc190YWJsZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICAgYm9vbGVhbiBzdXBwcmVzcykpOworRVhURVJOKEpRVUFOVF9UQkwgKikganBlZ19hbGxvY19xdWFudF90YWJsZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworRVhURVJOKEpIVUZGX1RCTCAqKSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworLyogTWFpbiBlbnRyeSBwb2ludHMgZm9yIGNvbXByZXNzaW9uICovCitFWFRFUk4odm9pZCkganBlZ19zdGFydF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgIGJvb2xlYW4gd3JpdGVfYWxsX3RhYmxlcykpOworRVhURVJOKEpESU1FTlNJT04pIGpwZWdfd3JpdGVfc2NhbmxpbmVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICAgSlNBTVBBUlJBWSBzY2FubGluZXMsCisJCQkJCSAgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZpbmlzaF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIFJlcGxhY2VzIGpwZWdfd3JpdGVfc2NhbmxpbmVzIHdoZW4gd3JpdGluZyByYXcgZG93bnNhbXBsZWQgZGF0YS4gKi8KK0VYVEVSTihKRElNRU5TSU9OKSBqcGVnX3dyaXRlX3Jhd19kYXRhIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICBKU0FNUElNQUdFIGRhdGEsCisJCQkJCSAgICBKRElNRU5TSU9OIG51bV9saW5lcykpOworCisvKiBXcml0ZSBhIHNwZWNpYWwgbWFya2VyLiAgU2VlIGxpYmpwZWcuZG9jIGNvbmNlcm5pbmcgc2FmZSB1c2FnZS4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21hcmtlcgorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCisJICAgICBjb25zdCBKT0NURVQgKiBkYXRhcHRyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikpOworLyogU2FtZSwgYnV0IHBpZWNlbWVhbC4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21faGVhZGVyCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pKTsKK0VYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21fYnl0ZQorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpKTsKKworLyogQWx0ZXJuYXRlIGNvbXByZXNzaW9uIGZ1bmN0aW9uOiBqdXN0IHdyaXRlIGFuIGFiYnJldmlhdGVkIHRhYmxlIGZpbGUgKi8KK0VYVEVSTih2b2lkKSBqcGVnX3dyaXRlX3RhYmxlcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIERlY29tcHJlc3Npb24gc3RhcnR1cDogcmVhZCBzdGFydCBvZiBKUEVHIGRhdGFzdHJlYW0gdG8gc2VlIHdoYXQncyB0aGVyZSAqLworRVhURVJOKGludCkganBlZ19yZWFkX2hlYWRlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJICBib29sZWFuIHJlcXVpcmVfaW1hZ2UpKTsKKy8qIFJldHVybiB2YWx1ZSBpcyBvbmUgb2Y6ICovCisjZGVmaW5lIEpQRUdfU1VTUEVOREVECQkwIC8qIFN1c3BlbmRlZCBkdWUgdG8gbGFjayBvZiBpbnB1dCBkYXRhICovCisjZGVmaW5lIEpQRUdfSEVBREVSX09LCQkxIC8qIEZvdW5kIHZhbGlkIGltYWdlIGRhdGFzdHJlYW0gKi8KKyNkZWZpbmUgSlBFR19IRUFERVJfVEFCTEVTX09OTFkJMiAvKiBGb3VuZCB2YWxpZCB0YWJsZS1zcGVjcy1vbmx5IGRhdGFzdHJlYW0gKi8KKy8qIElmIHlvdSBwYXNzIHJlcXVpcmVfaW1hZ2UgPSBUUlVFIChub3JtYWwgY2FzZSksIHlvdSBuZWVkIG5vdCBjaGVjayBmb3IKKyAqIGEgVEFCTEVTX09OTFkgcmV0dXJuIGNvZGU7IGFuIGFiYnJldmlhdGVkIGZpbGUgd2lsbCBjYXVzZSBhbiBlcnJvciBleGl0LgorICogSlBFR19TVVNQRU5ERUQgaXMgb25seSBwb3NzaWJsZSBpZiB5b3UgdXNlIGEgZGF0YSBzb3VyY2UgbW9kdWxlIHRoYXQgY2FuCisgKiBnaXZlIGEgc3VzcGVuc2lvbiByZXR1cm4gKHRoZSBzdGRpbyBzb3VyY2UgbW9kdWxlIGRvZXNuJ3QpLgorICovCisKKy8qIE1haW4gZW50cnkgcG9pbnRzIGZvciBkZWNvbXByZXNzaW9uICovCitFWFRFUk4oYm9vbGVhbikganBlZ19zdGFydF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKEpESU1FTlNJT04pIGpwZWdfcmVhZF9zY2FubGluZXMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSlNBTVBBUlJBWSBzY2FubGluZXMsCisJCQkJCSAgICBKRElNRU5TSU9OIG1heF9saW5lcykpOworRVhURVJOKGJvb2xlYW4pIGpwZWdfZmluaXNoX2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIFJlcGxhY2VzIGpwZWdfcmVhZF9zY2FubGluZXMgd2hlbiByZWFkaW5nIHJhdyBkb3duc2FtcGxlZCBkYXRhLiAqLworRVhURVJOKEpESU1FTlNJT04pIGpwZWdfcmVhZF9yYXdfZGF0YSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgIEpTQU1QSU1BR0UgZGF0YSwKKwkJCQkJICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpKTsKKworLyogQWRkaXRpb25hbCBlbnRyeSBwb2ludHMgZm9yIGJ1ZmZlcmVkLWltYWdlIG1vZGUuICovCitFWFRFUk4oYm9vbGVhbikganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oYm9vbGVhbikganBlZ19zdGFydF9vdXRwdXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgICBpbnQgc2Nhbl9udW1iZXIpKTsKK0VYVEVSTihib29sZWFuKSBqcGVnX2ZpbmlzaF9vdXRwdXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oYm9vbGVhbikganBlZ19pbnB1dF9jb21wbGV0ZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX25ld19jb2xvcm1hcCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihpbnQpIGpwZWdfY29uc3VtZV9pbnB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKy8qIFJldHVybiB2YWx1ZSBpcyBvbmUgb2Y6ICovCisvKiAjZGVmaW5lIEpQRUdfU1VTUEVOREVECTAgICAgU3VzcGVuZGVkIGR1ZSB0byBsYWNrIG9mIGlucHV0IGRhdGEgKi8KKyNkZWZpbmUgSlBFR19SRUFDSEVEX1NPUwkxIC8qIFJlYWNoZWQgc3RhcnQgb2YgbmV3IHNjYW4gKi8KKyNkZWZpbmUgSlBFR19SRUFDSEVEX0VPSQkyIC8qIFJlYWNoZWQgZW5kIG9mIGltYWdlICovCisjZGVmaW5lIEpQRUdfUk9XX0NPTVBMRVRFRAkzIC8qIENvbXBsZXRlZCBvbmUgaU1DVSByb3cgKi8KKyNkZWZpbmUgSlBFR19TQ0FOX0NPTVBMRVRFRAk0IC8qIENvbXBsZXRlZCBsYXN0IGlNQ1Ugcm93IG9mIGEgc2NhbiAqLworCisvKiBQcmVjYWxjdWxhdGUgb3V0cHV0IGRpbWVuc2lvbnMgZm9yIGN1cnJlbnQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAqLworRVhURVJOKHZvaWQpIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogQ29udHJvbCBzYXZpbmcgb2YgQ09NIGFuZCBBUFBuIG1hcmtlcnMgaW50byBtYXJrZXJfbGlzdC4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3NhdmVfbWFya2VycworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAorCSAgICAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdCkpOworCisvKiBJbnN0YWxsIGEgc3BlY2lhbCBwcm9jZXNzaW5nIG1ldGhvZCBmb3IgQ09NIG9yIEFQUG4gbWFya2Vycy4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCisJICAgICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHJvdXRpbmUpKTsKKworLyogUmVhZCBvciB3cml0ZSByYXcgRENUIGNvZWZmaWNpZW50cyAtLS0gdXNlZnVsIGZvciBsb3NzbGVzcyB0cmFuc2NvZGluZy4gKi8KK0VYVEVSTihqdmlydF9iYXJyYXlfcHRyICopIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ193cml0ZV9jb2VmZmljaWVudHMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycyBKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKKwkJCQkJCWpfY29tcHJlc3NfcHRyIGRzdGluZm8pKTsKKworLyogSWYgeW91IGNob29zZSB0byBhYm9ydCBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGJlZm9yZSBjb21wbGV0aW5nCisgKiBqcGVnX2ZpbmlzaF8oZGUpY29tcHJlc3MsIHRoZW4geW91IG5lZWQgdG8gY2xlYW4gdXAgdG8gcmVsZWFzZSBtZW1vcnksCisgKiB0ZW1wb3JhcnkgZmlsZXMsIGV0Yy4gIFlvdSBjYW4ganVzdCBjYWxsIGpwZWdfZGVzdHJveV8oZGUpY29tcHJlc3MKKyAqIGlmIHlvdSdyZSBkb25lIHdpdGggdGhlIEpQRUcgb2JqZWN0LCBidXQgaWYgeW91IHdhbnQgdG8gY2xlYW4gaXQgdXAgYW5kCisgKiByZXVzZSBpdCwgY2FsbCB0aGlzOgorICovCitFWFRFUk4odm9pZCkganBlZ19hYm9ydF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19hYm9ydF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisvKiBHZW5lcmljIHZlcnNpb25zIG9mIGpwZWdfYWJvcnQgYW5kIGpwZWdfZGVzdHJveSB0aGF0IHdvcmsgb24gZWl0aGVyCisgKiBmbGF2b3Igb2YgSlBFRyBvYmplY3QuICBUaGVzZSBtYXkgYmUgbW9yZSBjb252ZW5pZW50IGluIHNvbWUgcGxhY2VzLgorICovCitFWFRFUk4odm9pZCkganBlZ19hYm9ydCBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworCisvKiBEZWZhdWx0IHJlc3RhcnQtbWFya2VyLXJlc3luYyBwcm9jZWR1cmUgZm9yIHVzZSBieSBkYXRhIHNvdXJjZSBtb2R1bGVzICovCitFWFRFUk4oYm9vbGVhbikganBlZ19yZXN5bmNfdG9fcmVzdGFydCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICBpbnQgZGVzaXJlZCkpOworCisKKy8qIFRoZXNlIG1hcmtlciBjb2RlcyBhcmUgZXhwb3J0ZWQgc2luY2UgYXBwbGljYXRpb25zIGFuZCBkYXRhIHNvdXJjZSBtb2R1bGVzCisgKiBhcmUgbGlrZWx5IHRvIHdhbnQgdG8gdXNlIHRoZW0uCisgKi8KKworI2RlZmluZSBKUEVHX1JTVDAJMHhEMAkvKiBSU1QwIG1hcmtlciBjb2RlICovCisjZGVmaW5lIEpQRUdfRU9JCTB4RDkJLyogRU9JIG1hcmtlciBjb2RlICovCisjZGVmaW5lIEpQRUdfQVBQMAkweEUwCS8qIEFQUDAgbWFya2VyIGNvZGUgKi8KKyNkZWZpbmUgSlBFR19DT00JMHhGRQkvKiBDT00gbWFya2VyIGNvZGUgKi8KKworCisvKiBJZiB3ZSBoYXZlIGEgYnJhaW4tZGFtYWdlZCBjb21waWxlciB0aGF0IGVtaXRzIHdhcm5pbmdzIChvciB3b3JzZSwgZXJyb3JzKQorICogZm9yIHN0cnVjdHVyZSBkZWZpbml0aW9ucyB0aGF0IGFyZSBuZXZlciBmaWxsZWQgaW4sIGtlZXAgaXQgcXVpZXQgYnkKKyAqIHN1cHBseWluZyBkdW1teSBkZWZpbml0aW9ucyBmb3IgdGhlIHZhcmlvdXMgc3Vic3RydWN0dXJlcy4KKyAqLworCisjaWZkZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKyNpZm5kZWYgSlBFR19JTlRFUk5BTFMJCS8qIHdpbGwgYmUgZGVmaW5lZCBpbiBqcGVnaW50LmggKi8KK3N0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ191cHNhbXBsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyIHsgbG9uZyBkdW1teTsgfTsKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworI2VuZGlmIC8qIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOICovCisKKworLyoKKyAqIFRoZSBKUEVHIGxpYnJhcnkgbW9kdWxlcyBkZWZpbmUgSlBFR19JTlRFUk5BTFMgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUuCisgKiBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGRlY2xhcmF0aW9ucyBhcmUgcmVhZCBvbmx5IHdoZW4gdGhhdCBpcyB0cnVlLgorICogQXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgaW5jbHVkZSBqcGVnaW50LmgsIGJ1dCBtYXkgd2lzaAorICogdG8gaW5jbHVkZSBqZXJyb3IuaC4KKyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqcGVnaW50LmgiCQkvKiBmZXRjaCBwcml2YXRlIGRlY2xhcmF0aW9ucyAqLworI2luY2x1ZGUgImplcnJvci5oIgkJLyogZmV0Y2ggZXJyb3IgY29kZXMgdG9vICovCisjZW5kaWYKKworI2VuZGlmIC8qIEpQRUdMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvanF1YW50MS5jIGIvY29tbW9uL2pwZWcvanF1YW50MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjk2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qcXVhbnQxLmMKQEAgLTAsMCArMSw4NTYgQEAKKy8qCisgKiBqcXVhbnQxLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyAxLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIChjb2xvciBtYXBwaW5nKSByb3V0aW5lcy4KKyAqIFRoZXNlIHJvdXRpbmVzIHByb3ZpZGUgbWFwcGluZyB0byBhIGZpeGVkIGNvbG9yIG1hcCB1c2luZyBlcXVhbGx5IHNwYWNlZAorICogY29sb3IgdmFsdWVzLiAgT3B0aW9uYWwgRmxveWQtU3RlaW5iZXJnIG9yIG9yZGVyZWQgZGl0aGVyaW5nIGlzIGF2YWlsYWJsZS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKyNpZmRlZiBRVUFOVF8xUEFTU19TVVBQT1JURUQKKworCisvKgorICogVGhlIG1haW4gcHVycG9zZSBvZiAxLXBhc3MgcXVhbnRpemF0aW9uIGlzIHRvIHByb3ZpZGUgYSBmYXN0LCBpZiBub3QgdmVyeQorICogaGlnaCBxdWFsaXR5LCBjb2xvcm1hcHBlZCBvdXRwdXQgY2FwYWJpbGl0eS4gIEEgMi1wYXNzIHF1YW50aXplciB1c3VhbGx5CisgKiBnaXZlcyBiZXR0ZXIgdmlzdWFsIHF1YWxpdHk7IGhvd2V2ZXIsIGZvciBxdWFudGl6ZWQgZ3JheXNjYWxlIG91dHB1dCB0aGlzCisgKiBxdWFudGl6ZXIgaXMgcGVyZmVjdGx5IGFkZXF1YXRlLiAgRGl0aGVyaW5nIGlzIGhpZ2hseSByZWNvbW1lbmRlZCB3aXRoIHRoaXMKKyAqIHF1YW50aXplciwgdGhvdWdoIHlvdSBjYW4gdHVybiBpdCBvZmYgaWYgeW91IHJlYWxseSB3YW50IHRvLgorICoKKyAqIEluIDEtcGFzcyBxdWFudGl6YXRpb24gdGhlIGNvbG9ybWFwIG11c3QgYmUgY2hvc2VuIGluIGFkdmFuY2Ugb2Ygc2VlaW5nIHRoZQorICogaW1hZ2UuICBXZSB1c2UgYSBtYXAgY29uc2lzdGluZyBvZiBhbGwgY29tYmluYXRpb25zIG9mIE5jb2xvcnNbaV0gY29sb3IKKyAqIHZhbHVlcyBmb3IgdGhlIGkndGggY29tcG9uZW50LiAgVGhlIE5jb2xvcnNbXSB2YWx1ZXMgYXJlIGNob3NlbiBzbyB0aGF0CisgKiB0aGVpciBwcm9kdWN0LCB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbG9ycywgaXMgbm8gbW9yZSB0aGFuIHRoYXQgcmVxdWVzdGVkLgorICogKEluIG1vc3QgY2FzZXMsIHRoZSBwcm9kdWN0IHdpbGwgYmUgc29tZXdoYXQgbGVzcy4pCisgKgorICogU2luY2UgdGhlIGNvbG9ybWFwIGlzIG9ydGhvZ29uYWwsIHRoZSByZXByZXNlbnRhdGl2ZSB2YWx1ZSBmb3IgZWFjaCBjb2xvcgorICogY29tcG9uZW50IGNhbiBiZSBkZXRlcm1pbmVkIHdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIG90aGVyIGNvbXBvbmVudHM7CisgKiB0aGVuIHRoZXNlIGluZGV4ZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBjb2xvcm1hcCBpbmRleCBieSBhIHN0YW5kYXJkCisgKiBOLWRpbWVuc2lvbmFsLWFycmF5LXN1YnNjcmlwdCBjYWxjdWxhdGlvbi4gIE1vc3Qgb2YgdGhlIGFyaXRobWV0aWMgaW52b2x2ZWQKKyAqIGNhbiBiZSBwcmVjYWxjdWxhdGVkIGFuZCBzdG9yZWQgaW4gdGhlIGxvb2t1cCB0YWJsZSBjb2xvcmluZGV4W10uCisgKiBjb2xvcmluZGV4W2ldW2pdIG1hcHMgcGl4ZWwgdmFsdWUgaiBpbiBjb21wb25lbnQgaSB0byB0aGUgbmVhcmVzdAorICogcmVwcmVzZW50YXRpdmUgdmFsdWUgKGdyaWQgcGxhbmUpIGZvciB0aGF0IGNvbXBvbmVudDsgdGhpcyBpbmRleCBpcworICogbXVsdGlwbGllZCBieSB0aGUgYXJyYXkgc3RyaWRlIGZvciBjb21wb25lbnQgaSwgc28gdGhhdCB0aGUKKyAqIGluZGV4IG9mIHRoZSBjb2xvcm1hcCBlbnRyeSBjbG9zZXN0IHRvIGEgZ2l2ZW4gcGl4ZWwgdmFsdWUgaXMganVzdAorICogICAgc3VtKCBjb2xvcmluZGV4W2NvbXBvbmVudC1udW1iZXJdW3BpeGVsLWNvbXBvbmVudC12YWx1ZV0gKQorICogQXNpZGUgZnJvbSBiZWluZyBmYXN0LCB0aGlzIHNjaGVtZSBhbGxvd3MgZm9yIHZhcmlhYmxlIHNwYWNpbmcgYmV0d2VlbgorICogcmVwcmVzZW50YXRpdmUgdmFsdWVzIHdpdGggbm8gYWRkaXRpb25hbCBsb29rdXAgY29zdC4KKyAqCisgKiBJZiBnYW1tYSBjb3JyZWN0aW9uIGhhcyBiZWVuIGFwcGxpZWQgaW4gY29sb3IgY29udmVyc2lvbiwgaXQgbWlnaHQgYmUgd2lzZQorICogdG8gYWRqdXN0IHRoZSBjb2xvciBncmlkIHNwYWNpbmcgc28gdGhhdCB0aGUgcmVwcmVzZW50YXRpdmUgY29sb3JzIGFyZQorICogZXF1aWRpc3RhbnQgaW4gbGluZWFyIHNwYWNlLiAgQXQgdGhpcyB3cml0aW5nLCBnYW1tYSBjb3JyZWN0aW9uIGlzIG5vdAorICogaW1wbGVtZW50ZWQgYnkgamRjb2xvciwgc28gbm90aGluZyBpcyBkb25lIGhlcmUuCisgKi8KKworCisvKiBEZWNsYXJhdGlvbnMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nLgorICoKKyAqIFdlIHVzZSBhIHN0YW5kYXJkIDE2eDE2IG9yZGVyZWQgZGl0aGVyIGFycmF5LiAgVGhlIGJhc2ljIGNvbmNlcHQgb2Ygb3JkZXJlZAorICogZGl0aGVyaW5nIGlzIGRlc2NyaWJlZCBpbiBtYW55IHJlZmVyZW5jZXMsIGZvciBpbnN0YW5jZSBEYWxlIFNjaHVtYWNoZXIncworICogY2hhcHRlciBJSS4yIG9mIEdyYXBoaWNzIEdlbXMgSUkgKEphbWVzIEFydm8sIGVkLiBBY2FkZW1pYyBQcmVzcywgMTk5MSkuCisgKiBJbiBwbGFjZSBvZiBTY2h1bWFjaGVyJ3MgY29tcGFyaXNvbnMgYWdhaW5zdCBhICJ0aHJlc2hvbGQiIHZhbHVlLCB3ZSBhZGQgYQorICogImRpdGhlciIgdmFsdWUgdG8gdGhlIGlucHV0IHBpeGVsIGFuZCB0aGVuIHJvdW5kIHRoZSByZXN1bHQgdG8gdGhlIG5lYXJlc3QKKyAqIG91dHB1dCB2YWx1ZS4gIFRoZSBkaXRoZXIgdmFsdWUgaXMgZXF1aXZhbGVudCB0byAoMC41IC0gdGhyZXNob2xkKSB0aW1lcworICogdGhlIGRpc3RhbmNlIGJldHdlZW4gb3V0cHV0IHZhbHVlcy4gIEZvciBvcmRlcmVkIGRpdGhlcmluZywgd2UgYXNzdW1lIHRoYXQKKyAqIHRoZSBvdXRwdXQgY29sb3JzIGFyZSBlcXVhbGx5IHNwYWNlZDsgaWYgbm90LCByZXN1bHRzIHdpbGwgcHJvYmFibHkgYmUKKyAqIHdvcnNlLCBzaW5jZSB0aGUgZGl0aGVyIG1heSBiZSB0b28gbXVjaCBvciB0b28gbGl0dGxlIGF0IGEgZ2l2ZW4gcG9pbnQuCisgKgorICogVGhlIG5vcm1hbCBjYWxjdWxhdGlvbiB3b3VsZCBiZSB0byBmb3JtIHBpeGVsIHZhbHVlICsgZGl0aGVyLCByYW5nZS1saW1pdAorICogdGhpcyB0byAwLi5NQVhKU0FNUExFLCBhbmQgdGhlbiBpbmRleCBpbnRvIHRoZSBjb2xvcmluZGV4IHRhYmxlIGFzIHVzdWFsLgorICogV2UgY2FuIHNraXAgdGhlIHNlcGFyYXRlIHJhbmdlLWxpbWl0aW5nIHN0ZXAgYnkgZXh0ZW5kaW5nIHRoZSBjb2xvcmluZGV4CisgKiB0YWJsZSBpbiBib3RoIGRpcmVjdGlvbnMuCisgKi8KKworI2RlZmluZSBPRElUSEVSX1NJWkUgIDE2CS8qIGRpbWVuc2lvbiBvZiBkaXRoZXIgbWF0cml4ICovCisvKiBOQjogaWYgT0RJVEhFUl9TSVpFIGlzIG5vdCBhIHBvd2VyIG9mIDIsIE9ESVRIRVJfTUFTSyB1c2VzIHdpbGwgYnJlYWsgKi8KKyNkZWZpbmUgT0RJVEhFUl9DRUxMUyAoT0RJVEhFUl9TSVpFKk9ESVRIRVJfU0laRSkJLyogIyBjZWxscyBpbiBtYXRyaXggKi8KKyNkZWZpbmUgT0RJVEhFUl9NQVNLICAoT0RJVEhFUl9TSVpFLTEpIC8qIG1hc2sgZm9yIHdyYXBwaW5nIGFyb3VuZCBjb3VudGVycyAqLworCit0eXBlZGVmIGludCBPRElUSEVSX01BVFJJWFtPRElUSEVSX1NJWkVdW09ESVRIRVJfU0laRV07Cit0eXBlZGVmIGludCAoKk9ESVRIRVJfTUFUUklYX1BUUilbT0RJVEhFUl9TSVpFXTsKKworc3RhdGljIGNvbnN0IFVJTlQ4IGJhc2VfZGl0aGVyX21hdHJpeFtPRElUSEVSX1NJWkVdW09ESVRIRVJfU0laRV0gPSB7CisgIC8qIEJheWVyJ3Mgb3JkZXItNCBkaXRoZXIgYXJyYXkuICBHZW5lcmF0ZWQgYnkgdGhlIGNvZGUgZ2l2ZW4gaW4KKyAgICogU3RlcGhlbiBIYXdsZXkncyBhcnRpY2xlICJPcmRlcmVkIERpdGhlcmluZyIgaW4gR3JhcGhpY3MgR2VtcyBJLgorICAgKiBUaGUgdmFsdWVzIGluIHRoaXMgYXJyYXkgbXVzdCByYW5nZSBmcm9tIDAgdG8gT0RJVEhFUl9DRUxMUy0xLgorICAgKi8KKyAgeyAgIDAsMTkyLCA0OCwyNDAsIDEyLDIwNCwgNjAsMjUyLCAgMywxOTUsIDUxLDI0MywgMTUsMjA3LCA2MywyNTUgfSwKKyAgeyAxMjgsIDY0LDE3NiwxMTIsMTQwLCA3NiwxODgsMTI0LDEzMSwgNjcsMTc5LDExNSwxNDMsIDc5LDE5MSwxMjcgfSwKKyAgeyAgMzIsMjI0LCAxNiwyMDgsIDQ0LDIzNiwgMjgsMjIwLCAzNSwyMjcsIDE5LDIxMSwgNDcsMjM5LCAzMSwyMjMgfSwKKyAgeyAxNjAsIDk2LDE0NCwgODAsMTcyLDEwOCwxNTYsIDkyLDE2MywgOTksMTQ3LCA4MywxNzUsMTExLDE1OSwgOTUgfSwKKyAgeyAgIDgsMjAwLCA1NiwyNDgsICA0LDE5NiwgNTIsMjQ0LCAxMSwyMDMsIDU5LDI1MSwgIDcsMTk5LCA1NSwyNDcgfSwKKyAgeyAxMzYsIDcyLDE4NCwxMjAsMTMyLCA2OCwxODAsMTE2LDEzOSwgNzUsMTg3LDEyMywxMzUsIDcxLDE4MywxMTkgfSwKKyAgeyAgNDAsMjMyLCAyNCwyMTYsIDM2LDIyOCwgMjAsMjEyLCA0MywyMzUsIDI3LDIxOSwgMzksMjMxLCAyMywyMTUgfSwKKyAgeyAxNjgsMTA0LDE1MiwgODgsMTY0LDEwMCwxNDgsIDg0LDE3MSwxMDcsMTU1LCA5MSwxNjcsMTAzLDE1MSwgODcgfSwKKyAgeyAgIDIsMTk0LCA1MCwyNDIsIDE0LDIwNiwgNjIsMjU0LCAgMSwxOTMsIDQ5LDI0MSwgMTMsMjA1LCA2MSwyNTMgfSwKKyAgeyAxMzAsIDY2LDE3OCwxMTQsMTQyLCA3OCwxOTAsMTI2LDEyOSwgNjUsMTc3LDExMywxNDEsIDc3LDE4OSwxMjUgfSwKKyAgeyAgMzQsMjI2LCAxOCwyMTAsIDQ2LDIzOCwgMzAsMjIyLCAzMywyMjUsIDE3LDIwOSwgNDUsMjM3LCAyOSwyMjEgfSwKKyAgeyAxNjIsIDk4LDE0NiwgODIsMTc0LDExMCwxNTgsIDk0LDE2MSwgOTcsMTQ1LCA4MSwxNzMsMTA5LDE1NywgOTMgfSwKKyAgeyAgMTAsMjAyLCA1OCwyNTAsICA2LDE5OCwgNTQsMjQ2LCAgOSwyMDEsIDU3LDI0OSwgIDUsMTk3LCA1MywyNDUgfSwKKyAgeyAxMzgsIDc0LDE4NiwxMjIsMTM0LCA3MCwxODIsMTE4LDEzNywgNzMsMTg1LDEyMSwxMzMsIDY5LDE4MSwxMTcgfSwKKyAgeyAgNDIsMjM0LCAyNiwyMTgsIDM4LDIzMCwgMjIsMjE0LCA0MSwyMzMsIDI1LDIxNywgMzcsMjI5LCAyMSwyMTMgfSwKKyAgeyAxNzAsMTA2LDE1NCwgOTAsMTY2LDEwMiwxNTAsIDg2LDE2OSwxMDUsMTUzLCA4OSwxNjUsMTAxLDE0OSwgODUgfQorfTsKKworCisvKiBEZWNsYXJhdGlvbnMgZm9yIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcuCisgKgorICogRXJyb3JzIGFyZSBhY2N1bXVsYXRlZCBpbnRvIHRoZSBhcnJheSBmc2Vycm9yc1tdLCBhdCBhIHJlc29sdXRpb24gb2YKKyAqIDEvMTZ0aCBvZiBhIHBpeGVsIGNvdW50LiAgVGhlIGVycm9yIGF0IGEgZ2l2ZW4gcGl4ZWwgaXMgcHJvcGFnYXRlZAorICogdG8gaXRzIG5vdC15ZXQtcHJvY2Vzc2VkIG5laWdoYm9ycyB1c2luZyB0aGUgc3RhbmRhcmQgRi1TIGZyYWN0aW9ucywKKyAqCQkuLi4JKGhlcmUpCTcvMTYKKyAqCQkzLzE2CTUvMTYJMS8xNgorICogV2Ugd29yayBsZWZ0LXRvLXJpZ2h0IG9uIGV2ZW4gcm93cywgcmlnaHQtdG8tbGVmdCBvbiBvZGQgcm93cy4KKyAqCisgKiBXZSBjYW4gZ2V0IGF3YXkgd2l0aCBhIHNpbmdsZSBhcnJheSAoaG9sZGluZyBvbmUgcm93J3Mgd29ydGggb2YgZXJyb3JzKQorICogYnkgdXNpbmcgaXQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgcm93J3MgZXJyb3JzIGF0IHBpeGVsIGNvbHVtbnMgbm90IHlldAorICogcHJvY2Vzc2VkLCBidXQgdGhlIG5leHQgcm93J3MgZXJyb3JzIGF0IGNvbHVtbnMgYWxyZWFkeSBwcm9jZXNzZWQuICBXZQorICogbmVlZCBvbmx5IGEgZmV3IGV4dHJhIHZhcmlhYmxlcyB0byBob2xkIHRoZSBlcnJvcnMgaW1tZWRpYXRlbHkgYXJvdW5kIHRoZQorICogY3VycmVudCBjb2x1bW4uICAoSWYgd2UgYXJlIGx1Y2t5LCB0aG9zZSB2YXJpYWJsZXMgYXJlIGluIHJlZ2lzdGVycywgYnV0CisgKiBldmVuIGlmIG5vdCwgdGhleSdyZSBwcm9iYWJseSBjaGVhcGVyIHRvIGFjY2VzcyB0aGFuIGFycmF5IGVsZW1lbnRzIGFyZS4pCisgKgorICogVGhlIGZzZXJyb3JzW10gYXJyYXkgaXMgaW5kZXhlZCBbY29tcG9uZW50I11bcG9zaXRpb25dLgorICogV2UgcHJvdmlkZSAoI2NvbHVtbnMgKyAyKSBlbnRyaWVzIHBlciBjb21wb25lbnQ7IHRoZSBleHRyYSBlbnRyeSBhdCBlYWNoCisgKiBlbmQgc2F2ZXMgdXMgZnJvbSBzcGVjaWFsLWNhc2luZyB0aGUgZmlyc3QgYW5kIGxhc3QgcGl4ZWxzLgorICoKKyAqIE5vdGU6IG9uIGEgd2lkZSBpbWFnZSwgd2UgbWlnaHQgbm90IGhhdmUgZW5vdWdoIHJvb20gaW4gYSBQQydzIG5lYXIgZGF0YQorICogc2VnbWVudCB0byBob2xkIHRoZSBlcnJvciBhcnJheTsgc28gaXQgaXMgYWxsb2NhdGVkIHdpdGggYWxsb2NfbGFyZ2UuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Cit0eXBlZGVmIElOVDE2IEZTRVJST1I7CQkvKiAxNiBiaXRzIHNob3VsZCBiZSBlbm91Z2ggKi8KK3R5cGVkZWYgaW50IExPQ0ZTRVJST1I7CQkvKiB1c2UgJ2ludCcgZm9yIGNhbGN1bGF0aW9uIHRlbXBzICovCisjZWxzZQordHlwZWRlZiBJTlQzMiBGU0VSUk9SOwkJLyogbWF5IG5lZWQgbW9yZSB0aGFuIDE2IGJpdHMgKi8KK3R5cGVkZWYgSU5UMzIgTE9DRlNFUlJPUjsJLyogYmUgc3VyZSBjYWxjdWxhdGlvbiB0ZW1wcyBhcmUgYmlnIGVub3VnaCAqLworI2VuZGlmCisKK3R5cGVkZWYgRlNFUlJPUiBGQVIgKkZTRVJSUFRSOwkvKiBwb2ludGVyIHRvIGVycm9yIGFycmF5IChpbiBGQVIgc3RvcmFnZSEpICovCisKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KKworI2RlZmluZSBNQVhfUV9DT01QUyA0CQkvKiBtYXggY29tcG9uZW50cyBJIGNhbiBoYW5kbGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogSW5pdGlhbGx5IGFsbG9jYXRlZCBjb2xvcm1hcCBpcyBzYXZlZCBoZXJlICovCisgIEpTQU1QQVJSQVkgc3ZfY29sb3JtYXA7CS8qIFRoZSBjb2xvciBtYXAgYXMgYSAyLUQgcGl4ZWwgYXJyYXkgKi8KKyAgaW50IHN2X2FjdHVhbDsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHVzZSAqLworCisgIEpTQU1QQVJSQVkgY29sb3JpbmRleDsJLyogUHJlY29tcHV0ZWQgbWFwcGluZyBmb3Igc3BlZWQgKi8KKyAgLyogY29sb3JpbmRleFtpXVtqXSA9IGluZGV4IG9mIGNvbG9yIGNsb3Nlc3QgdG8gcGl4ZWwgdmFsdWUgaiBpbiBjb21wb25lbnQgaSwKKyAgICogcHJlbXVsdGlwbGllZCBhcyBkZXNjcmliZWQgYWJvdmUuICBTaW5jZSBjb2xvcm1hcCBpbmRleGVzIG11c3QgZml0IGludG8KKyAgICogSlNBTVBMRXMsIHRoZSBlbnRyaWVzIG9mIHRoaXMgYXJyYXkgd2lsbCB0b28uCisgICAqLworICBib29sZWFuIGlzX3BhZGRlZDsJCS8qIGlzIHRoZSBjb2xvcmluZGV4IHBhZGRlZCBmb3Igb2RpdGhlcj8gKi8KKworICBpbnQgTmNvbG9yc1tNQVhfUV9DT01QU107CS8qICMgb2YgdmFsdWVzIGFsbG9jZWQgdG8gZWFjaCBjb21wb25lbnQgKi8KKworICAvKiBWYXJpYWJsZXMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nICovCisgIGludCByb3dfaW5kZXg7CQkvKiBjdXIgcm93J3MgdmVydGljYWwgaW5kZXggaW4gZGl0aGVyIG1hdHJpeCAqLworICBPRElUSEVSX01BVFJJWF9QVFIgb2RpdGhlcltNQVhfUV9DT01QU107IC8qIG9uZSBkaXRoZXIgYXJyYXkgcGVyIGNvbXBvbmVudCAqLworCisgIC8qIFZhcmlhYmxlcyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLworICBGU0VSUlBUUiBmc2Vycm9yc1tNQVhfUV9DT01QU107IC8qIGFjY3VtdWxhdGVkIGVycm9ycyAqLworICBib29sZWFuIG9uX29kZF9yb3c7CQkvKiBmbGFnIHRvIHJlbWVtYmVyIHdoaWNoIHJvdyB3ZSBhcmUgb24gKi8KK30gbXlfY3F1YW50aXplcjsKKwordHlwZWRlZiBteV9jcXVhbnRpemVyICogbXlfY3F1YW50aXplX3B0cjsKKworCisvKgorICogUG9saWN5LW1ha2luZyBzdWJyb3V0aW5lcyBmb3IgY3JlYXRlX2NvbG9ybWFwIGFuZCBjcmVhdGVfY29sb3JpbmRleC4KKyAqIFRoZXNlIHJvdXRpbmVzIGRldGVybWluZSB0aGUgY29sb3JtYXAgdG8gYmUgdXNlZC4gIFRoZSByZXN0IG9mIHRoZSBtb2R1bGUKKyAqIG9ubHkgYXNzdW1lcyB0aGF0IHRoZSBjb2xvcm1hcCBpcyBvcnRob2dvbmFsLgorICoKKyAqICAqIHNlbGVjdF9uY29sb3JzIGRlY2lkZXMgaG93IHRvIGRpdnZ5IHVwIHRoZSBhdmFpbGFibGUgY29sb3JzCisgKiAgICBhbW9uZyB0aGUgY29tcG9uZW50cy4KKyAqICAqIG91dHB1dF92YWx1ZSBkZWZpbmVzIHRoZSBzZXQgb2YgcmVwcmVzZW50YXRpdmUgdmFsdWVzIGZvciBhIGNvbXBvbmVudC4KKyAqICAqIGxhcmdlc3RfaW5wdXRfdmFsdWUgZGVmaW5lcyB0aGUgbWFwcGluZyBmcm9tIGlucHV0IHZhbHVlcyB0bworICogICAgcmVwcmVzZW50YXRpdmUgdmFsdWVzIGZvciBhIGNvbXBvbmVudC4KKyAqIE5vdGUgdGhhdCB0aGUgbGF0dGVyIHR3byByb3V0aW5lcyBtYXkgaW1wb3NlIGRpZmZlcmVudCBwb2xpY2llcyBmb3IKKyAqIGRpZmZlcmVudCBjb21wb25lbnRzLCB0aG91Z2ggdGhpcyBpcyBub3QgY3VycmVudGx5IGRvbmUuCisgKi8KKworCitMT0NBTChpbnQpCitzZWxlY3RfbmNvbG9ycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IE5jb2xvcnNbXSkKKy8qIERldGVybWluZSBhbGxvY2F0aW9uIG9mIGRlc2lyZWQgY29sb3JzIHRvIGNvbXBvbmVudHMsICovCisvKiBhbmQgZmlsbCBpbiBOY29sb3JzW10gYXJyYXkgdG8gaW5kaWNhdGUgY2hvaWNlLiAqLworLyogUmV0dXJuIHZhbHVlIGlzIHRvdGFsIG51bWJlciBvZiBjb2xvcnMgKHByb2R1Y3Qgb2YgTmNvbG9yc1tdIHZhbHVlcykuICovCit7CisgIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgLyogbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgKi8KKyAgaW50IG1heF9jb2xvcnMgPSBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOworICBpbnQgdG90YWxfY29sb3JzLCBpcm9vdCwgaSwgajsKKyAgYm9vbGVhbiBjaGFuZ2VkOworICBsb25nIHRlbXA7CisgIHN0YXRpYyBjb25zdCBpbnQgUkdCX29yZGVyWzNdID0geyBSR0JfR1JFRU4sIFJHQl9SRUQsIFJHQl9CTFVFIH07CisKKyAgLyogV2UgY2FuIGFsbG9jYXRlIGF0IGxlYXN0IHRoZSBuYyd0aCByb290IG9mIG1heF9jb2xvcnMgcGVyIGNvbXBvbmVudC4gKi8KKyAgLyogQ29tcHV0ZSBmbG9vcihuYyd0aCByb290IG9mIG1heF9jb2xvcnMpLiAqLworICBpcm9vdCA9IDE7CisgIGRvIHsKKyAgICBpcm9vdCsrOworICAgIHRlbXAgPSBpcm9vdDsJCS8qIHNldCB0ZW1wID0gaXJvb3QgKiogbmMgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgbmM7IGkrKykKKyAgICAgIHRlbXAgKj0gaXJvb3Q7CisgIH0gd2hpbGUgKHRlbXAgPD0gKGxvbmcpIG1heF9jb2xvcnMpOyAvKiByZXBlYXQgdGlsbCBpcm9vdCBleGNlZWRzIHJvb3QgKi8KKyAgaXJvb3QtLTsJCQkvKiBub3cgaXJvb3QgPSBmbG9vcihyb290KSAqLworCisgIC8qIE11c3QgaGF2ZSBhdCBsZWFzdCAyIGNvbG9yIHZhbHVlcyBwZXIgY29tcG9uZW50ICovCisgIGlmIChpcm9vdCA8IDIpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfRkVXX0NPTE9SUywgKGludCkgdGVtcCk7CisKKyAgLyogSW5pdGlhbGl6ZSB0byBpcm9vdCBjb2xvciB2YWx1ZXMgZm9yIGVhY2ggY29tcG9uZW50ICovCisgIHRvdGFsX2NvbG9ycyA9IDE7CisgIGZvciAoaSA9IDA7IGkgPCBuYzsgaSsrKSB7CisgICAgTmNvbG9yc1tpXSA9IGlyb290OworICAgIHRvdGFsX2NvbG9ycyAqPSBpcm9vdDsKKyAgfQorICAvKiBXZSBtYXkgYmUgYWJsZSB0byBpbmNyZW1lbnQgdGhlIGNvdW50IGZvciBvbmUgb3IgbW9yZSBjb21wb25lbnRzIHdpdGhvdXQKKyAgICogZXhjZWVkaW5nIG1heF9jb2xvcnMsIHRob3VnaCB3ZSBrbm93IG5vdCBhbGwgY2FuIGJlIGluY3JlbWVudGVkLgorICAgKiBTb21ldGltZXMsIHRoZSBmaXJzdCBjb21wb25lbnQgY2FuIGJlIGluY3JlbWVudGVkIG1vcmUgdGhhbiBvbmNlIQorICAgKiAoRXhhbXBsZTogZm9yIDE2IGNvbG9ycywgd2Ugc3RhcnQgYXQgMioyKjIsIGdvIHRvIDMqMioyLCB0aGVuIDQqMioyLikKKyAgICogSW4gUkdCIGNvbG9yc3BhY2UsIHRyeSB0byBpbmNyZW1lbnQgRyBmaXJzdCwgdGhlbiBSLCB0aGVuIEIuCisgICAqLworICBkbyB7CisgICAgY2hhbmdlZCA9IEZBTFNFOworICAgIGZvciAoaSA9IDA7IGkgPCBuYzsgaSsrKSB7CisgICAgICBqID0gKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQiA/IFJHQl9vcmRlcltpXSA6IGkpOworICAgICAgLyogY2FsY3VsYXRlIG5ldyB0b3RhbF9jb2xvcnMgaWYgTmNvbG9yc1tqXSBpcyBpbmNyZW1lbnRlZCAqLworICAgICAgdGVtcCA9IHRvdGFsX2NvbG9ycyAvIE5jb2xvcnNbal07CisgICAgICB0ZW1wICo9IE5jb2xvcnNbal0rMTsJLyogZG9uZSBpbiBsb25nIGFyaXRoIHRvIGF2b2lkIG9mbG8gKi8KKyAgICAgIGlmICh0ZW1wID4gKGxvbmcpIG1heF9jb2xvcnMpCisJYnJlYWs7CQkJLyogd29uJ3QgZml0LCBkb25lIHdpdGggdGhpcyBwYXNzICovCisgICAgICBOY29sb3JzW2pdKys7CQkvKiBPSywgYXBwbHkgdGhlIGluY3JlbWVudCAqLworICAgICAgdG90YWxfY29sb3JzID0gKGludCkgdGVtcDsKKyAgICAgIGNoYW5nZWQgPSBUUlVFOworICAgIH0KKyAgfSB3aGlsZSAoY2hhbmdlZCk7CisKKyAgcmV0dXJuIHRvdGFsX2NvbG9yczsKK30KKworCitMT0NBTChpbnQpCitvdXRwdXRfdmFsdWUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBjaSwgaW50IGosIGludCBtYXhqKQorLyogUmV0dXJuIGondGggb3V0cHV0IHZhbHVlLCB3aGVyZSBqIHdpbGwgcmFuZ2UgZnJvbSAwIHRvIG1heGogKi8KKy8qIFRoZSBvdXRwdXQgdmFsdWVzIG11c3QgZmFsbCBpbiAwLi5NQVhKU0FNUExFIGluIGluY3JlYXNpbmcgb3JkZXIgKi8KK3sKKyAgLyogV2UgYWx3YXlzIHByb3ZpZGUgdmFsdWVzIDAgYW5kIE1BWEpTQU1QTEUgZm9yIGVhY2ggY29tcG9uZW50OworICAgKiBhbnkgYWRkaXRpb25hbCB2YWx1ZXMgYXJlIGVxdWFsbHkgc3BhY2VkIGJldHdlZW4gdGhlc2UgbGltaXRzLgorICAgKiAoRm9yY2luZyB0aGUgdXBwZXIgYW5kIGxvd2VyIHZhbHVlcyB0byB0aGUgbGltaXRzIGVuc3VyZXMgdGhhdAorICAgKiBkaXRoZXJpbmcgY2FuJ3QgcHJvZHVjZSBhIGNvbG9yIG91dHNpZGUgdGhlIHNlbGVjdGVkIGdhbXV0LikKKyAgICovCisgIHJldHVybiAoaW50KSAoKChJTlQzMikgaiAqIE1BWEpTQU1QTEUgKyBtYXhqLzIpIC8gbWF4aik7Cit9CisKKworTE9DQUwoaW50KQorbGFyZ2VzdF9pbnB1dF92YWx1ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGNpLCBpbnQgaiwgaW50IG1heGopCisvKiBSZXR1cm4gbGFyZ2VzdCBpbnB1dCB2YWx1ZSB0aGF0IHNob3VsZCBtYXAgdG8gaid0aCBvdXRwdXQgdmFsdWUgKi8KKy8qIE11c3QgaGF2ZSBsYXJnZXN0KGo9MCkgPj0gMCwgYW5kIGxhcmdlc3Qoaj1tYXhqKSA+PSBNQVhKU0FNUExFICovCit7CisgIC8qIEJyZWFrcG9pbnRzIGFyZSBoYWxmd2F5IGJldHdlZW4gdmFsdWVzIHJldHVybmVkIGJ5IG91dHB1dF92YWx1ZSAqLworICByZXR1cm4gKGludCkgKCgoSU5UMzIpICgyKmogKyAxKSAqIE1BWEpTQU1QTEUgKyBtYXhqKSAvICgyKm1heGopKTsKK30KKworCisvKgorICogQ3JlYXRlIHRoZSBjb2xvcm1hcC4KKyAqLworCitMT0NBTCh2b2lkKQorY3JlYXRlX2NvbG9ybWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogQ3JlYXRlZCBjb2xvcm1hcCAqLworICBpbnQgdG90YWxfY29sb3JzOwkJLyogTnVtYmVyIG9mIGRpc3RpbmN0IG91dHB1dCBjb2xvcnMgKi8KKyAgaW50IGksaixrLCBuY2ksIGJsa3NpemUsIGJsa2Rpc3QsIHB0ciwgdmFsOworCisgIC8qIFNlbGVjdCBudW1iZXIgb2YgY29sb3JzIGZvciBlYWNoIGNvbXBvbmVudCAqLworICB0b3RhbF9jb2xvcnMgPSBzZWxlY3RfbmNvbG9ycyhjaW5mbywgY3F1YW50aXplLT5OY29sb3JzKTsKKworICAvKiBSZXBvcnQgc2VsZWN0ZWQgY29sb3IgY291bnRzICovCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKKyAgICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19RVUFOVF8zX05DT0xPUlMsCisJICAgICB0b3RhbF9jb2xvcnMsIGNxdWFudGl6ZS0+TmNvbG9yc1swXSwKKwkgICAgIGNxdWFudGl6ZS0+TmNvbG9yc1sxXSwgY3F1YW50aXplLT5OY29sb3JzWzJdKTsKKyAgZWxzZQorICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1FVQU5UX05DT0xPUlMsIHRvdGFsX2NvbG9ycyk7CisKKyAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGNvbG9ybWFwLiAqLworICAvKiBUaGUgY29sb3JzIGFyZSBvcmRlcmVkIGluIHRoZSBtYXAgaW4gc3RhbmRhcmQgcm93LW1ham9yIG9yZGVyLCAqLworICAvKiBpLmUuIHJpZ2h0bW9zdCAoaGlnaGVzdC1pbmRleGVkKSBjb2xvciBjaGFuZ2VzIG1vc3QgcmFwaWRseS4gKi8KKworICBjb2xvcm1hcCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgIChKRElNRU5TSU9OKSB0b3RhbF9jb2xvcnMsIChKRElNRU5TSU9OKSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMpOworCisgIC8qIGJsa3NpemUgaXMgbnVtYmVyIG9mIGFkamFjZW50IHJlcGVhdGVkIGVudHJpZXMgZm9yIGEgY29tcG9uZW50ICovCisgIC8qIGJsa2Rpc3QgaXMgZGlzdGFuY2UgYmV0d2VlbiBncm91cHMgb2YgaWRlbnRpY2FsIGVudHJpZXMgZm9yIGEgY29tcG9uZW50ICovCisgIGJsa2Rpc3QgPSB0b3RhbF9jb2xvcnM7CisKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7CisgICAgLyogZmlsbCBpbiBjb2xvcm1hcCBlbnRyaWVzIGZvciBpJ3RoIGNvbG9yIGNvbXBvbmVudCAqLworICAgIG5jaSA9IGNxdWFudGl6ZS0+TmNvbG9yc1tpXTsgLyogIyBvZiBkaXN0aW5jdCB2YWx1ZXMgZm9yIHRoaXMgY29sb3IgKi8KKyAgICBibGtzaXplID0gYmxrZGlzdCAvIG5jaTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbmNpOyBqKyspIHsKKyAgICAgIC8qIENvbXB1dGUgaid0aCBvdXRwdXQgdmFsdWUgKG91dCBvZiBuY2kpIGZvciBjb21wb25lbnQgKi8KKyAgICAgIHZhbCA9IG91dHB1dF92YWx1ZShjaW5mbywgaSwgaiwgbmNpLTEpOworICAgICAgLyogRmlsbCBpbiBhbGwgY29sb3JtYXAgZW50cmllcyB0aGF0IGhhdmUgdGhpcyB2YWx1ZSBvZiB0aGlzIGNvbXBvbmVudCAqLworICAgICAgZm9yIChwdHIgPSBqICogYmxrc2l6ZTsgcHRyIDwgdG90YWxfY29sb3JzOyBwdHIgKz0gYmxrZGlzdCkgeworCS8qIGZpbGwgaW4gYmxrc2l6ZSBlbnRyaWVzIGJlZ2lubmluZyBhdCBwdHIgKi8KKwlmb3IgKGsgPSAwOyBrIDwgYmxrc2l6ZTsgaysrKQorCSAgY29sb3JtYXBbaV1bcHRyK2tdID0gKEpTQU1QTEUpIHZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgYmxrZGlzdCA9IGJsa3NpemU7CQkvKiBibGtzaXplIG9mIHRoaXMgY29sb3IgaXMgYmxrZGlzdCBvZiBuZXh0ICovCisgIH0KKworICAvKiBTYXZlIHRoZSBjb2xvcm1hcCBpbiBwcml2YXRlIHN0b3JhZ2UsCisgICAqIHdoZXJlIGl0IHdpbGwgc3Vydml2ZSBjb2xvciBxdWFudGl6YXRpb24gbW9kZSBjaGFuZ2VzLgorICAgKi8KKyAgY3F1YW50aXplLT5zdl9jb2xvcm1hcCA9IGNvbG9ybWFwOworICBjcXVhbnRpemUtPnN2X2FjdHVhbCA9IHRvdGFsX2NvbG9yczsKK30KKworCisvKgorICogQ3JlYXRlIHRoZSBjb2xvciBpbmRleCB0YWJsZS4KKyAqLworCitMT0NBTCh2b2lkKQorY3JlYXRlX2NvbG9yaW5kZXggKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIEpTQU1QUk9XIGluZGV4cHRyOworICBpbnQgaSxqLGssIG5jaSwgYmxrc2l6ZSwgdmFsLCBwYWQ7CisKKyAgLyogRm9yIG9yZGVyZWQgZGl0aGVyLCB3ZSBwYWQgdGhlIGNvbG9yIGluZGV4IHRhYmxlcyBieSBNQVhKU0FNUExFIGluCisgICAqIGVhY2ggZGlyZWN0aW9uIChpbnB1dCBpbmRleCB2YWx1ZXMgY2FuIGJlIC1NQVhKU0FNUExFIC4uIDIqTUFYSlNBTVBMRSkuCisgICAqIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpbiB0aGUgb3RoZXIgZGl0aGVyaW5nIG1vZGVzLiAgSG93ZXZlciwgd2UKKyAgICogZmxhZyB3aGV0aGVyIGl0IHdhcyBkb25lIGluIGNhc2UgdXNlciBjaGFuZ2VzIGRpdGhlcmluZyBtb2RlLgorICAgKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX09SREVSRUQpIHsKKyAgICBwYWQgPSBNQVhKU0FNUExFKjI7CisgICAgY3F1YW50aXplLT5pc19wYWRkZWQgPSBUUlVFOworICB9IGVsc2UgeworICAgIHBhZCA9IDA7CisgICAgY3F1YW50aXplLT5pc19wYWRkZWQgPSBGQUxTRTsKKyAgfQorCisgIGNxdWFudGl6ZS0+Y29sb3JpbmRleCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgIChKRElNRU5TSU9OKSAoTUFYSlNBTVBMRSsxICsgcGFkKSwKKyAgICAgKEpESU1FTlNJT04pIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyk7CisKKyAgLyogYmxrc2l6ZSBpcyBudW1iZXIgb2YgYWRqYWNlbnQgcmVwZWF0ZWQgZW50cmllcyBmb3IgYSBjb21wb25lbnQgKi8KKyAgYmxrc2l6ZSA9IGNxdWFudGl6ZS0+c3ZfYWN0dWFsOworCisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykgeworICAgIC8qIGZpbGwgaW4gY29sb3JpbmRleCBlbnRyaWVzIGZvciBpJ3RoIGNvbG9yIGNvbXBvbmVudCAqLworICAgIG5jaSA9IGNxdWFudGl6ZS0+TmNvbG9yc1tpXTsgLyogIyBvZiBkaXN0aW5jdCB2YWx1ZXMgZm9yIHRoaXMgY29sb3IgKi8KKyAgICBibGtzaXplID0gYmxrc2l6ZSAvIG5jaTsKKworICAgIC8qIGFkanVzdCBjb2xvcmluZGV4IHBvaW50ZXJzIHRvIHByb3ZpZGUgcGFkZGluZyBhdCBuZWdhdGl2ZSBpbmRleGVzLiAqLworICAgIGlmIChwYWQpCisgICAgICBjcXVhbnRpemUtPmNvbG9yaW5kZXhbaV0gKz0gTUFYSlNBTVBMRTsKKworICAgIC8qIGluIGxvb3AsIHZhbCA9IGluZGV4IG9mIGN1cnJlbnQgb3V0cHV0IHZhbHVlLCAqLworICAgIC8qIGFuZCBrID0gbGFyZ2VzdCBqIHRoYXQgbWFwcyB0byBjdXJyZW50IHZhbCAqLworICAgIGluZGV4cHRyID0gY3F1YW50aXplLT5jb2xvcmluZGV4W2ldOworICAgIHZhbCA9IDA7CisgICAgayA9IGxhcmdlc3RfaW5wdXRfdmFsdWUoY2luZm8sIGksIDAsIG5jaS0xKTsKKyAgICBmb3IgKGogPSAwOyBqIDw9IE1BWEpTQU1QTEU7IGorKykgeworICAgICAgd2hpbGUgKGogPiBrKQkJLyogYWR2YW5jZSB2YWwgaWYgcGFzdCBib3VuZGFyeSAqLworCWsgPSBsYXJnZXN0X2lucHV0X3ZhbHVlKGNpbmZvLCBpLCArK3ZhbCwgbmNpLTEpOworICAgICAgLyogcHJlbXVsdGlwbHkgc28gdGhhdCBubyBtdWx0aXBsaWNhdGlvbiBuZWVkZWQgaW4gbWFpbiBwcm9jZXNzaW5nICovCisgICAgICBpbmRleHB0cltqXSA9IChKU0FNUExFKSAodmFsICogYmxrc2l6ZSk7CisgICAgfQorICAgIC8qIFBhZCBhdCBib3RoIGVuZHMgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKHBhZCkKKyAgICAgIGZvciAoaiA9IDE7IGogPD0gTUFYSlNBTVBMRTsgaisrKSB7CisJaW5kZXhwdHJbLWpdID0gaW5kZXhwdHJbMF07CisJaW5kZXhwdHJbTUFYSlNBTVBMRStqXSA9IGluZGV4cHRyW01BWEpTQU1QTEVdOworICAgICAgfQorICB9Cit9CisKKworLyoKKyAqIENyZWF0ZSBhbiBvcmRlcmVkLWRpdGhlciBhcnJheSBmb3IgYSBjb21wb25lbnQgaGF2aW5nIG5jb2xvcnMKKyAqIGRpc3RpbmN0IG91dHB1dCB2YWx1ZXMuCisgKi8KKworTE9DQUwoT0RJVEhFUl9NQVRSSVhfUFRSKQorbWFrZV9vZGl0aGVyX2FycmF5IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbmNvbG9ycykKK3sKKyAgT0RJVEhFUl9NQVRSSVhfUFRSIG9kaXRoZXI7CisgIGludCBqLGs7CisgIElOVDMyIG51bSxkZW47CisKKyAgb2RpdGhlciA9IChPRElUSEVSX01BVFJJWF9QVFIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YoT0RJVEhFUl9NQVRSSVgpKTsKKyAgLyogVGhlIGludGVyLXZhbHVlIGRpc3RhbmNlIGZvciB0aGlzIGNvbG9yIGlzIE1BWEpTQU1QTEUvKG5jb2xvcnMtMSkuCisgICAqIEhlbmNlIHRoZSBkaXRoZXIgdmFsdWUgZm9yIHRoZSBtYXRyaXggY2VsbCB3aXRoIGZpbGwgb3JkZXIgZgorICAgKiAoZj0wLi5OLTEpIHNob3VsZCBiZSAoTi0xLTIqZikvKDIqTikgKiBNQVhKU0FNUExFLyhuY29sb3JzLTEpLgorICAgKiBPbiAxNi1iaXQtaW50IG1hY2hpbmUsIGJlIGNhcmVmdWwgdG8gYXZvaWQgb3ZlcmZsb3cuCisgICAqLworICBkZW4gPSAyICogT0RJVEhFUl9DRUxMUyAqICgoSU5UMzIpIChuY29sb3JzIC0gMSkpOworICBmb3IgKGogPSAwOyBqIDwgT0RJVEhFUl9TSVpFOyBqKyspIHsKKyAgICBmb3IgKGsgPSAwOyBrIDwgT0RJVEhFUl9TSVpFOyBrKyspIHsKKyAgICAgIG51bSA9ICgoSU5UMzIpIChPRElUSEVSX0NFTExTLTEgLSAyKigoaW50KWJhc2VfZGl0aGVyX21hdHJpeFtqXVtrXSkpKQorCSAgICAqIE1BWEpTQU1QTEU7CisgICAgICAvKiBFbnN1cmUgcm91bmQgdG93YXJkcyB6ZXJvIGRlc3BpdGUgQydzIGxhY2sgb2YgY29uc2lzdGVuY3kKKyAgICAgICAqIGFib3V0IHJvdW5kaW5nIG5lZ2F0aXZlIHZhbHVlcyBpbiBpbnRlZ2VyIGRpdmlzaW9uLi4uCisgICAgICAgKi8KKyAgICAgIG9kaXRoZXJbal1ba10gPSAoaW50KSAobnVtPDAgPyAtKCgtbnVtKS9kZW4pIDogbnVtL2Rlbik7CisgICAgfQorICB9CisgIHJldHVybiBvZGl0aGVyOworfQorCisKKy8qCisgKiBDcmVhdGUgdGhlIG9yZGVyZWQtZGl0aGVyIHRhYmxlcy4KKyAqIENvbXBvbmVudHMgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiByZXByZXNlbnRhdGl2ZSBjb2xvcnMgbWF5IAorICogc2hhcmUgYSBkaXRoZXIgdGFibGUuCisgKi8KKworTE9DQUwodm9pZCkKK2NyZWF0ZV9vZGl0aGVyX3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgT0RJVEhFUl9NQVRSSVhfUFRSIG9kaXRoZXI7CisgIGludCBpLCBqLCBuY2k7CisKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7CisgICAgbmNpID0gY3F1YW50aXplLT5OY29sb3JzW2ldOyAvKiAjIG9mIGRpc3RpbmN0IHZhbHVlcyBmb3IgdGhpcyBjb2xvciAqLworICAgIG9kaXRoZXIgPSBOVUxMOwkJLyogc2VhcmNoIGZvciBtYXRjaGluZyBwcmlvciBjb21wb25lbnQgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICBpZiAobmNpID09IGNxdWFudGl6ZS0+TmNvbG9yc1tqXSkgeworCW9kaXRoZXIgPSBjcXVhbnRpemUtPm9kaXRoZXJbal07CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChvZGl0aGVyID09IE5VTEwpCS8qIG5lZWQgYSBuZXcgdGFibGU/ICovCisgICAgICBvZGl0aGVyID0gbWFrZV9vZGl0aGVyX2FycmF5KGNpbmZvLCBuY2kpOworICAgIGNxdWFudGl6ZS0+b2RpdGhlcltpXSA9IG9kaXRoZXI7CisgIH0KK30KKworCisvKgorICogTWFwIHNvbWUgcm93cyBvZiBwaXhlbHMgdG8gdGhlIG91dHB1dCBjb2xvcm1hcHBlZCByZXByZXNlbnRhdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2NvbG9yX3F1YW50aXplIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKKwkJSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBHZW5lcmFsIGNhc2UsIG5vIGRpdGhlcmluZyAqLworeworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBKU0FNUEFSUkFZIGNvbG9yaW5kZXggPSBjcXVhbnRpemUtPmNvbG9yaW5kZXg7CisgIHJlZ2lzdGVyIGludCBwaXhjb2RlLCBjaTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyaW4sIHB0cm91dDsKKyAgaW50IHJvdzsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICByZWdpc3RlciBpbnQgbmMgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICBwdHJpbiA9IGlucHV0X2J1Zltyb3ddOworICAgIHB0cm91dCA9IG91dHB1dF9idWZbcm93XTsKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgcGl4Y29kZSA9IDA7CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBuYzsgY2krKykgeworCXBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4W2NpXVtHRVRKU0FNUExFKCpwdHJpbisrKV0pOworICAgICAgfQorICAgICAgKnB0cm91dCsrID0gKEpTQU1QTEUpIHBpeGNvZGU7CisgICAgfQorICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjb2xvcl9xdWFudGl6ZTMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBGYXN0IHBhdGggZm9yIG91dF9jb2xvcl9jb21wb25lbnRzPT0zLCBubyBkaXRoZXJpbmcgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgcmVnaXN0ZXIgaW50IHBpeGNvZGU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cmluLCBwdHJvdXQ7CisgIEpTQU1QUk9XIGNvbG9yaW5kZXgwID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzBdOworICBKU0FNUFJPVyBjb2xvcmluZGV4MSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFsxXTsKKyAgSlNBTVBST1cgY29sb3JpbmRleDIgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMl07CisgIGludCByb3c7CisgIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIHB0cmluID0gaW5wdXRfYnVmW3Jvd107CisgICAgcHRyb3V0ID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICBwaXhjb2RlICA9IEdFVEpTQU1QTEUoY29sb3JpbmRleDBbR0VUSlNBTVBMRSgqcHRyaW4rKyldKTsKKyAgICAgIHBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4MVtHRVRKU0FNUExFKCpwdHJpbisrKV0pOworICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgyW0dFVEpTQU1QTEUoKnB0cmluKyspXSk7CisgICAgICAqcHRyb3V0KysgPSAoSlNBTVBMRSkgcGl4Y29kZTsKKyAgICB9CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3F1YW50aXplX29yZF9kaXRoZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCQkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQorLyogR2VuZXJhbCBjYXNlLCB3aXRoIG9yZGVyZWQgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHV0X3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHV0X3B0cjsKKyAgSlNBTVBST1cgY29sb3JpbmRleF9jaTsKKyAgaW50ICogZGl0aGVyOwkJCS8qIHBvaW50cyB0byBhY3RpdmUgcm93IG9mIGRpdGhlciBtYXRyaXggKi8KKyAgaW50IHJvd19pbmRleCwgY29sX2luZGV4OwkvKiBjdXJyZW50IGluZGV4ZXMgaW50byBkaXRoZXIgbWF0cml4ICovCisgIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgaW50IGNpOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICAvKiBJbml0aWFsaXplIG91dHB1dCB2YWx1ZXMgdG8gMCBzbyBjYW4gcHJvY2VzcyBjb21wb25lbnRzIHNlcGFyYXRlbHkgKi8KKyAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIG91dHB1dF9idWZbcm93XSwKKwkgICAgICAoc2l6ZV90KSAod2lkdGggKiBTSVpFT0YoSlNBTVBMRSkpKTsKKyAgICByb3dfaW5kZXggPSBjcXVhbnRpemUtPnJvd19pbmRleDsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBuYzsgY2krKykgeworICAgICAgaW5wdXRfcHRyID0gaW5wdXRfYnVmW3Jvd10gKyBjaTsKKyAgICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW3Jvd107CisgICAgICBjb2xvcmluZGV4X2NpID0gY3F1YW50aXplLT5jb2xvcmluZGV4W2NpXTsKKyAgICAgIGRpdGhlciA9IGNxdWFudGl6ZS0+b2RpdGhlcltjaV1bcm93X2luZGV4XTsKKyAgICAgIGNvbF9pbmRleCA9IDA7CisKKyAgICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisJLyogRm9ybSBwaXhlbCB2YWx1ZSArIGRpdGhlciwgcmFuZ2UtbGltaXQgdG8gMC4uTUFYSlNBTVBMRSwKKwkgKiBzZWxlY3Qgb3V0cHV0IHZhbHVlLCBhY2N1bXVsYXRlIGludG8gb3V0cHV0IGNvZGUgZm9yIHRoaXMgcGl4ZWwuCisJICogUmFuZ2UtbGltaXRpbmcgbmVlZCBub3QgYmUgZG9uZSBleHBsaWNpdGx5LCBhcyB3ZSBoYXZlIGV4dGVuZGVkCisJICogdGhlIGNvbG9yaW5kZXggdGFibGUgdG8gcHJvZHVjZSB0aGUgcmlnaHQgYW5zd2VycyBmb3Igb3V0LW9mLXJhbmdlCisJICogaW5wdXRzLiAgVGhlIG1heGltdW0gZGl0aGVyIGlzICstIE1BWEpTQU1QTEU7IHRoaXMgc2V0cyB0aGUKKwkgKiByZXF1aXJlZCBhbW91bnQgb2YgcGFkZGluZy4KKwkgKi8KKwkqb3V0cHV0X3B0ciArPSBjb2xvcmluZGV4X2NpW0dFVEpTQU1QTEUoKmlucHV0X3B0cikrZGl0aGVyW2NvbF9pbmRleF1dOworCWlucHV0X3B0ciArPSBuYzsKKwlvdXRwdXRfcHRyKys7CisJY29sX2luZGV4ID0gKGNvbF9pbmRleCArIDEpICYgT0RJVEhFUl9NQVNLOworICAgICAgfQorICAgIH0KKyAgICAvKiBBZHZhbmNlIHJvdyBpbmRleCBmb3IgbmV4dCByb3cgKi8KKyAgICByb3dfaW5kZXggPSAocm93X2luZGV4ICsgMSkgJiBPRElUSEVSX01BU0s7CisgICAgY3F1YW50aXplLT5yb3dfaW5kZXggPSByb3dfaW5kZXg7CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3F1YW50aXplM19vcmRfZGl0aGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKKwkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBGYXN0IHBhdGggZm9yIG91dF9jb2xvcl9jb21wb25lbnRzPT0zLCB3aXRoIG9yZGVyZWQgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIGludCBwaXhjb2RlOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB1dF9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB1dF9wdHI7CisgIEpTQU1QUk9XIGNvbG9yaW5kZXgwID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzBdOworICBKU0FNUFJPVyBjb2xvcmluZGV4MSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFsxXTsKKyAgSlNBTVBST1cgY29sb3JpbmRleDIgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMl07CisgIGludCAqIGRpdGhlcjA7CQkvKiBwb2ludHMgdG8gYWN0aXZlIHJvdyBvZiBkaXRoZXIgbWF0cml4ICovCisgIGludCAqIGRpdGhlcjE7CisgIGludCAqIGRpdGhlcjI7CisgIGludCByb3dfaW5kZXgsIGNvbF9pbmRleDsJLyogY3VycmVudCBpbmRleGVzIGludG8gZGl0aGVyIG1hdHJpeCAqLworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICByb3dfaW5kZXggPSBjcXVhbnRpemUtPnJvd19pbmRleDsKKyAgICBpbnB1dF9wdHIgPSBpbnB1dF9idWZbcm93XTsKKyAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGRpdGhlcjAgPSBjcXVhbnRpemUtPm9kaXRoZXJbMF1bcm93X2luZGV4XTsKKyAgICBkaXRoZXIxID0gY3F1YW50aXplLT5vZGl0aGVyWzFdW3Jvd19pbmRleF07CisgICAgZGl0aGVyMiA9IGNxdWFudGl6ZS0+b2RpdGhlclsyXVtyb3dfaW5kZXhdOworICAgIGNvbF9pbmRleCA9IDA7CisKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgcGl4Y29kZSAgPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgwW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCisJCQkJCWRpdGhlcjBbY29sX2luZGV4XV0pOworICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgxW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCisJCQkJCWRpdGhlcjFbY29sX2luZGV4XV0pOworICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgyW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCisJCQkJCWRpdGhlcjJbY29sX2luZGV4XV0pOworICAgICAgKm91dHB1dF9wdHIrKyA9IChKU0FNUExFKSBwaXhjb2RlOworICAgICAgY29sX2luZGV4ID0gKGNvbF9pbmRleCArIDEpICYgT0RJVEhFUl9NQVNLOworICAgIH0KKyAgICByb3dfaW5kZXggPSAocm93X2luZGV4ICsgMSkgJiBPRElUSEVSX01BU0s7CisgICAgY3F1YW50aXplLT5yb3dfaW5kZXggPSByb3dfaW5kZXg7CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3F1YW50aXplX2ZzX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKKy8qIEdlbmVyYWwgY2FzZSwgd2l0aCBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIExPQ0ZTRVJST1IgY3VyOwkvKiBjdXJyZW50IGVycm9yIG9yIHBpeGVsIHZhbHVlICovCisgIExPQ0ZTRVJST1IgYmVsb3dlcnI7CQkvKiBlcnJvciBmb3IgcGl4ZWwgYmVsb3cgY3VyICovCisgIExPQ0ZTRVJST1IgYnByZXZlcnI7CQkvKiBlcnJvciBmb3IgYmVsb3cvcHJldiBjb2wgKi8KKyAgTE9DRlNFUlJPUiBibmV4dGVycjsJCS8qIGVycm9yIGZvciBiZWxvdy9uZXh0IGNvbCAqLworICBMT0NGU0VSUk9SIGRlbHRhOworICByZWdpc3RlciBGU0VSUlBUUiBlcnJvcnB0cjsJLyogPT4gZnNlcnJvcnNbXSBhdCBjb2x1bW4gYmVmb3JlIGN1cnJlbnQgKi8KKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdXRfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdXRfcHRyOworICBKU0FNUFJPVyBjb2xvcmluZGV4X2NpOworICBKU0FNUFJPVyBjb2xvcm1hcF9jaTsKKyAgaW50IHBpeGNvZGU7CisgIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgaW50IGRpcjsJCQkvKiAxIGZvciBsZWZ0LXRvLXJpZ2h0LCAtMSBmb3IgcmlnaHQtdG8tbGVmdCAqLworICBpbnQgZGlybmM7CQkJLyogZGlyICogbmMgKi8KKyAgaW50IGNpOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgU0hJRlRfVEVNUFMKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIC8qIEluaXRpYWxpemUgb3V0cHV0IHZhbHVlcyB0byAwIHNvIGNhbiBwcm9jZXNzIGNvbXBvbmVudHMgc2VwYXJhdGVseSAqLworICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgb3V0cHV0X2J1Zltyb3ddLAorCSAgICAgIChzaXplX3QpICh3aWR0aCAqIFNJWkVPRihKU0FNUExFKSkpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7CisgICAgICBpbnB1dF9wdHIgPSBpbnB1dF9idWZbcm93XSArIGNpOworICAgICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbcm93XTsKKyAgICAgIGlmIChjcXVhbnRpemUtPm9uX29kZF9yb3cpIHsKKwkvKiB3b3JrIHJpZ2h0IHRvIGxlZnQgaW4gdGhpcyByb3cgKi8KKwlpbnB1dF9wdHIgKz0gKHdpZHRoLTEpICogbmM7IC8qIHNvIHBvaW50IHRvIHJpZ2h0bW9zdCBwaXhlbCAqLworCW91dHB1dF9wdHIgKz0gd2lkdGgtMTsKKwlkaXIgPSAtMTsKKwlkaXJuYyA9IC1uYzsKKwllcnJvcnB0ciA9IGNxdWFudGl6ZS0+ZnNlcnJvcnNbY2ldICsgKHdpZHRoKzEpOyAvKiA9PiBlbnRyeSBhZnRlciBsYXN0IGNvbHVtbiAqLworICAgICAgfSBlbHNlIHsKKwkvKiB3b3JrIGxlZnQgdG8gcmlnaHQgaW4gdGhpcyByb3cgKi8KKwlkaXIgPSAxOworCWRpcm5jID0gbmM7CisJZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzW2NpXTsgLyogPT4gZW50cnkgYmVmb3JlIGZpcnN0IGNvbHVtbiAqLworICAgICAgfQorICAgICAgY29sb3JpbmRleF9jaSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFtjaV07CisgICAgICBjb2xvcm1hcF9jaSA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXBbY2ldOworICAgICAgLyogUHJlc2V0IGVycm9yIHZhbHVlczogbm8gZXJyb3IgcHJvcGFnYXRlZCB0byBmaXJzdCBwaXhlbCBmcm9tIGxlZnQgKi8KKyAgICAgIGN1ciA9IDA7CisgICAgICAvKiBhbmQgbm8gZXJyb3IgcHJvcGFnYXRlZCB0byByb3cgYmVsb3cgeWV0ICovCisgICAgICBiZWxvd2VyciA9IGJwcmV2ZXJyID0gMDsKKworICAgICAgZm9yIChjb2wgPSB3aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKwkvKiBjdXIgaG9sZHMgdGhlIGVycm9yIHByb3BhZ2F0ZWQgZnJvbSB0aGUgcHJldmlvdXMgcGl4ZWwgb24gdGhlCisJICogY3VycmVudCBsaW5lLiAgQWRkIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUKKwkgKiB0byBmb3JtIHRoZSBjb21wbGV0ZSBlcnJvciBjb3JyZWN0aW9uIHRlcm0gZm9yIHRoaXMgcGl4ZWwsIGFuZAorCSAqIHJvdW5kIHRoZSBlcnJvciB0ZXJtICh3aGljaCBpcyBleHByZXNzZWQgKiAxNikgdG8gYW4gaW50ZWdlci4KKwkgKiBSSUdIVF9TSElGVCByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eSwgc28gYWRkaW5nIDggaXMgY29ycmVjdAorCSAqIGZvciBlaXRoZXIgc2lnbiBvZiB0aGUgZXJyb3IgdmFsdWUuCisJICogTm90ZTogZXJyb3JwdHIgcG9pbnRzIHRvICpwcmV2aW91cyogY29sdW1uJ3MgYXJyYXkgZW50cnkuCisJICovCisJY3VyID0gUklHSFRfU0hJRlQoY3VyICsgZXJyb3JwdHJbZGlyXSArIDgsIDQpOworCS8qIEZvcm0gcGl4ZWwgdmFsdWUgKyBlcnJvciwgYW5kIHJhbmdlLWxpbWl0IHRvIDAuLk1BWEpTQU1QTEUuCisJICogVGhlIG1heGltdW0gZXJyb3IgaXMgKy0gTUFYSlNBTVBMRTsgdGhpcyBzZXRzIHRoZSByZXF1aXJlZCBzaXplCisJICogb2YgdGhlIHJhbmdlX2xpbWl0IGFycmF5LgorCSAqLworCWN1ciArPSBHRVRKU0FNUExFKCppbnB1dF9wdHIpOworCWN1ciA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyXSk7CisJLyogU2VsZWN0IG91dHB1dCB2YWx1ZSwgYWNjdW11bGF0ZSBpbnRvIG91dHB1dCBjb2RlIGZvciB0aGlzIHBpeGVsICovCisJcGl4Y29kZSA9IEdFVEpTQU1QTEUoY29sb3JpbmRleF9jaVtjdXJdKTsKKwkqb3V0cHV0X3B0ciArPSAoSlNBTVBMRSkgcGl4Y29kZTsKKwkvKiBDb21wdXRlIGFjdHVhbCByZXByZXNlbnRhdGlvbiBlcnJvciBhdCB0aGlzIHBpeGVsICovCisJLyogTm90ZTogd2UgY2FuIGRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgaGF2ZSB0aGUgZmluYWwgKi8KKwkvKiBwaXhlbCBjb2RlLCBiZWNhdXNlIHRoZSBjb2xvcm1hcCBpcyBvcnRob2dvbmFsLiAqLworCWN1ciAtPSBHRVRKU0FNUExFKGNvbG9ybWFwX2NpW3BpeGNvZGVdKTsKKwkvKiBDb21wdXRlIGVycm9yIGZyYWN0aW9ucyB0byBiZSBwcm9wYWdhdGVkIHRvIGFkamFjZW50IHBpeGVscy4KKwkgKiBBZGQgdGhlc2UgaW50byB0aGUgcnVubmluZyBzdW1zLCBhbmQgc2ltdWx0YW5lb3VzbHkgc2hpZnQgdGhlCisJICogbmV4dC1saW5lIGVycm9yIHN1bXMgbGVmdCBieSAxIGNvbHVtbi4KKwkgKi8KKwlibmV4dGVyciA9IGN1cjsKKwlkZWx0YSA9IGN1ciAqIDI7CisJY3VyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDMgKi8KKwllcnJvcnB0clswXSA9IChGU0VSUk9SKSAoYnByZXZlcnIgKyBjdXIpOworCWN1ciArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA1ICovCisJYnByZXZlcnIgPSBiZWxvd2VyciArIGN1cjsKKwliZWxvd2VyciA9IGJuZXh0ZXJyOworCWN1ciArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA3ICovCisJLyogQXQgdGhpcyBwb2ludCBjdXIgY29udGFpbnMgdGhlIDcvMTYgZXJyb3IgdmFsdWUgdG8gYmUgcHJvcGFnYXRlZAorCSAqIHRvIHRoZSBuZXh0IHBpeGVsIG9uIHRoZSBjdXJyZW50IGxpbmUsIGFuZCBhbGwgdGhlIGVycm9ycyBmb3IgdGhlCisJICogbmV4dCBsaW5lIGhhdmUgYmVlbiBzaGlmdGVkIG92ZXIuIFdlIGFyZSB0aGVyZWZvcmUgcmVhZHkgdG8gbW92ZSBvbi4KKwkgKi8KKwlpbnB1dF9wdHIgKz0gZGlybmM7CS8qIGFkdmFuY2UgaW5wdXQgcHRyIHRvIG5leHQgY29sdW1uICovCisJb3V0cHV0X3B0ciArPSBkaXI7CS8qIGFkdmFuY2Ugb3V0cHV0IHB0ciB0byBuZXh0IGNvbHVtbiAqLworCWVycm9ycHRyICs9IGRpcjsJLyogYWR2YW5jZSBlcnJvcnB0ciB0byBjdXJyZW50IGNvbHVtbiAqLworICAgICAgfQorICAgICAgLyogUG9zdC1sb29wIGNsZWFudXA6IHdlIG11c3QgdW5sb2FkIHRoZSBmaW5hbCBlcnJvciB2YWx1ZSBpbnRvIHRoZQorICAgICAgICogZmluYWwgZnNlcnJvcnNbXSBlbnRyeS4gIE5vdGUgd2UgbmVlZCBub3QgdW5sb2FkIGJlbG93ZXJyIGJlY2F1c2UKKyAgICAgICAqIGl0IGlzIGZvciB0aGUgZHVtbXkgY29sdW1uIGJlZm9yZSBvciBhZnRlciB0aGUgYWN0dWFsIGFycmF5LgorICAgICAgICovCisgICAgICBlcnJvcnB0clswXSA9IChGU0VSUk9SKSBicHJldmVycjsgLyogdW5sb2FkIHByZXYgZXJyIGludG8gYXJyYXkgKi8KKyAgICB9CisgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gKGNxdWFudGl6ZS0+b25fb2RkX3JvdyA/IEZBTFNFIDogVFJVRSk7CisgIH0KK30KKworCisvKgorICogQWxsb2NhdGUgd29ya3NwYWNlIGZvciBGbG95ZC1TdGVpbmJlcmcgZXJyb3JzLgorICovCisKK0xPQ0FMKHZvaWQpCithbGxvY19mc193b3Jrc3BhY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHNpemVfdCBhcnJheXNpemU7CisgIGludCBpOworCisgIGFycmF5c2l6ZSA9IChzaXplX3QpICgoY2luZm8tPm91dHB1dF93aWR0aCArIDIpICogU0laRU9GKEZTRVJST1IpKTsKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7CisgICAgY3F1YW50aXplLT5mc2Vycm9yc1tpXSA9IChGU0VSUlBUUikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgYXJyYXlzaXplKTsKKyAgfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBvbmUtcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzXzFfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHNpemVfdCBhcnJheXNpemU7CisgIGludCBpOworCisgIC8qIEluc3RhbGwgbXkgY29sb3JtYXAuICovCisgIGNpbmZvLT5jb2xvcm1hcCA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXA7CisgIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IGNxdWFudGl6ZS0+c3ZfYWN0dWFsOworCisgIC8qIEluaXRpYWxpemUgZm9yIGRlc2lyZWQgZGl0aGVyaW5nIG1vZGUuICovCisgIHN3aXRjaCAoY2luZm8tPmRpdGhlcl9tb2RlKSB7CisgIGNhc2UgSkRJVEhFUl9OT05FOgorICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gY29sb3JfcXVhbnRpemUzOworICAgIGVsc2UKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gY29sb3JfcXVhbnRpemU7CisgICAgYnJlYWs7CisgIGNhc2UgSkRJVEhFUl9PUkRFUkVEOgorICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcXVhbnRpemUzX29yZF9kaXRoZXI7CisgICAgZWxzZQorICAgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBxdWFudGl6ZV9vcmRfZGl0aGVyOworICAgIGNxdWFudGl6ZS0+cm93X2luZGV4ID0gMDsJLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3Igb3JkZXJlZCBkaXRoZXIgKi8KKyAgICAvKiBJZiB1c2VyIGNoYW5nZWQgdG8gb3JkZXJlZCBkaXRoZXIgZnJvbSBhbm90aGVyIG1vZGUsCisgICAgICogd2UgbXVzdCByZWNyZWF0ZSB0aGUgY29sb3IgaW5kZXggdGFibGUgd2l0aCBwYWRkaW5nLgorICAgICAqIFRoaXMgd2lsbCBjb3N0IGV4dHJhIHNwYWNlLCBidXQgcHJvYmFibHkgaXNuJ3QgdmVyeSBsaWtlbHkuCisgICAgICovCisgICAgaWYgKCEgY3F1YW50aXplLT5pc19wYWRkZWQpCisgICAgICBjcmVhdGVfY29sb3JpbmRleChjaW5mbyk7CisgICAgLyogQ3JlYXRlIG9yZGVyZWQtZGl0aGVyIHRhYmxlcyBpZiB3ZSBkaWRuJ3QgYWxyZWFkeS4gKi8KKyAgICBpZiAoY3F1YW50aXplLT5vZGl0aGVyWzBdID09IE5VTEwpCisgICAgICBjcmVhdGVfb2RpdGhlcl90YWJsZXMoY2luZm8pOworICAgIGJyZWFrOworICBjYXNlIEpESVRIRVJfRlM6CisgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBxdWFudGl6ZV9mc19kaXRoZXI7CisgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gRkFMU0U7IC8qIGluaXRpYWxpemUgc3RhdGUgZm9yIEYtUyBkaXRoZXIgKi8KKyAgICAvKiBBbGxvY2F0ZSBGbG95ZC1TdGVpbmJlcmcgd29ya3NwYWNlIGlmIGRpZG4ndCBhbHJlYWR5LiAqLworICAgIGlmIChjcXVhbnRpemUtPmZzZXJyb3JzWzBdID09IE5VTEwpCisgICAgICBhbGxvY19mc193b3Jrc3BhY2UoY2luZm8pOworICAgIC8qIEluaXRpYWxpemUgdGhlIHByb3BhZ2F0ZWQgZXJyb3JzIHRvIHplcm8uICovCisgICAgYXJyYXlzaXplID0gKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKiBTSVpFT0YoRlNFUlJPUikpOworICAgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykKKyAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY3F1YW50aXplLT5mc2Vycm9yc1tpXSwgYXJyYXlzaXplKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzc18xX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrIGluIDEtcGFzcyBjYXNlICovCit9CisKKworLyoKKyAqIFN3aXRjaCB0byBhIG5ldyBleHRlcm5hbCBjb2xvcm1hcCBiZXR3ZWVuIG91dHB1dCBwYXNzZXMuCisgKiBTaG91bGRuJ3QgZ2V0IHRvIHRoaXMgbW9kdWxlIQorICovCisKK01FVEhPRERFRih2b2lkKQorbmV3X2NvbG9yX21hcF8xX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBFUlJFWElUKGNpbmZvLCBKRVJSX01PREVfQ0hBTkdFKTsKK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF8xcGFzc19xdWFudGl6ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplOworCisgIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2NxdWFudGl6ZXIpKTsKKyAgY2luZm8tPmNxdWFudGl6ZSA9IChzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKikgY3F1YW50aXplOworICBjcXVhbnRpemUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc18xX3F1YW50OworICBjcXVhbnRpemUtPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzXzFfcXVhbnQ7CisgIGNxdWFudGl6ZS0+cHViLm5ld19jb2xvcl9tYXAgPSBuZXdfY29sb3JfbWFwXzFfcXVhbnQ7CisgIGNxdWFudGl6ZS0+ZnNlcnJvcnNbMF0gPSBOVUxMOyAvKiBGbGFnIEZTIHdvcmtzcGFjZSBub3QgYWxsb2NhdGVkICovCisgIGNxdWFudGl6ZS0+b2RpdGhlclswXSA9IE5VTEw7CS8qIEFsc28gZmxhZyBvZGl0aGVyIGFycmF5cyBub3QgYWxsb2NhdGVkICovCisKKyAgLyogTWFrZSBzdXJlIG15IGludGVybmFsIGFycmF5cyB3b24ndCBvdmVyZmxvdyAqLworICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID4gTUFYX1FfQ09NUFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfQ09NUE9ORU5UUywgTUFYX1FfQ09NUFMpOworICAvKiBNYWtlIHN1cmUgY29sb3JtYXAgaW5kZXhlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgSlNBTVBMRXMgKi8KKyAgaWYgKGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPiAoTUFYSlNBTVBMRSsxKSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9NQU5ZX0NPTE9SUywgTUFYSlNBTVBMRSsxKTsKKworICAvKiBDcmVhdGUgdGhlIGNvbG9ybWFwIGFuZCBjb2xvciBpbmRleCB0YWJsZS4gKi8KKyAgY3JlYXRlX2NvbG9ybWFwKGNpbmZvKTsKKyAgY3JlYXRlX2NvbG9yaW5kZXgoY2luZm8pOworCisgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2Ugbm93IGlmIHJlcXVlc3RlZC4KKyAgICogV2UgZG8gdGhpcyBub3cgc2luY2UgaXQgaXMgRkFSIHN0b3JhZ2UgYW5kIG1heSBhZmZlY3QgdGhlIG1lbW9yeQorICAgKiBtYW5hZ2VyJ3Mgc3BhY2UgY2FsY3VsYXRpb25zLiAgSWYgdGhlIHVzZXIgY2hhbmdlcyB0byBGUyBkaXRoZXIKKyAgICogbW9kZSBpbiBhIGxhdGVyIHBhc3MsIHdlIHdpbGwgYWxsb2NhdGUgdGhlIHNwYWNlIHRoZW4sIGFuZCB3aWxsCisgICAqIHBvc3NpYmx5IG92ZXJydW4gdGhlIG1heF9tZW1vcnlfdG9fdXNlIHNldHRpbmcuCisgICAqLworICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfRlMpCisgICAgYWxsb2NfZnNfd29ya3NwYWNlKGNpbmZvKTsKK30KKworI2VuZGlmIC8qIFFVQU5UXzFQQVNTX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvanF1YW50Mi5jIGIvY29tbW9uL2pwZWcvanF1YW50Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjAxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vanBlZy9qcXVhbnQyLmMKQEAgLTAsMCArMSwxMzEwIEBACisvKgorICoganF1YW50Mi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAoY29sb3IgbWFwcGluZykgcm91dGluZXMuCisgKiBUaGVzZSByb3V0aW5lcyBwcm92aWRlIHNlbGVjdGlvbiBvZiBhIGN1c3RvbSBjb2xvciBtYXAgZm9yIGFuIGltYWdlLAorICogZm9sbG93ZWQgYnkgbWFwcGluZyBvZiB0aGUgaW1hZ2UgdG8gdGhhdCBjb2xvciBtYXAsIHdpdGggb3B0aW9uYWwKKyAqIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcuCisgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBqdXN0IHRoZSBzZWNvbmQgcGFzcyB0byBtYXAgdG8gYW4gYXJiaXRyYXJ5CisgKiBleHRlcm5hbGx5LWdpdmVuIGNvbG9yIG1hcC4KKyAqCisgKiBOb3RlOiBvcmRlcmVkIGRpdGhlcmluZyBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSB0aGVyZSBpc24ndCBhbnkgZmFzdAorICogd2F5IHRvIGNvbXB1dGUgaW50ZXJjb2xvciBkaXN0YW5jZXM7IGl0J3MgdW5jbGVhciB0aGF0IG9yZGVyZWQgZGl0aGVyJ3MKKyAqIGZ1bmRhbWVudGFsIGFzc3VtcHRpb25zIGV2ZW4gaG9sZCB3aXRoIGFuIGlycmVndWxhcmx5IHNwYWNlZCBjb2xvciBtYXAuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIHdlbGwta25vd24gSGVja2JlcnQgcGFyYWRpZ20gZm9yIGNvbG9yCisgKiBxdWFudGl6YXRpb24uICBNb3N0IG9mIHRoZSBpZGVhcyB1c2VkIGhlcmUgY2FuIGJlIHRyYWNlZCBiYWNrIHRvCisgKiBIZWNrYmVydCdzIHNlbWluYWwgcGFwZXIKKyAqICAgSGVja2JlcnQsIFBhdWwuICAiQ29sb3IgSW1hZ2UgUXVhbnRpemF0aW9uIGZvciBGcmFtZSBCdWZmZXIgRGlzcGxheSIsCisgKiAgIFByb2MuIFNJR0dSQVBIICc4MiwgQ29tcHV0ZXIgR3JhcGhpY3Mgdi4xNiAjMyAoSnVseSAxOTgyKSwgcHAgMjk3LTMwNC4KKyAqCisgKiBJbiB0aGUgZmlyc3QgcGFzcyBvdmVyIHRoZSBpbWFnZSwgd2UgYWNjdW11bGF0ZSBhIGhpc3RvZ3JhbSBzaG93aW5nIHRoZQorICogdXNhZ2UgY291bnQgb2YgZWFjaCBwb3NzaWJsZSBjb2xvci4gIFRvIGtlZXAgdGhlIGhpc3RvZ3JhbSB0byBhIHJlYXNvbmFibGUKKyAqIHNpemUsIHdlIHJlZHVjZSB0aGUgcHJlY2lzaW9uIG9mIHRoZSBpbnB1dDsgdHlwaWNhbCBwcmFjdGljZSBpcyB0byByZXRhaW4KKyAqIDUgb3IgNiBiaXRzIHBlciBjb2xvciwgc28gdGhhdCA4IG9yIDQgZGlmZmVyZW50IGlucHV0IHZhbHVlcyBhcmUgY291bnRlZAorICogaW4gdGhlIHNhbWUgaGlzdG9ncmFtIGNlbGwuCisgKgorICogTmV4dCwgdGhlIGNvbG9yLXNlbGVjdGlvbiBzdGVwIGJlZ2lucyB3aXRoIGEgYm94IHJlcHJlc2VudGluZyB0aGUgd2hvbGUKKyAqIGNvbG9yIHNwYWNlLCBhbmQgcmVwZWF0ZWRseSBzcGxpdHMgdGhlICJsYXJnZXN0IiByZW1haW5pbmcgYm94IHVudGlsIHdlCisgKiBoYXZlIGFzIG1hbnkgYm94ZXMgYXMgZGVzaXJlZCBjb2xvcnMuICBUaGVuIHRoZSBtZWFuIGNvbG9yIGluIGVhY2gKKyAqIHJlbWFpbmluZyBib3ggYmVjb21lcyBvbmUgb2YgdGhlIHBvc3NpYmxlIG91dHB1dCBjb2xvcnMuCisgKiAKKyAqIFRoZSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBpbWFnZSBtYXBzIGVhY2ggaW5wdXQgcGl4ZWwgdG8gdGhlIGNsb3Nlc3Qgb3V0cHV0CisgKiBjb2xvciAob3B0aW9uYWxseSBhZnRlciBhcHBseWluZyBhIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgY29ycmVjdGlvbikuCisgKiBUaGlzIG1hcHBpbmcgaXMgbG9naWNhbGx5IHRyaXZpYWwsIGJ1dCBtYWtpbmcgaXQgZ28gZmFzdCBlbm91Z2ggcmVxdWlyZXMKKyAqIGNvbnNpZGVyYWJsZSBjYXJlLgorICoKKyAqIEhlY2tiZXJ0LXN0eWxlIHF1YW50aXplcnMgdmFyeSBhIGdvb2QgZGVhbCBpbiB0aGVpciBwb2xpY2llcyBmb3IgY2hvb3NpbmcKKyAqIHRoZSAibGFyZ2VzdCIgYm94IGFuZCBkZWNpZGluZyB3aGVyZSB0byBjdXQgaXQuICBUaGUgcGFydGljdWxhciBwb2xpY2llcworICogdXNlZCBoZXJlIGhhdmUgcHJvdmVkIG91dCB3ZWxsIGluIGV4cGVyaW1lbnRhbCBjb21wYXJpc29ucywgYnV0IGJldHRlciBvbmVzCisgKiBtYXkgeWV0IGJlIGZvdW5kLgorICoKKyAqIEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIElKRyBjb2RlLCB0aGlzIG1vZHVsZSBxdWFudGl6ZWQgaW4gWUNiQ3IgY29sb3IKKyAqIHNwYWNlLCBwcm9jZXNzaW5nIHRoZSByYXcgdXBzYW1wbGVkIGRhdGEgd2l0aG91dCBhIGNvbG9yIGNvbnZlcnNpb24gc3RlcC4KKyAqIFRoaXMgYWxsb3dlZCB0aGUgY29sb3IgY29udmVyc2lvbiBtYXRoIHRvIGJlIGRvbmUgb25seSBvbmNlIHBlciBjb2xvcm1hcAorICogZW50cnksIG5vdCBvbmNlIHBlciBwaXhlbC4gIEhvd2V2ZXIsIHRoYXQgb3B0aW1pemF0aW9uIHByZWNsdWRlZCBvdGhlcgorICogdXNlZnVsIG9wdGltaXphdGlvbnMgKHN1Y2ggYXMgbWVyZ2luZyBjb2xvciBjb252ZXJzaW9uIHdpdGggdXBzYW1wbGluZykKKyAqIGFuZCBpdCBhbHNvIGludGVyZmVyZWQgd2l0aCBkZXNpcmVkIGNhcGFiaWxpdGllcyBzdWNoIGFzIHF1YW50aXppbmcgdG8gYW4KKyAqIGV4dGVybmFsbHktc3VwcGxpZWQgY29sb3JtYXAuICBXZSBoYXZlIHRoZXJlZm9yZSBhYmFuZG9uZWQgdGhhdCBhcHByb2FjaC4KKyAqIFRoZSBwcmVzZW50IGNvZGUgd29ya3MgaW4gdGhlIHBvc3QtY29udmVyc2lvbiBjb2xvciBzcGFjZSwgdHlwaWNhbGx5IFJHQi4KKyAqCisgKiBUbyBpbXByb3ZlIHRoZSB2aXN1YWwgcXVhbGl0eSBvZiB0aGUgcmVzdWx0cywgd2UgYWN0dWFsbHkgd29yayBpbiBzY2FsZWQKKyAqIFJHQiBzcGFjZSwgZ2l2aW5nIEcgZGlzdGFuY2VzIG1vcmUgd2VpZ2h0IHRoYW4gUiwgYW5kIFIgaW4gdHVybiBtb3JlIHRoYW4KKyAqIEIuICBUbyBkbyBldmVyeXRoaW5nIGluIGludGVnZXIgbWF0aCwgd2UgbXVzdCB1c2UgaW50ZWdlciBzY2FsZSBmYWN0b3JzLgorICogVGhlIDIvMy8xIHNjYWxlIGZhY3RvcnMgdXNlZCBoZXJlIGNvcnJlc3BvbmQgbG9vc2VseSB0byB0aGUgcmVsYXRpdmUKKyAqIHdlaWdodHMgb2YgdGhlIGNvbG9ycyBpbiB0aGUgTlRTQyBncmF5c2NhbGUgZXF1YXRpb24uCisgKiBJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBjb2RlIHRvIHF1YW50aXplIGEgbm9uLVJHQiBjb2xvciBzcGFjZSwgeW91J2xsCisgKiBwcm9iYWJseSBuZWVkIHRvIGNoYW5nZSB0aGVzZSBzY2FsZSBmYWN0b3JzLgorICovCisKKyNkZWZpbmUgUl9TQ0FMRSAyCQkvKiBzY2FsZSBSIGRpc3RhbmNlcyBieSB0aGlzIG11Y2ggKi8KKyNkZWZpbmUgR19TQ0FMRSAzCQkvKiBzY2FsZSBHIGRpc3RhbmNlcyBieSB0aGlzIG11Y2ggKi8KKyNkZWZpbmUgQl9TQ0FMRSAxCQkvKiBhbmQgQiBieSB0aGlzIG11Y2ggKi8KKworLyogUmVsYWJlbCBSL0cvQiBhcyBjb21wb25lbnRzIDAvMS8yLCByZXNwZWN0aW5nIHRoZSBSR0Igb3JkZXJpbmcgZGVmaW5lZAorICogaW4gam1vcmVjZmcuaC4gIEFzIHRoZSBjb2RlIHN0YW5kcywgaXQgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIFIsRyxCCisgKiBhbmQgQixHLFIgb3JkZXJzLiAgSWYgeW91IGRlZmluZSBzb21lIG90aGVyIHdlaXJkIG9yZGVyIGluIGptb3JlY2ZnLmgsCisgKiB5b3UnbGwgZ2V0IGNvbXBpbGUgZXJyb3JzIHVudGlsIHlvdSBleHRlbmQgdGhpcyBsb2dpYy4gIEluIHRoYXQgY2FzZQorICogeW91J2xsIHByb2JhYmx5IHdhbnQgdG8gdHdlYWsgdGhlIGhpc3RvZ3JhbSBzaXplcyB0b28uCisgKi8KKworI2lmIFJHQl9SRUQgPT0gMAorI2RlZmluZSBDMF9TQ0FMRSBSX1NDQUxFCisjZW5kaWYKKyNpZiBSR0JfQkxVRSA9PSAwCisjZGVmaW5lIEMwX1NDQUxFIEJfU0NBTEUKKyNlbmRpZgorI2lmIFJHQl9HUkVFTiA9PSAxCisjZGVmaW5lIEMxX1NDQUxFIEdfU0NBTEUKKyNlbmRpZgorI2lmIFJHQl9SRUQgPT0gMgorI2RlZmluZSBDMl9TQ0FMRSBSX1NDQUxFCisjZW5kaWYKKyNpZiBSR0JfQkxVRSA9PSAyCisjZGVmaW5lIEMyX1NDQUxFIEJfU0NBTEUKKyNlbmRpZgorCisKKy8qCisgKiBGaXJzdCB3ZSBoYXZlIHRoZSBoaXN0b2dyYW0gZGF0YSBzdHJ1Y3R1cmUgYW5kIHJvdXRpbmVzIGZvciBjcmVhdGluZyBpdC4KKyAqCisgKiBUaGUgbnVtYmVyIG9mIGJpdHMgb2YgcHJlY2lzaW9uIGNhbiBiZSBhZGp1c3RlZCBieSBjaGFuZ2luZyB0aGVzZSBzeW1ib2xzLgorICogV2UgcmVjb21tZW5kIGtlZXBpbmcgNiBiaXRzIGZvciBHIGFuZCA1IGVhY2ggZm9yIFIgYW5kIEIuCisgKiBJZiB5b3UgaGF2ZSBwbGVudHkgb2YgbWVtb3J5IGFuZCBjeWNsZXMsIDYgYml0cyBhbGwgYXJvdW5kIGdpdmVzIG1hcmdpbmFsbHkKKyAqIGJldHRlciByZXN1bHRzOyBpZiB5b3UgYXJlIHNob3J0IG9mIG1lbW9yeSwgNSBiaXRzIGFsbCBhcm91bmQgd2lsbCBzYXZlCisgKiBzb21lIHNwYWNlIGJ1dCBkZWdyYWRlIHRoZSByZXN1bHRzLgorICogVG8gbWFpbnRhaW4gYSBmdWxseSBhY2N1cmF0ZSBoaXN0b2dyYW0sIHdlJ2QgbmVlZCB0byBhbGxvY2F0ZSBhICJsb25nIgorICogKHByZWZlcmFibHkgdW5zaWduZWQgbG9uZykgZm9yIGVhY2ggY2VsbC4gIEluIHByYWN0aWNlIHRoaXMgaXMgb3ZlcmtpbGw7CisgKiB3ZSBjYW4gZ2V0IGJ5IHdpdGggMTYgYml0cyBwZXIgY2VsbC4gIEZldyBvZiB0aGUgY2VsbCBjb3VudHMgd2lsbCBvdmVyZmxvdywKKyAqIGFuZCBjbGFtcGluZyB0aG9zZSB0aGF0IGRvIG92ZXJmbG93IHRvIHRoZSBtYXhpbXVtIHZhbHVlIHdpbGwgZ2l2ZSBjbG9zZS0KKyAqIGVub3VnaCByZXN1bHRzLiAgVGhpcyByZWR1Y2VzIHRoZSByZWNvbW1lbmRlZCBoaXN0b2dyYW0gc2l6ZSBmcm9tIDI1NktiCisgKiB0byAxMjhLYiwgd2hpY2ggaXMgYSB1c2VmdWwgc2F2aW5ncyBvbiBQQy1jbGFzcyBtYWNoaW5lcy4KKyAqIChJbiB0aGUgc2Vjb25kIHBhc3MgdGhlIGhpc3RvZ3JhbSBzcGFjZSBpcyByZS11c2VkIGZvciBwaXhlbCBtYXBwaW5nIGRhdGE7CisgKiBpbiB0aGF0IGNhcGFjaXR5LCBlYWNoIGNlbGwgbXVzdCBiZSBhYmxlIHRvIHN0b3JlIHplcm8gdG8gdGhlIG51bWJlciBvZgorICogZGVzaXJlZCBjb2xvcnMuICAxNiBiaXRzL2NlbGwgaXMgcGxlbnR5IGZvciB0aGF0IHRvby4pCisgKiBTaW5jZSB0aGUgSlBFRyBjb2RlIGlzIGludGVuZGVkIHRvIHJ1biBpbiBzbWFsbCBtZW1vcnkgbW9kZWwgb24gODB4ODYKKyAqIG1hY2hpbmVzLCB3ZSBjYW4ndCBqdXN0IGFsbG9jYXRlIHRoZSBoaXN0b2dyYW0gaW4gb25lIGNodW5rLiAgSW5zdGVhZAorICogb2YgYSB0cnVlIDMtRCBhcnJheSwgd2UgdXNlIGEgcm93IG9mIHBvaW50ZXJzIHRvIDItRCBhcnJheXMuICBFYWNoCisgKiBwb2ludGVyIGNvcnJlc3BvbmRzIHRvIGEgQzAgdmFsdWUgKHR5cGljYWxseSAyXjUgPSAzMiBwb2ludGVycykgYW5kCisgKiBlYWNoIDItRCBhcnJheSBoYXMgMl42KjJeNSA9IDIwNDggb3IgMl42KjJeNiA9IDQwOTYgZW50cmllcy4gIE5vdGUgdGhhdAorICogb24gODB4ODYgbWFjaGluZXMsIHRoZSBwb2ludGVyIHJvdyBpcyBpbiBuZWFyIG1lbW9yeSBidXQgdGhlIGFjdHVhbAorICogYXJyYXlzIGFyZSBpbiBmYXIgbWVtb3J5IChzYW1lIGFycmFuZ2VtZW50IGFzIHdlIHVzZSBmb3IgaW1hZ2UgYXJyYXlzKS4KKyAqLworCisjZGVmaW5lIE1BWE5VTUNPTE9SUyAgKE1BWEpTQU1QTEUrMSkgLyogbWF4aW11bSBzaXplIG9mIGNvbG9ybWFwICovCisKKy8qIFRoZXNlIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBlaXRoZXIgUixHLEIgb3IgQixHLFIgY29sb3Igb3JkZXIsCisgKiBidXQgeW91IG1heSBub3QgbGlrZSB0aGUgcmVzdWx0cyBmb3Igb3RoZXIgY29sb3Igb3JkZXJzLgorICovCisjZGVmaW5lIEhJU1RfQzBfQklUUyAgNQkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gUi9CIGhpc3RvZ3JhbSAqLworI2RlZmluZSBISVNUX0MxX0JJVFMgIDYJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIEcgaGlzdG9ncmFtICovCisjZGVmaW5lIEhJU1RfQzJfQklUUyAgNQkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gQi9SIGhpc3RvZ3JhbSAqLworCisvKiBOdW1iZXIgb2YgZWxlbWVudHMgYWxvbmcgaGlzdG9ncmFtIGF4ZXMuICovCisjZGVmaW5lIEhJU1RfQzBfRUxFTVMgICgxPDxISVNUX0MwX0JJVFMpCisjZGVmaW5lIEhJU1RfQzFfRUxFTVMgICgxPDxISVNUX0MxX0JJVFMpCisjZGVmaW5lIEhJU1RfQzJfRUxFTVMgICgxPDxISVNUX0MyX0JJVFMpCisKKy8qIFRoZXNlIGFyZSB0aGUgYW1vdW50cyB0byBzaGlmdCBhbiBpbnB1dCB2YWx1ZSB0byBnZXQgYSBoaXN0b2dyYW0gaW5kZXguICovCisjZGVmaW5lIEMwX1NISUZUICAoQklUU19JTl9KU0FNUExFLUhJU1RfQzBfQklUUykKKyNkZWZpbmUgQzFfU0hJRlQgIChCSVRTX0lOX0pTQU1QTEUtSElTVF9DMV9CSVRTKQorI2RlZmluZSBDMl9TSElGVCAgKEJJVFNfSU5fSlNBTVBMRS1ISVNUX0MyX0JJVFMpCisKKwordHlwZWRlZiBVSU5UMTYgaGlzdGNlbGw7CS8qIGhpc3RvZ3JhbSBjZWxsOyBwcmVmZXIgYW4gdW5zaWduZWQgdHlwZSAqLworCit0eXBlZGVmIGhpc3RjZWxsIEZBUiAqIGhpc3RwdHI7CS8qIGZvciBwb2ludGVycyB0byBoaXN0b2dyYW0gY2VsbHMgKi8KKwordHlwZWRlZiBoaXN0Y2VsbCBoaXN0MWRbSElTVF9DMl9FTEVNU107IC8qIHR5cGVkZWZzIGZvciB0aGUgYXJyYXkgKi8KK3R5cGVkZWYgaGlzdDFkIEZBUiAqIGhpc3QyZDsJLyogdHlwZSBmb3IgdGhlIDJuZC1sZXZlbCBwb2ludGVycyAqLwordHlwZWRlZiBoaXN0MmQgKiBoaXN0M2Q7CS8qIHR5cGUgZm9yIHRvcC1sZXZlbCBwb2ludGVyICovCisKKworLyogRGVjbGFyYXRpb25zIGZvciBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nLgorICoKKyAqIEVycm9ycyBhcmUgYWNjdW11bGF0ZWQgaW50byB0aGUgYXJyYXkgZnNlcnJvcnNbXSwgYXQgYSByZXNvbHV0aW9uIG9mCisgKiAxLzE2dGggb2YgYSBwaXhlbCBjb3VudC4gIFRoZSBlcnJvciBhdCBhIGdpdmVuIHBpeGVsIGlzIHByb3BhZ2F0ZWQKKyAqIHRvIGl0cyBub3QteWV0LXByb2Nlc3NlZCBuZWlnaGJvcnMgdXNpbmcgdGhlIHN0YW5kYXJkIEYtUyBmcmFjdGlvbnMsCisgKgkJLi4uCShoZXJlKQk3LzE2CisgKgkJMy8xNgk1LzE2CTEvMTYKKyAqIFdlIHdvcmsgbGVmdC10by1yaWdodCBvbiBldmVuIHJvd3MsIHJpZ2h0LXRvLWxlZnQgb24gb2RkIHJvd3MuCisgKgorICogV2UgY2FuIGdldCBhd2F5IHdpdGggYSBzaW5nbGUgYXJyYXkgKGhvbGRpbmcgb25lIHJvdydzIHdvcnRoIG9mIGVycm9ycykKKyAqIGJ5IHVzaW5nIGl0IHRvIHN0b3JlIHRoZSBjdXJyZW50IHJvdydzIGVycm9ycyBhdCBwaXhlbCBjb2x1bW5zIG5vdCB5ZXQKKyAqIHByb2Nlc3NlZCwgYnV0IHRoZSBuZXh0IHJvdydzIGVycm9ycyBhdCBjb2x1bW5zIGFscmVhZHkgcHJvY2Vzc2VkLiAgV2UKKyAqIG5lZWQgb25seSBhIGZldyBleHRyYSB2YXJpYWJsZXMgdG8gaG9sZCB0aGUgZXJyb3JzIGltbWVkaWF0ZWx5IGFyb3VuZCB0aGUKKyAqIGN1cnJlbnQgY29sdW1uLiAgKElmIHdlIGFyZSBsdWNreSwgdGhvc2UgdmFyaWFibGVzIGFyZSBpbiByZWdpc3RlcnMsIGJ1dAorICogZXZlbiBpZiBub3QsIHRoZXkncmUgcHJvYmFibHkgY2hlYXBlciB0byBhY2Nlc3MgdGhhbiBhcnJheSBlbGVtZW50cyBhcmUuKQorICoKKyAqIFRoZSBmc2Vycm9yc1tdIGFycmF5IGhhcyAoI2NvbHVtbnMgKyAyKSBlbnRyaWVzOyB0aGUgZXh0cmEgZW50cnkgYXQKKyAqIGVhY2ggZW5kIHNhdmVzIHVzIGZyb20gc3BlY2lhbC1jYXNpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IHBpeGVscy4KKyAqIEVhY2ggZW50cnkgaXMgdGhyZWUgdmFsdWVzIGxvbmcsIG9uZSB2YWx1ZSBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCisgKgorICogTm90ZTogb24gYSB3aWRlIGltYWdlLCB3ZSBtaWdodCBub3QgaGF2ZSBlbm91Z2ggcm9vbSBpbiBhIFBDJ3MgbmVhciBkYXRhCisgKiBzZWdtZW50IHRvIGhvbGQgdGhlIGVycm9yIGFycmF5OyBzbyBpdCBpcyBhbGxvY2F0ZWQgd2l0aCBhbGxvY19sYXJnZS4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKK3R5cGVkZWYgSU5UMTYgRlNFUlJPUjsJCS8qIDE2IGJpdHMgc2hvdWxkIGJlIGVub3VnaCAqLwordHlwZWRlZiBpbnQgTE9DRlNFUlJPUjsJCS8qIHVzZSAnaW50JyBmb3IgY2FsY3VsYXRpb24gdGVtcHMgKi8KKyNlbHNlCit0eXBlZGVmIElOVDMyIEZTRVJST1I7CQkvKiBtYXkgbmVlZCBtb3JlIHRoYW4gMTYgYml0cyAqLwordHlwZWRlZiBJTlQzMiBMT0NGU0VSUk9SOwkvKiBiZSBzdXJlIGNhbGN1bGF0aW9uIHRlbXBzIGFyZSBiaWcgZW5vdWdoICovCisjZW5kaWYKKwordHlwZWRlZiBGU0VSUk9SIEZBUiAqRlNFUlJQVFI7CS8qIHBvaW50ZXIgdG8gZXJyb3IgYXJyYXkgKGluIEZBUiBzdG9yYWdlISkgKi8KKworCisvKiBQcml2YXRlIHN1Ym9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBTcGFjZSBmb3IgdGhlIGV2ZW50dWFsbHkgY3JlYXRlZCBjb2xvcm1hcCBpcyBzdGFzaGVkIGhlcmUgKi8KKyAgSlNBTVBBUlJBWSBzdl9jb2xvcm1hcDsJLyogY29sb3JtYXAgYWxsb2NhdGVkIGF0IGluaXQgdGltZSAqLworICBpbnQgZGVzaXJlZDsJCQkvKiBkZXNpcmVkICMgb2YgY29sb3JzID0gc2l6ZSBvZiBjb2xvcm1hcCAqLworCisgIC8qIFZhcmlhYmxlcyBmb3IgYWNjdW11bGF0aW5nIGltYWdlIHN0YXRpc3RpY3MgKi8KKyAgaGlzdDNkIGhpc3RvZ3JhbTsJCS8qIHBvaW50ZXIgdG8gdGhlIGhpc3RvZ3JhbSAqLworCisgIGJvb2xlYW4gbmVlZHNfemVyb2VkOwkJLyogVFJVRSBpZiBuZXh0IHBhc3MgbXVzdCB6ZXJvIGhpc3RvZ3JhbSAqLworCisgIC8qIFZhcmlhYmxlcyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLworICBGU0VSUlBUUiBmc2Vycm9yczsJCS8qIGFjY3VtdWxhdGVkIGVycm9ycyAqLworICBib29sZWFuIG9uX29kZF9yb3c7CQkvKiBmbGFnIHRvIHJlbWVtYmVyIHdoaWNoIHJvdyB3ZSBhcmUgb24gKi8KKyAgaW50ICogZXJyb3JfbGltaXRlcjsJCS8qIHRhYmxlIGZvciBjbGFtcGluZyB0aGUgYXBwbGllZCBlcnJvciAqLworfSBteV9jcXVhbnRpemVyOworCit0eXBlZGVmIG15X2NxdWFudGl6ZXIgKiBteV9jcXVhbnRpemVfcHRyOworCisKKy8qCisgKiBQcmVzY2FuIHNvbWUgcm93cyBvZiBwaXhlbHMuCisgKiBJbiB0aGlzIG1vZHVsZSB0aGUgcHJlc2NhbiBzaW1wbHkgdXBkYXRlcyB0aGUgaGlzdG9ncmFtLCB3aGljaCBoYXMgYmVlbgorICogaW5pdGlhbGl6ZWQgdG8gemVyb2VzIGJ5IHN0YXJ0X3Bhc3MuCisgKiBBbiBvdXRwdXRfYnVmIHBhcmFtZXRlciBpcyByZXF1aXJlZCBieSB0aGUgbWV0aG9kIHNpZ25hdHVyZSwgYnV0IG5vIGRhdGEKKyAqIGlzIGFjdHVhbGx5IG91dHB1dCAoaW4gZmFjdCB0aGUgYnVmZmVyIGNvbnRyb2xsZXIgaXMgcHJvYmFibHkgcGFzc2luZyBhCisgKiBOVUxMIHBvaW50ZXIpLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHJlc2Nhbl9xdWFudGl6ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJCSAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgaGlzdHB0ciBoaXN0cDsKKyAgcmVnaXN0ZXIgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICBwdHIgPSBpbnB1dF9idWZbcm93XTsKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgLyogZ2V0IHBpeGVsIHZhbHVlIGFuZCBpbmRleCBpbnRvIHRoZSBoaXN0b2dyYW0gKi8KKyAgICAgIGhpc3RwID0gJiBoaXN0b2dyYW1bR0VUSlNBTVBMRShwdHJbMF0pID4+IEMwX1NISUZUXQorCQkJIFtHRVRKU0FNUExFKHB0clsxXSkgPj4gQzFfU0hJRlRdCisJCQkgW0dFVEpTQU1QTEUocHRyWzJdKSA+PiBDMl9TSElGVF07CisgICAgICAvKiBpbmNyZW1lbnQsIGNoZWNrIGZvciBvdmVyZmxvdyBhbmQgdW5kbyBpbmNyZW1lbnQgaWYgc28uICovCisgICAgICBpZiAoKysoKmhpc3RwKSA8PSAwKQorCSgqaGlzdHApLS07CisgICAgICBwdHIgKz0gMzsKKyAgICB9CisgIH0KK30KKworCisvKgorICogTmV4dCB3ZSBoYXZlIHRoZSByZWFsbHkgaW50ZXJlc3Rpbmcgcm91dGluZXM6IHNlbGVjdGlvbiBvZiBhIGNvbG9ybWFwCisgKiBnaXZlbiB0aGUgY29tcGxldGVkIGhpc3RvZ3JhbS4KKyAqIFRoZXNlIHJvdXRpbmVzIHdvcmsgd2l0aCBhIGxpc3Qgb2YgImJveGVzIiwgZWFjaCByZXByZXNlbnRpbmcgYSByZWN0YW5ndWxhcgorICogc3Vic2V0IG9mIHRoZSBpbnB1dCBjb2xvciBzcGFjZSAodG8gaGlzdG9ncmFtIHByZWNpc2lvbikuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBUaGUgYm91bmRzIG9mIHRoZSBib3ggKGluY2x1c2l2ZSk7IGV4cHJlc3NlZCBhcyBoaXN0b2dyYW0gaW5kZXhlcyAqLworICBpbnQgYzBtaW4sIGMwbWF4OworICBpbnQgYzFtaW4sIGMxbWF4OworICBpbnQgYzJtaW4sIGMybWF4OworICAvKiBUaGUgdm9sdW1lIChhY3R1YWxseSAyLW5vcm0pIG9mIHRoZSBib3ggKi8KKyAgSU5UMzIgdm9sdW1lOworICAvKiBUaGUgbnVtYmVyIG9mIG5vbnplcm8gaGlzdG9ncmFtIGNlbGxzIHdpdGhpbiB0aGlzIGJveCAqLworICBsb25nIGNvbG9yY291bnQ7Cit9IGJveDsKKwordHlwZWRlZiBib3ggKiBib3hwdHI7CisKKworTE9DQUwoYm94cHRyKQorZmluZF9iaWdnZXN0X2NvbG9yX3BvcCAoYm94cHRyIGJveGxpc3QsIGludCBudW1ib3hlcykKKy8qIEZpbmQgdGhlIHNwbGl0dGFibGUgYm94IHdpdGggdGhlIGxhcmdlc3QgY29sb3IgcG9wdWxhdGlvbiAqLworLyogUmV0dXJucyBOVUxMIGlmIG5vIHNwbGl0dGFibGUgYm94ZXMgcmVtYWluICovCit7CisgIHJlZ2lzdGVyIGJveHB0ciBib3hwOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgbG9uZyBtYXhjID0gMDsKKyAgYm94cHRyIHdoaWNoID0gTlVMTDsKKyAgCisgIGZvciAoaSA9IDAsIGJveHAgPSBib3hsaXN0OyBpIDwgbnVtYm94ZXM7IGkrKywgYm94cCsrKSB7CisgICAgaWYgKGJveHAtPmNvbG9yY291bnQgPiBtYXhjICYmIGJveHAtPnZvbHVtZSA+IDApIHsKKyAgICAgIHdoaWNoID0gYm94cDsKKyAgICAgIG1heGMgPSBib3hwLT5jb2xvcmNvdW50OworICAgIH0KKyAgfQorICByZXR1cm4gd2hpY2g7Cit9CisKKworTE9DQUwoYm94cHRyKQorZmluZF9iaWdnZXN0X3ZvbHVtZSAoYm94cHRyIGJveGxpc3QsIGludCBudW1ib3hlcykKKy8qIEZpbmQgdGhlIHNwbGl0dGFibGUgYm94IHdpdGggdGhlIGxhcmdlc3QgKHNjYWxlZCkgdm9sdW1lICovCisvKiBSZXR1cm5zIE5VTEwgaWYgbm8gc3BsaXR0YWJsZSBib3hlcyByZW1haW4gKi8KK3sKKyAgcmVnaXN0ZXIgYm94cHRyIGJveHA7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBJTlQzMiBtYXh2ID0gMDsKKyAgYm94cHRyIHdoaWNoID0gTlVMTDsKKyAgCisgIGZvciAoaSA9IDAsIGJveHAgPSBib3hsaXN0OyBpIDwgbnVtYm94ZXM7IGkrKywgYm94cCsrKSB7CisgICAgaWYgKGJveHAtPnZvbHVtZSA+IG1heHYpIHsKKyAgICAgIHdoaWNoID0gYm94cDsKKyAgICAgIG1heHYgPSBib3hwLT52b2x1bWU7CisgICAgfQorICB9CisgIHJldHVybiB3aGljaDsKK30KKworCitMT0NBTCh2b2lkKQordXBkYXRlX2JveCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm94cHRyIGJveHApCisvKiBTaHJpbmsgdGhlIG1pbi9tYXggYm91bmRzIG9mIGEgYm94IHRvIGVuY2xvc2Ugb25seSBub256ZXJvIGVsZW1lbnRzLCAqLworLyogYW5kIHJlY29tcHV0ZSBpdHMgdm9sdW1lIGFuZCBwb3B1bGF0aW9uICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgaGlzdHB0ciBoaXN0cDsKKyAgaW50IGMwLGMxLGMyOworICBpbnQgYzBtaW4sYzBtYXgsYzFtaW4sYzFtYXgsYzJtaW4sYzJtYXg7CisgIElOVDMyIGRpc3QwLGRpc3QxLGRpc3QyOworICBsb25nIGNjb3VudDsKKyAgCisgIGMwbWluID0gYm94cC0+YzBtaW47ICBjMG1heCA9IGJveHAtPmMwbWF4OworICBjMW1pbiA9IGJveHAtPmMxbWluOyAgYzFtYXggPSBib3hwLT5jMW1heDsKKyAgYzJtaW4gPSBib3hwLT5jMm1pbjsgIGMybWF4ID0gYm94cC0+YzJtYXg7CisgIAorICBpZiAoYzBtYXggPiBjMG1pbikKKyAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKQorICAgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykgeworCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisJZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykKKwkgIGlmICgqaGlzdHArKyAhPSAwKSB7CisJICAgIGJveHAtPmMwbWluID0gYzBtaW4gPSBjMDsKKwkgICAgZ290byBoYXZlX2MwbWluOworCSAgfQorICAgICAgfQorIGhhdmVfYzBtaW46CisgIGlmIChjMG1heCA+IGMwbWluKQorICAgIGZvciAoYzAgPSBjMG1heDsgYzAgPj0gYzBtaW47IGMwLS0pCisgICAgICBmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrKSB7CisJaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MybWluXTsKKwlmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKQorCSAgaWYgKCpoaXN0cCsrICE9IDApIHsKKwkgICAgYm94cC0+YzBtYXggPSBjMG1heCA9IGMwOworCSAgICBnb3RvIGhhdmVfYzBtYXg7CisJICB9CisgICAgICB9CisgaGF2ZV9jMG1heDoKKyAgaWYgKGMxbWF4ID4gYzFtaW4pCisgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykKKyAgICAgIGZvciAoYzAgPSBjMG1pbjsgYzAgPD0gYzBtYXg7IGMwKyspIHsKKwloaXN0cCA9ICYgaGlzdG9ncmFtW2MwXVtjMV1bYzJtaW5dOworCWZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCisJICBpZiAoKmhpc3RwKysgIT0gMCkgeworCSAgICBib3hwLT5jMW1pbiA9IGMxbWluID0gYzE7CisJICAgIGdvdG8gaGF2ZV9jMW1pbjsKKwkgIH0KKyAgICAgIH0KKyBoYXZlX2MxbWluOgorICBpZiAoYzFtYXggPiBjMW1pbikKKyAgICBmb3IgKGMxID0gYzFtYXg7IGMxID49IGMxbWluOyBjMS0tKQorICAgICAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykgeworCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisJZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykKKwkgIGlmICgqaGlzdHArKyAhPSAwKSB7CisJICAgIGJveHAtPmMxbWF4ID0gYzFtYXggPSBjMTsKKwkgICAgZ290byBoYXZlX2MxbWF4OworCSAgfQorICAgICAgfQorIGhhdmVfYzFtYXg6CisgIGlmIChjMm1heCA+IGMybWluKQorICAgIGZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCisgICAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKSB7CisJaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFtaW5dW2MyXTsKKwlmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrLCBoaXN0cCArPSBISVNUX0MyX0VMRU1TKQorCSAgaWYgKCpoaXN0cCAhPSAwKSB7CisJICAgIGJveHAtPmMybWluID0gYzJtaW4gPSBjMjsKKwkgICAgZ290byBoYXZlX2MybWluOworCSAgfQorICAgICAgfQorIGhhdmVfYzJtaW46CisgIGlmIChjMm1heCA+IGMybWluKQorICAgIGZvciAoYzIgPSBjMm1heDsgYzIgPj0gYzJtaW47IGMyLS0pCisgICAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKSB7CisJaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFtaW5dW2MyXTsKKwlmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrLCBoaXN0cCArPSBISVNUX0MyX0VMRU1TKQorCSAgaWYgKCpoaXN0cCAhPSAwKSB7CisJICAgIGJveHAtPmMybWF4ID0gYzJtYXggPSBjMjsKKwkgICAgZ290byBoYXZlX2MybWF4OworCSAgfQorICAgICAgfQorIGhhdmVfYzJtYXg6CisKKyAgLyogVXBkYXRlIGJveCB2b2x1bWUuCisgICAqIFdlIHVzZSAyLW5vcm0gcmF0aGVyIHRoYW4gcmVhbCB2b2x1bWUgaGVyZTsgdGhpcyBiaWFzZXMgdGhlIG1ldGhvZAorICAgKiBhZ2FpbnN0IG1ha2luZyBsb25nIG5hcnJvdyBib3hlcywgYW5kIGl0IGhhcyB0aGUgc2lkZSBiZW5lZml0IHRoYXQKKyAgICogYSBib3ggaXMgc3BsaXR0YWJsZSBpZmYgbm9ybSA+IDAuCisgICAqIFNpbmNlIHRoZSBkaWZmZXJlbmNlcyBhcmUgZXhwcmVzc2VkIGluIGhpc3RvZ3JhbS1jZWxsIHVuaXRzLAorICAgKiB3ZSBoYXZlIHRvIHNoaWZ0IGJhY2sgdG8gSlNBTVBMRSB1bml0cyB0byBnZXQgY29uc2lzdGVudCBkaXN0YW5jZXM7CisgICAqIGFmdGVyIHdoaWNoLCB3ZSBzY2FsZSBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGRpc3RhbmNlIHNjYWxlIGZhY3RvcnMuCisgICAqLworICBkaXN0MCA9ICgoYzBtYXggLSBjMG1pbikgPDwgQzBfU0hJRlQpICogQzBfU0NBTEU7CisgIGRpc3QxID0gKChjMW1heCAtIGMxbWluKSA8PCBDMV9TSElGVCkgKiBDMV9TQ0FMRTsKKyAgZGlzdDIgPSAoKGMybWF4IC0gYzJtaW4pIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFOworICBib3hwLT52b2x1bWUgPSBkaXN0MCpkaXN0MCArIGRpc3QxKmRpc3QxICsgZGlzdDIqZGlzdDI7CisgIAorICAvKiBOb3cgc2NhbiByZW1haW5pbmcgdm9sdW1lIG9mIGJveCBhbmQgY29tcHV0ZSBwb3B1bGF0aW9uICovCisgIGNjb3VudCA9IDA7CisgIGZvciAoYzAgPSBjMG1pbjsgYzAgPD0gYzBtYXg7IGMwKyspCisgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykgeworICAgICAgaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MybWluXTsKKyAgICAgIGZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyssIGhpc3RwKyspCisJaWYgKCpoaXN0cCAhPSAwKSB7CisJICBjY291bnQrKzsKKwl9CisgICAgfQorICBib3hwLT5jb2xvcmNvdW50ID0gY2NvdW50OworfQorCisKK0xPQ0FMKGludCkKK21lZGlhbl9jdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJveHB0ciBib3hsaXN0LCBpbnQgbnVtYm94ZXMsCisJICAgIGludCBkZXNpcmVkX2NvbG9ycykKKy8qIFJlcGVhdGVkbHkgc2VsZWN0IGFuZCBzcGxpdCB0aGUgbGFyZ2VzdCBib3ggdW50aWwgd2UgaGF2ZSBlbm91Z2ggYm94ZXMgKi8KK3sKKyAgaW50IG4sbGI7CisgIGludCBjMCxjMSxjMixjbWF4OworICByZWdpc3RlciBib3hwdHIgYjEsYjI7CisKKyAgd2hpbGUgKG51bWJveGVzIDwgZGVzaXJlZF9jb2xvcnMpIHsKKyAgICAvKiBTZWxlY3QgYm94IHRvIHNwbGl0LgorICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBieSBwb3B1bGF0aW9uIGZvciBmaXJzdCBoYWxmLCB0aGVuIGJ5IHZvbHVtZS4KKyAgICAgKi8KKyAgICBpZiAobnVtYm94ZXMqMiA8PSBkZXNpcmVkX2NvbG9ycykgeworICAgICAgYjEgPSBmaW5kX2JpZ2dlc3RfY29sb3JfcG9wKGJveGxpc3QsIG51bWJveGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgYjEgPSBmaW5kX2JpZ2dlc3Rfdm9sdW1lKGJveGxpc3QsIG51bWJveGVzKTsKKyAgICB9CisgICAgaWYgKGIxID09IE5VTEwpCQkvKiBubyBzcGxpdHRhYmxlIGJveGVzIGxlZnQhICovCisgICAgICBicmVhazsKKyAgICBiMiA9ICZib3hsaXN0W251bWJveGVzXTsJLyogd2hlcmUgbmV3IGJveCB3aWxsIGdvICovCisgICAgLyogQ29weSB0aGUgY29sb3IgYm91bmRzIHRvIHRoZSBuZXcgYm94LiAqLworICAgIGIyLT5jMG1heCA9IGIxLT5jMG1heDsgYjItPmMxbWF4ID0gYjEtPmMxbWF4OyBiMi0+YzJtYXggPSBiMS0+YzJtYXg7CisgICAgYjItPmMwbWluID0gYjEtPmMwbWluOyBiMi0+YzFtaW4gPSBiMS0+YzFtaW47IGIyLT5jMm1pbiA9IGIxLT5jMm1pbjsKKyAgICAvKiBDaG9vc2Ugd2hpY2ggYXhpcyB0byBzcGxpdCB0aGUgYm94IG9uLgorICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBsb25nZXN0IHNjYWxlZCBheGlzLgorICAgICAqIFNlZSBub3RlcyBpbiB1cGRhdGVfYm94IGFib3V0IHNjYWxpbmcgZGlzdGFuY2VzLgorICAgICAqLworICAgIGMwID0gKChiMS0+YzBtYXggLSBiMS0+YzBtaW4pIDw8IEMwX1NISUZUKSAqIEMwX1NDQUxFOworICAgIGMxID0gKChiMS0+YzFtYXggLSBiMS0+YzFtaW4pIDw8IEMxX1NISUZUKSAqIEMxX1NDQUxFOworICAgIGMyID0gKChiMS0+YzJtYXggLSBiMS0+YzJtaW4pIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFOworICAgIC8qIFdlIHdhbnQgdG8gYnJlYWsgYW55IHRpZXMgaW4gZmF2b3Igb2YgZ3JlZW4sIHRoZW4gcmVkLCBibHVlIGxhc3QuCisgICAgICogVGhpcyBjb2RlIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGZvciBSLEcsQiBvciBCLEcsUiBjb2xvciBvcmRlcnMgb25seS4KKyAgICAgKi8KKyNpZiBSR0JfUkVEID09IDAKKyAgICBjbWF4ID0gYzE7IG4gPSAxOworICAgIGlmIChjMCA+IGNtYXgpIHsgY21heCA9IGMwOyBuID0gMDsgfQorICAgIGlmIChjMiA+IGNtYXgpIHsgbiA9IDI7IH0KKyNlbHNlCisgICAgY21heCA9IGMxOyBuID0gMTsKKyAgICBpZiAoYzIgPiBjbWF4KSB7IGNtYXggPSBjMjsgbiA9IDI7IH0KKyAgICBpZiAoYzAgPiBjbWF4KSB7IG4gPSAwOyB9CisjZW5kaWYKKyAgICAvKiBDaG9vc2Ugc3BsaXQgcG9pbnQgYWxvbmcgc2VsZWN0ZWQgYXhpcywgYW5kIHVwZGF0ZSBib3ggYm91bmRzLgorICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBzcGxpdCBhdCBoYWxmd2F5IHBvaW50LgorICAgICAqIChTaW5jZSB0aGUgYm94IGhhcyBiZWVuIHNocnVuayB0byBtaW5pbXVtIHZvbHVtZSwKKyAgICAgKiBhbnkgc3BsaXQgd2lsbCBwcm9kdWNlIHR3byBub25lbXB0eSBzdWJib3hlcy4pCisgICAgICogTm90ZSB0aGF0IGxiIHZhbHVlIGlzIG1heCBmb3IgbG93ZXIgYm94LCBzbyBtdXN0IGJlIDwgb2xkIG1heC4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKG4pIHsKKyAgICBjYXNlIDA6CisgICAgICBsYiA9IChiMS0+YzBtYXggKyBiMS0+YzBtaW4pIC8gMjsKKyAgICAgIGIxLT5jMG1heCA9IGxiOworICAgICAgYjItPmMwbWluID0gbGIrMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGxiID0gKGIxLT5jMW1heCArIGIxLT5jMW1pbikgLyAyOworICAgICAgYjEtPmMxbWF4ID0gbGI7CisgICAgICBiMi0+YzFtaW4gPSBsYisxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbGIgPSAoYjEtPmMybWF4ICsgYjEtPmMybWluKSAvIDI7CisgICAgICBiMS0+YzJtYXggPSBsYjsKKyAgICAgIGIyLT5jMm1pbiA9IGxiKzE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLyogVXBkYXRlIHN0YXRzIGZvciBib3hlcyAqLworICAgIHVwZGF0ZV9ib3goY2luZm8sIGIxKTsKKyAgICB1cGRhdGVfYm94KGNpbmZvLCBiMik7CisgICAgbnVtYm94ZXMrKzsKKyAgfQorICByZXR1cm4gbnVtYm94ZXM7Cit9CisKKworTE9DQUwodm9pZCkKK2NvbXB1dGVfY29sb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJveHB0ciBib3hwLCBpbnQgaWNvbG9yKQorLyogQ29tcHV0ZSByZXByZXNlbnRhdGl2ZSBjb2xvciBmb3IgYSBib3gsIHB1dCBpdCBpbiBjb2xvcm1hcFtpY29sb3JdICovCit7CisgIC8qIEN1cnJlbnQgYWxnb3JpdGhtOiBtZWFuIHdlaWdodGVkIGJ5IHBpeGVscyAobm90IGNvbG9ycykgKi8KKyAgLyogTm90ZSBpdCBpcyBpbXBvcnRhbnQgdG8gZ2V0IHRoZSByb3VuZGluZyBjb3JyZWN0ISAqLworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBoaXN0M2QgaGlzdG9ncmFtID0gY3F1YW50aXplLT5oaXN0b2dyYW07CisgIGhpc3RwdHIgaGlzdHA7CisgIGludCBjMCxjMSxjMjsKKyAgaW50IGMwbWluLGMwbWF4LGMxbWluLGMxbWF4LGMybWluLGMybWF4OworICBsb25nIGNvdW50OworICBsb25nIHRvdGFsID0gMDsKKyAgbG9uZyBjMHRvdGFsID0gMDsKKyAgbG9uZyBjMXRvdGFsID0gMDsKKyAgbG9uZyBjMnRvdGFsID0gMDsKKyAgCisgIGMwbWluID0gYm94cC0+YzBtaW47ICBjMG1heCA9IGJveHAtPmMwbWF4OworICBjMW1pbiA9IGJveHAtPmMxbWluOyAgYzFtYXggPSBib3hwLT5jMW1heDsKKyAgYzJtaW4gPSBib3hwLT5jMm1pbjsgIGMybWF4ID0gYm94cC0+YzJtYXg7CisgIAorICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKQorICAgIGZvciAoYzEgPSBjMW1pbjsgYzEgPD0gYzFtYXg7IGMxKyspIHsKKyAgICAgIGhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisgICAgICBmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKSB7CisJaWYgKChjb3VudCA9ICpoaXN0cCsrKSAhPSAwKSB7CisJICB0b3RhbCArPSBjb3VudDsKKwkgIGMwdG90YWwgKz0gKChjMCA8PCBDMF9TSElGVCkgKyAoKDE8PEMwX1NISUZUKT4+MSkpICogY291bnQ7CisJICBjMXRvdGFsICs9ICgoYzEgPDwgQzFfU0hJRlQpICsgKCgxPDxDMV9TSElGVCk+PjEpKSAqIGNvdW50OworCSAgYzJ0b3RhbCArPSAoKGMyIDw8IEMyX1NISUZUKSArICgoMTw8QzJfU0hJRlQpPj4xKSkgKiBjb3VudDsKKwl9CisgICAgICB9CisgICAgfQorICAKKyAgY2luZm8tPmNvbG9ybWFwWzBdW2ljb2xvcl0gPSAoSlNBTVBMRSkgKChjMHRvdGFsICsgKHRvdGFsPj4xKSkgLyB0b3RhbCk7CisgIGNpbmZvLT5jb2xvcm1hcFsxXVtpY29sb3JdID0gKEpTQU1QTEUpICgoYzF0b3RhbCArICh0b3RhbD4+MSkpIC8gdG90YWwpOworICBjaW5mby0+Y29sb3JtYXBbMl1baWNvbG9yXSA9IChKU0FNUExFKSAoKGMydG90YWwgKyAodG90YWw+PjEpKSAvIHRvdGFsKTsKK30KKworCitMT0NBTCh2b2lkKQorc2VsZWN0X2NvbG9ycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWRfY29sb3JzKQorLyogTWFzdGVyIHJvdXRpbmUgZm9yIGNvbG9yIHNlbGVjdGlvbiAqLworeworICBib3hwdHIgYm94bGlzdDsKKyAgaW50IG51bWJveGVzOworICBpbnQgaTsKKworICAvKiBBbGxvY2F0ZSB3b3Jrc3BhY2UgZm9yIGJveCBsaXN0ICovCisgIGJveGxpc3QgPSAoYm94cHRyKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGRlc2lyZWRfY29sb3JzICogU0laRU9GKGJveCkpOworICAvKiBJbml0aWFsaXplIG9uZSBib3ggY29udGFpbmluZyB3aG9sZSBzcGFjZSAqLworICBudW1ib3hlcyA9IDE7CisgIGJveGxpc3RbMF0uYzBtaW4gPSAwOworICBib3hsaXN0WzBdLmMwbWF4ID0gTUFYSlNBTVBMRSA+PiBDMF9TSElGVDsKKyAgYm94bGlzdFswXS5jMW1pbiA9IDA7CisgIGJveGxpc3RbMF0uYzFtYXggPSBNQVhKU0FNUExFID4+IEMxX1NISUZUOworICBib3hsaXN0WzBdLmMybWluID0gMDsKKyAgYm94bGlzdFswXS5jMm1heCA9IE1BWEpTQU1QTEUgPj4gQzJfU0hJRlQ7CisgIC8qIFNocmluayBpdCB0byBhY3R1YWxseS11c2VkIHZvbHVtZSBhbmQgc2V0IGl0cyBzdGF0aXN0aWNzICovCisgIHVwZGF0ZV9ib3goY2luZm8sICYgYm94bGlzdFswXSk7CisgIC8qIFBlcmZvcm0gbWVkaWFuLWN1dCB0byBwcm9kdWNlIGZpbmFsIGJveCBsaXN0ICovCisgIG51bWJveGVzID0gbWVkaWFuX2N1dChjaW5mbywgYm94bGlzdCwgbnVtYm94ZXMsIGRlc2lyZWRfY29sb3JzKTsKKyAgLyogQ29tcHV0ZSB0aGUgcmVwcmVzZW50YXRpdmUgY29sb3IgZm9yIGVhY2ggYm94LCBmaWxsIGNvbG9ybWFwICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1ib3hlczsgaSsrKQorICAgIGNvbXB1dGVfY29sb3IoY2luZm8sICYgYm94bGlzdFtpXSwgaSk7CisgIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IG51bWJveGVzOworICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19RVUFOVF9TRUxFQ1RFRCwgbnVtYm94ZXMpOworfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggdGhlIHRpbWUtY3JpdGljYWwgdGFzayBvZiBtYXBwaW5nIGlucHV0CisgKiBjb2xvcnMgdG8gdGhlIG5lYXJlc3QgY29sb3IgaW4gdGhlIHNlbGVjdGVkIGNvbG9ybWFwLgorICoKKyAqIFdlIHJlLXVzZSB0aGUgaGlzdG9ncmFtIHNwYWNlIGFzIGFuICJpbnZlcnNlIGNvbG9yIG1hcCIsIGVzc2VudGlhbGx5IGEKKyAqIGNhY2hlIGZvciB0aGUgcmVzdWx0cyBvZiBuZWFyZXN0LWNvbG9yIHNlYXJjaGVzLiAgQWxsIGNvbG9ycyB3aXRoaW4gYQorICogaGlzdG9ncmFtIGNlbGwgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIHNhbWUgY29sb3JtYXAgZW50cnksIG5hbWVseSB0aGUgb25lCisgKiBjbG9zZXN0IHRvIHRoZSBjZWxsJ3MgY2VudGVyLiAgVGhpcyBtYXkgbm90IGJlIHF1aXRlIHRoZSBjbG9zZXN0IGVudHJ5IHRvCisgKiB0aGUgYWN0dWFsIGlucHV0IGNvbG9yLCBidXQgaXQncyBhbG1vc3QgYXMgZ29vZC4gIEEgemVybyBpbiB0aGUgY2FjaGUKKyAqIGluZGljYXRlcyB3ZSBoYXZlbid0IGZvdW5kIHRoZSBuZWFyZXN0IGNvbG9yIGZvciB0aGF0IGNlbGwgeWV0OyB0aGUgYXJyYXkKKyAqIGlzIGNsZWFyZWQgdG8gemVyb2VzIGJlZm9yZSBzdGFydGluZyB0aGUgbWFwcGluZyBwYXNzLiAgV2hlbiB3ZSBmaW5kIHRoZQorICogbmVhcmVzdCBjb2xvciBmb3IgYSBjZWxsLCBpdHMgY29sb3JtYXAgaW5kZXggcGx1cyBvbmUgaXMgcmVjb3JkZWQgaW4gdGhlCisgKiBjYWNoZSBmb3IgZnV0dXJlIHVzZS4gIFRoZSBwYXNzMiBzY2FubmluZyByb3V0aW5lcyBjYWxsIGZpbGxfaW52ZXJzZV9jbWFwCisgKiB3aGVuIHRoZXkgbmVlZCB0byB1c2UgYW4gdW5maWxsZWQgZW50cnkgaW4gdGhlIGNhY2hlLgorICoKKyAqIE91ciBtZXRob2Qgb2YgZWZmaWNpZW50bHkgZmluZGluZyBuZWFyZXN0IGNvbG9ycyBpcyBiYXNlZCBvbiB0aGUgImxvY2FsbHkKKyAqIHNvcnRlZCBzZWFyY2giIGlkZWEgZGVzY3JpYmVkIGJ5IEhlY2tiZXJ0IGFuZCBvbiB0aGUgaW5jcmVtZW50YWwgZGlzdGFuY2UKKyAqIGNhbGN1bGF0aW9uIGRlc2NyaWJlZCBieSBTcGVuY2VyIFcuIFRob21hcyBpbiBjaGFwdGVyIElJSS4xIG9mIEdyYXBoaWNzCisgKiBHZW1zIElJIChKYW1lcyBBcnZvLCBlZC4gIEFjYWRlbWljIFByZXNzLCAxOTkxKS4gIFRob21hcyBwb2ludHMgb3V0IHRoYXQKKyAqIHRoZSBkaXN0YW5jZXMgZnJvbSBhIGdpdmVuIGNvbG9ybWFwIGVudHJ5IHRvIGVhY2ggY2VsbCBvZiB0aGUgaGlzdG9ncmFtIGNhbgorICogYmUgY29tcHV0ZWQgcXVpY2tseSB1c2luZyBhbiBpbmNyZW1lbnRhbCBtZXRob2Q6IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisgKiBkaXN0YW5jZXMgdG8gYWRqYWNlbnQgY2VsbHMgdGhlbXNlbHZlcyBkaWZmZXIgYnkgYSBjb25zdGFudC4gIFRoaXMgYWxsb3dzIGEKKyAqIGZhaXJseSBmYXN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSAiYnJ1dGUgZm9yY2UiIGFwcHJvYWNoIG9mIGNvbXB1dGluZyB0aGUKKyAqIGRpc3RhbmNlIGZyb20gZXZlcnkgY29sb3JtYXAgZW50cnkgdG8gZXZlcnkgaGlzdG9ncmFtIGNlbGwuICBVbmZvcnR1bmF0ZWx5LAorICogaXQgbmVlZHMgYSB3b3JrIGFycmF5IHRvIGhvbGQgdGhlIGJlc3QtZGlzdGFuY2Utc28tZmFyIGZvciBlYWNoIGhpc3RvZ3JhbQorICogY2VsbCAoYmVjYXVzZSB0aGUgaW5uZXIgbG9vcCBoYXMgdG8gYmUgb3ZlciBjZWxscywgbm90IGNvbG9ybWFwIGVudHJpZXMpLgorICogVGhlIHdvcmsgYXJyYXkgZWxlbWVudHMgaGF2ZSB0byBiZSBJTlQzMnMsIHNvIHRoZSB3b3JrIGFycmF5IHdvdWxkIG5lZWQKKyAqIDI1NktiIGF0IG91ciByZWNvbW1lbmRlZCBwcmVjaXNpb24uICBUaGlzIGlzIG5vdCBmZWFzaWJsZSBpbiBET1MgbWFjaGluZXMuCisgKgorICogVG8gZ2V0IGFyb3VuZCB0aGVzZSBwcm9ibGVtcywgd2UgYXBwbHkgVGhvbWFzJyBtZXRob2QgdG8gY29tcHV0ZSB0aGUKKyAqIG5lYXJlc3QgY29sb3JzIGZvciBvbmx5IHRoZSBjZWxscyB3aXRoaW4gYSBzbWFsbCBzdWJib3ggb2YgdGhlIGhpc3RvZ3JhbS4KKyAqIFRoZSB3b3JrIGFycmF5IG5lZWQgYmUgb25seSBhcyBiaWcgYXMgdGhlIHN1YmJveCwgc28gdGhlIG1lbW9yeSB1c2FnZQorICogcHJvYmxlbSBpcyBzb2x2ZWQuICBGdXJ0aGVybW9yZSwgd2UgbmVlZCBub3QgZmlsbCBzdWJib3hlcyB0aGF0IGFyZSBuZXZlcgorICogcmVmZXJlbmNlZCBpbiBwYXNzMjsgbWFueSBpbWFnZXMgdXNlIG9ubHkgcGFydCBvZiB0aGUgY29sb3IgZ2FtdXQsIHNvIGEKKyAqIGZhaXIgYW1vdW50IG9mIHdvcmsgaXMgc2F2ZWQuICBBbiBhZGRpdGlvbmFsIGFkdmFudGFnZSBvZiB0aGlzCisgKiBhcHByb2FjaCBpcyB0aGF0IHdlIGNhbiBhcHBseSBIZWNrYmVydCdzIGxvY2FsaXR5IGNyaXRlcmlvbiB0byBxdWlja2x5CisgKiBlbGltaW5hdGUgY29sb3JtYXAgZW50cmllcyB0aGF0IGFyZSBmYXIgYXdheSBmcm9tIHRoZSBzdWJib3g7IHR5cGljYWxseQorICogdGhyZWUtZm91cnRocyBvZiB0aGUgY29sb3JtYXAgZW50cmllcyBhcmUgcmVqZWN0ZWQgYnkgSGVja2JlcnQncyBjcml0ZXJpb24sCisgKiBhbmQgd2UgbmVlZCBub3QgY29tcHV0ZSB0aGVpciBkaXN0YW5jZXMgdG8gaW5kaXZpZHVhbCBjZWxscyBpbiB0aGUgc3ViYm94LgorICogVGhlIHNwZWVkIG9mIHRoaXMgYXBwcm9hY2ggaXMgaGVhdmlseSBpbmZsdWVuY2VkIGJ5IHRoZSBzdWJib3ggc2l6ZTogdG9vCisgKiBzbWFsbCBtZWFucyB0b28gbXVjaCBvdmVyaGVhZCwgdG9vIGJpZyBsb3NlcyBiZWNhdXNlIEhlY2tiZXJ0J3MgY3JpdGVyaW9uCisgKiBjYW4ndCBlbGltaW5hdGUgYXMgbWFueSBjb2xvcm1hcCBlbnRyaWVzLiAgRW1waXJpY2FsbHkgdGhlIGJlc3Qgc3ViYm94CisgKiBzaXplIHNlZW1zIHRvIGJlIGFib3V0IDEvNTEydGggb2YgdGhlIGhpc3RvZ3JhbSAoMS84dGggaW4gZWFjaCBkaXJlY3Rpb24pLgorICoKKyAqIFRob21hcycgYXJ0aWNsZSBhbHNvIGRlc2NyaWJlcyBhIHJlZmluZWQgbWV0aG9kIHdoaWNoIGlzIGFzeW1wdG90aWNhbGx5CisgKiBmYXN0ZXIgdGhhbiB0aGUgYnJ1dGUtZm9yY2UgbWV0aG9kLCBidXQgaXQgaXMgYWxzbyBmYXIgbW9yZSBjb21wbGV4IGFuZAorICogY2Fubm90IGVmZmljaWVudGx5IGJlIGFwcGxpZWQgdG8gc21hbGwgc3ViYm94ZXMuICBJdCBpcyB0aGVyZWZvcmUgbm90CisgKiB1c2VmdWwgZm9yIHByb2dyYW1zIGludGVuZGVkIHRvIGJlIHBvcnRhYmxlIHRvIERPUyBtYWNoaW5lcy4gIE9uIG1hY2hpbmVzCisgKiB3aXRoIHBsZW50eSBvZiBtZW1vcnksIGZpbGxpbmcgdGhlIHdob2xlIGhpc3RvZ3JhbSBpbiBvbmUgc2hvdCB3aXRoIFRob21hcycKKyAqIHJlZmluZWQgbWV0aG9kIG1pZ2h0IGJlIGZhc3RlciB0aGFuIHRoZSBwcmVzZW50IGNvZGUgLS0tIGJ1dCB0aGVuIGFnYWluLAorICogaXQgbWlnaHQgbm90IGJlIGFueSBmYXN0ZXIsIGFuZCBpdCdzIGNlcnRhaW5seSBtb3JlIGNvbXBsaWNhdGVkLgorICovCisKKworLyogbG9nMihoaXN0b2dyYW0gY2VsbHMgaW4gdXBkYXRlIGJveCkgZm9yIGVhY2ggYXhpczsgdGhpcyBjYW4gYmUgYWRqdXN0ZWQgKi8KKyNkZWZpbmUgQk9YX0MwX0xPRyAgKEhJU1RfQzBfQklUUy0zKQorI2RlZmluZSBCT1hfQzFfTE9HICAoSElTVF9DMV9CSVRTLTMpCisjZGVmaW5lIEJPWF9DMl9MT0cgIChISVNUX0MyX0JJVFMtMykKKworI2RlZmluZSBCT1hfQzBfRUxFTVMgICgxPDxCT1hfQzBfTE9HKSAvKiAjIG9mIGhpc3QgY2VsbHMgaW4gdXBkYXRlIGJveCAqLworI2RlZmluZSBCT1hfQzFfRUxFTVMgICgxPDxCT1hfQzFfTE9HKQorI2RlZmluZSBCT1hfQzJfRUxFTVMgICgxPDxCT1hfQzJfTE9HKQorCisjZGVmaW5lIEJPWF9DMF9TSElGVCAgKEMwX1NISUZUICsgQk9YX0MwX0xPRykKKyNkZWZpbmUgQk9YX0MxX1NISUZUICAoQzFfU0hJRlQgKyBCT1hfQzFfTE9HKQorI2RlZmluZSBCT1hfQzJfU0hJRlQgIChDMl9TSElGVCArIEJPWF9DMl9MT0cpCisKKworLyoKKyAqIFRoZSBuZXh0IHRocmVlIHJvdXRpbmVzIGltcGxlbWVudCBpbnZlcnNlIGNvbG9ybWFwIGZpbGxpbmcuICBUaGV5IGNvdWxkCisgKiBhbGwgYmUgZm9sZGVkIGludG8gb25lIGJpZyByb3V0aW5lLCBidXQgc3BsaXR0aW5nIHRoZW0gdXAgdGhpcyB3YXkgc2F2ZXMKKyAqIHNvbWUgc3RhY2sgc3BhY2UgKHRoZSBtaW5kaXN0W10gYW5kIGJlc3RkaXN0W10gYXJyYXlzIG5lZWQgbm90IGNvZXhpc3QpCisgKiBhbmQgbWF5IGFsbG93IHNvbWUgY29tcGlsZXJzIHRvIHByb2R1Y2UgYmV0dGVyIGNvZGUgYnkgcmVnaXN0ZXJpemluZyBtb3JlCisgKiBpbm5lci1sb29wIHZhcmlhYmxlcy4KKyAqLworCitMT0NBTChpbnQpCitmaW5kX25lYXJieV9jb2xvcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtaW5jMCwgaW50IG1pbmMxLCBpbnQgbWluYzIsCisJCSAgICBKU0FNUExFIGNvbG9ybGlzdFtdKQorLyogTG9jYXRlIHRoZSBjb2xvcm1hcCBlbnRyaWVzIGNsb3NlIGVub3VnaCB0byBhbiB1cGRhdGUgYm94IHRvIGJlIGNhbmRpZGF0ZXMKKyAqIGZvciB0aGUgbmVhcmVzdCBlbnRyeSB0byBzb21lIGNlbGwocykgaW4gdGhlIHVwZGF0ZSBib3guICBUaGUgdXBkYXRlIGJveAorICogaXMgc3BlY2lmaWVkIGJ5IHRoZSBjZW50ZXIgY29vcmRpbmF0ZXMgb2YgaXRzIGZpcnN0IGNlbGwuICBUaGUgbnVtYmVyIG9mCisgKiBjYW5kaWRhdGUgY29sb3JtYXAgZW50cmllcyBpcyByZXR1cm5lZCwgYW5kIHRoZWlyIGNvbG9ybWFwIGluZGV4ZXMgYXJlCisgKiBwbGFjZWQgaW4gY29sb3JsaXN0W10uCisgKiBUaGlzIHJvdXRpbmUgdXNlcyBIZWNrYmVydCdzICJsb2NhbGx5IHNvcnRlZCBzZWFyY2giIGNyaXRlcmlvbiB0byBzZWxlY3QKKyAqIHRoZSBjb2xvcnMgdGhhdCBuZWVkIGZ1cnRoZXIgY29uc2lkZXJhdGlvbi4KKyAqLworeworICBpbnQgbnVtY29sb3JzID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOworICBpbnQgbWF4YzAsIG1heGMxLCBtYXhjMjsKKyAgaW50IGNlbnRlcmMwLCBjZW50ZXJjMSwgY2VudGVyYzI7CisgIGludCBpLCB4LCBuY29sb3JzOworICBJTlQzMiBtaW5tYXhkaXN0LCBtaW5fZGlzdCwgbWF4X2Rpc3QsIHRkaXN0OworICBJTlQzMiBtaW5kaXN0W01BWE5VTUNPTE9SU107CS8qIG1pbiBkaXN0YW5jZSB0byBjb2xvcm1hcCBlbnRyeSBpICovCisKKyAgLyogQ29tcHV0ZSB0cnVlIGNvb3JkaW5hdGVzIG9mIHVwZGF0ZSBib3gncyB1cHBlciBjb3JuZXIgYW5kIGNlbnRlci4KKyAgICogQWN0dWFsbHkgd2UgY29tcHV0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciBvZiB0aGUgdXBwZXItY29ybmVyCisgICAqIGhpc3RvZ3JhbSBjZWxsLCB3aGljaCBhcmUgdGhlIHVwcGVyIGJvdW5kcyBvZiB0aGUgdm9sdW1lIHdlIGNhcmUgYWJvdXQuCisgICAqIE5vdGUgdGhhdCBzaW5jZSAiPj4iIHJvdW5kcyBkb3duLCB0aGUgImNlbnRlciIgdmFsdWVzIG1heSBiZSBjbG9zZXIgdG8KKyAgICogbWluIHRoYW4gdG8gbWF4OyBoZW5jZSBjb21wYXJpc29ucyB0byB0aGVtIG11c3QgYmUgIjw9Iiwgbm90ICI8Ii4KKyAgICovCisgIG1heGMwID0gbWluYzAgKyAoKDEgPDwgQk9YX0MwX1NISUZUKSAtICgxIDw8IEMwX1NISUZUKSk7CisgIGNlbnRlcmMwID0gKG1pbmMwICsgbWF4YzApID4+IDE7CisgIG1heGMxID0gbWluYzEgKyAoKDEgPDwgQk9YX0MxX1NISUZUKSAtICgxIDw8IEMxX1NISUZUKSk7CisgIGNlbnRlcmMxID0gKG1pbmMxICsgbWF4YzEpID4+IDE7CisgIG1heGMyID0gbWluYzIgKyAoKDEgPDwgQk9YX0MyX1NISUZUKSAtICgxIDw8IEMyX1NISUZUKSk7CisgIGNlbnRlcmMyID0gKG1pbmMyICsgbWF4YzIpID4+IDE7CisKKyAgLyogRm9yIGVhY2ggY29sb3IgaW4gY29sb3JtYXAsIGZpbmQ6CisgICAqICAxLiBpdHMgbWluaW11bSBzcXVhcmVkLWRpc3RhbmNlIHRvIGFueSBwb2ludCBpbiB0aGUgdXBkYXRlIGJveAorICAgKiAgICAgKHplcm8gaWYgY29sb3IgaXMgd2l0aGluIHVwZGF0ZSBib3gpOworICAgKiAgMi4gaXRzIG1heGltdW0gc3F1YXJlZC1kaXN0YW5jZSB0byBhbnkgcG9pbnQgaW4gdGhlIHVwZGF0ZSBib3guCisgICAqIEJvdGggb2YgdGhlc2UgY2FuIGJlIGZvdW5kIGJ5IGNvbnNpZGVyaW5nIG9ubHkgdGhlIGNvcm5lcnMgb2YgdGhlIGJveC4KKyAgICogV2Ugc2F2ZSB0aGUgbWluaW11bSBkaXN0YW5jZSBmb3IgZWFjaCBjb2xvciBpbiBtaW5kaXN0W107CisgICAqIG9ubHkgdGhlIHNtYWxsZXN0IG1heGltdW0gZGlzdGFuY2UgaXMgb2YgaW50ZXJlc3QuCisgICAqLworICBtaW5tYXhkaXN0ID0gMHg3RkZGRkZGRkw7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWNvbG9yczsgaSsrKSB7CisgICAgLyogV2UgY29tcHV0ZSB0aGUgc3F1YXJlZC1jMC1kaXN0YW5jZSB0ZXJtLCB0aGVuIGFkZCBpbiB0aGUgb3RoZXIgdHdvLiAqLworICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFswXVtpXSk7CisgICAgaWYgKHggPCBtaW5jMCkgeworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMwKSAqIEMwX1NDQUxFOworICAgICAgbWluX2Rpc3QgPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIHRkaXN0ID0gKHggLSBtYXhjMCkgKiBDMF9TQ0FMRTsKKyAgICAgIG1heF9kaXN0ID0gdGRpc3QqdGRpc3Q7CisgICAgfSBlbHNlIGlmICh4ID4gbWF4YzApIHsKKyAgICAgIHRkaXN0ID0gKHggLSBtYXhjMCkgKiBDMF9TQ0FMRTsKKyAgICAgIG1pbl9kaXN0ID0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWluYzApICogQzBfU0NBTEU7CisgICAgICBtYXhfZGlzdCA9IHRkaXN0KnRkaXN0OworICAgIH0gZWxzZSB7CisgICAgICAvKiB3aXRoaW4gY2VsbCByYW5nZSBzbyBubyBjb250cmlidXRpb24gdG8gbWluX2Rpc3QgKi8KKyAgICAgIG1pbl9kaXN0ID0gMDsKKyAgICAgIGlmICh4IDw9IGNlbnRlcmMwKSB7CisJdGRpc3QgPSAoeCAtIG1heGMwKSAqIEMwX1NDQUxFOworCW1heF9kaXN0ID0gdGRpc3QqdGRpc3Q7CisgICAgICB9IGVsc2UgeworCXRkaXN0ID0gKHggLSBtaW5jMCkgKiBDMF9TQ0FMRTsKKwltYXhfZGlzdCA9IHRkaXN0KnRkaXN0OworICAgICAgfQorICAgIH0KKworICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpXSk7CisgICAgaWYgKHggPCBtaW5jMSkgeworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMxKSAqIEMxX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWF4YzEpICogQzFfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgaWYgKHggPiBtYXhjMSkgeworICAgICAgdGRpc3QgPSAoeCAtIG1heGMxKSAqIEMxX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWluYzEpICogQzFfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogd2l0aGluIGNlbGwgcmFuZ2Ugc28gbm8gY29udHJpYnV0aW9uIHRvIG1pbl9kaXN0ICovCisgICAgICBpZiAoeCA8PSBjZW50ZXJjMSkgeworCXRkaXN0ID0gKHggLSBtYXhjMSkgKiBDMV9TQ0FMRTsKKwltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIH0gZWxzZSB7CisJdGRpc3QgPSAoeCAtIG1pbmMxKSAqIEMxX1NDQUxFOworCW1heF9kaXN0ICs9IHRkaXN0KnRkaXN0OworICAgICAgfQorICAgIH0KKworICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsyXVtpXSk7CisgICAgaWYgKHggPCBtaW5jMikgeworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMyKSAqIEMyX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWF4YzIpICogQzJfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgaWYgKHggPiBtYXhjMikgeworICAgICAgdGRpc3QgPSAoeCAtIG1heGMyKSAqIEMyX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWluYzIpICogQzJfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogd2l0aGluIGNlbGwgcmFuZ2Ugc28gbm8gY29udHJpYnV0aW9uIHRvIG1pbl9kaXN0ICovCisgICAgICBpZiAoeCA8PSBjZW50ZXJjMikgeworCXRkaXN0ID0gKHggLSBtYXhjMikgKiBDMl9TQ0FMRTsKKwltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIH0gZWxzZSB7CisJdGRpc3QgPSAoeCAtIG1pbmMyKSAqIEMyX1NDQUxFOworCW1heF9kaXN0ICs9IHRkaXN0KnRkaXN0OworICAgICAgfQorICAgIH0KKworICAgIG1pbmRpc3RbaV0gPSBtaW5fZGlzdDsJLyogc2F2ZSBhd2F5IHRoZSByZXN1bHRzICovCisgICAgaWYgKG1heF9kaXN0IDwgbWlubWF4ZGlzdCkKKyAgICAgIG1pbm1heGRpc3QgPSBtYXhfZGlzdDsKKyAgfQorCisgIC8qIE5vdyB3ZSBrbm93IHRoYXQgbm8gY2VsbCBpbiB0aGUgdXBkYXRlIGJveCBpcyBtb3JlIHRoYW4gbWlubWF4ZGlzdAorICAgKiBhd2F5IGZyb20gc29tZSBjb2xvcm1hcCBlbnRyeS4gIFRoZXJlZm9yZSwgb25seSBjb2xvcnMgdGhhdCBhcmUKKyAgICogd2l0aGluIG1pbm1heGRpc3Qgb2Ygc29tZSBwYXJ0IG9mIHRoZSBib3ggbmVlZCBiZSBjb25zaWRlcmVkLgorICAgKi8KKyAgbmNvbG9ycyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBudW1jb2xvcnM7IGkrKykgeworICAgIGlmIChtaW5kaXN0W2ldIDw9IG1pbm1heGRpc3QpCisgICAgICBjb2xvcmxpc3RbbmNvbG9ycysrXSA9IChKU0FNUExFKSBpOworICB9CisgIHJldHVybiBuY29sb3JzOworfQorCisKK0xPQ0FMKHZvaWQpCitmaW5kX2Jlc3RfY29sb3JzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWluYzAsIGludCBtaW5jMSwgaW50IG1pbmMyLAorCQkgIGludCBudW1jb2xvcnMsIEpTQU1QTEUgY29sb3JsaXN0W10sIEpTQU1QTEUgYmVzdGNvbG9yW10pCisvKiBGaW5kIHRoZSBjbG9zZXN0IGNvbG9ybWFwIGVudHJ5IGZvciBlYWNoIGNlbGwgaW4gdGhlIHVwZGF0ZSBib3gsCisgKiBnaXZlbiB0aGUgbGlzdCBvZiBjYW5kaWRhdGUgY29sb3JzIHByZXBhcmVkIGJ5IGZpbmRfbmVhcmJ5X2NvbG9ycy4KKyAqIFJldHVybiB0aGUgaW5kZXhlcyBvZiB0aGUgY2xvc2VzdCBlbnRyaWVzIGluIHRoZSBiZXN0Y29sb3JbXSBhcnJheS4KKyAqIFRoaXMgcm91dGluZSB1c2VzIFRob21hcycgaW5jcmVtZW50YWwgZGlzdGFuY2UgY2FsY3VsYXRpb24gbWV0aG9kIHRvCisgKiBmaW5kIHRoZSBkaXN0YW5jZSBmcm9tIGEgY29sb3JtYXAgZW50cnkgdG8gc3VjY2Vzc2l2ZSBjZWxscyBpbiB0aGUgYm94LgorICovCit7CisgIGludCBpYzAsIGljMSwgaWMyOworICBpbnQgaSwgaWNvbG9yOworICByZWdpc3RlciBJTlQzMiAqIGJwdHI7CS8qIHBvaW50ZXIgaW50byBiZXN0ZGlzdFtdIGFycmF5ICovCisgIEpTQU1QTEUgKiBjcHRyOwkJLyogcG9pbnRlciBpbnRvIGJlc3Rjb2xvcltdIGFycmF5ICovCisgIElOVDMyIGRpc3QwLCBkaXN0MTsJCS8qIGluaXRpYWwgZGlzdGFuY2UgdmFsdWVzICovCisgIHJlZ2lzdGVyIElOVDMyIGRpc3QyOwkJLyogY3VycmVudCBkaXN0YW5jZSBpbiBpbm5lciBsb29wICovCisgIElOVDMyIHh4MCwgeHgxOwkJLyogZGlzdGFuY2UgaW5jcmVtZW50cyAqLworICByZWdpc3RlciBJTlQzMiB4eDI7CisgIElOVDMyIGluYzAsIGluYzEsIGluYzI7CS8qIGluaXRpYWwgdmFsdWVzIGZvciBpbmNyZW1lbnRzICovCisgIC8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGRpc3RhbmNlIHRvIHRoZSBuZWFyZXN0LXNvLWZhciBjb2xvciBmb3IgZWFjaCBjZWxsICovCisgIElOVDMyIGJlc3RkaXN0W0JPWF9DMF9FTEVNUyAqIEJPWF9DMV9FTEVNUyAqIEJPWF9DMl9FTEVNU107CisKKyAgLyogSW5pdGlhbGl6ZSBiZXN0LWRpc3RhbmNlIGZvciBlYWNoIGNlbGwgb2YgdGhlIHVwZGF0ZSBib3ggKi8KKyAgYnB0ciA9IGJlc3RkaXN0OworICBmb3IgKGkgPSBCT1hfQzBfRUxFTVMqQk9YX0MxX0VMRU1TKkJPWF9DMl9FTEVNUy0xOyBpID49IDA7IGktLSkKKyAgICAqYnB0cisrID0gMHg3RkZGRkZGRkw7CisgIAorICAvKiBGb3IgZWFjaCBjb2xvciBzZWxlY3RlZCBieSBmaW5kX25lYXJieV9jb2xvcnMsCisgICAqIGNvbXB1dGUgaXRzIGRpc3RhbmNlIHRvIHRoZSBjZW50ZXIgb2YgZWFjaCBjZWxsIGluIHRoZSBib3guCisgICAqIElmIHRoYXQncyBsZXNzIHRoYW4gYmVzdC1zby1mYXIsIHVwZGF0ZSBiZXN0IGRpc3RhbmNlIGFuZCBjb2xvciBudW1iZXIuCisgICAqLworICAKKyAgLyogTm9taW5hbCBzdGVwcyBiZXR3ZWVuIGNlbGwgY2VudGVycyAoIngiIGluIFRob21hcyBhcnRpY2xlKSAqLworI2RlZmluZSBTVEVQX0MwICAoKDEgPDwgQzBfU0hJRlQpICogQzBfU0NBTEUpCisjZGVmaW5lIFNURVBfQzEgICgoMSA8PCBDMV9TSElGVCkgKiBDMV9TQ0FMRSkKKyNkZWZpbmUgU1RFUF9DMiAgKCgxIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFKQorICAKKyAgZm9yIChpID0gMDsgaSA8IG51bWNvbG9yczsgaSsrKSB7CisgICAgaWNvbG9yID0gR0VUSlNBTVBMRShjb2xvcmxpc3RbaV0pOworICAgIC8qIENvbXB1dGUgKHNxdWFyZSBvZikgZGlzdGFuY2UgZnJvbSBtaW5jMC9jMS9jMiB0byB0aGlzIGNvbG9yICovCisgICAgaW5jMCA9IChtaW5jMCAtIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzBdW2ljb2xvcl0pKSAqIEMwX1NDQUxFOworICAgIGRpc3QwID0gaW5jMCppbmMwOworICAgIGluYzEgPSAobWluYzEgLSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpY29sb3JdKSkgKiBDMV9TQ0FMRTsKKyAgICBkaXN0MCArPSBpbmMxKmluYzE7CisgICAgaW5jMiA9IChtaW5jMiAtIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzJdW2ljb2xvcl0pKSAqIEMyX1NDQUxFOworICAgIGRpc3QwICs9IGluYzIqaW5jMjsKKyAgICAvKiBGb3JtIHRoZSBpbml0aWFsIGRpZmZlcmVuY2UgaW5jcmVtZW50cyAqLworICAgIGluYzAgPSBpbmMwICogKDIgKiBTVEVQX0MwKSArIFNURVBfQzAgKiBTVEVQX0MwOworICAgIGluYzEgPSBpbmMxICogKDIgKiBTVEVQX0MxKSArIFNURVBfQzEgKiBTVEVQX0MxOworICAgIGluYzIgPSBpbmMyICogKDIgKiBTVEVQX0MyKSArIFNURVBfQzIgKiBTVEVQX0MyOworICAgIC8qIE5vdyBsb29wIG92ZXIgYWxsIGNlbGxzIGluIGJveCwgdXBkYXRpbmcgZGlzdGFuY2UgcGVyIFRob21hcyBtZXRob2QgKi8KKyAgICBicHRyID0gYmVzdGRpc3Q7CisgICAgY3B0ciA9IGJlc3Rjb2xvcjsKKyAgICB4eDAgPSBpbmMwOworICAgIGZvciAoaWMwID0gQk9YX0MwX0VMRU1TLTE7IGljMCA+PSAwOyBpYzAtLSkgeworICAgICAgZGlzdDEgPSBkaXN0MDsKKyAgICAgIHh4MSA9IGluYzE7CisgICAgICBmb3IgKGljMSA9IEJPWF9DMV9FTEVNUy0xOyBpYzEgPj0gMDsgaWMxLS0pIHsKKwlkaXN0MiA9IGRpc3QxOworCXh4MiA9IGluYzI7CisJZm9yIChpYzIgPSBCT1hfQzJfRUxFTVMtMTsgaWMyID49IDA7IGljMi0tKSB7CisJICBpZiAoZGlzdDIgPCAqYnB0cikgeworCSAgICAqYnB0ciA9IGRpc3QyOworCSAgICAqY3B0ciA9IChKU0FNUExFKSBpY29sb3I7CisJICB9CisJICBkaXN0MiArPSB4eDI7CisJICB4eDIgKz0gMiAqIFNURVBfQzIgKiBTVEVQX0MyOworCSAgYnB0cisrOworCSAgY3B0cisrOworCX0KKwlkaXN0MSArPSB4eDE7CisJeHgxICs9IDIgKiBTVEVQX0MxICogU1RFUF9DMTsKKyAgICAgIH0KKyAgICAgIGRpc3QwICs9IHh4MDsKKyAgICAgIHh4MCArPSAyICogU1RFUF9DMCAqIFNURVBfQzA7CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2ZpbGxfaW52ZXJzZV9jbWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgYzAsIGludCBjMSwgaW50IGMyKQorLyogRmlsbCB0aGUgaW52ZXJzZS1jb2xvcm1hcCBlbnRyaWVzIGluIHRoZSB1cGRhdGUgYm94IHRoYXQgY29udGFpbnMgKi8KKy8qIGhpc3RvZ3JhbSBjZWxsIGMwL2MxL2MyLiAgKE9ubHkgdGhhdCBvbmUgY2VsbCBNVVNUIGJlIGZpbGxlZCwgYnV0ICovCisvKiB3ZSBjYW4gZmlsbCBhcyBtYW55IG90aGVycyBhcyB3ZSB3aXNoLikgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOworICBpbnQgbWluYzAsIG1pbmMxLCBtaW5jMjsJLyogbG93ZXIgbGVmdCBjb3JuZXIgb2YgdXBkYXRlIGJveCAqLworICBpbnQgaWMwLCBpYzEsIGljMjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIGNwdHI7CS8qIHBvaW50ZXIgaW50byBiZXN0Y29sb3JbXSBhcnJheSAqLworICByZWdpc3RlciBoaXN0cHRyIGNhY2hlcDsJLyogcG9pbnRlciBpbnRvIG1haW4gY2FjaGUgYXJyYXkgKi8KKyAgLyogVGhpcyBhcnJheSBsaXN0cyB0aGUgY2FuZGlkYXRlIGNvbG9ybWFwIGluZGV4ZXMuICovCisgIEpTQU1QTEUgY29sb3JsaXN0W01BWE5VTUNPTE9SU107CisgIGludCBudW1jb2xvcnM7CQkvKiBudW1iZXIgb2YgY2FuZGlkYXRlIGNvbG9ycyAqLworICAvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBhY3R1YWxseSBjbG9zZXN0IGNvbG9ybWFwIGluZGV4IGZvciBlYWNoIGNlbGwuICovCisgIEpTQU1QTEUgYmVzdGNvbG9yW0JPWF9DMF9FTEVNUyAqIEJPWF9DMV9FTEVNUyAqIEJPWF9DMl9FTEVNU107CisKKyAgLyogQ29udmVydCBjZWxsIGNvb3JkaW5hdGVzIHRvIHVwZGF0ZSBib3ggSUQgKi8KKyAgYzAgPj49IEJPWF9DMF9MT0c7CisgIGMxID4+PSBCT1hfQzFfTE9HOworICBjMiA+Pj0gQk9YX0MyX0xPRzsKKworICAvKiBDb21wdXRlIHRydWUgY29vcmRpbmF0ZXMgb2YgdXBkYXRlIGJveCdzIG9yaWdpbiBjb3JuZXIuCisgICAqIEFjdHVhbGx5IHdlIGNvbXB1dGUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNvcm5lcgorICAgKiBoaXN0b2dyYW0gY2VsbCwgd2hpY2ggYXJlIHRoZSBsb3dlciBib3VuZHMgb2YgdGhlIHZvbHVtZSB3ZSBjYXJlIGFib3V0LgorICAgKi8KKyAgbWluYzAgPSAoYzAgPDwgQk9YX0MwX1NISUZUKSArICgoMSA8PCBDMF9TSElGVCkgPj4gMSk7CisgIG1pbmMxID0gKGMxIDw8IEJPWF9DMV9TSElGVCkgKyAoKDEgPDwgQzFfU0hJRlQpID4+IDEpOworICBtaW5jMiA9IChjMiA8PCBCT1hfQzJfU0hJRlQpICsgKCgxIDw8IEMyX1NISUZUKSA+PiAxKTsKKyAgCisgIC8qIERldGVybWluZSB3aGljaCBjb2xvcm1hcCBlbnRyaWVzIGFyZSBjbG9zZSBlbm91Z2ggdG8gYmUgY2FuZGlkYXRlcworICAgKiBmb3IgdGhlIG5lYXJlc3QgZW50cnkgdG8gc29tZSBjZWxsIGluIHRoZSB1cGRhdGUgYm94LgorICAgKi8KKyAgbnVtY29sb3JzID0gZmluZF9uZWFyYnlfY29sb3JzKGNpbmZvLCBtaW5jMCwgbWluYzEsIG1pbmMyLCBjb2xvcmxpc3QpOworCisgIC8qIERldGVybWluZSB0aGUgYWN0dWFsbHkgbmVhcmVzdCBjb2xvcnMuICovCisgIGZpbmRfYmVzdF9jb2xvcnMoY2luZm8sIG1pbmMwLCBtaW5jMSwgbWluYzIsIG51bWNvbG9ycywgY29sb3JsaXN0LAorCQkgICBiZXN0Y29sb3IpOworCisgIC8qIFNhdmUgdGhlIGJlc3QgY29sb3IgbnVtYmVycyAocGx1cyAxKSBpbiB0aGUgbWFpbiBjYWNoZSBhcnJheSAqLworICBjMCA8PD0gQk9YX0MwX0xPRzsJCS8qIGNvbnZlcnQgSUQgYmFjayB0byBiYXNlIGNlbGwgaW5kZXhlcyAqLworICBjMSA8PD0gQk9YX0MxX0xPRzsKKyAgYzIgPDw9IEJPWF9DMl9MT0c7CisgIGNwdHIgPSBiZXN0Y29sb3I7CisgIGZvciAoaWMwID0gMDsgaWMwIDwgQk9YX0MwX0VMRU1TOyBpYzArKykgeworICAgIGZvciAoaWMxID0gMDsgaWMxIDwgQk9YX0MxX0VMRU1TOyBpYzErKykgeworICAgICAgY2FjaGVwID0gJiBoaXN0b2dyYW1bYzAraWMwXVtjMStpYzFdW2MyXTsKKyAgICAgIGZvciAoaWMyID0gMDsgaWMyIDwgQk9YX0MyX0VMRU1TOyBpYzIrKykgeworCSpjYWNoZXArKyA9IChoaXN0Y2VsbCkgKEdFVEpTQU1QTEUoKmNwdHIrKykgKyAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvKgorICogTWFwIHNvbWUgcm93cyBvZiBwaXhlbHMgdG8gdGhlIG91dHB1dCBjb2xvcm1hcHBlZCByZXByZXNlbnRhdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bhc3MyX25vX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKKy8qIFRoaXMgdmVyc2lvbiBwZXJmb3JtcyBubyBkaXRoZXJpbmcgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBoaXN0cHRyIGNhY2hlcDsKKyAgcmVnaXN0ZXIgaW50IGMwLCBjMSwgYzI7CisgIGludCByb3c7CisgIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIGlucHRyID0gaW5wdXRfYnVmW3Jvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICAvKiBnZXQgcGl4ZWwgdmFsdWUgYW5kIGluZGV4IGludG8gdGhlIGNhY2hlICovCisgICAgICBjMCA9IEdFVEpTQU1QTEUoKmlucHRyKyspID4+IEMwX1NISUZUOworICAgICAgYzEgPSBHRVRKU0FNUExFKCppbnB0cisrKSA+PiBDMV9TSElGVDsKKyAgICAgIGMyID0gR0VUSlNBTVBMRSgqaW5wdHIrKykgPj4gQzJfU0hJRlQ7CisgICAgICBjYWNoZXAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MyXTsKKyAgICAgIC8qIElmIHdlIGhhdmUgbm90IHNlZW4gdGhpcyBjb2xvciBiZWZvcmUsIGZpbmQgbmVhcmVzdCBjb2xvcm1hcCBlbnRyeSAqLworICAgICAgLyogYW5kIHVwZGF0ZSB0aGUgY2FjaGUgKi8KKyAgICAgIGlmICgqY2FjaGVwID09IDApCisJZmlsbF9pbnZlcnNlX2NtYXAoY2luZm8sIGMwLGMxLGMyKTsKKyAgICAgIC8qIE5vdyBlbWl0IHRoZSBjb2xvcm1hcCBpbmRleCBmb3IgdGhpcyBjZWxsICovCisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCpjYWNoZXAgLSAxKTsKKyAgICB9CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3Bhc3MyX2ZzX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKKy8qIFRoaXMgdmVyc2lvbiBwZXJmb3JtcyBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgcmVnaXN0ZXIgTE9DRlNFUlJPUiBjdXIwLCBjdXIxLCBjdXIyOwkvKiBjdXJyZW50IGVycm9yIG9yIHBpeGVsIHZhbHVlICovCisgIExPQ0ZTRVJST1IgYmVsb3dlcnIwLCBiZWxvd2VycjEsIGJlbG93ZXJyMjsgLyogZXJyb3IgZm9yIHBpeGVsIGJlbG93IGN1ciAqLworICBMT0NGU0VSUk9SIGJwcmV2ZXJyMCwgYnByZXZlcnIxLCBicHJldmVycjI7IC8qIGVycm9yIGZvciBiZWxvdy9wcmV2IGNvbCAqLworICByZWdpc3RlciBGU0VSUlBUUiBlcnJvcnB0cjsJLyogPT4gZnNlcnJvcnNbXSBhdCBjb2x1bW4gYmVmb3JlIGN1cnJlbnQgKi8KKyAgSlNBTVBST1cgaW5wdHI7CQkvKiA9PiBjdXJyZW50IGlucHV0IHBpeGVsICovCisgIEpTQU1QUk9XIG91dHB0cjsJCS8qID0+IGN1cnJlbnQgb3V0cHV0IHBpeGVsICovCisgIGhpc3RwdHIgY2FjaGVwOworICBpbnQgZGlyOwkJCS8qICsxIG9yIC0xIGRlcGVuZGluZyBvbiBkaXJlY3Rpb24gKi8KKyAgaW50IGRpcjM7CQkJLyogMypkaXIsIGZvciBhZHZhbmNpbmcgaW5wdHIgJiBlcnJvcnB0ciAqLworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICplcnJvcl9saW1pdCA9IGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlcjsKKyAgSlNBTVBST1cgY29sb3JtYXAwID0gY2luZm8tPmNvbG9ybWFwWzBdOworICBKU0FNUFJPVyBjb2xvcm1hcDEgPSBjaW5mby0+Y29sb3JtYXBbMV07CisgIEpTQU1QUk9XIGNvbG9ybWFwMiA9IGNpbmZvLT5jb2xvcm1hcFsyXTsKKyAgU0hJRlRfVEVNUFMKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIGlucHRyID0gaW5wdXRfYnVmW3Jvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGlmIChjcXVhbnRpemUtPm9uX29kZF9yb3cpIHsKKyAgICAgIC8qIHdvcmsgcmlnaHQgdG8gbGVmdCBpbiB0aGlzIHJvdyAqLworICAgICAgaW5wdHIgKz0gKHdpZHRoLTEpICogMzsJLyogc28gcG9pbnQgdG8gcmlnaHRtb3N0IHBpeGVsICovCisgICAgICBvdXRwdHIgKz0gd2lkdGgtMTsKKyAgICAgIGRpciA9IC0xOworICAgICAgZGlyMyA9IC0zOworICAgICAgZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzICsgKHdpZHRoKzEpKjM7IC8qID0+IGVudHJ5IGFmdGVyIGxhc3QgY29sdW1uICovCisgICAgICBjcXVhbnRpemUtPm9uX29kZF9yb3cgPSBGQUxTRTsgLyogZmxpcCBmb3IgbmV4dCB0aW1lICovCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHdvcmsgbGVmdCB0byByaWdodCBpbiB0aGlzIHJvdyAqLworICAgICAgZGlyID0gMTsKKyAgICAgIGRpcjMgPSAzOworICAgICAgZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzOyAvKiA9PiBlbnRyeSBiZWZvcmUgZmlyc3QgcmVhbCBjb2x1bW4gKi8KKyAgICAgIGNxdWFudGl6ZS0+b25fb2RkX3JvdyA9IFRSVUU7IC8qIGZsaXAgZm9yIG5leHQgdGltZSAqLworICAgIH0KKyAgICAvKiBQcmVzZXQgZXJyb3IgdmFsdWVzOiBubyBlcnJvciBwcm9wYWdhdGVkIHRvIGZpcnN0IHBpeGVsIGZyb20gbGVmdCAqLworICAgIGN1cjAgPSBjdXIxID0gY3VyMiA9IDA7CisgICAgLyogYW5kIG5vIGVycm9yIHByb3BhZ2F0ZWQgdG8gcm93IGJlbG93IHlldCAqLworICAgIGJlbG93ZXJyMCA9IGJlbG93ZXJyMSA9IGJlbG93ZXJyMiA9IDA7CisgICAgYnByZXZlcnIwID0gYnByZXZlcnIxID0gYnByZXZlcnIyID0gMDsKKworICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICAvKiBjdXJOIGhvbGRzIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIHBpeGVsIG9uIHRoZQorICAgICAgICogY3VycmVudCBsaW5lLiAgQWRkIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUKKyAgICAgICAqIHRvIGZvcm0gdGhlIGNvbXBsZXRlIGVycm9yIGNvcnJlY3Rpb24gdGVybSBmb3IgdGhpcyBwaXhlbCwgYW5kCisgICAgICAgKiByb3VuZCB0aGUgZXJyb3IgdGVybSAod2hpY2ggaXMgZXhwcmVzc2VkICogMTYpIHRvIGFuIGludGVnZXIuCisgICAgICAgKiBSSUdIVF9TSElGVCByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eSwgc28gYWRkaW5nIDggaXMgY29ycmVjdAorICAgICAgICogZm9yIGVpdGhlciBzaWduIG9mIHRoZSBlcnJvciB2YWx1ZS4KKyAgICAgICAqIE5vdGU6IGVycm9ycHRyIHBvaW50cyB0byAqcHJldmlvdXMqIGNvbHVtbidzIGFycmF5IGVudHJ5LgorICAgICAgICovCisgICAgICBjdXIwID0gUklHSFRfU0hJRlQoY3VyMCArIGVycm9ycHRyW2RpcjMrMF0gKyA4LCA0KTsKKyAgICAgIGN1cjEgPSBSSUdIVF9TSElGVChjdXIxICsgZXJyb3JwdHJbZGlyMysxXSArIDgsIDQpOworICAgICAgY3VyMiA9IFJJR0hUX1NISUZUKGN1cjIgKyBlcnJvcnB0cltkaXIzKzJdICsgOCwgNCk7CisgICAgICAvKiBMaW1pdCB0aGUgZXJyb3IgdXNpbmcgdHJhbnNmZXIgZnVuY3Rpb24gc2V0IGJ5IGluaXRfZXJyb3JfbGltaXQuCisgICAgICAgKiBTZWUgY29tbWVudHMgd2l0aCBpbml0X2Vycm9yX2xpbWl0IGZvciByYXRpb25hbGUuCisgICAgICAgKi8KKyAgICAgIGN1cjAgPSBlcnJvcl9saW1pdFtjdXIwXTsKKyAgICAgIGN1cjEgPSBlcnJvcl9saW1pdFtjdXIxXTsKKyAgICAgIGN1cjIgPSBlcnJvcl9saW1pdFtjdXIyXTsKKyAgICAgIC8qIEZvcm0gcGl4ZWwgdmFsdWUgKyBlcnJvciwgYW5kIHJhbmdlLWxpbWl0IHRvIDAuLk1BWEpTQU1QTEUuCisgICAgICAgKiBUaGUgbWF4aW11bSBlcnJvciBpcyArLSBNQVhKU0FNUExFIChvciBsZXNzIHdpdGggZXJyb3IgbGltaXRpbmcpOworICAgICAgICogdGhpcyBzZXRzIHRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSByYW5nZV9saW1pdCBhcnJheS4KKyAgICAgICAqLworICAgICAgY3VyMCArPSBHRVRKU0FNUExFKGlucHRyWzBdKTsKKyAgICAgIGN1cjEgKz0gR0VUSlNBTVBMRShpbnB0clsxXSk7CisgICAgICBjdXIyICs9IEdFVEpTQU1QTEUoaW5wdHJbMl0pOworICAgICAgY3VyMCA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMF0pOworICAgICAgY3VyMSA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMV0pOworICAgICAgY3VyMiA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMl0pOworICAgICAgLyogSW5kZXggaW50byB0aGUgY2FjaGUgd2l0aCBhZGp1c3RlZCBwaXhlbCB2YWx1ZSAqLworICAgICAgY2FjaGVwID0gJiBoaXN0b2dyYW1bY3VyMD4+QzBfU0hJRlRdW2N1cjE+PkMxX1NISUZUXVtjdXIyPj5DMl9TSElGVF07CisgICAgICAvKiBJZiB3ZSBoYXZlIG5vdCBzZWVuIHRoaXMgY29sb3IgYmVmb3JlLCBmaW5kIG5lYXJlc3QgY29sb3JtYXAgKi8KKyAgICAgIC8qIGVudHJ5IGFuZCB1cGRhdGUgdGhlIGNhY2hlICovCisgICAgICBpZiAoKmNhY2hlcCA9PSAwKQorCWZpbGxfaW52ZXJzZV9jbWFwKGNpbmZvLCBjdXIwPj5DMF9TSElGVCxjdXIxPj5DMV9TSElGVCxjdXIyPj5DMl9TSElGVCk7CisgICAgICAvKiBOb3cgZW1pdCB0aGUgY29sb3JtYXAgaW5kZXggZm9yIHRoaXMgY2VsbCAqLworICAgICAgeyByZWdpc3RlciBpbnQgcGl4Y29kZSA9ICpjYWNoZXAgLSAxOworCSpvdXRwdHIgPSAoSlNBTVBMRSkgcGl4Y29kZTsKKwkvKiBDb21wdXRlIHJlcHJlc2VudGF0aW9uIGVycm9yIGZvciB0aGlzIHBpeGVsICovCisJY3VyMCAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMFtwaXhjb2RlXSk7CisJY3VyMSAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMVtwaXhjb2RlXSk7CisJY3VyMiAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMltwaXhjb2RlXSk7CisgICAgICB9CisgICAgICAvKiBDb21wdXRlIGVycm9yIGZyYWN0aW9ucyB0byBiZSBwcm9wYWdhdGVkIHRvIGFkamFjZW50IHBpeGVscy4KKyAgICAgICAqIEFkZCB0aGVzZSBpbnRvIHRoZSBydW5uaW5nIHN1bXMsIGFuZCBzaW11bHRhbmVvdXNseSBzaGlmdCB0aGUKKyAgICAgICAqIG5leHQtbGluZSBlcnJvciBzdW1zIGxlZnQgYnkgMSBjb2x1bW4uCisgICAgICAgKi8KKyAgICAgIHsgcmVnaXN0ZXIgTE9DRlNFUlJPUiBibmV4dGVyciwgZGVsdGE7CisKKwlibmV4dGVyciA9IGN1cjA7CS8qIFByb2Nlc3MgY29tcG9uZW50IDAgKi8KKwlkZWx0YSA9IGN1cjAgKiAyOworCWN1cjAgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogMyAqLworCWVycm9ycHRyWzBdID0gKEZTRVJST1IpIChicHJldmVycjAgKyBjdXIwKTsKKwljdXIwICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDUgKi8KKwlicHJldmVycjAgPSBiZWxvd2VycjAgKyBjdXIwOworCWJlbG93ZXJyMCA9IGJuZXh0ZXJyOworCWN1cjAgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNyAqLworCWJuZXh0ZXJyID0gY3VyMTsJLyogUHJvY2VzcyBjb21wb25lbnQgMSAqLworCWRlbHRhID0gY3VyMSAqIDI7CisJY3VyMSArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiAzICovCisJZXJyb3JwdHJbMV0gPSAoRlNFUlJPUikgKGJwcmV2ZXJyMSArIGN1cjEpOworCWN1cjEgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNSAqLworCWJwcmV2ZXJyMSA9IGJlbG93ZXJyMSArIGN1cjE7CisJYmVsb3dlcnIxID0gYm5leHRlcnI7CisJY3VyMSArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA3ICovCisJYm5leHRlcnIgPSBjdXIyOwkvKiBQcm9jZXNzIGNvbXBvbmVudCAyICovCisJZGVsdGEgPSBjdXIyICogMjsKKwljdXIyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDMgKi8KKwllcnJvcnB0clsyXSA9IChGU0VSUk9SKSAoYnByZXZlcnIyICsgY3VyMik7CisJY3VyMiArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA1ICovCisJYnByZXZlcnIyID0gYmVsb3dlcnIyICsgY3VyMjsKKwliZWxvd2VycjIgPSBibmV4dGVycjsKKwljdXIyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDcgKi8KKyAgICAgIH0KKyAgICAgIC8qIEF0IHRoaXMgcG9pbnQgY3VyTiBjb250YWlucyB0aGUgNy8xNiBlcnJvciB2YWx1ZSB0byBiZSBwcm9wYWdhdGVkCisgICAgICAgKiB0byB0aGUgbmV4dCBwaXhlbCBvbiB0aGUgY3VycmVudCBsaW5lLCBhbmQgYWxsIHRoZSBlcnJvcnMgZm9yIHRoZQorICAgICAgICogbmV4dCBsaW5lIGhhdmUgYmVlbiBzaGlmdGVkIG92ZXIuICBXZSBhcmUgdGhlcmVmb3JlIHJlYWR5IHRvIG1vdmUgb24uCisgICAgICAgKi8KKyAgICAgIGlucHRyICs9IGRpcjM7CQkvKiBBZHZhbmNlIHBpeGVsIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBvdXRwdHIgKz0gZGlyOworICAgICAgZXJyb3JwdHIgKz0gZGlyMzsJCS8qIGFkdmFuY2UgZXJyb3JwdHIgdG8gY3VycmVudCBjb2x1bW4gKi8KKyAgICB9CisgICAgLyogUG9zdC1sb29wIGNsZWFudXA6IHdlIG11c3QgdW5sb2FkIHRoZSBmaW5hbCBlcnJvciB2YWx1ZXMgaW50byB0aGUKKyAgICAgKiBmaW5hbCBmc2Vycm9yc1tdIGVudHJ5LiAgTm90ZSB3ZSBuZWVkIG5vdCB1bmxvYWQgYmVsb3dlcnJOIGJlY2F1c2UKKyAgICAgKiBpdCBpcyBmb3IgdGhlIGR1bW15IGNvbHVtbiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGFjdHVhbCBhcnJheS4KKyAgICAgKi8KKyAgICBlcnJvcnB0clswXSA9IChGU0VSUk9SKSBicHJldmVycjA7IC8qIHVubG9hZCBwcmV2IGVycnMgaW50byBhcnJheSAqLworICAgIGVycm9ycHRyWzFdID0gKEZTRVJST1IpIGJwcmV2ZXJyMTsKKyAgICBlcnJvcnB0clsyXSA9IChGU0VSUk9SKSBicHJldmVycjI7CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgZXJyb3ItbGltaXRpbmcgdHJhbnNmZXIgZnVuY3Rpb24gKGxvb2t1cCB0YWJsZSkuCisgKiBUaGUgcmF3IEYtUyBlcnJvciBjb21wdXRhdGlvbiBjYW4gcG90ZW50aWFsbHkgY29tcHV0ZSBlcnJvciB2YWx1ZXMgb2YgdXAgdG8KKyAqICstIE1BWEpTQU1QTEUuICBCdXQgd2Ugd2FudCB0aGUgbWF4aW11bSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gYSBwaXhlbCB0byBiZQorICogbXVjaCBsZXNzLCBvdGhlcndpc2Ugb2J2aW91c2x5IHdyb25nIHBpeGVscyB3aWxsIGJlIGNyZWF0ZWQuICAoVHlwaWNhbAorICogZWZmZWN0cyBpbmNsdWRlIHdlaXJkIGZyaW5nZXMgYXQgY29sb3ItYXJlYSBib3VuZGFyaWVzLCBpc29sYXRlZCBicmlnaHQKKyAqIHBpeGVscyBpbiBhIGRhcmsgYXJlYSwgZXRjLikgIFRoZSBzdGFuZGFyZCBhZHZpY2UgZm9yIGF2b2lkaW5nIHRoaXMgcHJvYmxlbQorICogaXMgdG8gZW5zdXJlIHRoYXQgdGhlICJjb3JuZXJzIiBvZiB0aGUgY29sb3IgY3ViZSBhcmUgYWxsb2NhdGVkIGFzIG91dHB1dAorICogY29sb3JzOyB0aGVuIHJlcGVhdGVkIGVycm9ycyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gY2Fubm90IGNhdXNlIGNhc2NhZGluZworICogZXJyb3IgYnVpbGR1cC4gIEhvd2V2ZXIsIHRoYXQgb25seSBwcmV2ZW50cyB0aGUgZXJyb3IgZnJvbSBnZXR0aW5nCisgKiBjb21wbGV0ZWx5IG91dCBvZiBoYW5kOyBBYXJvbiBHaWxlcyByZXBvcnRzIHRoYXQgZXJyb3IgbGltaXRpbmcgaW1wcm92ZXMKKyAqIHRoZSByZXN1bHRzIGV2ZW4gd2l0aCBjb3JuZXIgY29sb3JzIGFsbG9jYXRlZC4KKyAqIEEgc2ltcGxlIGNsYW1waW5nIG9mIHRoZSBlcnJvciB2YWx1ZXMgdG8gYWJvdXQgKy0gTUFYSlNBTVBMRS84IHdvcmtzIHByZXR0eQorICogd2VsbCwgYnV0IHRoZSBzbW9vdGhlciB0cmFuc2ZlciBmdW5jdGlvbiB1c2VkIGJlbG93IGlzIGV2ZW4gYmV0dGVyLiAgVGhhbmtzCisgKiB0byBBYXJvbiBHaWxlcyBmb3IgdGhpcyBpZGVhLgorICovCisKK0xPQ0FMKHZvaWQpCitpbml0X2Vycm9yX2xpbWl0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGVycm9yX2xpbWl0ZXIgdGFibGUgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgaW50ICogdGFibGU7CisgIGludCBpbiwgb3V0OworCisgIHRhYmxlID0gKGludCAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIChNQVhKU0FNUExFKjIrMSkgKiBTSVpFT0YoaW50KSk7CisgIHRhYmxlICs9IE1BWEpTQU1QTEU7CQkvKiBzbyBjYW4gaW5kZXggLU1BWEpTQU1QTEUgLi4gK01BWEpTQU1QTEUgKi8KKyAgY3F1YW50aXplLT5lcnJvcl9saW1pdGVyID0gdGFibGU7CisKKyNkZWZpbmUgU1RFUFNJWkUgKChNQVhKU0FNUExFKzEpLzE2KQorICAvKiBNYXAgZXJyb3JzIDE6MSB1cCB0byArLSBNQVhKU0FNUExFLzE2ICovCisgIG91dCA9IDA7CisgIGZvciAoaW4gPSAwOyBpbiA8IFNURVBTSVpFOyBpbisrLCBvdXQrKykgeworICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7CisgIH0KKyAgLyogTWFwIGVycm9ycyAxOjIgdXAgdG8gKy0gMypNQVhKU0FNUExFLzE2ICovCisgIGZvciAoOyBpbiA8IFNURVBTSVpFKjM7IGluKyssIG91dCArPSAoaW4mMSkgPyAwIDogMSkgeworICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7CisgIH0KKyAgLyogQ2xhbXAgdGhlIHJlc3QgdG8gZmluYWwgb3V0IHZhbHVlICh3aGljaCBpcyAoTUFYSlNBTVBMRSsxKS84KSAqLworICBmb3IgKDsgaW4gPD0gTUFYSlNBTVBMRTsgaW4rKykgeworICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7CisgIH0KKyN1bmRlZiBTVEVQU0laRQorfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBlYWNoIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzczEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisKKyAgLyogU2VsZWN0IHRoZSByZXByZXNlbnRhdGl2ZSBjb2xvcnMgYW5kIGZpbGwgaW4gY2luZm8tPmNvbG9ybWFwICovCisgIGNpbmZvLT5jb2xvcm1hcCA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXA7CisgIHNlbGVjdF9jb2xvcnMoY2luZm8sIGNxdWFudGl6ZS0+ZGVzaXJlZCk7CisgIC8qIEZvcmNlIG5leHQgcGFzcyB0byB6ZXJvIHRoZSBjb2xvciBpbmRleCB0YWJsZSAqLworICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzczIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgZWFjaCBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzXzJfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgaW50IGk7CisKKyAgLyogT25seSBGLVMgZGl0aGVyaW5nIG9yIG5vIGRpdGhlcmluZyBpcyBzdXBwb3J0ZWQuICovCisgIC8qIElmIHVzZXIgYXNrcyBmb3Igb3JkZXJlZCBkaXRoZXIsIGdpdmUgaGltIEYtUy4gKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSAhPSBKRElUSEVSX05PTkUpCisgICAgY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9GUzsKKworICBpZiAoaXNfcHJlX3NjYW4pIHsKKyAgICAvKiBTZXQgdXAgbWV0aG9kIHBvaW50ZXJzICovCisgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBwcmVzY2FuX3F1YW50aXplOworICAgIGNxdWFudGl6ZS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3MxOworICAgIGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkID0gVFJVRTsgLyogQWx3YXlzIHplcm8gaGlzdG9ncmFtICovCisgIH0gZWxzZSB7CisgICAgLyogU2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLworICAgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9GUykKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcGFzczJfZnNfZGl0aGVyOworICAgIGVsc2UKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcGFzczJfbm9fZGl0aGVyOworICAgIGNxdWFudGl6ZS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3MyOworCisgICAgLyogTWFrZSBzdXJlIGNvbG9yIGNvdW50IGlzIGFjY2VwdGFibGUgKi8KKyAgICBpID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOworICAgIGlmIChpIDwgMSkKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX0ZFV19DT0xPUlMsIDEpOworICAgIGlmIChpID4gTUFYTlVNQ09MT1JTKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsIE1BWE5VTUNPTE9SUyk7CisKKyAgICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfRlMpIHsKKyAgICAgIHNpemVfdCBhcnJheXNpemUgPSAoc2l6ZV90KSAoKGNpbmZvLT5vdXRwdXRfd2lkdGggKyAyKSAqCisJCQkJICAgKDMgKiBTSVpFT0YoRlNFUlJPUikpKTsKKyAgICAgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2UgaWYgd2UgZGlkbid0IGFscmVhZHkuICovCisgICAgICBpZiAoY3F1YW50aXplLT5mc2Vycm9ycyA9PSBOVUxMKQorCWNxdWFudGl6ZS0+ZnNlcnJvcnMgPSAoRlNFUlJQVFIpICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpCisJICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBhcnJheXNpemUpOworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvcGFnYXRlZCBlcnJvcnMgdG8gemVyby4gKi8KKyAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY3F1YW50aXplLT5mc2Vycm9ycywgYXJyYXlzaXplKTsKKyAgICAgIC8qIE1ha2UgdGhlIGVycm9yLWxpbWl0IHRhYmxlIGlmIHdlIGRpZG4ndCBhbHJlYWR5LiAqLworICAgICAgaWYgKGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlciA9PSBOVUxMKQorCWluaXRfZXJyb3JfbGltaXQoY2luZm8pOworICAgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gRkFMU0U7CisgICAgfQorCisgIH0KKyAgLyogWmVybyB0aGUgaGlzdG9ncmFtIG9yIGludmVyc2UgY29sb3IgbWFwLCBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEhJU1RfQzBfRUxFTVM7IGkrKykgeworICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBoaXN0b2dyYW1baV0sCisJCUhJU1RfQzFfRUxFTVMqSElTVF9DMl9FTEVNUyAqIFNJWkVPRihoaXN0Y2VsbCkpOworICAgIH0KKyAgICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IEZBTFNFOworICB9Cit9CisKKworLyoKKyAqIFN3aXRjaCB0byBhIG5ldyBleHRlcm5hbCBjb2xvcm1hcCBiZXR3ZWVuIG91dHB1dCBwYXNzZXMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCituZXdfY29sb3JfbWFwXzJfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisKKyAgLyogUmVzZXQgdGhlIGludmVyc2UgY29sb3IgbWFwICovCisgIGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkID0gVFJVRTsKK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIDItcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF8ycGFzc19xdWFudGl6ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplOworICBpbnQgaTsKKworICBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jcXVhbnRpemVyKSk7CisgIGNpbmZvLT5jcXVhbnRpemUgPSAoc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICopIGNxdWFudGl6ZTsKKyAgY3F1YW50aXplLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfMl9xdWFudDsKKyAgY3F1YW50aXplLT5wdWIubmV3X2NvbG9yX21hcCA9IG5ld19jb2xvcl9tYXBfMl9xdWFudDsKKyAgY3F1YW50aXplLT5mc2Vycm9ycyA9IE5VTEw7CS8qIGZsYWcgb3B0aW9uYWwgYXJyYXlzIG5vdCBhbGxvY2F0ZWQgKi8KKyAgY3F1YW50aXplLT5lcnJvcl9saW1pdGVyID0gTlVMTDsKKworICAvKiBNYWtlIHN1cmUgamRtYXN0ZXIgZGlkbid0IGdpdmUgbWUgYSBjYXNlIEkgY2FuJ3QgaGFuZGxlICovCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gMykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOworCisgIC8qIEFsbG9jYXRlIHRoZSBoaXN0b2dyYW0vaW52ZXJzZSBjb2xvcm1hcCBzdG9yYWdlICovCisgIGNxdWFudGl6ZS0+aGlzdG9ncmFtID0gKGhpc3QzZCkgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBISVNUX0MwX0VMRU1TICogU0laRU9GKGhpc3QyZCkpOworICBmb3IgKGkgPSAwOyBpIDwgSElTVF9DMF9FTEVNUzsgaSsrKSB7CisgICAgY3F1YW50aXplLT5oaXN0b2dyYW1baV0gPSAoaGlzdDJkKSAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICBISVNUX0MxX0VMRU1TKkhJU1RfQzJfRUxFTVMgKiBTSVpFT0YoaGlzdGNlbGwpKTsKKyAgfQorICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7IC8qIGhpc3RvZ3JhbSBpcyBnYXJiYWdlIG5vdyAqLworCisgIC8qIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoZSBjb21wbGV0ZWQgY29sb3JtYXAsIGlmIHJlcXVpcmVkLgorICAgKiBXZSBkbyB0aGlzIG5vdyBzaW5jZSBpdCBpcyBGQVIgc3RvcmFnZSBhbmQgbWF5IGFmZmVjdAorICAgKiB0aGUgbWVtb3J5IG1hbmFnZXIncyBzcGFjZSBjYWxjdWxhdGlvbnMuCisgICAqLworICBpZiAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCkgeworICAgIC8qIE1ha2Ugc3VyZSBjb2xvciBjb3VudCBpcyBhY2NlcHRhYmxlICovCisgICAgaW50IGRlc2lyZWQgPSBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOworICAgIC8qIExvd2VyIGJvdW5kIG9uICMgb2YgY29sb3JzIC4uLiBzb21ld2hhdCBhcmJpdHJhcnkgYXMgbG9uZyBhcyA+IDAgKi8KKyAgICBpZiAoZGVzaXJlZCA8IDgpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCA4KTsKKyAgICAvKiBNYWtlIHN1cmUgY29sb3JtYXAgaW5kZXhlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgSlNBTVBMRXMgKi8KKyAgICBpZiAoZGVzaXJlZCA+IE1BWE5VTUNPTE9SUykKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX01BTllfQ09MT1JTLCBNQVhOVU1DT0xPUlMpOworICAgIGNxdWFudGl6ZS0+c3ZfY29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbyxKUE9PTF9JTUFHRSwgKEpESU1FTlNJT04pIGRlc2lyZWQsIChKRElNRU5TSU9OKSAzKTsKKyAgICBjcXVhbnRpemUtPmRlc2lyZWQgPSBkZXNpcmVkOworICB9IGVsc2UKKyAgICBjcXVhbnRpemUtPnN2X2NvbG9ybWFwID0gTlVMTDsKKworICAvKiBPbmx5IEYtUyBkaXRoZXJpbmcgb3Igbm8gZGl0aGVyaW5nIGlzIHN1cHBvcnRlZC4gKi8KKyAgLyogSWYgdXNlciBhc2tzIGZvciBvcmRlcmVkIGRpdGhlciwgZ2l2ZSBoaW0gRi1TLiAqLworICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlICE9IEpESVRIRVJfTk9ORSkKKyAgICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOworCisgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2UgaWYgbmVjZXNzYXJ5LgorICAgKiBUaGlzIGlzbid0IHJlYWxseSBuZWVkZWQgdW50aWwgcGFzcyAyLCBidXQgYWdhaW4gaXQgaXMgRkFSIHN0b3JhZ2UuCisgICAqIEFsdGhvdWdoIHdlIHdpbGwgY29wZSB3aXRoIGEgbGF0ZXIgY2hhbmdlIGluIGRpdGhlcl9tb2RlLAorICAgKiB3ZSBkbyBub3QgcHJvbWlzZSB0byBob25vciBtYXhfbWVtb3J5X3RvX3VzZSBpZiBkaXRoZXJfbW9kZSBjaGFuZ2VzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX0ZTKSB7CisgICAgY3F1YW50aXplLT5mc2Vycm9ycyA9IChGU0VSUlBUUikgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKiAoMyAqIFNJWkVPRihGU0VSUk9SKSkpKTsKKyAgICAvKiBNaWdodCBhcyB3ZWxsIGNyZWF0ZSB0aGUgZXJyb3ItbGltaXRpbmcgdGFibGUgdG9vLiAqLworICAgIGluaXRfZXJyb3JfbGltaXQoY2luZm8pOworICB9Cit9CisKKyNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9qcGVnL2p1dGlscy5jIGIvY29tbW9uL2pwZWcvanV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4YTk1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2p1dGlscy5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICoganV0aWxzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0YWJsZXMgYW5kIG1pc2NlbGxhbmVvdXMgdXRpbGl0eSByb3V0aW5lcyBuZWVkZWQKKyAqIGZvciBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgorICogTm90ZSB3ZSBwcmVmaXggYWxsIGdsb2JhbCBuYW1lcyB3aXRoICJqIiB0byBtaW5pbWl6ZSBjb25mbGljdHMgd2l0aAorICogYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIGpwZWdfemlnemFnX29yZGVyW2ldIGlzIHRoZSB6aWd6YWctb3JkZXIgcG9zaXRpb24gb2YgdGhlIGkndGggZWxlbWVudAorICogb2YgYSBEQ1QgYmxvY2sgcmVhZCBpbiBuYXR1cmFsIG9yZGVyIChsZWZ0IHRvIHJpZ2h0LCB0b3AgdG8gYm90dG9tKS4KKyAqLworCisjaWYgMAkJCQkvKiBUaGlzIHRhYmxlIGlzIG5vdCBhY3R1YWxseSBuZWVkZWQgaW4gdjZhICovCisKK2NvbnN0IGludCBqcGVnX3ppZ3phZ19vcmRlcltEQ1RTSVpFMl0gPSB7CisgICAwLCAgMSwgIDUsICA2LCAxNCwgMTUsIDI3LCAyOCwKKyAgIDIsICA0LCAgNywgMTMsIDE2LCAyNiwgMjksIDQyLAorICAgMywgIDgsIDEyLCAxNywgMjUsIDMwLCA0MSwgNDMsCisgICA5LCAxMSwgMTgsIDI0LCAzMSwgNDAsIDQ0LCA1MywKKyAgMTAsIDE5LCAyMywgMzIsIDM5LCA0NSwgNTIsIDU0LAorICAyMCwgMjIsIDMzLCAzOCwgNDYsIDUxLCA1NSwgNjAsCisgIDIxLCAzNCwgMzcsIDQ3LCA1MCwgNTYsIDU5LCA2MSwKKyAgMzUsIDM2LCA0OCwgNDksIDU3LCA1OCwgNjIsIDYzCit9OworCisjZW5kaWYKKworLyoKKyAqIGpwZWdfbmF0dXJhbF9vcmRlcltpXSBpcyB0aGUgbmF0dXJhbC1vcmRlciBwb3NpdGlvbiBvZiB0aGUgaSd0aCBlbGVtZW50CisgKiBvZiB6aWd6YWcgb3JkZXIuCisgKgorICogV2hlbiByZWFkaW5nIGNvcnJ1cHRlZCBkYXRhLCB0aGUgSHVmZm1hbiBkZWNvZGVycyBjb3VsZCBhdHRlbXB0CisgKiB0byByZWZlcmVuY2UgYW4gZW50cnkgYmV5b25kIHRoZSBlbmQgb2YgdGhpcyBhcnJheSAoaWYgdGhlIGRlY29kZWQKKyAqIHplcm8gcnVuIGxlbmd0aCByZWFjaGVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYmxvY2spLiAgVG8gcHJldmVudAorICogd2lsZCBzdG9yZXMgd2l0aG91dCBhZGRpbmcgYW4gaW5uZXItbG9vcCB0ZXN0LCB3ZSBwdXQgc29tZSBleHRyYQorICogIjYzInMgYWZ0ZXIgdGhlIHJlYWwgZW50cmllcy4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgZXh0cmEgY29lZmZpY2llbnQKKyAqIHRvIGJlIHN0b3JlZCBpbiBsb2NhdGlvbiA2MyBvZiB0aGUgYmxvY2ssIG5vdCBzb21ld2hlcmUgcmFuZG9tLgorICogVGhlIHdvcnN0IGNhc2Ugd291bGQgYmUgYSBydW4tbGVuZ3RoIG9mIDE1LCB3aGljaCBtZWFucyB3ZSBuZWVkIDE2CisgKiBmYWtlIGVudHJpZXMuCisgKi8KKworY29uc3QgaW50IGpwZWdfbmF0dXJhbF9vcmRlcltEQ1RTSVpFMisxNl0gPSB7CisgIDAsICAxLCAgOCwgMTYsICA5LCAgMiwgIDMsIDEwLAorIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsICA0LCAgNSwKKyAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCisgMjcsIDIwLCAxMywgIDYsICA3LCAxNCwgMjEsIDI4LAorIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwKKyAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCisgNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAorIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MywKKyA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIC8qIGV4dHJhIGVudHJpZXMgZm9yIHNhZmV0eSBpbiBkZWNvZGVyICovCisgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzCit9OworCisKKy8qCisgKiBBcml0aG1ldGljIHV0aWxpdGllcworICovCisKK0dMT0JBTChsb25nKQoramRpdl9yb3VuZF91cCAobG9uZyBhLCBsb25nIGIpCisvKiBDb21wdXRlIGEvYiByb3VuZGVkIHVwIHRvIG5leHQgaW50ZWdlciwgaWUsIGNlaWwoYS9iKSAqLworLyogQXNzdW1lcyBhID49IDAsIGIgPiAwICovCit7CisgIHJldHVybiAoYSArIGIgLSAxTCkgLyBiOworfQorCisKK0dMT0JBTChsb25nKQoranJvdW5kX3VwIChsb25nIGEsIGxvbmcgYikKKy8qIENvbXB1dGUgYSByb3VuZGVkIHVwIHRvIG5leHQgbXVsdGlwbGUgb2YgYiwgaWUsIGNlaWwoYS9iKSpiICovCisvKiBBc3N1bWVzIGEgPj0gMCwgYiA+IDAgKi8KK3sKKyAgYSArPSBiIC0gMUw7CisgIHJldHVybiBhIC0gKGEgJSBiKTsKK30KKworCisvKiBPbiBub3JtYWwgbWFjaGluZXMgd2UgY2FuIGFwcGx5IE1FTUNPUFkoKSBhbmQgTUVNWkVSTygpIHRvIHNhbXBsZSBhcnJheXMKKyAqIGFuZCBjb2VmZmljaWVudC1ibG9jayBhcnJheXMuICBUaGlzIHdvbid0IHdvcmsgb24gODB4ODYgYmVjYXVzZSB0aGUgYXJyYXlzCisgKiBhcmUgRkFSIGFuZCB3ZSdyZSBhc3N1bWluZyBhIHNtYWxsLXBvaW50ZXIgbWVtb3J5IG1vZGVsLiAgSG93ZXZlciwgc29tZQorICogRE9TIGNvbXBpbGVycyBwcm92aWRlIGZhci1wb2ludGVyIHZlcnNpb25zIG9mIG1lbWNweSgpIGFuZCBtZW1zZXQoKSBldmVuCisgKiBpbiB0aGUgc21hbGwtbW9kZWwgbGlicmFyaWVzLiAgVGhlc2Ugd2lsbCBiZSB1c2VkIGlmIFVTRV9GTUVNIGlzIGRlZmluZWQuCisgKiBPdGhlcndpc2UsIHRoZSByb3V0aW5lcyBiZWxvdyBkbyBpdCB0aGUgaGFyZCB3YXkuICAoVGhlIHBlcmZvcm1hbmNlIGNvc3QKKyAqIGlzIG5vdCBhbGwgdGhhdCBncmVhdCwgYmVjYXVzZSB0aGVzZSByb3V0aW5lcyBhcmVuJ3QgdmVyeSBoZWF2aWx5IHVzZWQuKQorICovCisKKyNpZm5kZWYgTkVFRF9GQVJfUE9JTlRFUlMJLyogbm9ybWFsIGNhc2UsIHNhbWUgYXMgcmVndWxhciBtYWNyb3MgKi8KKyNkZWZpbmUgRk1FTUNPUFkoZGVzdCxzcmMsc2l6ZSkJTUVNQ09QWShkZXN0LHNyYyxzaXplKQorI2RlZmluZSBGTUVNWkVSTyh0YXJnZXQsc2l6ZSkJTUVNWkVSTyh0YXJnZXQsc2l6ZSkKKyNlbHNlCQkJCS8qIDgweDg2IGNhc2UsIGRlZmluZSBpZiB3ZSBjYW4gKi8KKyNpZmRlZiBVU0VfRk1FTQorI2RlZmluZSBGTUVNQ09QWShkZXN0LHNyYyxzaXplKQlfZm1lbWNweSgodm9pZCBGQVIgKikoZGVzdCksIChjb25zdCB2b2lkIEZBUiAqKShzcmMpLCAoc2l6ZV90KShzaXplKSkKKyNkZWZpbmUgRk1FTVpFUk8odGFyZ2V0LHNpemUpCV9mbWVtc2V0KCh2b2lkIEZBUiAqKSh0YXJnZXQpLCAwLCAoc2l6ZV90KShzaXplKSkKKyNlbmRpZgorI2VuZGlmCisKKworR0xPQkFMKHZvaWQpCitqY29weV9zYW1wbGVfcm93cyAoSlNBTVBBUlJBWSBpbnB1dF9hcnJheSwgaW50IHNvdXJjZV9yb3csCisJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2FycmF5LCBpbnQgZGVzdF9yb3csCisJCSAgIGludCBudW1fcm93cywgSkRJTUVOU0lPTiBudW1fY29scykKKy8qIENvcHkgc29tZSByb3dzIG9mIHNhbXBsZXMgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlci4KKyAqIG51bV9yb3dzIHJvd3MgYXJlIGNvcGllZCBmcm9tIGlucHV0X2FycmF5W3NvdXJjZV9yb3crK10KKyAqIHRvIG91dHB1dF9hcnJheVtkZXN0X3JvdysrXTsgdGhlc2UgYXJlYXMgbWF5IG92ZXJsYXAgZm9yIGR1cGxpY2F0aW9uLgorICogVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJyYXlzIG11c3QgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyBudW1fY29scy4KKyAqLworeworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworI2lmZGVmIEZNRU1DT1BZCisgIHJlZ2lzdGVyIHNpemVfdCBjb3VudCA9IChzaXplX3QpIChudW1fY29scyAqIFNJWkVPRihKU0FNUExFKSk7CisjZWxzZQorICByZWdpc3RlciBKRElNRU5TSU9OIGNvdW50OworI2VuZGlmCisgIHJlZ2lzdGVyIGludCByb3c7CisKKyAgaW5wdXRfYXJyYXkgKz0gc291cmNlX3JvdzsKKyAgb3V0cHV0X2FycmF5ICs9IGRlc3Rfcm93OworCisgIGZvciAocm93ID0gbnVtX3Jvd3M7IHJvdyA+IDA7IHJvdy0tKSB7CisgICAgaW5wdHIgPSAqaW5wdXRfYXJyYXkrKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2FycmF5Kys7CisjaWZkZWYgRk1FTUNPUFkKKyAgICBGTUVNQ09QWShvdXRwdHIsIGlucHRyLCBjb3VudCk7CisjZWxzZQorICAgIGZvciAoY291bnQgPSBudW1fY29sczsgY291bnQgPiAwOyBjb3VudC0tKQorICAgICAgKm91dHB0cisrID0gKmlucHRyKys7CS8qIG5lZWRuJ3QgYm90aGVyIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyNlbmRpZgorICB9Cit9CisKKworR0xPQkFMKHZvaWQpCitqY29weV9ibG9ja19yb3cgKEpCTE9DS1JPVyBpbnB1dF9yb3csIEpCTE9DS1JPVyBvdXRwdXRfcm93LAorCQkgSkRJTUVOU0lPTiBudW1fYmxvY2tzKQorLyogQ29weSBhIHJvdyBvZiBjb2VmZmljaWVudCBibG9ja3MgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlci4gKi8KK3sKKyNpZmRlZiBGTUVNQ09QWQorICBGTUVNQ09QWShvdXRwdXRfcm93LCBpbnB1dF9yb3csIG51bV9ibG9ja3MgKiAoRENUU0laRTIgKiBTSVpFT0YoSkNPRUYpKSk7CisjZWxzZQorICByZWdpc3RlciBKQ09FRlBUUiBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBsb25nIGNvdW50OworCisgIGlucHRyID0gKEpDT0VGUFRSKSBpbnB1dF9yb3c7CisgIG91dHB0ciA9IChKQ09FRlBUUikgb3V0cHV0X3JvdzsKKyAgZm9yIChjb3VudCA9IChsb25nKSBudW1fYmxvY2tzICogRENUU0laRTI7IGNvdW50ID4gMDsgY291bnQtLSkgeworICAgICpvdXRwdHIrKyA9ICppbnB0cisrOworICB9CisjZW5kaWYKK30KKworCitHTE9CQUwodm9pZCkKK2p6ZXJvX2ZhciAodm9pZCBGQVIgKiB0YXJnZXQsIHNpemVfdCBieXRlc3RvemVybykKKy8qIFplcm8gb3V0IGEgY2h1bmsgb2YgRkFSIG1lbW9yeS4gKi8KKy8qIFRoaXMgbWlnaHQgYmUgc2FtcGxlLWFycmF5IGRhdGEsIGJsb2NrLWFycmF5IGRhdGEsIG9yIGFsbG9jX2xhcmdlIGRhdGEuICovCit7CisjaWZkZWYgRk1FTVpFUk8KKyAgRk1FTVpFUk8odGFyZ2V0LCBieXRlc3RvemVybyk7CisjZWxzZQorICByZWdpc3RlciBjaGFyIEZBUiAqIHB0ciA9IChjaGFyIEZBUiAqKSB0YXJnZXQ7CisgIHJlZ2lzdGVyIHNpemVfdCBjb3VudDsKKworICBmb3IgKGNvdW50ID0gYnl0ZXN0b3plcm87IGNvdW50ID4gMDsgY291bnQtLSkgeworICAgICpwdHIrKyA9IDA7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2pwZWcvanZlcnNpb24uaCBiL2NvbW1vbi9qcGVnL2p2ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3MmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL2p2ZXJzaW9uLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGp2ZXJzaW9uLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBzb2Z0d2FyZSB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uLgorICovCisKKworI2RlZmluZSBKVkVSU0lPTgkiNmIgIDI3LU1hci0xOTk4IgorCisjZGVmaW5lIEpDT1BZUklHSFQJIkNvcHlyaWdodCAoQykgMTk5OCwgVGhvbWFzIEcuIExhbmUiCmRpZmYgLS1naXQgYS9jb21tb24vanBlZy9tYWtlZmlsZS5jZmcgYi9jb21tb24vanBlZy9tYWtlZmlsZS5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiM2I5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9qcGVnL21ha2VmaWxlLmNmZwpAQCAtMCwwICsxLDMxOSBAQAorIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCisKKyMgbWFrZWZpbGUuY2ZnIGlzIGVkaXRlZCBieSBjb25maWd1cmUgdG8gcHJvZHVjZSBhIGN1c3RvbSBNYWtlZmlsZS4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKKworIyBGb3IgY29tcGlsaW5nIHdpdGggc291cmNlIGFuZCBvYmplY3QgZmlsZXMgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLgorc3JjZGlyID0gQHNyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworIyBXaGVyZSB0byBpbnN0YWxsIHRoZSBwcm9ncmFtcyBhbmQgbWFuIHBhZ2VzLgorcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorYmluZGlyID0gJChleGVjX3ByZWZpeCkvYmluCitsaWJkaXIgPSAkKGV4ZWNfcHJlZml4KS9saWIKK2luY2x1ZGVkaXIgPSAkKHByZWZpeCkvaW5jbHVkZQorYmlucHJlZml4ID0KK21hbnByZWZpeCA9CittYW5leHQgPSAxCittYW5kaXIgPSAkKHByZWZpeCkvbWFuL21hbiQobWFuZXh0KQorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSBAQ0NACisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgorQ0ZMQUdTPSBAQ0ZMQUdTQCBAQ1BQRkxBR1NAIEBJTkNMVURFRkxBR1NACisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisjIEhvd2V2ZXIsIGFueSBzcGVjaWFsIGRlZmluZXMgZm9yIGFuc2kya25yLmMgbWF5IGJlIGluY2x1ZGVkIGhlcmU6CitBTlNJMktOUkZMQUdTPSBAQU5TSTJLTlJGTEFHU0AKKworIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKK0xERkxBR1M9IEBMREZMQUdTQAorCisjIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgorTERMSUJTPSBATElCU0AKKworIyBJZiB1c2luZyBHTlUgbGlidG9vbCwgTElCVE9PTCByZWZlcmVuY2VzIGl0OyBpZiBub3QsIExJQlRPT0wgaXMgZW1wdHkuCitMSUJUT09MID0gQExJQlRPT0xACisjICQoTykgZXhwYW5kcyB0byAibG8iIGlmIHVzaW5nIGxpYnRvb2wsIHBsYWluICJvIiBpZiBub3QuCisjIFNpbWlsYXJseSwgJChBKSBleHBhbmRzIHRvICJsYSIgb3IgImEiLgorTyA9IEBPQAorQSA9IEBBQAorCisjIExpYnJhcnkgdmVyc2lvbiBJRDsgbGlidG9vbCB1c2VzIHRoaXMgZm9yIHRoZSBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uIG51bWJlci4KKyMgTm90ZTogd2Ugc3VnZ2VzdCB0aGlzIG1hdGNoIHRoZSBtYWNybyBvZiB0aGUgc2FtZSBuYW1lIGluIGpwZWdsaWIuaC4KK0pQRUdfTElCX1ZFUlNJT04gPSBASlBFR19MSUJfVkVSU0lPTkAKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgRm9yIFVuaXggdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgbWF5IHdhbnQKKyMgdG8gdXNlIGptZW1hbnNpLm8gb3Igam1lbW5hbWUubyBpZiB5b3UgaGF2ZSBsaW1pdGVkIHN3YXAgc3BhY2UuCitTWVNERVBNRU09IEBNRU1PUllNR1JACisKKyMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKK1NIRUxMPSAvYmluL3NoCisjIGxpbmtlcgorTE49IEBMTkAKKyMgZmlsZSBkZWxldGlvbiBjb21tYW5kCitSTT0gcm0gLWYKKyMgZGlyZWN0b3J5IGNyZWF0aW9uIGNvbW1hbmQKK01LRElSPSBta2RpcgorIyBsaWJyYXJ5ICguYSkgZmlsZSBjcmVhdGlvbiBjb21tYW5kCitBUj0gYXIgcmMKKyMgc2Vjb25kIHN0ZXAgaW4gLmEgY3JlYXRpb24gKHVzZSAidG91Y2giIGlmIG5vdCBuZWVkZWQpCitBUjI9IEBSQU5MSUJACisjIGluc3RhbGxhdGlvbiBwcm9ncmFtCitJTlNUQUxMPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTT0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfTElCPSBASU5TVEFMTF9MSUJACitJTlNUQUxMX0RBVEE9IEBJTlNUQUxMX0RBVEFACisKKyMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCisKKyMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCitMSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCisgICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAorICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCisgICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKKyAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKKyAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYworIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKK1NZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKKyMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KK0FQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCisgICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAorICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKK1NPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCisjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcworSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKKyAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCisjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAorICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAorICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAorICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKKyAgICAgICAgbWFrdm1zLm9wdAorQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKKyAgICAgICAgamNvbmZpZy52bXMKK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAorT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAorICAgICAgICB0ZXN0aW1ncC5qcGcKK0RJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAorICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK0NPTU9CSkVDVFM9IGpjb21hcGkuJChPKSBqdXRpbHMuJChPKSBqZXJyb3IuJChPKSBqbWVtbWdyLiQoTykgJChTWVNERVBNRU0pCisjIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitDTElCT0JKRUNUUz0gamNhcGltaW4uJChPKSBqY2FwaXN0ZC4kKE8pIGpjdHJhbnMuJChPKSBqY3BhcmFtLiQoTykgXAorICAgICAgICBqZGF0YWRzdC4kKE8pIGpjaW5pdC4kKE8pIGpjbWFzdGVyLiQoTykgamNtYXJrZXIuJChPKSBqY21haW5jdC4kKE8pIFwKKyAgICAgICAgamNwcmVwY3QuJChPKSBqY2NvZWZjdC4kKE8pIGpjY29sb3IuJChPKSBqY3NhbXBsZS4kKE8pIGpjaHVmZi4kKE8pIFwKKyAgICAgICAgamNwaHVmZi4kKE8pIGpjZGN0bWdyLiQoTykgamZkY3Rmc3QuJChPKSBqZmRjdGZsdC4kKE8pIFwKKyAgICAgICAgamZkY3RpbnQuJChPKQorIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitETElCT0JKRUNUUz0gamRhcGltaW4uJChPKSBqZGFwaXN0ZC4kKE8pIGpkdHJhbnMuJChPKSBqZGF0YXNyYy4kKE8pIFwKKyAgICAgICAgamRtYXN0ZXIuJChPKSBqZGlucHV0LiQoTykgamRtYXJrZXIuJChPKSBqZGh1ZmYuJChPKSBqZHBodWZmLiQoTykgXAorICAgICAgICBqZG1haW5jdC4kKE8pIGpkY29lZmN0LiQoTykgamRwb3N0Y3QuJChPKSBqZGRjdG1nci4kKE8pIFwKKyAgICAgICAgamlkY3Rmc3QuJChPKSBqaWRjdGZsdC4kKE8pIGppZGN0aW50LiQoTykgamlkY3RyZWQuJChPKSBcCisgICAgICAgIGpkc2FtcGxlLiQoTykgamRjb2xvci4kKE8pIGpxdWFudDEuJChPKSBqcXVhbnQyLiQoTykgamRtZXJnZS4kKE8pCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmEKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy4kKE8pIHJkcHBtLiQoTykgcmRnaWYuJChPKSByZHRhcmdhLiQoTykgcmRybGUuJChPKSBcCisgICAgICAgIHJkYm1wLiQoTykgcmRzd2l0Y2guJChPKSBjZGpwZWcuJChPKQorRE9CSkVDVFM9IGRqcGVnLiQoTykgd3JwcG0uJChPKSB3cmdpZi4kKE8pIHdydGFyZ2EuJChPKSB3cnJsZS4kKE8pIFwKKyAgICAgICAgd3JibXAuJChPKSByZGNvbG1hcC4kKE8pIGNkanBlZy4kKE8pCitUUk9CSkVDVFM9IGpwZWd0cmFuLiQoTykgcmRzd2l0Y2guJChPKSBjZGpwZWcuJChPKSB0cmFuc3VwcC4kKE8pCisKKworYWxsOiBAQTJLX0RFUFNAIGxpYmpwZWcuJChBKQorCisjIFNwZWNpYWwgY29tcGlsYXRpb24gcnVsZXMgdG8gc3VwcG9ydCBhbnNpMmtuciBhbmQgbGlidG9vbC4KKy5TVUZGSVhFUzogLmxvIC5sYQorCisjIEhvdyB0byBjb21waWxlIHdpdGggbGlidG9vbC4KK0BDT01fTFRALmMubG86CitAQ09NX0xUQAkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoQ0ZMQUdTKSAtYyAkKHNyY2RpcikvJCouYworCisjIEhvdyB0byB1c2UgYW5zaTJrbnIsIHdoZW4gbm90IHVzaW5nIGxpYnRvb2wuCitAQ09NX0EyS0AuYy5vOgorQENPTV9BMktACS4vYW5zaTJrbnIgJChzcmNkaXIpLyQqLmMga25yLyQqLmMKK0BDT01fQTJLQAkkKENDKSAkKENGTEFHUykgLWMga25yLyQqLmMKK0BDT01fQTJLQAkkKFJNKSBrbnIvJCouYworCisjIEhvdyB0byB1c2UgYW5zaTJrbnIgQU5EIGxpYnRvb2wuCitAQ09NX0EyS0AuYy5sbzoKK0BDT01fQTJLQAkuL2Fuc2kya25yICQoc3JjZGlyKS8kKi5jIGtuci8kKi5jCitAQ09NX0EyS0AJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKENGTEFHUykgLWMga25yLyQqLmMKK0BDT01fQTJLQAkkKFJNKSBrbnIvJCouYworCithbnNpMmtucjogYW5zaTJrbnIuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKEFOU0kyS05SRkxBR1MpIC1vIGFuc2kya25yICQoc3JjZGlyKS9hbnNpMmtuci5jCisJJChNS0RJUikga25yCisKKyMgdGhlIGxpYnJhcnk6CisKKyMgd2l0aG91dCBsaWJ0b29sOgorbGlianBlZy5hOiBAQTJLX0RFUFNAICQoTElCT0JKRUNUUykKKwkkKFJNKSBsaWJqcGVnLmEKKwkkKEFSKSBsaWJqcGVnLmEgICQoTElCT0JKRUNUUykKKwkkKEFSMikgbGlianBlZy5hCisKKyMgd2l0aCBsaWJ0b29sOgorbGlianBlZy5sYTogQEEyS19ERVBTQCAkKExJQk9CSkVDVFMpCisJJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDKSAtbyBsaWJqcGVnLmxhICQoTElCT0JKRUNUUykgXAorCQktcnBhdGggJChsaWJkaXIpIC12ZXJzaW9uLWluZm8gJChKUEVHX0xJQl9WRVJTSU9OKQorCisjIHNhbXBsZSBwcm9ncmFtczoKKworY2pwZWc6ICQoQ09CSkVDVFMpIGxpYmpwZWcuJChBKQorCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcgJChDT0JKRUNUUykgbGlianBlZy4kKEEpICQoTERMSUJTKQorCitkanBlZzogJChET0JKRUNUUykgbGlianBlZy4kKEEpCisJJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLiQoQSkgJChMRExJQlMpCisKK2pwZWd0cmFuOiAkKFRST0JKRUNUUykgbGlianBlZy4kKEEpCisJJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbiAkKFRST0JKRUNUUykgbGlianBlZy4kKEEpICQoTERMSUJTKQorCityZGpwZ2NvbTogcmRqcGdjb20uJChPKQorCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20uJChPKSAkKExETElCUykKKword3JqcGdjb206IHdyanBnY29tLiQoTykKKwkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLiQoTykgJChMRExJQlMpCisKKyMgSW5zdGFsbGF0aW9uIHJ1bGVzOgorCitpbnN0YWxsOiBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbSBARk9SQ0VfSU5TVEFMTF9MSUJACisJJChJTlNUQUxMX1BST0dSQU0pIGNqcGVnICQoYmluZGlyKS8kKGJpbnByZWZpeCljanBlZworCSQoSU5TVEFMTF9QUk9HUkFNKSBkanBlZyAkKGJpbmRpcikvJChiaW5wcmVmaXgpZGpwZWcKKwkkKElOU1RBTExfUFJPR1JBTSkganBlZ3RyYW4gJChiaW5kaXIpLyQoYmlucHJlZml4KWpwZWd0cmFuCisJJChJTlNUQUxMX1BST0dSQU0pIHJkanBnY29tICQoYmluZGlyKS8kKGJpbnByZWZpeClyZGpwZ2NvbQorCSQoSU5TVEFMTF9QUk9HUkFNKSB3cmpwZ2NvbSAkKGJpbmRpcikvJChiaW5wcmVmaXgpd3JqcGdjb20KKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2NqcGVnLjEgJChtYW5kaXIpLyQobWFucHJlZml4KWNqcGVnLiQobWFuZXh0KQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvZGpwZWcuMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpZGpwZWcuJChtYW5leHQpCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qcGVndHJhbi4xICQobWFuZGlyKS8kKG1hbnByZWZpeClqcGVndHJhbi4kKG1hbmV4dCkKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL3JkanBnY29tLjEgJChtYW5kaXIpLyQobWFucHJlZml4KXJkanBnY29tLiQobWFuZXh0KQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2Rpcikvd3JqcGdjb20uMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpd3JqcGdjb20uJChtYW5leHQpCisKK2luc3RhbGwtbGliOiBsaWJqcGVnLiQoQSkgaW5zdGFsbC1oZWFkZXJzCisJJChJTlNUQUxMX0xJQikgbGlianBlZy4kKEEpICQobGliZGlyKS8kKGJpbnByZWZpeClsaWJqcGVnLiQoQSkKKworaW5zdGFsbC1oZWFkZXJzOiBqY29uZmlnLmgKKwkkKElOU1RBTExfREFUQSkgamNvbmZpZy5oICQoaW5jbHVkZWRpcikvamNvbmZpZy5oCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qcGVnbGliLmggJChpbmNsdWRlZGlyKS9qcGVnbGliLmgKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2ptb3JlY2ZnLmggJChpbmNsdWRlZGlyKS9qbW9yZWNmZy5oCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qZXJyb3IuaCAkKGluY2x1ZGVkaXIpL2plcnJvci5oCisKK2NsZWFuOgorCSQoUk0pICoubyAqLmxvIGxpYmpwZWcuYSBsaWJqcGVnLmxhCisJJChSTSkgY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KKwkkKFJNKSBhbnNpMmtuciBjb3JlIHRlc3RvdXQqIGNvbmZpZy5sb2cgY29uZmlnLnN0YXR1cworCSQoUk0pIC1yIGtuciAubGlicyBfbGlicworCitkaXN0Y2xlYW46IGNsZWFuCisJJChSTSkgTWFrZWZpbGUgamNvbmZpZy5oIGxpYnRvb2wgY29uZmlnLmNhY2hlCisKK3Rlc3Q6IGNqcGVnIGRqcGVnIGpwZWd0cmFuCisJJChSTSkgdGVzdG91dCoKKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcKKwkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICAkKHNyY2RpcikvdGVzdGltZy5wcG0KKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtICQoc3JjZGlyKS90ZXN0cHJvZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyAkKHNyY2RpcikvdGVzdGltZy5wcG0KKwkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyAkKHNyY2RpcikvdGVzdHByb2cuanBnCisJY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCWNtcCAkKHNyY2RpcikvdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwljbXAgJChzcmNkaXIpL3Rlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwljbXAgJChzcmNkaXIpL3Rlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwljbXAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKworY2hlY2s6IHRlc3QKKworIyBNaXN0YWtlIGNhdGNoZXI6CisKK2pjb25maWcuaDogamNvbmZpZy5kb2MKKwllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgorCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgorCWV4aXQgMQorCisjIEdOVSBNYWtlIGxpa2VzIHRvIGtub3cgd2hpY2ggdGFyZ2V0IG5hbWVzIGFyZSBub3QgcmVhbGx5IGZpbGVzIHRvIGJlIG1hZGU6CisuUEhPTlk6IGFsbCBpbnN0YWxsIGluc3RhbGwtbGliIGluc3RhbGwtaGVhZGVycyBjbGVhbiBkaXN0Y2xlYW4gdGVzdCBjaGVjaworCisKK2pjYXBpbWluLiQoTyk6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC4kKE8pOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3QuJChPKTogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3IuJChPKTogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3IuJChPKTogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYuJChPKTogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQuJChPKTogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC4kKE8pOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIuJChPKTogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLiQoTyk6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLiQoTyk6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0uJChPKTogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi4kKE8pOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC4kKE8pOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUuJChPKTogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMuJChPKTogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4uJChPKTogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLiQoTyk6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC4kKE8pOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy4kKE8pOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC4kKE8pOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci4kKE8pOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci4kKE8pOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi4kKE8pOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQuJChPKTogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3QuJChPKTogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLiQoTyk6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci4kKE8pOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS4kKE8pOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLiQoTyk6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0LiQoTyk6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS4kKE8pOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy4kKE8pOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3IuJChPKTogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQuJChPKTogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC4kKE8pOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50LiQoTyk6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQuJChPKTogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC4kKE8pOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50LiQoTyk6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQuJChPKTogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLiQoTyk6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIuJChPKToganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLiQoTyk6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci4kKE8pOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kuJChPKTogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS4kKE8pOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLiQoTyk6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy4kKE8pOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy4kKE8pOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcuJChPKTogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcuJChPKTogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4uJChPKToganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS4kKE8pOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS4kKE8pOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcuJChPKTogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC4kKE8pOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2guJChPKTogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLiQoTyk6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLiQoTyk6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS4kKE8pOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYuJChPKTogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLiQoTyk6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLiQoTyk6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2EuJChPKTogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAuJChPKTogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLiQoTyk6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS4kKE8pOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUuJChPKTogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2NvbW1vbi9uZXR3b3JrL01ha2VmaWxlLmluIGIvY29tbW9uL25ldHdvcmsvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlZDMwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9uZXR3b3JrL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTcgQEAKKworU1JDUyA9IFRjcFNvY2tldC5jeHgKKworT0JKUyA9ICQoU1JDUzouY3h4PS5vKQorCitESVJfQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikgQFNPQ0tMRU5fVF9ERUZJTkVACisKK2xpYnJhcnkgPSBsaWJuZXR3b3JrLmEKKworYWxsOjogJChsaWJyYXJ5KQorCiskKGxpYnJhcnkpOiAkKE9CSlMpCisJcm0gLWYgJChsaWJyYXJ5KQorCSQoQVIpICQobGlicmFyeSkgJChPQkpTKQorCSQoUkFOTElCKSAkKGxpYnJhcnkpCisKKyMgZm9sbG93ZWQgYnkgYm9pbGVycGxhdGUubWsKZGlmZiAtLWdpdCBhL2NvbW1vbi9uZXR3b3JrL1NvY2tldC5oIGIvY29tbW9uL25ldHdvcmsvU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzZGEyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9uZXR3b3JrL1NvY2tldC5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSBTb2NrZXQuaCAtIGFic3RyYWN0IGJhc2UtY2xhc3MgZm9yIGFueSBraW5kIG9mIG5ldHdvcmsgc3RyZWFtL3NvY2tldAorCisjaWZuZGVmIF9fTkVUV09SS19TT0NLRVRfSF9fCisjZGVmaW5lIF9fTkVUV09SS19TT0NLRVRfSF9fCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxyZHIvRmRJblN0cmVhbS5oPgorI2luY2x1ZGUgPHJkci9GZE91dFN0cmVhbS5oPgorI2luY2x1ZGUgPHJkci9FeGNlcHRpb24uaD4KKworbmFtZXNwYWNlIG5ldHdvcmsgeworCisgIGNsYXNzIFNvY2tldCB7CisgIHB1YmxpYzoKKyAgICBTb2NrZXQoaW50IGZkKQorICAgICAgOiBpbnN0cmVhbShuZXcgcmRyOjpGZEluU3RyZWFtKGZkKSksCisgICAgICBvdXRzdHJlYW0obmV3IHJkcjo6RmRPdXRTdHJlYW0oZmQpKSwKKyAgICAgIG93blN0cmVhbXModHJ1ZSksIGlzU2h1dGRvd25fKGZhbHNlKSwKKyAgICAgIHF1ZXJ5Q29ubmVjdGlvbihmYWxzZSkge30KKyAgICB2aXJ0dWFsIH5Tb2NrZXQoKSB7CisgICAgICBpZiAob3duU3RyZWFtcykgeworICAgICAgICBkZWxldGUgaW5zdHJlYW07CisgICAgICAgIGRlbGV0ZSBvdXRzdHJlYW07CisgICAgICB9CisgICAgfQorICAgIHJkcjo6RmRJblN0cmVhbSAmaW5TdHJlYW0oKSB7cmV0dXJuICppbnN0cmVhbTt9CisgICAgcmRyOjpGZE91dFN0cmVhbSAmb3V0U3RyZWFtKCkge3JldHVybiAqb3V0c3RyZWFtO30KKyAgICBpbnQgZ2V0RmQoKSB7cmV0dXJuIG91dHN0cmVhbS0+Z2V0RmQoKTt9CisKKyAgICAvLyBpZiBzaHV0ZG93bigpIGlzIG92ZXJyaWRkZW4gdGhlbiB0aGUgb3ZlcnJpZGUgTVVTVCBjYWxsIG9uIHRvIGhlcmUKKyAgICB2aXJ0dWFsIHZvaWQgc2h1dGRvd24oKSB7aXNTaHV0ZG93bl8gPSB0cnVlO30KKyAgICBib29sIGlzU2h1dGRvd24oKSBjb25zdCB7cmV0dXJuIGlzU2h1dGRvd25fO30KKworICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZW5kIG9mIHRoZSBzb2NrZXQKKyAgICB2aXJ0dWFsIGNoYXIqIGdldE15QWRkcmVzcygpID0gMDsgLy8gYSBzdHJpbmcgZS5nLiAiMTkyLjE2OC4wLjEiCisgICAgdmlydHVhbCBpbnQgZ2V0TXlQb3J0KCkgPSAwOworICAgIHZpcnR1YWwgY2hhciogZ2V0TXlFbmRwb2ludCgpID0gMDsgLy8gPGFkZHJlc3M+Ojo8cG9ydD4KKworICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZW1vdGUgZW5kIG9mIHRoZSBzb2NrZXQKKyAgICB2aXJ0dWFsIGNoYXIqIGdldFBlZXJBZGRyZXNzKCkgPSAwOyAvLyBhIHN0cmluZyBlLmcuICIxOTIuMTY4LjAuMSIKKyAgICB2aXJ0dWFsIGludCBnZXRQZWVyUG9ydCgpID0gMDsKKyAgICB2aXJ0dWFsIGNoYXIqIGdldFBlZXJFbmRwb2ludCgpID0gMDsgLy8gPGFkZHJlc3M+Ojo8cG9ydD4KKworICAgIC8vIElzIHRoZSByZW1vdGUgZW5kIG9uIHRoZSBzYW1lIG1hY2hpbmU/CisgICAgdmlydHVhbCBib29sIHNhbWVNYWNoaW5lKCkgPSAwOworCisgICAgLy8gV2FzIHRoZXJlIGEgIj8iIGluIHRoZSBDb25uZWN0aW9uRmlsdGVyIHVzZWQgdG8gYWNjZXB0IHRoaXMgU29ja2V0PworICAgIHZvaWQgc2V0UmVxdWlyZXNRdWVyeSgpIHtxdWVyeUNvbm5lY3Rpb24gPSB0cnVlO30KKyAgICBib29sIHJlcXVpcmVzUXVlcnkoKSBjb25zdCB7cmV0dXJuIHF1ZXJ5Q29ubmVjdGlvbjt9CisKKyAgcHJvdGVjdGVkOgorICAgIFNvY2tldCgpIDogaW5zdHJlYW0oMCksIG91dHN0cmVhbSgwKSwgb3duU3RyZWFtcyhmYWxzZSksCisgICAgICBpc1NodXRkb3duXyhmYWxzZSksIHF1ZXJ5Q29ubmVjdGlvbihmYWxzZSkge30KKyAgICBTb2NrZXQocmRyOjpGZEluU3RyZWFtKiBpLCByZHI6OkZkT3V0U3RyZWFtKiBvLCBib29sIG93bikKKyAgICAgIDogaW5zdHJlYW0oaSksIG91dHN0cmVhbShvKSwgb3duU3RyZWFtcyhvd24pLAorICAgICAgaXNTaHV0ZG93bl8oZmFsc2UpLCBxdWVyeUNvbm5lY3Rpb24oZmFsc2UpIHt9CisgICAgcmRyOjpGZEluU3RyZWFtKiBpbnN0cmVhbTsKKyAgICByZHI6OkZkT3V0U3RyZWFtKiBvdXRzdHJlYW07CisgICAgYm9vbCBvd25TdHJlYW1zOworICAgIGJvb2wgaXNTaHV0ZG93bl87CisgICAgYm9vbCBxdWVyeUNvbm5lY3Rpb247CisgIH07CisKKyAgY2xhc3MgQ29ubmVjdGlvbkZpbHRlciB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgdmVyaWZ5Q29ubmVjdGlvbihTb2NrZXQqIHMpID0gMDsKKyAgfTsKKworICBjbGFzcyBTb2NrZXRMaXN0ZW5lciB7CisgIHB1YmxpYzoKKyAgICBTb2NrZXRMaXN0ZW5lcigpIDogZmQoMCksIGZpbHRlcigwKSB7fQorICAgIHZpcnR1YWwgflNvY2tldExpc3RlbmVyKCkge30KKworICAgIC8vIHNodXRkb3duKCkgc3RvcHMgdGhlIHNvY2tldCBmcm9tIGFjY2VwdGluZyBmdXJ0aGVyIGNvbm5lY3Rpb25zCisgICAgdmlydHVhbCB2b2lkIHNodXRkb3duKCkgPSAwOworCisgICAgLy8gYWNjZXB0KCkgcmV0dXJucyBhIG5ldyBTb2NrZXQgb2JqZWN0IGlmIHRoZXJlIGlzIGEgY29ubmVjdGlvbgorICAgIC8vIGF0dGVtcHQgaW4gcHJvZ3Jlc3MgQU5EIGlmIHRoZSBjb25uZWN0aW9uIHBhc3NlcyB0aGUgZmlsdGVyCisgICAgLy8gaWYgb25lIGlzIGluc3RhbGxlZC4gIE90aGVyd2lzZSwgcmV0dXJucyAwLgorICAgIHZpcnR1YWwgU29ja2V0KiBhY2NlcHQoKSA9IDA7CisKKyAgICAvLyBzZXRGaWx0ZXIoKSBhcHBsaWVzIHRoZSBzcGVjaWZpZWQgZmlsdGVyIHRvIGFsbCBuZXcgY29ubmVjdGlvbnMKKyAgICB2b2lkIHNldEZpbHRlcihDb25uZWN0aW9uRmlsdGVyKiBmKSB7ZmlsdGVyID0gZjt9CisgICAgaW50IGdldEZkKCkge3JldHVybiBmZDt9CisgIHByb3RlY3RlZDoKKyAgICBpbnQgZmQ7CisgICAgQ29ubmVjdGlvbkZpbHRlciogZmlsdGVyOworICB9OworCisgIHN0cnVjdCBTb2NrZXRFeGNlcHRpb24gOiBwdWJsaWMgcmRyOjpTeXN0ZW1FeGNlcHRpb24geworICAgIFNvY2tldEV4Y2VwdGlvbihjb25zdCBjaGFyKiB0ZXh0LCBpbnQgZXJyXykgOiByZHI6OlN5c3RlbUV4Y2VwdGlvbih0ZXh0LCBlcnJfKSB7fQorICB9OworCisgIGNsYXNzIFNvY2tldFNlcnZlciB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5Tb2NrZXRTZXJ2ZXIoKSB7fQorCisgICAgLy8gYWRkU29ja2V0KCkgdGVsbHMgdGhlIHNlcnZlciB0byBzZXJ2ZSB0aGUgU29ja2V0LiAgVGhlIGNhbGxlcgorICAgIC8vICAgcmV0YWlucyBvd25lcnNoaXAgb2YgdGhlIFNvY2tldCAtIHRoZSBvbmx5IHdheSBmb3IgdGhlIHNlcnZlcgorICAgIC8vICAgdG8gZGlzY2FyZCBhIFNvY2tldCBpcyBieSBjYWxsaW5nIHNodXRkb3duKCkgb24gaXQuCisgICAgLy8gICBvdXRnb2luZyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgc29ja2V0IHdhcyBjcmVhdGVkIGJ5IGNvbm5lY3Rpbmcgb3V0CisgICAgLy8gICB0byBhbm90aGVyIGhvc3QsIG9yIGZhbHNlIGlmIHRoZSBzb2NrZXQgd2FzIGNyZWF0ZWQgYnkgYWNjZXB0KClpbmcKKyAgICAvLyAgIGFuIGluY29taW5nIGNvbm5lY3Rpb24uCisgICAgdmlydHVhbCB2b2lkIGFkZFNvY2tldChuZXR3b3JrOjpTb2NrZXQqIHNvY2ssIGJvb2wgb3V0Z29pbmc9ZmFsc2UpID0gMDsKKworICAgIC8vIHJlbW92ZVNvY2tldCgpIHRlbGxzIHRoZSBzZXJ2ZXIgdG8gc3RvcCBzZXJ2aW5nIHRoZSBTb2NrZXQuICBUaGUKKyAgICAvLyAgIGNhbGxlciByZXRhaW5zIG93bmVyc2hpcCBvZiB0aGUgU29ja2V0IC0gdGhlIHNlcnZlciBtdXN0IE5PVAorICAgIC8vICAgZGVsZXRlIHRoZSBTb2NrZXQhICBUaGlzIGNhbGwgaXMgdXNlZCBtYWlubHkgdG8gY2F1c2UgcGVyLVNvY2tldAorICAgIC8vICAgcmVzb3VyY2VzIHRvIGJlIGZyZWVkLgorICAgIHZpcnR1YWwgdm9pZCByZW1vdmVTb2NrZXQobmV0d29yazo6U29ja2V0KiBzb2NrKSA9IDA7CisKKyAgICAvLyBwcm9jZXNzU29ja2V0RXZlbnQoKSB0ZWxscyB0aGUgc2VydmVyIHRoZXJlIGlzIGEgU29ja2V0IHJlYWQgZXZlbnQuCisgICAgLy8gICBUaGUgaW1wbGVtZW50YXRpb24gY2FuIGluZGljYXRlIHRoYXQgdGhlIFNvY2tldCBpcyBubyBsb25nZXIgYWN0aXZlCisgICAgLy8gICBieSBjYWxsaW5nIHNodXRkb3duKCkgb24gaXQuICBUaGUgY2FsbGVyIHdpbGwgdGhlbiBjYWxsIHJlbW92ZVNvY2tldCgpCisgICAgLy8gICBzb29uIGFmdGVyIHByb2Nlc3NTb2NrZXRFdmVudCByZXR1cm5zLCB0byBhbGxvdyBhbnkgcHJlLVNvY2tldAorICAgIC8vICAgcmVzb3VyY2VzIHRvIGJlIHRpZGllZCB1cC4KKyAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc1NvY2tldEV2ZW50KG5ldHdvcms6OlNvY2tldCogc29jaykgPSAwOworCisgICAgLy8gY2hlY2tUaW1lb3V0cygpIGFsbG93cyB0aGUgc2VydmVyIHRvIGNoZWNrIHNvY2tldCB0aW1lb3V0cywgZXRjLiAgVGhlCisgICAgLy8gICByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUKKyAgICAvLyAgIGNoZWNrVGltZW91dHMoKSBzaG91bGQgYmUgY2FsbGVkIGFnYWluLiAgSWYgdGhpcyBudW1iZXIgaXMgemVybyB0aGVuCisgICAgLy8gICB0aGVyZSBpcyBubyB0aW1lb3V0IGFuZCBjaGVja1RpbWVvdXRzKCkgc2hvdWxkIGJlIGNhbGxlZCB0aGUgbmV4dCB0aW1lCisgICAgLy8gICBhbiBldmVudCBvY2N1cnMuCisgICAgdmlydHVhbCBpbnQgY2hlY2tUaW1lb3V0cygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBnZXREaXNhYmxlKCkge3JldHVybiBmYWxzZTt9OworICB9OworCit9CisKKyNlbmRpZiAvLyBfX05FVFdPUktfU09DS0VUX0hfXwpkaWZmIC0tZ2l0IGEvY29tbW9uL25ldHdvcmsvVGNwU29ja2V0LmN4eCBiL2NvbW1vbi9uZXR3b3JrL1RjcFNvY2tldC5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIxMmFjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9uZXR3b3JrL1RjcFNvY2tldC5jeHgKQEAgLTAsMCArMSw0OTkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2lmZGVmIFdJTjMyCisvLyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjZGVmaW5lIGVycm9yTnVtYmVyIFdTQUdldExhc3RFcnJvcigpCisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2Vsc2UKKyNkZWZpbmUgZXJyb3JOdW1iZXIgZXJybm8KKyNkZWZpbmUgY2xvc2Vzb2NrZXQgY2xvc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG5ldHdvcmsvVGNwU29ja2V0Lmg+CisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKyNpbmNsdWRlIDxyZmIvTG9nV3JpdGVyLmg+CisKKyNpZm5kZWYgVk5DX1NPQ0tMRU5fVAorI2RlZmluZSBWTkNfU09DS0xFTl9UIGludAorI2VuZGlmCisKKyNpZm5kZWYgSU5BRERSX05PTkUKKyNkZWZpbmUgSU5BRERSX05PTkUgKCh1bnNpZ25lZCBsb25nKS0xKQorI2VuZGlmCisjaWZuZGVmIElOQUREUl9MT09QQkFDSworI2RlZmluZSBJTkFERFJfTE9PUEJBQ0sgKCh1bnNpZ25lZCBsb25nKTB4N0YwMDAwMDEpCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIG5ldHdvcms7Cit1c2luZyBuYW1lc3BhY2UgcmRyOworCitzdGF0aWMgcmZiOjpMb2dXcml0ZXIgdmxvZygiVGNwU29ja2V0Iik7CisKKy8qIFR1bm5lbGxpbmcgc3VwcG9ydC4gKi8KK2ludCBuZXR3b3JrOjpmaW5kRnJlZVRjcFBvcnQgKHZvaWQpCit7CisgIGludCBzb2NrLCBwb3J0OworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisKKyAgaWYgKChzb2NrID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkKKyAgICB0aHJvdyBTb2NrZXRFeGNlcHRpb24gKCJ1bmFibGUgdG8gY3JlYXRlIHNvY2tldCIsIGVycm9yTnVtYmVyKTsKKworICBmb3IgKHBvcnQgPSBUVU5ORUxfUE9SVF9PRkZTRVQgKyA5OTsgcG9ydCA+IFRVTk5FTF9QT1JUX09GRlNFVDsgcG9ydC0tKSB7CisgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zICgodW5zaWduZWQgc2hvcnQpIHBvcnQpOworICAgIGlmIChiaW5kIChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZiAoYWRkcikpID09IDApIHsKKyAgICAgIGNsb3Nlc29ja2V0IChzb2NrKTsKKyAgICAgIHJldHVybiBwb3J0OworICAgIH0KKyAgfQorICB0aHJvdyBTb2NrZXRFeGNlcHRpb24gKCJubyBmcmVlIHBvcnQgaW4gcmFuZ2UiLCAwKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLy8gLT0tIFNvY2tldCBpbml0aWFsaXNhdGlvbgorc3RhdGljIGJvb2wgc29ja2V0c0luaXRpYWxpc2VkID0gZmFsc2U7CitzdGF0aWMgdm9pZCBpbml0U29ja2V0cygpIHsKKyAgaWYgKHNvY2tldHNJbml0aWFsaXNlZCkKKyAgICByZXR1cm47CisjaWZkZWYgV0lOMzIKKyAgV09SRCByZXF1aXJlZFZlcnNpb24gPSBNQUtFV09SRCgyLDApOworICBXU0FEQVRBIGluaXRSZXN1bHQ7CisgIAorICBpZiAoV1NBU3RhcnR1cChyZXF1aXJlZFZlcnNpb24sICZpbml0UmVzdWx0KSAhPSAwKQorICAgIHRocm93IFNvY2tldEV4Y2VwdGlvbigidW5hYmxlIHRvIGluaXRpYWxpc2UgV2luc29jazIiLCBlcnJvck51bWJlcik7CisjZWxzZQorICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisjZW5kaWYKKyAgc29ja2V0c0luaXRpYWxpc2VkID0gdHJ1ZTsKK30KKworCisvLyAtPS0gVGNwU29ja2V0CisKK1RjcFNvY2tldDo6VGNwU29ja2V0KGludCBzb2NrLCBib29sIGNsb3NlKQorICA6IFNvY2tldChuZXcgRmRJblN0cmVhbShzb2NrKSwgbmV3IEZkT3V0U3RyZWFtKHNvY2spLCB0cnVlKSwgY2xvc2VGZChjbG9zZSkKK3sKK30KKworVGNwU29ja2V0OjpUY3BTb2NrZXQoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCisgIDogY2xvc2VGZCh0cnVlKQoreworICBpbnQgc29jazsKKworICAvLyAtIENyZWF0ZSBhIHNvY2tldAorICBpbml0U29ja2V0cygpOworICBpZiAoKHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA8IDApCisgICAgdGhyb3cgU29ja2V0RXhjZXB0aW9uKCJ1bmFibGUgdG8gY3JlYXRlIHNvY2tldCIsIGVycm9yTnVtYmVyKTsKKworI2lmbmRlZiBXSU4zMgorICAvLyAtIEJ5IGRlZmF1bHQsIGNsb3NlIHRoZSBzb2NrZXQgb24gZXhlYygpCisgIGZjbnRsKHNvY2ssIEZfU0VURkQsIEZEX0NMT0VYRUMpOworI2VuZGlmCisKKyAgLy8gLSBDb25uZWN0IGl0IHRvIHNvbWV0aGluZworCisgIC8vIFRyeSBwcm9jZXNzaW5nIHRoZSBob3N0IGFzIGFuIElQIGFkZHJlc3MKKyAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoKGNoYXIgKilob3N0KTsKKyAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICBpZiAoKGludClhZGRyLnNpbl9hZGRyLnNfYWRkciA9PSAtMSkgeworICAgIC8vIEhvc3Qgd2FzIG5vdCBhbiBJUCBhZGRyZXNzIC0gdHJ5IHJlc29sdmluZyBhcyBETlMgbmFtZQorICAgIHN0cnVjdCBob3N0ZW50ICpob3N0aW5mbzsKKyAgICBob3N0aW5mbyA9IGdldGhvc3RieW5hbWUoKGNoYXIgKilob3N0KTsKKyAgICBpZiAoaG9zdGluZm8gJiYgaG9zdGluZm8tPmhfYWRkcikgeworICAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSAoKHN0cnVjdCBpbl9hZGRyICopaG9zdGluZm8tPmhfYWRkciktPnNfYWRkcjsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGUgPSBlcnJvck51bWJlcjsKKyAgICAgIGNsb3Nlc29ja2V0KHNvY2spOworICAgICAgdGhyb3cgU29ja2V0RXhjZXB0aW9uKCJ1bmFibGUgdG8gcmVzb2x2ZSBob3N0IGJ5IG5hbWUiLCBlKTsKKyAgICB9CisgIH0KKworICAvLyBBdHRlbXB0IHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBob3N0CisgIGZvciAoOzspIHsKKyAgICBpZiAoY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgIT0gMCkgeworICAgICAgaW50IGUgPSBlcnJvck51bWJlcjsKKyNpZm5kZWYgV0lOMzIKKyAgICAgIGlmIChlID09IEVJTlRSKQorCWNvbnRpbnVlOworI2VuZGlmCisgICAgICBjbG9zZXNvY2tldChzb2NrKTsKKyAgICAgIHRocm93IFNvY2tldEV4Y2VwdGlvbigidW5hYmxlIHRvIGNvbm5lY3QgdG8gaG9zdCIsIGUpOworICAgIH0gZWxzZSBicmVhazsKKyAgfQorCisgIC8vIERpc2FibGUgTmFnbGUncyBhbGdvcml0aG0sIHRvIHJlZHVjZSBsYXRlbmN5CisgIGVuYWJsZU5hZ2xlcyhzb2NrLCBmYWxzZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMKKyAgaW5zdHJlYW0gPSBuZXcgRmRJblN0cmVhbShzb2NrKTsKKyAgb3V0c3RyZWFtID0gbmV3IEZkT3V0U3RyZWFtKHNvY2spOworICBvd25TdHJlYW1zID0gdHJ1ZTsKK30KKworVGNwU29ja2V0Ojp+VGNwU29ja2V0KCkgeworICBpZiAoY2xvc2VGZCkKKyAgICBjbG9zZXNvY2tldChnZXRGZCgpKTsKK30KKworY2hhciogVGNwU29ja2V0OjpnZXRNeUFkZHJlc3MoKSB7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiAgaW5mbzsKKyAgc3RydWN0IGluX2FkZHIgICAgYWRkcjsKKyAgVk5DX1NPQ0tMRU5fVCBpbmZvX3NpemUgPSBzaXplb2YoaW5mbyk7CisKKyAgZ2V0c29ja25hbWUoZ2V0RmQoKSwgKHN0cnVjdCBzb2NrYWRkciAqKSZpbmZvLCAmaW5mb19zaXplKTsKKyAgbWVtY3B5KCZhZGRyLCAmaW5mby5zaW5fYWRkciwgc2l6ZW9mKGFkZHIpKTsKKworICBjaGFyKiBuYW1lID0gaW5ldF9udG9hKGFkZHIpOworICBpZiAobmFtZSkgeworICAgIHJldHVybiByZmI6OnN0ckR1cChuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmZiOjpzdHJEdXAoIiIpOworICB9Cit9CisKK2ludCBUY3BTb2NrZXQ6OmdldE15UG9ydCgpIHsKKyAgcmV0dXJuIGdldFNvY2tQb3J0KGdldEZkKCkpOworfQorCitjaGFyKiBUY3BTb2NrZXQ6OmdldE15RW5kcG9pbnQoKSB7CisgIHJmYjo6Q2hhckFycmF5IGFkZHJlc3M7IGFkZHJlc3MuYnVmID0gZ2V0TXlBZGRyZXNzKCk7CisgIGludCBwb3J0ID0gZ2V0TXlQb3J0KCk7CisKKyAgaW50IGJ1ZmxlbiA9IHN0cmxlbihhZGRyZXNzLmJ1ZikgKyAzMjsKKyAgY2hhciogYnVmZmVyID0gbmV3IGNoYXJbYnVmbGVuXTsKKyAgc3ByaW50ZihidWZmZXIsICIlczo6JWQiLCBhZGRyZXNzLmJ1ZiwgcG9ydCk7CisgIHJldHVybiBidWZmZXI7Cit9CisKK2NoYXIqIFRjcFNvY2tldDo6Z2V0UGVlckFkZHJlc3MoKSB7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiAgaW5mbzsKKyAgc3RydWN0IGluX2FkZHIgICAgYWRkcjsKKyAgVk5DX1NPQ0tMRU5fVCBpbmZvX3NpemUgPSBzaXplb2YoaW5mbyk7CisKKyAgZ2V0cGVlcm5hbWUoZ2V0RmQoKSwgKHN0cnVjdCBzb2NrYWRkciAqKSZpbmZvLCAmaW5mb19zaXplKTsKKyAgbWVtY3B5KCZhZGRyLCAmaW5mby5zaW5fYWRkciwgc2l6ZW9mKGFkZHIpKTsKKworICBjaGFyKiBuYW1lID0gaW5ldF9udG9hKGFkZHIpOworICBpZiAobmFtZSkgeworICAgIHJldHVybiByZmI6OnN0ckR1cChuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmZiOjpzdHJEdXAoIiIpOworICB9Cit9CisKK2ludCBUY3BTb2NrZXQ6OmdldFBlZXJQb3J0KCkgeworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gIGluZm87CisgIFZOQ19TT0NLTEVOX1QgaW5mb19zaXplID0gc2l6ZW9mKGluZm8pOworCisgIGdldHBlZXJuYW1lKGdldEZkKCksIChzdHJ1Y3Qgc29ja2FkZHIgKikmaW5mbywgJmluZm9fc2l6ZSk7CisgIHJldHVybiBudG9ocyhpbmZvLnNpbl9wb3J0KTsKK30KKworY2hhciogVGNwU29ja2V0OjpnZXRQZWVyRW5kcG9pbnQoKSB7CisgIHJmYjo6Q2hhckFycmF5IGFkZHJlc3M7IGFkZHJlc3MuYnVmID0gZ2V0UGVlckFkZHJlc3MoKTsKKyAgaW50IHBvcnQgPSBnZXRQZWVyUG9ydCgpOworCisgIGludCBidWZsZW4gPSBzdHJsZW4oYWRkcmVzcy5idWYpICsgMzI7CisgIGNoYXIqIGJ1ZmZlciA9IG5ldyBjaGFyW2J1Zmxlbl07CisgIHNwcmludGYoYnVmZmVyLCAiJXM6OiVkIiwgYWRkcmVzcy5idWYsIHBvcnQpOworICByZXR1cm4gYnVmZmVyOworfQorCitib29sIFRjcFNvY2tldDo6c2FtZU1hY2hpbmUoKSB7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBwZWVyYWRkciwgbXlhZGRyOworICBWTkNfU09DS0xFTl9UIGFkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKworICBnZXRwZWVybmFtZShnZXRGZCgpLCAoc3RydWN0IHNvY2thZGRyICopJnBlZXJhZGRyLCAmYWRkcmxlbik7CisgIGdldHNvY2tuYW1lKGdldEZkKCksIChzdHJ1Y3Qgc29ja2FkZHIgKikmbXlhZGRyLCAmYWRkcmxlbik7CisKKyAgcmV0dXJuIChwZWVyYWRkci5zaW5fYWRkci5zX2FkZHIgPT0gbXlhZGRyLnNpbl9hZGRyLnNfYWRkcik7Cit9CisKK3ZvaWQgVGNwU29ja2V0OjpzaHV0ZG93bigpCit7CisgIFNvY2tldDo6c2h1dGRvd24oKTsKKyAgOjpzaHV0ZG93bihnZXRGZCgpLCAyKTsKK30KKworYm9vbCBUY3BTb2NrZXQ6OmVuYWJsZU5hZ2xlcyhpbnQgc29jaywgYm9vbCBlbmFibGUpIHsKKyAgaW50IG9uZSA9IGVuYWJsZSA/IDAgOiAxOworICBpZiAoc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksCisJCSAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKKyAgICBpbnQgZSA9IGVycm9yTnVtYmVyOworICAgIHZsb2cuZXJyb3IoInVuYWJsZSB0byBzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZOiAlZCIsIGUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUY3BTb2NrZXQ6OmlzU29ja2V0KGludCBzb2NrKQoreworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gaW5mbzsKKyAgVk5DX1NPQ0tMRU5fVCBpbmZvX3NpemUgPSBzaXplb2YoaW5mbyk7CisgIHJldHVybiBnZXRzb2NrbmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmluZm8sICZpbmZvX3NpemUpID49IDA7Cit9CisKK2Jvb2wgVGNwU29ja2V0Ojppc0Nvbm5lY3RlZChpbnQgc29jaykKK3sKKyAgc3RydWN0IHNvY2thZGRyX2luIGluZm87CisgIFZOQ19TT0NLTEVOX1QgaW5mb19zaXplID0gc2l6ZW9mKGluZm8pOworICByZXR1cm4gZ2V0cGVlcm5hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZpbmZvLCAmaW5mb19zaXplKSA+PSAwOworfQorCitpbnQgVGNwU29ja2V0OjpnZXRTb2NrUG9ydChpbnQgc29jaykKK3sKKyAgc3RydWN0IHNvY2thZGRyX2luIGluZm87CisgIFZOQ19TT0NLTEVOX1QgaW5mb19zaXplID0gc2l6ZW9mKGluZm8pOworICBpZiAoZ2V0c29ja25hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZpbmZvLCAmaW5mb19zaXplKSA8IDApCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBudG9ocyhpbmZvLnNpbl9wb3J0KTsKK30KKworCitUY3BMaXN0ZW5lcjo6VGNwTGlzdGVuZXIoaW50IHBvcnQsIGJvb2wgbG9jYWxob3N0T25seSwgaW50IHNvY2ssIGJvb2wgY2xvc2VfKQorICA6IGNsb3NlRmQoY2xvc2VfKQoreworICBpZiAoc29jayAhPSAtMSkgeworICAgIGZkID0gc29jazsKKyAgICByZXR1cm47CisgIH0KKworICBpbml0U29ja2V0cygpOworICBpZiAoKGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPCAwKQorICAgIHRocm93IFNvY2tldEV4Y2VwdGlvbigidW5hYmxlIHRvIGNyZWF0ZSBsaXN0ZW5pbmcgc29ja2V0IiwgZXJyb3JOdW1iZXIpOworCisjaWZuZGVmIFdJTjMyCisgIC8vIC0gQnkgZGVmYXVsdCwgY2xvc2UgdGhlIHNvY2tldCBvbiBleGVjKCkKKyAgZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCisgIGludCBvbmUgPSAxOworICBpZiAoc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAorCQkgKGNoYXIgKikmb25lLCBzaXplb2Yob25lKSkgPCAwKSB7CisgICAgaW50IGUgPSBlcnJvck51bWJlcjsKKyAgICBjbG9zZXNvY2tldChmZCk7CisgICAgdGhyb3cgU29ja2V0RXhjZXB0aW9uKCJ1bmFibGUgdG8gY3JlYXRlIGxpc3RlbmluZyBzb2NrZXQiLCBlKTsKKyAgfQorI2VuZGlmCisKKyAgLy8gLSBCaW5kIGl0IHRvIHRoZSBkZXNpcmVkIHBvcnQKKyAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICBpZiAobG9jYWxob3N0T25seSkKKyAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7CisgIGVsc2UKKyAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworICBpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgeworICAgIGludCBlID0gZXJyb3JOdW1iZXI7CisgICAgY2xvc2Vzb2NrZXQoZmQpOworICAgIHRocm93IFNvY2tldEV4Y2VwdGlvbigidW5hYmxlIHRvIGJpbmQgbGlzdGVuaW5nIHNvY2tldCIsIGUpOworICB9CisKKyAgLy8gLSBTZXQgaXQgdG8gYmUgYSBsaXN0ZW5pbmcgc29ja2V0CisgIGlmIChsaXN0ZW4oZmQsIDUpIDwgMCkgeworICAgIGludCBlID0gZXJyb3JOdW1iZXI7CisgICAgY2xvc2Vzb2NrZXQoZmQpOworICAgIHRocm93IFNvY2tldEV4Y2VwdGlvbigidW5hYmxlIHRvIHNldCBzb2NrZXQgdG8gbGlzdGVuaW5nIG1vZGUiLCBlKTsKKyAgfQorfQorCitUY3BMaXN0ZW5lcjo6flRjcExpc3RlbmVyKCkgeworICBpZiAoY2xvc2VGZCkgY2xvc2Vzb2NrZXQoZmQpOworfQorCit2b2lkIFRjcExpc3RlbmVyOjpzaHV0ZG93bigpCit7CisjaWZkZWYgV0lOMzIKKyAgY2xvc2Vzb2NrZXQoZ2V0RmQoKSk7CisjZWxzZQorICA6OnNodXRkb3duKGdldEZkKCksIDIpOworI2VuZGlmCit9CisKKworU29ja2V0KgorVGNwTGlzdGVuZXI6OmFjY2VwdCgpIHsKKyAgaW50IG5ld19zb2NrID0gLTE7CisKKyAgLy8gQWNjZXB0IGFuIGluY29taW5nIGNvbm5lY3Rpb24KKyAgaWYgKChuZXdfc29jayA9IDo6YWNjZXB0KGZkLCAwLCAwKSkgPCAwKQorICAgIHRocm93IFNvY2tldEV4Y2VwdGlvbigidW5hYmxlIHRvIGFjY2VwdCBuZXcgY29ubmVjdGlvbiIsIGVycm9yTnVtYmVyKTsKKworI2lmbmRlZiBXSU4zMgorICAvLyAtIEJ5IGRlZmF1bHQsIGNsb3NlIHRoZSBzb2NrZXQgb24gZXhlYygpCisgIGZjbnRsKG5ld19zb2NrLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyNlbmRpZgorCisgIC8vIERpc2FibGUgTmFnbGUncyBhbGdvcml0aG0sIHRvIHJlZHVjZSBsYXRlbmN5CisgIFRjcFNvY2tldDo6ZW5hYmxlTmFnbGVzKG5ld19zb2NrLCBmYWxzZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgb2JqZWN0ICYgY2hlY2sgY29ubmVjdGlvbiBpcyBhbGxvd2VkCisgIFRjcFNvY2tldCogcyA9IG5ldyBUY3BTb2NrZXQobmV3X3NvY2spOworICBpZiAoZmlsdGVyICYmICFmaWx0ZXItPnZlcmlmeUNvbm5lY3Rpb24ocykpIHsKKyAgICBkZWxldGUgczsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gczsKK30KKwordm9pZCBUY3BMaXN0ZW5lcjo6Z2V0TXlBZGRyZXNzZXMoc3RkOjpsaXN0PGNoYXIqPiogcmVzdWx0KSB7CisgIGNvbnN0IGhvc3RlbnQqIGFkZHJzID0gZ2V0aG9zdGJ5bmFtZSgwKTsKKyAgaWYgKGFkZHJzID09IDApCisgICAgdGhyb3cgcmRyOjpTeXN0ZW1FeGNlcHRpb24oImdldGhvc3RieW5hbWUiLCBlcnJvck51bWJlcik7CisgIGlmIChhZGRycy0+aF9hZGRydHlwZSAhPSBBRl9JTkVUKQorICAgIHRocm93IHJkcjo6RXhjZXB0aW9uKCJnZXRNeUFkZHJlc3NlczogYmFkIGZhbWlseSIpOworICBmb3IgKGludCBpPTA7IGFkZHJzLT5oX2FkZHJfbGlzdFtpXSAhPSAwOyBpKyspIHsKKyAgICBjb25zdCBjaGFyKiBhZGRyQyA9IGluZXRfbnRvYSgqKChzdHJ1Y3QgaW5fYWRkciopYWRkcnMtPmhfYWRkcl9saXN0W2ldKSk7CisgICAgY2hhciogYWRkciA9IG5ldyBjaGFyW3N0cmxlbihhZGRyQykrMV07CisgICAgc3RyY3B5KGFkZHIsIGFkZHJDKTsKKyAgICByZXN1bHQtPnB1c2hfYmFjayhhZGRyKTsKKyAgfQorfQorCitpbnQgVGNwTGlzdGVuZXI6OmdldE15UG9ydCgpIHsKKyAgcmV0dXJuIFRjcFNvY2tldDo6Z2V0U29ja1BvcnQoZ2V0RmQoKSk7Cit9CisKKworVGNwRmlsdGVyOjpUY3BGaWx0ZXIoY29uc3QgY2hhciogc3BlYykgeworICByZmI6OkNoYXJBcnJheSB0bXA7CisgIHRtcC5idWYgPSByZmI6OnN0ckR1cChzcGVjKTsKKyAgd2hpbGUgKHRtcC5idWYpIHsKKyAgICByZmI6OkNoYXJBcnJheSBmaXJzdDsKKyAgICByZmI6OnN0clNwbGl0KHRtcC5idWYsICcsJywgJmZpcnN0LmJ1ZiwgJnRtcC5idWYpOworICAgIGlmIChzdHJsZW4oZmlyc3QuYnVmKSkKKyAgICAgIGZpbHRlci5wdXNoX2JhY2socGFyc2VQYXR0ZXJuKGZpcnN0LmJ1ZikpOworICB9Cit9CisKK1RjcEZpbHRlcjo6flRjcEZpbHRlcigpIHsKK30KKworCitzdGF0aWMgYm9vbAorcGF0dGVybk1hdGNoSVAoY29uc3QgVGNwRmlsdGVyOjpQYXR0ZXJuJiBwYXR0ZXJuLCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICB1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBpbmV0X2FkZHIoKGNoYXIgKil2YWx1ZSk7CisgIGlmIChhZGRyZXNzID09IElOQUREUl9OT05FKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiAoKHBhdHRlcm4uYWRkcmVzcyAmIHBhdHRlcm4ubWFzaykgPT0gKGFkZHJlc3MgJiBwYXR0ZXJuLm1hc2spKTsKK30KKworYm9vbAorVGNwRmlsdGVyOjp2ZXJpZnlDb25uZWN0aW9uKFNvY2tldCogcykgeworICByZmI6OkNoYXJBcnJheSBuYW1lOworCisgIG5hbWUuYnVmID0gcy0+Z2V0UGVlckFkZHJlc3MoKTsKKyAgc3RkOjpsaXN0PFRjcEZpbHRlcjo6UGF0dGVybj46Oml0ZXJhdG9yIGk7CisgIGZvciAoaT1maWx0ZXIuYmVnaW4oKTsgaSE9ZmlsdGVyLmVuZCgpOyBpKyspIHsKKyAgICBpZiAocGF0dGVybk1hdGNoSVAoKmksIG5hbWUuYnVmKSkgeworICAgICAgc3dpdGNoICgoKmkpLmFjdGlvbikgeworICAgICAgY2FzZSBBY2NlcHQ6CisgICAgICAgIHZsb2cuZGVidWcoIkFDQ0VQVCAlcyIsIG5hbWUuYnVmKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIFF1ZXJ5OgorICAgICAgICB2bG9nLmRlYnVnKCJRVUVSWSAlcyIsIG5hbWUuYnVmKTsKKyAgICAgICAgcy0+c2V0UmVxdWlyZXNRdWVyeSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgUmVqZWN0OgorICAgICAgICB2bG9nLmRlYnVnKCJSRUpFQ1QgJXMiLCBuYW1lLmJ1Zik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2bG9nLmRlYnVnKCJbUkVKRUNUXSAlcyIsIG5hbWUuYnVmKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisKK1RjcEZpbHRlcjo6UGF0dGVybiBUY3BGaWx0ZXI6OnBhcnNlUGF0dGVybihjb25zdCBjaGFyKiBwKSB7CisgIFRjcEZpbHRlcjo6UGF0dGVybiBwYXR0ZXJuOworCisgIGJvb2wgZXhwYW5kTWFzayA9IGZhbHNlOworICByZmI6OkNoYXJBcnJheSBhZGRyLCBtYXNrOworCisgIGlmIChyZmI6OnN0clNwbGl0KCZwWzFdLCAnLycsICZhZGRyLmJ1ZiwgJm1hc2suYnVmKSkgeworICAgIGlmIChyZmI6OnN0ckNvbnRhaW5zKG1hc2suYnVmLCAnLicpKSB7CisgICAgICBwYXR0ZXJuLm1hc2sgPSBpbmV0X2FkZHIobWFzay5idWYpOworICAgIH0gZWxzZSB7CisgICAgICBwYXR0ZXJuLm1hc2sgPSBhdG9pKG1hc2suYnVmKTsKKyAgICAgIGV4cGFuZE1hc2sgPSB0cnVlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwYXR0ZXJuLm1hc2sgPSAzMjsKKyAgICBleHBhbmRNYXNrID0gdHJ1ZTsKKyAgfQorICBpZiAoZXhwYW5kTWFzaykgeworICAgIHVuc2lnbmVkIGxvbmcgZXhwYW5kZWQgPSAwOworICAgIC8vICoqKiBjaGVjayBlbmRpYW5uZXNzIQorICAgIGZvciAoaW50IGk9MDsgaTwoaW50KXBhdHRlcm4ubWFzazsgaSsrKQorICAgICAgZXhwYW5kZWQgfD0gMTw8KDMxLWkpOworICAgIHBhdHRlcm4ubWFzayA9IGh0b25sKGV4cGFuZGVkKTsKKyAgfQorCisgIHBhdHRlcm4uYWRkcmVzcyA9IGluZXRfYWRkcihhZGRyLmJ1ZikgJiBwYXR0ZXJuLm1hc2s7CisgIGlmICgocGF0dGVybi5hZGRyZXNzID09IElOQUREUl9OT05FKSB8fAorICAgICAgKHBhdHRlcm4uYWRkcmVzcyA9PSAwKSkgcGF0dGVybi5tYXNrID0gMDsKKworICBzd2l0Y2gocFswXSkgeworICBjYXNlICcrJzogcGF0dGVybi5hY3Rpb24gPSBUY3BGaWx0ZXI6OkFjY2VwdDsgYnJlYWs7CisgIGNhc2UgJy0nOiBwYXR0ZXJuLmFjdGlvbiA9IFRjcEZpbHRlcjo6UmVqZWN0OyBicmVhazsKKyAgY2FzZSAnPyc6IHBhdHRlcm4uYWN0aW9uID0gVGNwRmlsdGVyOjpRdWVyeTsgYnJlYWs7CisgIH07CisKKyAgcmV0dXJuIHBhdHRlcm47Cit9CisKK2NoYXIqIFRjcEZpbHRlcjo6cGF0dGVyblRvU3RyKGNvbnN0IFRjcEZpbHRlcjo6UGF0dGVybiYgcCkgeworICBpbl9hZGRyIHRtcDsKKyAgcmZiOjpDaGFyQXJyYXkgYWRkciwgbWFzazsKKyAgdG1wLnNfYWRkciA9IHAuYWRkcmVzczsKKyAgYWRkci5idWYgPSByZmI6OnN0ckR1cChpbmV0X250b2EodG1wKSk7CisgIHRtcC5zX2FkZHIgPSBwLm1hc2s7CisgIG1hc2suYnVmID0gcmZiOjpzdHJEdXAoaW5ldF9udG9hKHRtcCkpOworICBjaGFyKiByZXN1bHQgPSBuZXcgY2hhcltzdHJsZW4oYWRkci5idWYpKzErc3RybGVuKG1hc2suYnVmKSsxKzFdOworICBzd2l0Y2ggKHAuYWN0aW9uKSB7CisgIGNhc2UgQWNjZXB0OiByZXN1bHRbMF0gPSAnKyc7IGJyZWFrOworICBjYXNlIFJlamVjdDogcmVzdWx0WzBdID0gJy0nOyBicmVhazsKKyAgY2FzZSBRdWVyeTogcmVzdWx0WzBdID0gJz8nOyBicmVhazsKKyAgfTsKKyAgcmVzdWx0WzFdID0gMDsKKyAgc3RyY2F0KHJlc3VsdCwgYWRkci5idWYpOworICBzdHJjYXQocmVzdWx0LCAiLyIpOworICBzdHJjYXQocmVzdWx0LCBtYXNrLmJ1Zik7CisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vbmV0d29yay9UY3BTb2NrZXQuaCBiL2NvbW1vbi9uZXR3b3JrL1RjcFNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGM2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vbmV0d29yay9UY3BTb2NrZXQuaApAQCAtMCwwICsxLDEwNSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLyAtPS0gVGNwU29ja2V0LmggLSBiYXNlLWNsYXNzIGZvciBUQ1Agc3RyZWFtIHNvY2tldHMuCisvLyAgICAgVGhpcyBoZWFkZXIgYWxzbyBkZWZpbmVzIHRoZSBUY3BMaXN0ZW5lciBjbGFzcywgdXNlZAorLy8gICAgIHRvIGxpc3RlbiBmb3IgaW5jb21pbmcgc29ja2V0IGNvbm5lY3Rpb25zIG92ZXIgVENQCisvLworLy8gICAgIE5COiBBbnkgZmlsZSBkZXNjcmlwdG9ycyBjcmVhdGVkIGJ5IHRoZSBUY3BTb2NrZXQgb3IKKy8vICAgICBUY3BMaXN0ZW5lciBjbGFzc2VzIGFyZSBjbG9zZS1vbi1leGVjIGlmIHRoZSBPUyBzdXBwb3J0cworLy8gICAgIGl0LiAgVGNwU29ja2V0cyBpbml0aWFsaXNlZCB3aXRoIGEgY2FsbGVyLXN1cHBsaWVkIGZkCisvLyAgICAgYXJlIE5PVCBzZXQgdG8gY2xvc2Utb24tZXhlYy4KKworI2lmbmRlZiBfX05FVFdPUktfVENQX1NPQ0tFVF9IX18KKyNkZWZpbmUgX19ORVRXT1JLX1RDUF9TT0NLRVRfSF9fCisKKyNpbmNsdWRlIDxuZXR3b3JrL1NvY2tldC5oPgorCisjaW5jbHVkZSA8bGlzdD4KKworLyogVHVubmVsbGluZyBzdXBwb3J0LiAqLworI2RlZmluZSBUVU5ORUxfUE9SVF9PRkZTRVQgNTUwMAorCituYW1lc3BhY2UgbmV0d29yayB7CisKKyAgLyogVHVubmVsbGluZyBzdXBwb3J0LiAqLworICBpbnQgZmluZEZyZWVUY3BQb3J0ICh2b2lkKTsKKworICBjbGFzcyBUY3BTb2NrZXQgOiBwdWJsaWMgU29ja2V0IHsKKyAgcHVibGljOgorICAgIFRjcFNvY2tldChpbnQgc29jaywgYm9vbCBjbG9zZT10cnVlKTsKKyAgICBUY3BTb2NrZXQoY29uc3QgY2hhciAqbmFtZSwgaW50IHBvcnQpOworICAgIHZpcnR1YWwgflRjcFNvY2tldCgpOworCisgICAgdmlydHVhbCBjaGFyKiBnZXRNeUFkZHJlc3MoKTsKKyAgICB2aXJ0dWFsIGludCBnZXRNeVBvcnQoKTsKKyAgICB2aXJ0dWFsIGNoYXIqIGdldE15RW5kcG9pbnQoKTsKKworICAgIHZpcnR1YWwgY2hhciogZ2V0UGVlckFkZHJlc3MoKTsKKyAgICB2aXJ0dWFsIGludCBnZXRQZWVyUG9ydCgpOworICAgIHZpcnR1YWwgY2hhciogZ2V0UGVlckVuZHBvaW50KCk7CisgICAgdmlydHVhbCBib29sIHNhbWVNYWNoaW5lKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2h1dGRvd24oKTsKKworICAgIHN0YXRpYyBib29sIGVuYWJsZU5hZ2xlcyhpbnQgc29jaywgYm9vbCBlbmFibGUpOworICAgIHN0YXRpYyBib29sIGlzU29ja2V0KGludCBzb2NrKTsKKyAgICBzdGF0aWMgYm9vbCBpc0Nvbm5lY3RlZChpbnQgc29jayk7CisgICAgc3RhdGljIGludCBnZXRTb2NrUG9ydChpbnQgc29jayk7CisgIHByaXZhdGU6CisgICAgYm9vbCBjbG9zZUZkOworICB9OworCisgIGNsYXNzIFRjcExpc3RlbmVyIDogcHVibGljIFNvY2tldExpc3RlbmVyIHsKKyAgcHVibGljOgorICAgIFRjcExpc3RlbmVyKGludCBwb3J0LCBib29sIGxvY2FsaG9zdE9ubHk9ZmFsc2UsIGludCBzb2NrPS0xLAorICAgICAgICAgICAgICAgIGJvb2wgY2xvc2U9dHJ1ZSk7CisgICAgdmlydHVhbCB+VGNwTGlzdGVuZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzaHV0ZG93bigpOworICAgIHZpcnR1YWwgU29ja2V0KiBhY2NlcHQoKTsKKworICAgIHZvaWQgZ2V0TXlBZGRyZXNzZXMoc3RkOjpsaXN0PGNoYXIqPiogYWRkcnMpOworICAgIGludCBnZXRNeVBvcnQoKTsKKworICBwcml2YXRlOgorICAgIGJvb2wgY2xvc2VGZDsKKyAgfTsKKworICBjbGFzcyBUY3BGaWx0ZXIgOiBwdWJsaWMgQ29ubmVjdGlvbkZpbHRlciB7CisgIHB1YmxpYzoKKyAgICBUY3BGaWx0ZXIoY29uc3QgY2hhciogZmlsdGVyKTsKKyAgICB2aXJ0dWFsIH5UY3BGaWx0ZXIoKTsKKworICAgIHZpcnR1YWwgYm9vbCB2ZXJpZnlDb25uZWN0aW9uKFNvY2tldCogcyk7CisKKyAgICB0eXBlZGVmIGVudW0ge0FjY2VwdCwgUmVqZWN0LCBRdWVyeX0gQWN0aW9uOworICAgIHN0cnVjdCBQYXR0ZXJuIHsKKyAgICAgIEFjdGlvbiBhY3Rpb247CisgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisgICAgICB1bnNpZ25lZCBsb25nIG1hc2s7CisgICAgfTsKKyAgICBzdGF0aWMgUGF0dGVybiBwYXJzZVBhdHRlcm4oY29uc3QgY2hhciogcyk7CisgICAgc3RhdGljIGNoYXIqIHBhdHRlcm5Ub1N0cihjb25zdCBQYXR0ZXJuJiBwKTsKKyAgcHJvdGVjdGVkOgorICAgIHN0ZDo6bGlzdDxQYXR0ZXJuPiBmaWx0ZXI7CisgIH07CisKK30KKworI2VuZGlmIC8vIF9fTkVUV09SS19UQ1BfU09DS0VUX0hfXwpkaWZmIC0tZ2l0IGEvY29tbW9uL25ldHdvcmsvbmV0d29yay5kc3AgYi9jb21tb24vbmV0d29yay9uZXR3b3JrLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTIzYTE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL25ldHdvcmsvbmV0d29yay5kc3AKQEAgLTAsMCArMSwxMjkgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibmV0d29yayIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiIDB4MDEwNA0KKw0KK0NGRz1uZXR3b3JrIC0gV2luMzIgRGVidWcgVW5pY29kZQ0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAibmV0d29yay5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAibmV0d29yay5tYWsiIENGRz0ibmV0d29yayAtIFdpbjMyIERlYnVnIFVuaWNvZGUiDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgIm5ldHdvcmsgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSAibmV0d29yayAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSAibmV0d29yayAtIFdpbjMyIERlYnVnIFVuaWNvZGUiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJuZXR3b3JrIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXFJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXFJlbGVhc2VcbmV0d29yayINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08xIC9JICIuLiIgL0ZJInJkci9tc3Zjd2FybmluZy5oIiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm5ldHdvcmsgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiLi5cRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXERlYnVnXG5ldHdvcmsiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi4iIC9GSSJyZHIvbXN2Y3dhcm5pbmcuaCIgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibmV0d29yayAtIFdpbjMyIERlYnVnIFVuaWNvZGUiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibmV0d29ya19fX1dpbjMyX0RlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibmV0d29ya19fX1dpbjMyX0RlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXERlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXERlYnVnX1VuaWNvZGVcbmV0d29yayINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLiIgL0ZJIm1zdmN3YXJuaW5nLmgiIC9EICJfREVCVUciIC9EICJfTElCIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uIiAvRkkicmRyL21zdmN3YXJuaW5nLmgiIC9EICJfTElCIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfVU5JQ09ERSIgL0QgIlVOSUNPREUiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSUIzMj1saW5rLmV4ZSAtbGliDQorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvDQorIyBBREQgTElCMzIgL25vbG9nbw0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAibmV0d29yayAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJuZXR3b3JrIC0gV2luMzIgRGVidWciDQorIyBOYW1lICJuZXR3b3JrIC0gV2luMzIgRGVidWcgVW5pY29kZSINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxUY3BTb2NrZXQuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNvY2tldC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cVGNwU29ja2V0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZHIvRXhjZXB0aW9uLmN4eCBiL2NvbW1vbi9yZHIvRXhjZXB0aW9uLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDM4NzExCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3Jkci9FeGNlcHRpb24uY3h4CkBAIC0wLDAgKzEsNzMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxyZHIvRXhjZXB0aW9uLmg+CisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGNoYXIuaD4KKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgcmRyOworCitTeXN0ZW1FeGNlcHRpb246OlN5c3RlbUV4Y2VwdGlvbihjb25zdCBjaGFyKiBzLCBpbnQgZXJyXykKKyAgOiBFeGNlcHRpb24ocyksIGVycihlcnJfKQoreworICBzdHJuY2F0KHN0cl8sICI6ICIsIGxlbi0xLXN0cmxlbihzdHJfKSk7CisjaWZkZWYgX1dJTjMyCisgIC8vIFdpbmRvd3MgZXJyb3IgbWVzc2FnZXMgYXJlIGNyYXAsIHNvIHVzZSB1bml4IG9uZXMgZm9yIGNvbW1vbiBlcnJvcnMuCisgIGNvbnN0IGNoYXIqIG1zZyA9IDA7CisgIHN3aXRjaCAoZXJyKSB7CisgIGNhc2UgV1NBRUNPTk5SRUZVU0VEOiBtc2cgPSAiQ29ubmVjdGlvbiByZWZ1c2VkIjsgICAgICAgYnJlYWs7CisgIGNhc2UgV1NBRVRJTUVET1VUOiAgICBtc2cgPSAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiOyAgICAgYnJlYWs7CisgIGNhc2UgV1NBRUNPTk5SRVNFVDogICBtc2cgPSAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIjsgYnJlYWs7CisgIGNhc2UgV1NBRUNPTk5BQk9SVEVEOiBtc2cgPSAiQ29ubmVjdGlvbiBhYm9ydGVkIjsgICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKG1zZykgeworICAgIHN0cm5jYXQoc3RyXywgbXNnLCBsZW4tMS1zdHJsZW4oc3RyXykpOworICB9IGVsc2UgeworI2lmZGVmIFVOSUNPREUKKyAgICBXQ0hBUiogdG1zZyA9IG5ldyBXQ0hBUltsZW4tc3RybGVuKHN0cl8pXTsKKyAgICBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCisgICAgICAgICAgICAgICAgICAwLCBlcnIsIDAsIHRtc2csIGxlbi0xLXN0cmxlbihzdHJfKSwgMCk7CisgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHRtc2csIHdjc2xlbih0bXNnKSsxLAorCQkgICAgICAgICAgICAgIHN0cl8rc3RybGVuKHN0cl8pLCBsZW4tc3RybGVuKHN0cl8pLCAwLCAwKTsKKyAgICBkZWxldGUgW10gdG1zZzsKKyNlbHNlCisgICAgY2hhciogY3VyclN0ciA9IHN0cl8rc3RybGVuKHN0cl8pOworICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfCBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKKyAgICAgICAgICAgICAgICAgIDAsIGVyciwgMCwgY3VyclN0ciwgbGVuLTEtc3RybGVuKHN0cl8pLCAwKTsKKyNlbmRpZgorICAgIGludCBsID0gc3RybGVuKHN0cl8pOworICAgIGlmICgobCA+PSAyKSAmJiAoc3RyX1tsLTJdID09ICdccicpICYmIChzdHJfW2wtMV0gPT0gJ1xuJykpCisgICAgICBzdHJfW2wtMl0gPSAwOworICB9CisKKyNlbHNlCisgIHN0cm5jYXQoc3RyXywgc3RyZXJyb3IoZXJyKSwgbGVuLTEtc3RybGVuKHN0cl8pKTsKKyNlbmRpZgorICBzdHJuY2F0KHN0cl8sICIgKCIsIGxlbi0xLXN0cmxlbihzdHJfKSk7CisgIGNoYXIgYnVmWzIwXTsKKyNpZmRlZiBXSU4zMgorICBpZiAoZXJyIDwgMCkKKyAgICBzcHJpbnRmKGJ1ZiwgIiV4IiwgZXJyKTsKKyAgZWxzZQorI2VuZGlmCisgICAgc3ByaW50ZihidWYsIiVkIixlcnIpOworICBzdHJuY2F0KHN0cl8sIGJ1ZiwgbGVuLTEtc3RybGVuKHN0cl8pKTsKKyAgc3RybmNhdChzdHJfLCAiKSIsIGxlbi0xLXN0cmxlbihzdHJfKSk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmRyL0V4Y2VwdGlvbi5oIGIvY29tbW9uL3Jkci9FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjkyZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3Jkci9FeGNlcHRpb24uaApAQCAtMCwwICsxLDU4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpZm5kZWYgX19SRFJfRVhDRVBUSU9OX0hfXworI2RlZmluZSBfX1JEUl9FWENFUFRJT05fSF9fCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgcmRyIHsKKworICBzdHJ1Y3QgRXhjZXB0aW9uIHsKKyAgICBlbnVtIHsgbGVuID0gMjU2IH07CisgICAgY2hhciBzdHJfW2xlbl07CisgICAgRXhjZXB0aW9uKGNvbnN0IGNoYXIqIHM9MCkgeworICAgICAgc3RyX1swXSA9IDA7CisgICAgICBpZiAocykKKyAgICAgICAgc3RybmNhdChzdHJfLCBzLCBsZW4tMSk7CisgICAgICBlbHNlCisgICAgICAgIHN0cmNhdChzdHJfLCAiRXhjZXB0aW9uIik7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgY2hhciogc3RyKCkgY29uc3QgeyByZXR1cm4gc3RyXzsgfQorICB9OworCisgIHN0cnVjdCBTeXN0ZW1FeGNlcHRpb24gOiBwdWJsaWMgRXhjZXB0aW9uIHsKKyAgICBpbnQgZXJyOworICAgIFN5c3RlbUV4Y2VwdGlvbihjb25zdCBjaGFyKiBzLCBpbnQgZXJyXyk7CisgIH07IAorCisgIHN0cnVjdCBUaW1lZE91dCA6IHB1YmxpYyBFeGNlcHRpb24geworICAgIFRpbWVkT3V0KGNvbnN0IGNoYXIqIHM9IlRpbWVkIG91dCIpIDogRXhjZXB0aW9uKHMpIHt9CisgIH07CisgCisgIHN0cnVjdCBFbmRPZlN0cmVhbSA6IHB1YmxpYyBFeGNlcHRpb24geworICAgIEVuZE9mU3RyZWFtKGNvbnN0IGNoYXIqIHM9IkVuZCBvZiBzdHJlYW0iKSA6IEV4Y2VwdGlvbihzKSB7fQorICB9OworCisgIHN0cnVjdCBGcmFtZUV4Y2VwdGlvbiA6IHB1YmxpYyBFeGNlcHRpb24geworICAgIEZyYW1lRXhjZXB0aW9uKGNvbnN0IGNoYXIqIHM9IkZyYW1lIGV4Y2VwdGlvbiIpIDogRXhjZXB0aW9uKHMpIHt9CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9GZEluU3RyZWFtLmN4eCBiL2NvbW1vbi9yZHIvRmRJblN0cmVhbS5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxMTk3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZHIvRmRJblN0cmVhbS5jeHgKQEAgLTAsMCArMSwzMDQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpZm5kZWYgX1dJTjMyX1dDRQorI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorI2VuZGlmCisjZGVmaW5lIHJlYWQocyxiLGwpIHJlY3YocywoY2hhciopYixsLDApCisjZGVmaW5lIGNsb3NlIGNsb3Nlc29ja2V0CisjdW5kZWYgZXJybm8KKyNkZWZpbmUgZXJybm8gV1NBR2V0TGFzdEVycm9yKCkKKyN1bmRlZiBFSU5UUgorI2RlZmluZSBFSU5UUiBXU0FFSU5UUgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2lmbmRlZiB2bmNtaW4KKyNkZWZpbmUgdm5jbWluKGEsYikgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKyNpZm5kZWYgdm5jbWF4CisjZGVmaW5lIHZuY21heChhLGIpICAgICAgICAgICAgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKy8vIFhYWCBzaG91bGQgdXNlIGF1dG9jb25mIEhBVkVfU1lTX1NFTEVDVF9ICisjaWZkZWYgX0FJWAorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNlbmRpZgorCisvLyBYWFggTHlueC9PUyAyLjM6IHByb3RvcyBmb3IgZ2V0dGltZW9mZGF5KCksIHNlbGVjdCgpLCBiemVybygpCisjaWZkZWYgTHlueAorI2luY2x1ZGUgPHN5cy9wcm90by5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxyZHIvRmRJblN0cmVhbS5oPgorI2luY2x1ZGUgPHJkci9FeGNlcHRpb24uaD4KKwordXNpbmcgbmFtZXNwYWNlIHJkcjsKKworZW51bSB7IERFRkFVTFRfQlVGX1NJWkUgPSA4MTkyLAorICAgICAgIE1JTl9CVUxLX1NJWkUgPSAxMDI0IH07CisKK0ZkSW5TdHJlYW06OkZkSW5TdHJlYW0oaW50IGZkXywgaW50IHRpbWVvdXRtc18sIGludCBidWZTaXplXywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjbG9zZVdoZW5Eb25lXykKKyAgOiBmZChmZF8pLCBjbG9zZVdoZW5Eb25lKGNsb3NlV2hlbkRvbmVfKSwKKyAgICB0aW1lb3V0bXModGltZW91dG1zXyksIGJsb2NrQ2FsbGJhY2soMCksCisgICAgdGltaW5nKGZhbHNlKSwgdGltZVdhaXRlZEluMTAwdXMoNSksIHRpbWVkS2JpdHMoMCksCisgICAgYnVmU2l6ZShidWZTaXplXyA/IGJ1ZlNpemVfIDogREVGQVVMVF9CVUZfU0laRSksIG9mZnNldCgwKQoreworICBwdHIgPSBlbmQgPSBzdGFydCA9IG5ldyBVOFtidWZTaXplXTsKK30KKworRmRJblN0cmVhbTo6RmRJblN0cmVhbShpbnQgZmRfLCBGZEluU3RyZWFtQmxvY2tDYWxsYmFjayogYmxvY2tDYWxsYmFja18sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZTaXplXykKKyAgOiBmZChmZF8pLCB0aW1lb3V0bXMoMCksIGJsb2NrQ2FsbGJhY2soYmxvY2tDYWxsYmFja18pLAorICAgIHRpbWluZyhmYWxzZSksIHRpbWVXYWl0ZWRJbjEwMHVzKDUpLCB0aW1lZEtiaXRzKDApLAorICAgIGJ1ZlNpemUoYnVmU2l6ZV8gPyBidWZTaXplXyA6IERFRkFVTFRfQlVGX1NJWkUpLCBvZmZzZXQoMCkKK3sKKyAgcHRyID0gZW5kID0gc3RhcnQgPSBuZXcgVThbYnVmU2l6ZV07Cit9CisKK0ZkSW5TdHJlYW06On5GZEluU3RyZWFtKCkKK3sKKyAgZGVsZXRlIFtdIHN0YXJ0OworICBpZiAoY2xvc2VXaGVuRG9uZSkgY2xvc2UoZmQpOworfQorCisKK3ZvaWQgRmRJblN0cmVhbTo6c2V0VGltZW91dChpbnQgdGltZW91dG1zXykgeworICB0aW1lb3V0bXMgPSB0aW1lb3V0bXNfOworfQorCit2b2lkIEZkSW5TdHJlYW06OnNldEJsb2NrQ2FsbGJhY2soRmRJblN0cmVhbUJsb2NrQ2FsbGJhY2sqIGJsb2NrQ2FsbGJhY2tfKQoreworICBibG9ja0NhbGxiYWNrID0gYmxvY2tDYWxsYmFja187CisgIHRpbWVvdXRtcyA9IDA7Cit9CisKK2ludCBGZEluU3RyZWFtOjpwb3MoKQoreworICByZXR1cm4gb2Zmc2V0ICsgcHRyIC0gc3RhcnQ7Cit9CisKK3ZvaWQgRmRJblN0cmVhbTo6cmVhZEJ5dGVzKHZvaWQqIGRhdGEsIGludCBsZW5ndGgpCit7CisgIGlmIChsZW5ndGggPCBNSU5fQlVMS19TSVpFKSB7CisgICAgSW5TdHJlYW06OnJlYWRCeXRlcyhkYXRhLCBsZW5ndGgpOworICAgIHJldHVybjsKKyAgfQorCisgIFU4KiBkYXRhUHRyID0gKFU4KilkYXRhOworCisgIGludCBuID0gZW5kIC0gcHRyOworICBpZiAobiA+IGxlbmd0aCkgbiA9IGxlbmd0aDsKKworICBtZW1jcHkoZGF0YVB0ciwgcHRyLCBuKTsKKyAgZGF0YVB0ciArPSBuOworICBsZW5ndGggLT0gbjsKKyAgcHRyICs9IG47CisKKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICBuID0gcmVhZFdpdGhUaW1lb3V0T3JDYWxsYmFjayhkYXRhUHRyLCBsZW5ndGgpOworICAgIGRhdGFQdHIgKz0gbjsKKyAgICBsZW5ndGggLT0gbjsKKyAgICBvZmZzZXQgKz0gbjsKKyAgfQorfQorCisKK2ludCBGZEluU3RyZWFtOjpvdmVycnVuKGludCBpdGVtU2l6ZSwgaW50IG5JdGVtcywgYm9vbCB3YWl0KQoreworICBpZiAoaXRlbVNpemUgPiBidWZTaXplKQorICAgIHRocm93IEV4Y2VwdGlvbigiRmRJblN0cmVhbSBvdmVycnVuOiBtYXggaXRlbVNpemUgZXhjZWVkZWQiKTsKKworICBpZiAoZW5kIC0gcHRyICE9IDApCisgICAgbWVtbW92ZShzdGFydCwgcHRyLCBlbmQgLSBwdHIpOworCisgIG9mZnNldCArPSBwdHIgLSBzdGFydDsKKyAgZW5kIC09IHB0ciAtIHN0YXJ0OworICBwdHIgPSBzdGFydDsKKworICBpbnQgYnl0ZXNfdG9fcmVhZDsKKyAgd2hpbGUgKGVuZCA8IHN0YXJ0ICsgaXRlbVNpemUpIHsKKyAgICBieXRlc190b19yZWFkID0gc3RhcnQgKyBidWZTaXplIC0gZW5kOworICAgIGlmICghdGltaW5nKSB7CisgICAgICAvLyBXaGVuIG5vdCB0aW1pbmcsIHdlIG11c3QgYmUgY2FyZWZ1bCBub3QgdG8gcmVhZCB0b28gbXVjaAorICAgICAgLy8gZXh0cmEgZGF0YSBpbnRvIHRoZSBidWZmZXIuIE90aGVyd2lzZSwgdGhlIGxpbmUgc3BlZWQKKyAgICAgIC8vIGVzdGltYXRpb24gbWlnaHQgc3RheSBhdCB6ZXJvIGZvciBhIGxvbmcgdGltZTogQWxsIHJlYWRzCisgICAgICAvLyBkdXJpbmcgdGltaW5nPTEgY2FuIGJlIHNhdGlzZmllZCB3aXRob3V0IGNhbGxpbmcKKyAgICAgIC8vIHJlYWRXaXRoVGltZW91dE9yQ2FsbGJhY2suIEhvd2V2ZXIsIHJlYWRpbmcgb25seSAxIG9yIDIgYnl0ZXMKKyAgICAgIC8vIGJ5dGVzIGlzIGluZWZmZWNpZW50LgorICAgICAgYnl0ZXNfdG9fcmVhZCA9IHZuY21pbihieXRlc190b19yZWFkLCB2bmNtYXgoaXRlbVNpemUqbkl0ZW1zLCA4KSk7CisgICAgfQorICAgIGludCBuID0gcmVhZFdpdGhUaW1lb3V0T3JDYWxsYmFjaygoVTgqKWVuZCwgYnl0ZXNfdG9fcmVhZCwgd2FpdCk7CisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgZW5kICs9IG47CisgIH0KKworICBpZiAoaXRlbVNpemUgKiBuSXRlbXMgPiBlbmQgLSBwdHIpCisgICAgbkl0ZW1zID0gKGVuZCAtIHB0cikgLyBpdGVtU2l6ZTsKKworICByZXR1cm4gbkl0ZW1zOworfQorCisjaWZkZWYgX1dJTjMyCitzdGF0aWMgdm9pZCBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHR2LCB2b2lkKikKK3sKKyAgTEFSR0VfSU5URUdFUiBjb3VudHMsIGNvdW50c1BlclNlYzsKKyAgc3RhdGljIGRvdWJsZSB1c2VjUGVyQ291bnQgPSAwLjA7CisKKyAgaWYgKFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZjb3VudHMpKSB7CisgICAgaWYgKHVzZWNQZXJDb3VudCA9PSAwLjApIHsKKyAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmNvdW50c1BlclNlYyk7CisgICAgICB1c2VjUGVyQ291bnQgPSAxMDAwMDAwLjAgLyBjb3VudHNQZXJTZWMuUXVhZFBhcnQ7CisgICAgfQorCisgICAgTE9OR0xPTkcgdXNlY3MgPSAoTE9OR0xPTkcpKGNvdW50cy5RdWFkUGFydCAqIHVzZWNQZXJDb3VudCk7CisgICAgdHYtPnR2X3VzZWMgPSAobG9uZykodXNlY3MgJSAxMDAwMDAwKTsKKyAgICB0di0+dHZfc2VjID0gKGxvbmcpKHVzZWNzIC8gMTAwMDAwMCk7CisKKyAgfSBlbHNlIHsKKyNpZm5kZWYgX1dJTjMyX1dDRQorICAgIHN0cnVjdCB0aW1lYiB0YjsKKyAgICBmdGltZSgmdGIpOworICAgIHR2LT50dl9zZWMgPSB0Yi50aW1lOworICAgIHR2LT50dl91c2VjID0gdGIubWlsbGl0bSAqIDEwMDA7CisjZWxzZQorICAgIHRocm93IFN5c3RlbUV4Y2VwdGlvbigiUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIiLCBHZXRMYXN0RXJyb3IoKSk7CisjZW5kaWYKKyAgfQorfQorI2VuZGlmCisKKy8vCisvLyByZWFkV2l0aFRpbWVvdXRPckNhbGxiYWNrKCkgcmVhZHMgdXAgdG8gdGhlIGdpdmVuIGxlbmd0aCBpbiBieXRlcyBmcm9tIHRoZQorLy8gZmlsZSBkZXNjcmlwdG9yIGludG8gYSBidWZmZXIuICBJZiB0aGUgd2FpdCBhcmd1bWVudCBpcyBmYWxzZSwgdGhlbiB6ZXJvIGlzCisvLyByZXR1cm5lZCBpZiBubyBieXRlcyBjYW4gYmUgcmVhZCB3aXRob3V0IGJsb2NraW5nLiAgT3RoZXJ3aXNlIGlmIGEKKy8vIGJsb2NrQ2FsbGJhY2sgaXMgc2V0LCBpdCB3aWxsIGJlIGNhbGxlZCAocmVwZWF0ZWRseSkgaW5zdGVhZCBvZiBibG9ja2luZy4KKy8vIElmIGFsdGVybmF0aXZlbHkgdGhlcmUgaXMgYSB0aW1lb3V0IHNldCBhbmQgdGhhdCB0aW1lb3V0IGV4cGlyZXMsIGl0IHRocm93cworLy8gYSBUaW1lZE91dCBleGNlcHRpb24uICBPdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBJdAorLy8gbmV2ZXIgYXR0ZW1wdHMgdG8gcmVhZCgpIHVubGVzcyBzZWxlY3QoKSBpbmRpY2F0ZXMgdGhhdCB0aGUgZmQgaXMgcmVhZGFibGUgLQorLy8gdGhpcyBtZWFucyBpdCBjYW4gYmUgdXNlZCBvbiBhbiBmZCB3aGljaCBoYXMgYmVlbiBzZXQgbm9uLWJsb2NraW5nLiAgSXQgYWxzbworLy8gaGFzIHRvIGNvcGUgd2l0aCB0aGUgYW5ub3lpbmcgcG9zc2liaWxpdHkgb2YgYm90aCBzZWxlY3QoKSBhbmQgcmVhZCgpCisvLyByZXR1cm5pbmcgRUlOVFIuCisvLworCitpbnQgRmRJblN0cmVhbTo6cmVhZFdpdGhUaW1lb3V0T3JDYWxsYmFjayh2b2lkKiBidWYsIGludCBsZW4sIGJvb2wgd2FpdCkKK3sKKyAgc3RydWN0IHRpbWV2YWwgYmVmb3JlLCBhZnRlcjsKKyAgaWYgKHRpbWluZykKKyAgICBnZXR0aW1lb2ZkYXkoJmJlZm9yZSwgMCk7CisKKyAgaW50IG47CisgIHdoaWxlICh0cnVlKSB7CisgICAgZG8geworICAgICAgZmRfc2V0IGZkczsKKyAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgc3RydWN0IHRpbWV2YWwqIHR2cCA9ICZ0djsKKworICAgICAgaWYgKCF3YWl0KSB7CisgICAgICAgIHR2LnR2X3NlYyA9IHR2LnR2X3VzZWMgPSAwOworICAgICAgfSBlbHNlIGlmICh0aW1lb3V0bXMgIT0gLTEpIHsKKyAgICAgICAgdHYudHZfc2VjID0gdGltZW91dG1zIC8gMTAwMDsKKyAgICAgICAgdHYudHZfdXNlYyA9ICh0aW1lb3V0bXMgJSAxMDAwKSAqIDEwMDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0dnAgPSAwOworICAgICAgfQorCisgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgRkRfU0VUKGZkLCAmZmRzKTsKKyAgICAgIG4gPSBzZWxlY3QoZmQrMSwgJmZkcywgMCwgMCwgdHZwKTsKKyAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICBpZiAobiA+IDApIGJyZWFrOworICAgIGlmIChuIDwgMCkgdGhyb3cgU3lzdGVtRXhjZXB0aW9uKCJzZWxlY3QiLGVycm5vKTsKKyAgICBpZiAoIXdhaXQpIHJldHVybiAwOworICAgIGlmICghYmxvY2tDYWxsYmFjaykgdGhyb3cgVGltZWRPdXQoKTsKKworICAgIGJsb2NrQ2FsbGJhY2stPmJsb2NrQ2FsbGJhY2soKTsKKyAgfQorCisgIGRvIHsKKyAgICBuID0gOjpyZWFkKGZkLCBidWYsIGxlbik7CisgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAobiA8IDApIHRocm93IFN5c3RlbUV4Y2VwdGlvbigicmVhZCIsZXJybm8pOworICBpZiAobiA9PSAwKSB0aHJvdyBFbmRPZlN0cmVhbSgpOworCisgIGlmICh0aW1pbmcpIHsKKyAgICBnZXR0aW1lb2ZkYXkoJmFmdGVyLCAwKTsKKy8vICAgICAgZnByaW50ZihzdGRlcnIsIiVkLiUwNmRcbiIsKGFmdGVyLnR2X3NlYyAtIGJlZm9yZS50dl9zZWMpLAorLy8gICAgICAgICAgICAgIChhZnRlci50dl91c2VjIC0gYmVmb3JlLnR2X3VzZWMpKTsKKyAgICBpbnQgbmV3VGltZVdhaXRlZCA9ICgoYWZ0ZXIudHZfc2VjIC0gYmVmb3JlLnR2X3NlYykgKiAxMDAwMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgKGFmdGVyLnR2X3VzZWMgLSBiZWZvcmUudHZfdXNlYykgLyAxMDApOworICAgIGludCBuZXdLYml0cyA9IG4gKiA4IC8gMTAwMDsKKworLy8gICAgICBpZiAobmV3VGltZVdhaXRlZCA9PSAwKSB7CisvLyAgICAgICAgZnByaW50ZihzdGRlcnIsIm5ldyBrYnBzIGluZmluaXRlIHQgJWQgayAlZFxuIiwKKy8vICAgICAgICAgICAgICAgIG5ld1RpbWVXYWl0ZWQsIG5ld0tiaXRzKTsKKy8vICAgICAgfSBlbHNlIHsKKy8vICAgICAgICBmcHJpbnRmKHN0ZGVyciwibmV3IGticHMgJWQgdCAlZCBrICVkXG4iLAorLy8gICAgICAgICAgICAgICAgbmV3S2JpdHMgKiAxMDAwMCAvIG5ld1RpbWVXYWl0ZWQsIG5ld1RpbWVXYWl0ZWQsIG5ld0tiaXRzKTsKKy8vICAgICAgfQorCisgICAgLy8gbGltaXQgcmF0ZSB0byBiZXR3ZWVuIDEwa2JpdC9zIGFuZCA0ME1iaXQvcworCisgICAgaWYgKG5ld1RpbWVXYWl0ZWQgPiBuZXdLYml0cyoxMDAwKSBuZXdUaW1lV2FpdGVkID0gbmV3S2JpdHMqMTAwMDsKKyAgICBpZiAobmV3VGltZVdhaXRlZCA8IG5ld0tiaXRzLzQpICAgIG5ld1RpbWVXYWl0ZWQgPSBuZXdLYml0cy80OworCisgICAgdGltZVdhaXRlZEluMTAwdXMgKz0gbmV3VGltZVdhaXRlZDsKKyAgICB0aW1lZEtiaXRzICs9IG5ld0tiaXRzOworICB9CisKKyAgcmV0dXJuIG47Cit9CisKK3ZvaWQgRmRJblN0cmVhbTo6c3RhcnRUaW1pbmcoKQoreworICB0aW1pbmcgPSB0cnVlOworCisgIC8vIENhcnJ5IG92ZXIgdXAgdG8gMXMgd29ydGggb2YgcHJldmlvdXMgcmF0ZSBmb3Igc21vb3RoaW5nLgorCisgIGlmICh0aW1lV2FpdGVkSW4xMDB1cyA+IDEwMDAwKSB7CisgICAgdGltZWRLYml0cyA9IHRpbWVkS2JpdHMgKiAxMDAwMCAvIHRpbWVXYWl0ZWRJbjEwMHVzOworICAgIHRpbWVXYWl0ZWRJbjEwMHVzID0gMTAwMDA7CisgIH0KK30KKwordm9pZCBGZEluU3RyZWFtOjpzdG9wVGltaW5nKCkKK3sKKyAgdGltaW5nID0gZmFsc2U7IAorICBpZiAodGltZVdhaXRlZEluMTAwdXMgPCB0aW1lZEtiaXRzLzIpCisgICAgdGltZVdhaXRlZEluMTAwdXMgPSB0aW1lZEtiaXRzLzI7IC8vIHVwcGVyIGxpbWl0IDIwTWJpdC9zCit9CisKK3Vuc2lnbmVkIGludCBGZEluU3RyZWFtOjprYml0c1BlclNlY29uZCgpCit7CisgIC8vIFRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb24gd2lsbCBvdmVyZmxvdyAzMi1iaXQgYXJpdGhtZXRpYyBpZiB3ZSBoYXZlCisgIC8vIHJlY2VpdmVkIG1vcmUgdGhhbiBhYm91dCA1ME1ieXRlcyAoNDAwTWJpdHMpIHNpbmNlIHdlIHN0YXJ0ZWQgdGltaW5nLCBzbworICAvLyBpdCBzaG91bGQgYmUgT0sgZm9yIGEgc2luZ2xlIFJGQiB1cGRhdGUuCisKKyAgcmV0dXJuIHRpbWVkS2JpdHMgKiAxMDAwMCAvIHRpbWVXYWl0ZWRJbjEwMHVzOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9GZEluU3RyZWFtLmggYi9jb21tb24vcmRyL0ZkSW5TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDk1OThjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3Jkci9GZEluU3RyZWFtLmgKQEAgLTAsMCArMSw3NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLworLy8gRmRJblN0cmVhbSBzdHJlYW1zIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IuCisvLworCisjaWZuZGVmIF9fUkRSX0ZESU5TVFJFQU1fSF9fCisjZGVmaW5lIF9fUkRSX0ZESU5TVFJFQU1fSF9fCisKKyNpbmNsdWRlIDxyZHIvSW5TdHJlYW0uaD4KKworbmFtZXNwYWNlIHJkciB7CisKKyAgY2xhc3MgRmRJblN0cmVhbUJsb2NrQ2FsbGJhY2sgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIGJsb2NrQ2FsbGJhY2soKSA9IDA7CisgIH07CisKKyAgY2xhc3MgRmRJblN0cmVhbSA6IHB1YmxpYyBJblN0cmVhbSB7CisKKyAgcHVibGljOgorCisgICAgRmRJblN0cmVhbShpbnQgZmQsIGludCB0aW1lb3V0bXM9LTEsIGludCBidWZTaXplPTAsCisgICAgICAgICAgICAgICBib29sIGNsb3NlV2hlbkRvbmVfPWZhbHNlKTsKKyAgICBGZEluU3RyZWFtKGludCBmZCwgRmRJblN0cmVhbUJsb2NrQ2FsbGJhY2sqIGJsb2NrQ2FsbGJhY2ssIGludCBidWZTaXplPTApOworICAgIHZpcnR1YWwgfkZkSW5TdHJlYW0oKTsKKworICAgIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dG1zKTsKKyAgICB2b2lkIHNldEJsb2NrQ2FsbGJhY2soRmRJblN0cmVhbUJsb2NrQ2FsbGJhY2sqIGJsb2NrQ2FsbGJhY2spOworICAgIGludCBnZXRGZCgpIHsgcmV0dXJuIGZkOyB9CisgICAgaW50IHBvcygpOworICAgIHZvaWQgcmVhZEJ5dGVzKHZvaWQqIGRhdGEsIGludCBsZW5ndGgpOworCisgICAgdm9pZCBzdGFydFRpbWluZygpOworICAgIHZvaWQgc3RvcFRpbWluZygpOworICAgIHVuc2lnbmVkIGludCBrYml0c1BlclNlY29uZCgpOworICAgIHVuc2lnbmVkIGludCB0aW1lV2FpdGVkKCkgeyByZXR1cm4gdGltZVdhaXRlZEluMTAwdXM7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgaW50IG92ZXJydW4oaW50IGl0ZW1TaXplLCBpbnQgbkl0ZW1zLCBib29sIHdhaXQpOworCisgIHByaXZhdGU6CisgICAgaW50IHJlYWRXaXRoVGltZW91dE9yQ2FsbGJhY2sodm9pZCogYnVmLCBpbnQgbGVuLCBib29sIHdhaXQ9dHJ1ZSk7CisKKyAgICBpbnQgZmQ7CisgICAgYm9vbCBjbG9zZVdoZW5Eb25lOworICAgIGludCB0aW1lb3V0bXM7CisgICAgRmRJblN0cmVhbUJsb2NrQ2FsbGJhY2sqIGJsb2NrQ2FsbGJhY2s7CisKKyAgICBib29sIHRpbWluZzsKKyAgICB1bnNpZ25lZCBpbnQgdGltZVdhaXRlZEluMTAwdXM7CisgICAgdW5zaWduZWQgaW50IHRpbWVkS2JpdHM7CisKKyAgICBpbnQgYnVmU2l6ZTsKKyAgICBpbnQgb2Zmc2V0OworICAgIFU4KiBzdGFydDsKKyAgfTsKKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlIHJkcgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZHIvRmRPdXRTdHJlYW0uY3h4IGIvY29tbW9uL3Jkci9GZE91dFN0cmVhbS5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhYzA0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZHIvRmRPdXRTdHJlYW0uY3h4CkBAIC0wLDAgKzEsMTU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjZGVmaW5lIHdyaXRlKHMsYixsKSBzZW5kKHMsKGNvbnN0IGNoYXIqKWIsbCwwKQorI2RlZmluZSBFV09VTERCTE9DSyBXU0FFV09VTERCTE9DSworI3VuZGVmIGVycm5vCisjZGVmaW5lIGVycm5vIFdTQUdldExhc3RFcnJvcigpCisjdW5kZWYgRUlOVFIKKyNkZWZpbmUgRUlOVFIgV1NBRUlOVFIKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKy8vIFhYWCBMeW54L09TIDIuMzogcHJvdG9zIGZvciBzZWxlY3QoKSwgYnplcm8oKQorI2lmZGVmIEx5bngKKyNpbmNsdWRlIDxzeXMvcHJvdG8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8cmRyL0ZkT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmRyL0V4Y2VwdGlvbi5oPgorCisKK3VzaW5nIG5hbWVzcGFjZSByZHI7CisKK2VudW0geyBERUZBVUxUX0JVRl9TSVpFID0gMTYzODQgfTsKKworRmRPdXRTdHJlYW06OkZkT3V0U3RyZWFtKGludCBmZF8sIGludCB0aW1lb3V0bXNfLCBpbnQgYnVmU2l6ZV8pCisgIDogZmQoZmRfKSwgdGltZW91dG1zKHRpbWVvdXRtc18pLAorICAgIGJ1ZlNpemUoYnVmU2l6ZV8gPyBidWZTaXplXyA6IERFRkFVTFRfQlVGX1NJWkUpLCBvZmZzZXQoMCkKK3sKKyAgcHRyID0gc3RhcnQgPSBuZXcgVThbYnVmU2l6ZV07CisgIGVuZCA9IHN0YXJ0ICsgYnVmU2l6ZTsKK30KKworRmRPdXRTdHJlYW06On5GZE91dFN0cmVhbSgpCit7CisgIHRyeSB7CisgICAgZmx1c2goKTsKKyAgfSBjYXRjaCAoRXhjZXB0aW9uJikgeworICB9CisgIGRlbGV0ZSBbXSBzdGFydDsKK30KKwordm9pZCBGZE91dFN0cmVhbTo6c2V0VGltZW91dChpbnQgdGltZW91dG1zXykgeworICB0aW1lb3V0bXMgPSB0aW1lb3V0bXNfOworfQorCitpbnQgRmRPdXRTdHJlYW06Omxlbmd0aCgpCit7CisgIHJldHVybiBvZmZzZXQgKyBwdHIgLSBzdGFydDsKK30KKwordm9pZCBGZE91dFN0cmVhbTo6Zmx1c2goKQoreworICBVOCogc2VudFVwVG8gPSBzdGFydDsKKyAgd2hpbGUgKHNlbnRVcFRvIDwgcHRyKSB7CisgICAgaW50IG4gPSB3cml0ZVdpdGhUaW1lb3V0KChjb25zdCB2b2lkKikgc2VudFVwVG8sIHB0ciAtIHNlbnRVcFRvKTsKKyAgICBzZW50VXBUbyArPSBuOworICAgIG9mZnNldCArPSBuOworICB9CisKKyAgcHRyID0gc3RhcnQ7Cit9CisKKworaW50IEZkT3V0U3RyZWFtOjpvdmVycnVuKGludCBpdGVtU2l6ZSwgaW50IG5JdGVtcykKK3sKKyAgaWYgKGl0ZW1TaXplID4gYnVmU2l6ZSkKKyAgICB0aHJvdyBFeGNlcHRpb24oIkZkT3V0U3RyZWFtIG92ZXJydW46IG1heCBpdGVtU2l6ZSBleGNlZWRlZCIpOworCisgIGZsdXNoKCk7CisKKyAgaWYgKGl0ZW1TaXplICogbkl0ZW1zID4gZW5kIC0gcHRyKQorICAgIG5JdGVtcyA9IChlbmQgLSBwdHIpIC8gaXRlbVNpemU7CisKKyAgcmV0dXJuIG5JdGVtczsKK30KKworLy8KKy8vIHdyaXRlV2l0aFRpbWVvdXQoKSB3cml0ZXMgdXAgdG8gdGhlIGdpdmVuIGxlbmd0aCBpbiBieXRlcyBmcm9tIHRoZSBnaXZlbgorLy8gYnVmZmVyIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBJZiB0aGVyZSBpcyBhIHRpbWVvdXQgc2V0IGFuZCB0aGF0IHRpbWVvdXQKKy8vIGV4cGlyZXMsIGl0IHRocm93cyBhIFRpbWVkT3V0IGV4Y2VwdGlvbi4gIE90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2YKKy8vIGJ5dGVzIHdyaXR0ZW4uICBJdCBuZXZlciBhdHRlbXB0cyB0byB3cml0ZSgpIHVubGVzcyBzZWxlY3QoKSBpbmRpY2F0ZXMgdGhhdAorLy8gdGhlIGZkIGlzIHdyaXRhYmxlIC0gdGhpcyBtZWFucyBpdCBjYW4gYmUgdXNlZCBvbiBhbiBmZCB3aGljaCBoYXMgYmVlbiBzZXQKKy8vIG5vbi1ibG9ja2luZy4gIEl0IGFsc28gaGFzIHRvIGNvcGUgd2l0aCB0aGUgYW5ub3lpbmcgcG9zc2liaWxpdHkgb2YgYm90aAorLy8gc2VsZWN0KCkgYW5kIHdyaXRlKCkgcmV0dXJuaW5nIEVJTlRSLgorLy8KKworaW50IEZkT3V0U3RyZWFtOjp3cml0ZVdpdGhUaW1lb3V0KGNvbnN0IHZvaWQqIGRhdGEsIGludCBsZW5ndGgpCit7CisgIGludCBuOworCisgIGRvIHsKKworICAgIGRvIHsKKyAgICAgIGZkX3NldCBmZHM7CisgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgIHN0cnVjdCB0aW1ldmFsKiB0dnAgPSAmdHY7CisKKyAgICAgIGlmICh0aW1lb3V0bXMgIT0gLTEpIHsKKyAgICAgICAgdHYudHZfc2VjID0gdGltZW91dG1zIC8gMTAwMDsKKyAgICAgICAgdHYudHZfdXNlYyA9ICh0aW1lb3V0bXMgJSAxMDAwKSAqIDEwMDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0dnAgPSAwOworICAgICAgfQorCisgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgRkRfU0VUKGZkLCAmZmRzKTsKKyNpZmRlZiBfV0lOMzJfV0NFCisgICAgICAvLyBOQjogVGhpcyBmaXhlcyBhIGJyb2tlbiBXaW5zb2NrMiBzZWxlY3QoKSBiZWhhdmlvdXIuICBzZWxlY3QoKQorICAgICAgLy8gbmV2ZXIgcmV0dXJucyBmb3Igbm9uLWJsb2NraW5nIHNvY2tldHMsIHVubGVzcyB0aGV5J3JlIGFscmVhZHkKKyAgICAgIC8vIHJlYWR5IHRvIGJlIHdyaXR0ZW4gdG8uLi4KKyAgICAgIHVfbG9uZyB6ZXJvID0gMDsgaW9jdGxzb2NrZXQoZmQsIEZJT05CSU8sICZ6ZXJvKTsKKyNlbmRpZgorICAgICAgbiA9IHNlbGVjdChmZCsxLCAwLCAmZmRzLCAwLCB0dnApOworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgICAgIHVfbG9uZyBvbmUgPSAwOyBpb2N0bHNvY2tldChmZCwgRklPTkJJTywgJm9uZSk7CisjZW5kaWYKKyAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICBpZiAobiA8IDApIHRocm93IFN5c3RlbUV4Y2VwdGlvbigic2VsZWN0IixlcnJubyk7CisKKyAgICBpZiAobiA9PSAwKSB0aHJvdyBUaW1lZE91dCgpOworCisgICAgZG8geworICAgICAgbiA9IDo6d3JpdGUoZmQsIGRhdGEsIGxlbmd0aCk7CisgICAgfSB3aGlsZSAobiA8IDAgJiYgKGVycm5vID09IEVJTlRSKSk7CisgICAgICAKKyAgICAvLyBOQjogVGhpcyBvdXRlciBsb29wIHNpbXBseSBmaXhlcyBhIGJyb2tlbiBXaW5zb2NrMiBFV09VTERCTE9DSworICAgIC8vIGNvbmRpdGlvbiwgZm91bmQgb25seSB1bmRlciBXaW45OCAoZmlyc3QgZWRpdGlvbiksIHdpdGggc2xvdworICAgIC8vIG5ldHdvcmsgY29ubmVjdGlvbnMuICBTaG91bGQgaW4gZmFjdCBuZXZlciBldmVyIGhhcHBlbi4uLgorICB9IHdoaWxlIChuIDwgMCAmJiAoZXJybm8gPT0gRVdPVUxEQkxPQ0spKTsKKworICBpZiAobiA8IDApIHRocm93IFN5c3RlbUV4Y2VwdGlvbigid3JpdGUiLGVycm5vKTsKKworICByZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZHIvRmRPdXRTdHJlYW0uaCBiL2NvbW1vbi9yZHIvRmRPdXRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2UyOTEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3Jkci9GZE91dFN0cmVhbS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8KKy8vIEZkT3V0U3RyZWFtIHN0cmVhbXMgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCisvLworCisjaWZuZGVmIF9fUkRSX0ZET1VUU1RSRUFNX0hfXworI2RlZmluZSBfX1JEUl9GRE9VVFNUUkVBTV9IX18KKworI2luY2x1ZGUgPHJkci9PdXRTdHJlYW0uaD4KKworbmFtZXNwYWNlIHJkciB7CisKKyAgY2xhc3MgRmRPdXRTdHJlYW0gOiBwdWJsaWMgT3V0U3RyZWFtIHsKKworICBwdWJsaWM6CisKKyAgICBGZE91dFN0cmVhbShpbnQgZmQsIGludCB0aW1lb3V0bXM9LTEsIGludCBidWZTaXplPTApOworICAgIHZpcnR1YWwgfkZkT3V0U3RyZWFtKCk7CisKKyAgICB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXRtcyk7CisgICAgaW50IGdldEZkKCkgeyByZXR1cm4gZmQ7IH0KKworICAgIHZvaWQgZmx1c2goKTsKKyAgICBpbnQgbGVuZ3RoKCk7CisKKyAgcHJpdmF0ZToKKyAgICBpbnQgb3ZlcnJ1bihpbnQgaXRlbVNpemUsIGludCBuSXRlbXMpOworICAgIGludCB3cml0ZVdpdGhUaW1lb3V0KGNvbnN0IHZvaWQqIGRhdGEsIGludCBsZW5ndGgpOworICAgIGludCBmZDsKKyAgICBpbnQgdGltZW91dG1zOworICAgIGludCBidWZTaXplOworICAgIGludCBvZmZzZXQ7CisgICAgVTgqIHN0YXJ0OworICB9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9GaXhlZE1lbU91dFN0cmVhbS5oIGIvY29tbW9uL3Jkci9GaXhlZE1lbU91dFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZWM1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmRyL0ZpeGVkTWVtT3V0U3RyZWFtLmgKQEAgLTAsMCArMSw1MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLworLy8gQSBGaXhlZE1lbU91dFN0cmVhbSB3cml0ZXMgdG8gYSBidWZmZXIgb2YgYSBmaXhlZCBsZW5ndGguCisvLworCisjaWZuZGVmIF9fUkRSX0ZJWEVETUVNT1VUU1RSRUFNX0hfXworI2RlZmluZSBfX1JEUl9GSVhFRE1FTU9VVFNUUkVBTV9IX18KKworI2luY2x1ZGUgPHJkci9PdXRTdHJlYW0uaD4KKyNpbmNsdWRlIDxyZHIvRXhjZXB0aW9uLmg+CisKK25hbWVzcGFjZSByZHIgeworCisgIGNsYXNzIEZpeGVkTWVtT3V0U3RyZWFtIDogcHVibGljIE91dFN0cmVhbSB7CisKKyAgcHVibGljOgorCisgICAgRml4ZWRNZW1PdXRTdHJlYW0odm9pZCogYnVmLCBpbnQgbGVuKSB7CisgICAgICBwdHIgPSBzdGFydCA9IChVOCopYnVmOworICAgICAgZW5kID0gc3RhcnQgKyBsZW47CisgICAgfQorCisgICAgaW50IGxlbmd0aCgpIHsgcmV0dXJuIHB0ciAtIHN0YXJ0OyB9CisgICAgdm9pZCByZXBvc2l0aW9uKGludCBwb3MpIHsgcHRyID0gc3RhcnQgKyBwb3M7IH0KKyAgICBjb25zdCB2b2lkKiBkYXRhKCkgeyByZXR1cm4gKGNvbnN0IHZvaWQqKXN0YXJ0OyB9CisKKyAgcHJpdmF0ZToKKworICAgIGludCBvdmVycnVuKGludCBpdGVtU2l6ZSwgaW50IG5JdGVtcykgeyB0aHJvdyBFbmRPZlN0cmVhbSgpOyB9CisgICAgVTgqIHN0YXJ0OworICB9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9IZXhJblN0cmVhbS5jeHggYi9jb21tb24vcmRyL0hleEluU3RyZWFtLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGY4YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3Jkci9IZXhJblN0cmVhbS5jeHgKQEAgLTAsMCArMSwxMTcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2luY2x1ZGUgPHJkci9IZXhJblN0cmVhbS5oPgorI2luY2x1ZGUgPHJkci9FeGNlcHRpb24uaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZHI7CisKK2NvbnN0IGludCBERUZBVUxUX0JVRl9MRU4gPSAxNjM4NDsKKworc3RhdGljIGlubGluZSBpbnQgbWluKGludCBhLCBpbnQgYikge3JldHVybiBhPGIgPyBhIDogYjt9CisKK0hleEluU3RyZWFtOjpIZXhJblN0cmVhbShJblN0cmVhbSYgaXMsIGludCBidWZTaXplXykKKzogYnVmU2l6ZShidWZTaXplXyA/IGJ1ZlNpemVfIDogREVGQVVMVF9CVUZfTEVOKSwgb2Zmc2V0KDApLCBpbl9zdHJlYW0oaXMpCit7CisgIHB0ciA9IGVuZCA9IHN0YXJ0ID0gbmV3IFU4W2J1ZlNpemVdOworfQorCitIZXhJblN0cmVhbTo6fkhleEluU3RyZWFtKCkgeworICBkZWxldGUgW10gc3RhcnQ7Cit9CisKKworYm9vbCBIZXhJblN0cmVhbTo6cmVhZEhleEFuZFNoaWZ0KGNoYXIgYywgaW50KiB2KSB7CisgIGM9dG9sb3dlcihjKTsKKyAgaWYgKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkKKyAgICAqdiA9ICgqdiA8PCA0KSArIChjIC0gJzAnKTsKKyAgZWxzZSBpZiAoKGMgPj0gJ2EnKSAmJiAoYyA8PSAnZicpKQorICAgICp2ID0gKCp2IDw8IDQpICsgKGMgLSAnYScgKyAxMCk7CisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEhleEluU3RyZWFtOjpoZXhTdHJUb0Jpbihjb25zdCBjaGFyKiBzLCBjaGFyKiogZGF0YSwgaW50KiBsZW5ndGgpIHsKKyAgaW50IGw9c3RybGVuKHMpOworICBpZiAoKGwgJSAyKSA9PSAwKSB7CisgICAgZGVsZXRlIFtdICpkYXRhOworICAgICpkYXRhID0gMDsgKmxlbmd0aCA9IDA7CisgICAgaWYgKGwgPT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworICAgICpkYXRhID0gbmV3IGNoYXJbbC8yXTsKKyAgICAqbGVuZ3RoID0gbC8yOworICAgIGZvcihpbnQgaT0wO2k8bDtpKz0yKSB7CisgICAgICBpbnQgYnl0ZSA9IDA7CisgICAgICBpZiAoIXJlYWRIZXhBbmRTaGlmdChzW2ldLCAmYnl0ZSkgfHwKKyAgICAgICAgIXJlYWRIZXhBbmRTaGlmdChzW2krMV0sICZieXRlKSkKKyAgICAgICAgZ290byBkZWNvZGVFcnJvcjsKKyAgICAgICgqZGF0YSlbaS8yXSA9IGJ5dGU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CitkZWNvZGVFcnJvcjoKKyAgZGVsZXRlIFtdICpkYXRhOworICAqZGF0YSA9IDA7CisgICpsZW5ndGggPSAwOworICByZXR1cm4gZmFsc2U7Cit9CisKKworaW50IEhleEluU3RyZWFtOjpwb3MoKSB7CisgIHJldHVybiBvZmZzZXQgKyBwdHIgLSBzdGFydDsKK30KKworaW50IEhleEluU3RyZWFtOjpvdmVycnVuKGludCBpdGVtU2l6ZSwgaW50IG5JdGVtcywgYm9vbCB3YWl0KSB7CisgIGlmIChpdGVtU2l6ZSA+IGJ1ZlNpemUpCisgICAgdGhyb3cgRXhjZXB0aW9uKCJIZXhJblN0cmVhbSBvdmVycnVuOiBtYXggaXRlbVNpemUgZXhjZWVkZWQiKTsKKworICBpZiAoZW5kIC0gcHRyICE9IDApCisgICAgbWVtbW92ZShzdGFydCwgcHRyLCBlbmQgLSBwdHIpOworCisgIGVuZCAtPSBwdHIgLSBzdGFydDsKKyAgb2Zmc2V0ICs9IHB0ciAtIHN0YXJ0OworICBwdHIgPSBzdGFydDsKKworICB3aGlsZSAoZW5kIDwgcHRyICsgaXRlbVNpemUpIHsKKyAgICBpbnQgbiA9IGluX3N0cmVhbS5jaGVjaygyLCAxLCB3YWl0KTsKKyAgICBpZiAobiA9PSAwKSByZXR1cm4gMDsKKyAgICBjb25zdCBVOCogaXB0ciA9IGluX3N0cmVhbS5nZXRwdHIoKTsKKyAgICBjb25zdCBVOCogZXB0ciA9IGluX3N0cmVhbS5nZXRlbmQoKTsKKyAgICBpbnQgbGVuZ3RoID0gbWluKChlcHRyIC0gaXB0cikvMiwgc3RhcnQgKyBidWZTaXplIC0gZW5kKTsKKworICAgIFU4KiBvcHRyID0gKFU4KikgZW5kOworICAgIGZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgeworICAgICAgaW50IHYgPSAwOworICAgICAgcmVhZEhleEFuZFNoaWZ0KGlwdHJbaSoyXSwgJnYpOworICAgICAgcmVhZEhleEFuZFNoaWZ0KGlwdHJbaSoyKzFdLCAmdik7CisgICAgICBvcHRyW2ldID0gdjsKKyAgICB9CisKKyAgICBpbl9zdHJlYW0uc2V0cHRyKGlwdHIgKyBsZW5ndGgqMik7CisgICAgZW5kICs9IGxlbmd0aDsKKyAgfQorCisgIGlmIChpdGVtU2l6ZSAqIG5JdGVtcyA+IGVuZCAtIHB0cikKKyAgICBuSXRlbXMgPSAoZW5kIC0gcHRyKSAvIGl0ZW1TaXplOworCisgIHJldHVybiBuSXRlbXM7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmRyL0hleEluU3RyZWFtLmggYi9jb21tb24vcmRyL0hleEluU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmYjg0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZHIvSGV4SW5TdHJlYW0uaApAQCAtMCwwICsxLDUwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpZm5kZWYgX19SRFJfSEVYX0lOU1RSRUFNX0hfXworI2RlZmluZSBfX1JEUl9IRVhfSU5TVFJFQU1fSF9fCisKKyNpbmNsdWRlIDxyZHIvSW5TdHJlYW0uaD4KKworbmFtZXNwYWNlIHJkciB7CisKKyAgY2xhc3MgSGV4SW5TdHJlYW0gOiBwdWJsaWMgSW5TdHJlYW0geworICBwdWJsaWM6CisKKyAgICBIZXhJblN0cmVhbShJblN0cmVhbSYgaXMsIGludCBidWZTaXplPTApOworICAgIHZpcnR1YWwgfkhleEluU3RyZWFtKCk7CisKKyAgICBpbnQgcG9zKCk7CisKKyAgICBzdGF0aWMgYm9vbCByZWFkSGV4QW5kU2hpZnQoY2hhciBjLCBpbnQqIHYpOworICAgIHN0YXRpYyBib29sIGhleFN0clRvQmluKGNvbnN0IGNoYXIqIHMsIGNoYXIqKiBkYXRhLCBpbnQqIGxlbmd0aCk7CisKKyAgcHJvdGVjdGVkOgorICAgIGludCBvdmVycnVuKGludCBpdGVtU2l6ZSwgaW50IG5JdGVtcywgYm9vbCB3YWl0KTsKKworICBwcml2YXRlOgorICAgIGludCBidWZTaXplOworICAgIFU4KiBzdGFydDsKKyAgICBpbnQgb2Zmc2V0OworCisgICAgSW5TdHJlYW0mIGluX3N0cmVhbTsKKyAgfTsKKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlIHJkcgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZHIvSGV4T3V0U3RyZWFtLmN4eCBiL2NvbW1vbi9yZHIvSGV4T3V0U3RyZWFtLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBiNmM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3Jkci9IZXhPdXRTdHJlYW0uY3h4CkBAIC0wLDAgKzEsMTEwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpbmNsdWRlIDxyZHIvSGV4T3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmRyL0V4Y2VwdGlvbi5oPgorCit1c2luZyBuYW1lc3BhY2UgcmRyOworCitjb25zdCBpbnQgREVGQVVMVF9CVUZfTEVOID0gMTYzODQ7CisKK3N0YXRpYyBpbmxpbmUgaW50IG1pbihpbnQgYSwgaW50IGIpIHtyZXR1cm4gYTxiID8gYSA6IGI7fQorCitIZXhPdXRTdHJlYW06OkhleE91dFN0cmVhbShPdXRTdHJlYW0mIG9zLCBpbnQgYnVmbGVuKQorOiBvdXRfc3RyZWFtKG9zKSwgb2Zmc2V0KDApLCBidWZTaXplKGJ1ZmxlbiA/IGJ1ZmxlbiA6IERFRkFVTFRfQlVGX0xFTikKK3sKKyAgaWYgKGJ1ZlNpemUgJSAyKQorICAgIGJ1ZlNpemUtLTsKKyAgcHRyID0gc3RhcnQgPSBuZXcgVThbYnVmU2l6ZV07CisgIGVuZCA9IHN0YXJ0ICsgYnVmU2l6ZTsKK30KKworSGV4T3V0U3RyZWFtOjp+SGV4T3V0U3RyZWFtKCkgeworICBkZWxldGUgW10gc3RhcnQ7Cit9CisKKworY2hhciBIZXhPdXRTdHJlYW06OmludFRvSGV4KGludCBpKSB7CisgIGlmICgoaT49MCkgJiYgKGk8PTkpKQorICAgIHJldHVybiAnMCcraTsKKyAgZWxzZSBpZiAoKGk+PTEwKSAmJiAoaTw9MTUpKQorICAgIHJldHVybiAnYScrKGktMTApOworICBlbHNlCisgICAgdGhyb3cgcmRyOjpFeGNlcHRpb24oImludFRvSGV4IGZhaWxlZCIpOworfQorCitjaGFyKiBIZXhPdXRTdHJlYW06OmJpblRvSGV4U3RyKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpIHsKKyAgY2hhciogYnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoKjIrMV07CisgIGZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgeworICAgIGJ1ZmZlcltpKjJdID0gaW50VG9IZXgoKGRhdGFbaV0gPj4gNCkgJiAxNSk7CisgICAgYnVmZmVyW2kqMisxXSA9IGludFRvSGV4KChkYXRhW2ldICYgMTUpKTsKKyAgICBpZiAoIWJ1ZmZlcltpKjJdIHx8ICFidWZmZXJbaSoyKzFdKSB7CisgICAgICBkZWxldGUgW10gYnVmZmVyOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGJ1ZmZlcltsZW5ndGgqMl0gPSAwOworICByZXR1cm4gYnVmZmVyOworfQorCisKK3ZvaWQKK0hleE91dFN0cmVhbTo6d3JpdGVCdWZmZXIoKSB7CisgIFU4KiBwb3MgPSBzdGFydDsKKyAgd2hpbGUgKHBvcyAhPSBwdHIpIHsKKyAgICBvdXRfc3RyZWFtLmNoZWNrKDIpOworICAgIFU4KiBvcHRyID0gb3V0X3N0cmVhbS5nZXRwdHIoKTsKKyAgICBVOCogb2VuZCA9IG91dF9zdHJlYW0uZ2V0ZW5kKCk7CisgICAgaW50IGxlbmd0aCA9IG1pbihwdHItcG9zLCAob2VuZC1vcHRyKS8yKTsKKworICAgIGZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgeworICAgICAgb3B0cltpKjJdID0gaW50VG9IZXgoKHBvc1tpXSA+PiA0KSAmIDB4Zik7CisgICAgICBvcHRyW2kqMisxXSA9IGludFRvSGV4KHBvc1tpXSAmIDB4Zik7CisgICAgfQorCisgICAgb3V0X3N0cmVhbS5zZXRwdHIob3B0ciArIGxlbmd0aCoyKTsKKyAgICBwb3MgKz0gbGVuZ3RoOworICB9CisgIG9mZnNldCArPSBwdHIgLSBzdGFydDsKKyAgcHRyID0gc3RhcnQ7Cit9CisKK2ludCBIZXhPdXRTdHJlYW06Omxlbmd0aCgpCit7CisgIHJldHVybiBvZmZzZXQgKyBwdHIgLSBzdGFydDsKK30KKwordm9pZAorSGV4T3V0U3RyZWFtOjpmbHVzaCgpIHsKKyAgd3JpdGVCdWZmZXIoKTsKKyAgb3V0X3N0cmVhbS5mbHVzaCgpOworfQorCitpbnQKK0hleE91dFN0cmVhbTo6b3ZlcnJ1bihpbnQgaXRlbVNpemUsIGludCBuSXRlbXMpIHsKKyAgaWYgKGl0ZW1TaXplID4gYnVmU2l6ZSkKKyAgICB0aHJvdyBFeGNlcHRpb24oIkhleE91dFN0cmVhbSBvdmVycnVuOiBtYXggaXRlbVNpemUgZXhjZWVkZWQiKTsKKworICB3cml0ZUJ1ZmZlcigpOworCisgIGlmIChpdGVtU2l6ZSAqIG5JdGVtcyA+IGVuZCAtIHB0cikKKyAgICBuSXRlbXMgPSAoZW5kIC0gcHRyKSAvIGl0ZW1TaXplOworCisgIHJldHVybiBuSXRlbXM7Cit9CisKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZHIvSGV4T3V0U3RyZWFtLmggYi9jb21tb24vcmRyL0hleE91dFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjQ3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmRyL0hleE91dFN0cmVhbS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2lmbmRlZiBfX1JEUl9IRVhfT1VUU1RSRUFNX0hfXworI2RlZmluZSBfX1JEUl9IRVhfT1VUU1RSRUFNX0hfXworCisjaW5jbHVkZSA8cmRyL091dFN0cmVhbS5oPgorCituYW1lc3BhY2UgcmRyIHsKKworICBjbGFzcyBIZXhPdXRTdHJlYW0gOiBwdWJsaWMgT3V0U3RyZWFtIHsKKyAgcHVibGljOgorCisgICAgSGV4T3V0U3RyZWFtKE91dFN0cmVhbSYgb3MsIGludCBidWZsZW49MCk7CisgICAgdmlydHVhbCB+SGV4T3V0U3RyZWFtKCk7CisKKyAgICB2b2lkIGZsdXNoKCk7CisgICAgaW50IGxlbmd0aCgpOworCisgICAgc3RhdGljIGNoYXIgaW50VG9IZXgoaW50IGkpOworICAgIHN0YXRpYyBjaGFyKiBiaW5Ub0hleFN0cihjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKTsKKworICBwcml2YXRlOgorICAgIHZvaWQgd3JpdGVCdWZmZXIoKTsKKyAgICBpbnQgb3ZlcnJ1bihpbnQgaXRlbVNpemUsIGludCBuSXRlbXMpOworCisgICAgT3V0U3RyZWFtJiBvdXRfc3RyZWFtOworCisgICAgVTgqIHN0YXJ0OworICAgIGludCBvZmZzZXQ7CisgICAgaW50IGJ1ZlNpemU7CisgIH07CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmRyL0luU3RyZWFtLmN4eCBiL2NvbW1vbi9yZHIvSW5TdHJlYW0uY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTNiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmRyL0luU3RyZWFtLmN4eApAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpbmNsdWRlIDxyZHIvSW5TdHJlYW0uaD4KKyNpbmNsdWRlIDxyZHIvRXhjZXB0aW9uLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZHI7CisKK1UzMiBJblN0cmVhbTo6bWF4U3RyaW5nTGVuZ3RoID0gNjU1MzU7CisKK2NoYXIqIEluU3RyZWFtOjpyZWFkU3RyaW5nKCkKK3sKKyAgVTMyIGxlbiA9IHJlYWRVMzIoKTsKKyAgaWYgKGxlbiA+IG1heFN0cmluZ0xlbmd0aCkKKyAgICB0aHJvdyBFeGNlcHRpb24oIkluU3RyZWFtIG1heCBzdHJpbmcgbGVuZ3RoIGV4Y2VlZGVkIik7CisgIGNoYXIqIHN0ciA9IG5ldyBjaGFyW2xlbisxXTsKKyAgcmVhZEJ5dGVzKHN0ciwgbGVuKTsKKyAgc3RyW2xlbl0gPSAwOworICByZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9JblN0cmVhbS5oIGIvY29tbW9uL3Jkci9JblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMjJhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmRyL0luU3RyZWFtLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8KKy8vIHJkcjo6SW5TdHJlYW0gbWFyc2hhbGxzIGRhdGEgZnJvbSBhIGJ1ZmZlciBzdG9yZWQgaW4gUkRSIChSRkIgRGF0YQorLy8gUmVwcmVzZW50YXRpb24pLgorLy8KKworI2lmbmRlZiBfX1JEUl9JTlNUUkVBTV9IX18KKyNkZWZpbmUgX19SRFJfSU5TVFJFQU1fSF9fCisKKyNpbmNsdWRlIDxyZHIvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gZm9yIG1lbWNweQorCituYW1lc3BhY2UgcmRyIHsKKworICBjbGFzcyBJblN0cmVhbSB7CisKKyAgcHVibGljOgorCisgICAgdmlydHVhbCB+SW5TdHJlYW0oKSB7fQorCisgICAgLy8gY2hlY2soKSBlbnN1cmVzIHRoZXJlIGlzIGJ1ZmZlciBkYXRhIGZvciBhdCBsZWFzdCBvbmUgaXRlbSBvZiBzaXplCisgICAgLy8gaXRlbVNpemUgYnl0ZXMuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGJ1ZmZlciAodXAgdG8gYQorICAgIC8vIG1heGltdW0gb2Ygbkl0ZW1zKS4gIElmIHdhaXQgaXMgZmFsc2UsIHRoZW4gaW5zdGVhZCBvZiBibG9ja2luZyB0byB3YWl0CisgICAgLy8gZm9yIHRoZSBieXRlcywgemVybyBpcyByZXR1cm5lZCBpZiB0aGUgYnl0ZXMgYXJlIG5vdCBpbW1lZGlhdGVseQorICAgIC8vIGF2YWlsYWJsZS4KKworICAgIGlubGluZSBpbnQgY2hlY2soaW50IGl0ZW1TaXplLCBpbnQgbkl0ZW1zPTEsIGJvb2wgd2FpdD10cnVlKQorICAgIHsKKyAgICAgIGlmIChwdHIgKyBpdGVtU2l6ZSAqIG5JdGVtcyA+IGVuZCkgeworICAgICAgICBpZiAocHRyICsgaXRlbVNpemUgPiBlbmQpCisgICAgICAgICAgcmV0dXJuIG92ZXJydW4oaXRlbVNpemUsIG5JdGVtcywgd2FpdCk7CisKKyAgICAgICAgbkl0ZW1zID0gKGVuZCAtIHB0cikgLyBpdGVtU2l6ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuSXRlbXM7CisgICAgfQorCisgICAgLy8gY2hlY2tOb1dhaXQoKSB0cmllcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGNhbgorICAgIC8vIGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4gIEl0IHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBjYXNlLCBmYWxzZQorICAgIC8vIG90aGVyd2lzZS4gIFRoZSBsZW5ndGggbXVzdCBiZSAic21hbGwiIChsZXNzIHRoYW4gdGhlIGJ1ZmZlciBzaXplKS4KKworICAgIGlubGluZSBib29sIGNoZWNrTm9XYWl0KGludCBsZW5ndGgpIHsgcmV0dXJuIGNoZWNrKGxlbmd0aCwgMSwgZmFsc2UpIT0wOyB9CisKKyAgICAvLyByZWFkVS9TTigpIG1ldGhvZHMgcmVhZCB1bnNpZ25lZCBhbmQgc2lnbmVkIE4tYml0IGludGVnZXJzLgorCisgICAgaW5saW5lIFU4ICByZWFkVTgoKSAgeyBjaGVjaygxKTsgcmV0dXJuICpwdHIrKzsgfQorICAgIGlubGluZSBVMTYgcmVhZFUxNigpIHsgY2hlY2soMik7IGludCBiMCA9ICpwdHIrKzsgaW50IGIxID0gKnB0cisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIwIDw8IDggfCBiMTsgfQorICAgIGlubGluZSBVMzIgcmVhZFUzMigpIHsgY2hlY2soNCk7IGludCBiMCA9ICpwdHIrKzsgaW50IGIxID0gKnB0cisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiMiA9ICpwdHIrKzsgaW50IGIzID0gKnB0cisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIwIDw8IDI0IHwgYjEgPDwgMTYgfCBiMiA8PCA4IHwgYjM7IH0KKworICAgIGlubGluZSBTOCAgcmVhZFM4KCkgIHsgcmV0dXJuIChTOCkgcmVhZFU4KCk7ICB9CisgICAgaW5saW5lIFMxNiByZWFkUzE2KCkgeyByZXR1cm4gKFMxNilyZWFkVTE2KCk7IH0KKyAgICBpbmxpbmUgUzMyIHJlYWRTMzIoKSB7IHJldHVybiAoUzMyKXJlYWRVMzIoKTsgfQorCisgICAgLy8gcmVhZENvbXBhY3RMZW5ndGgoKSByZWFkcyAxLi4zIGJ5dGVzIHJlcHJlc2VudGluZyBsZW5ndGggb2YgdGhlIGRhdGEKKyAgICAvLyBmb2xsb3dpbmcuICBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBUaWdodCBkZWNvZGVyLgorCisgICAgaW5saW5lIHVuc2lnbmVkIGludCByZWFkQ29tcGFjdExlbmd0aCgpIHsKKyAgICAgIFU4IGIgPSByZWFkVTgoKTsKKyAgICAgIGludCByZXN1bHQgPSAoaW50KWIgJiAweDdGOworICAgICAgaWYgKGIgJiAweDgwKSB7CisgICAgICAgIGIgPSByZWFkVTgoKTsKKyAgICAgICAgcmVzdWx0IHw9ICgoaW50KWIgJiAweDdGKSA8PCA3OworICAgICAgICBpZiAoYiAmIDB4ODApIHsKKyAgICAgICAgICBiID0gcmVhZFU4KCk7CisgICAgICAgICAgcmVzdWx0IHw9ICgoaW50KWIgJiAweEZGKSA8PCAxNDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyByZWFkU3RyaW5nKCkgcmVhZHMgYSBzdHJpbmcgLSBhIFUzMiBsZW5ndGggZm9sbG93ZWQgYnkgdGhlIGRhdGEuCisgICAgLy8gUmV0dXJucyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgLSB0aGUgY2FsbGVyIHNob3VsZCBkZWxldGVbXSBpdAorICAgIC8vIGFmdGVyd2FyZHMuCisKKyAgICBjaGFyKiByZWFkU3RyaW5nKCk7CisKKyAgICAvLyBtYXhTdHJpbmdMZW5ndGggcHJvdGVjdHMgYWdhaW5zdCBhbGxvY2F0aW5nIGEgaHVnZSBidWZmZXIuICBTZXQgaXQKKyAgICAvLyBoaWdoZXIgaWYgeW91IG5lZWQgbG9uZ2VyIHN0cmluZ3MuCisKKyAgICBzdGF0aWMgVTMyIG1heFN0cmluZ0xlbmd0aDsKKworICAgIGlubGluZSB2b2lkIHNraXAoaW50IGJ5dGVzKSB7CisgICAgICB3aGlsZSAoYnl0ZXMgPiAwKSB7CisgICAgICAgIGludCBuID0gY2hlY2soMSwgYnl0ZXMpOworICAgICAgICBwdHIgKz0gbjsKKyAgICAgICAgYnl0ZXMgLT0gbjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZWFkQnl0ZXMoKSByZWFkcyBhbiBleGFjdCBudW1iZXIgb2YgYnl0ZXMuCisKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZEJ5dGVzKHZvaWQqIGRhdGEsIGludCBsZW5ndGgpIHsKKyAgICAgIFU4KiBkYXRhUHRyID0gKFU4KilkYXRhOworICAgICAgVTgqIGRhdGFFbmQgPSBkYXRhUHRyICsgbGVuZ3RoOworICAgICAgd2hpbGUgKGRhdGFQdHIgPCBkYXRhRW5kKSB7CisgICAgICAgIGludCBuID0gY2hlY2soMSwgZGF0YUVuZCAtIGRhdGFQdHIpOworICAgICAgICBtZW1jcHkoZGF0YVB0ciwgcHRyLCBuKTsKKyAgICAgICAgcHRyICs9IG47CisgICAgICAgIGRhdGFQdHIgKz0gbjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZWFkT3BhcXVlTigpIHJlYWRzIGEgcXVhbnRpdHkgd2l0aG91dCBieXRlLXN3YXBwaW5nLgorCisgICAgaW5saW5lIFU4ICByZWFkT3BhcXVlOCgpICB7IHJldHVybiByZWFkVTgoKTsgfQorICAgIGlubGluZSBVMTYgcmVhZE9wYXF1ZTE2KCkgeyBjaGVjaygyKTsgVTE2IHI7ICgoVTgqKSZyKVswXSA9ICpwdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChVOCopJnIpWzFdID0gKnB0cisrOyByZXR1cm4gcjsgfQorICAgIGlubGluZSBVMzIgcmVhZE9wYXF1ZTMyKCkgeyBjaGVjayg0KTsgVTMyIHI7ICgoVTgqKSZyKVswXSA9ICpwdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChVOCopJnIpWzFdID0gKnB0cisrOyAoKFU4KikmcilbMl0gPSAqcHRyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVTgqKSZyKVszXSA9ICpwdHIrKzsgcmV0dXJuIHI7IH0KKyAgICBpbmxpbmUgVTMyIHJlYWRPcGFxdWUyNEEoKSB7IGNoZWNrKDMpOyBVMzIgcj0wOyAoKFU4KikmcilbMF0gPSAqcHRyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFU4KikmcilbMV0gPSAqcHRyKys7ICgoVTgqKSZyKVsyXSA9ICpwdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOyB9CisgICAgaW5saW5lIFUzMiByZWFkT3BhcXVlMjRCKCkgeyBjaGVjaygzKTsgVTMyIHI9MDsgKChVOCopJnIpWzFdID0gKnB0cisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChVOCopJnIpWzJdID0gKnB0cisrOyAoKFU4KikmcilbM10gPSAqcHRyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsgfQorCisgICAgLy8gcG9zKCkgcmV0dXJucyB0aGUgcG9zaXRpb24gaW4gdGhlIHN0cmVhbS4KKworICAgIHZpcnR1YWwgaW50IHBvcygpID0gMDsKKworICAgIC8vIGdldHB0cigpLCBnZXRlbmQoKSBhbmQgc2V0cHRyKCkgYXJlICJkaXJ0eSIgbWV0aG9kcyB3aGljaCBhbGxvdyB5b3UgdG8KKyAgICAvLyBtYW5pcHVsYXRlIHRoZSBidWZmZXIgZGlyZWN0bHkuICBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBzdHJlYW0gd2hpY2ggaXMgYQorICAgIC8vIHdyYXBwZXIgYXJvdW5kIGFuIHVuZGVybHlpbmcgc3RyZWFtLgorCisgICAgaW5saW5lIGNvbnN0IFU4KiBnZXRwdHIoKSBjb25zdCB7IHJldHVybiBwdHI7IH0KKyAgICBpbmxpbmUgY29uc3QgVTgqIGdldGVuZCgpIGNvbnN0IHsgcmV0dXJuIGVuZDsgfQorICAgIGlubGluZSB2b2lkIHNldHB0cihjb25zdCBVOCogcCkgeyBwdHIgPSBwOyB9CisKKyAgcHJpdmF0ZToKKworICAgIC8vIG92ZXJydW4oKSBpcyBpbXBsZW1lbnRlZCBieSBhIGRlcml2ZWQgY2xhc3MgdG8gY29wZSB3aXRoIGJ1ZmZlciBvdmVycnVuLgorICAgIC8vIEl0IGVuc3VyZXMgdGhlcmUgYXJlIGF0IGxlYXN0IGl0ZW1TaXplIGJ5dGVzIG9mIGJ1ZmZlciBkYXRhLiAgUmV0dXJucworICAgIC8vIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGJ1ZmZlciAodXAgdG8gYSBtYXhpbXVtIG9mIG5JdGVtcykuICBpdGVtU2l6ZQorICAgIC8vIGlzIHN1cHBvc2VkIHRvIGJlICJzbWFsbCIgKGEgZmV3IGJ5dGVzKS4gIElmIHdhaXQgaXMgZmFsc2UsIHRoZW4KKyAgICAvLyBpbnN0ZWFkIG9mIGJsb2NraW5nIHRvIHdhaXQgZm9yIHRoZSBieXRlcywgemVybyBpcyByZXR1cm5lZCBpZiB0aGUgYnl0ZXMKKyAgICAvLyBhcmUgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKworICAgIHZpcnR1YWwgaW50IG92ZXJydW4oaW50IGl0ZW1TaXplLCBpbnQgbkl0ZW1zLCBib29sIHdhaXQ9dHJ1ZSkgPSAwOworCisgIHByb3RlY3RlZDoKKworICAgIEluU3RyZWFtKCkge30KKyAgICBjb25zdCBVOCogcHRyOworICAgIGNvbnN0IFU4KiBlbmQ7CisgIH07CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmRyL01ha2VmaWxlLmluIGIvY29tbW9uL3Jkci9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWZhNTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3Jkci9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE5IEBACisKK1NSQ1MgPSBFeGNlcHRpb24uY3h4IEZkSW5TdHJlYW0uY3h4IEZkT3V0U3RyZWFtLmN4eCBJblN0cmVhbS5jeHggXAorICAgICAgIFJhbmRvbVN0cmVhbS5jeHggWmxpYkluU3RyZWFtLmN4eCBabGliT3V0U3RyZWFtLmN4eCBcCisgICAgICAgSGV4SW5TdHJlYW0uY3h4IEhleE91dFN0cmVhbS5jeHgKKworT0JKUyA9ICQoU1JDUzouY3h4PS5vKQorCitESVJfQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikgQFpMSUJfSU5DTFVERUAKKworbGlicmFyeSA9IGxpYnJkci5hCisKK2FsbDo6ICQobGlicmFyeSkKKworJChsaWJyYXJ5KTogJChPQkpTKQorCXJtIC1mICQobGlicmFyeSkKKwkkKEFSKSAkKGxpYnJhcnkpICQoT0JKUykKKwkkKFJBTkxJQikgJChsaWJyYXJ5KQorCisjIGZvbGxvd2VkIGJ5IGJvaWxlcnBsYXRlLm1rCmRpZmYgLS1naXQgYS9jb21tb24vcmRyL01lbUluU3RyZWFtLmggYi9jb21tb24vcmRyL01lbUluU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjYTNmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZHIvTWVtSW5TdHJlYW0uaApAQCAtMCwwICsxLDYzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vCisvLyByZHI6Ok1lbUluU3RyZWFtIGlzIGFuIEluU3RyZWFtIHdoaWNoIHN0cmVhbXMgZnJvbSBhIGdpdmVuIG1lbW9yeSBidWZmZXIuCisvLyBJZiB0aGUgZGVsZXRlV2hlbkRvbmUgcGFyYW1ldGVyIGlzIHRydWUgdGhlbiB0aGUgYnVmZmVyIHdpbGwgYmUgZGVsZXRlW11kIGluCisvLyB0aGUgZGVzdHJ1Y3Rvci4gIE5vdGUgdGhhdCBpdCBpcyBkZWxldGVbXWQgYXMgYSBVOCogLSBzdHJpY3RseSBzcGVha2luZyB0aGlzCisvLyBtZWFucyBpdCBvdWdodCB0byBiZSBuZXdbXWVkIGFzIGEgVTgqIGFzIHdlbGwsIGJ1dCBvbiBtb3N0IHBsYXRmb3JtcyB0aGlzCisvLyBkb2Vzbid0IG1hdHRlci4KKy8vCisKKyNpZm5kZWYgX19SRFJfTUVNSU5TVFJFQU1fSF9fCisjZGVmaW5lIF9fUkRSX01FTUlOU1RSRUFNX0hfXworCisjaW5jbHVkZSA8cmRyL0luU3RyZWFtLmg+CisjaW5jbHVkZSA8cmRyL0V4Y2VwdGlvbi5oPgorCituYW1lc3BhY2UgcmRyIHsKKworICBjbGFzcyBNZW1JblN0cmVhbSA6IHB1YmxpYyBJblN0cmVhbSB7CisKKyAgcHVibGljOgorCisgICAgTWVtSW5TdHJlYW0oY29uc3Qgdm9pZCogZGF0YSwgaW50IGxlbiwgYm9vbCBkZWxldGVXaGVuRG9uZV89ZmFsc2UpCisgICAgICA6IHN0YXJ0KChjb25zdCBVOCopZGF0YSksIGRlbGV0ZVdoZW5Eb25lKGRlbGV0ZVdoZW5Eb25lXykKKyAgICB7CisgICAgICBwdHIgPSBzdGFydDsKKyAgICAgIGVuZCA9IHN0YXJ0ICsgbGVuOworICAgIH0KKworICAgIHZpcnR1YWwgfk1lbUluU3RyZWFtKCkgeworICAgICAgaWYgKGRlbGV0ZVdoZW5Eb25lKQorICAgICAgICBkZWxldGUgW10gKFU4KilzdGFydDsKKyAgICB9CisKKyAgICBpbnQgcG9zKCkgeyByZXR1cm4gcHRyIC0gc3RhcnQ7IH0KKyAgICB2b2lkIHJlcG9zaXRpb24oaW50IHBvcykgeyBwdHIgPSBzdGFydCArIHBvczsgfQorCisgIHByaXZhdGU6CisKKyAgICBpbnQgb3ZlcnJ1bihpbnQgaXRlbVNpemUsIGludCBuSXRlbXMsIGJvb2wgd2FpdCkgeyB0aHJvdyBFbmRPZlN0cmVhbSgpOyB9CisgICAgY29uc3QgVTgqIHN0YXJ0OworICAgIGJvb2wgZGVsZXRlV2hlbkRvbmU7CisgIH07CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmRyL01lbU91dFN0cmVhbS5oIGIvY29tbW9uL3Jkci9NZW1PdXRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTNlOTUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3Jkci9NZW1PdXRTdHJlYW0uaApAQCAtMCwwICsxLDgzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vCisvLyBBIE1lbU91dFN0cmVhbSBncm93cyBhcyBuZWVkZWQgd2hlbiBkYXRhIGlzIHdyaXR0ZW4gdG8gaXQuCisvLworCisjaWZuZGVmIF9fUkRSX01FTU9VVFNUUkVBTV9IX18KKyNkZWZpbmUgX19SRFJfTUVNT1VUU1RSRUFNX0hfXworCisjaW5jbHVkZSA8cmRyL091dFN0cmVhbS5oPgorCituYW1lc3BhY2UgcmRyIHsKKworICBjbGFzcyBNZW1PdXRTdHJlYW0gOiBwdWJsaWMgT3V0U3RyZWFtIHsKKworICBwdWJsaWM6CisKKyAgICBNZW1PdXRTdHJlYW0oaW50IGxlbj0xMDI0KSB7CisgICAgICBzdGFydCA9IHB0ciA9IG5ldyBVOFtsZW5dOworICAgICAgZW5kID0gc3RhcnQgKyBsZW47CisgICAgfQorCisgICAgdmlydHVhbCB+TWVtT3V0U3RyZWFtKCkgeworICAgICAgZGVsZXRlIFtdIHN0YXJ0OworICAgIH0KKworICAgIHZvaWQgd3JpdGVCeXRlcyhjb25zdCB2b2lkKiBkYXRhLCBpbnQgbGVuZ3RoKSB7CisgICAgICBjaGVjayhsZW5ndGgpOworICAgICAgbWVtY3B5KHB0ciwgZGF0YSwgbGVuZ3RoKTsKKyAgICAgIHB0ciArPSBsZW5ndGg7CisgICAgfQorCisgICAgaW50IGxlbmd0aCgpIHsgcmV0dXJuIHB0ciAtIHN0YXJ0OyB9CisgICAgdm9pZCBjbGVhcigpIHsgcHRyID0gc3RhcnQ7IH07CisgICAgdm9pZCBjbGVhckFuZFplcm8oKSB7IG1lbXNldChzdGFydCwgMCwgcHRyLXN0YXJ0KTsgY2xlYXIoKTsgfQorICAgIHZvaWQgcmVwb3NpdGlvbihpbnQgcG9zKSB7IHB0ciA9IHN0YXJ0ICsgcG9zOyB9CisKKyAgICAvLyBkYXRhKCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlci4KKworICAgIGNvbnN0IHZvaWQqIGRhdGEoKSB7IHJldHVybiAoY29uc3Qgdm9pZCopc3RhcnQ7IH0KKworICBwcml2YXRlOgorCisgICAgLy8gb3ZlcnJ1bigpIGVpdGhlciBkb3VibGVzIHRoZSBidWZmZXIgb3IgYWRkcyBlbm91Z2ggc3BhY2UgZm9yIG5JdGVtcyBvZgorICAgIC8vIHNpemUgaXRlbVNpemUgYnl0ZXMuCisKKyAgICBpbnQgb3ZlcnJ1bihpbnQgaXRlbVNpemUsIGludCBuSXRlbXMpIHsKKyAgICAgIGludCBsZW4gPSBwdHIgLSBzdGFydCArIGl0ZW1TaXplICogbkl0ZW1zOworICAgICAgaWYgKGxlbiA8IChlbmQgLSBzdGFydCkgKiAyKQorICAgICAgICBsZW4gPSAoZW5kIC0gc3RhcnQpICogMjsKKworICAgICAgVTgqIG5ld1N0YXJ0ID0gbmV3IFU4W2xlbl07CisgICAgICBtZW1jcHkobmV3U3RhcnQsIHN0YXJ0LCBwdHIgLSBzdGFydCk7CisgICAgICBwdHIgPSBuZXdTdGFydCArIChwdHIgLSBzdGFydCk7CisgICAgICBkZWxldGUgW10gc3RhcnQ7CisgICAgICBzdGFydCA9IG5ld1N0YXJ0OworICAgICAgZW5kID0gbmV3U3RhcnQgKyBsZW47CisKKyAgICAgIHJldHVybiBuSXRlbXM7CisgICAgfQorCisgICAgVTgqIHN0YXJ0OworICB9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9PdXRTdHJlYW0uaCBiL2NvbW1vbi9yZHIvT3V0U3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkMmVlYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZHIvT3V0U3RyZWFtLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8KKy8vIHJkcjo6T3V0U3RyZWFtIG1hcnNoYWxscyBkYXRhIGludG8gYSBidWZmZXIgc3RvcmVkIGluIFJEUiAoUkZCIERhdGEKKy8vIFJlcHJlc2VudGF0aW9uKS4KKy8vCisKKyNpZm5kZWYgX19SRFJfT1VUU1RSRUFNX0hfXworI2RlZmluZSBfX1JEUl9PVVRTVFJFQU1fSF9fCisKKyNpbmNsdWRlIDxyZHIvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gZm9yIG1lbWNweQorCituYW1lc3BhY2UgcmRyIHsKKworICBjbGFzcyBPdXRTdHJlYW0geworCisgIHByb3RlY3RlZDoKKworICAgIE91dFN0cmVhbSgpIHt9CisKKyAgcHVibGljOgorCisgICAgdmlydHVhbCB+T3V0U3RyZWFtKCkge30KKworICAgIC8vIGNoZWNrKCkgZW5zdXJlcyB0aGVyZSBpcyBidWZmZXIgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBpdGVtIG9mIHNpemUKKyAgICAvLyBpdGVtU2l6ZSBieXRlcy4gIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyB3aGljaCBmaXQgKHVwIHRvIGEgbWF4aW11bQorICAgIC8vIG9mIG5JdGVtcykuCisKKyAgICBpbmxpbmUgaW50IGNoZWNrKGludCBpdGVtU2l6ZSwgaW50IG5JdGVtcz0xKQorICAgIHsKKyAgICAgIGlmIChwdHIgKyBpdGVtU2l6ZSAqIG5JdGVtcyA+IGVuZCkgeworICAgICAgICBpZiAocHRyICsgaXRlbVNpemUgPiBlbmQpCisgICAgICAgICAgcmV0dXJuIG92ZXJydW4oaXRlbVNpemUsIG5JdGVtcyk7CisKKyAgICAgICAgbkl0ZW1zID0gKGVuZCAtIHB0cikgLyBpdGVtU2l6ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuSXRlbXM7CisgICAgfQorCisgICAgLy8gd3JpdGVVL1NOKCkgbWV0aG9kcyB3cml0ZSB1bnNpZ25lZCBhbmQgc2lnbmVkIE4tYml0IGludGVnZXJzLgorCisgICAgaW5saW5lIHZvaWQgd3JpdGVVOCggVTggIHUpIHsgY2hlY2soMSk7ICpwdHIrKyA9IHU7IH0KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVUxNihVMTYgdSkgeyBjaGVjaygyKTsgKnB0cisrID0gdSA+PiA4OyAqcHRyKysgPSAoVTgpdTsgfQorICAgIGlubGluZSB2b2lkIHdyaXRlVTMyKFUzMiB1KSB7IGNoZWNrKDQpOyAqcHRyKysgPSB1ID4+IDI0OyAqcHRyKysgPSB1ID4+IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSB1ID4+IDg7ICpwdHIrKyA9IHU7IH0KKworICAgIGlubGluZSB2b2lkIHdyaXRlUzgoIFM4ICBzKSB7IHdyaXRlVTgoKFU4KXMpOyB9CisgICAgaW5saW5lIHZvaWQgd3JpdGVTMTYoUzE2IHMpIHsgd3JpdGVVMTYoKFUxNilzKTsgfQorICAgIGlubGluZSB2b2lkIHdyaXRlUzMyKFMzMiBzKSB7IHdyaXRlVTMyKChVMzIpcyk7IH0KKworICAgIC8vIHdyaXRlQ29tcGFjdExlbmd0aCgpIHdyaXRlcyAxLi4zIGJ5dGVzIHJlcHJlc2VudGluZyBsZW5ndGggb2YgdGhlIGRhdGEKKyAgICAvLyBmb2xsb3dpbmcuICBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBUaWdodCBlbmNvZGVyLgorCisgICAgaW5saW5lIHZvaWQgd3JpdGVDb21wYWN0TGVuZ3RoKHVuc2lnbmVkIGludCBsZW4pIHsKKyAgICAgIFU4IGIgPSBsZW4gJiAweDdGOworICAgICAgaWYgKGxlbiA8PSAweDdGKSB7CisgICAgICAgIHdyaXRlVTgoYik7CisgICAgICB9IGVsc2UgeworICAgICAgICB3cml0ZVU4KGIgfCAweDgwKTsKKyAgICAgICAgYiA9IGxlbiA+PiA3ICYgMHg3RjsKKyAgICAgICAgaWYgKGxlbiA8PSAweDNGRkYpIHsKKyAgICAgICAgICB3cml0ZVU4KGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdyaXRlVTgoYiB8IDB4ODApOworICAgICAgICAgIHdyaXRlVTgobGVuID4+IDE0ICYgMHhGRik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3cml0ZVN0cmluZygpIHdyaXRlcyBhIHN0cmluZyAtIGEgVTMyIGxlbmd0aCBmb2xsb3dlZCBieSB0aGUgZGF0YS4gIFRoZQorICAgIC8vIGdpdmVuIHN0cmluZyBzaG91bGQgYmUgbnVsbC10ZXJtaW5hdGVkIChidXQgdGhlIHRlcm1pbmF0aW5nIG51bGwgaXMgbm90CisgICAgLy8gd3JpdHRlbiB0byB0aGUgc3RyZWFtKS4KKworICAgIGlubGluZSB2b2lkIHdyaXRlU3RyaW5nKGNvbnN0IGNoYXIqIHN0cikgeworICAgICAgVTMyIGxlbiA9IHN0cmxlbihzdHIpOworICAgICAgd3JpdGVVMzIobGVuKTsKKyAgICAgIHdyaXRlQnl0ZXMoc3RyLCBsZW4pOworICAgIH0KKworICAgIGlubGluZSB2b2lkIHBhZChpbnQgYnl0ZXMpIHsKKyAgICAgIHdoaWxlIChieXRlcy0tID4gMCkgd3JpdGVVOCgwKTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBza2lwKGludCBieXRlcykgeworICAgICAgd2hpbGUgKGJ5dGVzID4gMCkgeworICAgICAgICBpbnQgbiA9IGNoZWNrKDEsIGJ5dGVzKTsKKyAgICAgICAgcHRyICs9IG47CisgICAgICAgIGJ5dGVzIC09IG47CisgICAgICB9CisgICAgfQorCisgICAgLy8gd3JpdGVCeXRlcygpIHdyaXRlcyBhbiBleGFjdCBudW1iZXIgb2YgYnl0ZXMuCisKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVCeXRlcyhjb25zdCB2b2lkKiBkYXRhLCBpbnQgbGVuZ3RoKSB7CisgICAgICBjb25zdCBVOCogZGF0YVB0ciA9IChjb25zdCBVOCopZGF0YTsKKyAgICAgIGNvbnN0IFU4KiBkYXRhRW5kID0gZGF0YVB0ciArIGxlbmd0aDsKKyAgICAgIHdoaWxlIChkYXRhUHRyIDwgZGF0YUVuZCkgeworICAgICAgICBpbnQgbiA9IGNoZWNrKDEsIGRhdGFFbmQgLSBkYXRhUHRyKTsKKyAgICAgICAgbWVtY3B5KHB0ciwgZGF0YVB0ciwgbik7CisgICAgICAgIHB0ciArPSBuOworICAgICAgICBkYXRhUHRyICs9IG47CisgICAgICB9CisgICAgfQorCisgICAgLy8gd3JpdGVPcGFxdWVOKCkgd3JpdGVzIGEgcXVhbnRpdHkgd2l0aG91dCBieXRlLXN3YXBwaW5nLgorCisgICAgaW5saW5lIHZvaWQgd3JpdGVPcGFxdWU4KCBVOCAgdSkgeyB3cml0ZVU4KHUpOyB9CisgICAgaW5saW5lIHZvaWQgd3JpdGVPcGFxdWUxNihVMTYgdSkgeyBjaGVjaygyKTsgKnB0cisrID0gKChVOCopJnUpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gKChVOCopJnUpWzFdOyB9CisgICAgaW5saW5lIHZvaWQgd3JpdGVPcGFxdWUzMihVMzIgdSkgeyBjaGVjayg0KTsgKnB0cisrID0gKChVOCopJnUpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gKChVOCopJnUpWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gKChVOCopJnUpWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gKChVOCopJnUpWzNdOyB9CisgICAgaW5saW5lIHZvaWQgd3JpdGVPcGFxdWUyNEEoVTMyIHUpIHsgY2hlY2soMyk7ICpwdHIrKyA9ICgoVTgqKSZ1KVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSAoKFU4KikmdSlbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gKChVOCopJnUpWzJdOyB9CisgICAgaW5saW5lIHZvaWQgd3JpdGVPcGFxdWUyNEIoVTMyIHUpIHsgY2hlY2soMyk7ICpwdHIrKyA9ICgoVTgqKSZ1KVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSAoKFU4KikmdSlbMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gKChVOCopJnUpWzNdOyB9CisKKyAgICAvLyBsZW5ndGgoKSByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbS4KKworICAgIHZpcnR1YWwgaW50IGxlbmd0aCgpID0gMDsKKworICAgIC8vIGZsdXNoKCkgcmVxdWVzdHMgdGhhdCB0aGUgc3RyZWFtIGJlIGZsdXNoZWQuCisKKyAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKSB7fQorCisgICAgLy8gZ2V0cHRyKCksIGdldGVuZCgpIGFuZCBzZXRwdHIoKSBhcmUgImRpcnR5IiBtZXRob2RzIHdoaWNoIGFsbG93IHlvdSB0bworICAgIC8vIG1hbmlwdWxhdGUgdGhlIGJ1ZmZlciBkaXJlY3RseS4gIFRoaXMgaXMgdXNlZnVsIGZvciBhIHN0cmVhbSB3aGljaCBpcyBhCisgICAgLy8gd3JhcHBlciBhcm91bmQgYW4gdW5kZXJseWluZyBzdHJlYW0uCisKKyAgICBpbmxpbmUgVTgqIGdldHB0cigpIHsgcmV0dXJuIHB0cjsgfQorICAgIGlubGluZSBVOCogZ2V0ZW5kKCkgeyByZXR1cm4gZW5kOyB9CisgICAgaW5saW5lIHZvaWQgc2V0cHRyKFU4KiBwKSB7IHB0ciA9IHA7IH0KKworICBwcml2YXRlOgorCisgICAgLy8gb3ZlcnJ1bigpIGlzIGltcGxlbWVudGVkIGJ5IGEgZGVyaXZlZCBjbGFzcyB0byBjb3BlIHdpdGggYnVmZmVyIG92ZXJydW4uCisgICAgLy8gSXQgZW5zdXJlcyB0aGVyZSBhcmUgYXQgbGVhc3QgaXRlbVNpemUgYnl0ZXMgb2YgYnVmZmVyIHNwYWNlLiAgUmV0dXJucworICAgIC8vIHRoZSBudW1iZXIgb2YgaXRlbXMgd2hpY2ggZml0ICh1cCB0byBhIG1heGltdW0gb2Ygbkl0ZW1zKS4gIGl0ZW1TaXplIGlzCisgICAgLy8gc3VwcG9zZWQgdG8gYmUgInNtYWxsIiAoYSBmZXcgYnl0ZXMpLgorCisgICAgdmlydHVhbCBpbnQgb3ZlcnJ1bihpbnQgaXRlbVNpemUsIGludCBuSXRlbXMpID0gMDsKKworICBwcm90ZWN0ZWQ6CisKKyAgICBVOCogcHRyOworICAgIFU4KiBlbmQ7CisgIH07CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmRyL1JhbmRvbVN0cmVhbS5jeHggYi9jb21tb24vcmRyL1JhbmRvbVN0cmVhbS5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1NmMyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZHIvUmFuZG9tU3RyZWFtLmN4eApAQCAtMCwwICsxLDEzMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisjaW5jbHVkZSA8cmRyL1JhbmRvbVN0cmVhbS5oPgorI2luY2x1ZGUgPHJkci9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZuZGVmIFdJTjMyCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbHNlCisjZGVmaW5lIGdldHBpZCgpIEdldEN1cnJlbnRQcm9jZXNzSWQoKQorI2lmbmRlZiBSRkJfSEFWRV9XSU5DUllQVAorI3ByYWdtYSBtZXNzYWdlKCIgIE5PVEU6IE5vdCBidWlsZGluZyBXaW5DcnlwdC1iYXNlZCBSYW5kb21TdHJlYW0iKQorI2VuZGlmCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHJkcjsKKworY29uc3QgaW50IERFRkFVTFRfQlVGX0xFTiA9IDI1NjsKKwordW5zaWduZWQgaW50IFJhbmRvbVN0cmVhbTo6c2VlZDsKKworUmFuZG9tU3RyZWFtOjpSYW5kb21TdHJlYW0oKQorICA6IG9mZnNldCgwKQoreworICBwdHIgPSBlbmQgPSBzdGFydCA9IG5ldyBVOFtERUZBVUxUX0JVRl9MRU5dOworCisjaWZkZWYgUkZCX0hBVkVfV0lOQ1JZUFQKKyAgcHJvdmlkZXIgPSAwOworICBpZiAoIUNyeXB0QWNxdWlyZUNvbnRleHQoJnByb3ZpZGVyLCAwLCAwLCBQUk9WX1JTQV9GVUxMLCAwKSkgeworICAgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBOVEVfQkFEX0tFWVNFVCkgeworICAgICAgaWYgKCFDcnlwdEFjcXVpcmVDb250ZXh0KCZwcm92aWRlciwgMCwgMCwgUFJPVl9SU0FfRlVMTCwgQ1JZUFRfTkVXS0VZU0VUKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJhbmRvbVN0cmVhbTogdW5hYmxlIHRvIGNyZWF0ZSBrZXlzZXRcbiIpOworICAgICAgICBwcm92aWRlciA9IDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUmFuZG9tU3RyZWFtOiB1bmFibGUgdG8gYWNxdWlyZSBjb250ZXh0XG4iKTsKKyAgICAgIHByb3ZpZGVyID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKCFwcm92aWRlcikgeworI2Vsc2UKKyNpZm5kZWYgV0lOMzIKKyAgZnAgPSBmb3BlbigiL2Rldi91cmFuZG9tIiwgInIiKTsKKyAgaWYgKCFmcCkKKyAgICBmcCA9IGZvcGVuKCIvZGV2L3JhbmRvbSIsICJyIik7CisgIGlmICghZnApIHsKKyNlbHNlCisgIHsKKyNlbmRpZgorI2VuZGlmCisgICAgZnByaW50ZihzdGRlcnIsIlJhbmRvbVN0cmVhbTogd2FybmluZzogbm8gT1Mgc3VwcGxpZWQgcmFuZG9tIHNvdXJjZSAtIHVzaW5nIHJhbmQoKVxuIik7CisgICAgc2VlZCArPSAodW5zaWduZWQgaW50KSB0aW1lKDApICsgZ2V0cGlkKCkgKyBnZXRwaWQoKSAqIDk4NzY1NCArIHJhbmQoKTsKKyAgICBzcmFuZChzZWVkKTsKKyAgfQorfQorCitSYW5kb21TdHJlYW06On5SYW5kb21TdHJlYW0oKSB7CisgIGRlbGV0ZSBbXSBzdGFydDsKKworI2lmZGVmIFJGQl9IQVZFX1dJTkNSWVBUCisgIGlmIChwcm92aWRlcikKKyAgICBDcnlwdFJlbGVhc2VDb250ZXh0KHByb3ZpZGVyLCAwKTsKKyNlbmRpZgorI2lmbmRlZiBXSU4zMgorICBpZiAoZnApIGZjbG9zZShmcCk7CisjZW5kaWYKK30KKworaW50IFJhbmRvbVN0cmVhbTo6cG9zKCkgeworICByZXR1cm4gb2Zmc2V0ICsgcHRyIC0gc3RhcnQ7Cit9CisKK2ludCBSYW5kb21TdHJlYW06Om92ZXJydW4oaW50IGl0ZW1TaXplLCBpbnQgbkl0ZW1zLCBib29sIHdhaXQpIHsKKyAgaWYgKGl0ZW1TaXplID4gREVGQVVMVF9CVUZfTEVOKQorICAgIHRocm93IEV4Y2VwdGlvbigiUmFuZG9tU3RyZWFtIG92ZXJydW46IG1heCBpdGVtU2l6ZSBleGNlZWRlZCIpOworCisgIGlmIChlbmQgLSBwdHIgIT0gMCkKKyAgICBtZW1tb3ZlKHN0YXJ0LCBwdHIsIGVuZCAtIHB0cik7CisKKyAgZW5kIC09IHB0ciAtIHN0YXJ0OworICBvZmZzZXQgKz0gcHRyIC0gc3RhcnQ7CisgIHB0ciA9IHN0YXJ0OworCisgIGludCBsZW5ndGggPSBzdGFydCArIERFRkFVTFRfQlVGX0xFTiAtIGVuZDsKKworI2lmZGVmIFJGQl9IQVZFX1dJTkNSWVBUCisgIGlmIChwcm92aWRlcikgeworICAgIGlmICghQ3J5cHRHZW5SYW5kb20ocHJvdmlkZXIsIGxlbmd0aCwgKFU4KillbmQpKQorICAgICAgdGhyb3cgcmRyOjpTeXN0ZW1FeGNlcHRpb24oInVuYWJsZSB0byBDcnlwdEdlblJhbmRvbSIsIEdldExhc3RFcnJvcigpKTsKKyAgICBlbmQgKz0gbGVuZ3RoOworICB9IGVsc2UgeworI2Vsc2UKKyNpZm5kZWYgV0lOMzIKKyAgaWYgKGZwKSB7CisgICAgaW50IG4gPSBmcmVhZCgoVTgqKWVuZCwgbGVuZ3RoLCAxLCBmcCk7CisgICAgaWYgKG4gIT0gMSkKKyAgICAgIHRocm93IHJkcjo6U3lzdGVtRXhjZXB0aW9uKCJyZWFkaW5nIC9kZXYvdXJhbmRvbSBvciAvZGV2L3JhbmRvbSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8pOworICAgIGVuZCArPSBsZW5ndGg7CisgIH0gZWxzZSB7CisjZWxzZQorICB7CisjZW5kaWYKKyNlbmRpZgorICAgIGZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICAgICooVTgqKWVuZCsrID0gKGludCkgKDI1Ni4wKnJhbmQoKS8oUkFORF9NQVgrMS4wKSk7CisgIH0KKworICBpZiAoaXRlbVNpemUgKiBuSXRlbXMgPiBlbmQgLSBwdHIpCisgICAgbkl0ZW1zID0gKGVuZCAtIHB0cikgLyBpdGVtU2l6ZTsKKworICByZXR1cm4gbkl0ZW1zOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9SYW5kb21TdHJlYW0uaCBiL2NvbW1vbi9yZHIvUmFuZG9tU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzMzYwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZHIvUmFuZG9tU3RyZWFtLmgKQEAgLTAsMCArMSw2MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisjaWZuZGVmIF9fUkRSX1JBTkRPTVNUUkVBTV9IX18KKyNkZWZpbmUgX19SRFJfUkFORE9NU1RSRUFNX0hfXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxyZHIvSW5TdHJlYW0uaD4KKworI2lmZGVmIFdJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmNyeXB0Lmg+CisjaWZkZWYgV0lOQ1JZUFQzMkFQSQorI2RlZmluZSBSRkJfSEFWRV9XSU5DUllQVAorI2VuZGlmCisjZW5kaWYKKworbmFtZXNwYWNlIHJkciB7CisKKyAgY2xhc3MgUmFuZG9tU3RyZWFtIDogcHVibGljIEluU3RyZWFtIHsKKworICBwdWJsaWM6CisKKyAgICBSYW5kb21TdHJlYW0oKTsKKyAgICB2aXJ0dWFsIH5SYW5kb21TdHJlYW0oKTsKKworICAgIGludCBwb3MoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgaW50IG92ZXJydW4oaW50IGl0ZW1TaXplLCBpbnQgbkl0ZW1zLCBib29sIHdhaXQpOworCisgIHByaXZhdGU6CisgICAgVTgqIHN0YXJ0OworICAgIGludCBvZmZzZXQ7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IHNlZWQ7CisjaWZkZWYgUkZCX0hBVkVfV0lOQ1JZUFQKKyAgICBIQ1JZUFRQUk9WIHByb3ZpZGVyOworI2VuZGlmCisjaWZuZGVmIFdJTjMyCisgICAgRklMRSogZnA7CisjZW5kaWYKKworICB9OworCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgcmRyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9TdWJzdGl0dXRpbmdJblN0cmVhbS5oIGIvY29tbW9uL3Jkci9TdWJzdGl0dXRpbmdJblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNWIwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmRyL1N1YnN0aXR1dGluZ0luU3RyZWFtLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2lmbmRlZiBfX1JEUl9TVUJTVElUVVRJTkdJTlNUUkVBTV9IX18KKyNkZWZpbmUgX19SRFJfU1VCU1RJVFVUSU5HSU5TVFJFQU1fSF9fCisKKyNpbmNsdWRlIDxyZHIvSW5TdHJlYW0uaD4KKyNpbmNsdWRlIDxyZHIvRXhjZXB0aW9uLmg+CisKK25hbWVzcGFjZSByZHIgeworCisgIGNsYXNzIFN1YnN0aXR1dG9yIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgY2hhciogc3Vic3RpdHV0ZShjb25zdCBjaGFyKiB2YXJOYW1lKSA9IDA7CisgIH07CisKKyAgY2xhc3MgU3Vic3RpdHV0aW5nSW5TdHJlYW0gOiBwdWJsaWMgSW5TdHJlYW0geworICBwdWJsaWM6CisgICAgU3Vic3RpdHV0aW5nSW5TdHJlYW0oSW5TdHJlYW0qIHVuZGVybHlpbmdfLCBTdWJzdGl0dXRvciogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VmFyTmFtZUxlbl8pCisgICAgICA6IHVuZGVybHlpbmcodW5kZXJseWluZ18pLCBkb2xsYXIoMCksIHN1YnN0aXR1dG9yKHMpLCBzdWJzdCgwKSwKKyAgICAgICAgbWF4VmFyTmFtZUxlbihtYXhWYXJOYW1lTGVuXykKKyAgICB7CisgICAgICBwdHIgPSBlbmQgPSB1bmRlcmx5aW5nLT5nZXRwdHIoKTsKKyAgICAgIHZhck5hbWUgPSBuZXcgY2hhclttYXhWYXJOYW1lTGVuKzFdOworICAgIH0KKyAgICB+U3Vic3RpdHV0aW5nSW5TdHJlYW0oKSB7CisgICAgICBkZWxldGUgdW5kZXJseWluZzsKKyAgICAgIGRlbGV0ZSBbXSB2YXJOYW1lOworICAgICAgZGVsZXRlIFtdIHN1YnN0OworICAgIH0KKworICAgIGludCBwb3MoKSB7IHJldHVybiB1bmRlcmx5aW5nLT5wb3MoKTsgfQorCisgICAgdmlydHVhbCBpbnQgb3ZlcnJ1bihpbnQgaXRlbVNpemUsIGludCBuSXRlbXMsIGJvb2wgd2FpdD10cnVlKSB7CisgICAgICBpZiAoaXRlbVNpemUgIT0gMSkKKyAgICAgICAgdGhyb3cgbmV3IHJkcjo6RXhjZXB0aW9uKCJTdWJzdGl0dXRpbmdJblN0cmVhbTogaXRlbVNpemUgbXVzdCBiZSAxIik7CisKKyAgICAgIGlmIChzdWJzdCkgeworICAgICAgICBkZWxldGUgW10gc3Vic3Q7CisgICAgICAgIHN1YnN0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVuZGVybHlpbmctPnNldHB0cihwdHIpOworICAgICAgfQorCisgICAgICB1bmRlcmx5aW5nLT5jaGVjaygxKTsKKyAgICAgIHB0ciA9IHVuZGVybHlpbmctPmdldHB0cigpOworICAgICAgZW5kID0gdW5kZXJseWluZy0+Z2V0ZW5kKCk7CisgICAgICBkb2xsYXIgPSAoY29uc3QgVTgqKW1lbWNocihwdHIsICckJywgZW5kLXB0cik7CisgICAgICBpZiAoZG9sbGFyKSB7CisgICAgICAgIGlmIChkb2xsYXIgPT0gcHRyKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChpIDwgbWF4VmFyTmFtZUxlbikgeworICAgICAgICAgICAgICB2YXJOYW1lW2krK10gPSB1bmRlcmx5aW5nLT5yZWFkUzgoKTsKKyAgICAgICAgICAgICAgdmFyTmFtZVtpXSA9IDA7CisgICAgICAgICAgICAgIHN1YnN0ID0gc3Vic3RpdHV0b3ItPnN1YnN0aXR1dGUodmFyTmFtZSk7CisgICAgICAgICAgICAgIGlmIChzdWJzdCkgeworICAgICAgICAgICAgICAgIHB0ciA9IChVOCopc3Vic3Q7CisgICAgICAgICAgICAgICAgZW5kID0gKFU4KilzdWJzdCArIHN0cmxlbihzdWJzdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChFbmRPZlN0cmVhbSYpIHsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXN1YnN0KQorICAgICAgICAgICAgZG9sbGFyID0gKGNvbnN0IFU4KiltZW1jaHIocHRyKzEsICckJywgZW5kLXB0ci0xKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN1YnN0ICYmIGRvbGxhcikgZW5kID0gZG9sbGFyOworICAgICAgfQorCisgICAgICBpZiAoaXRlbVNpemUgKiBuSXRlbXMgPiBlbmQgLSBwdHIpCisgICAgICAgIG5JdGVtcyA9IChlbmQgLSBwdHIpIC8gaXRlbVNpemU7CisKKyAgICAgIHJldHVybiBuSXRlbXM7CisgICAgfQorCisgICAgSW5TdHJlYW0qIHVuZGVybHlpbmc7CisgICAgY29uc3QgVTgqIGRvbGxhcjsKKyAgICBTdWJzdGl0dXRvciogc3Vic3RpdHV0b3I7CisgICAgY2hhciogdmFyTmFtZTsKKyAgICBjaGFyKiBzdWJzdDsKKyAgICBpbnQgbWF4VmFyTmFtZUxlbjsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9abGliSW5TdHJlYW0uY3h4IGIvY29tbW9uL3Jkci9abGliSW5TdHJlYW0uY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmM2E3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmRyL1psaWJJblN0cmVhbS5jeHgKQEAgLTAsMCArMSwxMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2luY2x1ZGUgPHJkci9abGliSW5TdHJlYW0uaD4KKyNpbmNsdWRlIDxyZHIvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCit1c2luZyBuYW1lc3BhY2UgcmRyOworCitlbnVtIHsgREVGQVVMVF9CVUZfU0laRSA9IDE2Mzg0IH07CisKK1psaWJJblN0cmVhbTo6WmxpYkluU3RyZWFtKGludCBidWZTaXplXykKKyAgOiB1bmRlcmx5aW5nKDApLCBidWZTaXplKGJ1ZlNpemVfID8gYnVmU2l6ZV8gOiBERUZBVUxUX0JVRl9TSVpFKSwgb2Zmc2V0KDApLAorICAgIGJ5dGVzSW4oMCkKK3sKKyAgenMgPSBuZXcgel9zdHJlYW07CisgIHpzLT56YWxsb2MgICAgPSBaX05VTEw7CisgIHpzLT56ZnJlZSAgICAgPSBaX05VTEw7CisgIHpzLT5vcGFxdWUgICAgPSBaX05VTEw7CisgIHpzLT5uZXh0X2luICAgPSBaX05VTEw7CisgIHpzLT5hdmFpbF9pbiAgPSAwOworICBpZiAoaW5mbGF0ZUluaXQoenMpICE9IFpfT0spIHsKKyAgICBkZWxldGUgenM7CisgICAgdGhyb3cgRXhjZXB0aW9uKCJabGliSW5TdHJlYW06IGluZmxhdGVJbml0IGZhaWxlZCIpOworICB9CisgIHB0ciA9IGVuZCA9IHN0YXJ0ID0gbmV3IFU4W2J1ZlNpemVdOworfQorCitabGliSW5TdHJlYW06On5abGliSW5TdHJlYW0oKQoreworICBkZWxldGUgW10gc3RhcnQ7CisgIGluZmxhdGVFbmQoenMpOworICBkZWxldGUgenM7Cit9CisKK3ZvaWQgWmxpYkluU3RyZWFtOjpzZXRVbmRlcmx5aW5nKEluU3RyZWFtKiBpcywgaW50IGJ5dGVzSW5fKQoreworICB1bmRlcmx5aW5nID0gaXM7CisgIGJ5dGVzSW4gPSBieXRlc0luXzsKKyAgcHRyID0gZW5kID0gc3RhcnQ7Cit9CisKK2ludCBabGliSW5TdHJlYW06OnBvcygpCit7CisgIHJldHVybiBvZmZzZXQgKyBwdHIgLSBzdGFydDsKK30KKwordm9pZCBabGliSW5TdHJlYW06OnJlc2V0KCkKK3sKKyAgcHRyID0gZW5kID0gc3RhcnQ7CisgIGlmICghdW5kZXJseWluZykgcmV0dXJuOworCisgIHdoaWxlIChieXRlc0luID4gMCkgeworICAgIGRlY29tcHJlc3ModHJ1ZSk7CisgICAgZW5kID0gc3RhcnQ7IC8vIHRocm93IGF3YXkgYW55IGRhdGEKKyAgfQorICB1bmRlcmx5aW5nID0gMDsKK30KKworaW50IFpsaWJJblN0cmVhbTo6b3ZlcnJ1bihpbnQgaXRlbVNpemUsIGludCBuSXRlbXMsIGJvb2wgd2FpdCkKK3sKKyAgaWYgKGl0ZW1TaXplID4gYnVmU2l6ZSkKKyAgICB0aHJvdyBFeGNlcHRpb24oIlpsaWJJblN0cmVhbSBvdmVycnVuOiBtYXggaXRlbVNpemUgZXhjZWVkZWQiKTsKKyAgaWYgKCF1bmRlcmx5aW5nKQorICAgIHRocm93IEV4Y2VwdGlvbigiWmxpYkluU3RyZWFtIG92ZXJydW46IG5vIHVuZGVybHlpbmcgc3RyZWFtIik7CisKKyAgaWYgKGVuZCAtIHB0ciAhPSAwKQorICAgIG1lbW1vdmUoc3RhcnQsIHB0ciwgZW5kIC0gcHRyKTsKKworICBvZmZzZXQgKz0gcHRyIC0gc3RhcnQ7CisgIGVuZCAtPSBwdHIgLSBzdGFydDsKKyAgcHRyID0gc3RhcnQ7CisKKyAgd2hpbGUgKGVuZCAtIHB0ciA8IGl0ZW1TaXplKSB7CisgICAgaWYgKCFkZWNvbXByZXNzKHdhaXQpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoaXRlbVNpemUgKiBuSXRlbXMgPiBlbmQgLSBwdHIpCisgICAgbkl0ZW1zID0gKGVuZCAtIHB0cikgLyBpdGVtU2l6ZTsKKworICByZXR1cm4gbkl0ZW1zOworfQorCisvLyBkZWNvbXByZXNzKCkgY2FsbHMgdGhlIGRlY29tcHJlc3NvciBvbmNlLiAgTm90ZSB0aGF0IHRoaXMgd29uJ3QgbmVjZXNzYXJpbHkKKy8vIGdlbmVyYXRlIGFueSBvdXRwdXQgZGF0YSAtIGl0IG1heSBqdXN0IGNvbnN1bWUgc29tZSBpbnB1dCBkYXRhLiAgUmV0dXJucworLy8gZmFsc2UgaWYgd2FpdCBpcyBmYWxzZSBhbmQgd2Ugd291bGQgYmxvY2sgb24gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorCitib29sIFpsaWJJblN0cmVhbTo6ZGVjb21wcmVzcyhib29sIHdhaXQpCit7CisgIHpzLT5uZXh0X291dCA9IChVOCopZW5kOworICB6cy0+YXZhaWxfb3V0ID0gc3RhcnQgKyBidWZTaXplIC0gZW5kOworCisgIGludCBuID0gdW5kZXJseWluZy0+Y2hlY2soMSwgMSwgd2FpdCk7CisgIGlmIChuID09IDApIHJldHVybiBmYWxzZTsKKyAgenMtPm5leHRfaW4gPSAoVTgqKXVuZGVybHlpbmctPmdldHB0cigpOworICB6cy0+YXZhaWxfaW4gPSB1bmRlcmx5aW5nLT5nZXRlbmQoKSAtIHVuZGVybHlpbmctPmdldHB0cigpOworICBpZiAoKGludCl6cy0+YXZhaWxfaW4gPiBieXRlc0luKQorICAgIHpzLT5hdmFpbF9pbiA9IGJ5dGVzSW47CisKKyAgaW50IHJjID0gaW5mbGF0ZSh6cywgWl9TWU5DX0ZMVVNIKTsKKyAgaWYgKHJjICE9IFpfT0spIHsKKyAgICB0aHJvdyBFeGNlcHRpb24oIlpsaWJJblN0cmVhbTogaW5mbGF0ZSBmYWlsZWQiKTsKKyAgfQorCisgIGJ5dGVzSW4gLT0genMtPm5leHRfaW4gLSB1bmRlcmx5aW5nLT5nZXRwdHIoKTsKKyAgZW5kID0genMtPm5leHRfb3V0OworICB1bmRlcmx5aW5nLT5zZXRwdHIoenMtPm5leHRfaW4pOworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZHIvWmxpYkluU3RyZWFtLmggYi9jb21tb24vcmRyL1psaWJJblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNmI2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmRyL1psaWJJblN0cmVhbS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8KKy8vIFpsaWJJblN0cmVhbSBzdHJlYW1zIGZyb20gYSBjb21wcmVzc2VkIGRhdGEgc3RyZWFtICgidW5kZXJseWluZyIpLAorLy8gZGVjb21wcmVzc2luZyB3aXRoIHpsaWIgb24gdGhlIGZseS4KKy8vCisKKyNpZm5kZWYgX19SRFJfWkxJQklOU1RSRUFNX0hfXworI2RlZmluZSBfX1JEUl9aTElCSU5TVFJFQU1fSF9fCisKKyNpbmNsdWRlIDxyZHIvSW5TdHJlYW0uaD4KKworc3RydWN0IHpfc3RyZWFtX3M7CisKK25hbWVzcGFjZSByZHIgeworCisgIGNsYXNzIFpsaWJJblN0cmVhbSA6IHB1YmxpYyBJblN0cmVhbSB7CisKKyAgcHVibGljOgorCisgICAgWmxpYkluU3RyZWFtKGludCBidWZTaXplPTApOworICAgIHZpcnR1YWwgflpsaWJJblN0cmVhbSgpOworCisgICAgdm9pZCBzZXRVbmRlcmx5aW5nKEluU3RyZWFtKiBpcywgaW50IGJ5dGVzSW4pOworICAgIHZvaWQgcmVzZXQoKTsKKyAgICBpbnQgcG9zKCk7CisKKyAgcHJpdmF0ZToKKworICAgIGludCBvdmVycnVuKGludCBpdGVtU2l6ZSwgaW50IG5JdGVtcywgYm9vbCB3YWl0KTsKKyAgICBib29sIGRlY29tcHJlc3MoYm9vbCB3YWl0KTsKKworICAgIEluU3RyZWFtKiB1bmRlcmx5aW5nOworICAgIGludCBidWZTaXplOworICAgIGludCBvZmZzZXQ7CisgICAgel9zdHJlYW1fcyogenM7CisgICAgaW50IGJ5dGVzSW47CisgICAgVTgqIHN0YXJ0OworICB9OworCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgcmRyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9abGliT3V0U3RyZWFtLmN4eCBiL2NvbW1vbi9yZHIvWmxpYk91dFN0cmVhbS5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxZGJlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZHIvWmxpYk91dFN0cmVhbS5jeHgKQEAgLTAsMCArMSwxNjEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2luY2x1ZGUgPHJkci9abGliT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmRyL0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJkcjsKKworZW51bSB7IERFRkFVTFRfQlVGX1NJWkUgPSAxNjM4NCB9OworCitabGliT3V0U3RyZWFtOjpabGliT3V0U3RyZWFtKE91dFN0cmVhbSogb3MsIGludCBidWZTaXplXywgaW50IGNvbXByZXNzTGV2ZWwpCisgIDogdW5kZXJseWluZyhvcyksIGNvbXByZXNzaW9uTGV2ZWwoY29tcHJlc3NMZXZlbCksIG5ld0xldmVsKGNvbXByZXNzTGV2ZWwpLAorICAgIGJ1ZlNpemUoYnVmU2l6ZV8gPyBidWZTaXplXyA6IERFRkFVTFRfQlVGX1NJWkUpLCBvZmZzZXQoMCkKK3sKKyAgenMgPSBuZXcgel9zdHJlYW07CisgIHpzLT56YWxsb2MgICAgPSBaX05VTEw7CisgIHpzLT56ZnJlZSAgICAgPSBaX05VTEw7CisgIHpzLT5vcGFxdWUgICAgPSBaX05VTEw7CisgIGlmIChkZWZsYXRlSW5pdCh6cywgY29tcHJlc3NMZXZlbCkgIT0gWl9PSykgeworICAgIGRlbGV0ZSB6czsKKyAgICB0aHJvdyBFeGNlcHRpb24oIlpsaWJPdXRTdHJlYW06IGRlZmxhdGVJbml0IGZhaWxlZCIpOworICB9CisgIHB0ciA9IHN0YXJ0ID0gbmV3IFU4W2J1ZlNpemVdOworICBlbmQgPSBzdGFydCArIGJ1ZlNpemU7Cit9CisKK1psaWJPdXRTdHJlYW06On5abGliT3V0U3RyZWFtKCkKK3sKKyAgdHJ5IHsKKyAgICBmbHVzaCgpOworICB9IGNhdGNoIChFeGNlcHRpb24mKSB7CisgIH0KKyAgZGVsZXRlIFtdIHN0YXJ0OworICBkZWZsYXRlRW5kKHpzKTsKKyAgZGVsZXRlIHpzOworfQorCit2b2lkIFpsaWJPdXRTdHJlYW06OnNldFVuZGVybHlpbmcoT3V0U3RyZWFtKiBvcykKK3sKKyAgdW5kZXJseWluZyA9IG9zOworfQorCit2b2lkIFpsaWJPdXRTdHJlYW06OnNldENvbXByZXNzaW9uTGV2ZWwoaW50IGxldmVsKQoreworICBpZiAobGV2ZWwgPCAtMSB8fCBsZXZlbCA+IDkpCisgICAgbGV2ZWwgPSAtMTsgICAgICAgICAgICAgICAgIC8vIFpfREVGQVVMVF9DT01QUkVTU0lPTgorCisgIG5ld0xldmVsID0gbGV2ZWw7Cit9CisKK2ludCBabGliT3V0U3RyZWFtOjpsZW5ndGgoKQoreworICByZXR1cm4gb2Zmc2V0ICsgcHRyIC0gc3RhcnQ7Cit9CisKK3ZvaWQgWmxpYk91dFN0cmVhbTo6Zmx1c2goKQoreworICB6cy0+bmV4dF9pbiA9IHN0YXJ0OworICB6cy0+YXZhaWxfaW4gPSBwdHIgLSBzdGFydDsKKworLy8gICAgZnByaW50ZihzdGRlcnIsInpvcyBmbHVzaDogYXZhaWxfaW4gJWRcbiIsenMtPmF2YWlsX2luKTsKKworICB3aGlsZSAoenMtPmF2YWlsX2luICE9IDApIHsKKworICAgIGRvIHsKKyAgICAgIHVuZGVybHlpbmctPmNoZWNrKDEpOworICAgICAgenMtPm5leHRfb3V0ID0gdW5kZXJseWluZy0+Z2V0cHRyKCk7CisgICAgICB6cy0+YXZhaWxfb3V0ID0gdW5kZXJseWluZy0+Z2V0ZW5kKCkgLSB1bmRlcmx5aW5nLT5nZXRwdHIoKTsKKworLy8gICAgICAgIGZwcmludGYoc3RkZXJyLCJ6b3MgZmx1c2g6IGNhbGxpbmcgZGVmbGF0ZSwgYXZhaWxfaW4gJWQsIGF2YWlsX291dCAlZFxuIiwKKy8vICAgICAgICAgICAgICAgIHpzLT5hdmFpbF9pbix6cy0+YXZhaWxfb3V0KTsKKyAgICAgIGNoZWNrQ29tcHJlc3Npb25MZXZlbCgpOworICAgICAgaW50IHJjID0gZGVmbGF0ZSh6cywgWl9TWU5DX0ZMVVNIKTsKKyAgICAgIGlmIChyYyAhPSBaX09LKSB0aHJvdyBFeGNlcHRpb24oIlpsaWJPdXRTdHJlYW06IGRlZmxhdGUgZmFpbGVkIik7CisKKy8vICAgICAgICBmcHJpbnRmKHN0ZGVyciwiem9zIGZsdXNoOiBhZnRlciBkZWZsYXRlOiAlZCBieXRlc1xuIiwKKy8vICAgICAgICAgICAgICAgIHpzLT5uZXh0X291dC11bmRlcmx5aW5nLT5nZXRwdHIoKSk7CisKKyAgICAgIHVuZGVybHlpbmctPnNldHB0cih6cy0+bmV4dF9vdXQpOworICAgIH0gd2hpbGUgKHpzLT5hdmFpbF9vdXQgPT0gMCk7CisgIH0KKworICBvZmZzZXQgKz0gcHRyIC0gc3RhcnQ7CisgIHB0ciA9IHN0YXJ0OworfQorCitpbnQgWmxpYk91dFN0cmVhbTo6b3ZlcnJ1bihpbnQgaXRlbVNpemUsIGludCBuSXRlbXMpCit7CisvLyAgICBmcHJpbnRmKHN0ZGVyciwiWmxpYk91dFN0cmVhbSBvdmVycnVuXG4iKTsKKworICBpZiAoaXRlbVNpemUgPiBidWZTaXplKQorICAgIHRocm93IEV4Y2VwdGlvbigiWmxpYk91dFN0cmVhbSBvdmVycnVuOiBtYXggaXRlbVNpemUgZXhjZWVkZWQiKTsKKworICB3aGlsZSAoZW5kIC0gcHRyIDwgaXRlbVNpemUpIHsKKyAgICB6cy0+bmV4dF9pbiA9IHN0YXJ0OworICAgIHpzLT5hdmFpbF9pbiA9IHB0ciAtIHN0YXJ0OworCisgICAgZG8geworICAgICAgdW5kZXJseWluZy0+Y2hlY2soMSk7CisgICAgICB6cy0+bmV4dF9vdXQgPSB1bmRlcmx5aW5nLT5nZXRwdHIoKTsKKyAgICAgIHpzLT5hdmFpbF9vdXQgPSB1bmRlcmx5aW5nLT5nZXRlbmQoKSAtIHVuZGVybHlpbmctPmdldHB0cigpOworCisvLyAgICAgICAgZnByaW50ZihzdGRlcnIsInpvcyBvdmVycnVuOiBjYWxsaW5nIGRlZmxhdGUsIGF2YWlsX2luICVkLCBhdmFpbF9vdXQgJWRcbiIsCisvLyAgICAgICAgICAgICAgICB6cy0+YXZhaWxfaW4senMtPmF2YWlsX291dCk7CisKKyAgICAgIGNoZWNrQ29tcHJlc3Npb25MZXZlbCgpOworICAgICAgaW50IHJjID0gZGVmbGF0ZSh6cywgMCk7CisgICAgICBpZiAocmMgIT0gWl9PSykgdGhyb3cgRXhjZXB0aW9uKCJabGliT3V0U3RyZWFtOiBkZWZsYXRlIGZhaWxlZCIpOworCisvLyAgICAgICAgZnByaW50ZihzdGRlcnIsInpvcyBvdmVycnVuOiBhZnRlciBkZWZsYXRlOiAlZCBieXRlc1xuIiwKKy8vICAgICAgICAgICAgICAgIHpzLT5uZXh0X291dC11bmRlcmx5aW5nLT5nZXRwdHIoKSk7CisKKyAgICAgIHVuZGVybHlpbmctPnNldHB0cih6cy0+bmV4dF9vdXQpOworICAgIH0gd2hpbGUgKHpzLT5hdmFpbF9vdXQgPT0gMCk7CisKKyAgICAvLyBvdXRwdXQgYnVmZmVyIG5vdCBmdWxsCisKKyAgICBpZiAoenMtPmF2YWlsX2luID09IDApIHsKKyAgICAgIG9mZnNldCArPSBwdHIgLSBzdGFydDsKKyAgICAgIHB0ciA9IHN0YXJ0OworICAgIH0gZWxzZSB7CisgICAgICAvLyBidXQgZGlkbid0IGNvbnN1bWUgYWxsIHRoZSBkYXRhPyAgdHJ5IHNoaWZ0aW5nIHdoYXQncyBsZWZ0IHRvIHRoZQorICAgICAgLy8gc3RhcnQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgIGZwcmludGYoc3RkZXJyLCJ6IG91dCBidWYgbm90IGZ1bGwsIGJ1dCBpbiBkYXRhIG5vdCBjb25zdW1lZFxuIik7CisgICAgICBtZW1tb3ZlKHN0YXJ0LCB6cy0+bmV4dF9pbiwgcHRyIC0genMtPm5leHRfaW4pOworICAgICAgb2Zmc2V0ICs9IHpzLT5uZXh0X2luIC0gc3RhcnQ7CisgICAgICBwdHIgLT0genMtPm5leHRfaW4gLSBzdGFydDsKKyAgICB9CisgIH0KKworICBpZiAoaXRlbVNpemUgKiBuSXRlbXMgPiBlbmQgLSBwdHIpCisgICAgbkl0ZW1zID0gKGVuZCAtIHB0cikgLyBpdGVtU2l6ZTsKKworICByZXR1cm4gbkl0ZW1zOworfQorCit2b2lkIFpsaWJPdXRTdHJlYW06OmNoZWNrQ29tcHJlc3Npb25MZXZlbCgpCit7CisgIGlmIChuZXdMZXZlbCAhPSBjb21wcmVzc2lvbkxldmVsKSB7CisgICAgaWYgKGRlZmxhdGVQYXJhbXMgKHpzLCBuZXdMZXZlbCwgWl9ERUZBVUxUX1NUUkFURUdZKSAhPSBaX09LKSB7CisgICAgICB0aHJvdyBFeGNlcHRpb24oIlpsaWJPdXRTdHJlYW06IGRlZmxhdGVQYXJhbXMgZmFpbGVkIik7CisgICAgfQorICAgIGNvbXByZXNzaW9uTGV2ZWwgPSBuZXdMZXZlbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9abGliT3V0U3RyZWFtLmggYi9jb21tb24vcmRyL1psaWJPdXRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI3ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3Jkci9abGliT3V0U3RyZWFtLmgKQEAgLTAsMCArMSw2MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLworLy8gWmxpYk91dFN0cmVhbSBzdHJlYW1zIHRvIGEgY29tcHJlc3NlZCBkYXRhIHN0cmVhbSAodW5kZXJseWluZyksIGNvbXByZXNzaW5nCisvLyB3aXRoIHpsaWIgb24gdGhlIGZseS4KKy8vCisKKyNpZm5kZWYgX19SRFJfWkxJQk9VVFNUUkVBTV9IX18KKyNkZWZpbmUgX19SRFJfWkxJQk9VVFNUUkVBTV9IX18KKworI2luY2x1ZGUgPHJkci9PdXRTdHJlYW0uaD4KKworc3RydWN0IHpfc3RyZWFtX3M7CisKK25hbWVzcGFjZSByZHIgeworCisgIGNsYXNzIFpsaWJPdXRTdHJlYW0gOiBwdWJsaWMgT3V0U3RyZWFtIHsKKworICBwdWJsaWM6CisKKyAgICBabGliT3V0U3RyZWFtKE91dFN0cmVhbSogb3M9MCwgaW50IGJ1ZlNpemU9MCwgaW50IGNvbXByZXNzaW9uTGV2ZWw9LTEpOworICAgIHZpcnR1YWwgflpsaWJPdXRTdHJlYW0oKTsKKworICAgIHZvaWQgc2V0VW5kZXJseWluZyhPdXRTdHJlYW0qIG9zKTsKKyAgICB2b2lkIHNldENvbXByZXNzaW9uTGV2ZWwoaW50IGxldmVsPS0xKTsKKyAgICB2b2lkIGZsdXNoKCk7CisgICAgaW50IGxlbmd0aCgpOworCisgIHByaXZhdGU6CisKKyAgICBpbnQgb3ZlcnJ1bihpbnQgaXRlbVNpemUsIGludCBuSXRlbXMpOworICAgIHZvaWQgY2hlY2tDb21wcmVzc2lvbkxldmVsKCk7CisKKyAgICBPdXRTdHJlYW0qIHVuZGVybHlpbmc7CisgICAgaW50IGNvbXByZXNzaW9uTGV2ZWw7CisgICAgaW50IG5ld0xldmVsOworICAgIGludCBidWZTaXplOworICAgIGludCBvZmZzZXQ7CisgICAgel9zdHJlYW1fcyogenM7CisgICAgVTgqIHN0YXJ0OworICB9OworCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgcmRyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9tc3Zjd2FybmluZy5oIGIvY29tbW9uL3Jkci9tc3Zjd2FybmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYThkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmRyL21zdmN3YXJuaW5nLmgKQEAgLTAsMCArMSwyNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLyBUcmltIG91dCBleHRyYW5lb3VzIGNydWZ0IGZyb20gd2luZG93cy5oIGluY2x1ZGVzCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKworLy8gRm9yY2UgYWxsIFdpbmRvd3MgTlQtc3BlY2lmaWMgQVBJcyB0byBiZSB2aXNpYmxlCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweGZmZmYKKworI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDgwMCApIC8vIGZvcmNpbmcgYm9vbCAndHJ1ZScgb3IgJ2ZhbHNlJworI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDc4NiApIC8vIHRydW5jYXRpbmcgZGVidWcgaW5mb3JtYXRpb24gdG8gMjU1IGNoYXJzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Jkci9yZHIuZHNwIGIvY29tbW9uL3Jkci9yZHIuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MTdhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmRyL3Jkci5kc3AKQEAgLTAsMCArMSwyMjIgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0icmRyIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0DQorDQorQ0ZHPXJkciAtIFdpbjMyIERlYnVnIFVuaWNvZGUNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInJkci5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAicmRyLm1hayIgQ0ZHPSJyZHIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJyZHIgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSAicmRyIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJyZHIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAicmRyIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXFJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXFJlbGVhc2VccmRyIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzEgL0kgIi4uIiAvRkkicmRyL21zdmN3YXJuaW5nLmgiIC9EICJOREVCVUciIC9EICJfTElCIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAicmRyIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXERlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxEZWJ1Z1xyZHIiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi4iIC9GSSJyZHIvbXN2Y3dhcm5pbmcuaCIgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAicmRyIC0gV2luMzIgRGVidWcgVW5pY29kZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJyZHJfX19XaW4zMl9EZWJ1Z19Vbmljb2RlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInJkcl9fX1dpbjMyX0RlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXERlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXERlYnVnX1VuaWNvZGVccmRyIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uIiAvRkkibXN2Y3dhcm5pbmcuaCIgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi4iIC9GSSJyZHIvbXN2Y3dhcm5pbmcuaCIgL0QgIl9MSUIiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9VTklDT0RFIiAvRCAiVU5JQ09ERSIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvDQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJyZHIgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAicmRyIC0gV2luMzIgRGVidWciDQorIyBOYW1lICJyZHIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIg0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEV4Y2VwdGlvbi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRmRJblN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRmRPdXRTdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEZpeGVkTWVtT3V0U3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxIZXhJblN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cSGV4T3V0U3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxJblN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cTWVtSW5TdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXE1lbU91dFN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbXN2Y3dhcm5pbmcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXE91dFN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUmFuZG9tU3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxTdWJzdGl0dXRpbmdJblN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdHlwZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFpsaWJJblN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cWmxpYk91dFN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEV4Y2VwdGlvbi5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxGZEluU3RyZWFtLmN4eA0KKyMgQUREIENQUCAvSSAiLi4vemxpYiINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxGZE91dFN0cmVhbS5jeHgNCisjIEFERCBDUFAgL0kgIi4uL3psaWIiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cSGV4SW5TdHJlYW0uY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cSGV4T3V0U3RyZWFtLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEluU3RyZWFtLmN4eA0KKyMgQUREIENQUCAvSSAiLi4vemxpYiINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxSYW5kb21TdHJlYW0uY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cWmxpYkluU3RyZWFtLmN4eA0KKyMgQUREIENQUCAvSSAiLi4vemxpYiINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxabGliT3V0U3RyZWFtLmN4eA0KKyMgQUREIENQUCAvSSAiLi4vemxpYiINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZHIvdHlwZXMuaCBiL2NvbW1vbi9yZHIvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDIxYjEzCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3Jkci90eXBlcy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2lmbmRlZiBfX1JEUl9UWVBFU19IX18KKyNkZWZpbmUgX19SRFJfVFlQRVNfSF9fCisKK25hbWVzcGFjZSByZHIgeworCisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBVODsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVMTY7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50IFUzMjsKKyAgdHlwZWRlZiBzaWduZWQgY2hhciBTODsKKyAgdHlwZWRlZiBzaWduZWQgc2hvcnQgUzE2OworICB0eXBlZGVmIHNpZ25lZCBpbnQgUzMyOworCisgIGNsYXNzIFU4QXJyYXkgeworICBwdWJsaWM6CisgICAgVThBcnJheSgpIDogYnVmKDApIHt9CisgICAgVThBcnJheShVOCogYSkgOiBidWYoYSkge30gLy8gbm90ZTogYXNzdW1lcyBvd25lcnNoaXAKKyAgICBVOEFycmF5KGludCBsZW4pIDogYnVmKG5ldyBVOFtsZW5dKSB7fQorICAgIH5VOEFycmF5KCkgeyBkZWxldGUgW10gYnVmOyB9CisKKyAgICAvLyBHZXQgdGhlIGJ1ZmZlciBwb2ludGVyICYgY2xlYXIgaXQgKGkuZS4gY2FsbGVyIHRha2VzIG93bmVyc2hpcCkKKyAgICBVOCogdGFrZUJ1ZigpIHsgVTgqIHRtcCA9IGJ1ZjsgYnVmID0gMDsgcmV0dXJuIHRtcDsgfQorCisgICAgVTgqIGJ1ZjsKKyAgfTsKKworICBjbGFzcyBVMTZBcnJheSB7CisgIHB1YmxpYzoKKyAgICBVMTZBcnJheSgpIDogYnVmKDApIHt9CisgICAgVTE2QXJyYXkoVTE2KiBhKSA6IGJ1ZihhKSB7fSAvLyBub3RlOiBhc3N1bWVzIG93bmVyc2hpcAorICAgIFUxNkFycmF5KGludCBsZW4pIDogYnVmKG5ldyBVMTZbbGVuXSkge30KKyAgICB+VTE2QXJyYXkoKSB7IGRlbGV0ZSBbXSBidWY7IH0KKyAgICBVMTYqIHRha2VCdWYoKSB7IFUxNiogdG1wID0gYnVmOyBidWYgPSAwOyByZXR1cm4gdG1wOyB9CisgICAgVTE2KiBidWY7CisgIH07CisKKyAgY2xhc3MgVTMyQXJyYXkgeworICBwdWJsaWM6CisgICAgVTMyQXJyYXkoKSA6IGJ1ZigwKSB7fQorICAgIFUzMkFycmF5KFUzMiogYSkgOiBidWYoYSkge30gLy8gbm90ZTogYXNzdW1lcyBvd25lcnNoaXAKKyAgICBVMzJBcnJheShpbnQgbGVuKSA6IGJ1ZihuZXcgVTMyW2xlbl0pIHt9CisgICAgflUzMkFycmF5KCkgeyBkZWxldGUgW10gYnVmOyB9CisgICAgVTMyKiB0YWtlQnVmKCkgeyBVMzIqIHRtcCA9IGJ1ZjsgYnVmID0gMDsgcmV0dXJuIHRtcDsgfQorICAgIFUzMiogYnVmOworICB9OworCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgcmRyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9CbGFja2xpc3QuY3h4IGIvY29tbW9uL3JmYi9CbGFja2xpc3QuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTBiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0JsYWNrbGlzdC5jeHgKQEAgLTAsMCArMSw4NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2luY2x1ZGUgPHJmYi9CbGFja2xpc3QuaD4KKyNpbmNsdWRlIDxyZmIvQ29uZmlndXJhdGlvbi5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitJbnRQYXJhbWV0ZXIgQmxhY2tsaXN0Ojp0aHJlc2hvbGQoIkJsYWNrbGlzdFRocmVzaG9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG51bWJlciBvZiB1bmF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbiBhdHRlbXB0cyBhbGxvd2VkIGZyb20gYW55ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRpdmlkdWFsIGhvc3QgYmVmb3JlIHRoYXQgaG9zdCBpcyBibGFjay1saXN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSk7CitJbnRQYXJhbWV0ZXIgQmxhY2tsaXN0Ojppbml0aWFsVGltZW91dCgiQmxhY2tsaXN0VGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGluaXRpYWwgdGltZW91dCBhcHBsaWVkIHdoZW4gYSBob3N0IGlzIGZpcnN0IGJsYWNrLWxpc3RlZC4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgaG9zdCBjYW5ub3QgcmUtYXR0ZW1wdCBhIGNvbm5lY3Rpb24gdW50aWwgdGhlIHRpbWVvdXQgZXhwaXJlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTApOworCisKK0JsYWNrbGlzdDo6QmxhY2tsaXN0KCkgeworfQorCitCbGFja2xpc3Q6On5CbGFja2xpc3QoKSB7CisgIC8vIEZyZWUgdGhlIG1hcCBrZXlzCisgIEJsYWNrbGlzdE1hcDo6aXRlcmF0b3IgaTsKKyAgZm9yIChpPWJsbS5iZWdpbigpOyBpIT1ibG0uZW5kKCk7IGkrKykgeworICAgIHN0ckZyZWUoKGNoYXIqKSgqaSkuZmlyc3QpOworICB9Cit9CisKK2Jvb2wgQmxhY2tsaXN0Ojppc0JsYWNrbWFya2VkKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgQmxhY2tsaXN0TWFwOjppdGVyYXRvciBpID0gYmxtLmZpbmQobmFtZSk7CisgIGlmIChpID09IGJsbS5lbmQoKSkgeworICAgIC8vIEVudHJ5IGlzIG5vdCBhbHJlYWR5IGJsYWNrLW1hcmtlZC4KKyAgICAvLyBDcmVhdGUgdGhlIGVudHJ5IHVubWFya2VkLCB1bmJsb2NrZWQsCisgICAgLy8gd2l0aCBzdWl0YWJsZSBkZWZhdWx0cyBzZXQuCisgICAgQmxhY2tsaXN0SW5mbyBiaTsKKyAgICBiaS5tYXJrcyA9IDE7CisgICAgYmkuYmxvY2tVbnRpbCA9IDA7CisgICAgYmkuYmxvY2tUaW1lb3V0ID0gaW5pdGlhbFRpbWVvdXQ7CisgICAgYmxtW3N0ckR1cChuYW1lKV0gPSBiaTsKKyAgICBpID0gYmxtLmZpbmQobmFtZSk7CisgIH0KKworICAvLyBFbnRyeSBleGlzdHMgLSBoYXMgaXQgcmVhY2hlZCB0aGUgdGhyZXNob2xkIHlldD8KKyAgaWYgKCgqaSkuc2Vjb25kLm1hcmtzID49IHRocmVzaG9sZCkgeworICAgIC8vIFllcyAtIGVudHJ5IGlzIGJsb2NrZWQgLSBoYXMgdGhlIHRpbWVvdXQgZXhwaXJlZD8gICAgICAgIAorICAgIHRpbWVfdCBub3cgPSB0aW1lKDApOworICAgIGlmIChub3cgPj0gKCppKS5zZWNvbmQuYmxvY2tVbnRpbCkgeworICAgICAgLy8gVGltZW91dCBoYXMgZXhwaXJlZC4gIFJlc2V0IHRpbWVvdXQgYW5kIGFsbG93CisgICAgICAvLyBhIHJlLXRyeS4KKyAgICAgICgqaSkuc2Vjb25kLmJsb2NrVW50aWwgPSBub3cgKyAoKmkpLnNlY29uZC5ibG9ja1RpbWVvdXQ7CisgICAgICAoKmkpLnNlY29uZC5ibG9ja1RpbWVvdXQgPSAoKmkpLnNlY29uZC5ibG9ja1RpbWVvdXQgKiAyOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBCbG9ja2VkIGFuZCB0aW1lb3V0IHN0aWxsIGluIGVmZmVjdCAtIHJlamVjdCEKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgdGhyZXNob2xkIHlldC4KKyAgLy8gSW5jcmVtZW50IHRoZSBibGFjay1tYXJrIGNvdW50ZXIgYnV0IGFsbG93CisgIC8vIHRoZSBlbnRyeSB0byBwYXNzLgorICAoKmkpLnNlY29uZC5tYXJrcysrOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQmxhY2tsaXN0OjpjbGVhckJsYWNrbWFyayhjb25zdCBjaGFyKiBuYW1lKSB7CisgIEJsYWNrbGlzdE1hcDo6aXRlcmF0b3IgaSA9IGJsbS5maW5kKG5hbWUpOworICBpZiAoaSAhPSBibG0uZW5kKCkpIHsKKyAgICBzdHJGcmVlKChjaGFyKikoKmkpLmZpcnN0KTsKKyAgICBibG0uZXJhc2UoaSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvQmxhY2tsaXN0LmggYi9jb21tb24vcmZiL0JsYWNrbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjM4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0JsYWNrbGlzdC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8KKy8vIEJsYWNrbGlzdC5oIC0gSGFuZGxpbmcgb2YgYmxhY2stbGlzdGVkIGVudGl0aWVzLgorLy8gSnVzdCBrZWVwcyBhIHRhYmxlIG1hcHBpbmcgc3RyaW5ncyB0byB0aW1pbmcgaW5mb3JtYXRpb24sIGluY2x1ZGluZworLy8gaG93IG1hbnkgdGltZXMgdGhlIGVudHJ5IGhhcyBiZWVuIGJsYWNrLWxpc3RlZCBhbmQgd2hlbiB0byBuZXh0CisvLyBwdXQgaXQgb24gcHJvYmF0aW9uIChlLmcuIGFsbG93IGEgY29ubmVjdGlvbiBpbiBmcm9tIHRoZSBob3N0LCBhbmQKKy8vIHJlLWJsYWNrbGlzdCBpdCBpZiB0aGF0IGZhaWxzKS4gCisvLworCisjaWZuZGVmIF9fUkZCX0JMQUNLTElTVF9IX18KKyNkZWZpbmUgX19SRkJfQkxBQ0tMSVNUX0hfXworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgLy8KKyAgLy8gLT0tIEJsYWNrbGlzdCBoYW5kbGVyCisgIC8vCisgIC8vIFBhcmFtZXRlcnMgaW5jbHVkZSBhIHRocmVzaG9sZCBhZnRlciB3aGljaCB0byBibGFja2xpc3QgdGhlIG5hbWVkCisgIC8vIGhvc3QsIGFuZCBhIHRpbWVvdXQgYWZ0ZXIgd2hpY2ggdG8gcmUtY29uc2lkZXIgdGhlbS4KKyAgLy8KKyAgLy8gVGhyZXNob2xkIG1lYW5zIHRoYXQgaXNCbGFja21hcmtlZCBjYW4gYmUgY2FsbGVkIHRoYXQgbnVtYmVyIG9mIHRpbWVzCisgIC8vIGJlZm9yZSBpdCB3aWxsIHJldHVybiB0cnVlLgorICAvLworICAvLyBUaW1lb3V0IG1lYW5zIHRoYXQgYWZ0ZXIgdGhhdCBtYW55IHNlY29uZHMsIHRoZSBuZXh0IGNhbGwgdG8gaXNCbGFja21hcmtlZAorICAvLyB3aWxsIHJldHVybiBmYWxzZS4gIEF0IHRoZSBzYW1lIHRpbWUsIHRoZSB0aW1lb3V0IGlzIGRvdWJsZWQsIHNvIHRoYXQgdGhlCisgIC8vIG5leHQgY2FsbHMgd2lsbCBmYWlsLCB1bnRpbCB0aGUgdGltZW91dCBleHBpcmVzIGFnYWluIG9yIGNsZWFyQmxhY2ttYXJrIGlzCisgIC8vIGNhbGxlZC4KKyAgLy8KKyAgLy8gV2hlbiBjbGVhckJsYWNrTWFyayBpcyBjYWxsZWQsIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGlzIGNvbXBsZXRlbHkKKyAgLy8gcmVtb3ZlZCwgY2F1c2luZyB0aGUgbmV4dCBpc0JsYWNrbWFya2VkIGNhbGwgdG8gcmV0dXJuIGZhbHNlLgorCisgIC8vIEtOT1dOIEJVRzogIENsaWVudCBjYW4ga2VlcCBtYWtpbmcgcmVqZWN0ZWQgcmVxdWVzdHMsIHRodXMgaW5jcmVhc2luZworICAvLyB0aGVpciB0aW1lb3V0LiAgSWYgY2xpZW50IGRvZXMgdGhpcyBmb3IgMzAgeWVhcnMsIHRpbWVvdXQgbWF5IHdyYXAgcm91bmQKKyAgLy8gdG8gYSB2ZXJ5IHNtYWxsIHZhbHVlIGFnYWluLgorCisgIC8vIFRISVMgQ0xBU1MgSVMgTk9UIFRIUkVBRC1TQUZFIQorCisgIGNsYXNzIEJsYWNrbGlzdCB7CisgIHB1YmxpYzoKKyAgICBCbGFja2xpc3QoKTsKKyAgICB+QmxhY2tsaXN0KCk7CisKKyAgICBib29sIGlzQmxhY2ttYXJrZWQoY29uc3QgY2hhciogbmFtZSk7CisgICAgdm9pZCBjbGVhckJsYWNrbWFyayhjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIHN0YXRpYyBJbnRQYXJhbWV0ZXIgdGhyZXNob2xkOworICAgIHN0YXRpYyBJbnRQYXJhbWV0ZXIgaW5pdGlhbFRpbWVvdXQ7CisKKyAgcHJvdGVjdGVkOgorICAgIHN0cnVjdCBsdFN0ciB7CisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdHJjbXAoczEsIHMyKSA8IDA7CisgICAgICB9OworICAgIH07CisgICAgc3RydWN0IEJsYWNrbGlzdEluZm8geworICAgICAgaW50IG1hcmtzOworICAgICAgdGltZV90IGJsb2NrVW50aWw7CisgICAgICB1bnNpZ25lZCBpbnQgYmxvY2tUaW1lb3V0OworICAgIH07CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBjaGFyKixCbGFja2xpc3RJbmZvLGx0U3RyPiBCbGFja2xpc3RNYXA7CisgICAgQmxhY2tsaXN0TWFwIGJsbTsKKyAgfTsKKworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9DQ29ubmVjdGlvbi5jeHggYi9jb21tb24vcmZiL0NDb25uZWN0aW9uLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjc3OGYwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9DQ29ubmVjdGlvbi5jeHgKQEAgLTAsMCArMSwyNzYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvQ01zZ1JlYWRlclYzLmg+CisjaW5jbHVkZSA8cmZiL0NNc2dXcml0ZXJWMy5oPgorI2luY2x1ZGUgPHJmYi9DU2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxyZmIvc2VjVHlwZXMuaD4KKyNpbmNsdWRlIDxyZmIvQ0Nvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxyZmIvdXRpbC5oPgorCisjaW5jbHVkZSA8cmZiL0xvZ1dyaXRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitzdGF0aWMgTG9nV3JpdGVyIHZsb2coIkNDb25uZWN0aW9uIik7CisKK0NDb25uZWN0aW9uOjpDQ29ubmVjdGlvbigpCisgIDogaXMoMCksIG9zKDApLCByZWFkZXJfKDApLCB3cml0ZXJfKDApLAorICAgIHNoYXJlZChmYWxzZSksIHNlY3VyaXR5KDApLCBuU2VjVHlwZXMoMCksIGNsaWVudFNlY1R5cGVPcmRlcihmYWxzZSksCisgICAgc3RhdGVfKFJGQlNUQVRFX1VOSU5JVElBTElTRUQpLCB1c2VQcm90b2NvbDNfMyhmYWxzZSkKK3sKK30KKworQ0Nvbm5lY3Rpb246On5DQ29ubmVjdGlvbigpCit7CisgIGlmIChzZWN1cml0eSkgc2VjdXJpdHktPmRlc3Ryb3koKTsKKyAgZGVsZXRlUmVhZGVyQW5kV3JpdGVyKCk7Cit9CisKK3ZvaWQgQ0Nvbm5lY3Rpb246OmRlbGV0ZVJlYWRlckFuZFdyaXRlcigpCit7CisgIGRlbGV0ZSByZWFkZXJfOworICByZWFkZXJfID0gMDsKKyAgZGVsZXRlIHdyaXRlcl87CisgIHdyaXRlcl8gPSAwOworfQorCit2b2lkIENDb25uZWN0aW9uOjpzZXRTdHJlYW1zKHJkcjo6SW5TdHJlYW0qIGlzXywgcmRyOjpPdXRTdHJlYW0qIG9zXykKK3sKKyAgaXMgPSBpc187CisgIG9zID0gb3NfOworfQorCit2b2lkIENDb25uZWN0aW9uOjphZGRTZWNUeXBlKHJkcjo6VTggc2VjVHlwZSkKK3sKKyAgaWYgKG5TZWNUeXBlcyA9PSBtYXhTZWNUeXBlcykKKyAgICB0aHJvdyBFeGNlcHRpb24oInRvbyBtYW55IHNlY3VyaXR5IHR5cGVzIik7CisgIHNlY1R5cGVzW25TZWNUeXBlcysrXSA9IHNlY1R5cGU7Cit9CisKK3ZvaWQgQ0Nvbm5lY3Rpb246OnNldENsaWVudFNlY1R5cGVPcmRlcihib29sIGNsaWVudE9yZGVyKSB7CisgIGNsaWVudFNlY1R5cGVPcmRlciA9IGNsaWVudE9yZGVyOworfQorCit2b2lkIENDb25uZWN0aW9uOjppbml0aWFsaXNlUHJvdG9jb2woKQoreworICBzdGF0ZV8gPSBSRkJTVEFURV9QUk9UT0NPTF9WRVJTSU9OOworfQorCit2b2lkIENDb25uZWN0aW9uOjpwcm9jZXNzTXNnKCkKK3sKKyAgc3dpdGNoIChzdGF0ZV8pIHsKKworICBjYXNlIFJGQlNUQVRFX1BST1RPQ09MX1ZFUlNJT046IHByb2Nlc3NWZXJzaW9uTXNnKCk7ICAgICAgIGJyZWFrOworICBjYXNlIFJGQlNUQVRFX1NFQ1VSSVRZX1RZUEVTOiAgIHByb2Nlc3NTZWN1cml0eVR5cGVzTXNnKCk7IGJyZWFrOworICBjYXNlIFJGQlNUQVRFX1NFQ1VSSVRZOiAgICAgICAgIHByb2Nlc3NTZWN1cml0eU1zZygpOyAgICAgIGJyZWFrOworICBjYXNlIFJGQlNUQVRFX1NFQ1VSSVRZX1JFU1VMVDogIHByb2Nlc3NTZWN1cml0eVJlc3VsdE1zZygpOyBicmVhazsKKyAgY2FzZSBSRkJTVEFURV9JTklUSUFMSVNBVElPTjogICBwcm9jZXNzSW5pdE1zZygpOyAgICAgICAgICBicmVhazsKKyAgY2FzZSBSRkJTVEFURV9OT1JNQUw6ICAgICAgICAgICByZWFkZXJfLT5yZWFkTXNnKCk7ICAgICAgICBicmVhazsKKyAgY2FzZSBSRkJTVEFURV9VTklOSVRJQUxJU0VEOgorICAgIHRocm93IEV4Y2VwdGlvbigiQ0Nvbm5lY3Rpb246OnByb2Nlc3NNc2c6IG5vdCBpbml0aWFsaXNlZCB5ZXQ/Iik7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgRXhjZXB0aW9uKCJDQ29ubmVjdGlvbjo6cHJvY2Vzc01zZzogaW52YWxpZCBzdGF0ZSIpOworICB9Cit9CisKK3ZvaWQgQ0Nvbm5lY3Rpb246OnByb2Nlc3NWZXJzaW9uTXNnKCkKK3sKKyAgdmxvZy5kZWJ1ZygicmVhZGluZyBwcm90b2NvbCB2ZXJzaW9uIik7CisgIGJvb2wgZG9uZTsKKyAgaWYgKCFjcC5yZWFkVmVyc2lvbihpcywgJmRvbmUpKSB7CisgICAgc3RhdGVfID0gUkZCU1RBVEVfSU5WQUxJRDsKKyAgICB0aHJvdyBFeGNlcHRpb24oInJlYWRpbmcgdmVyc2lvbiBmYWlsZWQ6IG5vdCBhbiBSRkIgc2VydmVyPyIpOworICB9CisgIGlmICghZG9uZSkgcmV0dXJuOworCisgIHZsb2cuaW5mbygiU2VydmVyIHN1cHBvcnRzIFJGQiBwcm90b2NvbCB2ZXJzaW9uICVkLiVkIiwKKyAgICAgICAgICAgIGNwLm1ham9yVmVyc2lvbiwgY3AubWlub3JWZXJzaW9uKTsKKworICAvLyBUaGUgb25seSBvZmZpY2lhbCBSRkIgcHJvdG9jb2wgdmVyc2lvbnMgYXJlIGN1cnJlbnRseSAzLjMsIDMuNyBhbmQgMy44CisgIGlmIChjcC5iZWZvcmVWZXJzaW9uKDMsMykpIHsKKyAgICBjaGFyIG1zZ1syNTZdOworICAgIHNwcmludGYobXNnLCJTZXJ2ZXIgZ2F2ZSB1bnN1cHBvcnRlZCBSRkIgcHJvdG9jb2wgdmVyc2lvbiAlZC4lZCIsCisgICAgICAgICAgICBjcC5tYWpvclZlcnNpb24sIGNwLm1pbm9yVmVyc2lvbik7CisgICAgdmxvZy5lcnJvcihtc2cpOworICAgIHN0YXRlXyA9IFJGQlNUQVRFX0lOVkFMSUQ7CisgICAgdGhyb3cgRXhjZXB0aW9uKG1zZyk7CisgIH0gZWxzZSBpZiAodXNlUHJvdG9jb2wzXzMgfHwgY3AuYmVmb3JlVmVyc2lvbigzLDcpKSB7CisgICAgY3Auc2V0VmVyc2lvbigzLDMpOworICB9IGVsc2UgaWYgKGNwLmFmdGVyVmVyc2lvbigzLDgpKSB7CisgICAgY3Auc2V0VmVyc2lvbigzLDgpOworICB9CisKKyAgY3Aud3JpdGVWZXJzaW9uKG9zKTsKKyAgc3RhdGVfID0gUkZCU1RBVEVfU0VDVVJJVFlfVFlQRVM7CisKKyAgdmxvZy5pbmZvKCJVc2luZyBSRkIgcHJvdG9jb2wgdmVyc2lvbiAlZC4lZCIsCisgICAgICAgICAgICBjcC5tYWpvclZlcnNpb24sIGNwLm1pbm9yVmVyc2lvbik7Cit9CisKKwordm9pZCBDQ29ubmVjdGlvbjo6cHJvY2Vzc1NlY3VyaXR5VHlwZXNNc2coKQoreworICB2bG9nLmRlYnVnKCJwcm9jZXNzaW5nIHNlY3VyaXR5IHR5cGVzIG1lc3NhZ2UiKTsKKworICBpbnQgc2VjVHlwZSA9IHNlY1R5cGVJbnZhbGlkOworCisgIGlmIChjcC5pc1ZlcnNpb24oMywzKSkgeworCisgICAgLy8gbGVnYWN5IDMuMyBzZXJ2ZXIgbWF5IG9ubHkgb2ZmZXIgInZuYyBhdXRoZW50aWNhdGlvbiIgb3IgIm5vbmUiCisKKyAgICBzZWNUeXBlID0gaXMtPnJlYWRVMzIoKTsKKyAgICBpZiAoc2VjVHlwZSA9PSBzZWNUeXBlSW52YWxpZCkgeworICAgICAgdGhyb3dDb25uRmFpbGVkRXhjZXB0aW9uKCk7CisKKyAgICB9IGVsc2UgaWYgKHNlY1R5cGUgPT0gc2VjVHlwZU5vbmUgfHwgc2VjVHlwZSA9PSBzZWNUeXBlVm5jQXV0aCkgeworICAgICAgaW50IGo7CisgICAgICBmb3IgKGogPSAwOyBqIDwgblNlY1R5cGVzOyBqKyspCisgICAgICAgIGlmIChzZWNUeXBlc1tqXSA9PSBzZWNUeXBlKSBicmVhazsKKyAgICAgIGlmIChqID09IG5TZWNUeXBlcykKKyAgICAgICAgc2VjVHlwZSA9IHNlY1R5cGVJbnZhbGlkOworICAgIH0gZWxzZSB7CisgICAgICB2bG9nLmVycm9yKCJVbmtub3duIDMuMyBzZWN1cml0eSB0eXBlICVkIiwgc2VjVHlwZSk7CisgICAgICB0aHJvdyBFeGNlcHRpb24oIlVua25vd24gMy4zIHNlY3VyaXR5IHR5cGUiKTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKworICAgIC8vID49My43IHNlcnZlciB3aWxsIG9mZmVyIHVzIGEgbGlzdAorCisgICAgaW50IG5TZXJ2ZXJTZWNUeXBlcyA9IGlzLT5yZWFkVTgoKTsKKyAgICBpZiAoblNlcnZlclNlY1R5cGVzID09IDApCisgICAgICB0aHJvd0Nvbm5GYWlsZWRFeGNlcHRpb24oKTsKKworICAgIGludCBzZWNUeXBlUG9zID0gblNlY1R5cGVzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblNlcnZlclNlY1R5cGVzOyBpKyspIHsKKyAgICAgIHJkcjo6VTggc2VydmVyU2VjVHlwZSA9IGlzLT5yZWFkVTgoKTsKKyAgICAgIHZsb2cuZGVidWcoIlNlcnZlciBvZmZlcnMgc2VjdXJpdHkgdHlwZSAlcyglZCkiLAorICAgICAgICAgICAgICAgICBzZWNUeXBlTmFtZShzZXJ2ZXJTZWNUeXBlKSxzZXJ2ZXJTZWNUeXBlKTsKKworICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGNob3NlbiBhIHNlY1R5cGUsIHRyeSB0aGlzIG9uZQorICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBjbGllbnQncyBwcmVmZXJlbmNlIGZvciB0eXBlcywKKyAgICAgIC8vIHdlIGtlZXAgdHJ5aW5nIHR5cGVzLCB0byBmaW5kIHRoZSBvbmUgdGhhdCBtYXRjaGVzIGFuZAorICAgICAgLy8gd2hpY2ggYXBwZWFycyBmaXJzdCBpbiB0aGUgY2xpZW50J3MgbGlzdCBvZiBzdXBwb3J0ZWQgdHlwZXMuCisgICAgICBpZiAoc2VjVHlwZSA9PSBzZWNUeXBlSW52YWxpZCB8fCBjbGllbnRTZWNUeXBlT3JkZXIpIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuU2VjVHlwZXM7IGorKykgeworICAgICAgICAgIGlmIChzZWNUeXBlc1tqXSA9PSBzZXJ2ZXJTZWNUeXBlICYmIGogPCBzZWNUeXBlUG9zKSB7CisgICAgICAgICAgICBzZWNUeXBlID0gc2VjVHlwZXNbal07CisgICAgICAgICAgICBzZWNUeXBlUG9zID0gajsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBOQjogQ29udGludWUgcmVhZGluZyB0aGUgcmVtYWluaW5nIHNlcnZlciBzZWNUeXBlcywgYnV0IGlnbm9yZSB0aGVtCisgICAgICB9CisgICAgfQorCisgICAgLy8gSW5mb3JtIHRoZSBzZXJ2ZXIgb2Ygb3VyIGRlY2lzaW9uCisgICAgaWYgKHNlY1R5cGUgIT0gc2VjVHlwZUludmFsaWQpIHsKKyAgICAgIG9zLT53cml0ZVU4KHNlY1R5cGUpOworICAgICAgb3MtPmZsdXNoKCk7CisgICAgICB2bG9nLmRlYnVnKCJDaG9vc2luZyBzZWN1cml0eSB0eXBlICVzKCVkKSIsc2VjVHlwZU5hbWUoc2VjVHlwZSksc2VjVHlwZSk7CisgICAgfQorICB9CisKKyAgaWYgKHNlY1R5cGUgPT0gc2VjVHlwZUludmFsaWQpIHsKKyAgICBzdGF0ZV8gPSBSRkJTVEFURV9JTlZBTElEOworICAgIHZsb2cuZXJyb3IoIk5vIG1hdGNoaW5nIHNlY3VyaXR5IHR5cGVzIik7CisgICAgdGhyb3cgRXhjZXB0aW9uKCJObyBtYXRjaGluZyBzZWN1cml0eSB0eXBlcyIpOworICB9CisKKyAgc3RhdGVfID0gUkZCU1RBVEVfU0VDVVJJVFk7CisgIHNlY3VyaXR5ID0gZ2V0Q1NlY3VyaXR5KHNlY1R5cGUpOworICBwcm9jZXNzU2VjdXJpdHlNc2coKTsKK30KKwordm9pZCBDQ29ubmVjdGlvbjo6cHJvY2Vzc1NlY3VyaXR5TXNnKCkKK3sKKyAgdmxvZy5kZWJ1ZygicHJvY2Vzc2luZyBzZWN1cml0eSBtZXNzYWdlIik7CisgIGlmIChzZWN1cml0eS0+cHJvY2Vzc01zZyh0aGlzKSkgeworICAgIHN0YXRlXyA9IFJGQlNUQVRFX1NFQ1VSSVRZX1JFU1VMVDsKKyAgICBwcm9jZXNzU2VjdXJpdHlSZXN1bHRNc2coKTsKKyAgfQorfQorCit2b2lkIENDb25uZWN0aW9uOjpwcm9jZXNzU2VjdXJpdHlSZXN1bHRNc2coKQoreworICB2bG9nLmRlYnVnKCJwcm9jZXNzaW5nIHNlY3VyaXR5IHJlc3VsdCBtZXNzYWdlIik7CisgIGludCByZXN1bHQ7CisgIGlmIChjcC5iZWZvcmVWZXJzaW9uKDMsOCkgJiYgc2VjdXJpdHktPmdldFR5cGUoKSA9PSBzZWNUeXBlTm9uZSkgeworICAgIHJlc3VsdCA9IHNlY1Jlc3VsdE9LOworICB9IGVsc2UgeworICAgIGlmICghaXMtPmNoZWNrTm9XYWl0KDEpKSByZXR1cm47CisgICAgcmVzdWx0ID0gaXMtPnJlYWRVMzIoKTsKKyAgfQorICBzd2l0Y2ggKHJlc3VsdCkgeworICBjYXNlIHNlY1Jlc3VsdE9LOgorICAgIHNlY3VyaXR5Q29tcGxldGVkKCk7CisgICAgcmV0dXJuOworICBjYXNlIHNlY1Jlc3VsdEZhaWxlZDoKKyAgICB2bG9nLmRlYnVnKCJhdXRoIGZhaWxlZCIpOworICAgIGJyZWFrOworICBjYXNlIHNlY1Jlc3VsdFRvb01hbnk6CisgICAgdmxvZy5kZWJ1ZygiYXV0aCBmYWlsZWQgLSB0b28gbWFueSB0cmllcyIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHRocm93IEV4Y2VwdGlvbigiVW5rbm93biBzZWN1cml0eSByZXN1bHQgZnJvbSBzZXJ2ZXIiKTsKKyAgfQorICBDaGFyQXJyYXkgcmVhc29uOworICBpZiAoY3AuYmVmb3JlVmVyc2lvbigzLDgpKQorICAgIHJlYXNvbi5idWYgPSBzdHJEdXAoIkF1dGhlbnRpY2F0aW9uIGZhaWx1cmUiKTsKKyAgZWxzZQorICAgIHJlYXNvbi5idWYgPSBpcy0+cmVhZFN0cmluZygpOworICBzdGF0ZV8gPSBSRkJTVEFURV9JTlZBTElEOworICB0aHJvdyBBdXRoRmFpbHVyZUV4Y2VwdGlvbihyZWFzb24uYnVmKTsKK30KKwordm9pZCBDQ29ubmVjdGlvbjo6cHJvY2Vzc0luaXRNc2coKQoreworICB2bG9nLmRlYnVnKCJyZWFkaW5nIHNlcnZlciBpbml0aWFsaXNhdGlvbiIpOworICByZWFkZXJfLT5yZWFkU2VydmVySW5pdCgpOworfQorCit2b2lkIENDb25uZWN0aW9uOjp0aHJvd0Nvbm5GYWlsZWRFeGNlcHRpb24oKQoreworICBzdGF0ZV8gPSBSRkJTVEFURV9JTlZBTElEOworICBDaGFyQXJyYXkgcmVhc29uOworICByZWFzb24uYnVmID0gaXMtPnJlYWRTdHJpbmcoKTsKKyAgdGhyb3cgQ29ubkZhaWxlZEV4Y2VwdGlvbihyZWFzb24uYnVmKTsKK30KKwordm9pZCBDQ29ubmVjdGlvbjo6c2VjdXJpdHlDb21wbGV0ZWQoKQoreworICBzdGF0ZV8gPSBSRkJTVEFURV9JTklUSUFMSVNBVElPTjsKKyAgcmVhZGVyXyA9IG5ldyBDTXNnUmVhZGVyVjModGhpcywgaXMpOworICB3cml0ZXJfID0gbmV3IENNc2dXcml0ZXJWMygmY3AsIG9zKTsKKyAgdmxvZy5kZWJ1ZygiQXV0aGVudGljYXRpb24gc3VjY2VzcyEiKTsKKyAgYXV0aFN1Y2Nlc3MoKTsKKyAgd3JpdGVyXy0+d3JpdGVDbGllbnRJbml0KHNoYXJlZCk7Cit9CisKK3ZvaWQgQ0Nvbm5lY3Rpb246OmF1dGhTdWNjZXNzKCkKK3sKK30KKwordm9pZCBDQ29ubmVjdGlvbjo6c2VydmVySW5pdCgpCit7CisgIHN0YXRlXyA9IFJGQlNUQVRFX05PUk1BTDsKKyAgdmxvZy5kZWJ1ZygiaW5pdGlhbGlzYXRpb24gZG9uZSIpOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9DQ29ubmVjdGlvbi5oIGIvY29tbW9uL3JmYi9DQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTEwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NDb25uZWN0aW9uLmgKQEAgLTAsMCArMSwxODMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBDQ29ubmVjdGlvbiAtIGNsYXNzIG9uIHRoZSBjbGllbnQgc2lkZSByZXByZXNlbnRpbmcgYSBjb25uZWN0aW9uIHRvIGEKKy8vIHNlcnZlci4gIEEgZGVyaXZlZCBjbGFzcyBzaG91bGQgb3ZlcnJpZGUgbWV0aG9kcyBhcHByb3ByaWF0ZWx5LgorLy8KKworI2lmbmRlZiBfX1JGQl9DQ09OTkVDVElPTl9IX18KKyNkZWZpbmUgX19SRkJfQ0NPTk5FQ1RJT05fSF9fCisKKyNpbmNsdWRlIDxyZHIvSW5TdHJlYW0uaD4KKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL0NNc2dIYW5kbGVyLmg+CisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgQ01zZ1JlYWRlcjsKKyAgY2xhc3MgQ01zZ1dyaXRlcjsKKyAgY2xhc3MgQ1NlY3VyaXR5OworICBjbGFzcyBJZGVudGl0eVZlcmlmaWVyOworCisgIGNsYXNzIENDb25uZWN0aW9uIDogcHVibGljIENNc2dIYW5kbGVyIHsKKyAgcHVibGljOgorCisgICAgQ0Nvbm5lY3Rpb24oKTsKKyAgICB2aXJ0dWFsIH5DQ29ubmVjdGlvbigpOworCisgICAgLy8gTWV0aG9kcyB0byBpbml0aWFsaXNlIHRoZSBjb25uZWN0aW9uCisKKyAgICAvLyBzZXRTZXJ2ZXJOYW1lKCkgaXMgdXNlZCB0byBwcm92aWRlIGEgdW5pcXVlKGlzaCkgbmFtZSBmb3IgdGhlIHNlcnZlciB0bworICAgIC8vIHdoaWNoIHdlIGFyZSBjb25uZWN0ZWQuICBUaGlzIG1pZ2h0IGJlIHRoZSByZXN1bHQgb2YgZ2V0UGVlckVuZHBvaW50IG9uCisgICAgLy8gYSBUY3BTb2NrZXQsIGZvciBleGFtcGxlLCBvciBhIGhvc3Qgc3BlY2lmaWVkIGJ5IEROUyBuYW1lICYgcG9ydC4KKyAgICAvLyBUaGUgc2VydmVyTmFtZSBpcyB1c2VkIHdoZW4gdmVyaWZ5aW5nIHRoZSBJZGVudGl0eSBvZiBhIGhvc3QgKHNlZSBSQTIpLgorICAgIHZvaWQgc2V0U2VydmVyTmFtZShjb25zdCBjaGFyKiBuYW1lXykgeyBzZXJ2ZXJOYW1lLnJlcGxhY2VCdWYoc3RyRHVwKG5hbWVfKSk7IH0KKworICAgIC8vIHNldFN0cmVhbXMoKSBzZXRzIHRoZSBzdHJlYW1zIHRvIGJlIHVzZWQgZm9yIHRoZSBjb25uZWN0aW9uLiAgVGhlc2UgbXVzdAorICAgIC8vIGJlIHNldCBiZWZvcmUgaW5pdGlhbGlzZVByb3RvY29sKCkgYW5kIHByb2Nlc3NNc2coKSBhcmUgY2FsbGVkLiAgVGhlCisgICAgLy8gQ1NlY3VyaXR5IG9iamVjdCBtYXkgY2FsbCBzZXRTdHJlYW1zKCkgYWdhaW4gdG8gcHJvdmlkZSBhbHRlcm5hdGl2ZQorICAgIC8vIHN0cmVhbXMgb3ZlciB3aGljaCB0aGUgUkZCIHByb3RvY29sIGlzIHNlbnQgKGkuZS4gZW5jcnlwdGluZy9kZWNyeXB0aW5nCisgICAgLy8gc3RyZWFtcykuICBPd25lcnNoaXAgb2YgdGhlIHN0cmVhbXMgcmVtYWlucyB3aXRoIHRoZSBjYWxsZXIKKyAgICAvLyAoaS5lLiBTQ29ubmVjdGlvbiB3aWxsIG5vdCBkZWxldGUgdGhlbSkuCisgICAgdm9pZCBzZXRTdHJlYW1zKHJkcjo6SW5TdHJlYW0qIGlzLCByZHI6Ok91dFN0cmVhbSogb3MpOworCisgICAgLy8gYWRkU2VjVHlwZSgpIHNob3VsZCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBzZWN1cml0eSB0eXBlIHdoaWNoIHRoZQorICAgIC8vIGNsaWVudCBzdXBwb3J0cy4gIFRoZSBvcmRlciBpbiB3aGljaCB0aGV5J3JlIGFkZGVkIGlzIHN1Y2ggdGhhdCB0aGUKKyAgICAvLyBmaXJzdCBvbmUgaXMgbW9zdCBwcmVmZXJyZWQuCisgICAgdm9pZCBhZGRTZWNUeXBlKHJkcjo6VTggc2VjVHlwZSk7CisKKyAgICAvLyBzZXRDbGllbnRTZWNUeXBlT3JkZXIoKSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNsaWVudCBzaG91bGQgb2JleQorICAgIC8vIHRoZSBzZXJ2ZXIncyBzZWN1cml0eSB0eXBlIHByZWZlcmVuY2UsIGJ5IHBpY2tpbmcgdGhlIGZpcnN0IHNlcnZlciBzZWN1cml0eQorICAgIC8vIHR5cGUgdGhhdCB0aGUgY2xpZW50IHN1cHBvcnRzLCBvciB3aGV0aGVyIGl0IHNob3VsZCBwaWNrIHRoZSBmaXJzdCB0eXBlCisgICAgLy8gdGhhdCB0aGUgc2VydmVyIHN1cHBvcnRzLCBmcm9tIHRoZSBjbGllbnQtc3VwcG9ydGVkIGxpc3Qgb2YgdHlwZXMuCisgICAgdm9pZCBzZXRDbGllbnRTZWNUeXBlT3JkZXIoYm9vbCBjbGllbnRPcmRlcik7CisKKyAgICAvLyBzZXRTaGFyZWQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNoYXJlZCBmbGFnIHdoaWNoIHdpbGwgYmUgc2VudCB0byB0aGUKKyAgICAvLyBzZXJ2ZXIgdXBvbiBpbml0aWFsaXNhdGlvbi4KKyAgICB2b2lkIHNldFNoYXJlZChib29sIHMpIHsgc2hhcmVkID0gczsgfQorCisgICAgLy8gc2V0UHJvdG9jb2wzXzMgY29uZmlndXJlcyB3aGV0aGVyIG9yIG5vdCB0aGUgQ0Nvbm5lY3Rpb24gc2hvdWxkCisgICAgLy8gb25seSBldmVyIHN1cHBvcnQgcHJvdG9jb2wgdmVyc2lvbiAzLjMKKyAgICB2b2lkIHNldFByb3RvY29sM18zKGJvb2wgcykge3VzZVByb3RvY29sM18zID0gczt9CisKKyAgICAvLyBpbml0aWFsaXNlUHJvdG9jb2woKSBzaG91bGQgYmUgY2FsbGVkIG9uY2UgdGhlIHN0cmVhbXMgYW5kIHNlY3VyaXR5CisgICAgLy8gdHlwZXMgYXJlIHNldC4gIFN1YnNlcXVlbnRseSwgcHJvY2Vzc01zZygpIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIKKyAgICAvLyB0aGVyZSBpcyBkYXRhIHRvIHJlYWQgb24gdGhlIEluU3RyZWFtLgorICAgIHZvaWQgaW5pdGlhbGlzZVByb3RvY29sKCk7CisKKyAgICAvLyBwcm9jZXNzTXNnKCkgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBlaXRoZXI6CisgICAgLy8gLSBkYXRhIGF2YWlsYWJsZSBvbiB0aGUgdW5kZXJseWluZyBuZXR3b3JrIHN0cmVhbQorICAgIC8vICAgSW4gdGhpcyBjYXNlLCBwcm9jZXNzTXNnIG1heSByZXR1cm4gd2l0aG91dCBwcm9jZXNzaW5nIGFuIFJGQiBtZXNzYWdlLAorICAgIC8vICAgaWYgdGhlIGF2YWlsYWJsZSBkYXRhIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBSRkIgbWVzc2FnZSBiZWluZyByZWFkeQorICAgIC8vICAgdG8gaGFuZGxlLiBlLmcuIGlmIGRhdGEgaXMgZW5jcnlwdGVkLgorICAgIC8vIE5COiBUaGlzIG1ha2VzIGl0IHNhZmUgdG8gY2FsbCBwcm9jZXNzTXNnKCkgaW4gcmVzcG9uc2UgdG8gc2VsZWN0KCkKKyAgICAvLyAtIGRhdGEgYXZhaWxhYmxlIG9uIHRoZSBDQ29ubmVjdGlvbidzIGN1cnJlbnQgSW5TdHJlYW0KKyAgICAvLyAgIEluIHRoaXMgY2FzZSwgcHJvY2Vzc01zZyBzaG91bGQgYWx3YXlzIHByb2Nlc3MgdGhlIGF2YWlsYWJsZSBSRkIKKyAgICAvLyAgIG1lc3NhZ2UgYmVmb3JlIHJldHVybmluZy4KKyAgICAvLyBOQjogSW4gZWl0aGVyIGNhc2UsIHlvdSBtdXN0IGhhdmUgY2FsbGVkIGluaXRpYWxpc2VQcm90b2NvbCgpIGZpcnN0LgorICAgIHZvaWQgcHJvY2Vzc01zZygpOworCisKKyAgICAvLyBNZXRob2RzIHRvIGJlIG92ZXJyaWRkZW4gaW4gYSBkZXJpdmVkIGNsYXNzCisKKyAgICAvLyBnZXRDU2VjdXJpdHkoKSBnZXRzIHRoZSBDU2VjdXJpdHkgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gdHlwZS4gIFRoZSB0eXBlCisgICAgLy8gaXMgZ3VhcmFudGVlZCB0byBiZSBvbmUgb2YgdGhlIHNlY1R5cGVzIHBhc3NlZCBpbiB0byBhZGRTZWNUeXBlKCkuICBUaGUKKyAgICAvLyBDU2VjdXJpdHkgb2JqZWN0J3MgZGVzdHJveSgpIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBieSB0aGUgQ0Nvbm5lY3Rpb24KKyAgICAvLyBmcm9tIGl0cyBkZXN0cnVjdG9yLgorICAgIHZpcnR1YWwgQ1NlY3VyaXR5KiBnZXRDU2VjdXJpdHkoaW50IHNlY1R5cGUpPTA7CisKKyAgICAvLyBnZXRDdXJyZW50Q1NlY3VyaXR5KCkgZ2V0cyB0aGUgQ1NlY3VyaXR5IGluc3RhbmNlIHVzZWQgZm9yIHRoaXMgY29ubmVjdGlvbi4KKyAgICBjb25zdCBDU2VjdXJpdHkqIGdldEN1cnJlbnRDU2VjdXJpdHkoKSBjb25zdCB7cmV0dXJuIHNlY3VyaXR5O30gCisKKyAgICAvLyBnZXRJZFZlcmlmaWVyKCkgcmV0dXJucyB0aGUgaWRlbnRpdHkgdmVyaWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25uZWN0aW9uLgorICAgIC8vIE93bmVyc2hpcCBvZiB0aGUgSWRlbnRpdHlWZXJpZmllciBpcyByZXRhaW5lZCBieSB0aGUgQ0Nvbm5lY3Rpb24gaW5zdGFuY2UuCisgICAgdmlydHVhbCBJZGVudGl0eVZlcmlmaWVyKiBnZXRJZGVudGl0eVZlcmlmaWVyKCkge3JldHVybiAwO30KKworICAgIC8vIGF1dGhTdWNjZXNzKCkgaXMgY2FsbGVkIHdoZW4gYXV0aGVudGljYXRpb24gaGFzIHN1Y2NlZWRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgYXV0aFN1Y2Nlc3MoKTsKKworICAgIC8vIHNlcnZlckluaXQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgU2VydmVySW5pdCBtZXNzYWdlIGlzIHJlY2VpdmVkLiAgVGhlCisgICAgLy8gZGVyaXZlZCBjbGFzcyBtdXN0IGNhbGwgb24gdG8gQ0Nvbm5lY3Rpb246OnNlcnZlckluaXQoKS4KKyAgICB2aXJ0dWFsIHZvaWQgc2VydmVySW5pdCgpOworCisKKyAgICAvLyBPdGhlciBtZXRob2RzCisKKyAgICAvLyBkZWxldGVSZWFkZXJBbmRXcml0ZXIoKSBkZWxldGVzIHRoZSByZWFkZXIgYW5kIHdyaXRlciBhc3NvY2lhdGVkIHdpdGgKKyAgICAvLyB0aGlzIGNvbm5lY3Rpb24uICBUaGlzIG1heSBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzdHJlYW1zCisgICAgLy8gYmVmb3JlIGRlbGV0aW5nIHRoZSBTQ29ubmVjdGlvbiB0byBtYWtlIHN1cmUgdGhhdCBubyBhdHRlbXB0IGJ5IHRoZQorICAgIC8vIFNDb25uZWN0aW9uIGlzIG1hZGUgdG8gcmVhZCBvciB3cml0ZS4KKyAgICAvLyBYWFggRG8gd2UgcmVhbGx5IG5lZWQgdGhpcyBhdCBhbGw/Pz8KKyAgICB2b2lkIGRlbGV0ZVJlYWRlckFuZFdyaXRlcigpOworCisgICAgQ01zZ1JlYWRlciogcmVhZGVyKCkgeyByZXR1cm4gcmVhZGVyXzsgfQorICAgIENNc2dXcml0ZXIqIHdyaXRlcigpIHsgcmV0dXJuIHdyaXRlcl87IH0KKworICAgIHJkcjo6SW5TdHJlYW0qIGdldEluU3RyZWFtKCkgeyByZXR1cm4gaXM7IH0KKyAgICByZHI6Ok91dFN0cmVhbSogZ2V0T3V0U3RyZWFtKCkgeyByZXR1cm4gb3M7IH0KKworICAgIC8vIEFjY2VzcyBtZXRob2QgdXNlZCBieSBTU2VjdXJpdHkgaW1wbGVtZW50YXRpb25zIHRoYXQgY2FuIHZlcmlmeSBzZXJ2ZXJzJworICAgIC8vIElkZW50aXRpZXMsIHRvIGRldGVybWluZSB0aGUgdW5pcXVlKGlzaCkgbmFtZSBvZiB0aGUgc2VydmVyLgorICAgIGNvbnN0IGNoYXIqIGdldFNlcnZlck5hbWUoKSBjb25zdCB7IHJldHVybiBzZXJ2ZXJOYW1lLmJ1ZjsgfQorCisgICAgZW51bSBzdGF0ZUVudW0geworICAgICAgUkZCU1RBVEVfVU5JTklUSUFMSVNFRCwKKyAgICAgIFJGQlNUQVRFX1BST1RPQ09MX1ZFUlNJT04sCisgICAgICBSRkJTVEFURV9TRUNVUklUWV9UWVBFUywKKyAgICAgIFJGQlNUQVRFX1NFQ1VSSVRZLAorICAgICAgUkZCU1RBVEVfU0VDVVJJVFlfUkVTVUxULAorICAgICAgUkZCU1RBVEVfSU5JVElBTElTQVRJT04sCisgICAgICBSRkJTVEFURV9OT1JNQUwsCisgICAgICBSRkJTVEFURV9JTlZBTElECisgICAgfTsKKworICAgIHN0YXRlRW51bSBzdGF0ZSgpIHsgcmV0dXJuIHN0YXRlXzsgfQorCisgIHByb3RlY3RlZDoKKyAgICB2b2lkIHNldFN0YXRlKHN0YXRlRW51bSBzKSB7IHN0YXRlXyA9IHM7IH0KKworICBwcml2YXRlOgorICAgIHZvaWQgcHJvY2Vzc1ZlcnNpb25Nc2coKTsKKyAgICB2b2lkIHByb2Nlc3NTZWN1cml0eVR5cGVzTXNnKCk7CisgICAgdm9pZCBwcm9jZXNzU2VjdXJpdHlNc2coKTsKKyAgICB2b2lkIHByb2Nlc3NTZWN1cml0eVJlc3VsdE1zZygpOworICAgIHZvaWQgcHJvY2Vzc0luaXRNc2coKTsKKyAgICB2b2lkIHRocm93QXV0aEZhaWx1cmVFeGNlcHRpb24oKTsKKyAgICB2b2lkIHRocm93Q29ubkZhaWxlZEV4Y2VwdGlvbigpOworICAgIHZvaWQgc2VjdXJpdHlDb21wbGV0ZWQoKTsKKworICAgIHJkcjo6SW5TdHJlYW0qIGlzOworICAgIHJkcjo6T3V0U3RyZWFtKiBvczsKKyAgICBDTXNnUmVhZGVyKiByZWFkZXJfOworICAgIENNc2dXcml0ZXIqIHdyaXRlcl87CisgICAgYm9vbCBkZWxldGVTdHJlYW1zV2hlbkRvbmU7CisgICAgYm9vbCBzaGFyZWQ7CisgICAgQ1NlY3VyaXR5KiBzZWN1cml0eTsKKyAgICBlbnVtIHsgbWF4U2VjVHlwZXMgPSA4IH07CisgICAgaW50IG5TZWNUeXBlczsKKyAgICByZHI6OlU4IHNlY1R5cGVzW21heFNlY1R5cGVzXTsKKyAgICBib29sIGNsaWVudFNlY1R5cGVPcmRlcjsKKyAgICBzdGF0ZUVudW0gc3RhdGVfOworCisgICAgQ2hhckFycmF5IHNlcnZlck5hbWU7CisKKyAgICBib29sIHVzZVByb3RvY29sM18zOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NGVE1zZ1JlYWRlci5jeHggYi9jb21tb24vcmZiL0NGVE1zZ1JlYWRlci5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExN2ZjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ0ZUTXNnUmVhZGVyLmN4eApAQCAtMCwwICsxLDE2MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA1IFRpZ2h0Vk5DIFRlYW0uICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBieSBEZW5uaXMgU3lyb3ZhdHNreS4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKgorICogVGlnaHRWTkMgZGlzdHJpYnV0aW9uIGhvbWVwYWdlIG9uIHRoZSBXZWI6IGh0dHA6Ly93d3cudGlnaHR2bmMuY29tLworICoKKyAqLworCisvLyAtPS0gQ0ZUTXNnUmVhZGVyLmN4eAorCisjaW5jbHVkZSA8cmZiL0NGVE1zZ1JlYWRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitDRlRNc2dSZWFkZXI6OkNGVE1zZ1JlYWRlcihyZHI6OkluU3RyZWFtICpwSVMpCit7CisgIG1fcEluU3RyZWFtID0gcElTOworfQorCitDRlRNc2dSZWFkZXI6On5DRlRNc2dSZWFkZXIoKQoreworCit9CisKK2ludCAKK0NGVE1zZ1JlYWRlcjo6cmVhZEZpbGVMaXN0RGF0YShGaWxlSW5mbyAqcEZpbGVJbmZvKQoreworICB1bnNpZ25lZCBjaGFyIGZsYWdzID0gbV9wSW5TdHJlYW0tPnJlYWRVOCgpOworICBpbnQgbnVtRmlsZXMgPSBtX3BJblN0cmVhbS0+cmVhZFUxNigpOworICBpbnQgZGF0YVNpemUgPSBtX3BJblN0cmVhbS0+cmVhZFUxNigpOworICBpbnQgY29tcHJlc3NlZFNpemUgPSBtX3BJblN0cmVhbS0+cmVhZFUxNigpOworICAKKyAgaWYgKGZsYWdzICYgMHg4MCkgeworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAobnVtRmlsZXMgPiAwKSB7CisgICAgICBjaGFyICpwRmlsZW5hbWVzID0gbmV3IGNoYXJbY29tcHJlc3NlZFNpemVdOworICAgICAgU0laRURBVEFJTkZPICpwU0RJID0gbmV3IFNJWkVEQVRBSU5GT1tudW1GaWxlc107CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZpbGVzOyBpKyspIHsKKyAgICAgICAgcFNESVtpXS5zaXplID0gbV9wSW5TdHJlYW0tPnJlYWRVMzIoKTsKKyAgICAgICAgcFNESVtpXS5kYXRhID0gbV9wSW5TdHJlYW0tPnJlYWRVMzIoKTsKKyAgICAgIH0KKyAgICAgIG1fcEluU3RyZWFtLT5yZWFkQnl0ZXMoKHZvaWQgKilwRmlsZW5hbWVzLCBjb21wcmVzc2VkU2l6ZSk7CisgICAgICBjcmVhdGVGaWxlSW5mbyhudW1GaWxlcywgcEZpbGVJbmZvLCBwU0RJLCBwRmlsZW5hbWVzKTsKKyAgICAgIGRlbGV0ZSBbXSBwU0RJOworICAgICAgZGVsZXRlIFtdIHBGaWxlbmFtZXM7CisgICAgfQorICB9CisgIHJldHVybiBudW1GaWxlczsKK30KKwordm9pZCAqIAorQ0ZUTXNnUmVhZGVyOjpyZWFkRmlsZURvd25sb2FkRGF0YSh1bnNpZ25lZCBpbnQgKnBTaXplLCB1bnNpZ25lZCBpbnQgKnBNb2RUaW1lKQoreworICB1bnNpZ25lZCBjaGFyIGNvbXByZXNzTGV2ZWwgPSBtX3BJblN0cmVhbS0+cmVhZFU4KCk7CisgIGludCByZWFsU2l6ZSA9IG1fcEluU3RyZWFtLT5yZWFkVTE2KCk7CisgIGludCBjb21wcmVzc2VkU2l6ZSA9IG1fcEluU3RyZWFtLT5yZWFkVTE2KCk7CisKKyAgaWYgKChyZWFsU2l6ZSA9PSAwKSAmJiAoY29tcHJlc3NlZFNpemUgPT0gMCkpIHsKKyAgICAqcFNpemUgPSAwOworICAgICpwTW9kVGltZSA9IG1fcEluU3RyZWFtLT5yZWFkVTMyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgY2hhciAqcEZpbGUgPSBuZXcgY2hhciBbY29tcHJlc3NlZFNpemVdOworICAgIGlmIChwRmlsZSA9PSBOVUxMKSB7CisgICAgICBtX3BJblN0cmVhbS0+c2tpcChjb21wcmVzc2VkU2l6ZSk7CisgICAgICAqcE1vZFRpbWUgPSAwOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcEluU3RyZWFtLT5yZWFkQnl0ZXMocEZpbGUsIGNvbXByZXNzZWRTaXplKTsKKyAgICAgICpwU2l6ZSA9IGNvbXByZXNzZWRTaXplOworICAgICAgcmV0dXJuIHBGaWxlOworICAgIH0KKyAgfQorfQorCitjaGFyICogCitDRlRNc2dSZWFkZXI6OnJlYWRGaWxlVXBsb2FkQ2FuY2VsKHVuc2lnbmVkIGludCAqcFJlYXNvblNpemUpCit7CisgIG1fcEluU3RyZWFtLT5za2lwKDEpOworICByZXR1cm4gcmVhZFJlYXNvbk1zZyhwUmVhc29uU2l6ZSk7Cit9CisKK2NoYXIgKiAKK0NGVE1zZ1JlYWRlcjo6cmVhZEZpbGVEb3dubG9hZEZhaWxlZCh1bnNpZ25lZCBpbnQgKnBSZWFzb25TaXplKQoreworICBtX3BJblN0cmVhbS0+c2tpcCgxKTsKKyAgcmV0dXJuIHJlYWRSZWFzb25Nc2cocFJlYXNvblNpemUpOworfQorCitpbnQgCitDRlRNc2dSZWFkZXI6OnJlYWRGaWxlRGlyU2l6ZURhdGEodW5zaWduZWQgc2hvcnQgKnBEaXJTaXplTG93MTYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwRGlyU2l6ZUhpZ2gzMikKK3sKKyAgbV9wSW5TdHJlYW0tPnNraXAoMSk7CisgICpwRGlyU2l6ZUxvdzE2ID0gbV9wSW5TdHJlYW0tPnJlYWRVMTYoKTsKKyAgKnBEaXJTaXplSGlnaDMyID0gbV9wSW5TdHJlYW0tPnJlYWRVMzIoKTsKKyAgcmV0dXJuIDE7Cit9CisKK2NoYXIgKiAKK0NGVE1zZ1JlYWRlcjo6cmVhZEZpbGVMYXN0UnFzdEZhaWxlZChpbnQgKnBUeXBlT2ZSZXF1ZXN0LCB1bnNpZ25lZCBpbnQgKnBSZWFzb25TaXplKQoreworICAqcFR5cGVPZlJlcXVlc3QgPSBtX3BJblN0cmVhbS0+cmVhZFU4KCk7CisgIHJldHVybiByZWFkUmVhc29uTXNnKHBSZWFzb25TaXplKTsKK30KKworYm9vbCAKK0NGVE1zZ1JlYWRlcjo6Y3JlYXRlRmlsZUluZm8odW5zaWduZWQgaW50IG51bUZpbGVzLCBGaWxlSW5mbyAqZmksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFREFUQUlORk8gKnBTREluZm8sIGNoYXIgKnBGaWxlbmFtZXMpCit7CisgIGludCBwb3MgPSAwOworICBpbnQgc2l6ZSA9IDA7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbnVtRmlsZXM7IGkrKykgeworICAgIHNpemUgPSBwU0RJbmZvW2ldLnNpemU7CisgICAgaWYgKHNpemUgPT0gRlRfTkVUX0FUVFJfRElSKSB7CisgICAgICBmaS0+YWRkKChwRmlsZW5hbWVzICsgcG9zKSwgc2l6ZSwgcFNESW5mb1tpXS5kYXRhLCBGVF9BVFRSX0RJUik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpLT5hZGQoKHBGaWxlbmFtZXMgKyBwb3MpLCBzaXplLCBwU0RJbmZvW2ldLmRhdGEsIEZUX0FUVFJfRklMRSk7CisgICAgfQorICAgIHBvcyArPSBzdHJsZW4ocEZpbGVuYW1lcyArIHBvcykgKyAxOworICB9CisgIHJldHVybiB0cnVlOworfQorCitjaGFyICogCitDRlRNc2dSZWFkZXI6OnJlYWRSZWFzb25Nc2codW5zaWduZWQgaW50ICpwUmVhc29uU2l6ZSkKK3sKKyAgaW50IHJlYXNvbkxlbiA9IG1fcEluU3RyZWFtLT5yZWFkVTE2KCk7CisgIGludCBfcmVhc29uTGVuID0gcmVhc29uTGVuICsgMTsKKyAgY2hhciAqcFJlYXNvbjsKKyAgaWYgKHJlYXNvbkxlbiA9PSAwKSB7CisgICAgKnBSZWFzb25TaXplID0gMDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBwUmVhc29uID0gbmV3IGNoYXIgW19yZWFzb25MZW5dOworICAgIGlmIChwUmVhc29uID09IE5VTEwpIHsKKyAgICAgIG1fcEluU3RyZWFtLT5za2lwKHJlYXNvbkxlbik7CisgICAgICAqcFJlYXNvblNpemUgPSAwOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1fcEluU3RyZWFtLT5yZWFkQnl0ZXMocFJlYXNvbiwgcmVhc29uTGVuKTsKKyAgICBtZW1zZXQoKChjaGFyICopcFJlYXNvbityZWFzb25MZW4pLCAnXDAnLCAxKTsKKyAgICByZXR1cm4gcFJlYXNvbjsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NGVE1zZ1JlYWRlci5oIGIvY29tbW9uL3JmYi9DRlRNc2dSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNlM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9DRlRNc2dSZWFkZXIuaApAQCAtMCwwICsxLDU2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGlnaHRWTkMgVGVhbS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGJ5IERlbm5pcyBTeXJvdmF0c2t5LgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqCisgKiBUaWdodFZOQyBkaXN0cmlidXRpb24gaG9tZXBhZ2Ugb24gdGhlIFdlYjogaHR0cDovL3d3dy50aWdodHZuYy5jb20vCisgKgorICovCisKKy8vIC09LSBDRlRNc2dSZWFkZXIuaAorCisjaWZuZGVmIF9fUkZCX0NGVE1TR1JFQURFUl9IX18KKyNkZWZpbmUgX19SRkJfQ0ZUTVNHUkVBREVSX0hfXworCisjaW5jbHVkZSA8cmRyL0luU3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL0ZpbGVJbmZvLmg+CisKK25hbWVzcGFjZSByZmIgeworICBjbGFzcyBDRlRNc2dSZWFkZXIKKyAgeworICBwdWJsaWM6CisgICAgQ0ZUTXNnUmVhZGVyKHJkcjo6SW5TdHJlYW0gKnBJUyk7CisgICAgfkNGVE1zZ1JlYWRlcigpOworICAgIAorICAgIGludCByZWFkRmlsZUxpc3REYXRhKEZpbGVJbmZvICpwRmlsZUluZm8pOworICAgIGludCByZWFkRmlsZURpclNpemVEYXRhKHVuc2lnbmVkIHNob3J0ICpwRGlyU2l6ZUxvdzE2LCB1bnNpZ25lZCBpbnQgKnBEaXJTaXplSGlnaDMyKTsKKyAgICAKKyAgICBjaGFyICpyZWFkRmlsZVVwbG9hZENhbmNlbCh1bnNpZ25lZCBpbnQgKnBSZWFzb25TaXplKTsKKyAgICBjaGFyICpyZWFkRmlsZURvd25sb2FkRmFpbGVkKHVuc2lnbmVkIGludCAqcFJlYXNvblNpemUpOworICAgIGNoYXIgKnJlYWRGaWxlTGFzdFJxc3RGYWlsZWQoaW50ICpwVHlwZU9mUmVxdWVzdCwgdW5zaWduZWQgaW50ICpwUmVhc29uU2l6ZSk7CisgICAgdm9pZCAqcmVhZEZpbGVEb3dubG9hZERhdGEodW5zaWduZWQgaW50ICpwU2l6ZSwgdW5zaWduZWQgaW50ICpwTW9kVGltZSk7CisgICAgCisgIHByaXZhdGU6CisgICAgcmRyOjpJblN0cmVhbSAqbV9wSW5TdHJlYW07CisgICAgCisgICAgYm9vbCBjcmVhdGVGaWxlSW5mbyh1bnNpZ25lZCBpbnQgbnVtRmlsZXMsIEZpbGVJbmZvICpmaSwgCisgICAgICAgICAgICAgICAgICAgICAgICBTSVpFREFUQUlORk8gKnBTREluZm8sIGNoYXIgKnBGaWxlbmFtZXMpOworICAgIGNoYXIgKnJlYWRSZWFzb25Nc2codW5zaWduZWQgaW50ICpwUmVhc29uU2l6ZSk7CisgIH07Cit9CisKKyNlbmRpZiAvLyBfX1JGQl9DRlRNU0dSRUFERVJfSF9fCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NGVE1zZ1dyaXRlci5jeHggYi9jb21tb24vcmZiL0NGVE1zZ1dyaXRlci5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2ODU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ0ZUTXNnV3JpdGVyLmN4eApAQCAtMCwwICsxLDE4MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA1IFRpZ2h0Vk5DIFRlYW0uICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBieSBEZW5uaXMgU3lyb3ZhdHNreS4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKgorICogVGlnaHRWTkMgZGlzdHJpYnV0aW9uIGhvbWVwYWdlIG9uIHRoZSBXZWI6IGh0dHA6Ly93d3cudGlnaHR2bmMuY29tLworICoKKyAqLworCisvLyAtPS0gQ0ZUTXNnV3JpdGVyLmN4eAorCisjaW5jbHVkZSA8cmZiL0NGVE1zZ1dyaXRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitDRlRNc2dXcml0ZXI6OkNGVE1zZ1dyaXRlcihyZHI6Ok91dFN0cmVhbSAqcE9TKQoreworICBtX3BPdXRTdHJlYW0gPSBwT1M7Cit9CisKK0NGVE1zZ1dyaXRlcjo6fkNGVE1zZ1dyaXRlcigpCit7Cit9CisKK2Jvb2wgCitDRlRNc2dXcml0ZXI6OndyaXRlRmlsZUxpc3RScXN0KHVuc2lnbmVkIHNob3J0IGRpcm5hbWVMZW4sIGNoYXIgKnBEaXJOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGlyT25seSkKK3sKKyAgaWYgKGRpcm5hbWVMZW4gPj0gRlRfRklMRU5BTUVfU0laRSkgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAwOworICBpZiAoYkRpck9ubHkpIGZsYWdzID0gMHgxMDsKKworICBtX3BPdXRTdHJlYW0tPndyaXRlVTgobXNnVHlwZUZpbGVMaXN0UmVxdWVzdCk7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVVOChmbGFncyk7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVVMTYoZGlybmFtZUxlbik7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVCeXRlcygodm9pZCAqKXBEaXJOYW1lLCBkaXJuYW1lTGVuKTsKKyAgbV9wT3V0U3RyZWFtLT5mbHVzaCgpOworCisgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgCitDRlRNc2dXcml0ZXI6OndyaXRlRmlsZURvd25sb2FkQ2FuY2VsKHVuc2lnbmVkIHNob3J0IHJlYXNvbkxlbiwgY2hhciAqcFJlYXNvbikKK3sKKyAgbV9wT3V0U3RyZWFtLT53cml0ZVU4KG1zZ1R5cGVGaWxlRG93bmxvYWRDYW5jZWwpOworICByZXR1cm4gd3JpdGVVOFUxNlN0cmluZ01zZyhyZWFzb25MZW4sIHBSZWFzb24pOworfQorCitib29sIAorQ0ZUTXNnV3JpdGVyOjp3cml0ZUZpbGVEb3dubG9hZFJxc3QodW5zaWduZWQgc2hvcnQgZmlsZW5hbWVMZW4sIGNoYXIgKnBGaWxlbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcG9zaXRpb24pCit7CisgIGlmIChmaWxlbmFtZUxlbiA+PSBGVF9GSUxFTkFNRV9TSVpFKSByZXR1cm4gZmFsc2U7CisKKyAgbV9wT3V0U3RyZWFtLT53cml0ZVU4KG1zZ1R5cGVGaWxlRG93bmxvYWRSZXF1ZXN0KTsKKyAgbV9wT3V0U3RyZWFtLT53cml0ZVU4KDApOworICBtX3BPdXRTdHJlYW0tPndyaXRlVTE2KGZpbGVuYW1lTGVuKTsKKyAgbV9wT3V0U3RyZWFtLT53cml0ZVUzMihwb3NpdGlvbik7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVCeXRlcyhwRmlsZW5hbWUsIGZpbGVuYW1lTGVuKTsKKyAgbV9wT3V0U3RyZWFtLT5mbHVzaCgpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIAorQ0ZUTXNnV3JpdGVyOjp3cml0ZUZpbGVVcGxvYWREYXRhKHVuc2lnbmVkIHNob3J0IGRhdGFTaXplLCBjaGFyICpwRGF0YSkKK3sKKyAgbV9wT3V0U3RyZWFtLT53cml0ZVU4KG1zZ1R5cGVGaWxlVXBsb2FkRGF0YSk7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVVOCgwKTsKKyAgbV9wT3V0U3RyZWFtLT53cml0ZVUxNihkYXRhU2l6ZSk7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVVMTYoZGF0YVNpemUpOworICBtX3BPdXRTdHJlYW0tPndyaXRlQnl0ZXMocERhdGEsIGRhdGFTaXplKTsKKyAgbV9wT3V0U3RyZWFtLT5mbHVzaCgpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIAorQ0ZUTXNnV3JpdGVyOjp3cml0ZUZpbGVVcGxvYWREYXRhKHVuc2lnbmVkIGludCBtb2RUaW1lKQoreworICBtX3BPdXRTdHJlYW0tPndyaXRlVTgobXNnVHlwZUZpbGVVcGxvYWREYXRhKTsKKyAgbV9wT3V0U3RyZWFtLT53cml0ZVU4KDApOworICBtX3BPdXRTdHJlYW0tPndyaXRlVTE2KDApOworICBtX3BPdXRTdHJlYW0tPndyaXRlVTE2KDApOworICBtX3BPdXRTdHJlYW0tPndyaXRlVTMyKG1vZFRpbWUpOworICBtX3BPdXRTdHJlYW0tPmZsdXNoKCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgCitDRlRNc2dXcml0ZXI6OndyaXRlRmlsZVVwbG9hZEZhaWxlZCh1bnNpZ25lZCBzaG9ydCByZWFzb25MZW4sIGNoYXIgKnBSZWFzb24pCit7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVVOChtc2dUeXBlRmlsZVVwbG9hZEZhaWxlZCk7CisgIHJldHVybiB3cml0ZVU4VTE2U3RyaW5nTXNnKHJlYXNvbkxlbiwgcFJlYXNvbik7Cit9CisKK2Jvb2wgCitDRlRNc2dXcml0ZXI6OndyaXRlRmlsZVVwbG9hZFJxc3QodW5zaWduZWQgc2hvcnQgZmlsZW5hbWVMZW4sIGNoYXIgKnBGaWxlbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBvc2l0aW9uKQoreworICBpZiAoZmlsZW5hbWVMZW4gPj0gRlRfRklMRU5BTUVfU0laRSkgcmV0dXJuIGZhbHNlOworCisgIG1fcE91dFN0cmVhbS0+d3JpdGVVOChtc2dUeXBlRmlsZVVwbG9hZFJlcXVlc3QpOworICBtX3BPdXRTdHJlYW0tPndyaXRlVTgoMCk7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVVMTYoZmlsZW5hbWVMZW4pOworICBtX3BPdXRTdHJlYW0tPndyaXRlVTMyKHBvc2l0aW9uKTsKKyAgbV9wT3V0U3RyZWFtLT53cml0ZUJ5dGVzKCh2b2lkICopcEZpbGVuYW1lLCBmaWxlbmFtZUxlbik7CisgIG1fcE91dFN0cmVhbS0+Zmx1c2goKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCAKK0NGVE1zZ1dyaXRlcjo6d3JpdGVGaWxlQ3JlYXRlRGlyUnFzdCh1bnNpZ25lZCBzaG9ydCBkaXJOYW1lTGVuLCBjaGFyICpwRGlyTmFtZSkKK3sKKyAgaWYgKGRpck5hbWVMZW4gPj0gRlRfRklMRU5BTUVfU0laRSkgcmV0dXJuIGZhbHNlOworCisgIG1fcE91dFN0cmVhbS0+d3JpdGVVOChtc2dUeXBlRmlsZUNyZWF0ZURpclJlcXVlc3QpOworICByZXR1cm4gd3JpdGVVOFUxNlN0cmluZ01zZyhkaXJOYW1lTGVuLCBwRGlyTmFtZSk7Cit9CisKK2Jvb2wgCitDRlRNc2dXcml0ZXI6OndyaXRlRmlsZURpclNpemVScXN0KHVuc2lnbmVkIHNob3J0IGRpck5hbWVMZW4sIGNoYXIgKnBEaXJOYW1lKQoreworICBpZiAoZGlyTmFtZUxlbiA+PSBGVF9GSUxFTkFNRV9TSVpFKSByZXR1cm4gZmFsc2U7CisKKyAgbV9wT3V0U3RyZWFtLT53cml0ZVU4KG1zZ1R5cGVGaWxlRGlyU2l6ZVJlcXVlc3QpOworICByZXR1cm4gd3JpdGVVOFUxNlN0cmluZ01zZyhkaXJOYW1lTGVuLCBwRGlyTmFtZSk7Cit9CisKK2Jvb2wgCitDRlRNc2dXcml0ZXI6OndyaXRlRmlsZVJlbmFtZVJxc3QodW5zaWduZWQgc2hvcnQgb2xkTmFtZUxlbiwgdW5zaWduZWQgc2hvcnQgbmV3TmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwT2xkTmFtZSwgY2hhciAqcE5ld05hbWUpCit7CisgIGlmICgob2xkTmFtZUxlbiA+PSBGVF9GSUxFTkFNRV9TSVpFKSB8fCAobmV3TmFtZUxlbiA+PSBGVF9GSUxFTkFNRV9TSVpFKSkgcmV0dXJuIGZhbHNlOworCisgIG1fcE91dFN0cmVhbS0+d3JpdGVVOChtc2dUeXBlRmlsZVJlbmFtZVJlcXVlc3QpOworICBtX3BPdXRTdHJlYW0tPndyaXRlVTgoMCk7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVVMTYob2xkTmFtZUxlbik7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVVMTYobmV3TmFtZUxlbik7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVCeXRlcyhwT2xkTmFtZSwgb2xkTmFtZUxlbik7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVCeXRlcyhwTmV3TmFtZSwgbmV3TmFtZUxlbik7CisgIG1fcE91dFN0cmVhbS0+Zmx1c2goKTsKKyAgCisgIHJldHVybiB0cnVlOworfQorCitib29sIAorQ0ZUTXNnV3JpdGVyOjp3cml0ZUZpbGVEZWxldGVScXN0KHVuc2lnbmVkIHNob3J0IG5hbWVMZW4sIGNoYXIgKnBOYW1lKQoreworICBpZiAobmFtZUxlbiA+PSBGVF9GSUxFTkFNRV9TSVpFKSByZXR1cm4gZmFsc2U7CisKKyAgbV9wT3V0U3RyZWFtLT53cml0ZVU4KG1zZ1R5cGVGaWxlRGVsZXRlUmVxdWVzdCk7CisgIHJldHVybiB3cml0ZVU4VTE2U3RyaW5nTXNnKG5hbWVMZW4sIHBOYW1lKTsKK30KKworYm9vbCAKK0NGVE1zZ1dyaXRlcjo6d3JpdGVVOFUxNlN0cmluZ01zZyh1bnNpZ25lZCBzaG9ydCBzdHJMZW5ndGgsIGNoYXIgKnBTdHJpbmcpCit7CisgIG1fcE91dFN0cmVhbS0+d3JpdGVVOCgwKTsKKyAgbV9wT3V0U3RyZWFtLT53cml0ZVUxNihzdHJMZW5ndGgpOworICBtX3BPdXRTdHJlYW0tPndyaXRlQnl0ZXMocFN0cmluZywgc3RyTGVuZ3RoKTsKKyAgbV9wT3V0U3RyZWFtLT5mbHVzaCgpOworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvQ0ZUTXNnV3JpdGVyLmggYi9jb21tb24vcmZiL0NGVE1zZ1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Y2RjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NGVE1zZ1dyaXRlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIENGVE1zZ1dyaXRlci5oCisKKyNpZm5kZWYgX19SRkJfQ0ZUTVNHV1JJVEVSX0hfXworI2RlZmluZSBfX1JGQl9DRlRNU0dXUklURVJfSF9fCisKKyNpbmNsdWRlIDxyZHIvdHlwZXMuaD4KKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL21zZ1R5cGVzLmg+CisjaW5jbHVkZSA8cmZiL2Z0dHlwZXMuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIENGVE1zZ1dyaXRlcgorICB7CisgIHB1YmxpYzoKKyAgICBDRlRNc2dXcml0ZXIocmRyOjpPdXRTdHJlYW0gKnBPUyk7CisgICAgfkNGVE1zZ1dyaXRlcigpOworICAgIAorICAgIGJvb2wgd3JpdGVGaWxlTGlzdFJxc3QodW5zaWduZWQgc2hvcnQgZGlybmFtZUxlbiwgY2hhciAqcERpck5hbWUsIGJvb2wgYkRpck9ubHkpOworICAgIAorICAgIGJvb2wgd3JpdGVGaWxlRG93bmxvYWRDYW5jZWwodW5zaWduZWQgc2hvcnQgcmVhc29uTGVuLCBjaGFyICpwUmVhc29uKTsKKyAgICBib29sIHdyaXRlRmlsZURvd25sb2FkUnFzdCh1bnNpZ25lZCBzaG9ydCBmaWxlbmFtZUxlbiwgY2hhciAqcEZpbGVuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcG9zaXRpb24pOworICAgIAorICAgIGJvb2wgd3JpdGVGaWxlVXBsb2FkRGF0YSh1bnNpZ25lZCBzaG9ydCBkYXRhU2l6ZSwgY2hhciAqcERhdGEpOworICAgIGJvb2wgd3JpdGVGaWxlVXBsb2FkRGF0YSh1bnNpZ25lZCBpbnQgbW9kVGltZSk7CisgICAgYm9vbCB3cml0ZUZpbGVVcGxvYWRGYWlsZWQodW5zaWduZWQgc2hvcnQgcmVhc29uTGVuLCBjaGFyICpwUmVhc29uKTsKKyAgICBib29sIHdyaXRlRmlsZVVwbG9hZFJxc3QodW5zaWduZWQgc2hvcnQgZmlsZW5hbWVMZW4sIGNoYXIgKnBGaWxlbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3NpdGlvbik7CisgICAgCisgICAgYm9vbCB3cml0ZUZpbGVDcmVhdGVEaXJScXN0KHVuc2lnbmVkIHNob3J0IGRpck5hbWVMZW4sIGNoYXIgKnBEaXJOYW1lKTsKKyAgICBib29sIHdyaXRlRmlsZURpclNpemVScXN0KHVuc2lnbmVkIHNob3J0IGRpck5hbWVMZW4sIGNoYXIgKnBEaXJOYW1lKTsKKyAgICAKKyAgICBib29sIHdyaXRlRmlsZVJlbmFtZVJxc3QodW5zaWduZWQgc2hvcnQgb2xkTmFtZUxlbiwgdW5zaWduZWQgc2hvcnQgbmV3TmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcE9sZE5hbWUsIGNoYXIgKnBOZXdOYW1lKTsKKyAgICBib29sIHdyaXRlRmlsZURlbGV0ZVJxc3QodW5zaWduZWQgc2hvcnQgbmFtZUxlbiwgY2hhciAqcE5hbWUpOworICAgIAorICBwcml2YXRlOgorICAgIHJkcjo6T3V0U3RyZWFtICptX3BPdXRTdHJlYW07CisgICAgCisgICAgYm9vbCB3cml0ZVU4VTE2U3RyaW5nTXNnKHVuc2lnbmVkIHNob3J0IHN0ckxlbmd0aCwgY2hhciAqcFN0cmluZyk7CisgIH07Cit9CisKKyNlbmRpZiAvLyBfX1JGQl9DRlRNU0dXUklURVJfSF9fCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NNc2dIYW5kbGVyLmN4eCBiL2NvbW1vbi9yZmIvQ01zZ0hhbmRsZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzExNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NNc2dIYW5kbGVyLmN4eApAQCAtMCwwICsxLDEwMyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvQ01zZ0hhbmRsZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworQ01zZ0hhbmRsZXI6OkNNc2dIYW5kbGVyKCkKK3sKK30KKworQ01zZ0hhbmRsZXI6On5DTXNnSGFuZGxlcigpCit7Cit9CisKK3ZvaWQgQ01zZ0hhbmRsZXI6OnNldERlc2t0b3BTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgY3Aud2lkdGggPSB3aWR0aDsKKyAgY3AuaGVpZ2h0ID0gaGVpZ2h0OworfQorCit2b2lkIENNc2dIYW5kbGVyOjpzZXRDdXJzb3IoaW50IHcsIGludCBoLCBjb25zdCBQb2ludCYgaG90c3BvdCwgdm9pZCogZGF0YSwgdm9pZCogbWFzaykKK3sKK30KKwordm9pZCBDTXNnSGFuZGxlcjo6c2V0UGl4ZWxGb3JtYXQoY29uc3QgUGl4ZWxGb3JtYXQmIHBmKQoreworICBjcC5zZXRQRihwZik7Cit9CisKK3ZvaWQgQ01zZ0hhbmRsZXI6OnNldE5hbWUoY29uc3QgY2hhciogbmFtZSkKK3sKKyAgY3Auc2V0TmFtZShuYW1lKTsKK30KKwordm9pZCBDTXNnSGFuZGxlcjo6c2VydmVySW5pdCgpCit7CisgIHRocm93IEV4Y2VwdGlvbigiQ01zZ0hhbmRsZXI6OnNlcnZlckluaXQgY2FsbGVkIik7Cit9CisKK3ZvaWQgQ01zZ0hhbmRsZXI6OmZyYW1lYnVmZmVyVXBkYXRlU3RhcnQoKQoreworfQorCit2b2lkIENNc2dIYW5kbGVyOjpmcmFtZWJ1ZmZlclVwZGF0ZUVuZCgpCit7Cit9CisKK3ZvaWQgQ01zZ0hhbmRsZXI6OmJlZ2luUmVjdChjb25zdCBSZWN0JiByLCB1bnNpZ25lZCBpbnQgZW5jb2RpbmcpCit7Cit9CisKK3ZvaWQgQ01zZ0hhbmRsZXI6OmVuZFJlY3QoY29uc3QgUmVjdCYgciwgdW5zaWduZWQgaW50IGVuY29kaW5nKQoreworfQorCisKK3ZvaWQgQ01zZ0hhbmRsZXI6OnNldENvbG91ck1hcEVudHJpZXMoaW50IGZpcnN0Q29sb3VyLCBpbnQgbkNvbG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJkcjo6VTE2KiByZ2JzKQoreworICB0aHJvdyBFeGNlcHRpb24oIkNNc2dIYW5kbGVyOjpzZXRDb2xvdXJNYXBFbnRyaWVzIGNhbGxlZCIpOworfQorCit2b2lkIENNc2dIYW5kbGVyOjpiZWxsKCkKK3sKK30KKwordm9pZCBDTXNnSGFuZGxlcjo6c2VydmVyQ3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pCit7Cit9CisKK3ZvaWQgQ01zZ0hhbmRsZXI6OmZpbGxSZWN0KGNvbnN0IFJlY3QmIHIsIFBpeGVsIHBpeCkKK3sKK30KKwordm9pZCBDTXNnSGFuZGxlcjo6aW1hZ2VSZWN0KGNvbnN0IFJlY3QmIHIsIHZvaWQqIHBpeGVscykKK3sKK30KKwordm9pZCBDTXNnSGFuZGxlcjo6Y29weVJlY3QoY29uc3QgUmVjdCYgciwgaW50IHNyY1gsIGludCBzcmNZKQoreworfQorCitib29sIENNc2dIYW5kbGVyOjpwcm9jZXNzRlRNc2coaW50IHR5cGUpCit7CisgIHJldHVybiBmYWxzZTsKK30KKwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9DTXNnSGFuZGxlci5oIGIvY29tbW9uL3JmYi9DTXNnSGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODZkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NNc2dIYW5kbGVyLmgKQEAgLTAsMCArMSw3MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIENNc2dIYW5kbGVyIC0gY2xhc3MgdG8gaGFuZGxlIGluY29taW5nIG1lc3NhZ2VzIG9uIHRoZSBjbGllbnQgc2lkZS4KKy8vCisKKyNpZm5kZWYgX19SRkJfQ01TR0hBTkRMRVJfSF9fCisjZGVmaW5lIF9fUkZCX0NNU0dIQU5ETEVSX0hfXworCisjaW5jbHVkZSA8cmRyL3R5cGVzLmg+CisjaW5jbHVkZSA8cmZiL1BpeGVsLmg+CisjaW5jbHVkZSA8cmZiL0Nvbm5QYXJhbXMuaD4KKyNpbmNsdWRlIDxyZmIvUmVjdC5oPgorCituYW1lc3BhY2UgcmRyIHsgY2xhc3MgSW5TdHJlYW07IH0KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgQ01zZ0hhbmRsZXIgeworICBwdWJsaWM6CisgICAgQ01zZ0hhbmRsZXIoKTsKKyAgICB2aXJ0dWFsIH5DTXNnSGFuZGxlcigpOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBjYWxsZWQgYXMgY29ycmVzcG9uZGluZyBtZXNzYWdlcyBhcmUgcmVhZC4gIEEKKyAgICAvLyBkZXJpdmVkIGNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGVzZSBtZXRob2RzIGFzIGRlc2lyZWQuICBOb3RlIHRoYXQgZm9yCisgICAgLy8gdGhlIHNldERlc2t0b3BTaXplKCksIHNldFBpeGVsRm9ybWF0KCkgYW5kIHNldE5hbWUoKSBtZXRob2RzLCBhIGRlcml2ZWQKKyAgICAvLyBjbGFzcyBzaG91bGQgY2FsbCBvbiB0byBDTXNnSGFuZGxlcidzIG1ldGhvZHMgdG8gc2V0IHRoZSBtZW1iZXJzIG9mIGNwCisgICAgLy8gYXBwcm9wcmlhdGVseS4KKworICAgIHZpcnR1YWwgdm9pZCBzZXREZXNrdG9wU2l6ZShpbnQgdywgaW50IGgpOworICAgIHZpcnR1YWwgdm9pZCBzZXRDdXJzb3IoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBQb2ludCYgaG90c3BvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEsIHZvaWQqIG1hc2spOworICAgIHZpcnR1YWwgdm9pZCBzZXRQaXhlbEZvcm1hdChjb25zdCBQaXhlbEZvcm1hdCYgcGYpOworICAgIHZpcnR1YWwgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOworICAgIHZpcnR1YWwgdm9pZCBzZXJ2ZXJJbml0KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZnJhbWVidWZmZXJVcGRhdGVTdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBmcmFtZWJ1ZmZlclVwZGF0ZUVuZCgpOworICAgIHZpcnR1YWwgdm9pZCBiZWdpblJlY3QoY29uc3QgUmVjdCYgciwgdW5zaWduZWQgaW50IGVuY29kaW5nKTsKKyAgICB2aXJ0dWFsIHZvaWQgZW5kUmVjdChjb25zdCBSZWN0JiByLCB1bnNpZ25lZCBpbnQgZW5jb2RpbmcpOworCisgICAgdmlydHVhbCB2b2lkIHNldENvbG91ck1hcEVudHJpZXMoaW50IGZpcnN0Q29sb3VyLCBpbnQgbkNvbG91cnMsCisJCQkJICAgICByZHI6OlUxNiogcmdicyk7CisgICAgdmlydHVhbCB2b2lkIGJlbGwoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmVyQ3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pOworCisgICAgdmlydHVhbCB2b2lkIGZpbGxSZWN0KGNvbnN0IFJlY3QmIHIsIFBpeGVsIHBpeCk7CisgICAgdmlydHVhbCB2b2lkIGltYWdlUmVjdChjb25zdCBSZWN0JiByLCB2b2lkKiBwaXhlbHMpOworICAgIHZpcnR1YWwgdm9pZCBjb3B5UmVjdChjb25zdCBSZWN0JiByLCBpbnQgc3JjWCwgaW50IHNyY1kpOworCisgICAgdmlydHVhbCBib29sIHByb2Nlc3NGVE1zZyhpbnQgdHlwZSk7CisKKyAgICBDb25uUGFyYW1zIGNwOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NNc2dSZWFkZXIuY3h4IGIvY29tbW9uL3JmYi9DTXNnUmVhZGVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODU0N2MwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9DTXNnUmVhZGVyLmN4eApAQCAtMCwwICsxLDE1OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cmRyL0luU3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisjaW5jbHVkZSA8cmZiL0NNc2dIYW5kbGVyLmg+CisjaW5jbHVkZSA8cmZiL0NNc2dSZWFkZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworQ01zZ1JlYWRlcjo6Q01zZ1JlYWRlcihDTXNnSGFuZGxlciogaGFuZGxlcl8sIHJkcjo6SW5TdHJlYW0qIGlzXykKKyAgOiBpbWFnZUJ1ZklkZWFsU2l6ZSgwKSwgaGFuZGxlcihoYW5kbGVyXyksIGlzKGlzXyksCisgICAgaW1hZ2VCdWYoMCksIGltYWdlQnVmU2l6ZSgwKQoreworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8PSBlbmNvZGluZ01heDsgaSsrKSB7CisgICAgZGVjb2RlcnNbaV0gPSAwOworICB9Cit9CisKK0NNc2dSZWFkZXI6On5DTXNnUmVhZGVyKCkKK3sKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPD0gZW5jb2RpbmdNYXg7IGkrKykgeworICAgIGRlbGV0ZSBkZWNvZGVyc1tpXTsKKyAgfQorICBkZWxldGUgW10gaW1hZ2VCdWY7Cit9CisKK3ZvaWQgQ01zZ1JlYWRlcjo6cmVhZFNldENvbG91ck1hcEVudHJpZXMoKQoreworICBpcy0+c2tpcCgxKTsKKyAgaW50IGZpcnN0Q29sb3VyID0gaXMtPnJlYWRVMTYoKTsKKyAgaW50IG5Db2xvdXJzID0gaXMtPnJlYWRVMTYoKTsKKyAgcmRyOjpVMTZBcnJheSByZ2JzKG5Db2xvdXJzICogMyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvbG91cnMgKiAzOyBpKyspCisgICAgcmdicy5idWZbaV0gPSBpcy0+cmVhZFUxNigpOworICBoYW5kbGVyLT5zZXRDb2xvdXJNYXBFbnRyaWVzKGZpcnN0Q29sb3VyLCBuQ29sb3Vycywgcmdicy5idWYpOworfQorCit2b2lkIENNc2dSZWFkZXI6OnJlYWRCZWxsKCkKK3sKKyAgaGFuZGxlci0+YmVsbCgpOworfQorCit2b2lkIENNc2dSZWFkZXI6OnJlYWRTZXJ2ZXJDdXRUZXh0KCkKK3sKKyAgaXMtPnNraXAoMyk7CisgIGludCBsZW4gPSBpcy0+cmVhZFUzMigpOworICBpZiAobGVuID4gMjU2KjEwMjQpIHsKKyAgICBpcy0+c2tpcChsZW4pOworICAgIGZwcmludGYoc3RkZXJyLCJjdXQgdGV4dCB0b28gbG9uZyAoJWQgYnl0ZXMpIC0gaWdub3JpbmdcbiIsbGVuKTsKKyAgICByZXR1cm47CisgIH0KKyAgQ2hhckFycmF5IGNhKGxlbisxKTsKKyAgY2EuYnVmW2xlbl0gPSAwOworICBpcy0+cmVhZEJ5dGVzKGNhLmJ1ZiwgbGVuKTsKKyAgaGFuZGxlci0+c2VydmVyQ3V0VGV4dChjYS5idWYsIGxlbik7Cit9CisKK3ZvaWQgQ01zZ1JlYWRlcjo6cmVhZEZyYW1lYnVmZmVyVXBkYXRlU3RhcnQoKQoreworICBoYW5kbGVyLT5mcmFtZWJ1ZmZlclVwZGF0ZVN0YXJ0KCk7Cit9CisKK3ZvaWQgQ01zZ1JlYWRlcjo6cmVhZEZyYW1lYnVmZmVyVXBkYXRlRW5kKCkKK3sKKyAgaGFuZGxlci0+ZnJhbWVidWZmZXJVcGRhdGVFbmQoKTsKK30KKwordm9pZCBDTXNnUmVhZGVyOjpyZWFkUmVjdChjb25zdCBSZWN0JiByLCB1bnNpZ25lZCBpbnQgZW5jb2RpbmcpCit7CisgIGlmICgoci5ici54ID4gaGFuZGxlci0+Y3Aud2lkdGgpIHx8IChyLmJyLnkgPiBoYW5kbGVyLT5jcC5oZWlnaHQpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJSZWN0IHRvbyBiaWc6ICVkeCVkIGF0ICVkLCVkIGV4Y2VlZHMgJWR4JWRcbiIsCisJICAgIHIud2lkdGgoKSwgci5oZWlnaHQoKSwgci50bC54LCByLnRsLnksCisgICAgICAgICAgICBoYW5kbGVyLT5jcC53aWR0aCwgaGFuZGxlci0+Y3AuaGVpZ2h0KTsKKyAgICB0aHJvdyBFeGNlcHRpb24oIlJlY3QgdG9vIGJpZyIpOworICB9CisKKyAgaWYgKHIuaXNfZW1wdHkoKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHplcm8gc2l6ZSByZWN0XG4iKTsKKworICBoYW5kbGVyLT5iZWdpblJlY3QociwgZW5jb2RpbmcpOworCisgIGlmIChlbmNvZGluZyA9PSBlbmNvZGluZ0NvcHlSZWN0KSB7CisgICAgcmVhZENvcHlSZWN0KHIpOworICB9IGVsc2UgeworICAgIGlmICghZGVjb2RlcnNbZW5jb2RpbmddKSB7CisgICAgICBkZWNvZGVyc1tlbmNvZGluZ10gPSBEZWNvZGVyOjpjcmVhdGVEZWNvZGVyKGVuY29kaW5nLCB0aGlzKTsKKyAgICAgIGlmICghZGVjb2RlcnNbZW5jb2RpbmddKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biByZWN0IGVuY29kaW5nICVkXG4iLCBlbmNvZGluZyk7CisgICAgICAgIHRocm93IEV4Y2VwdGlvbigiVW5rbm93biByZWN0IGVuY29kaW5nIik7CisgICAgICB9CisgICAgfQorICAgIGRlY29kZXJzW2VuY29kaW5nXS0+cmVhZFJlY3QociwgaGFuZGxlcik7CisgIH0KKworICBoYW5kbGVyLT5lbmRSZWN0KHIsIGVuY29kaW5nKTsKK30KKwordm9pZCBDTXNnUmVhZGVyOjpyZWFkQ29weVJlY3QoY29uc3QgUmVjdCYgcikKK3sKKyAgaW50IHNyY1ggPSBpcy0+cmVhZFUxNigpOworICBpbnQgc3JjWSA9IGlzLT5yZWFkVTE2KCk7CisgIGhhbmRsZXItPmNvcHlSZWN0KHIsIHNyY1gsIHNyY1kpOworfQorCit2b2lkIENNc2dSZWFkZXI6OnJlYWRTZXRDdXJzb3IoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBQb2ludCYgaG90c3BvdCkKK3sKKyAgaW50IGRhdGFfbGVuID0gd2lkdGggKiBoZWlnaHQgKiAoaGFuZGxlci0+Y3AucGYoKS5icHAvOCk7CisgIGludCBtYXNrX2xlbiA9ICgod2lkdGgrNykvOCkgKiBoZWlnaHQ7CisgIHJkcjo6VThBcnJheSBkYXRhKGRhdGFfbGVuKTsKKyAgcmRyOjpVOEFycmF5IG1hc2sobWFza19sZW4pOworCisgIGlzLT5yZWFkQnl0ZXMoZGF0YS5idWYsIGRhdGFfbGVuKTsKKyAgaXMtPnJlYWRCeXRlcyhtYXNrLmJ1ZiwgbWFza19sZW4pOworCisgIGhhbmRsZXItPnNldEN1cnNvcih3aWR0aCwgaGVpZ2h0LCBob3RzcG90LCBkYXRhLmJ1ZiwgbWFzay5idWYpOworfQorCityZHI6OlU4KiBDTXNnUmVhZGVyOjpnZXRJbWFnZUJ1ZihpbnQgcmVxdWlyZWQsIGludCByZXF1ZXN0ZWQsIGludCogblBpeGVscykKK3sKKyAgaW50IHJlcXVpcmVkQnl0ZXMgPSByZXF1aXJlZCAqIChoYW5kbGVyLT5jcC5wZigpLmJwcCAvIDgpOworICBpbnQgcmVxdWVzdGVkQnl0ZXMgPSByZXF1ZXN0ZWQgKiAoaGFuZGxlci0+Y3AucGYoKS5icHAgLyA4KTsKKyAgaW50IHNpemUgPSByZXF1ZXN0ZWRCeXRlczsKKyAgaWYgKHNpemUgPiBpbWFnZUJ1ZklkZWFsU2l6ZSkgc2l6ZSA9IGltYWdlQnVmSWRlYWxTaXplOworCisgIGlmIChzaXplIDwgcmVxdWlyZWRCeXRlcykKKyAgICBzaXplID0gcmVxdWlyZWRCeXRlczsKKworICBpZiAoaW1hZ2VCdWZTaXplIDwgc2l6ZSkgeworICAgIGltYWdlQnVmU2l6ZSA9IHNpemU7CisgICAgZGVsZXRlIFtdIGltYWdlQnVmOworICAgIGltYWdlQnVmID0gbmV3IHJkcjo6VThbaW1hZ2VCdWZTaXplXTsKKyAgfQorICBpZiAoblBpeGVscykKKyAgICAqblBpeGVscyA9IGltYWdlQnVmU2l6ZSAvIChoYW5kbGVyLT5jcC5wZigpLmJwcCAvIDgpOworICByZXR1cm4gaW1hZ2VCdWY7Cit9CisKK2ludCBDTXNnUmVhZGVyOjpicHAoKQoreworICByZXR1cm4gaGFuZGxlci0+Y3AucGYoKS5icHA7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NNc2dSZWFkZXIuaCBiL2NvbW1vbi9yZmIvQ01zZ1JlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjExZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NNc2dSZWFkZXIuaApAQCAtMCwwICsxLDczIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gQ01zZ1JlYWRlciAtIGNsYXNzIGZvciByZWFkaW5nIFJGQiBtZXNzYWdlcyBvbiB0aGUgc2VydmVyIHNpZGUKKy8vIChpLmUuIG1lc3NhZ2VzIGZyb20gY2xpZW50IHRvIHNlcnZlcikuCisvLworCisjaWZuZGVmIF9fUkZCX0NNU0dSRUFERVJfSF9fCisjZGVmaW5lIF9fUkZCX0NNU0dSRUFERVJfSF9fCisKKyNpbmNsdWRlIDxyZHIvdHlwZXMuaD4KKyNpbmNsdWRlIDxyZmIvZW5jb2RpbmdzLmg+CisjaW5jbHVkZSA8cmZiL0RlY29kZXIuaD4KKworbmFtZXNwYWNlIHJkciB7IGNsYXNzIEluU3RyZWFtOyB9CisKK25hbWVzcGFjZSByZmIgeworICBjbGFzcyBDTXNnSGFuZGxlcjsKKyAgc3RydWN0IFJlY3Q7CisKKyAgY2xhc3MgQ01zZ1JlYWRlciB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5DTXNnUmVhZGVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZFNlcnZlckluaXQoKT0wOworCisgICAgLy8gcmVhZE1zZygpIHJlYWRzIGEgbWVzc2FnZSwgY2FsbGluZyB0aGUgaGFuZGxlciBhcyBhcHByb3ByaWF0ZS4KKyAgICB2aXJ0dWFsIHZvaWQgcmVhZE1zZygpPTA7CisKKyAgICByZHI6OkluU3RyZWFtKiBnZXRJblN0cmVhbSgpIHsgcmV0dXJuIGlzOyB9CisgICAgcmRyOjpVOCogZ2V0SW1hZ2VCdWYoaW50IHJlcXVpcmVkLCBpbnQgcmVxdWVzdGVkPTAsIGludCogblBpeGVscz0wKTsKKyAgICBpbnQgYnBwKCk7CisKKyAgICBpbnQgaW1hZ2VCdWZJZGVhbFNpemU7CisKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCByZWFkU2V0Q29sb3VyTWFwRW50cmllcygpOworICAgIHZpcnR1YWwgdm9pZCByZWFkQmVsbCgpOworICAgIHZpcnR1YWwgdm9pZCByZWFkU2VydmVyQ3V0VGV4dCgpOworCisgICAgdmlydHVhbCB2b2lkIHJlYWRGcmFtZWJ1ZmZlclVwZGF0ZVN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHJlYWRGcmFtZWJ1ZmZlclVwZGF0ZUVuZCgpOworICAgIHZpcnR1YWwgdm9pZCByZWFkUmVjdChjb25zdCBSZWN0JiByLCB1bnNpZ25lZCBpbnQgZW5jb2RpbmcpOworCisgICAgdmlydHVhbCB2b2lkIHJlYWRDb3B5UmVjdChjb25zdCBSZWN0JiByKTsKKworICAgIHZpcnR1YWwgdm9pZCByZWFkU2V0Q3Vyc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgUG9pbnQmIGhvdHNwb3QpOworCisgICAgQ01zZ1JlYWRlcihDTXNnSGFuZGxlciogaGFuZGxlciwgcmRyOjpJblN0cmVhbSogaXMpOworCisgICAgQ01zZ0hhbmRsZXIqIGhhbmRsZXI7CisgICAgcmRyOjpJblN0cmVhbSogaXM7CisgICAgRGVjb2RlciogZGVjb2RlcnNbZW5jb2RpbmdNYXgrMV07CisgICAgcmRyOjpVOCogaW1hZ2VCdWY7CisgICAgaW50IGltYWdlQnVmU2l6ZTsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9DTXNnUmVhZGVyVjMuY3h4IGIvY29tbW9uL3JmYi9DTXNnUmVhZGVyVjMuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwY2ZjODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NNc2dSZWFkZXJWMy5jeHgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxyZmIvUGl4ZWxGb3JtYXQuaD4KKyNpbmNsdWRlIDxyZmIvbXNnVHlwZXMuaD4KKyNpbmNsdWRlIDxyZmIvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8cmRyL0luU3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL0NNc2dSZWFkZXJWMy5oPgorI2luY2x1ZGUgPHJmYi9DTXNnSGFuZGxlci5oPgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK0NNc2dSZWFkZXJWMzo6Q01zZ1JlYWRlclYzKENNc2dIYW5kbGVyKiBoYW5kbGVyLCByZHI6OkluU3RyZWFtKiBpcykKKyAgOiBDTXNnUmVhZGVyKGhhbmRsZXIsIGlzKSwgblVwZGF0ZVJlY3RzTGVmdCgwKQoreworfQorCitDTXNnUmVhZGVyVjM6On5DTXNnUmVhZGVyVjMoKQoreworfQorCit2b2lkIENNc2dSZWFkZXJWMzo6cmVhZFNlcnZlckluaXQoKQoreworICBpbnQgd2lkdGggPSBpcy0+cmVhZFUxNigpOworICBpbnQgaGVpZ2h0ID0gaXMtPnJlYWRVMTYoKTsKKyAgaGFuZGxlci0+c2V0RGVza3RvcFNpemUod2lkdGgsIGhlaWdodCk7CisgIFBpeGVsRm9ybWF0IHBmOworICBwZi5yZWFkKGlzKTsKKyAgaGFuZGxlci0+c2V0UGl4ZWxGb3JtYXQocGYpOworICBDaGFyQXJyYXkgbmFtZShpcy0+cmVhZFN0cmluZygpKTsKKyAgaGFuZGxlci0+c2V0TmFtZShuYW1lLmJ1Zik7CisgIGhhbmRsZXItPnNlcnZlckluaXQoKTsKK30KKwordm9pZCBDTXNnUmVhZGVyVjM6OnJlYWRNc2coKQoreworICBpZiAoblVwZGF0ZVJlY3RzTGVmdCA9PSAwKSB7CisKKyAgICBpbnQgdHlwZSA9IGlzLT5yZWFkVTgoKTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIG1zZ1R5cGVGcmFtZWJ1ZmZlclVwZGF0ZTogICByZWFkRnJhbWVidWZmZXJVcGRhdGUoKTsgYnJlYWs7CisgICAgY2FzZSBtc2dUeXBlU2V0Q29sb3VyTWFwRW50cmllczogcmVhZFNldENvbG91ck1hcEVudHJpZXMoKTsgYnJlYWs7CisgICAgY2FzZSBtc2dUeXBlQmVsbDogICAgICAgICAgICAgICAgcmVhZEJlbGwoKTsgYnJlYWs7CisgICAgY2FzZSBtc2dUeXBlU2VydmVyQ3V0VGV4dDogICAgICAgcmVhZFNlcnZlckN1dFRleHQoKTsgYnJlYWs7CisKKyAgICBjYXNlIG1zZ1R5cGVGaWxlTGlzdERhdGE6CisgICAgY2FzZSBtc2dUeXBlRmlsZURvd25sb2FkRGF0YToKKyAgICBjYXNlIG1zZ1R5cGVGaWxlVXBsb2FkQ2FuY2VsOgorICAgIGNhc2UgbXNnVHlwZUZpbGVEb3dubG9hZEZhaWxlZDoKKyAgICBjYXNlIG1zZ1R5cGVGaWxlRGlyU2l6ZURhdGE6CisgICAgY2FzZSBtc2dUeXBlRmlsZUxhc3RSZXF1ZXN0RmFpbGVkOgorICAgICAgaGFuZGxlci0+cHJvY2Vzc0ZUTXNnKHR5cGUpOyBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gbWVzc2FnZSB0eXBlICVkXG4iLCB0eXBlKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbigidW5rbm93biBtZXNzYWdlIHR5cGUiKTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKworICAgIGludCB4ID0gaXMtPnJlYWRVMTYoKTsKKyAgICBpbnQgeSA9IGlzLT5yZWFkVTE2KCk7CisgICAgaW50IHcgPSBpcy0+cmVhZFUxNigpOworICAgIGludCBoID0gaXMtPnJlYWRVMTYoKTsKKyAgICB1bnNpZ25lZCBpbnQgZW5jb2RpbmcgPSBpcy0+cmVhZFUzMigpOworCisgICAgc3dpdGNoIChlbmNvZGluZykgeworICAgIGNhc2UgcHNldWRvRW5jb2RpbmdEZXNrdG9wU2l6ZToKKyAgICAgIGhhbmRsZXItPnNldERlc2t0b3BTaXplKHcsIGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBwc2V1ZG9FbmNvZGluZ0N1cnNvcjoKKyAgICAgIHJlYWRTZXRDdXJzb3IodywgaCwgUG9pbnQoeCx5KSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBzZXVkb0VuY29kaW5nTGFzdFJlY3Q6CisgICAgICBuVXBkYXRlUmVjdHNMZWZ0ID0gMTsgICAgIC8vIHRoaXMgcmVjdGFuZ2xlIGlzIHRoZSBsYXN0IG9uZQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlYWRSZWN0KFJlY3QoeCwgeSwgeCt3LCB5K2gpLCBlbmNvZGluZyk7CisgICAgICBicmVhazsKKyAgICB9OworCisgICAgblVwZGF0ZVJlY3RzTGVmdC0tOworICAgIGlmIChuVXBkYXRlUmVjdHNMZWZ0ID09IDApIGhhbmRsZXItPmZyYW1lYnVmZmVyVXBkYXRlRW5kKCk7CisgIH0KK30KKwordm9pZCBDTXNnUmVhZGVyVjM6OnJlYWRGcmFtZWJ1ZmZlclVwZGF0ZSgpCit7CisgIGlzLT5za2lwKDEpOworICBuVXBkYXRlUmVjdHNMZWZ0ID0gaXMtPnJlYWRVMTYoKTsKKyAgaGFuZGxlci0+ZnJhbWVidWZmZXJVcGRhdGVTdGFydCgpOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9DTXNnUmVhZGVyVjMuaCBiL2NvbW1vbi9yZmIvQ01zZ1JlYWRlclYzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5YmI2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ01zZ1JlYWRlclYzLmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2lmbmRlZiBfX1JGQl9DTVNHUkVBREVSVjNfSF9fCisjZGVmaW5lIF9fUkZCX0NNU0dSRUFERVJWM19IX18KKworI2luY2x1ZGUgPHJmYi9DTXNnUmVhZGVyLmg+CisKK25hbWVzcGFjZSByZmIgeworICBjbGFzcyBDTXNnUmVhZGVyVjMgOiBwdWJsaWMgQ01zZ1JlYWRlciB7CisgIHB1YmxpYzoKKyAgICBDTXNnUmVhZGVyVjMoQ01zZ0hhbmRsZXIqIGhhbmRsZXIsIHJkcjo6SW5TdHJlYW0qIGlzKTsKKyAgICB2aXJ0dWFsIH5DTXNnUmVhZGVyVjMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZFNlcnZlckluaXQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZE1zZygpOworICBwcml2YXRlOgorICAgIHZvaWQgcmVhZEZyYW1lYnVmZmVyVXBkYXRlKCk7CisgICAgaW50IG5VcGRhdGVSZWN0c0xlZnQ7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvQ01zZ1dyaXRlci5jeHggYi9jb21tb24vcmZiL0NNc2dXcml0ZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZmI0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NNc2dXcml0ZXIuY3h4CkBAIC0wLDAgKzEsMTMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL21zZ1R5cGVzLmg+CisjaW5jbHVkZSA8cmZiL1BpeGVsRm9ybWF0Lmg+CisjaW5jbHVkZSA8cmZiL1JlY3QuaD4KKyNpbmNsdWRlIDxyZmIvQ29ublBhcmFtcy5oPgorI2luY2x1ZGUgPHJmYi9EZWNvZGVyLmg+CisjaW5jbHVkZSA8cmZiL0NNc2dXcml0ZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworQ01zZ1dyaXRlcjo6Q01zZ1dyaXRlcihDb25uUGFyYW1zKiBjcF8sIHJkcjo6T3V0U3RyZWFtKiBvc18pCisgIDogY3AoY3BfKSwgb3Mob3NfKQoreworfQorCitDTXNnV3JpdGVyOjp+Q01zZ1dyaXRlcigpCit7Cit9CisKK3ZvaWQgQ01zZ1dyaXRlcjo6d3JpdGVTZXRQaXhlbEZvcm1hdChjb25zdCBQaXhlbEZvcm1hdCYgcGYpCit7CisgIHN0YXJ0TXNnKG1zZ1R5cGVTZXRQaXhlbEZvcm1hdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIG9zLT5wYWQoMyk7CisgIHBmLndyaXRlKG9zKTsKKyAgZW5kTXNnKCk7Cit9CisKK3ZvaWQgQ01zZ1dyaXRlcjo6d3JpdGVTZXRFbmNvZGluZ3MoaW50IG5FbmNvZGluZ3MsIHJkcjo6VTMyKiBlbmNvZGluZ3MpCit7CisgIHN0YXJ0TXNnKG1zZ1R5cGVTZXRFbmNvZGluZ3MpOworICBvcy0+c2tpcCgxKTsKKyAgb3MtPndyaXRlVTE2KG5FbmNvZGluZ3MpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5FbmNvZGluZ3M7IGkrKykKKyAgICBvcy0+d3JpdGVVMzIoZW5jb2RpbmdzW2ldKTsKKyAgZW5kTXNnKCk7Cit9CisKKy8vIEFzayBmb3IgZW5jb2RpbmdzIGJhc2VkIG9uIHdoaWNoIGRlY29kZXJzIGFyZSBzdXBwb3J0ZWQuICBBc3N1bWVzIGhpZ2hlcgorLy8gZW5jb2RpbmcgbnVtYmVycyBhcmUgbW9yZSBkZXNpcmFibGUuCisKK3ZvaWQgQ01zZ1dyaXRlcjo6d3JpdGVTZXRFbmNvZGluZ3MoaW50IHByZWZlcnJlZEVuY29kaW5nLCBib29sIHVzZUNvcHlSZWN0KQoreworICBpbnQgbkVuY29kaW5ncyA9IDA7CisgIHJkcjo6VTMyIGVuY29kaW5nc1tlbmNvZGluZ01heCszXTsKKyAgaWYgKGNwLT5zdXBwb3J0c0xvY2FsQ3Vyc29yKQorICAgIGVuY29kaW5nc1tuRW5jb2RpbmdzKytdID0gcHNldWRvRW5jb2RpbmdDdXJzb3I7CisgIGlmIChjcC0+c3VwcG9ydHNEZXNrdG9wUmVzaXplKQorICAgIGVuY29kaW5nc1tuRW5jb2RpbmdzKytdID0gcHNldWRvRW5jb2RpbmdEZXNrdG9wU2l6ZTsKKyAgaWYgKERlY29kZXI6OnN1cHBvcnRlZChwcmVmZXJyZWRFbmNvZGluZykpIHsKKyAgICBlbmNvZGluZ3NbbkVuY29kaW5ncysrXSA9IHByZWZlcnJlZEVuY29kaW5nOworICB9CisgIGlmICh1c2VDb3B5UmVjdCkgeworICAgIGVuY29kaW5nc1tuRW5jb2RpbmdzKytdID0gZW5jb2RpbmdDb3B5UmVjdDsKKyAgfQorICBmb3IgKGludCBpID0gZW5jb2RpbmdNYXg7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKGkgIT0gcHJlZmVycmVkRW5jb2RpbmcgJiYgRGVjb2Rlcjo6c3VwcG9ydGVkKGkpKSB7CisgICAgICBlbmNvZGluZ3NbbkVuY29kaW5ncysrXSA9IGk7CisgICAgfQorICB9CisgIGVuY29kaW5nc1tuRW5jb2RpbmdzKytdID0gcHNldWRvRW5jb2RpbmdMYXN0UmVjdDsKKyAgaWYgKGNwLT5jdXN0b21Db21wcmVzc0xldmVsICYmIGNwLT5jb21wcmVzc0xldmVsID49IDAgJiYgY3AtPmNvbXByZXNzTGV2ZWwgPD0gOSkKKyAgICAgIGVuY29kaW5nc1tuRW5jb2RpbmdzKytdID0gcHNldWRvRW5jb2RpbmdDb21wcmVzc0xldmVsMCArIGNwLT5jb21wcmVzc0xldmVsOworICBpZiAoIWNwLT5ub0pwZWcgJiYgY3AtPnF1YWxpdHlMZXZlbCA+PSAxICYmIGNwLT5xdWFsaXR5TGV2ZWwgPD0gOSkKKyAgICAgIGVuY29kaW5nc1tuRW5jb2RpbmdzKytdID0gcHNldWRvRW5jb2RpbmdRdWFsaXR5TGV2ZWwwICsgY3AtPnF1YWxpdHlMZXZlbDsKKworICB3cml0ZVNldEVuY29kaW5ncyhuRW5jb2RpbmdzLCBlbmNvZGluZ3MpOworfQorICAKK3ZvaWQgQ01zZ1dyaXRlcjo6d3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoY29uc3QgUmVjdCYgciwgYm9vbCBpbmNyZW1lbnRhbCkKK3sKKyAgc3RhcnRNc2cobXNnVHlwZUZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCk7CisgIG9zLT53cml0ZVU4KGluY3JlbWVudGFsKTsKKyAgb3MtPndyaXRlVTE2KHIudGwueCk7CisgIG9zLT53cml0ZVUxNihyLnRsLnkpOworICBvcy0+d3JpdGVVMTYoci53aWR0aCgpKTsKKyAgb3MtPndyaXRlVTE2KHIuaGVpZ2h0KCkpOworICBlbmRNc2coKTsKK30KKworCit2b2lkIENNc2dXcml0ZXI6OmtleUV2ZW50KHJkcjo6VTMyIGtleSwgYm9vbCBkb3duKQoreworICBzdGFydE1zZyhtc2dUeXBlS2V5RXZlbnQpOworICBvcy0+d3JpdGVVOChkb3duKTsKKyAgb3MtPnBhZCgyKTsKKyAgb3MtPndyaXRlVTMyKGtleSk7CisgIGVuZE1zZygpOworfQorCisKK3ZvaWQgQ01zZ1dyaXRlcjo6cG9pbnRlckV2ZW50KGNvbnN0IFBvaW50JiBwb3MsIGludCBidXR0b25NYXNrKQoreworICBQb2ludCBwKHBvcyk7CisgIGlmIChwLnggPCAwKSBwLnggPSAwOworICBpZiAocC55IDwgMCkgcC55ID0gMDsKKyAgaWYgKHAueCA+PSBjcC0+d2lkdGgpIHAueCA9IGNwLT53aWR0aCAtIDE7CisgIGlmIChwLnkgPj0gY3AtPmhlaWdodCkgcC55ID0gY3AtPmhlaWdodCAtIDE7CisKKyAgc3RhcnRNc2cobXNnVHlwZVBvaW50ZXJFdmVudCk7CisgIG9zLT53cml0ZVU4KGJ1dHRvbk1hc2spOworICBvcy0+d3JpdGVVMTYocC54KTsKKyAgb3MtPndyaXRlVTE2KHAueSk7CisgIGVuZE1zZygpOworfQorCisKK3ZvaWQgQ01zZ1dyaXRlcjo6Y2xpZW50Q3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pCit7CisgIHN0YXJ0TXNnKG1zZ1R5cGVDbGllbnRDdXRUZXh0KTsKKyAgb3MtPnBhZCgzKTsKKyAgb3MtPndyaXRlVTMyKGxlbik7CisgIG9zLT53cml0ZUJ5dGVzKHN0ciwgbGVuKTsKKyAgZW5kTXNnKCk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NNc2dXcml0ZXIuaCBiL2NvbW1vbi9yZmIvQ01zZ1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YmU4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NNc2dXcml0ZXIuaApAQCAtMCwwICsxLDY1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gQ01zZ1dyaXRlciAtIGNsYXNzIGZvciB3cml0aW5nIFJGQiBtZXNzYWdlcyBvbiB0aGUgc2VydmVyIHNpZGUuCisvLworCisjaWZuZGVmIF9fUkZCX0NNU0dXUklURVJfSF9fCisjZGVmaW5lIF9fUkZCX0NNU0dXUklURVJfSF9fCisKKyNpbmNsdWRlIDxyZmIvSW5wdXRIYW5kbGVyLmg+CisKK25hbWVzcGFjZSByZHIgeyBjbGFzcyBPdXRTdHJlYW07IH0KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgUGl4ZWxGb3JtYXQ7CisgIGNsYXNzIENvbm5QYXJhbXM7CisgIHN0cnVjdCBSZWN0OworCisgIGNsYXNzIENNc2dXcml0ZXIgOiBwdWJsaWMgSW5wdXRIYW5kbGVyIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfkNNc2dXcml0ZXIoKTsKKworICAgIC8vIENNc2dXcml0ZXIgYWJzdHJhY3QgaW50ZXJmYWNlIG1ldGhvZHMKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVDbGllbnRJbml0KGJvb2wgc2hhcmVkKT0wOworICAgIHZpcnR1YWwgdm9pZCBzdGFydE1zZyhpbnQgdHlwZSk9MDsKKyAgICB2aXJ0dWFsIHZvaWQgZW5kTXNnKCk9MDsKKworICAgIC8vIENNc2dXcml0ZXIgaW1wbGVtZW50ZWQgbWV0aG9kcworICAgIHZpcnR1YWwgdm9pZCB3cml0ZVNldFBpeGVsRm9ybWF0KGNvbnN0IFBpeGVsRm9ybWF0JiBwZik7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlU2V0RW5jb2RpbmdzKGludCBuRW5jb2RpbmdzLCByZHI6OlUzMiogZW5jb2RpbmdzKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVTZXRFbmNvZGluZ3MoaW50IHByZWZlcnJlZEVuY29kaW5nLCBib29sIHVzZUNvcHlSZWN0KTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoY29uc3QgUmVjdCYgcixib29sIGluY3JlbWVudGFsKTsKKworICAgIC8vIElucHV0SGFuZGxlciBpbXBsZW1lbnRhdGlvbgorICAgIHZpcnR1YWwgdm9pZCBrZXlFdmVudChyZHI6OlUzMiBrZXksIGJvb2wgZG93bik7CisgICAgdmlydHVhbCB2b2lkIHBvaW50ZXJFdmVudChjb25zdCBQb2ludCYgcG9zLCBpbnQgYnV0dG9uTWFzayk7CisgICAgdmlydHVhbCB2b2lkIGNsaWVudEN1dFRleHQoY29uc3QgY2hhciogc3RyLCBpbnQgbGVuKTsKKworICAgIENvbm5QYXJhbXMqIGdldENvbm5QYXJhbXMoKSB7IHJldHVybiBjcDsgfQorICAgIHJkcjo6T3V0U3RyZWFtKiBnZXRPdXRTdHJlYW0oKSB7IHJldHVybiBvczsgfQorCisgIHByb3RlY3RlZDoKKyAgICBDTXNnV3JpdGVyKENvbm5QYXJhbXMqIGNwLCByZHI6Ok91dFN0cmVhbSogb3MpOworCisgICAgQ29ublBhcmFtcyogY3A7CisgICAgcmRyOjpPdXRTdHJlYW0qIG9zOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NNc2dXcml0ZXJWMy5jeHggYi9jb21tb24vcmZiL0NNc2dXcml0ZXJWMy5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4MDc5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ01zZ1dyaXRlclYzLmN4eApAQCAtMCwwICsxLDQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8cmRyL091dFN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9tc2dUeXBlcy5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvQ29ublBhcmFtcy5oPgorI2luY2x1ZGUgPHJmYi9DTXNnV3JpdGVyVjMuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworQ01zZ1dyaXRlclYzOjpDTXNnV3JpdGVyVjMoQ29ublBhcmFtcyogY3AsIHJkcjo6T3V0U3RyZWFtKiBvcykKKyAgOiBDTXNnV3JpdGVyKGNwLCBvcykKK3sKK30KKworQ01zZ1dyaXRlclYzOjp+Q01zZ1dyaXRlclYzKCkKK3sKK30KKwordm9pZCBDTXNnV3JpdGVyVjM6OndyaXRlQ2xpZW50SW5pdChib29sIHNoYXJlZCkKK3sKKyAgb3MtPndyaXRlVTgoc2hhcmVkKTsKKyAgZW5kTXNnKCk7Cit9CisKK3ZvaWQgQ01zZ1dyaXRlclYzOjpzdGFydE1zZyhpbnQgdHlwZSkKK3sKKyAgb3MtPndyaXRlVTgodHlwZSk7Cit9CisKK3ZvaWQgQ01zZ1dyaXRlclYzOjplbmRNc2coKQoreworICBvcy0+Zmx1c2goKTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvQ01zZ1dyaXRlclYzLmggYi9jb21tb24vcmZiL0NNc2dXcml0ZXJWMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMmY5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NNc2dXcml0ZXJWMy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpZm5kZWYgX19SRkJfQ01TR1dSSVRFUlYzX0hfXworI2RlZmluZSBfX1JGQl9DTVNHV1JJVEVSVjNfSF9fCisKKyNpbmNsdWRlIDxyZmIvQ01zZ1dyaXRlci5oPgorCituYW1lc3BhY2UgcmZiIHsKKyAgY2xhc3MgQ01zZ1dyaXRlclYzIDogcHVibGljIENNc2dXcml0ZXIgeworICBwdWJsaWM6CisgICAgQ01zZ1dyaXRlclYzKENvbm5QYXJhbXMqIGNwLCByZHI6Ok91dFN0cmVhbSogb3MpOworICAgIHZpcnR1YWwgfkNNc2dXcml0ZXJWMygpOworCisgICAgdmlydHVhbCB2b2lkIHdyaXRlQ2xpZW50SW5pdChib29sIHNoYXJlZCk7CisgICAgdmlydHVhbCB2b2lkIHN0YXJ0TXNnKGludCB0eXBlKTsKKyAgICB2aXJ0dWFsIHZvaWQgZW5kTXNnKCk7CisKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9DU2VjdXJpdHkuaCBiL2NvbW1vbi9yZmIvQ1NlY3VyaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhMDFkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ1NlY3VyaXR5LmgKQEAgLTAsMCArMSw1MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIENTZWN1cml0eSAtIGNsYXNzIG9uIHRoZSBjbGllbnQgc2lkZSBmb3IgaGFuZGxpbmcgc2VjdXJpdHkgaGFuZHNoYWtpbmcuICBBCisvLyBkZXJpdmVkIGNsYXNzIGZvciBhIHBhcnRpY3VsYXIgc2VjdXJpdHkgdHlwZSBvdmVycmlkZXMgdGhlIHByb2Nlc3NNc2coKQorLy8gbWV0aG9kLgorCisvLyBwcm9jZXNzTXNnKCkgaXMgY2FsbGVkIGZpcnN0IHdoZW4gdGhlIHNlY3VyaXR5IHR5cGUgaGFzIGJlZW4gZGVjaWRlZCBvbiwgYW5kCisvLyB3aWxsIGtlZXAgYmVpbmcgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGRhdGEgdG8gcmVhZCBmcm9tIHRoZSBzZXJ2ZXIuICBJdAorLy8gc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIGl0IG5lZWRzIG1vcmUgZGF0YSwgb3IgdHJ1ZSB3aGVuIHRoZSBzZWN1cml0eQorLy8gaGFuZHNoYWtpbmcgaXMgb3ZlciBhbmQgd2UgYXJlIG5vdyB3YWl0aW5nIGZvciB0aGUgU2VjdXJpdHlSZXN1bHQgbWVzc2FnZQorLy8gZnJvbSB0aGUgc2VydmVyLiAgSW4gdGhlIGV2ZW50IG9mIGZhaWx1cmUgYSBzdWl0YWJsZSBleGNlcHRpb24gc2hvdWxkIGJlCisvLyB0aHJvd24uCisvLworLy8gTm90ZSB0aGF0IHRoZSBmaXJzdCB0aW1lIHByb2Nlc3NNc2coKSBpcyBjYWxsZWQsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0CisvLyB0aGVyZSBpcyBhbnkgZGF0YSB0byByZWFkIGZyb20gdGhlIENDb25uZWN0aW9uJ3MgSW5TdHJlYW0sIGJ1dCBzdWJzZXF1ZW50CisvLyBjYWxscyBndWFyYW50ZWUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGJ5dGUgd2hpY2ggY2FuIGJlIHJlYWQgd2l0aG91dAorLy8gYmxvY2tpbmcuCisvLworLy8gZGVzY3JpcHRpb24gaXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbGV2ZWwgb2YgZW5jcnlwdGlvbiBhcHBsaWVkIHRvIHRoZQorLy8gc2Vzc2lvbiwgb3IgbnVsbCBpZiBubyBlbmNyeXB0aW9uIHdpbGwgYmUgdXNlZC4KKworI2lmbmRlZiBfX1JGQl9DU0VDVVJJVFlfSF9fCisjZGVmaW5lIF9fUkZCX0NTRUNVUklUWV9IX18KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIENDb25uZWN0aW9uOworICBjbGFzcyBDU2VjdXJpdHkgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+Q1NlY3VyaXR5KCkge30KKyAgICB2aXJ0dWFsIGJvb2wgcHJvY2Vzc01zZyhDQ29ubmVjdGlvbiogY2MpPTA7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzOyB9CisgICAgdmlydHVhbCBpbnQgZ2V0VHlwZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKCkgY29uc3QgPSAwOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NTZWN1cml0eU5vbmUuaCBiL2NvbW1vbi9yZmIvQ1NlY3VyaXR5Tm9uZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzEwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NTZWN1cml0eU5vbmUuaApAQCAtMCwwICsxLDM2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gQ1NlY3VyaXR5Tm9uZS5oCisvLworCisjaWZuZGVmIF9fQ1NFQ1VSSVRZTk9ORV9IX18KKyNkZWZpbmUgX19DU0VDVVJJVFlOT05FX0hfXworCisjaW5jbHVkZSA8cmZiL0NTZWN1cml0eS5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBDU2VjdXJpdHlOb25lIDogcHVibGljIENTZWN1cml0eSB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgcHJvY2Vzc01zZyhDQ29ubmVjdGlvbiogY2MpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGludCBnZXRUeXBlKCkgY29uc3Qge3JldHVybiBzZWNUeXBlTm9uZTt9CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbigpIGNvbnN0IHtyZXR1cm4gIk5vIEVuY3J5cHRpb24iO30KKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9DU2VjdXJpdHlWbmNBdXRoLmN4eCBiL2NvbW1vbi9yZmIvQ1NlY3VyaXR5Vm5jQXV0aC5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1YTMwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ1NlY3VyaXR5Vm5jQXV0aC5jeHgKQEAgLTAsMCArMSw3NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIENTZWN1cml0eVZuY0F1dGgKKy8vCisvLyBYWFggbm90IHRocmVhZC1zYWZlLCBiZWNhdXNlIGQzZGVzIGlzbid0IC0gZG8gd2UgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzPworLy8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cmZiL0NDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8cmZiL1VzZXJQYXNzd2RHZXR0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvUGFzc3dvcmQuaD4KKyNpbmNsdWRlIDxyZmIvQ1NlY3VyaXR5Vm5jQXV0aC5oPgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxyZmIvZDNkZXMuaD4KK30KKworCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitzdGF0aWMgY29uc3QgaW50IHZuY0F1dGhDaGFsbGVuZ2VTaXplID0gMTY7CisKKworQ1NlY3VyaXR5Vm5jQXV0aDo6Q1NlY3VyaXR5Vm5jQXV0aChVc2VyUGFzc3dkR2V0dGVyKiB1cGdfKQorICA6IHVwZyh1cGdfKQoreworfQorCitDU2VjdXJpdHlWbmNBdXRoOjp+Q1NlY3VyaXR5Vm5jQXV0aCgpCit7Cit9CisKK2Jvb2wgQ1NlY3VyaXR5Vm5jQXV0aDo6cHJvY2Vzc01zZyhDQ29ubmVjdGlvbiogY2MpCit7CisgIHJkcjo6SW5TdHJlYW0qIGlzID0gY2MtPmdldEluU3RyZWFtKCk7CisgIHJkcjo6T3V0U3RyZWFtKiBvcyA9IGNjLT5nZXRPdXRTdHJlYW0oKTsKKworICAvLyBSZWFkIHRoZSBjaGFsbGVuZ2UgJiBvYnRhaW4gdGhlIHVzZXIncyBwYXNzd29yZAorICByZHI6OlU4IGNoYWxsZW5nZVt2bmNBdXRoQ2hhbGxlbmdlU2l6ZV07CisgIGlzLT5yZWFkQnl0ZXMoY2hhbGxlbmdlLCB2bmNBdXRoQ2hhbGxlbmdlU2l6ZSk7CisgIFBsYWluUGFzc3dkIHBhc3N3ZDsKKyAgdXBnLT5nZXRVc2VyUGFzc3dkKDAsICZwYXNzd2QuYnVmKTsKKworICAvLyBDYWxjdWxhdGUgdGhlIGNvcnJlY3QgcmVzcG9uc2UKKyAgcmRyOjpVOCBrZXlbOF07CisgIGludCBwd2RMZW4gPSBzdHJsZW4ocGFzc3dkLmJ1Zik7CisgIGZvciAoaW50IGk9MDsgaTw4OyBpKyspCisgICAga2V5W2ldID0gaTxwd2RMZW4gPyBwYXNzd2QuYnVmW2ldIDogMDsKKyAgZGVza2V5KGtleSwgRU4wKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCB2bmNBdXRoQ2hhbGxlbmdlU2l6ZTsgaiArPSA4KQorICAgIGRlcyhjaGFsbGVuZ2UraiwgY2hhbGxlbmdlK2opOworCisgIC8vIFJldHVybiB0aGUgcmVzcG9uc2UgdG8gdGhlIHNlcnZlcgorICBvcy0+d3JpdGVCeXRlcyhjaGFsbGVuZ2UsIHZuY0F1dGhDaGFsbGVuZ2VTaXplKTsKKyAgb3MtPmZsdXNoKCk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9DU2VjdXJpdHlWbmNBdXRoLmggYi9jb21tb24vcmZiL0NTZWN1cml0eVZuY0F1dGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDM4ZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9DU2VjdXJpdHlWbmNBdXRoLmgKQEAgLTAsMCArMSwzOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2lmbmRlZiBfX1JGQl9DU0VDVVJJVFlWTkNBVVRIX0hfXworI2RlZmluZSBfX1JGQl9DU0VDVVJJVFlWTkNBVVRIX0hfXworCisjaW5jbHVkZSA8cmZiL0NTZWN1cml0eS5oPgorI2luY2x1ZGUgPHJmYi9zZWNUeXBlcy5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBVc2VyUGFzc3dkR2V0dGVyOworCisgIGNsYXNzIENTZWN1cml0eVZuY0F1dGggOiBwdWJsaWMgQ1NlY3VyaXR5IHsKKyAgcHVibGljOgorICAgIENTZWN1cml0eVZuY0F1dGgoVXNlclBhc3N3ZEdldHRlciogcGcpOworICAgIHZpcnR1YWwgfkNTZWN1cml0eVZuY0F1dGgoKTsKKyAgICB2aXJ0dWFsIGJvb2wgcHJvY2Vzc01zZyhDQ29ubmVjdGlvbiogY2MpOworICAgIHZpcnR1YWwgaW50IGdldFR5cGUoKSBjb25zdCB7cmV0dXJuIHNlY1R5cGVWbmNBdXRoO307CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbigpIGNvbnN0IHtyZXR1cm4gIk5vIEVuY3J5cHRpb24iO30KKyAgcHJpdmF0ZToKKyAgICBVc2VyUGFzc3dkR2V0dGVyKiB1cGc7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvQ29sb3VyQ3ViZS5oIGIvY29tbW9uL3JmYi9Db2xvdXJDdWJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzY2JiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ29sb3VyQ3ViZS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBDb2xvdXJDdWJlIC0gc3RydWN0dXJlIHRvIHJlcHJlc2VudCBhIGNvbG91ciBjdWJlLiAgVGhlIGNvbG91ciBjdWJlIGNvbnNpc3RzCisvLyBvZiBpdHMgZGltZW5zaW9ucyAoblJlZCB4IG5HcmVlbiB4IG5CbHVlKSBhbmQgYSB0YWJsZSBtYXBwaW5nIGFuIChyLGcsYikKKy8vIHRyaXBsZSB0byBhIHBpeGVsIHZhbHVlLgorLy8KKy8vIEEgY29sb3VyIGN1YmUgaXMgdXNlZCBpbiB0d28gY2FzZXMuICBUaGUgZmlyc3QgaXMgaW50ZXJuYWxseSBpbiBhIHZpZXdlcgorLy8gd2hlbiBpdCBjYW5ub3QgdXNlIGEgdHJ1ZUNvbG91ciBmb3JtYXQsIG5vciBjYW4gaXQgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvCisvLyBhIHdyaXRhYmxlIGNvbG91ciBtYXAuICBUaGlzIGlzIG1vc3Qgbm90YWJseSB0aGUgY2FzZSBmb3IgYW4gWCB2aWV3ZXIKKy8vIHdpc2hpbmcgdG8gdXNlIGEgUHNldWRvQ29sb3IgWCBzZXJ2ZXIncyBkZWZhdWx0IGNvbG9ybWFwLgorLy8KKy8vIFRoZSBzZWNvbmQgdXNlIGlzIG9uIHRoZSBzZXJ2ZXIgc2lkZSB3aGVuIGEgY2xpZW50IGhhcyBhc2tlZCBmb3IgYSBjb2xvdXIKKy8vIG1hcCBhbmQgdGhlIHNlcnZlciBpcyB0cnVlQ29sb3VyLiAgSW5zdGVhZCBvZiBzZXR0aW5nIGFuIHVuZXZlbiB0cnVlQ29sb3VyCisvLyBmb3JtYXQgbGlrZSBiZ3IyMzMsIGl0IGNhbiBzZXQgdGhlIGNsaWVudCdzIGNvbG91ciBtYXAgdXAgd2l0aCBhIDZ4Nng2CisvLyBjb2xvdXIgY3ViZS4gIEZvciB0aGlzIHVzZSB0aGUgY29sb3VyIGN1YmUgdGFibGUgaGFzIGEgbnVsbCBtYXBwaW5nLCB3aGljaAorLy8gbWFrZXMgaXQgZWFzeSB0byBwZXJmb3JtIHRoZSByZXZlcnNlIGxvb2t1cCBvcGVyYXRpb24gZnJvbSBwaXhlbCB2YWx1ZSB0bworLy8gcixnLGIgdmFsdWVzLgorCisjaWZuZGVmIF9fUkZCX0NPTE9VUkNVQkVfSF9fCisjZGVmaW5lIF9fUkZCX0NPTE9VUkNVQkVfSF9fCisKKyNpbmNsdWRlIDxyZmIvUGl4ZWwuaD4KKyNpbmNsdWRlIDxyZmIvQ29sb3VyTWFwLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIENvbG91ckN1YmUgOiBwdWJsaWMgQ29sb3VyTWFwIHsKKyAgcHVibGljOgorICAgIENvbG91ckN1YmUoaW50IG5yLCBpbnQgbmcsIGludCBuYiwgUGl4ZWwqIHRhYmxlXz0wKQorICAgICAgOiBuUmVkKG5yKSwgbkdyZWVuKG5nKSwgbkJsdWUobmIpLCB0YWJsZSh0YWJsZV8pLCBkZWxldGVUYWJsZShmYWxzZSkKKyAgICB7CisgICAgICBpZiAoIXRhYmxlKSB7CisgICAgICAgIHRhYmxlID0gbmV3IFBpeGVsW3NpemUoKV07CisgICAgICAgIGRlbGV0ZVRhYmxlID0gdHJ1ZTsKKyAgICAgICAgLy8gc2V0IGEgbnVsbCBtYXBwaW5nIGJ5IGRlZmF1bHQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykKKyAgICAgICAgICB0YWJsZVtpXSA9IGk7CisgICAgICB9CisgICAgfQorCisgICAgQ29sb3VyQ3ViZSgpIDogZGVsZXRlVGFibGUoZmFsc2UpIHt9CisKKyAgICB2aXJ0dWFsIH5Db2xvdXJDdWJlKCkgeworICAgICAgaWYgKGRlbGV0ZVRhYmxlKSBkZWxldGUgW10gdGFibGU7CisgICAgfQorCisgICAgdm9pZCBzZXQoaW50IHIsIGludCBnLCBpbnQgYiwgUGl4ZWwgcCkgeworICAgICAgdGFibGVbKHIgKiBuR3JlZW4gKyBnKSAqIG5CbHVlICsgYl0gPSBwOworICAgIH0KKworICAgIFBpeGVsIGxvb2t1cChpbnQgciwgaW50IGcsIGludCBiKSBjb25zdCB7CisgICAgICByZXR1cm4gdGFibGVbKHIgKiBuR3JlZW4gKyBnKSAqIG5CbHVlICsgYl07CisgICAgfQorCisgICAgaW50IHNpemUoKSAgICAgIGNvbnN0IHsgcmV0dXJuIG5SZWQqbkdyZWVuKm5CbHVlOyB9CisgICAgaW50IHJlZE11bHQoKSAgIGNvbnN0IHsgcmV0dXJuIG5HcmVlbipuQmx1ZTsgfQorICAgIGludCBncmVlbk11bHQoKSBjb25zdCB7IHJldHVybiBuQmx1ZTsgfQorICAgIGludCBibHVlTXVsdCgpICBjb25zdCB7IHJldHVybiAxOyB9CisKKyAgICAvLyBDb2xvdXJNYXAgbG9va3VwKCkgbWV0aG9kLiAgTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyB3aGVuIHRoZSB0YWJsZSBoYXMKKyAgICAvLyB0aGUgZGVmYXVsdCBudWxsIG1hcHBpbmcuCisgICAgdmlydHVhbCB2b2lkIGxvb2t1cChpbnQgaSwgaW50KiByLCBpbnQqIGcsIGludCogYikgeworICAgICAgaWYgKGkgPj0gc2l6ZSgpKSByZXR1cm47CisgICAgICAqYiA9IGkgJSBuQmx1ZTsKKyAgICAgIGkgLz0gbkJsdWU7CisgICAgICAqZyA9IGkgJSBuR3JlZW47CisgICAgICAqciA9IGkgLyBuR3JlZW47CisgICAgICAqciA9ICgqciAqIDY1NTM1ICsgKG5SZWQtMSkgICAvIDIpIC8gKG5SZWQtMSk7CisgICAgICAqZyA9ICgqZyAqIDY1NTM1ICsgKG5HcmVlbi0xKSAvIDIpIC8gKG5HcmVlbi0xKTsKKyAgICAgICpiID0gKCpiICogNjU1MzUgKyAobkJsdWUtMSkgIC8gMikgLyAobkJsdWUtMSk7CisgICAgfQorCisgICAgaW50IG5SZWQ7CisgICAgaW50IG5HcmVlbjsKKyAgICBpbnQgbkJsdWU7CisgICAgUGl4ZWwqIHRhYmxlOworICAgIGJvb2wgZGVsZXRlVGFibGU7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvQ29sb3VyTWFwLmggYi9jb21tb24vcmZiL0NvbG91ck1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNmNiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NvbG91ck1hcC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpZm5kZWYgX19SRkJfQ09MT1VSTUFQX0hfXworI2RlZmluZSBfX1JGQl9DT0xPVVJNQVBfSF9fCituYW1lc3BhY2UgcmZiIHsKKyAgc3RydWN0IENvbG91ciB7CisgICAgQ29sb3VyKCkgOiByKDApLCBnKDApLCBiKDApIHt9CisgICAgQ29sb3VyKGludCByXywgaW50IGdfLCBpbnQgYl8pIDogcihyXyksIGcoZ18pLCBiKGJfKSB7fQorICAgIGludCByLCBnLCBiOworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb2xvdXImIGMpIGNvbnN0IHtyZXR1cm4gYy5yID09IHIgJiYgYy5nID09IGcgJiYgYy5iID09IGI7fQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb2xvdXImIGMpIGNvbnN0IHtyZXR1cm4gIShjID09ICp0aGlzKTt9CisgIH07CisKKyAgY2xhc3MgQ29sb3VyTWFwIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBsb29rdXAoaW50IGluZGV4LCBpbnQqIHIsIGludCogZywgaW50KiBiKT0wOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NvbXBhcmluZ1VwZGF0ZVRyYWNrZXIuY3h4IGIvY29tbW9uL3JmYi9Db21wYXJpbmdVcGRhdGVUcmFja2VyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTNkNjhhCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9Db21wYXJpbmdVcGRhdGVUcmFja2VyLmN4eApAQCAtMCwwICsxLDEzNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHJkci90eXBlcy5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvQ29tcGFyaW5nVXBkYXRlVHJhY2tlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitDb21wYXJpbmdVcGRhdGVUcmFja2VyOjpDb21wYXJpbmdVcGRhdGVUcmFja2VyKFBpeGVsQnVmZmVyKiBidWZmZXIpCisgIDogZmIoYnVmZmVyKSwgb2xkRmIoZmItPmdldFBGKCksIDAsIDApLCBmaXJzdENvbXBhcmUodHJ1ZSkKK3sKKyAgICBjaGFuZ2VkLmFzc2lnbl91bmlvbihmYi0+Z2V0UmVjdCgpKTsKK30KKworQ29tcGFyaW5nVXBkYXRlVHJhY2tlcjo6fkNvbXBhcmluZ1VwZGF0ZVRyYWNrZXIoKQoreworfQorCisKKyNkZWZpbmUgQkxPQ0tfU0laRSAxNgorCit2b2lkIENvbXBhcmluZ1VwZGF0ZVRyYWNrZXI6OmNvbXBhcmUoKQoreworICBzdGQ6OnZlY3RvcjxSZWN0PiByZWN0czsKKyAgc3RkOjp2ZWN0b3I8UmVjdD46Oml0ZXJhdG9yIGk7CisKKyAgaWYgKGZpcnN0Q29tcGFyZSkgeworICAgIC8vIE5COiBXZSBsZWF2ZSB0aGUgY2hhbmdlIHJlZ2lvbiB1bnRvdWNoZWQgb24gdGhpcyBpdGVyYXRpb24sCisgICAgLy8gc2luY2UgaW4gZWZmZWN0IHRoZSBlbnRpcmUgZnJhbWVidWZmZXIgaGFzIGNoYW5nZWQuCisgICAgb2xkRmIuc2V0U2l6ZShmYi0+d2lkdGgoKSwgZmItPmhlaWdodCgpKTsKKyAgICBmb3IgKGludCB5PTA7IHk8ZmItPmhlaWdodCgpOyB5Kz1CTE9DS19TSVpFKSB7CisgICAgICBSZWN0IHBvcygwLCB5LCBmYi0+d2lkdGgoKSwgX19yZmJtaW4oZmItPmhlaWdodCgpLCB5K0JMT0NLX1NJWkUpKTsKKyAgICAgIGludCBzcmNTdHJpZGU7CisgICAgICBjb25zdCByZHI6OlU4KiBzcmNEYXRhID0gZmItPmdldFBpeGVsc1IocG9zLCAmc3JjU3RyaWRlKTsKKyAgICAgIG9sZEZiLmltYWdlUmVjdChwb3MsIHNyY0RhdGEsIHNyY1N0cmlkZSk7CisgICAgfQorICAgIGZpcnN0Q29tcGFyZSA9IGZhbHNlOworICB9IGVsc2UgeworICAgIGNvcGllZC5nZXRfcmVjdHMoJnJlY3RzLCBjb3B5X2RlbHRhLng8PTAsIGNvcHlfZGVsdGEueTw9MCk7CisgICAgZm9yIChpID0gcmVjdHMuYmVnaW4oKTsgaSAhPSByZWN0cy5lbmQoKTsgaSsrKQorICAgICAgb2xkRmIuY29weVJlY3QoKmksIGNvcHlfZGVsdGEpOworCisgICAgUmVnaW9uIHRvX2NoZWNrID0gY2hhbmdlZC51bmlvbl8oY29waWVkKTsKKyAgICB0b19jaGVjay5nZXRfcmVjdHMoJnJlY3RzKTsKKworICAgIFJlZ2lvbiBuZXdDaGFuZ2VkOworICAgIGZvciAoaSA9IHJlY3RzLmJlZ2luKCk7IGkgIT0gcmVjdHMuZW5kKCk7IGkrKykKKyAgICAgIGNvbXBhcmVSZWN0KCppLCAmbmV3Q2hhbmdlZCk7CisKKyAgICBjb3BpZWQuYXNzaWduX3N1YnRyYWN0KG5ld0NoYW5nZWQpOworICAgIGNoYW5nZWQgPSBuZXdDaGFuZ2VkOworICB9Cit9CisKK3ZvaWQgQ29tcGFyaW5nVXBkYXRlVHJhY2tlcjo6Y29tcGFyZVJlY3QoY29uc3QgUmVjdCYgciwgUmVnaW9uKiBuZXdDaGFuZ2VkKQoreworICBpZiAoIXIuZW5jbG9zZWRfYnkoZmItPmdldFJlY3QoKSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiQ29tcGFyaW5nVXBkYXRlVHJhY2tlcjogcmVjdCBvdXRzaWRlIGZiICglZCwlZC0lZCwlZClcbiIsIHIudGwueCwgci50bC55LCByLmJyLngsIHIuYnIueSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IGJ5dGVzUGVyUGl4ZWwgPSBmYi0+Z2V0UEYoKS5icHAvODsKKyAgaW50IG9sZFN0cmlkZTsKKyAgcmRyOjpVOCogb2xkRGF0YSA9IG9sZEZiLmdldFBpeGVsc1JXKHIsICZvbGRTdHJpZGUpOworICBpbnQgb2xkU3RyaWRlQnl0ZXMgPSBvbGRTdHJpZGUgKiBieXRlc1BlclBpeGVsOworCisgIHN0ZDo6dmVjdG9yPFJlY3Q+IGNoYW5nZWRCbG9ja3M7CisKKyAgZm9yIChpbnQgYmxvY2tUb3AgPSByLnRsLnk7IGJsb2NrVG9wIDwgci5ici55OyBibG9ja1RvcCArPSBCTE9DS19TSVpFKQorICB7CisgICAgLy8gR2V0IGEgc3RyaXAgb2YgdGhlIHNvdXJjZSBidWZmZXIKKyAgICBSZWN0IHBvcyhyLnRsLngsIGJsb2NrVG9wLCByLmJyLngsIF9fcmZibWluKHIuYnIueSwgYmxvY2tUb3ArQkxPQ0tfU0laRSkpOworICAgIGludCBmYlN0cmlkZTsKKyAgICBjb25zdCByZHI6OlU4KiBuZXdCbG9ja1B0ciA9IGZiLT5nZXRQaXhlbHNSKHBvcywgJmZiU3RyaWRlKTsKKyAgICBpbnQgbmV3U3RyaWRlQnl0ZXMgPSBmYlN0cmlkZSAqIGJ5dGVzUGVyUGl4ZWw7CisKKyAgICByZHI6OlU4KiBvbGRCbG9ja1B0ciA9IG9sZERhdGE7CisgICAgaW50IGJsb2NrQm90dG9tID0gX19yZmJtaW4oYmxvY2tUb3ArQkxPQ0tfU0laRSwgci5ici55KTsKKworICAgIGZvciAoaW50IGJsb2NrTGVmdCA9IHIudGwueDsgYmxvY2tMZWZ0IDwgci5ici54OyBibG9ja0xlZnQgKz0gQkxPQ0tfU0laRSkKKyAgICB7CisgICAgICBjb25zdCByZHI6OlU4KiBuZXdQdHIgPSBuZXdCbG9ja1B0cjsKKyAgICAgIHJkcjo6VTgqIG9sZFB0ciA9IG9sZEJsb2NrUHRyOworCisgICAgICBpbnQgYmxvY2tSaWdodCA9IF9fcmZibWluKGJsb2NrTGVmdCtCTE9DS19TSVpFLCByLmJyLngpOworICAgICAgaW50IGJsb2NrV2lkdGhJbkJ5dGVzID0gKGJsb2NrUmlnaHQtYmxvY2tMZWZ0KSAqIGJ5dGVzUGVyUGl4ZWw7CisKKyAgICAgIGZvciAoaW50IHkgPSBibG9ja1RvcDsgeSA8IGJsb2NrQm90dG9tOyB5KyspCisgICAgICB7CisgICAgICAgIGlmIChtZW1jbXAob2xkUHRyLCBuZXdQdHIsIGJsb2NrV2lkdGhJbkJ5dGVzKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgLy8gQSBibG9jayBoYXMgY2hhbmdlZCAtIGNvcHkgdGhlIHJlbWFpbmRlciB0byB0aGUgb2xkRmIKKyAgICAgICAgICBjaGFuZ2VkQmxvY2tzLnB1c2hfYmFjayhSZWN0KGJsb2NrTGVmdCwgYmxvY2tUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1JpZ2h0LCBibG9ja0JvdHRvbSkpOworICAgICAgICAgIGZvciAoaW50IHkyID0geTsgeTIgPCBibG9ja0JvdHRvbTsgeTIrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkob2xkUHRyLCBuZXdQdHIsIGJsb2NrV2lkdGhJbkJ5dGVzKTsKKyAgICAgICAgICAgIG5ld1B0ciArPSBuZXdTdHJpZGVCeXRlczsKKyAgICAgICAgICAgIG9sZFB0ciArPSBvbGRTdHJpZGVCeXRlczsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBuZXdQdHIgKz0gbmV3U3RyaWRlQnl0ZXM7CisgICAgICAgIG9sZFB0ciArPSBvbGRTdHJpZGVCeXRlczsKKyAgICAgIH0KKworICAgICAgb2xkQmxvY2tQdHIgKz0gYmxvY2tXaWR0aEluQnl0ZXM7CisgICAgICBuZXdCbG9ja1B0ciArPSBibG9ja1dpZHRoSW5CeXRlczsKKyAgICB9CisKKyAgICBvbGREYXRhICs9IG9sZFN0cmlkZUJ5dGVzICogQkxPQ0tfU0laRTsKKyAgfQorCisgIGlmICghY2hhbmdlZEJsb2Nrcy5lbXB0eSgpKSB7CisgICAgUmVnaW9uIHRlbXA7CisgICAgdGVtcC5zZXRPcmRlcmVkUmVjdHMoY2hhbmdlZEJsb2Nrcyk7CisgICAgbmV3Q2hhbmdlZC0+YXNzaWduX3VuaW9uKHRlbXApOworICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0NvbXBhcmluZ1VwZGF0ZVRyYWNrZXIuaCBiL2NvbW1vbi9yZmIvQ29tcGFyaW5nVXBkYXRlVHJhY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMmU1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0NvbXBhcmluZ1VwZGF0ZVRyYWNrZXIuaApAQCAtMCwwICsxLDQzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpZm5kZWYgX19SRkJfQ09NUEFSSU5HVVBEQVRFVFJBQ0tFUl9IX18KKyNkZWZpbmUgX19SRkJfQ09NUEFSSU5HVVBEQVRFVFJBQ0tFUl9IX18KKworI2luY2x1ZGUgPHJmYi9VcGRhdGVUcmFja2VyLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIENvbXBhcmluZ1VwZGF0ZVRyYWNrZXIgOiBwdWJsaWMgU2ltcGxlVXBkYXRlVHJhY2tlciB7CisgIHB1YmxpYzoKKyAgICBDb21wYXJpbmdVcGRhdGVUcmFja2VyKFBpeGVsQnVmZmVyKiBidWZmZXIpOworICAgIH5Db21wYXJpbmdVcGRhdGVUcmFja2VyKCk7CisKKyAgICAvLyBjb21wYXJlKCkgZG9lcyB0aGUgY29tcGFyaXNvbiBhbmQgcmVkdWNlcyBpdHMgY2hhbmdlZCBhbmQgY29waWVkIHJlZ2lvbnMKKyAgICAvLyBhcyBhcHByb3ByaWF0ZS4KKworICAgIHZpcnR1YWwgdm9pZCBjb21wYXJlKCk7CisgIHByaXZhdGU6CisgICAgdm9pZCBjb21wYXJlUmVjdChjb25zdCBSZWN0JiByLCBSZWdpb24qIG5ld2NoYW5nZWQpOworICAgIFBpeGVsQnVmZmVyKiBmYjsKKyAgICBNYW5hZ2VkUGl4ZWxCdWZmZXIgb2xkRmI7CisgICAgYm9vbCBmaXJzdENvbXBhcmU7CisgIH07CisKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9Db25maWd1cmF0aW9uLmN4eCBiL2NvbW1vbi9yZmIvQ29uZmlndXJhdGlvbi5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViYzIwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ29uZmlndXJhdGlvbi5jeHgKQEAgLTAsMCArMSw0NjYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IENlbmRpbyBBQi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gLT0tIENvbmZpZ3VyYXRpb24uY3h4CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2lmZGVmIFdJTjMyCisjZGVmaW5lIHN0cmNhc2VjbXAgX3N0cmljbXAKKyNkZWZpbmUgc3RybmNhc2VjbXAgX3N0cm5pY21wCisjZW5kaWYKKworI2luY2x1ZGUgPHJmYi91dGlsLmg+CisjaW5jbHVkZSA8cmZiL0NvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxyZmIvTG9nV3JpdGVyLmg+CisjaW5jbHVkZSA8cmZiL0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHJmYi9UaHJlYWRpbmcuaD4KKworI2lmZGVmIF9fUkZCX1RIUkVBRElOR19JTVBMCisvLyBPbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IFRocmVhZGluZywgd2UgdXNlIExvY2tzIHRvIG1ha2UgZ2V0RGF0YSBzYWZlCisjZGVmaW5lIExPQ0tfQ09ORklHIExvY2sgbCgqY29uZmlnTG9jaygpKQorcmZiOjpNdXRleCogY29uZmlnTG9ja18gPSAwOworc3RhdGljIHJmYjo6TXV0ZXgqIGNvbmZpZ0xvY2soKSB7CisgIGlmICghY29uZmlnTG9ja18pCisgICAgY29uZmlnTG9ja18gPSBuZXcgcmZiOjpNdXRleDsKKyAgcmV0dXJuIGNvbmZpZ0xvY2tfOworfQorI2Vsc2UKKyNkZWZpbmUgTE9DS19DT05GSUcKKyNlbmRpZgorCisjaW5jbHVkZSA8cmRyL0hleE91dFN0cmVhbS5oPgorI2luY2x1ZGUgPHJkci9IZXhJblN0cmVhbS5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitzdGF0aWMgTG9nV3JpdGVyIHZsb2coIkNvbmZpZyIpOworCisKKy8vIC09LSBUaGUgR2xvYmFsIENvbmZpZ3VyYXRpb24gb2JqZWN0CitDb25maWd1cmF0aW9uKiBDb25maWd1cmF0aW9uOjpnbG9iYWxfID0gMDsKK0NvbmZpZ3VyYXRpb24qIENvbmZpZ3VyYXRpb246Omdsb2JhbCgpIHsKKyAgaWYgKCFnbG9iYWxfKQorICAgIGdsb2JhbF8gPSBuZXcgQ29uZmlndXJhdGlvbigiR2xvYmFsIik7CisgIHJldHVybiBnbG9iYWxfOworfQorCisKKy8vIC09LSBDb25maWd1cmF0aW9uIGltcGxlbWVudGF0aW9uCisKK0NvbmZpZ3VyYXRpb246OkNvbmZpZ3VyYXRpb24oY29uc3QgY2hhciogbmFtZV8sIENvbmZpZ3VyYXRpb24qIGF0dGFjaFRvR3JvdXApIAorOiBuYW1lKHN0ckR1cChuYW1lXykpLCBoZWFkKDApLCBfbmV4dCgwKSB7CisgIGlmIChhdHRhY2hUb0dyb3VwKSB7CisgICAgX25leHQgPSBhdHRhY2hUb0dyb3VwLT5fbmV4dDsKKyAgICBhdHRhY2hUb0dyb3VwLT5fbmV4dCA9IHRoaXM7CisgIH0KK30KKworQ29uZmlndXJhdGlvbiYgQ29uZmlndXJhdGlvbjo6b3BlcmF0b3I9KGNvbnN0IENvbmZpZ3VyYXRpb24mIHNyYykgeworICBWb2lkUGFyYW1ldGVyKiBjdXJyZW50ID0gaGVhZDsKKyAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICBWb2lkUGFyYW1ldGVyKiBzcmNQYXJhbSA9ICgoQ29uZmlndXJhdGlvbiYpc3JjKS5nZXQoY3VycmVudC0+Z2V0TmFtZSgpKTsKKyAgICBpZiAoc3JjUGFyYW0pIHsKKyAgICAgIGN1cnJlbnQtPmltbXV0YWJsZSA9IGZhbHNlOworICAgICAgQ2hhckFycmF5IHZhbHVlKHNyY1BhcmFtLT5nZXRWYWx1ZVN0cigpKTsKKyAgICAgIHZsb2cuZGVidWcoIm9wZXJhdG9yPSglcywgJXMpIiwgY3VycmVudC0+Z2V0TmFtZSgpLCB2YWx1ZS5idWYpOworICAgICAgY3VycmVudC0+c2V0UGFyYW0odmFsdWUuYnVmKTsKKyAgICB9CisgICAgY3VycmVudCA9IGN1cnJlbnQtPl9uZXh0OworICB9CisgIGlmIChfbmV4dCkKKyAgICAqX25leHQ9c3JjOworICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgQ29uZmlndXJhdGlvbjo6c2V0KGNvbnN0IGNoYXIqIG4sIGNvbnN0IGNoYXIqIHYsIGJvb2wgaW1tdXRhYmxlKSB7CisgIHJldHVybiBzZXQobiwgc3RybGVuKG4pLCB2LCBpbW11dGFibGUpOworfQorCitib29sIENvbmZpZ3VyYXRpb246OnNldChjb25zdCBjaGFyKiBuYW1lLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWwsIGJvb2wgaW1tdXRhYmxlKQoreworICBWb2lkUGFyYW1ldGVyKiBjdXJyZW50ID0gaGVhZDsKKyAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICBpZiAoKGludClzdHJsZW4oY3VycmVudC0+Z2V0TmFtZSgpKSA9PSBsZW4gJiYKKyAgICAgICAgc3RybmNhc2VjbXAoY3VycmVudC0+Z2V0TmFtZSgpLCBuYW1lLCBsZW4pID09IDApCisgICAgeworICAgICAgYm9vbCBiID0gY3VycmVudC0+c2V0UGFyYW0odmFsKTsKKyAgICAgIGN1cnJlbnQtPnNldEhhc0JlZW5TZXQoKTsgCisgICAgICBpZiAoYiAmJiBpbW11dGFibGUpIAorCWN1cnJlbnQtPnNldEltbXV0YWJsZSgpOworICAgICAgcmV0dXJuIGI7CisgICAgfQorICAgIGN1cnJlbnQgPSBjdXJyZW50LT5fbmV4dDsKKyAgfQorICByZXR1cm4gX25leHQgPyBfbmV4dC0+c2V0KG5hbWUsIGxlbiwgdmFsLCBpbW11dGFibGUpIDogZmFsc2U7Cit9CisKK2Jvb2wgQ29uZmlndXJhdGlvbjo6c2V0KGNvbnN0IGNoYXIqIGNvbmZpZywgYm9vbCBpbW11dGFibGUpIHsKKyAgYm9vbCBoeXBoZW4gPSBmYWxzZTsKKyAgaWYgKGNvbmZpZ1swXSA9PSAnLScpIHsKKyAgICBoeXBoZW4gPSB0cnVlOworICAgIGNvbmZpZysrOworICAgIGlmIChjb25maWdbMF0gPT0gJy0nKSBjb25maWcrKzsgLy8gYWxsb3cgZ251LXN0eWxlIC0tPG9wdGlvbj4KKyAgfQorICBjb25zdCBjaGFyKiBlcXVhbCA9IHN0cmNocihjb25maWcsICc9Jyk7CisgIGlmIChlcXVhbCkgeworICAgIHJldHVybiBzZXQoY29uZmlnLCBlcXVhbC1jb25maWcsIGVxdWFsKzEsIGltbXV0YWJsZSk7CisgIH0gZWxzZSBpZiAoaHlwaGVuKSB7CisgICAgVm9pZFBhcmFtZXRlciogY3VycmVudCA9IGhlYWQ7CisgICAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICAgIGlmIChzdHJjYXNlY21wKGN1cnJlbnQtPmdldE5hbWUoKSwgY29uZmlnKSA9PSAwKSB7CisgICAgICAgIGJvb2wgYiA9IGN1cnJlbnQtPnNldFBhcmFtKCk7CisJY3VycmVudC0+c2V0SGFzQmVlblNldCgpOyAKKyAgICAgICAgaWYgKGIgJiYgaW1tdXRhYmxlKSAKKwkgIGN1cnJlbnQtPnNldEltbXV0YWJsZSgpOworICAgICAgICByZXR1cm4gYjsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5fbmV4dDsKKyAgICB9CisgIH0gICAgCisgIHJldHVybiBfbmV4dCA/IF9uZXh0LT5zZXQoY29uZmlnLCBpbW11dGFibGUpIDogZmFsc2U7Cit9CisKK1ZvaWRQYXJhbWV0ZXIqIENvbmZpZ3VyYXRpb246OmdldChjb25zdCBjaGFyKiBwYXJhbSkKK3sKKyAgVm9pZFBhcmFtZXRlciogY3VycmVudCA9IGhlYWQ7CisgIHdoaWxlIChjdXJyZW50KSB7CisgICAgaWYgKHN0cmNhc2VjbXAoY3VycmVudC0+Z2V0TmFtZSgpLCBwYXJhbSkgPT0gMCkKKyAgICAgIHJldHVybiBjdXJyZW50OworICAgIGN1cnJlbnQgPSBjdXJyZW50LT5fbmV4dDsKKyAgfQorICByZXR1cm4gX25leHQgPyBfbmV4dC0+Z2V0KHBhcmFtKSA6IDA7Cit9CisKK3ZvaWQgQ29uZmlndXJhdGlvbjo6bGlzdChpbnQgd2lkdGgsIGludCBuYW1lV2lkdGgpIHsKKyAgVm9pZFBhcmFtZXRlciogY3VycmVudCA9IGhlYWQ7CisKKyAgZnByaW50ZihzdGRlcnIsICIlcyBQYXJhbWV0ZXJzOlxuIiwgbmFtZS5idWYpOworICB3aGlsZSAoY3VycmVudCkgeworICAgIGNoYXIqIGRlZl9zdHIgPSBjdXJyZW50LT5nZXREZWZhdWx0U3RyKCk7CisgICAgY29uc3QgY2hhciogZGVzYyA9IGN1cnJlbnQtPmdldERlc2NyaXB0aW9uKCk7CisgICAgZnByaW50ZihzdGRlcnIsIiAgJS0qcyAtIiwgbmFtZVdpZHRoLCBjdXJyZW50LT5nZXROYW1lKCkpOworICAgIGludCBjb2x1bW4gPSBzdHJsZW4oY3VycmVudC0+Z2V0TmFtZSgpKTsKKyAgICBpZiAoY29sdW1uIDwgbmFtZVdpZHRoKSBjb2x1bW4gPSBuYW1lV2lkdGg7CisgICAgY29sdW1uICs9IDQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGNvbnN0IGNoYXIqIHMgPSBzdHJjaHIoZGVzYywgJyAnKTsKKyAgICAgIGludCB3b3JkTGVuOworICAgICAgaWYgKHMpIHdvcmRMZW4gPSBzLWRlc2M7CisgICAgICBlbHNlIHdvcmRMZW4gPSBzdHJsZW4oZGVzYyk7CisKKyAgICAgIGlmIChjb2x1bW4gKyB3b3JkTGVuICsgMSA+IHdpZHRoKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJcbiUqcyIsbmFtZVdpZHRoKzQsIiIpOworICAgICAgICBjb2x1bW4gPSBuYW1lV2lkdGgrNDsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCIgJS4qcyIsd29yZExlbixkZXNjKTsKKyAgICAgIGNvbHVtbiArPSB3b3JkTGVuICsgMTsKKyAgICAgIGRlc2MgKz0gd29yZExlbiArIDE7CisgICAgICBpZiAoIXMpIGJyZWFrOworICAgIH0KKworICAgIGlmIChkZWZfc3RyKSB7CisgICAgICBpZiAoY29sdW1uICsgKGludClzdHJsZW4oZGVmX3N0cikgKyAxMSA+IHdpZHRoKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG4lKnMiLG5hbWVXaWR0aCs0LCIiKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCIgKGRlZmF1bHQ9JXMpXG4iLGRlZl9zdHIpOworICAgICAgc3RyRnJlZShkZWZfc3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgICAgfQorICAgIGN1cnJlbnQgPSBjdXJyZW50LT5fbmV4dDsKKyAgfQorCisgIGlmIChfbmV4dCkKKyAgICBfbmV4dC0+bGlzdCh3aWR0aCwgbmFtZVdpZHRoKTsKK30KKworCisvLyAtPS0gVm9pZFBhcmFtZXRlcgorCitWb2lkUGFyYW1ldGVyOjpWb2lkUGFyYW1ldGVyKGNvbnN0IGNoYXIqIG5hbWVfLCBjb25zdCBjaGFyKiBkZXNjXywgQ29uZmlndXJhdGlvbiogY29uZikKKyAgOiBpbW11dGFibGUoZmFsc2UpLCBfaGFzQmVlblNldChmYWxzZSksIG5hbWUobmFtZV8pLCBkZXNjcmlwdGlvbihkZXNjXykgeworICBpZiAoIWNvbmYpCisgICAgY29uZiA9IENvbmZpZ3VyYXRpb246Omdsb2JhbCgpOworICBfbmV4dCA9IGNvbmYtPmhlYWQ7CisgIGNvbmYtPmhlYWQgPSB0aGlzOworfQorCitWb2lkUGFyYW1ldGVyOjp+Vm9pZFBhcmFtZXRlcigpIHsKK30KKworY29uc3QgY2hhcioKK1ZvaWRQYXJhbWV0ZXI6OmdldE5hbWUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lOworfQorCitjb25zdCBjaGFyKgorVm9pZFBhcmFtZXRlcjo6Z2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgIHJldHVybiBkZXNjcmlwdGlvbjsKK30KKworYm9vbCBWb2lkUGFyYW1ldGVyOjpzZXRQYXJhbSgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFZvaWRQYXJhbWV0ZXI6OmlzQm9vbCgpIGNvbnN0IHsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkCitWb2lkUGFyYW1ldGVyOjpzZXRJbW11dGFibGUoKSB7CisgIHZsb2cuZGVidWcoInNldCBpbW11dGFibGUgJXMiLCBnZXROYW1lKCkpOworICBpbW11dGFibGUgPSB0cnVlOworfQorCit2b2lkCitWb2lkUGFyYW1ldGVyOjpzZXRIYXNCZWVuU2V0KCkgeworICBfaGFzQmVlblNldCA9IHRydWU7Cit9IAorCitib29sCitWb2lkUGFyYW1ldGVyOjpoYXNCZWVuU2V0KCkgeworICByZXR1cm4gX2hhc0JlZW5TZXQ7Cit9CisKKy8vIC09LSBBbGlhc1BhcmFtZXRlcgorCitBbGlhc1BhcmFtZXRlcjo6QWxpYXNQYXJhbWV0ZXIoY29uc3QgY2hhciogbmFtZV8sIGNvbnN0IGNoYXIqIGRlc2NfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvaWRQYXJhbWV0ZXIqIHBhcmFtXywgQ29uZmlndXJhdGlvbiogY29uZikKKyAgOiBWb2lkUGFyYW1ldGVyKG5hbWVfLCBkZXNjXywgY29uZiksIHBhcmFtKHBhcmFtXykgeworfQorCitib29sCitBbGlhc1BhcmFtZXRlcjo6c2V0UGFyYW0oY29uc3QgY2hhciogdikgeworICByZXR1cm4gcGFyYW0tPnNldFBhcmFtKHYpOworfQorCitib29sIEFsaWFzUGFyYW1ldGVyOjpzZXRQYXJhbSgpIHsKKyAgcmV0dXJuIHBhcmFtLT5zZXRQYXJhbSgpOworfQorCitjaGFyKgorQWxpYXNQYXJhbWV0ZXI6OmdldERlZmF1bHRTdHIoKSBjb25zdCB7CisgIHJldHVybiAwOworfQorCitjaGFyKiBBbGlhc1BhcmFtZXRlcjo6Z2V0VmFsdWVTdHIoKSBjb25zdCB7CisgIHJldHVybiBwYXJhbS0+Z2V0VmFsdWVTdHIoKTsKK30KKworYm9vbCBBbGlhc1BhcmFtZXRlcjo6aXNCb29sKCkgY29uc3QgeworICByZXR1cm4gcGFyYW0tPmlzQm9vbCgpOworfQorCit2b2lkCitBbGlhc1BhcmFtZXRlcjo6c2V0SW1tdXRhYmxlKCkgeworICB2bG9nLmRlYnVnKCJzZXQgaW1tdXRhYmxlICVzIChBbGlhcykiLCBnZXROYW1lKCkpOworICBwYXJhbS0+c2V0SW1tdXRhYmxlKCk7Cit9CisKKworLy8gLT0tIEJvb2xQYXJhbWV0ZXIKKworQm9vbFBhcmFtZXRlcjo6Qm9vbFBhcmFtZXRlcihjb25zdCBjaGFyKiBuYW1lXywgY29uc3QgY2hhciogZGVzY18sIGJvb2wgdiwgQ29uZmlndXJhdGlvbiogY29uZikKKzogVm9pZFBhcmFtZXRlcihuYW1lXywgZGVzY18sIGNvbmYpLCB2YWx1ZSh2KSwgZGVmX3ZhbHVlKHYpIHsKK30KKworYm9vbAorQm9vbFBhcmFtZXRlcjo6c2V0UGFyYW0oY29uc3QgY2hhciogdikgeworICBpZiAoaW1tdXRhYmxlKSByZXR1cm4gdHJ1ZTsKKworICBpZiAoKnYgPT0gMCB8fCBzdHJjYXNlY21wKHYsICIxIikgPT0gMCB8fCBzdHJjYXNlY21wKHYsICJvbiIpID09IDAKKyAgICAgIHx8IHN0cmNhc2VjbXAodiwgInRydWUiKSA9PSAwIHx8IHN0cmNhc2VjbXAodiwgInllcyIpID09IDApCisgICAgdmFsdWUgPSAxOworICBlbHNlIGlmIChzdHJjYXNlY21wKHYsICIwIikgPT0gMCB8fCBzdHJjYXNlY21wKHYsICJvZmYiKSA9PSAwCisgICAgICAgICAgIHx8IHN0cmNhc2VjbXAodiwgImZhbHNlIikgPT0gMCB8fCBzdHJjYXNlY21wKHYsICJubyIpID09IDApCisgICAgdmFsdWUgPSAwOworICBlbHNlIHsKKyAgICB2bG9nLmVycm9yKCJCb29sIHBhcmFtZXRlciAlczogaW52YWxpZCB2YWx1ZSAnJXMnIiwgZ2V0TmFtZSgpLCB2KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2bG9nLmRlYnVnKCJzZXQgJXMoQm9vbCkgdG8gJXMoJWQpIiwgZ2V0TmFtZSgpLCB2LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEJvb2xQYXJhbWV0ZXI6OnNldFBhcmFtKCkgeworICBzZXRQYXJhbSh0cnVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQm9vbFBhcmFtZXRlcjo6c2V0UGFyYW0oYm9vbCBiKSB7CisgIGlmIChpbW11dGFibGUpIHJldHVybjsKKyAgdmFsdWUgPSBiOworICB2bG9nLmRlYnVnKCJzZXQgJXMoQm9vbCkgdG8gJWQiLCBnZXROYW1lKCksIHZhbHVlKTsKK30KKworY2hhcioKK0Jvb2xQYXJhbWV0ZXI6OmdldERlZmF1bHRTdHIoKSBjb25zdCB7CisgIHJldHVybiBzdHJEdXAoZGVmX3ZhbHVlID8gIjEiIDogIjAiKTsKK30KKworY2hhciogQm9vbFBhcmFtZXRlcjo6Z2V0VmFsdWVTdHIoKSBjb25zdCB7CisgIHJldHVybiBzdHJEdXAodmFsdWUgPyAiMSIgOiAiMCIpOworfQorCitib29sIEJvb2xQYXJhbWV0ZXI6OmlzQm9vbCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0Jvb2xQYXJhbWV0ZXI6Om9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgIHJldHVybiB2YWx1ZTsKK30KKworLy8gLT0tIEludFBhcmFtZXRlcgorCitJbnRQYXJhbWV0ZXI6OkludFBhcmFtZXRlcihjb25zdCBjaGFyKiBuYW1lXywgY29uc3QgY2hhciogZGVzY18sIGludCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblZhbHVlXywgaW50IG1heFZhbHVlXywgQ29uZmlndXJhdGlvbiogY29uZikKKyAgOiBWb2lkUGFyYW1ldGVyKG5hbWVfLCBkZXNjXywgY29uZiksIHZhbHVlKHYpLCBkZWZfdmFsdWUodiksCisgICAgbWluVmFsdWUobWluVmFsdWVfKSwgbWF4VmFsdWUobWF4VmFsdWVfKQoreworfQorCitib29sCitJbnRQYXJhbWV0ZXI6OnNldFBhcmFtKGNvbnN0IGNoYXIqIHYpIHsKKyAgaWYgKGltbXV0YWJsZSkgcmV0dXJuIHRydWU7CisgIHZsb2cuZGVidWcoInNldCAlcyhJbnQpIHRvICVzIiwgZ2V0TmFtZSgpLCB2KTsKKyAgaW50IGkgPSBhdG9pKHYpOworICBpZiAoaSA8IG1pblZhbHVlIHx8IGkgPiBtYXhWYWx1ZSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHZhbHVlID0gaTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK0ludFBhcmFtZXRlcjo6c2V0UGFyYW0oaW50IHYpIHsKKyAgaWYgKGltbXV0YWJsZSkgcmV0dXJuIHRydWU7CisgIHZsb2cuZGVidWcoInNldCAlcyhJbnQpIHRvICVkIiwgZ2V0TmFtZSgpLCB2KTsKKyAgaWYgKHYgPCBtaW5WYWx1ZSB8fCB2ID4gbWF4VmFsdWUpCisgICAgcmV0dXJuIGZhbHNlOworICB2YWx1ZSA9IHY7CisgIHJldHVybiB0cnVlOworfQorCitjaGFyKgorSW50UGFyYW1ldGVyOjpnZXREZWZhdWx0U3RyKCkgY29uc3QgeworICBjaGFyKiByZXN1bHQgPSBuZXcgY2hhclsxNl07CisgIHNwcmludGYocmVzdWx0LCAiJWQiLCBkZWZfdmFsdWUpOworICByZXR1cm4gcmVzdWx0OworfQorCitjaGFyKiBJbnRQYXJhbWV0ZXI6OmdldFZhbHVlU3RyKCkgY29uc3QgeworICBjaGFyKiByZXN1bHQgPSBuZXcgY2hhclsxNl07CisgIHNwcmludGYocmVzdWx0LCAiJWQiLCB2YWx1ZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0ludFBhcmFtZXRlcjo6b3BlcmF0b3IgaW50KCkgY29uc3QgeworICByZXR1cm4gdmFsdWU7Cit9CisKKy8vIC09LSBTdHJpbmdQYXJhbWV0ZXIKKworU3RyaW5nUGFyYW1ldGVyOjpTdHJpbmdQYXJhbWV0ZXIoY29uc3QgY2hhciogbmFtZV8sIGNvbnN0IGNoYXIqIGRlc2NfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdiwgQ29uZmlndXJhdGlvbiogY29uZikKKyAgOiBWb2lkUGFyYW1ldGVyKG5hbWVfLCBkZXNjXywgY29uZiksIHZhbHVlKHN0ckR1cCh2KSksIGRlZl92YWx1ZSh2KQoreworICBpZiAoIXYpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRGVmYXVsdCB2YWx1ZSA8bnVsbD4gZm9yICVzIG5vdCBhbGxvd2VkXG4iLG5hbWVfKTsKKyAgICB0aHJvdyByZmI6OkV4Y2VwdGlvbigiRGVmYXVsdCB2YWx1ZSA8bnVsbD4gbm90IGFsbG93ZWQiKTsKKyAgfQorfQorCitTdHJpbmdQYXJhbWV0ZXI6On5TdHJpbmdQYXJhbWV0ZXIoKSB7CisgIHN0ckZyZWUodmFsdWUpOworfQorCitib29sIFN0cmluZ1BhcmFtZXRlcjo6c2V0UGFyYW0oY29uc3QgY2hhciogdikgeworICBMT0NLX0NPTkZJRzsKKyAgaWYgKGltbXV0YWJsZSkgcmV0dXJuIHRydWU7CisgIGlmICghdikKKyAgICB0aHJvdyByZmI6OkV4Y2VwdGlvbigic2V0UGFyYW0oPG51bGw+KSBub3QgYWxsb3dlZCIpOworICB2bG9nLmRlYnVnKCJzZXQgJXMoU3RyaW5nKSB0byAlcyIsIGdldE5hbWUoKSwgdik7CisgIENoYXJBcnJheSBvbGRWYWx1ZSh2YWx1ZSk7CisgIHZhbHVlID0gc3RyRHVwKHYpOworICByZXR1cm4gdmFsdWUgIT0gMDsKK30KKworY2hhciogU3RyaW5nUGFyYW1ldGVyOjpnZXREZWZhdWx0U3RyKCkgY29uc3QgeworICByZXR1cm4gc3RyRHVwKGRlZl92YWx1ZSk7Cit9CisKK2NoYXIqIFN0cmluZ1BhcmFtZXRlcjo6Z2V0VmFsdWVTdHIoKSBjb25zdCB7CisgIExPQ0tfQ09ORklHOworICByZXR1cm4gc3RyRHVwKHZhbHVlKTsKK30KKworLy8gLT0tIEJpbmFyeVBhcmFtZXRlcgorCitCaW5hcnlQYXJhbWV0ZXI6OkJpbmFyeVBhcmFtZXRlcihjb25zdCBjaGFyKiBuYW1lXywgY29uc3QgY2hhciogZGVzY18sIGNvbnN0IHZvaWQqIHYsIGludCBsLCBDb25maWd1cmF0aW9uKiBjb25mKQorOiBWb2lkUGFyYW1ldGVyKG5hbWVfLCBkZXNjXywgY29uZiksIHZhbHVlKDApLCBsZW5ndGgoMCksIGRlZl92YWx1ZSgoY2hhciopdiksIGRlZl9sZW5ndGgobCkgeworICBpZiAobCkgeworICAgIHZhbHVlID0gbmV3IGNoYXJbbF07CisgICAgbGVuZ3RoID0gbDsKKyAgICBtZW1jcHkodmFsdWUsIHYsIGwpOworICB9Cit9CitCaW5hcnlQYXJhbWV0ZXI6On5CaW5hcnlQYXJhbWV0ZXIoKSB7CisgIGlmICh2YWx1ZSkKKyAgICBkZWxldGUgW10gdmFsdWU7Cit9CisKK2Jvb2wgQmluYXJ5UGFyYW1ldGVyOjpzZXRQYXJhbShjb25zdCBjaGFyKiB2KSB7CisgIExPQ0tfQ09ORklHOworICBpZiAoaW1tdXRhYmxlKSByZXR1cm4gdHJ1ZTsKKyAgdmxvZy5kZWJ1Zygic2V0ICVzKEJpbmFyeSkgdG8gJXMiLCBnZXROYW1lKCksIHYpOworICByZXR1cm4gcmRyOjpIZXhJblN0cmVhbTo6aGV4U3RyVG9CaW4odiwgJnZhbHVlLCAmbGVuZ3RoKTsKK30KKwordm9pZCBCaW5hcnlQYXJhbWV0ZXI6OnNldFBhcmFtKGNvbnN0IHZvaWQqIHYsIGludCBsZW4pIHsKKyAgTE9DS19DT05GSUc7CisgIGlmIChpbW11dGFibGUpIHJldHVybjsgCisgIHZsb2cuZGVidWcoInNldCAlcyhCaW5hcnkpIiwgZ2V0TmFtZSgpKTsKKyAgZGVsZXRlIFtdIHZhbHVlOyB2YWx1ZSA9IDA7CisgIGlmIChsZW4pIHsKKyAgICB2YWx1ZSA9IG5ldyBjaGFyW2xlbl07CisgICAgbGVuZ3RoID0gbGVuOworICAgIG1lbWNweSh2YWx1ZSwgdiwgbGVuKTsKKyAgfQorfQorCitjaGFyKiBCaW5hcnlQYXJhbWV0ZXI6OmdldERlZmF1bHRTdHIoKSBjb25zdCB7CisgIHJldHVybiByZHI6OkhleE91dFN0cmVhbTo6YmluVG9IZXhTdHIoZGVmX3ZhbHVlLCBkZWZfbGVuZ3RoKTsKK30KKworY2hhciogQmluYXJ5UGFyYW1ldGVyOjpnZXRWYWx1ZVN0cigpIGNvbnN0IHsKKyAgTE9DS19DT05GSUc7CisgIHJldHVybiByZHI6OkhleE91dFN0cmVhbTo6YmluVG9IZXhTdHIodmFsdWUsIGxlbmd0aCk7Cit9CisKK3ZvaWQgQmluYXJ5UGFyYW1ldGVyOjpnZXREYXRhKHZvaWQqKiBkYXRhXywgaW50KiBsZW5ndGhfKSBjb25zdCB7CisgIExPQ0tfQ09ORklHOworICBpZiAobGVuZ3RoXykgKmxlbmd0aF8gPSBsZW5ndGg7CisgIGlmIChkYXRhXykgeworICAgICpkYXRhXyA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgbWVtY3B5KCpkYXRhXywgdmFsdWUsIGxlbmd0aCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvQ29uZmlndXJhdGlvbi5oIGIvY29tbW9uL3JmYi9Db25maWd1cmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiODViOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsMjY1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSBDb25maWd1cmF0aW9uLmgKKy8vCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIGEgc2V0IG9mIGNsYXNzZXMgdXNlZCB0byByZXByZXNlbnQgY29uZmlndXJhdGlvbgorLy8gcGFyYW1ldGVycyBvZiBkaWZmZXJlbnQgdHlwZXMuICBJbnN0YW5jZXMgb2YgdGhlIGRpZmZlcmVudCBwYXJhbWV0ZXIKKy8vIHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggaW5zdGFuY2VzIG9mIHRoZSBDb25maWd1cmF0aW9uIGNsYXNzLCBhbmQKKy8vIGFyZSBlYWNoIGdpdmVuIGEgdW5pcXVlIG5hbWUuICBUaGUgQ29uZmlndXJhdGlvbiBjbGFzcyBwcm92aWRlcyBhCisvLyBnZW5lcmljIEFQSSB0aHJvdWdoIHdoaWNoIHBhcmFtZXRlcnMgbWF5IGJlIGxvY2F0ZWQgYnkgbmFtZSBhbmQgdGhlaXIKKy8vIHZhbHVlIHNldCwgdGh1cyByZW1vdmluZyB0aGUgbmVlZCB0byB3cml0ZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb2RlLgorLy8gU2ltcGx5IGRlZmluaW5nIGEgbmV3IHBhcmFtZXRlciBhbmQgYXNzb2NpYXRpbmcgaXQgd2l0aCBhIENvbmZpZ3VyYXRpb24KKy8vIHdpbGwgYWxsb3cgaXQgdG8gYmUgY29uZmlndXJlZCBieSB0aGUgdXNlci4KKy8vCisvLyBJZiBubyBDb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIGEgUGFyYW1ldGVyLCB0aGVuIHRoZQorLy8gZ2xvYmFsIENvbmZpZ3VyYXRpb24gd2lsbCBiZSBhc3N1bWVkLgorLy8KKy8vIENvbmZpZ3VyYXRpb25zIGNhbiBiZSAiY2hhaW5lZCIgaW50byBncm91cHMuICBFYWNoIGdyb3VwIGhhcyBhIHJvb3QKKy8vIENvbmZpZ3VyYXRpb24sIGEgcG9pbnRlciB0byB3aGljaCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvcnMKKy8vIG9mIHRoZSBvdGhlciBncm91cCBtZW1iZXJzLiAgc2V0KCkgYW5kIGdldCgpIG9wZXJhdGlvbnMgY2FsbGVkIG9uIHRoZQorLy8gcm9vdCB3aWxsIGl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIGdyb3VwJ3MgbWVtYmVycy4KKy8vCisvLyBOQjogT24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBUaHJlYWRpbmcsIGxvY2tpbmcgaXMgcGVyZm9ybWVkIHRvIHByb3RlY3QKKy8vICAgICBjb21wbGV4IHBhcmFtZXRlciB0eXBlcyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzIChlLmcuIHN0cmluZ3MpLgorLy8gTkI6IE5PIExPQ0tJTkcgaXMgcGVyZm9ybWVkIHdoZW4gbGlua2luZyBDb25maWd1cmF0aW9ucyB0byBncm91cHMKKy8vICAgICBvciB3aGVuIGFkZGluZyBQYXJhbWV0ZXJzIHRvIENvbmZpZ3VyYXRpb25zLgorCisjaWZuZGVmIF9fUkZCX0NPTkZJR1VSQVRJT05fSF9fCisjZGVmaW5lIF9fUkZCX0NPTkZJR1VSQVRJT05fSF9fCisKKyNpbmNsdWRlIDxyZmIvdXRpbC5oPgorCituYW1lc3BhY2UgcmZiIHsKKyAgY2xhc3MgVm9pZFBhcmFtZXRlcjsKKyAgc3RydWN0IFBhcmFtZXRlckl0ZXJhdG9yOworCisgIC8vIC09LSBDb25maWd1cmF0aW9uCisgIC8vICAgICBDbGFzcyB1c2VkIHRvIGFjY2VzcyBwYXJhbWV0ZXJzLgorCisgIGNsYXNzIENvbmZpZ3VyYXRpb24geworICBwdWJsaWM6CisgICAgLy8gLSBDcmVhdGUgYSBuZXcgQ29uZmlndXJhdGlvbiBvYmplY3QKKyAgICBDb25maWd1cmF0aW9uKGNvbnN0IGNoYXIqIG5hbWUsIENvbmZpZ3VyYXRpb24qIGF0dGFjaFRvR3JvdXA9MCk7CisKKyAgICAvLyAtIFJldHVybiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIENvbmZpZ3VyYXRpb24ncyBuYW1lCisgICAgY29uc3QgY2hhciogZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWUuYnVmOyB9CisKKyAgICAvLyAtIEFzc2lnbm1lbnQgb3BlcmF0b3IuICBGb3IgZXZlcnkgUGFyYW1ldGVyIGluIHRoaXMgQ29uZmlndXJhdGlvbidzCisgICAgLy8gICBncm91cCwgZ2V0KClzIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBwYXJhbWV0ZXIgYW5kIGNvcGllcyBpdHMKKyAgICAvLyAgIGNvbnRlbnQuCisgICAgQ29uZmlndXJhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IENvbmZpZ3VyYXRpb24mIHNyYyk7CisKKyAgICAvLyAtIFNldCBuYW1lZCBwYXJhbWV0ZXIgdG8gdmFsdWUKKyAgICBib29sIHNldChjb25zdCBjaGFyKiBwYXJhbSwgY29uc3QgY2hhciogdmFsdWUsIGJvb2wgaW1tdXRhYmxlPWZhbHNlKTsKKworICAgIC8vIC0gU2V0IHBhcmFtZXRlciB0byB2YWx1ZSAoc2VwYXJhdGVkIGJ5ICI9IikKKyAgICBib29sIHNldChjb25zdCBjaGFyKiBjb25maWcsIGJvb2wgaW1tdXRhYmxlPWZhbHNlKTsKKworICAgIC8vIC0gU2V0IG5hbWVkIHBhcmFtZXRlciB0byB2YWx1ZSwgd2l0aCBuYW1lIHRydW5jYXRlZCBhdCBsZW4KKyAgICBib29sIHNldChjb25zdCBjaGFyKiBuYW1lLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsLCBib29sIGltbXV0YWJsZSk7CisKKyAgICAvLyAtIEdldCBuYW1lZCBwYXJhbWV0ZXIKKyAgICBWb2lkUGFyYW1ldGVyKiBnZXQoY29uc3QgY2hhciogcGFyYW0pOworCisgICAgLy8gLSBMaXN0IHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgQ29uZmlndXJhdGlvbiBncm91cAorICAgIHZvaWQgbGlzdChpbnQgd2lkdGg9NzksIGludCBuYW1lV2lkdGg9MTApOworCisgICAgLy8gLSByZWFkRnJvbUZpbGUKKyAgICAvLyAgIFJlYWQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLgorICAgIHZvaWQgcmVhZEZyb21GaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKKworICAgIC8vIC0gd3JpdGVDb25maWdUb0ZpbGUKKyAgICAvLyAgIFdyaXRlIGEgbmV3IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmaWxlLCB0aGVuIG12IGl0CisgICAgLy8gICBvdmVyIHRoZSBvbGQgZmlsZS4KKyAgICB2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKKworCisgICAgLy8gLSBHZXQgdGhlIEdsb2JhbCBDb25maWd1cmF0aW9uIG9iamVjdAorICAgIC8vICAgTkI6IFRoaXMgY2FsbCBkb2VzIE5PVCBsb2NrIHRoZSBDb25maWd1cmF0aW9uIHN5c3RlbS4KKyAgICAvLyAgICAgICBBTFdBWVMgZW5zdXJlIHRoYXQgaWYgeW91IGhhdmUgQU5ZIGdsb2JhbCBQYXJhbWV0ZXJzLAorICAgIC8vICAgICAgIHRoZW4gdGhleSBhcmUgZGVmaW5lZCBhcyBnbG9iYWwgb2JqZWN0cywgdG8gZW5zdXJlIHRoYXQKKyAgICAvLyAgICAgICBnbG9iYWwoKSBpcyBjYWxsZWQgd2hlbiBvbmx5IHRoZSBtYWluIHRocmVhZCBpcyBydW5uaW5nLgorICAgIHN0YXRpYyBDb25maWd1cmF0aW9uKiBnbG9iYWwoKTsKKworICAgIC8vIC0gQ29udGFpbmVyIGZvciBwcm9jZXNzLXdpZGUgR2xvYmFsIHBhcmFtZXRlcnMKKyAgICBzdGF0aWMgYm9vbCBzZXRQYXJhbShjb25zdCBjaGFyKiBwYXJhbSwgY29uc3QgY2hhciogdmFsdWUsIGJvb2wgaW1tdXRhYmxlPWZhbHNlKSB7CisgICAgICByZXR1cm4gZ2xvYmFsKCktPnNldChwYXJhbSwgdmFsdWUsIGltbXV0YWJsZSk7CisgICAgfQorICAgIHN0YXRpYyBib29sIHNldFBhcmFtKGNvbnN0IGNoYXIqIGNvbmZpZywgYm9vbCBpbW11dGFibGU9ZmFsc2UpIHsgCisgICAgICByZXR1cm4gZ2xvYmFsKCktPnNldChjb25maWcsIGltbXV0YWJsZSk7CisgICAgfQorICAgIHN0YXRpYyBib29sIHNldFBhcmFtKGNvbnN0IGNoYXIqIG5hbWUsIGludCBsZW4sCisgICAgICBjb25zdCBjaGFyKiB2YWwsIGJvb2wgaW1tdXRhYmxlKSB7CisgICAgICByZXR1cm4gZ2xvYmFsKCktPnNldChuYW1lLCBsZW4sIHZhbCwgaW1tdXRhYmxlKTsKKyAgICB9CisgICAgc3RhdGljIFZvaWRQYXJhbWV0ZXIqIGdldFBhcmFtKGNvbnN0IGNoYXIqIHBhcmFtKSB7IHJldHVybiBnbG9iYWwoKS0+Z2V0KHBhcmFtKTsgfQorICAgIHN0YXRpYyB2b2lkIGxpc3RQYXJhbXMoaW50IHdpZHRoPTc5LCBpbnQgbmFtZVdpZHRoPTEwKSB7IGdsb2JhbCgpLT5saXN0KHdpZHRoLCBuYW1lV2lkdGgpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGZyaWVuZCBjbGFzcyBWb2lkUGFyYW1ldGVyOworICAgIGZyaWVuZCBzdHJ1Y3QgUGFyYW1ldGVySXRlcmF0b3I7CisKKyAgICAvLyBOYW1lIGZvciB0aGlzIENvbmZpZ3VyYXRpb24KKyAgICBDaGFyQXJyYXkgbmFtZTsKKworICAgIC8vIC0gUG9pbnRlciB0byBmaXJzdCBQYXJhbWV0ZXIgaW4gdGhpcyBncm91cAorICAgIFZvaWRQYXJhbWV0ZXIqIGhlYWQ7CisKKyAgICAvLyBQb2ludGVyIHRvIG5leHQgQ29uZmlndXJhdGlvbiBpbiB0aGlzIGdyb3VwCisgICAgQ29uZmlndXJhdGlvbiogX25leHQ7CisKKyAgICAvLyBUaGUgcHJvY2Vzcy13aWRlLCBHbG9iYWwgQ29uZmlndXJhdGlvbiBvYmplY3QKKyAgICBzdGF0aWMgQ29uZmlndXJhdGlvbiogZ2xvYmFsXzsKKyAgfTsKKworICAvLyAtPS0gVm9pZFBhcmFtZXRlcgorICAvLyAgICAgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgYmFzZS1jbGFzcy4KKworICBjbGFzcyBWb2lkUGFyYW1ldGVyIHsKKyAgcHVibGljOgorICAgIFZvaWRQYXJhbWV0ZXIoY29uc3QgY2hhciogbmFtZV8sIGNvbnN0IGNoYXIqIGRlc2NfLCBDb25maWd1cmF0aW9uKiBjb25mPTApOworICAgIHZpcnR1YWwgIH5Wb2lkUGFyYW1ldGVyKCk7CisgICAgY29uc3QgY2hhciogZ2V0TmFtZSgpIGNvbnN0OworICAgIGNvbnN0IGNoYXIqIGdldERlc2NyaXB0aW9uKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0UGFyYW0oY29uc3QgY2hhciogdmFsdWUpICA9IDA7CisgICAgdmlydHVhbCBib29sIHNldFBhcmFtKCk7CisgICAgdmlydHVhbCBjaGFyKiBnZXREZWZhdWx0U3RyKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY2hhciogZ2V0VmFsdWVTdHIoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGlzQm9vbCgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldEltbXV0YWJsZSgpOworICAgIHZpcnR1YWwgdm9pZCBzZXRIYXNCZWVuU2V0KCk7CisgICAgYm9vbCBoYXNCZWVuU2V0KCk7CisKKyAgcHJvdGVjdGVkOgorICAgIGZyaWVuZCBjbGFzcyBDb25maWd1cmF0aW9uOworICAgIGZyaWVuZCBzdHJ1Y3QgUGFyYW1ldGVySXRlcmF0b3I7CisKKyAgICBWb2lkUGFyYW1ldGVyKiBfbmV4dDsKKyAgICBib29sIGltbXV0YWJsZTsKKyAgICBib29sIF9oYXNCZWVuU2V0OworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb247CisgIH07CisKKyAgY2xhc3MgQWxpYXNQYXJhbWV0ZXIgOiBwdWJsaWMgVm9pZFBhcmFtZXRlciB7CisgIHB1YmxpYzoKKyAgICBBbGlhc1BhcmFtZXRlcihjb25zdCBjaGFyKiBuYW1lXywgY29uc3QgY2hhciogZGVzY18sVm9pZFBhcmFtZXRlciogcGFyYW1fLCBDb25maWd1cmF0aW9uKiBjb25mPTApOworICAgIHZpcnR1YWwgYm9vbCBzZXRQYXJhbShjb25zdCBjaGFyKiB2YWx1ZSk7CisgICAgdmlydHVhbCBib29sIHNldFBhcmFtKCk7CisgICAgdmlydHVhbCBjaGFyKiBnZXREZWZhdWx0U3RyKCkgY29uc3Q7CisgICAgdmlydHVhbCBjaGFyKiBnZXRWYWx1ZVN0cigpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpc0Jvb2woKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0SW1tdXRhYmxlKCk7CisgIHByaXZhdGU6CisgICAgVm9pZFBhcmFtZXRlciogcGFyYW07CisgIH07CisKKyAgY2xhc3MgQm9vbFBhcmFtZXRlciA6IHB1YmxpYyBWb2lkUGFyYW1ldGVyIHsKKyAgcHVibGljOgorICAgIEJvb2xQYXJhbWV0ZXIoY29uc3QgY2hhciogbmFtZV8sIGNvbnN0IGNoYXIqIGRlc2NfLCBib29sIHYsIENvbmZpZ3VyYXRpb24qIGNvbmY9MCk7CisgICAgdmlydHVhbCBib29sIHNldFBhcmFtKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0UGFyYW0oKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW0oYm9vbCBiKTsKKyAgICB2aXJ0dWFsIGNoYXIqIGdldERlZmF1bHRTdHIoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNoYXIqIGdldFZhbHVlU3RyKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzQm9vbCgpIGNvbnN0OworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdDsKKyAgcHJvdGVjdGVkOgorICAgIGJvb2wgdmFsdWU7CisgICAgYm9vbCBkZWZfdmFsdWU7CisgIH07CisKKyAgY2xhc3MgSW50UGFyYW1ldGVyIDogcHVibGljIFZvaWRQYXJhbWV0ZXIgeworICBwdWJsaWM6CisgICAgSW50UGFyYW1ldGVyKGNvbnN0IGNoYXIqIG5hbWVfLCBjb25zdCBjaGFyKiBkZXNjXywgaW50IHYsCisgICAgICAgICAgICAgICAgIGludCBtaW5WYWx1ZT1JTlRfTUlOLCBpbnQgbWF4VmFsdWU9SU5UX01BWCwgQ29uZmlndXJhdGlvbiogY29uZj0wKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0UGFyYW0oY29uc3QgY2hhciogdmFsdWUpOworICAgIHZpcnR1YWwgYm9vbCBzZXRQYXJhbShpbnQgdik7CisgICAgdmlydHVhbCBjaGFyKiBnZXREZWZhdWx0U3RyKCkgY29uc3Q7CisgICAgdmlydHVhbCBjaGFyKiBnZXRWYWx1ZVN0cigpIGNvbnN0OworICAgIG9wZXJhdG9yIGludCgpIGNvbnN0OworICBwcm90ZWN0ZWQ6CisgICAgaW50IHZhbHVlOworICAgIGludCBkZWZfdmFsdWU7CisgICAgaW50IG1pblZhbHVlLCBtYXhWYWx1ZTsKKyAgfTsKKworICBjbGFzcyBTdHJpbmdQYXJhbWV0ZXIgOiBwdWJsaWMgVm9pZFBhcmFtZXRlciB7CisgIHB1YmxpYzoKKyAgICAvLyBTdHJpbmdQYXJhbWV0ZXIgY29udGFpbnMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLCB3aGljaCBDQU5OT1QKKyAgICAvLyBiZSBOdWxsLCBhbmQgc28gbmVpdGhlciBjYW4gdGhlIGRlZmF1bHQgdmFsdWUhCisgICAgU3RyaW5nUGFyYW1ldGVyKGNvbnN0IGNoYXIqIG5hbWVfLCBjb25zdCBjaGFyKiBkZXNjXywgY29uc3QgY2hhciogdiwgQ29uZmlndXJhdGlvbiogY29uZj0wKTsKKyAgICB2aXJ0dWFsIH5TdHJpbmdQYXJhbWV0ZXIoKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0UGFyYW0oY29uc3QgY2hhciogdmFsdWUpOworICAgIHZpcnR1YWwgY2hhciogZ2V0RGVmYXVsdFN0cigpIGNvbnN0OworICAgIHZpcnR1YWwgY2hhciogZ2V0VmFsdWVTdHIoKSBjb25zdDsKKworICAgIC8vIGdldERhdGEoKSByZXR1cm5zIGEgY29weSBvZiB0aGUgZGF0YSAtIGl0IG11c3QgYmUgZGVsZXRlW11kIGJ5IHRoZQorICAgIC8vIGNhbGxlci4KKyAgICBjaGFyKiBnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsdWVTdHIoKTsgfQorICBwcm90ZWN0ZWQ6CisgICAgY2hhciogdmFsdWU7CisgICAgY29uc3QgY2hhciogZGVmX3ZhbHVlOworICB9OworCisgIGNsYXNzIEJpbmFyeVBhcmFtZXRlciA6IHB1YmxpYyBWb2lkUGFyYW1ldGVyIHsKKyAgcHVibGljOgorICAgIEJpbmFyeVBhcmFtZXRlcihjb25zdCBjaGFyKiBuYW1lXywgY29uc3QgY2hhciogZGVzY18sIGNvbnN0IHZvaWQqIHYsIGludCBsLCBDb25maWd1cmF0aW9uKiBjb25mPTApOworICAgIHZpcnR1YWwgfkJpbmFyeVBhcmFtZXRlcigpOworICAgIHZpcnR1YWwgYm9vbCBzZXRQYXJhbShjb25zdCBjaGFyKiB2YWx1ZSk7CisgICAgdmlydHVhbCB2b2lkIHNldFBhcmFtKGNvbnN0IHZvaWQqIHYsIGludCBsKTsKKyAgICB2aXJ0dWFsIGNoYXIqIGdldERlZmF1bHRTdHIoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNoYXIqIGdldFZhbHVlU3RyKCkgY29uc3Q7CisKKyAgICAvLyBnZXREYXRhKCkgd2lsbCByZXR1cm4gbGVuZ3RoIHplcm8gaWYgdGhlcmUgaXMgbm8gZGF0YQorICAgIC8vIE5COiBkYXRhIG1heSBiZSBzZXQgdG8gemVybywgT1Igc2V0IHRvIGEgemVyby1sZW5ndGggYnVmZmVyCisgICAgdm9pZCBnZXREYXRhKHZvaWQqKiBkYXRhLCBpbnQqIGxlbmd0aCkgY29uc3Q7CisKKyAgcHJvdGVjdGVkOgorICAgIGNoYXIqIHZhbHVlOworICAgIGludCBsZW5ndGg7CisgICAgY2hhciogZGVmX3ZhbHVlOworICAgIGludCBkZWZfbGVuZ3RoOworICB9OworCisgIC8vIC09LSBQYXJhbWV0ZXJJdGVyYXRvcgorICAvLyAgICAgSXRlcmF0ZXMgb3ZlciBhbGwgdGhlIFBhcmFtZXRlcnMgaW4gYSBDb25maWd1cmF0aW9uIGdyb3VwLiAgVGhlCisgIC8vICAgICBjdXJyZW50IFBhcmFtZXRlciBpcyBhY2Nlc3NlZCB2aWEgcGFyYW0sIHRoZSBjdXJyZW50IENvbmZpZ3VyYXRpb24KKyAgLy8gICAgIHZpYSBjb25maWcuICBUaGUgbmV4dCgpIG1ldGhvZCBtb3ZlcyBvbiB0byB0aGUgbmV4dCBQYXJhbWV0ZXIuCisKKyAgc3RydWN0IFBhcmFtZXRlckl0ZXJhdG9yIHsKKyAgICBQYXJhbWV0ZXJJdGVyYXRvcihDb25maWd1cmF0aW9uKiBjKSA6IGNvbmZpZyhjKSwgcGFyYW0oYyA/IGMtPmhlYWQgOiAwKSB7fQorICAgIHZvaWQgbmV4dCgpIHsKKyAgICAgIHBhcmFtID0gcGFyYW0tPl9uZXh0OworICAgICAgd2hpbGUgKCFwYXJhbSkgeworICAgICAgICBjb25maWcgPSBjb25maWctPl9uZXh0OworICAgICAgICBpZiAoIWNvbmZpZykgYnJlYWs7CisgICAgICAgIHBhcmFtID0gY29uZmlnLT5oZWFkOworICAgICAgfQorICAgIH0KKyAgICBDb25maWd1cmF0aW9uKiBjb25maWc7CisgICAgVm9pZFBhcmFtZXRlciogcGFyYW07CisgIH07CisKK307CisKKyNlbmRpZiAvLyBfX1JGQl9DT05GSUdVUkFUSU9OX0hfXwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9Db25uUGFyYW1zLmN4eCBiL2NvbW1vbi9yZmIvQ29ublBhcmFtcy5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhZTU4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ29ublBhcmFtcy5jeHgKQEAgLTAsMCArMSwxMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxyZHIvSW5TdHJlYW0uaD4KKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHJmYi9lbmNvZGluZ3MuaD4KKyNpbmNsdWRlIDxyZmIvRW5jb2Rlci5oPgorI2luY2x1ZGUgPHJmYi9Db25uUGFyYW1zLmg+CisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworQ29ublBhcmFtczo6Q29ublBhcmFtcygpCisgIDogbWFqb3JWZXJzaW9uKDApLCBtaW5vclZlcnNpb24oMCksIHdpZHRoKDApLCBoZWlnaHQoMCksIHVzZUNvcHlSZWN0KGZhbHNlKSwKKyAgICBzdXBwb3J0c0xvY2FsQ3Vyc29yKGZhbHNlKSwgc3VwcG9ydHNMb2NhbFhDdXJzb3IoZmFsc2UpLCBzdXBwb3J0c0Rlc2t0b3BSZXNpemUodHJ1ZSksCisgICAgc3VwcG9ydHNMYXN0UmVjdChmYWxzZSksIGN1c3RvbUNvbXByZXNzTGV2ZWwoZmFsc2UpLCBjb21wcmVzc0xldmVsKDYpLAorICAgIG5vSnBlZyhmYWxzZSksIHF1YWxpdHlMZXZlbCgtMSksIAorICAgIG5hbWVfKDApLCBuRW5jb2RpbmdzXygwKSwgZW5jb2RpbmdzXygwKSwKKyAgICBjdXJyZW50RW5jb2RpbmdfKGVuY29kaW5nUmF3KSwgdmVyU3RyUG9zKDApCit7CisgIHNldE5hbWUoIiIpOworfQorCitDb25uUGFyYW1zOjp+Q29ublBhcmFtcygpCit7CisgIGRlbGV0ZSBbXSBuYW1lXzsKKyAgZGVsZXRlIFtdIGVuY29kaW5nc187Cit9CisKK2Jvb2wgQ29ublBhcmFtczo6cmVhZFZlcnNpb24ocmRyOjpJblN0cmVhbSogaXMsIGJvb2wqIGRvbmUpCit7CisgIGlmICh2ZXJTdHJQb3MgPj0gMTIpIHJldHVybiBmYWxzZTsKKyAgd2hpbGUgKGlzLT5jaGVja05vV2FpdCgxKSAmJiB2ZXJTdHJQb3MgPCAxMikgeworICAgIHZlclN0clt2ZXJTdHJQb3MrK10gPSBpcy0+cmVhZFU4KCk7CisgIH0KKworICBpZiAodmVyU3RyUG9zIDwgMTIpIHsKKyAgICAqZG9uZSA9IGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgICpkb25lID0gdHJ1ZTsKKyAgdmVyU3RyWzEyXSA9IDA7CisgIHJldHVybiAoc3NjYW5mKHZlclN0ciwgIlJGQiAlMDNkLiUwM2RcbiIsICZtYWpvclZlcnNpb24sJm1pbm9yVmVyc2lvbikgPT0gMik7Cit9CisKK3ZvaWQgQ29ublBhcmFtczo6d3JpdGVWZXJzaW9uKHJkcjo6T3V0U3RyZWFtKiBvcykKK3sKKyAgY2hhciBzdHJbMTNdOworICBzcHJpbnRmKHN0ciwgIlJGQiAlMDNkLiUwM2RcbiIsIG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uKTsKKyAgb3MtPndyaXRlQnl0ZXMoc3RyLCAxMik7CisgIG9zLT5mbHVzaCgpOworfQorCit2b2lkIENvbm5QYXJhbXM6OnNldFBGKGNvbnN0IFBpeGVsRm9ybWF0JiBwZikKK3sKKyAgcGZfID0gcGY7CisKKyAgaWYgKHBmLmJwcCAhPSA4ICYmIHBmLmJwcCAhPSAxNiAmJiBwZi5icHAgIT0gMzIpCisgICAgdGhyb3cgRXhjZXB0aW9uKCJzZXRQRjogbm90IDgsIDE2IG9yIDMyIGJwcD8iKTsKK30KKwordm9pZCBDb25uUGFyYW1zOjpzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpCit7CisgIGRlbGV0ZSBbXSBuYW1lXzsKKyAgbmFtZV8gPSBzdHJEdXAobmFtZSk7Cit9CisKK3ZvaWQgQ29ublBhcmFtczo6c2V0RW5jb2RpbmdzKGludCBuRW5jb2RpbmdzLCBjb25zdCByZHI6OlUzMiogZW5jb2RpbmdzKQoreworICBpZiAobkVuY29kaW5ncyA+IG5FbmNvZGluZ3NfKSB7CisgICAgZGVsZXRlIFtdIGVuY29kaW5nc187CisgICAgZW5jb2RpbmdzXyA9IG5ldyByZHI6OlUzMltuRW5jb2RpbmdzXTsKKyAgfQorICBuRW5jb2RpbmdzXyA9IG5FbmNvZGluZ3M7CisgIHVzZUNvcHlSZWN0ID0gZmFsc2U7CisgIHN1cHBvcnRzTG9jYWxDdXJzb3IgPSBmYWxzZTsKKyAgc3VwcG9ydHNEZXNrdG9wUmVzaXplID0gZmFsc2U7CisgIHN1cHBvcnRzTG9jYWxYQ3Vyc29yID0gZmFsc2U7CisgIHN1cHBvcnRzTGFzdFJlY3QgPSBmYWxzZTsKKyAgY3VzdG9tQ29tcHJlc3NMZXZlbCA9IGZhbHNlOworICBjb21wcmVzc0xldmVsID0gLTE7CisgIG5vSnBlZyA9IHRydWU7CisgIHF1YWxpdHlMZXZlbCA9IC0xOworICBjdXJyZW50RW5jb2RpbmdfID0gZW5jb2RpbmdSYXc7CisKKyAgZm9yIChpbnQgaSA9IG5FbmNvZGluZ3MtMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBlbmNvZGluZ3NfW2ldID0gZW5jb2RpbmdzW2ldOworCisgICAgaWYgKGVuY29kaW5nc1tpXSA9PSBlbmNvZGluZ0NvcHlSZWN0KQorICAgICAgdXNlQ29weVJlY3QgPSB0cnVlOworICAgIGVsc2UgaWYgKGVuY29kaW5nc1tpXSA9PSBwc2V1ZG9FbmNvZGluZ0N1cnNvcikKKyAgICAgIHN1cHBvcnRzTG9jYWxDdXJzb3IgPSB0cnVlOworICAgIGVsc2UgaWYgKGVuY29kaW5nc1tpXSA9PSBwc2V1ZG9FbmNvZGluZ1hDdXJzb3IpCisgICAgICBzdXBwb3J0c0xvY2FsWEN1cnNvciA9IHRydWU7CisgICAgZWxzZSBpZiAoZW5jb2RpbmdzW2ldID09IHBzZXVkb0VuY29kaW5nRGVza3RvcFNpemUpCisgICAgICBzdXBwb3J0c0Rlc2t0b3BSZXNpemUgPSB0cnVlOworICAgIGVsc2UgaWYgKGVuY29kaW5nc1tpXSA9PSBwc2V1ZG9FbmNvZGluZ0xhc3RSZWN0KQorICAgICAgc3VwcG9ydHNMYXN0UmVjdCA9IHRydWU7CisgICAgZWxzZSBpZiAoZW5jb2RpbmdzW2ldID49IHBzZXVkb0VuY29kaW5nQ29tcHJlc3NMZXZlbDAgJiYKKwkgICAgIGVuY29kaW5nc1tpXSA8PSBwc2V1ZG9FbmNvZGluZ0NvbXByZXNzTGV2ZWw5KSB7CisgICAgICBjdXN0b21Db21wcmVzc0xldmVsID0gdHJ1ZTsKKyAgICAgIGNvbXByZXNzTGV2ZWwgPSBlbmNvZGluZ3NbaV0gLSBwc2V1ZG9FbmNvZGluZ0NvbXByZXNzTGV2ZWwwOworICAgIH0gZWxzZSBpZiAoZW5jb2RpbmdzW2ldID49IHBzZXVkb0VuY29kaW5nUXVhbGl0eUxldmVsMCAmJgorCSAgICAgICBlbmNvZGluZ3NbaV0gPD0gcHNldWRvRW5jb2RpbmdRdWFsaXR5TGV2ZWw5KSB7CisgICAgICBub0pwZWcgPSBmYWxzZTsKKyAgICAgIHF1YWxpdHlMZXZlbCA9IGVuY29kaW5nc1tpXSAtIHBzZXVkb0VuY29kaW5nUXVhbGl0eUxldmVsMDsKKyAgICB9IGVsc2UgaWYgKGVuY29kaW5nc1tpXSA8PSBlbmNvZGluZ01heCAmJiBFbmNvZGVyOjpzdXBwb3J0ZWQoZW5jb2RpbmdzW2ldKSkKKyAgICAgIGN1cnJlbnRFbmNvZGluZ18gPSBlbmNvZGluZ3NbaV07CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvQ29ublBhcmFtcy5oIGIvY29tbW9uL3JmYi9Db25uUGFyYW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlNmE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvQ29ublBhcmFtcy5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBDb25uUGFyYW1zIC0gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycy4KKy8vCisKKyNpZm5kZWYgX19SRkJfQ09OTlBBUkFNU19IX18KKyNkZWZpbmUgX19SRkJfQ09OTlBBUkFNU19IX18KKworI2luY2x1ZGUgPHJkci90eXBlcy5oPgorI2luY2x1ZGUgPHJmYi9QaXhlbEZvcm1hdC5oPgorCituYW1lc3BhY2UgcmRyIHsgY2xhc3MgSW5TdHJlYW07IH0KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgQ29ublBhcmFtcyB7CisgIHB1YmxpYzoKKyAgICBDb25uUGFyYW1zKCk7CisgICAgfkNvbm5QYXJhbXMoKTsKKworICAgIGJvb2wgcmVhZFZlcnNpb24ocmRyOjpJblN0cmVhbSogaXMsIGJvb2wqIGRvbmUpOworICAgIHZvaWQgd3JpdGVWZXJzaW9uKHJkcjo6T3V0U3RyZWFtKiBvcyk7CisKKyAgICBpbnQgbWFqb3JWZXJzaW9uOworICAgIGludCBtaW5vclZlcnNpb247CisKKyAgICB2b2lkIHNldFZlcnNpb24oaW50IG1ham9yLCBpbnQgbWlub3IpIHsKKyAgICAgIG1ham9yVmVyc2lvbiA9IG1ham9yOyBtaW5vclZlcnNpb24gPSBtaW5vcjsKKyAgICB9CisgICAgYm9vbCBpc1ZlcnNpb24oaW50IG1ham9yLCBpbnQgbWlub3IpIHsKKyAgICAgIHJldHVybiBtYWpvclZlcnNpb24gPT0gbWFqb3IgJiYgbWlub3JWZXJzaW9uID09IG1pbm9yOworICAgIH0KKyAgICBib29sIGJlZm9yZVZlcnNpb24oaW50IG1ham9yLCBpbnQgbWlub3IpIHsKKyAgICAgIHJldHVybiAobWFqb3JWZXJzaW9uIDwgbWFqb3IgfHwKKyAgICAgICAgICAgICAgKG1ham9yVmVyc2lvbiA9PSBtYWpvciAmJiBtaW5vclZlcnNpb24gPCBtaW5vcikpOworICAgIH0KKyAgICBib29sIGFmdGVyVmVyc2lvbihpbnQgbWFqb3IsIGludCBtaW5vcikgeworICAgICAgcmV0dXJuICFiZWZvcmVWZXJzaW9uKG1ham9yLG1pbm9yKzEpOworICAgIH0KKworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworCisgICAgY29uc3QgUGl4ZWxGb3JtYXQmIHBmKCkgeyByZXR1cm4gcGZfOyB9CisgICAgdm9pZCBzZXRQRihjb25zdCBQaXhlbEZvcm1hdCYgcGYpOworCisgICAgY29uc3QgY2hhciogbmFtZSgpIHsgcmV0dXJuIG5hbWVfOyB9CisgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOworCisgICAgcmRyOjpVMzIgY3VycmVudEVuY29kaW5nKCkgeyByZXR1cm4gY3VycmVudEVuY29kaW5nXzsgfQorICAgIGludCBuRW5jb2RpbmdzKCkgeyByZXR1cm4gbkVuY29kaW5nc187IH0KKyAgICBjb25zdCByZHI6OlUzMiogZW5jb2RpbmdzKCkgeyByZXR1cm4gZW5jb2RpbmdzXzsgfQorICAgIHZvaWQgc2V0RW5jb2RpbmdzKGludCBuRW5jb2RpbmdzLCBjb25zdCByZHI6OlUzMiogZW5jb2RpbmdzKTsKKyAgICBib29sIHVzZUNvcHlSZWN0OworCisgICAgYm9vbCBzdXBwb3J0c0xvY2FsQ3Vyc29yOworICAgIGJvb2wgc3VwcG9ydHNMb2NhbFhDdXJzb3I7CisgICAgYm9vbCBzdXBwb3J0c0Rlc2t0b3BSZXNpemU7CisgICAgYm9vbCBzdXBwb3J0c0xhc3RSZWN0OworCisgICAgYm9vbCBjdXN0b21Db21wcmVzc0xldmVsOworICAgIGludCBjb21wcmVzc0xldmVsOworICAgIGJvb2wgbm9KcGVnOworICAgIGludCBxdWFsaXR5TGV2ZWw7CisKKyAgcHJpdmF0ZToKKworICAgIFBpeGVsRm9ybWF0IHBmXzsKKyAgICBjaGFyKiBuYW1lXzsKKyAgICBpbnQgbkVuY29kaW5nc187CisgICAgcmRyOjpVMzIqIGVuY29kaW5nc187CisgICAgaW50IGN1cnJlbnRFbmNvZGluZ187CisgICAgY2hhciB2ZXJTdHJbMTNdOworICAgIGludCB2ZXJTdHJQb3M7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvQ3Vyc29yLmN4eCBiL2NvbW1vbi9yZmIvQ3Vyc29yLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGRjMzQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9DdXJzb3IuY3h4CkBAIC0wLDAgKzEsMTc5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cmZiL0N1cnNvci5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworc3RhdGljIExvZ1dyaXRlciB2bG9nKCJDdXJzb3IiKTsKKwordm9pZCBDdXJzb3I6OnNldFNpemUoaW50IHcsIGludCBoKSB7CisgIGludCBvbGRNYXNrTGVuID0gbWFza0xlbigpOworICBNYW5hZ2VkUGl4ZWxCdWZmZXI6OnNldFNpemUodywgaCk7CisgIGlmIChtYXNrTGVuKCkgPiBvbGRNYXNrTGVuKSB7CisgICAgZGVsZXRlIFtdIG1hc2suYnVmOworICAgIG1hc2suYnVmID0gbmV3IHJkcjo6VThbbWFza0xlbigpXTsKKyAgfQorfQorCit2b2lkIEN1cnNvcjo6ZHJhd091dGxpbmUoY29uc3QgUGl4ZWwmIGMpCit7CisgIEN1cnNvciBvdXRsaW5lZDsKKworICAvLyBDcmVhdGUgYSBtaXJyb3Igb2YgdGhlIGV4aXN0aW5nIGN1cnNvcgorICBvdXRsaW5lZC5zZXRQRihnZXRQRigpKTsKKyAgb3V0bGluZWQuc2V0U2l6ZSh3aWR0aCgpLCBoZWlnaHQoKSk7CisgIG91dGxpbmVkLmhvdHNwb3QgPSBob3RzcG90OworCisgIC8vIENsZWFyIHRoZSBtaXJyb3IncyBiYWNrZ3JvdW5kIHRvIHRoZSBvdXRsaW5lIGNvbG91cgorICBvdXRsaW5lZC5maWxsUmVjdChnZXRSZWN0KCksIGMpOworCisgIC8vIEJsaXQgdGhlIGV4aXN0aW5nIGN1cnNvciwgdXNpbmcgaXRzIG1hc2sKKyAgb3V0bGluZWQubWFza1JlY3QoZ2V0UmVjdCgpLCBkYXRhLCBtYXNrLmJ1Zik7CisKKyAgLy8gTm93IGp1c3QgYWRqdXN0IHRoZSBtYXNrIHRvIGFkZCB0aGUgb3V0bGluZS4gIFRoZSBvdXRsaW5lIHBpeGVscworICAvLyB3aWxsIGFscmVhZHkgYmUgdGhlIHJpZ2h0IGNvbG91ci4gOikKKyAgaW50IG1hc2tCeXRlc1BlclJvdyA9ICh3aWR0aCgpICsgNykgLyA4OworICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodCgpOyB5KyspIHsKKyAgICBmb3IgKGludCBieXRlPTA7IGJ5dGU8bWFza0J5dGVzUGVyUm93OyBieXRlKyspIHsKKyAgICAgIHJkcjo6VTggbTggPSBtYXNrLmJ1Zlt5Km1hc2tCeXRlc1BlclJvdyArIGJ5dGVdOworCisgICAgICAvLyBIYW5kbGUgYWJvdmUgJiBiZWxvdyBvdXRsaW5lCisgICAgICBpZiAoeSA+IDApIG04IHw9IG1hc2suYnVmWyh5LTEpKm1hc2tCeXRlc1BlclJvdyArIGJ5dGVdOworICAgICAgaWYgKHkgPCBoZWlnaHQoKS0xKSBtOCB8PSBtYXNrLmJ1ZlsoeSsxKSptYXNrQnl0ZXNQZXJSb3cgKyBieXRlXTsKKworICAgICAgLy8gTGVmdCBvdXRsaW5lCisgICAgICBtOCB8PSBtYXNrLmJ1Zlt5Km1hc2tCeXRlc1BlclJvdyArIGJ5dGVdIDw8IDE7CisgICAgICBpZiAoYnl0ZSA8IG1hc2tCeXRlc1BlclJvdy0xKQorICAgICAgICBtOCB8PSAobWFzay5idWZbeSptYXNrQnl0ZXNQZXJSb3cgKyBieXRlICsgMV0gPj4gNykgJiAxOworCisgICAgICAvLyBSaWdodCBvdXRsaW5lCisgICAgICBtOCB8PSBtYXNrLmJ1Zlt5Km1hc2tCeXRlc1BlclJvdyArIGJ5dGVdID4+IDE7CisgICAgICBpZiAoYnl0ZSA+IDApCisgICAgICAgIG04IHw9IChtYXNrLmJ1Zlt5Km1hc2tCeXRlc1BlclJvdyArIGJ5dGUgLSAxXSA8PCA3KSAmIDEyODsKKworICAgICAgb3V0bGluZWQubWFzay5idWZbeSptYXNrQnl0ZXNQZXJSb3cgKyBieXRlXSA9IG04OworICAgIH0KKyAgfQorCisgIC8vIFJlcGxhY2UgdGhlIGV4aXN0aW5nIGN1cnNvciAmIG1hc2sgd2l0aCB0aGUgbmV3IG9uZQorICBkZWxldGUgW10gZGF0YTsKKyAgZGVsZXRlIFtdIG1hc2suYnVmOworICBkYXRhID0gb3V0bGluZWQuZGF0YTsgb3V0bGluZWQuZGF0YSA9IDA7CisgIG1hc2suYnVmID0gb3V0bGluZWQubWFzay5idWY7IG91dGxpbmVkLm1hc2suYnVmID0gMDsKK30KKworcmRyOjpVOCogQ3Vyc29yOjpnZXRCaXRtYXAoUGl4ZWwqIHBpeDAsIFBpeGVsKiBwaXgxKQoreworICBib29sIGdvdFBpeDAgPSBmYWxzZTsKKyAgYm9vbCBnb3RQaXgxID0gZmFsc2U7CisgICpwaXgwID0gKnBpeDEgPSAwOworICByZHI6OlU4QXJyYXkgc291cmNlKG1hc2tMZW4oKSk7CisgIG1lbXNldChzb3VyY2UuYnVmLCAwLCBtYXNrTGVuKCkpOworCisgIGludCBtYXNrQnl0ZXNQZXJSb3cgPSAod2lkdGgoKSArIDcpIC8gODsKKyAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQoKTsgeSsrKSB7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aCgpOyB4KyspIHsKKyAgICAgIGludCBieXRlID0geSAqIG1hc2tCeXRlc1BlclJvdyArIHggLyA4OworICAgICAgaW50IGJpdCA9IDcgLSB4ICUgODsKKyAgICAgIGlmIChtYXNrLmJ1ZltieXRlXSAmICgxIDw8IGJpdCkpIHsKKyAgICAgICAgUGl4ZWwgcGl4PTA7CisgICAgICAgIHN3aXRjaCAoZ2V0UEYoKS5icHApIHsKKyAgICAgICAgY2FzZSA4OiAgcGl4ID0gKChyZHI6OlU4KikgZGF0YSlbeSAqIHdpZHRoKCkgKyB4XTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6IHBpeCA9ICgocmRyOjpVMTYqKWRhdGEpW3kgKiB3aWR0aCgpICsgeF07IGJyZWFrOworICAgICAgICBjYXNlIDMyOiBwaXggPSAoKHJkcjo6VTMyKilkYXRhKVt5ICogd2lkdGgoKSArIHhdOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdvdFBpeDAgfHwgcGl4ID09ICpwaXgwKSB7CisgICAgICAgICAgZ290UGl4MCA9IHRydWU7CisgICAgICAgICAgKnBpeDAgPSBwaXg7CisgICAgICAgIH0gZWxzZSBpZiAoIWdvdFBpeDEgfHwgcGl4ID09ICpwaXgxKSB7CisgICAgICAgICAgZ290UGl4MSA9IHRydWU7CisgICAgICAgICAgKnBpeDEgPSBwaXg7CisgICAgICAgICAgc291cmNlLmJ1ZltieXRlXSB8PSAoMSA8PCBiaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIG5vdCBhIGJpdG1hcAorICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzb3VyY2UudGFrZUJ1ZigpOworfQorCisvLyBjcm9wKCkgZGV0ZXJtaW5lcyB0aGUgImJ1c3kiIHJlY3RhbmdsZSBmb3IgdGhlIGN1cnNvciAtIHRoZSBtaW5pbXVtIGJvdW5kaW5nCisvLyByZWN0YW5nbGUgY29udGFpbmluZyBhY3R1YWwgcGl4ZWxzLiAgVGhpcyBpc24ndCB0aGUgbW9zdCBlZmZpY2llbnQgYWxnb3JpdGhtCisvLyBidXQgaXQncyBzaG9ydC4gIEZvciBzYW5pdHksIHdlIG1ha2Ugc3VyZSB0aGF0IHRoZSBidXN5IHJlY3RhbmdsZSBhbHdheXMKKy8vIGluY2x1ZGVzIHRoZSBob3RzcG90ICh0aGUgaG90c3BvdCBpcyB1bnNpZ25lZCBvbiB0aGUgd2lyZSBzbyBvdGhlcndpc2UgaXQKKy8vIHdvdWxkIGNhdXNlIHByb2JsZW1zIGlmIGl0IHdhcyBhYm92ZSBvciBsZWZ0IG9mIHRoZSBhY3R1YWwgcGl4ZWxzKQorCit2b2lkIEN1cnNvcjo6Y3JvcCgpCit7CisgIFJlY3QgYnVzeSA9IGdldFJlY3QoKS5pbnRlcnNlY3QoUmVjdChob3RzcG90LngsIGhvdHNwb3QueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdHNwb3QueCsxLCBob3RzcG90LnkrMSkpOworICBpbnQgbWFza0J5dGVzUGVyUm93ID0gKHdpZHRoKCkgKyA3KSAvIDg7CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0KCk7IHkrKykgeworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aCgpOyB4KyspIHsKKyAgICAgIGludCBieXRlID0geSAqIG1hc2tCeXRlc1BlclJvdyArIHggLyA4OworICAgICAgaW50IGJpdCA9IDcgLSB4ICUgODsKKyAgICAgIGlmIChtYXNrLmJ1ZltieXRlXSAmICgxIDw8IGJpdCkpIHsKKyAgICAgICAgaWYgKHggPCBidXN5LnRsLngpIGJ1c3kudGwueCA9IHg7CisgICAgICAgIGlmICh4KzEgPiBidXN5LmJyLngpIGJ1c3kuYnIueCA9IHgrMTsKKyAgICAgICAgaWYgKHkgPCBidXN5LnRsLnkpIGJ1c3kudGwueSA9IHk7CisgICAgICAgIGlmICh5KzEgPiBidXN5LmJyLnkpIGJ1c3kuYnIueSA9IHkrMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAod2lkdGgoKSA9PSBidXN5LndpZHRoKCkgJiYgaGVpZ2h0KCkgPT0gYnVzeS5oZWlnaHQoKSkgcmV0dXJuOworCisgIHZsb2cuZGVidWcoImNyb3BwaW5nICVkeCVkIHRvICVkeCVkIiwgd2lkdGgoKSwgaGVpZ2h0KCksCisgICAgICAgICAgICAgYnVzeS53aWR0aCgpLCBidXN5LmhlaWdodCgpKTsKKworICAvLyBDb3B5IHRoZSBwaXhlbCBkYXRhCisgIGludCBuZXdEYXRhTGVuID0gYnVzeS5hcmVhKCkgKiAoZ2V0UEYoKS5icHAvOCk7CisgIHJkcjo6VTgqIG5ld0RhdGEgPSBuZXcgcmRyOjpVOFtuZXdEYXRhTGVuXTsKKyAgZ2V0SW1hZ2UobmV3RGF0YSwgYnVzeSk7CisKKyAgLy8gQ29weSB0aGUgbWFzaworICBpbnQgbmV3TWFza0J5dGVzUGVyUm93ID0gKGJ1c3kud2lkdGgoKSs3KS84OworICBpbnQgbmV3TWFza0xlbiA9IG5ld01hc2tCeXRlc1BlclJvdyAqIGJ1c3kuaGVpZ2h0KCk7CisgIHJkcjo6VTgqIG5ld01hc2sgPSBuZXcgcmRyOjpVOFtuZXdNYXNrTGVuXTsKKyAgbWVtc2V0KG5ld01hc2ssIDAsIG5ld01hc2tMZW4pOworICBmb3IgKHkgPSAwOyB5IDwgYnVzeS5oZWlnaHQoKTsgeSsrKSB7CisgICAgaW50IG5ld0J5dGUsIG5ld0JpdDsKKyAgICBmb3IgKHggPSAwOyB4IDwgYnVzeS53aWR0aCgpOyB4KyspIHsKKyAgICAgIGludCBvbGRCeXRlID0gKHkrYnVzeS50bC55KSAqIG1hc2tCeXRlc1BlclJvdyArICh4K2J1c3kudGwueCkgLyA4OworICAgICAgaW50IG9sZEJpdCA9IDcgLSAoeCtidXN5LnRsLngpICUgODsKKyAgICAgIG5ld0J5dGUgPSB5ICogbmV3TWFza0J5dGVzUGVyUm93ICsgeCAvIDg7CisgICAgICBuZXdCaXQgPSA3IC0geCAlIDg7CisgICAgICBpZiAobWFzay5idWZbb2xkQnl0ZV0gJiAoMSA8PCBvbGRCaXQpKQorICAgICAgICBuZXdNYXNrW25ld0J5dGVdIHw9ICgxIDw8IG5ld0JpdCk7CisgICAgfQorICB9CisKKyAgLy8gU2V0IHRoZSBzaXplIGFuZCBkYXRhIHRvIHRoZSBuZXcsIGNyb3BwZWQgY3Vyc29yLgorICBzZXRTaXplKGJ1c3kud2lkdGgoKSwgYnVzeS5oZWlnaHQoKSk7CisgIGhvdHNwb3QgPSBob3RzcG90LnN1YnRyYWN0KGJ1c3kudGwpOworICBkZWxldGUgW10gZGF0YTsKKyAgZGVsZXRlIFtdIG1hc2suYnVmOworICBkYXRhc2l6ZSA9IG5ld0RhdGFMZW47CisgIGRhdGEgPSBuZXdEYXRhOworICBtYXNrLmJ1ZiA9IG5ld01hc2s7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0N1cnNvci5oIGIvY29tbW9uL3JmYi9DdXJzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDk0ZDcwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9DdXJzb3IuaApAQCAtMCwwICsxLDU2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gQ3Vyc29yIC0gc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gZGVzY3JpYmluZworLy8gICAgICAgICAgdGhlIGN1cnJlbnQgY3Vyc29yIHNoYXBlCisvLworCisjaWZuZGVmIF9fUkZCX0NVUlNPUl9IX18KKyNkZWZpbmUgX19SRkJfQ1VSU09SX0hfXworCisjaW5jbHVkZSA8cmZiL1BpeGVsQnVmZmVyLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIEN1cnNvciA6IHB1YmxpYyBNYW5hZ2VkUGl4ZWxCdWZmZXIgeworICBwdWJsaWM6CisgICAgQ3Vyc29yKCkge30KKyAgICByZHI6OlU4QXJyYXkgbWFzazsKKyAgICBQb2ludCBob3RzcG90OworCisgICAgaW50IG1hc2tMZW4oKSB7IHJldHVybiAod2lkdGgoKSArIDcpIC8gOCAqIGhlaWdodCgpOyB9CisKKyAgICAvLyBzZXRTaXplKCkgcmVzaXplcyB0aGUgY3Vyc29yLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIGFuZCBtYXNrIGFyZQorICAgIC8vIHVuZGVmaW5lZCBhZnRlciB0aGlzIGNhbGwuCisgICAgdmlydHVhbCB2b2lkIHNldFNpemUoaW50IHcsIGludCBoKTsKKworICAgIC8vIGRyYXdPdXRsaW5lKCkgYWRkcyBhbiBvdXRsaW5lIHRvIHRoZSBjdXJzb3IgaW4gdGhlIGdpdmVuIGNvbG91ci4KKyAgICB2b2lkIGRyYXdPdXRsaW5lKGNvbnN0IFBpeGVsJiBjKTsKKworICAgIC8vIGdldEJpdG1hcCgpIHRlc3RzIHdoZXRoZXIgdGhlIGN1cnNvciBpcyBtb25vY2hyb21lLCBhbmQgaWYgc28gcmV0dXJucyBhCisgICAgLy8gYml0bWFwIHRvZ2V0aGVyIHdpdGggYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZCBjb2xvdXJzLiAgVGhlIHNpemUgYW5kCisgICAgLy8gbGF5b3V0IG9mIHRoZSBiaXRtYXAgYXJlIHRoZSBzYW1lIGFzIHRoZSBtYXNrLgorICAgIHJkcjo6VTgqIGdldEJpdG1hcChQaXhlbCogcGl4MCwgUGl4ZWwqIHBpeDEpOworCisgICAgLy8gY3JvcCgpIGNyb3BzIHRoZSBjdXJzb3IgZG93biB0byB0aGUgc21hbGxlc3QgcG9zc2libGUgc2l6ZSwgYmFzZWQgb24gdGhlCisgICAgLy8gbWFzay4KKyAgICB2b2lkIGNyb3AoKTsKKyAgfTsKKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0RlY29kZXIuY3h4IGIvY29tbW9uL3JmYi9EZWNvZGVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU0ZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9EZWNvZGVyLmN4eApAQCAtMCwwICsxLDcwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxyZmIvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8cmZiL0RlY29kZXIuaD4KKyNpbmNsdWRlIDxyZmIvUmF3RGVjb2Rlci5oPgorI2luY2x1ZGUgPHJmYi9SUkVEZWNvZGVyLmg+CisjaW5jbHVkZSA8cmZiL0hleHRpbGVEZWNvZGVyLmg+CisjaW5jbHVkZSA8cmZiL1pSTEVEZWNvZGVyLmg+CisjaW5jbHVkZSA8cmZiL1RpZ2h0RGVjb2Rlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitEZWNvZGVyOjp+RGVjb2RlcigpCit7Cit9CisKK0RlY29kZXJDcmVhdGVGblR5cGUgRGVjb2Rlcjo6Y3JlYXRlRm5zW2VuY29kaW5nTWF4KzFdID0geyAwIH07CisKK2Jvb2wgRGVjb2Rlcjo6c3VwcG9ydGVkKHVuc2lnbmVkIGludCBlbmNvZGluZykKK3sKKyAgcmV0dXJuIGVuY29kaW5nIDw9IGVuY29kaW5nTWF4ICYmIGNyZWF0ZUZuc1tlbmNvZGluZ107Cit9CisKK0RlY29kZXIqIERlY29kZXI6OmNyZWF0ZURlY29kZXIodW5zaWduZWQgaW50IGVuY29kaW5nLCBDTXNnUmVhZGVyKiByZWFkZXIpCit7CisgIGlmIChlbmNvZGluZyA8PSBlbmNvZGluZ01heCAmJiBjcmVhdGVGbnNbZW5jb2RpbmddKQorICAgIHJldHVybiAoKmNyZWF0ZUZuc1tlbmNvZGluZ10pKHJlYWRlcik7CisgIHJldHVybiAwOworfQorCit2b2lkIERlY29kZXI6OnJlZ2lzdGVyRGVjb2Rlcih1bnNpZ25lZCBpbnQgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyQ3JlYXRlRm5UeXBlIGNyZWF0ZUZuKQoreworICBpZiAoZW5jb2RpbmcgPiBlbmNvZGluZ01heCkKKyAgICB0aHJvdyBFeGNlcHRpb24oIkRlY29kZXI6OnJlZ2lzdGVyRGVjb2RlcjogZW5jb2Rpbmcgb3V0IG9mIHJhbmdlIik7CisKKyAgaWYgKGNyZWF0ZUZuc1tlbmNvZGluZ10pCisgICAgZnByaW50ZihzdGRlcnIsIlJlcGxhY2luZyBleGlzdGluZyBkZWNvZGVyIGZvciBlbmNvZGluZyAlcyAoJWQpXG4iLAorICAgICAgICAgICAgZW5jb2RpbmdOYW1lKGVuY29kaW5nKSwgZW5jb2RpbmcpOworICBjcmVhdGVGbnNbZW5jb2RpbmddID0gY3JlYXRlRm47Cit9CisKK2ludCBEZWNvZGVySW5pdDo6Y291bnQgPSAwOworCitEZWNvZGVySW5pdDo6RGVjb2RlckluaXQoKQoreworICBpZiAoY291bnQrKyAhPSAwKSByZXR1cm47CisKKyAgRGVjb2Rlcjo6cmVnaXN0ZXJEZWNvZGVyKGVuY29kaW5nUmF3LCBSYXdEZWNvZGVyOjpjcmVhdGUpOworICBEZWNvZGVyOjpyZWdpc3RlckRlY29kZXIoZW5jb2RpbmdSUkUsIFJSRURlY29kZXI6OmNyZWF0ZSk7CisgIERlY29kZXI6OnJlZ2lzdGVyRGVjb2RlcihlbmNvZGluZ0hleHRpbGUsIEhleHRpbGVEZWNvZGVyOjpjcmVhdGUpOworICBEZWNvZGVyOjpyZWdpc3RlckRlY29kZXIoZW5jb2RpbmdaUkxFLCBaUkxFRGVjb2Rlcjo6Y3JlYXRlKTsKKyAgRGVjb2Rlcjo6cmVnaXN0ZXJEZWNvZGVyKGVuY29kaW5nVGlnaHQsIFRpZ2h0RGVjb2Rlcjo6Y3JlYXRlKTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvRGVjb2Rlci5oIGIvY29tbW9uL3JmYi9EZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkYmE1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvRGVjb2Rlci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpZm5kZWYgX19SRkJfREVDT0RFUl9IX18KKyNkZWZpbmUgX19SRkJfREVDT0RFUl9IX18KKworI2luY2x1ZGUgPHJmYi9SZWN0Lmg+CisjaW5jbHVkZSA8cmZiL2VuY29kaW5ncy5oPgorCituYW1lc3BhY2UgcmZiIHsKKyAgY2xhc3MgQ01zZ1JlYWRlcjsKKyAgY2xhc3MgQ01zZ0hhbmRsZXI7CisgIGNsYXNzIERlY29kZXI7CisgIHR5cGVkZWYgRGVjb2RlciogKCpEZWNvZGVyQ3JlYXRlRm5UeXBlKShDTXNnUmVhZGVyKik7CisKKyAgY2xhc3MgRGVjb2RlciB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5EZWNvZGVyKCk7CisgICAgdmlydHVhbCB2b2lkIHJlYWRSZWN0KGNvbnN0IFJlY3QmIHIsIENNc2dIYW5kbGVyKiBoYW5kbGVyKT0wOworCisgICAgc3RhdGljIGJvb2wgc3VwcG9ydGVkKHVuc2lnbmVkIGludCBlbmNvZGluZyk7CisgICAgc3RhdGljIERlY29kZXIqIGNyZWF0ZURlY29kZXIodW5zaWduZWQgaW50IGVuY29kaW5nLCBDTXNnUmVhZGVyKiByZWFkZXIpOworICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRGVjb2Rlcih1bnNpZ25lZCBpbnQgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJDcmVhdGVGblR5cGUgY3JlYXRlRm4pOworICBwcml2YXRlOgorICAgIHN0YXRpYyBEZWNvZGVyQ3JlYXRlRm5UeXBlIGNyZWF0ZUZuc1tlbmNvZGluZ01heCsxXTsKKyAgfTsKKworICBjbGFzcyBEZWNvZGVySW5pdCB7CisgICAgc3RhdGljIGludCBjb3VudDsKKyAgcHVibGljOgorICAgIERlY29kZXJJbml0KCk7CisgIH07CisKKyAgc3RhdGljIERlY29kZXJJbml0IGRlY29kZXJJbml0T2JqOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvRGlyTWFuYWdlci5oIGIvY29tbW9uL3JmYi9EaXJNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyMGY2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvRGlyTWFuYWdlci5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIERpck1hbmFnZXIuY3h4CisKKyNpZm5kZWYgX19SRkJfRElSTUFOQUdFUl9IX18KKyNkZWZpbmUgX19SRkJfRElSTUFOQUdFUl9IX18KKworI2luY2x1ZGUgPHJmYi9GaWxlSW5mby5oPgorCituYW1lc3BhY2UgcmZiIHsKKyAgY2xhc3MgRGlyTWFuYWdlciB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlRGlyKGNoYXIgKnBGdWxsUGF0aCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCByZW5hbWVJdChjaGFyICpwT2xkTmFtZSwgY2hhciAqcE5ld05hbWUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgZGVsZXRlSXQoY2hhciAqcEZ1bGxQYXRoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0RGlySW5mbyhjaGFyICpwUGF0aCwgRmlsZUluZm8gKnBGaWxlSW5mbywgdW5zaWduZWQgaW50IGRpck9ubHkpID0gMDsKKyAgfTsKK30KKworI2VuZGlmIC8vIF9fUkZCX0RJUk1BTkFHRVJfSF9fClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9FbmNvZGVyLmN4eCBiL2NvbW1vbi9yZmIvRW5jb2Rlci5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjYjE3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvRW5jb2Rlci5jeHgKQEAgLTAsMCArMSw3NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cmZiL0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHJmYi9FbmNvZGVyLmg+CisjaW5jbHVkZSA8cmZiL1Jhd0VuY29kZXIuaD4KKyNpbmNsdWRlIDxyZmIvUlJFRW5jb2Rlci5oPgorI2luY2x1ZGUgPHJmYi9IZXh0aWxlRW5jb2Rlci5oPgorI2luY2x1ZGUgPHJmYi9aUkxFRW5jb2Rlci5oPgorI2luY2x1ZGUgPHJmYi9UaWdodEVuY29kZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworRW5jb2Rlcjo6fkVuY29kZXIoKQoreworfQorCitFbmNvZGVyQ3JlYXRlRm5UeXBlIEVuY29kZXI6OmNyZWF0ZUZuc1tlbmNvZGluZ01heCsxXSA9IHsgMCB9OworCitib29sIEVuY29kZXI6OnN1cHBvcnRlZCh1bnNpZ25lZCBpbnQgZW5jb2RpbmcpCit7CisgIHJldHVybiBlbmNvZGluZyA8PSBlbmNvZGluZ01heCAmJiBjcmVhdGVGbnNbZW5jb2RpbmddOworfQorCitFbmNvZGVyKiBFbmNvZGVyOjpjcmVhdGVFbmNvZGVyKHVuc2lnbmVkIGludCBlbmNvZGluZywgU01zZ1dyaXRlciogd3JpdGVyKQoreworICBpZiAoZW5jb2RpbmcgPD0gZW5jb2RpbmdNYXggJiYgY3JlYXRlRm5zW2VuY29kaW5nXSkKKyAgICByZXR1cm4gKCpjcmVhdGVGbnNbZW5jb2RpbmddKSh3cml0ZXIpOworICByZXR1cm4gMDsKK30KKwordm9pZCBFbmNvZGVyOjpyZWdpc3RlckVuY29kZXIodW5zaWduZWQgaW50IGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RlckNyZWF0ZUZuVHlwZSBjcmVhdGVGbikKK3sKKyAgaWYgKGVuY29kaW5nID4gZW5jb2RpbmdNYXgpCisgICAgdGhyb3cgRXhjZXB0aW9uKCJFbmNvZGVyOjpyZWdpc3RlckVuY29kZXI6IGVuY29kaW5nIG91dCBvZiByYW5nZSIpOworCisgIGlmIChjcmVhdGVGbnNbZW5jb2RpbmddKQorICAgIGZwcmludGYoc3RkZXJyLCJSZXBsYWNpbmcgZXhpc3RpbmcgZW5jb2RlciBmb3IgZW5jb2RpbmcgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIGVuY29kaW5nTmFtZShlbmNvZGluZyksIGVuY29kaW5nKTsKKyAgY3JlYXRlRm5zW2VuY29kaW5nXSA9IGNyZWF0ZUZuOworfQorCit2b2lkIEVuY29kZXI6OnVucmVnaXN0ZXJFbmNvZGVyKHVuc2lnbmVkIGludCBlbmNvZGluZykKK3sKKyAgaWYgKGVuY29kaW5nID4gZW5jb2RpbmdNYXgpCisgICAgdGhyb3cgRXhjZXB0aW9uKCJFbmNvZGVyOjp1bnJlZ2lzdGVyRW5jb2RlcjogZW5jb2Rpbmcgb3V0IG9mIHJhbmdlIik7CisgIGNyZWF0ZUZuc1tlbmNvZGluZ10gPSAwOworfQorCitpbnQgRW5jb2RlckluaXQ6OmNvdW50ID0gMDsKKworRW5jb2RlckluaXQ6OkVuY29kZXJJbml0KCkKK3sKKyAgaWYgKGNvdW50KysgIT0gMCkgcmV0dXJuOworCisgIEVuY29kZXI6OnJlZ2lzdGVyRW5jb2RlcihlbmNvZGluZ1JhdywgUmF3RW5jb2Rlcjo6Y3JlYXRlKTsKKyAgRW5jb2Rlcjo6cmVnaXN0ZXJFbmNvZGVyKGVuY29kaW5nUlJFLCBSUkVFbmNvZGVyOjpjcmVhdGUpOworICBFbmNvZGVyOjpyZWdpc3RlckVuY29kZXIoZW5jb2RpbmdIZXh0aWxlLCBIZXh0aWxlRW5jb2Rlcjo6Y3JlYXRlKTsKKyAgRW5jb2Rlcjo6cmVnaXN0ZXJFbmNvZGVyKGVuY29kaW5nWlJMRSwgWlJMRUVuY29kZXI6OmNyZWF0ZSk7CisgIEVuY29kZXI6OnJlZ2lzdGVyRW5jb2RlcihlbmNvZGluZ1RpZ2h0LCBUaWdodEVuY29kZXI6OmNyZWF0ZSk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0VuY29kZXIuaCBiL2NvbW1vbi9yZmIvRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTBkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0VuY29kZXIuaApAQCAtMCwwICsxLDYxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fUkZCX0VOQ09ERVJfSF9fCisjZGVmaW5lIF9fUkZCX0VOQ09ERVJfSF9fCisKKyNpbmNsdWRlIDxyZmIvUmVjdC5oPgorI2luY2x1ZGUgPHJmYi9lbmNvZGluZ3MuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIFNNc2dXcml0ZXI7CisgIGNsYXNzIEVuY29kZXI7CisgIGNsYXNzIEltYWdlR2V0dGVyOworICB0eXBlZGVmIEVuY29kZXIqICgqRW5jb2RlckNyZWF0ZUZuVHlwZSkoU01zZ1dyaXRlciopOworCisgIGNsYXNzIEVuY29kZXIgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+RW5jb2RlcigpOworCisgICAgdmlydHVhbCB2b2lkIHNldENvbXByZXNzTGV2ZWwoaW50IGxldmVsKSB7fTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UXVhbGl0eUxldmVsKGludCBsZXZlbCkge307CisgICAgdmlydHVhbCBpbnQgZ2V0TnVtUmVjdHMoY29uc3QgUmVjdCAmcikgeyByZXR1cm4gMTsgfQorCisgICAgLy8gd3JpdGVSZWN0KCkgdHJpZXMgdG8gd3JpdGUgdGhlIGdpdmVuIHJlY3RhbmdsZS4gIElmIGl0IGlzIHVuYWJsZSB0bworICAgIC8vIHdyaXRlIHRoZSB3aG9sZSByZWN0YW5nbGUgaXQgcmV0dXJucyBmYWxzZSBhbmQgc2V0cyBhY3R1YWwgdG8gdGhlIGFjdHVhbAorICAgIC8vIHJlY3RhbmdsZSB3aGljaCB3YXMgdXBkYXRlZC4KKyAgICB2aXJ0dWFsIGJvb2wgd3JpdGVSZWN0KGNvbnN0IFJlY3QmIHIsIEltYWdlR2V0dGVyKiBpZywgUmVjdCogYWN0dWFsKT0wOworCisgICAgc3RhdGljIGJvb2wgc3VwcG9ydGVkKHVuc2lnbmVkIGludCBlbmNvZGluZyk7CisgICAgc3RhdGljIEVuY29kZXIqIGNyZWF0ZUVuY29kZXIodW5zaWduZWQgaW50IGVuY29kaW5nLCBTTXNnV3JpdGVyKiB3cml0ZXIpOworICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRW5jb2Rlcih1bnNpZ25lZCBpbnQgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZXJDcmVhdGVGblR5cGUgY3JlYXRlRm4pOworICAgIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJFbmNvZGVyKHVuc2lnbmVkIGludCBlbmNvZGluZyk7CisgIHByaXZhdGU6CisgICAgc3RhdGljIEVuY29kZXJDcmVhdGVGblR5cGUgY3JlYXRlRm5zW2VuY29kaW5nTWF4KzFdOworICB9OworCisgIGNsYXNzIEVuY29kZXJJbml0IHsKKyAgICBzdGF0aWMgaW50IGNvdW50OworICBwdWJsaWM6CisgICAgRW5jb2RlckluaXQoKTsKKyAgfTsKKworICBzdGF0aWMgRW5jb2RlckluaXQgZW5jb2RlckluaXRPYmo7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9FeGNlcHRpb24uaCBiL2NvbW1vbi9yZmIvRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyY2JjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvRXhjZXB0aW9uLmgKQEAgLTAsMCArMSwzNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2lmbmRlZiBfX1JGQl9FWENFUFRJT05fSF9fCisjZGVmaW5lIF9fUkZCX0VYQ0VQVElPTl9IX18KKworI2luY2x1ZGUgPHJkci9FeGNlcHRpb24uaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIHR5cGVkZWYgcmRyOjpFeGNlcHRpb24gRXhjZXB0aW9uOworICBzdHJ1Y3QgQXV0aEZhaWx1cmVFeGNlcHRpb24gOiBwdWJsaWMgRXhjZXB0aW9uIHsKKyAgICBBdXRoRmFpbHVyZUV4Y2VwdGlvbihjb25zdCBjaGFyKiBzPSJBdXRoZW50aWNhdGlvbiBmYWlsdXJlIikKKyAgICAgIDogRXhjZXB0aW9uKHMpIHt9CisgIH07CisgIHN0cnVjdCBBdXRoQ2FuY2VsbGVkRXhjZXB0aW9uIDogcHVibGljIHJmYjo6RXhjZXB0aW9uIHsKKyAgICBBdXRoQ2FuY2VsbGVkRXhjZXB0aW9uKGNvbnN0IGNoYXIqIHM9IkF1dGhlbnRpY2F0aW9uIGNhbmNlbGxlZCIpCisgICAgICA6IEV4Y2VwdGlvbihzKSB7fQorICB9OworICBzdHJ1Y3QgQ29ubkZhaWxlZEV4Y2VwdGlvbiA6IHB1YmxpYyBFeGNlcHRpb24geworICAgIENvbm5GYWlsZWRFeGNlcHRpb24oY29uc3QgY2hhciogcz0iQ29ubmVjdGlvbiBmYWlsZWQiKSA6IEV4Y2VwdGlvbihzKSB7fQorICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0ZpbGVJbmZvLmN4eCBiL2NvbW1vbi9yZmIvRmlsZUluZm8uY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5N2UwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0ZpbGVJbmZvLmN4eApAQCAtMCwwICsxLDI0NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA1IFRpZ2h0Vk5DIFRlYW0uICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBieSBEZW5uaXMgU3lyb3ZhdHNreS4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKgorICogVGlnaHRWTkMgZGlzdHJpYnV0aW9uIGhvbWVwYWdlIG9uIHRoZSBXZWI6IGh0dHA6Ly93d3cudGlnaHR2bmMuY29tLworICoKKyAqLworCisjaW5jbHVkZSA8cmZiL0ZpbGVJbmZvLmg+CisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBzdHJjYXNlY21wIF9zdHJpY21wCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworLy8gRklYTUU6IFVuZGVyIFVuaXgsIGZpbGUgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLgorCitpbnQgCitDb21wYXJlRmlsZUluZm8oY29uc3Qgdm9pZCAqRiwgY29uc3Qgdm9pZCAqUykKK3sKKyAgRklMRUlORk8gKnBGID0gKEZJTEVJTkZPICopIEY7CisgIEZJTEVJTkZPICpwUyA9IChGSUxFSU5GTyAqKSBTOworICBpZiAocEYtPmluZm8uZmxhZ3MgPT0gcFMtPmluZm8uZmxhZ3MpIHsKKyAgICByZXR1cm4gc3RyY2FzZWNtcChwRi0+bmFtZSwgcFMtPm5hbWUpOworICB9IGVsc2UgeworCWlmIChwRi0+aW5mby5mbGFncyA9PSBGVF9BVFRSX0RJUikgcmV0dXJuIC0xOworCWlmIChwUy0+aW5mby5mbGFncyA9PSBGVF9BVFRSX0RJUikKKyAgICAgIHJldHVybiAxOworCWVsc2UKKyAgICAgIHJldHVybiBzdHJjYXNlY21wKHBGLT5uYW1lLCBwUy0+bmFtZSk7CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCitGaWxlSW5mbzo6RmlsZUluZm8oKQoreworICBtX251bUVudHJpZXMgPSAwOworICBtX3BFbnRyaWVzID0gTlVMTDsKK30KKworRmlsZUluZm86On5GaWxlSW5mbygpCit7CisgIGZyZWUoKTsKK30KKwordm9pZCAKK0ZpbGVJbmZvOjphZGQoRmlsZUluZm8gKnBGSSkKK3sKKyAgbV9udW1FbnRyaWVzID0gcEZJLT5nZXROdW1FbnRyaWVzKCk7CisgIEZJTEVJTkZPICpwVGVtcG9yYXJ5ID0gbmV3IEZJTEVJTkZPW21fbnVtRW50cmllc107CisgIG1lbWNweShwVGVtcG9yYXJ5LCBwRkktPmdldE5hbWVBdCgwKSwgbV9udW1FbnRyaWVzICogc2l6ZW9mKEZJTEVJTkZPKSk7CisgIAorICBtX3BFbnRyaWVzID0gcFRlbXBvcmFyeTsKKyAgcFRlbXBvcmFyeSA9IE5VTEw7Cit9CisKK3ZvaWQgCitGaWxlSW5mbzo6YWRkKEZJTEVJTkZPICpwRklTdHJ1Y3QpCit7CisgIGFkZChwRklTdHJ1Y3QtPm5hbWUsIHBGSVN0cnVjdC0+aW5mby5zaXplLCBwRklTdHJ1Y3QtPmluZm8uZGF0YSwgcEZJU3RydWN0LT5pbmZvLmZsYWdzKTsKK30KKwordm9pZCAKK0ZpbGVJbmZvOjphZGQoY2hhciAqcE5hbWUsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworICBGSUxFSU5GTyAqcFRlbXBvcmFyeSA9IG5ldyBGSUxFSU5GT1ttX251bUVudHJpZXMgKyAxXTsKKyAgaWYgKG1fbnVtRW50cmllcyAhPSAwKSAKKyAgICBtZW1jcHkocFRlbXBvcmFyeSwgbV9wRW50cmllcywgbV9udW1FbnRyaWVzICogc2l6ZW9mKEZJTEVJTkZPKSk7CisgIHN0cmNweShwVGVtcG9yYXJ5W21fbnVtRW50cmllc10ubmFtZSwgcE5hbWUpOworICBwVGVtcG9yYXJ5W21fbnVtRW50cmllc10uaW5mby5zaXplID0gc2l6ZTsKKyAgcFRlbXBvcmFyeVttX251bUVudHJpZXNdLmluZm8uZGF0YSA9IGRhdGE7CisgIHBUZW1wb3JhcnlbbV9udW1FbnRyaWVzXS5pbmZvLmZsYWdzID0gZmxhZ3M7CisgIGlmIChtX3BFbnRyaWVzICE9IE5VTEwpIHsKKyAgICBkZWxldGUgW10gbV9wRW50cmllczsKKyAgICBtX3BFbnRyaWVzID0gTlVMTDsKKyAgfQorICBtX3BFbnRyaWVzID0gcFRlbXBvcmFyeTsKKyAgcFRlbXBvcmFyeSA9IE5VTEw7CisgIG1fbnVtRW50cmllcysrOworfQorCitjaGFyICoKK0ZpbGVJbmZvOjpnZXROYW1lQXQodW5zaWduZWQgaW50IG51bWJlcikKK3sKKyAgaWYgKChudW1iZXIgPj0gMCkgJiYgKG51bWJlciA8IG1fbnVtRW50cmllcykpIHsKKyAgICByZXR1cm4gbV9wRW50cmllc1tudW1iZXJdLm5hbWU7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgCitGaWxlSW5mbzo6c2V0TmFtZUF0KHVuc2lnbmVkIGludCBudW1iZXIsIGNoYXIgKnBOYW1lKQoreworICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgbV9udW1FbnRyaWVzKSkgeworICAgIHN0cmNweShtX3BFbnRyaWVzW251bWJlcl0ubmFtZSwgcE5hbWUpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordW5zaWduZWQgaW50CitGaWxlSW5mbzo6Z2V0U2l6ZUF0KHVuc2lnbmVkIGludCBudW1iZXIpCit7CisgIGlmICgobnVtYmVyID49IDApICYmIChudW1iZXIgPCBtX251bUVudHJpZXMpKSB7CisgICAgcmV0dXJuIG1fcEVudHJpZXNbbnVtYmVyXS5pbmZvLnNpemU7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludAorRmlsZUluZm86OmdldERhdGFBdCh1bnNpZ25lZCBpbnQgbnVtYmVyKQoreworICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgbV9udW1FbnRyaWVzKSkgeworICAgIHJldHVybiBtX3BFbnRyaWVzW251bWJlcl0uaW5mby5kYXRhOworICB9CisgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQKK0ZpbGVJbmZvOjpnZXRGbGFnc0F0KHVuc2lnbmVkIGludCBudW1iZXIpCit7CisJaWYgKChudW1iZXIgPj0gMCkgJiYgKG51bWJlciA8IG1fbnVtRW50cmllcykpIHsKKwkJcmV0dXJuIG1fcEVudHJpZXNbbnVtYmVyXS5pbmZvLmZsYWdzOworCX0KKwlyZXR1cm4gMDsKK30KKworRklMRUlORk8gKiAKK0ZpbGVJbmZvOjpnZXRGdWxsRGF0YUF0KHVuc2lnbmVkIGludCBudW1iZXIpCit7CisgIGlmICgobnVtYmVyID49IDApICYmIChudW1iZXIgPCBtX251bUVudHJpZXMpKSB7CisgICAgcmV0dXJuICZtX3BFbnRyaWVzW251bWJlcl07CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisJCitib29sIAorRmlsZUluZm86OnNldFNpemVBdCh1bnNpZ25lZCBpbnQgbnVtYmVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisgIGlmICgobnVtYmVyID49IDApICYmIChudW1iZXIgPCBtX251bUVudHJpZXMpKSB7CisgICAgbV9wRW50cmllc1tudW1iZXJdLmluZm8uc2l6ZSA9IHZhbHVlOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCAKK0ZpbGVJbmZvOjpzZXREYXRhQXQodW5zaWduZWQgaW50IG51bWJlciwgdW5zaWduZWQgaW50IHZhbHVlKQoreworICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgbV9udW1FbnRyaWVzKSkgeworICAgIG1fcEVudHJpZXNbbnVtYmVyXS5pbmZvLmRhdGEgPSB2YWx1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgCitGaWxlSW5mbzo6c2V0RmxhZ3NBdCh1bnNpZ25lZCBpbnQgbnVtYmVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisgIGlmICgobnVtYmVyID49IDApICYmIChudW1iZXIgPCBtX251bUVudHJpZXMpKSB7CisgICAgbV9wRW50cmllc1tudW1iZXJdLmluZm8uZmxhZ3MgPSB2YWx1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgCitGaWxlSW5mbzo6ZGVsZXRlQXQodW5zaWduZWQgaW50IG51bWJlcikKK3sKKyAgaWYgKChudW1iZXIgPj0gbV9udW1FbnRyaWVzKSB8fCAobnVtYmVyIDwgMCkpIHJldHVybiBmYWxzZTsKKyAgCisgIEZJTEVJTkZPICpwVGVtcG9yYXJ5ID0gbmV3IEZJTEVJTkZPW21fbnVtRW50cmllcyAtIDFdOworICAKKyAgaWYgKG51bWJlciA9PSAwKSB7CisgICAgbWVtY3B5KHBUZW1wb3JhcnksICZtX3BFbnRyaWVzWzFdLCAobV9udW1FbnRyaWVzIC0gMSkgKiBzaXplb2YoRklMRUlORk8pKTsKKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkocFRlbXBvcmFyeSwgbV9wRW50cmllcywgbnVtYmVyICogc2l6ZW9mKEZJTEVJTkZPKSk7CisgICAgaWYgKG51bWJlciAhPSAobV9udW1FbnRyaWVzIC0gMSkpIAorICAgICAgbWVtY3B5KCZwVGVtcG9yYXJ5W251bWJlcl0sICZtX3BFbnRyaWVzW251bWJlciArIDFdLCAobV9udW1FbnRyaWVzIC0gbnVtYmVyIC0gMSkgKiBzaXplb2YoRklMRUlORk8pKTsKKyAgfQorICAKKyAgaWYgKG1fcEVudHJpZXMgIT0gTlVMTCkgeworICAgIGRlbGV0ZSBbXSBtX3BFbnRyaWVzOworICAgIG1fcEVudHJpZXMgPSBOVUxMOworICB9CisgIG1fcEVudHJpZXMgPSBwVGVtcG9yYXJ5OworICBwVGVtcG9yYXJ5ID0gTlVMTDsKKyAgbV9udW1FbnRyaWVzLS07CisgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBpbnQgCitGaWxlSW5mbzo6Z2V0TnVtRW50cmllcygpCit7CisgIHJldHVybiBtX251bUVudHJpZXM7Cit9CisKK3ZvaWQgCitGaWxlSW5mbzo6c29ydCgpCit7CisgIHFzb3J0KG1fcEVudHJpZXMsIG1fbnVtRW50cmllcywgc2l6ZW9mKEZJTEVJTkZPKSwgQ29tcGFyZUZpbGVJbmZvKTsKK30KKwordm9pZCAKK0ZpbGVJbmZvOjpmcmVlKCkKK3sKKyAgaWYgKG1fcEVudHJpZXMgIT0gTlVMTCkgeworICAgIGRlbGV0ZSBbXSBtX3BFbnRyaWVzOworICAgIG1fcEVudHJpZXMgPSBOVUxMOworICB9CisgIG1fbnVtRW50cmllcyA9IDA7Cit9CisKK3Vuc2lnbmVkIGludAorRmlsZUluZm86OmdldEZpbGVuYW1lc1NpemUoKQoreworICBpZiAoZ2V0TnVtRW50cmllcygpID09IDApIHJldHVybiAwOworCisgIHVuc2lnbmVkIGludCBmaWxlbmFtZXNTaXplID0gMDsKKworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGdldE51bUVudHJpZXMoKTsgaSsrKSB7CisgICAgZmlsZW5hbWVzU2l6ZSArPSBzdHJsZW4oZ2V0TmFtZUF0KGkpKTsKKyAgfQorCisgIHJldHVybiBmaWxlbmFtZXNTaXplOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9GaWxlSW5mby5oIGIvY29tbW9uL3JmYi9GaWxlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MGVlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0ZpbGVJbmZvLmgKQEAgLTAsMCArMSw3NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA1IFRpZ2h0Vk5DIFRlYW0uICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBieSBEZW5uaXMgU3lyb3ZhdHNreS4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKgorICogVGlnaHRWTkMgZGlzdHJpYnV0aW9uIGhvbWVwYWdlIG9uIHRoZSBXZWI6IGh0dHA6Ly93d3cudGlnaHR2bmMuY29tLworICoKKyAqLworCisvLyAtPS0gRmlsZUluZm8uCisKKyNpZm5kZWYgX19SRkJfRklMRUlORk9fSF9fCisjZGVmaW5lIF9fUkZCX0ZJTEVJTkZPX0hfXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxyZmIvZnR0eXBlcy5oPgorCituYW1lc3BhY2UgcmZiIHsKKyAgY2xhc3MgRmlsZUluZm8gIAorICB7CisgIHB1YmxpYzoKKyAgICB2b2lkIGFkZChGaWxlSW5mbyAqcEZJKTsKKyAgICB2b2lkIGFkZChGSUxFSU5GTyAqcEZJU3RydWN0KTsKKyAgICB2b2lkIGFkZChjaGFyICpwTmFtZSwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworICAgIAorICAgIGNoYXIgKmdldE5hbWVBdCh1bnNpZ25lZCBpbnQgbnVtYmVyKTsKKyAgICAKKyAgICBib29sIHNldE5hbWVBdCh1bnNpZ25lZCBpbnQgbnVtYmVyLCBjaGFyICpwTmFtZSk7CisgICAgCisgICAgdW5zaWduZWQgaW50IGdldFNpemVBdCh1bnNpZ25lZCBpbnQgbnVtYmVyKTsKKyAgICB1bnNpZ25lZCBpbnQgZ2V0RGF0YUF0KHVuc2lnbmVkIGludCBudW1iZXIpOworICAgIHVuc2lnbmVkIGludCBnZXRGbGFnc0F0KHVuc2lnbmVkIGludCBudW1iZXIpOworICAgIAorICAgIEZJTEVJTkZPICpnZXRGdWxsRGF0YUF0KHVuc2lnbmVkIGludCBudW1iZXIpOworICAgIAorICAgIGJvb2wgc2V0U2l6ZUF0KHVuc2lnbmVkIGludCBudW1iZXIsIHVuc2lnbmVkIGludCB2YWx1ZSk7CisgICAgYm9vbCBzZXREYXRhQXQodW5zaWduZWQgaW50IG51bWJlciwgdW5zaWduZWQgaW50IHZhbHVlKTsKKyAgICBib29sIHNldEZsYWdzQXQodW5zaWduZWQgaW50IG51bWJlciwgdW5zaWduZWQgaW50IHZhbHVlKTsKKyAgICAKKyAgICBib29sIGRlbGV0ZUF0KHVuc2lnbmVkIGludCBudW1iZXIpOworICAgIAorICAgIHVuc2lnbmVkIGludCBnZXROdW1FbnRyaWVzKCk7CisKKyAgICB1bnNpZ25lZCBpbnQgZ2V0RmlsZW5hbWVzU2l6ZSgpOworICAgIAorICAgIHZvaWQgc29ydCgpOworICAgIHZvaWQgZnJlZSgpOworICAgIAorICAgIEZpbGVJbmZvKCk7CisgICAgfkZpbGVJbmZvKCk7CisgICAgCisgIHByaXZhdGU6CisgICAgRklMRUlORk8gKm1fcEVudHJpZXM7CisgICAgdW5zaWduZWQgaW50IG1fbnVtRW50cmllczsKKworICB9OworfQorCisjZW5kaWYgLy8gX19SRkJfRklMRUlORk9fSF9fCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0ZpbGVNYW5hZ2VyLmN4eCBiL2NvbW1vbi9yZmIvRmlsZU1hbmFnZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2JkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0ZpbGVNYW5hZ2VyLmN4eApAQCAtMCwwICsxLDgxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGlnaHRWTkMgVGVhbS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGJ5IERlbm5pcyBTeXJvdmF0c2t5LgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqCisgKiBUaWdodFZOQyBkaXN0cmlidXRpb24gaG9tZXBhZ2Ugb24gdGhlIFdlYjogaHR0cDovL3d3dy50aWdodHZuYy5jb20vCisgKgorICovCisKKy8vIC09LSBGaWxlTWFuYWdlci5jeHgKKworI2luY2x1ZGUgPHJmYi9GaWxlTWFuYWdlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitGaWxlTWFuYWdlcjo6RmlsZU1hbmFnZXIoKQoreworICBtX3BGaWxlID0gTlVMTDsKK30KKworRmlsZU1hbmFnZXI6On5GaWxlTWFuYWdlcigpCit7CisgIGNsb3NlKCk7Cit9CisKK2Jvb2wgCitGaWxlTWFuYWdlcjo6Y3JlYXRlKGNoYXIgKnBGaWxlbmFtZSkKK3sKKyAgaWYgKG1fcEZpbGUgIT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAKKyAgc3RyY3B5KG1fc3pGaWxlbmFtZSwgcEZpbGVuYW1lKTsKKworICBtX3BGaWxlID0gZm9wZW4obV9zekZpbGVuYW1lLCBtX3N6TW9kZSk7CisKKyAgaWYgKG1fcEZpbGUgPT0gTlVMTCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitib29sIAorRmlsZU1hbmFnZXI6OmNsb3NlKCkKK3sKKyAgaWYgKG1fcEZpbGUgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAKKyAgaW50IHJlc3VsdCA9IGZjbG9zZShtX3BGaWxlKTsKKyAgCisgIGlmIChyZXN1bHQgIT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBtX3BGaWxlID0gTlVMTDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitib29sIAorRmlsZU1hbmFnZXI6OmlzQ3JlYXRlZCgpCit7CisgIGlmIChtX3BGaWxlICE9IE5VTEwpIHJldHVybiB0cnVlOyBlbHNlIHJldHVybiBmYWxzZTsKK30KKworY2hhciAqCitGaWxlTWFuYWdlcjo6Z2V0RmlsZW5hbWUoKQoreworICByZXR1cm4gbV9zekZpbGVuYW1lOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9GaWxlTWFuYWdlci5oIGIvY29tbW9uL3JmYi9GaWxlTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDczNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0ZpbGVNYW5hZ2VyLmgKQEAgLTAsMCArMSw1MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA1IFRpZ2h0Vk5DIFRlYW0uICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBieSBEZW5uaXMgU3lyb3ZhdHNreS4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKgorICogVGlnaHRWTkMgZGlzdHJpYnV0aW9uIGhvbWVwYWdlIG9uIHRoZSBXZWI6IGh0dHA6Ly93d3cudGlnaHR2bmMuY29tLworICoKKyAqLworCisvLyAtPS0gRmlsZU1hbmFnZXIuCisKKyNpZm5kZWYgX19SRkJfRklMRU1BTkFHRVJfSF9fCisjZGVmaW5lIF9fUkZCX0ZJTEVNQU5BR0VSX0hfXworCisjaW5jbHVkZSA8cmZiL2Z0dHlwZXMuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIEZpbGVNYW5hZ2VyIHsKKyAgcHVibGljOgorICAgIEZpbGVNYW5hZ2VyKCk7CisgICAgfkZpbGVNYW5hZ2VyKCk7CisgICAgCisgICAgYm9vbCBjcmVhdGUoY2hhciAqcEZpbGVuYW1lKTsKKyAgICBib29sIGNsb3NlKCk7CisgICAgCisgICAgYm9vbCBpc0NyZWF0ZWQoKTsKKworICAgIGNoYXIgKmdldEZpbGVuYW1lKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIEZJTEUgKm1fcEZpbGU7CisgICAgY2hhciBtX3N6TW9kZVs0XTsKKyAgICBjaGFyIG1fc3pGaWxlbmFtZVtGVF9GSUxFTkFNRV9TSVpFXTsKKyAgfTsKK30KKyNlbmRpZiAvLyBfX1JGQl9GSUxFTUFOQUdFUl9IX18KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvRmlsZVJlYWRlci5jeHggYi9jb21tb24vcmZiL0ZpbGVSZWFkZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Y2QyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0ZpbGVSZWFkZXIuY3h4CkBAIC0wLDAgKzEsNTEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIEZpbGVSZWFkZXIuY3h4CisKKyNpbmNsdWRlIDxyZmIvRmlsZVJlYWRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitGaWxlUmVhZGVyOjpGaWxlUmVhZGVyKCkKK3sKKyAgc3RyY3B5KG1fc3pNb2RlLCAicmIiKTsKK30KKworYm9vbCAKK0ZpbGVSZWFkZXI6OnJlYWQodm9pZCAqcEJ1ZiwgdW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgKnBCeXRlc1JlYWQpCit7CisgIGlmICghaXNDcmVhdGVkKCkpIHJldHVybiBmYWxzZTsKKworICAqcEJ5dGVzUmVhZCA9IGZyZWFkKHBCdWYsIDEsIGNvdW50LCBtX3BGaWxlKTsKKyAgCisgIGlmIChmZXJyb3IobV9wRmlsZSkpIHJldHVybiBmYWxzZTsKKyAKKyAgcmV0dXJuIHRydWU7Cit9CisKK3Vuc2lnbmVkIGludCAKK0ZpbGVSZWFkZXI6OmdldFRpbWUoKQoreworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvRmlsZVJlYWRlci5oIGIvY29tbW9uL3JmYi9GaWxlUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5ODVkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvRmlsZVJlYWRlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIEZpbGVSZWFkZXIuaAorCisjaWZuZGVmIF9fUkZCX0ZJTEVSRUFERVJfSF9fCisjZGVmaW5lIF9fUkZCX0ZJTEVSRUFERVJfSF9fCisKKyNpbmNsdWRlIDxyZmIvRmlsZU1hbmFnZXIuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIEZpbGVSZWFkZXIgOiBwdWJsaWMgRmlsZU1hbmFnZXIgeworICBwdWJsaWM6CisgICAgRmlsZVJlYWRlcigpOworCisgICAgYm9vbCByZWFkKHZvaWQgKnBCdWYsIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50ICpwQnl0ZXNSZWFkKTsKKworICAgIHVuc2lnbmVkIGludCBnZXRUaW1lKCk7CisgIH07Cit9CisjZW5kaWYgLy8gX19SRkJfRklMRVJFQURFUl9IX18KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvRmlsZVdyaXRlci5jeHggYi9jb21tb24vcmZiL0ZpbGVXcml0ZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWQ1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0ZpbGVXcml0ZXIuY3h4CkBAIC0wLDAgKzEsNTIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIEZpbGVXcml0ZXIuY3h4CisKKyNpbmNsdWRlIDxyZmIvRmlsZVdyaXRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitGaWxlV3JpdGVyOjpGaWxlV3JpdGVyKCkKK3sKKyAgc3RyY3B5KG1fc3pNb2RlLCAid2IiKTsKK30KKworYm9vbCAKK0ZpbGVXcml0ZXI6OndyaXRlKGNvbnN0IHZvaWQgKnBCdWYsIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50ICpwQnl0ZXNXcml0dGVuKQoreworICBpZiAoIWlzQ3JlYXRlZCgpKSByZXR1cm4gZmFsc2U7CisKKyAgdW5zaWduZWQgaW50IGJ5dGVzV3JpdHRlbiA9IGZ3cml0ZShwQnVmLCAxLCBjb3VudCwgbV9wRmlsZSk7CisKKyAgaWYgKGZlcnJvcihtX3BGaWxlKSkgcmV0dXJuIGZhbHNlOworCisgICpwQnl0ZXNXcml0dGVuID0gYnl0ZXNXcml0dGVuOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCAKK0ZpbGVXcml0ZXI6OnNldFRpbWUodW5zaWduZWQgaW50IG1vZFRpbWUpCit7CisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvRmlsZVdyaXRlci5oIGIvY29tbW9uL3JmYi9GaWxlV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwOTRhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvRmlsZVdyaXRlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIEZpbGVXcml0ZXIuaAorCisjaWZuZGVmIF9fUkZCX0ZJTEVXUklURVJfSF9fCisjZGVmaW5lIF9fUkZCX0ZJTEVXUklURVJfSF9fCisKKyNpbmNsdWRlIDxyZmIvRmlsZU1hbmFnZXIuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIEZpbGVXcml0ZXIgOiBwdWJsaWMgRmlsZU1hbmFnZXIgeworICBwdWJsaWM6CisgICAgRmlsZVdyaXRlcigpOworCisgICAgYm9vbCB3cml0ZShjb25zdCB2b2lkICpwQnVmLCB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCAqcEJ5dGVzV3JpdHRlbik7CisgICAgYm9vbCBzZXRUaW1lKHVuc2lnbmVkIGludCBtb2RUaW1lKTsKKyAgfTsKK30KKworI2VuZGlmIC8vIF9fUkZCX0ZJTEVXUklURVJfSF9fCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0hUVFBTZXJ2ZXIuY3h4IGIvY29tbW9uL3JmYi9IVFRQU2VydmVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDBkNDgwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9IVFRQU2VydmVyLmN4eApAQCAtMCwwICsxLDQxMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisjaW5jbHVkZSA8cmZiL0hUVFBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDxyZmIvTG9nV3JpdGVyLmg+CisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKyNpbmNsdWRlIDxyZHIvTWVtT3V0U3RyZWFtLmg+CisKKyNpZmRlZiBXSU4zMgorI2RlZmluZSBzdHJjYXNlY21wIF9zdHJpY21wCisjZW5kaWYKKworCit1c2luZyBuYW1lc3BhY2UgcmZiOwordXNpbmcgbmFtZXNwYWNlIHJkcjsKKworc3RhdGljIExvZ1dyaXRlciB2bG9nKCJIVFRQU2VydmVyIik7CisKK2NvbnN0IGludCBjbGllbnRXYWl0VGltZU1pbGxpcyA9IDIwMDAwOworY29uc3QgaW50IGlkbGVUaW1lb3V0U2VjcyA9IDUgKiA2MDsKKworCisvLworLy8gLT0tIExpbmVSZWFkZXIKKy8vICAgICBIZWxwZXIgY2xhc3Mgd2hpY2ggaXMgcmVwZWF0ZWRseSBjYWxsZWQgdW50aWwgYSBsaW5lIGhhcyBiZWVuIHJlYWQKKy8vICAgICAobGluZXMgZW5kIGluIFxuIG9yIFxyXG4pLgorLy8gICAgIFJldHVybnMgdHJ1ZSB3aGVuIGxpbmUgY29tcGxldGUsIGFuZCByZXNldHMgaW50ZXJuYWwgc3RhdGUgc28gdGhhdAorLy8gICAgIG5leHQgcmVhZCgpIGNhbGwgd2lsbCBzdGFydCByZWFkaW5nIGEgbmV3IGxpbmUuCisvLyAgICAgT25seSBvbmUgYnVmZmVyIGlzIGtlcHQgLSBwcm9jZXNzIGxpbmUgYmVmb3JlIHJlYWRpbmcgbmV4dCBsaW5lIQorLy8KKworY2xhc3MgTGluZVJlYWRlciA6IHB1YmxpYyBDaGFyQXJyYXkgeworcHVibGljOgorICBMaW5lUmVhZGVyKEluU3RyZWFtJiBpc18sIGludCBsKQorICAgIDogQ2hhckFycmF5KGwpLCBpcyhpc18pLCBwb3MoMCksIGxlbihsKSwgYnVmZmVyT3ZlcnJ1bihmYWxzZSkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWYgbGluZSBjb21wbGV0ZSwgZmFsc2Ugb3RoZXJ3aXNlCisgIGJvb2wgcmVhZCgpIHsKKyAgICB3aGlsZSAoaXMuY2hlY2tOb1dhaXQoMSkpIHsKKyAgICAgIGNoYXIgYyA9IGlzLnJlYWRVOCgpOworCisgICAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgIGlmIChwb3MgJiYgKGJ1Zltwb3MtMV0gPT0gJ1xyJykpCisgICAgICAgICAgcG9zLS07CisgICAgICAgIGJ1ZmZlck92ZXJydW4gPSBmYWxzZTsKKyAgICAgICAgYnVmW3BvcysrXSA9IDA7CisgICAgICAgIHBvcyA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpZiAocG9zID09IChsZW4tMSkpIHsKKyAgICAgICAgYnVmZmVyT3ZlcnJ1biA9IHRydWU7CisgICAgICAgIGJ1Zltwb3NdID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIGJ1Zltwb3MrK10gPSBjOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIGRpZEJ1ZmZlck92ZXJydW4oKSBjb25zdCB7cmV0dXJuIGJ1ZmZlck92ZXJydW47fQorcHJvdGVjdGVkOgorICBJblN0cmVhbSYgaXM7CisgIGludCBwb3MsIGxlbjsKKyAgYm9vbCBidWZmZXJPdmVycnVuOworfTsKKworCisvLworLy8gLT0tIEhUVFBTZXJ2ZXI6OlNlc3Npb24KKy8vICAgICBNYW5hZ2VzIHRoZSBpbnRlcm5hbCBzdGF0ZSBmb3IgYW4gSFRUUCBzZXNzaW9uLgorLy8gICAgIHByb2Nlc3NIVFRQIHJldHVybnMgdHJ1ZSB3aGVuIHJlcXVlc3QgaGFzIGNvbXBsZXRlZCwKKy8vICAgICBpbmRpY2F0aW5nIHRoYXQgc29ja2V0ICYgc2Vzc2lvbiBkYXRhIGNhbiBiZSBkZWxldGVkLgorLy8KKworY2xhc3MgcmZiOjpIVFRQU2VydmVyOjpTZXNzaW9uIHsKK3B1YmxpYzoKKyAgU2Vzc2lvbihuZXR3b3JrOjpTb2NrZXQmIHMsIHJmYjo6SFRUUFNlcnZlciYgc3J2KQorICAgIDogY29udGVudFR5cGUoMCksIGNvbnRlbnRMZW5ndGgoLTEpLCBsYXN0TW9kaWZpZWQoLTEpLAorICAgICAgbGluZShzLmluU3RyZWFtKCksIDI1NiksIHNvY2socyksCisgICAgICBzZXJ2ZXIoc3J2KSwgc3RhdGUoUmVhZFJlcXVlc3RMaW5lKSwgbGFzdEFjdGl2ZSh0aW1lKDApKSB7CisgIH0KKyAgflNlc3Npb24oKSB7CisgIH0KKworICB2b2lkIHdyaXRlUmVzcG9uc2UoaW50IHJlc3VsdCwgY29uc3QgY2hhciogdGV4dCk7CisgIGJvb2wgd3JpdGVSZXNwb25zZShpbnQgY29kZSk7CisKKyAgYm9vbCBwcm9jZXNzSFRUUCgpOworCisgIG5ldHdvcms6OlNvY2tldCogZ2V0U29jaygpIGNvbnN0IHtyZXR1cm4gJnNvY2s7fQorCisgIGludCBjaGVja0lkbGVUaW1lb3V0KCk7Citwcm90ZWN0ZWQ6CisgIENoYXJBcnJheSB1cmk7CisgIGNvbnN0IGNoYXIqIGNvbnRlbnRUeXBlOworICBpbnQgY29udGVudExlbmd0aDsKKyAgdGltZV90IGxhc3RNb2RpZmllZDsKKyAgTGluZVJlYWRlciBsaW5lOworICBuZXR3b3JrOjpTb2NrZXQmIHNvY2s7CisgIHJmYjo6SFRUUFNlcnZlciYgc2VydmVyOworICBlbnVtIHtSZWFkUmVxdWVzdExpbmUsIFJlYWRIZWFkZXJzLCBXcml0ZVJlc3BvbnNlfSBzdGF0ZTsKKyAgZW51bSB7R2V0UmVxdWVzdCwgSGVhZFJlcXVlc3R9IHJlcXVlc3Q7CisgIHRpbWVfdCBsYXN0QWN0aXZlOworfTsKKworCisvLyAtIEludGVybmFsIGhlbHBlciByb3V0aW5lcworCit2b2lkCitjb3B5U3RyZWFtKEluU3RyZWFtJiBpcywgT3V0U3RyZWFtJiBvcykgeworICB0cnkgeworICAgIHdoaWxlICgxKSB7CisgICAgICBvcy53cml0ZVU4KGlzLnJlYWRVOCgpKTsKKyAgICB9CisgIH0gY2F0Y2ggKHJkcjo6RW5kT2ZTdHJlYW0pIHsKKyAgfQorfQorCit2b2lkIHdyaXRlTGluZShPdXRTdHJlYW0mIG9zLCBjb25zdCBjaGFyKiB0ZXh0KSB7CisgIG9zLndyaXRlQnl0ZXModGV4dCwgc3RybGVuKHRleHQpKTsKKyAgb3Mud3JpdGVCeXRlcygiXHJcbiIsIDIpOworfQorCisKKy8vIC0gV3JpdGUgYW4gSFRUUC1jb21wbGlhbnQgcmVzcG9uc2UgdG8gdGhlIGNsaWVudAorCisKK3ZvaWQKK0hUVFBTZXJ2ZXI6OlNlc3Npb246OndyaXRlUmVzcG9uc2UoaW50IHJlc3VsdCwgY29uc3QgY2hhciogdGV4dCkgeworICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgaWYgKHN0cmxlbih0ZXh0KSA+IDUxMikKKyAgICB0aHJvdyBuZXcgcmRyOjpFeGNlcHRpb24oIkludGVybmFsIGVycm9yIC0gSFRUUCByZXNwb25zZSB0ZXh0IHRvbyBiaWciKTsKKyAgc3ByaW50ZihidWZmZXIsICIlcyAlZCAlcyIsICJIVFRQLzEuMSIsIHJlc3VsdCwgdGV4dCk7CisgIE91dFN0cmVhbSYgb3M9c29jay5vdXRTdHJlYW0oKTsKKyAgd3JpdGVMaW5lKG9zLCBidWZmZXIpOworICB3cml0ZUxpbmUob3MsICJTZXJ2ZXI6IFRpZ2h0Vk5DLzQuMCIpOworICB0aW1lX3Qgbm93ID0gdGltZSgwKTsKKyAgc3RydWN0IHRtKiB0bSA9IGdtdGltZSgmbm93KTsKKyAgc3RyZnRpbWUoYnVmZmVyLCAxMDI0LCAiRGF0ZTogJWEsICVkICViICVZICVIOiVNOiVTIEdNVCIsIHRtKTsKKyAgd3JpdGVMaW5lKG9zLCBidWZmZXIpOworICBpZiAobGFzdE1vZGlmaWVkID09ICh0aW1lX3QpLTEgfHwgbGFzdE1vZGlmaWVkID09IDApCisgICAgbGFzdE1vZGlmaWVkID0gbm93OworICB0bSA9IGdtdGltZSgmbGFzdE1vZGlmaWVkKTsKKyAgc3RyZnRpbWUoYnVmZmVyLCAxMDI0LCAiTGFzdC1Nb2RpZmllZDogJWEsICVkICViICVZICVIOiVNOiVTIEdNVCIsIHRtKTsKKyAgd3JpdGVMaW5lKG9zLCBidWZmZXIpOworICBpZiAoY29udGVudExlbmd0aCAhPSAtMSkgeworICAgIHNwcmludGYoYnVmZmVyLCJDb250ZW50LUxlbmd0aDogJWQiLGNvbnRlbnRMZW5ndGgpOworICAgIHdyaXRlTGluZShvcywgYnVmZmVyKTsKKyAgfQorICB3cml0ZUxpbmUob3MsICJDb25uZWN0aW9uOiBjbG9zZSIpOworICBvcy53cml0ZUJ5dGVzKCJDb250ZW50LVR5cGU6ICIsIDE0KTsKKyAgaWYgKHJlc3VsdCA9PSAyMDApIHsKKyAgICBpZiAoIWNvbnRlbnRUeXBlKQorICAgICAgY29udGVudFR5cGUgPSBndWVzc0NvbnRlbnRUeXBlKHVyaS5idWYsICJ0ZXh0L2h0bWwiKTsKKyAgICBvcy53cml0ZUJ5dGVzKGNvbnRlbnRUeXBlLCBzdHJsZW4oY29udGVudFR5cGUpKTsKKyAgfSBlbHNlIHsKKyAgICBvcy53cml0ZUJ5dGVzKCJ0ZXh0L2h0bWwiLCA5KTsKKyAgfQorICBvcy53cml0ZUJ5dGVzKCJcclxuIiwgMik7CisgIHdyaXRlTGluZShvcywgIiIpOworICBpZiAocmVzdWx0ICE9IDIwMCkgeworICAgIHdyaXRlTGluZShvcywgIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU5cIj4iKTsKKyAgICB3cml0ZUxpbmUob3MsICI8SFRNTD48SEVBRD4iKTsKKyAgICBzcHJpbnRmKGJ1ZmZlciwgIjxUSVRMRT4lZCAlczwvVElUTEU+IiwgcmVzdWx0LCB0ZXh0KTsKKyAgICB3cml0ZUxpbmUob3MsIGJ1ZmZlcik7CisgICAgd3JpdGVMaW5lKG9zLCAiPC9IRUFEPjxCT0RZPjxIMT4iKTsKKyAgICB3cml0ZUxpbmUob3MsIHRleHQpOworICAgIHdyaXRlTGluZShvcywgIjwvSDE+PC9CT0RZPjwvSFRNTD4iKTsKKyAgICBzb2NrLm91dFN0cmVhbSgpLmZsdXNoKCk7CisgIH0KK30KKworYm9vbAorSFRUUFNlcnZlcjo6U2Vzc2lvbjo6d3JpdGVSZXNwb25zZShpbnQgY29kZSkgeworICBzd2l0Y2ggKGNvZGUpIHsKKyAgY2FzZSAyMDA6IHdyaXRlUmVzcG9uc2UoY29kZSwgIk9LIik7IGJyZWFrOworICBjYXNlIDQwMDogd3JpdGVSZXNwb25zZShjb2RlLCAiQmFkIFJlcXVlc3QiKTsgYnJlYWs7CisgIGNhc2UgNDA0OiB3cml0ZVJlc3BvbnNlKGNvZGUsICJOb3QgRm91bmQiKTsgYnJlYWs7CisgIGNhc2UgNTAxOiB3cml0ZVJlc3BvbnNlKGNvZGUsICJOb3QgSW1wbGVtZW50ZWQiKTsgYnJlYWs7CisgIGRlZmF1bHQ6IHdyaXRlUmVzcG9uc2UoNTAwLCAiVW5rbm93biBFcnJvciIpOyBicmVhazsKKyAgfTsKKworICAvLyBUaGlzIHJldHVybiBjb2RlIGlzIHBhc3NlZCBzdHJhaWdodCBvdXQgb2YgcHJvY2Vzc0hUVFAoKS4KKyAgLy8gdHJ1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWx5IHByb2Nlc3NlZC4KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIC0gTWFpbiBIVFRQIHJlcXVlc3QgcHJvY2Vzc2luZyByb3V0aW5lCisKK2Jvb2wKK0hUVFBTZXJ2ZXI6OlNlc3Npb246OnByb2Nlc3NIVFRQKCkgeworICBsYXN0QWN0aXZlID0gdGltZSgwKTsKKworICB3aGlsZSAoc29jay5pblN0cmVhbSgpLmNoZWNrTm9XYWl0KDEpKSB7CisKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisKKyAgICAgIC8vIFJlYWRpbmcgdGhlIFJlcXVlc3QtTGluZQorICAgIGNhc2UgUmVhZFJlcXVlc3RMaW5lOgorCisgICAgICAvLyBFaXRoZXIgcmVhZCBhIGxpbmUsIG9yIHJ1biBvdXQgb2YgaW5jb21pbmcgZGF0YQorICAgICAgaWYgKCFsaW5lLnJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBXZSBoYXZlIHJlYWQgYSBsaW5lISAgU2tpcCBpdCBpZiBpdCdzIGJsYW5rCisgICAgICBpZiAoc3RybGVuKGxpbmUuYnVmKSA9PSAwKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gVGhlIGxpbmUgY29udGFpbnMgYSByZXF1ZXN0IHRvIHByb2Nlc3MuCisgICAgICB7CisgICAgICAgIGNoYXIgbWV0aG9kWzE2XSwgcGF0aFsxMjhdLCB2ZXJzaW9uWzE2XTsKKyAgICAgICAgaW50IG1hdGNoZWQgPSBzc2NhbmYobGluZS5idWYsICIlMTVzJTEyN3MlMTVzIiwKKyAgICAgICAgICBtZXRob2QsIHBhdGgsIHZlcnNpb24pOworICAgICAgICBpZiAobWF0Y2hlZCAhPSAzKQorICAgICAgICAgIHJldHVybiB3cml0ZVJlc3BvbnNlKDQwMCk7CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIHJlcXVpcmVkICJtZXRob2QiCisgICAgICAgIGlmIChzdHJjbXAobWV0aG9kLCAiR0VUIikgPT0gMCkKKyAgICAgICAgICByZXF1ZXN0ID0gR2V0UmVxdWVzdDsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKG1ldGhvZCwgIkhFQUQiKSA9PSAwKQorICAgICAgICAgIHJlcXVlc3QgPSBIZWFkUmVxdWVzdDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiB3cml0ZVJlc3BvbnNlKDUwMSk7CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIFVSSSB0byB0aGUgImRvY3VtZW50IgorICAgICAgICB1cmkuYnVmID0gc3RyRHVwKHBhdGgpOworICAgICAgfQorCisgICAgICAvLyBNb3ZlIG9uIHRvIHJlYWRpbmcgdGhlIHJlcXVlc3QgaGVhZGVycworICAgICAgc3RhdGUgPSBSZWFkSGVhZGVyczsKKyAgICAgIGJyZWFrOworCisgICAgICAvLyBSZWFkaW5nIHRoZSByZXF1ZXN0IGhlYWRlcnMKKyAgICBjYXNlIFJlYWRIZWFkZXJzOgorCisgICAgICAvLyBUcnkgdG8gcmVhZCBhIGxpbmUKKyAgICAgIGlmICghbGluZS5yZWFkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gU2tpcCBoZWFkZXJzIHVudGlsIHdlIGhpdCBhIGJsYW5rIGxpbmUKKyAgICAgIGlmIChzdHJsZW4obGluZS5idWYpICE9IDApCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBIZWFkZXJzIGVuZGVkIC0gd3JpdGUgdGhlIHJlc3BvbnNlIQorICAgICAgeworICAgICAgICBDaGFyQXJyYXkgYWRkcmVzcyhzb2NrLmdldFBlZXJBZGRyZXNzKCkpOworICAgICAgICB2bG9nLmluZm8oImdldHRpbmcgJXMgZm9yICVzIiwgdXJpLmJ1ZiwgYWRkcmVzcy5idWYpOworICAgICAgICBjb250ZW50TGVuZ3RoID0gLTE7CisgICAgICAgIGxhc3RNb2RpZmllZCA9IC0xOworICAgICAgICBJblN0cmVhbSogZGF0YSA9IHNlcnZlci5nZXRGaWxlKHVyaS5idWYsICZjb250ZW50VHlwZSwgJmNvbnRlbnRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhc3RNb2RpZmllZCk7CisgICAgICAgIGlmICghZGF0YSkKKyAgICAgICAgICByZXR1cm4gd3JpdGVSZXNwb25zZSg0MDQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgd3JpdGVSZXNwb25zZSgyMDApOworICAgICAgICAgIGlmIChyZXF1ZXN0ID09IEdldFJlcXVlc3QpCisgICAgICAgICAgICBjb3B5U3RyZWFtKCpkYXRhLCBzb2NrLm91dFN0cmVhbSgpKTsKKyAgICAgICAgICBzb2NrLm91dFN0cmVhbSgpLmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgICAgICAgdmxvZy5lcnJvcigiZXJyb3Igd3JpdGluZyBIVFRQIGRvY3VtZW50OiVzIiwgZS5zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGRhdGE7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUhCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyByZHI6OkV4Y2VwdGlvbigiaW52YWxpZCBIVFRQU2Vzc2lvbiBzdGF0ZSEiKTsKKyAgICB9OworCisgIH0KKworICAvLyBJbmRpY2F0ZSB0aGF0IHdlJ3JlIHN0aWxsIHByb2Nlc3NpbmcgdGhlIEhUVFAgcmVxdWVzdC4KKyAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgSFRUUFNlcnZlcjo6U2Vzc2lvbjo6Y2hlY2tJZGxlVGltZW91dCgpIHsKKyAgdGltZV90IG5vdyA9IHRpbWUoMCk7CisgIGludCB0aW1lb3V0ID0gKGxhc3RBY3RpdmUgKyBpZGxlVGltZW91dFNlY3MpIC0gbm93OworICBpZiAodGltZW91dCA+IDApCisgICAgcmV0dXJuIHNlY3NUb01pbGxpcyh0aW1lb3V0KTsKKyAgc29jay5zaHV0ZG93bigpOworICByZXR1cm4gMDsKK30KKworLy8gLT0tIENvbnN0cnVjdG9yIC8gZGVzdHJ1Y3RvcgorCitIVFRQU2VydmVyOjpIVFRQU2VydmVyKCkgeworfQorCitIVFRQU2VydmVyOjp+SFRUUFNlcnZlcigpIHsKKyAgc3RkOjpsaXN0PFNlc3Npb24qPjo6aXRlcmF0b3IgaTsKKyAgZm9yIChpPXNlc3Npb25zLmJlZ2luKCk7IGkhPXNlc3Npb25zLmVuZCgpOyBpKyspCisgICAgZGVsZXRlICppOworfQorCisKKy8vIC09LSBTb2NrZXRTZXJ2ZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisKK3ZvaWQKK0hUVFBTZXJ2ZXI6OmFkZFNvY2tldChuZXR3b3JrOjpTb2NrZXQqIHNvY2ssIGJvb2wpIHsKKyAgU2Vzc2lvbiogcyA9IG5ldyBTZXNzaW9uKCpzb2NrLCAqdGhpcyk7CisgIGlmICghcykgeworICAgIHNvY2stPnNodXRkb3duKCk7CisgIH0gZWxzZSB7CisgICAgc29jay0+aW5TdHJlYW0oKS5zZXRUaW1lb3V0KGNsaWVudFdhaXRUaW1lTWlsbGlzKTsKKyAgICBzb2NrLT5vdXRTdHJlYW0oKS5zZXRUaW1lb3V0KGNsaWVudFdhaXRUaW1lTWlsbGlzKTsKKyAgICBzZXNzaW9ucy5wdXNoX2Zyb250KHMpOworICB9Cit9CisKK3ZvaWQKK0hUVFBTZXJ2ZXI6OnJlbW92ZVNvY2tldChuZXR3b3JrOjpTb2NrZXQqIHNvY2spIHsKKyAgc3RkOjpsaXN0PFNlc3Npb24qPjo6aXRlcmF0b3IgaTsKKyAgZm9yIChpPXNlc3Npb25zLmJlZ2luKCk7IGkhPXNlc3Npb25zLmVuZCgpOyBpKyspIHsKKyAgICBpZiAoKCppKS0+Z2V0U29jaygpID09IHNvY2spIHsKKyAgICAgIGRlbGV0ZSAqaTsKKyAgICAgIHNlc3Npb25zLmVyYXNlKGkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCit2b2lkCitIVFRQU2VydmVyOjpwcm9jZXNzU29ja2V0RXZlbnQobmV0d29yazo6U29ja2V0KiBzb2NrKSB7CisgIHN0ZDo6bGlzdDxTZXNzaW9uKj46Oml0ZXJhdG9yIGk7CisgIGZvciAoaT1zZXNzaW9ucy5iZWdpbigpOyBpIT1zZXNzaW9ucy5lbmQoKTsgaSsrKSB7CisgICAgaWYgKCgqaSktPmdldFNvY2soKSA9PSBzb2NrKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAoKCppKS0+cHJvY2Vzc0hUVFAoKSkgeworICAgICAgICAgIHZsb2cuaW5mbygiY29tcGxldGVkIEhUVFAgcmVxdWVzdCIpOworICAgICAgICAgIHNvY2stPnNodXRkb3duKCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgICAgIHZsb2cuZXJyb3IoInVudHJhcHBlZDogJXMiLCBlLnN0cigpKTsKKyAgICAgICAgc29jay0+c2h1dGRvd24oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgdGhyb3cgcmRyOjpFeGNlcHRpb24oImludmFsaWQgU29ja2V0IGluIEhUVFBTZXJ2ZXIiKTsKK30KKwordm9pZCBIVFRQU2VydmVyOjpnZXRTb2NrZXRzKHN0ZDo6bGlzdDxuZXR3b3JrOjpTb2NrZXQqPiogc29ja2V0cykKK3sKKyAgc29ja2V0cy0+Y2xlYXIoKTsKKyAgc3RkOjpsaXN0PFNlc3Npb24qPjo6aXRlcmF0b3IgY2k7CisgIGZvciAoY2kgPSBzZXNzaW9ucy5iZWdpbigpOyBjaSAhPSBzZXNzaW9ucy5lbmQoKTsgY2krKykgeworICAgIHNvY2tldHMtPnB1c2hfYmFjaygoKmNpKS0+Z2V0U29jaygpKTsKKyAgfQorfQorCitpbnQgSFRUUFNlcnZlcjo6Y2hlY2tUaW1lb3V0cygpIHsKKyAgc3RkOjpsaXN0PFNlc3Npb24qPjo6aXRlcmF0b3IgY2k7CisgIGludCB0aW1lb3V0ID0gMDsKKyAgZm9yIChjaSA9IHNlc3Npb25zLmJlZ2luKCk7IGNpICE9IHNlc3Npb25zLmVuZCgpOyBjaSsrKSB7CisgICAgc29vbmVzdFRpbWVvdXQoJnRpbWVvdXQsICgqY2kpLT5jaGVja0lkbGVUaW1lb3V0KCkpOworICB9CisgIHJldHVybiB0aW1lb3V0OworfQorCisKKy8vIC09LSBEZWZhdWx0IGdldEZpbGUgaW1wbGVtZW50YXRpb24KKworSW5TdHJlYW0qCitIVFRQU2VydmVyOjpnZXRGaWxlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqKiBjb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50KiBjb250ZW50TGVuZ3RoLCB0aW1lX3QqIGxhc3RNb2RpZmllZCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIqCitIVFRQU2VydmVyOjpndWVzc0NvbnRlbnRUeXBlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGRlZlR5cGUpIHsKKyAgQ2hhckFycmF5IGZpbGUsIGV4dDsKKyAgaWYgKCFzdHJTcGxpdChuYW1lLCAnLicsICZmaWxlLmJ1ZiwgJmV4dC5idWYpKQorICAgIHJldHVybiBkZWZUeXBlOworICBpZiAoc3RyY2FzZWNtcChleHQuYnVmLCAiaHRtbCIpID09IDAgfHwKKyAgICBzdHJjYXNlY21wKGV4dC5idWYsICJodG0iKSA9PSAwKSB7CisgICAgcmV0dXJuICJ0ZXh0L2h0bWwiOworICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAoZXh0LmJ1ZiwgInR4dCIpID09IDApIHsKKyAgICByZXR1cm4gInRleHQvcGxhaW4iOworICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAoZXh0LmJ1ZiwgImdpZiIpID09IDApIHsKKyAgICByZXR1cm4gImltYWdlL2dpZiI7CisgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChleHQuYnVmLCAianBnIikgPT0gMCkgeworICAgIHJldHVybiAiaW1hZ2UvanBlZyI7CisgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChleHQuYnVmLCAiamFyIikgPT0gMCkgeworICAgIHJldHVybiAiYXBwbGljYXRpb24vamF2YS1hcmNoaXZlIjsKKyAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGV4dC5idWYsICJleGUiKSA9PSAwKSB7CisgICAgcmV0dXJuICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworICB9CisgIHJldHVybiBkZWZUeXBlOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9IVFRQU2VydmVyLmggYi9jb21tb24vcmZiL0hUVFBTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDEyOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9IVFRQU2VydmVyLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gLT0tIEhUVFBTZXJ2ZXIuaAorCisvLyBTaW5nbGUtdGhyZWFkZWQgSFRUUCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisvLyBBbGwgSS9PIGlzIGhhbmRsZWQgYnkgdGhlIHByb2Nlc3NTb2NrZXRFdmVudCByb3V0aW5lLAorLy8gd2hpY2ggaXMgY2FsbGVkIGJ5IHRoZSBtYWluLWxvb3Agb2YgdGhlIFZOQyBzZXJ2ZXIgd2hlbmV2ZXIKKy8vIHRoZXJlIGlzIGFuIGV2ZW50IG9uIGFuIEhUVFAgc29ja2V0LgorCisjaWZuZGVmIF9fUkZCX0hUVFBfU0VSVkVSX0hfXworI2RlZmluZSBfX1JGQl9IVFRQX1NFUlZFUl9IX18KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxyZHIvTWVtSW5TdHJlYW0uaD4KKyNpbmNsdWRlIDxyZmIvVXBkYXRlVHJhY2tlci5oPgorI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8bmV0d29yay9Tb2NrZXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIEhUVFBTZXJ2ZXIgOiBwdWJsaWMgbmV0d29yazo6U29ja2V0U2VydmVyIHsKKyAgcHVibGljOgorICAgIC8vIC09LSBDb25zdHJ1Y3RvcnMKKworICAgIC8vIC0gSFRUUFNlcnZlcihmaWxlcykKKyAgICAvLyAgIENyZWF0ZSBhbiBIVFRQIHNlcnZlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2V0RmlsZSBtZXRob2QKKyAgICAvLyAgIHRvIHNhdGlzZnkgSFRUUCBHRVQgcmVxdWVzdHMuCisgICAgSFRUUFNlcnZlcigpOworCisgICAgdmlydHVhbCB+SFRUUFNlcnZlcigpOworCisgICAgLy8gU29ja2V0U2VydmVyIGludGVyZmFjZQorCisgICAgLy8gYWRkU29ja2V0KCkKKyAgICAvLyAgIFRoaXMgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gcGVyZm9ybSBIVFRQIHByb3RvY29sIG9uIHRoZQorICAgIC8vICAgc3VwcGxpZWQgc29ja2V0LgorICAgIHZpcnR1YWwgdm9pZCBhZGRTb2NrZXQobmV0d29yazo6U29ja2V0KiBzb2NrLCBib29sIG91dGdvaW5nPWZhbHNlKTsKKworICAgIC8vIHJlbW92ZVNvY2tldCgpCisgICAgLy8gICBDb3VsZCBjbGVhbiB1cCBzb2NrZXQtc3BlY2lmaWMgcmVzb3VyY2VzIGhlcmUuCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVNvY2tldChuZXR3b3JrOjpTb2NrZXQqIHNvY2spOworCisgICAgLy8gcHJvY2Vzc1NvY2tldEV2ZW50KCkKKyAgICAvLyAgIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBzaWRlIG9mIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gY2FsbHMKKyAgICAvLyAgIHRoaXMgbWV0aG9kIHdoZW5ldmVyIGRhdGEgYXJyaXZlcyBvbiBvbmUgb2YgdGhlIGFjdGl2ZQorICAgIC8vICAgbmV0d29yayBzb2NrZXRzLgorICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzU29ja2V0RXZlbnQobmV0d29yazo6U29ja2V0KiBzb2NrKTsKKworICAgIC8vIENoZWNrIGZvciBzb2NrZXQgdGltZW91dHMKKyAgICB2aXJ0dWFsIGludCBjaGVja1RpbWVvdXRzKCk7CisKKworICAgIC8vIGdldFNvY2tldHMoKSBnZXRzIGEgbGlzdCBvZiBzb2NrZXRzLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhbgorICAgIC8vIGZkX3NldCBmb3IgY2FsbGluZyBzZWxlY3QoKS4KKworICAgIHZpcnR1YWwgdm9pZCBnZXRTb2NrZXRzKHN0ZDo6bGlzdDxuZXR3b3JrOjpTb2NrZXQqPiogc29ja2V0cyk7CisKKworICAgIC8vIC09LSBGaWxlIGludGVyZmFjZQorCisgICAgLy8gLSBnZXRGaWxlIGlzIHBhc3NlZCB0aGUgcGF0aCBwb3J0aW9uIG9mIGEgVVJMIGFuZCByZXR1cm5zIGFuCisgICAgLy8gICBJblN0cmVhbSBjb250YWluaW5nIHRoZSBkYXRhIHRvIHJldHVybi4gIElmIHRoZSByZXF1ZXN0ZWQKKyAgICAvLyAgIGZpbGUgaXMgYXZhaWxhYmxlIHRoZW4gdGhlIGNvbnRlbnRUeXBlIHNob3VsZCBiZSBzZXQgdG8gdGhlCisgICAgLy8gICB0eXBlIG9mIHRoZSBmaWxlLCBvciBsZWZ0IHVudG91Y2hlZCBpZiB0aGUgZmlsZSB0eXBlIGlzIHRvCisgICAgLy8gICBiZSBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkgYnkgSFRUUFNlcnZlci4KKyAgICAvLyAgIElmIHRoZSBmaWxlIGlzIG5vdCBhdmFpbGFibGUgdGhlbiBudWxsIGlzIHJldHVybmVkLgorICAgIC8vICAgT3ZlcnJpZGRlbiBnZXRGaWxlIGZ1bmN0aW9ucyBzaG91bGQgY2FsbCB0aGUgZGVmYXVsdCB2ZXJzaW9uCisgICAgLy8gICBpZiB0aGV5IGRvIG5vdCByZWNvZ25pc2UgYSBwYXRoIG5hbWUuCisgICAgLy8gICBOQjogVGhlIGNhbGxlciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgcmV0dXJuZWQgSW5TdHJlYW0uCisgICAgLy8gICBOQjogVGhlIGNvbnRlbnRUeXBlIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGJ5IHRoZSBnZXRGaWxlIGltcGwuCisgICAgLy8gICBOQjogY29udGVudFR5cGUgaXMgKmd1YXJhbnRlZWQqIHRvIGJlIHZhbGlkIHdoZW4gZ2V0RmlsZSBpcyBjYWxsZWQuCisKKyAgICB2aXJ0dWFsIHJkcjo6SW5TdHJlYW0qIGdldEZpbGUoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhcioqIGNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnRlbnRMZW5ndGgsIHRpbWVfdCogbGFzdE1vZGlmaWVkKTsKKworICAgIC8vIC0gZ3Vlc3NDb250ZW50VHlwZSBpcyBwYXNzZWQgdGhlIG5hbWUgb2YgYSBmaWxlIGFuZCByZXR1cm5zIHRoZQorICAgIC8vICAgbmFtZSBvZiBhbiBIVFRQIGNvbnRlbnQgdHlwZSwgYmFzZWQgb24gdGhlIGZpbGUncyBleHRlbnNpb24uICBJZgorICAgIC8vICAgdGhlIGV4dGVuc2lvbiBpc24ndCByZWNvZ25pc2VkIHRoZW4gZGVmVHlwZSBpcyByZXR1cm5lZC4gIFRoaXMgY2FuCisgICAgLy8gICBiZSB1c2VkIGZyb20gZ2V0RmlsZSB0byBlYXNpbHkgZGVmYXVsdCB0byB0aGUgc3VwcGxpZWQgY29udGVudFR5cGUsCisgICAgLy8gICBvciBieSBwYXNzaW5nIHplcm8gaW4gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSB0eXBlIGlzIHJlY29nbmlzZWQgb3IKKyAgICAvLyAgIG5vdC4KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBndWVzc0NvbnRlbnRUeXBlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGRlZlR5cGUpOworCisgIHByb3RlY3RlZDoKKyAgICBjbGFzcyBTZXNzaW9uOworICAgIHN0ZDo6bGlzdDxTZXNzaW9uKj4gc2Vzc2lvbnM7CisgIH07Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0hleHRpbGVEZWNvZGVyLmN4eCBiL2NvbW1vbi9yZmIvSGV4dGlsZURlY29kZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTdjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0hleHRpbGVEZWNvZGVyLmN4eApAQCAtMCwwICsxLDU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8cmZiL0NNc2dSZWFkZXIuaD4KKyNpbmNsdWRlIDxyZmIvQ01zZ0hhbmRsZXIuaD4KKyNpbmNsdWRlIDxyZmIvSGV4dGlsZURlY29kZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworI2RlZmluZSBFWFRSQV9BUkdTIENNc2dIYW5kbGVyKiBoYW5kbGVyCisjZGVmaW5lIEZJTExfUkVDVChyLCBwKSBoYW5kbGVyLT5maWxsUmVjdChyLCBwKQorI2RlZmluZSBJTUFHRV9SRUNUKHIsIHApIGhhbmRsZXItPmltYWdlUmVjdChyLCBwKQorI2RlZmluZSBCUFAgOAorI2luY2x1ZGUgPHJmYi9oZXh0aWxlRGVjb2RlLmg+CisjdW5kZWYgQlBQCisjZGVmaW5lIEJQUCAxNgorI2luY2x1ZGUgPHJmYi9oZXh0aWxlRGVjb2RlLmg+CisjdW5kZWYgQlBQCisjZGVmaW5lIEJQUCAzMgorI2luY2x1ZGUgPHJmYi9oZXh0aWxlRGVjb2RlLmg+CisjdW5kZWYgQlBQCisKK0RlY29kZXIqIEhleHRpbGVEZWNvZGVyOjpjcmVhdGUoQ01zZ1JlYWRlciogcmVhZGVyKQoreworICByZXR1cm4gbmV3IEhleHRpbGVEZWNvZGVyKHJlYWRlcik7Cit9CisKK0hleHRpbGVEZWNvZGVyOjpIZXh0aWxlRGVjb2RlcihDTXNnUmVhZGVyKiByZWFkZXJfKSA6IHJlYWRlcihyZWFkZXJfKQoreworfQorCitIZXh0aWxlRGVjb2Rlcjo6fkhleHRpbGVEZWNvZGVyKCkKK3sKK30KKwordm9pZCBIZXh0aWxlRGVjb2Rlcjo6cmVhZFJlY3QoY29uc3QgUmVjdCYgciwgQ01zZ0hhbmRsZXIqIGhhbmRsZXIpCit7CisgIHJkcjo6SW5TdHJlYW0qIGlzID0gcmVhZGVyLT5nZXRJblN0cmVhbSgpOworICByZHI6OlU4KiBidWYgPSByZWFkZXItPmdldEltYWdlQnVmKDE2ICogMTYgKiA0KTsKKyAgc3dpdGNoIChyZWFkZXItPmJwcCgpKSB7CisgIGNhc2UgODogIGhleHRpbGVEZWNvZGU4IChyLCBpcywgKHJkcjo6VTgqKSBidWYsIGhhbmRsZXIpOyBicmVhazsKKyAgY2FzZSAxNjogaGV4dGlsZURlY29kZTE2KHIsIGlzLCAocmRyOjpVMTYqKWJ1ZiwgaGFuZGxlcik7IGJyZWFrOworICBjYXNlIDMyOiBoZXh0aWxlRGVjb2RlMzIociwgaXMsIChyZHI6OlUzMiopYnVmLCBoYW5kbGVyKTsgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvSGV4dGlsZURlY29kZXIuaCBiL2NvbW1vbi9yZmIvSGV4dGlsZURlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2RkM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9IZXh0aWxlRGVjb2Rlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpZm5kZWYgX19SRkJfSEVYVElMRURFQ09ERVJfSF9fCisjZGVmaW5lIF9fUkZCX0hFWFRJTEVERUNPREVSX0hfXworCisjaW5jbHVkZSA8cmZiL0RlY29kZXIuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgSGV4dGlsZURlY29kZXIgOiBwdWJsaWMgRGVjb2RlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgRGVjb2RlciogY3JlYXRlKENNc2dSZWFkZXIqIHJlYWRlcik7CisgICAgdmlydHVhbCB2b2lkIHJlYWRSZWN0KGNvbnN0IFJlY3QmIHIsIENNc2dIYW5kbGVyKiBoYW5kbGVyKTsKKyAgICB2aXJ0dWFsIH5IZXh0aWxlRGVjb2RlcigpOworICBwcml2YXRlOgorICAgIEhleHRpbGVEZWNvZGVyKENNc2dSZWFkZXIqIHJlYWRlcik7CisgICAgQ01zZ1JlYWRlciogcmVhZGVyOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0hleHRpbGVFbmNvZGVyLmN4eCBiL2NvbW1vbi9yZmIvSGV4dGlsZUVuY29kZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzFkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0hleHRpbGVFbmNvZGVyLmN4eApAQCAtMCwwICsxLDkwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQ29uc3RhbnRpbiBLYXBsaW5za3kuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2luY2x1ZGUgPHJmYi9JbWFnZUdldHRlci5oPgorI2luY2x1ZGUgPHJmYi9lbmNvZGluZ3MuaD4KKyNpbmNsdWRlIDxyZmIvU01zZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9IZXh0aWxlRW5jb2Rlci5oPgorI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK0Jvb2xQYXJhbWV0ZXIgaW1wcm92ZWRIZXh0aWxlKCJJbXByb3ZlZEhleHRpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSBpbXByb3ZlZCBjb21wcmVzc2lvbiBhbGdvcml0aG0gZm9yIEhleHRpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kaW5nIHdoaWNoIGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmF0aW9zIGJ5IHRoZSBjb3N0IG9mIHVzaW5nIG1vcmUgQ1BVIHRpbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisKKyNkZWZpbmUgRVhUUkFfQVJHUyBJbWFnZUdldHRlciogaWcKKyNkZWZpbmUgR0VUX0lNQUdFX0lOVE9fQlVGKHIsYnVmKSBpZy0+Z2V0SW1hZ2UoYnVmLCByKTsKKyNkZWZpbmUgQlBQIDgKKyNpbmNsdWRlIDxyZmIvaGV4dGlsZUVuY29kZS5oPgorI2luY2x1ZGUgPHJmYi9oZXh0aWxlRW5jb2RlQmV0dGVyLmg+CisjdW5kZWYgQlBQCisjZGVmaW5lIEJQUCAxNgorI2luY2x1ZGUgPHJmYi9oZXh0aWxlRW5jb2RlLmg+CisjaW5jbHVkZSA8cmZiL2hleHRpbGVFbmNvZGVCZXR0ZXIuaD4KKyN1bmRlZiBCUFAKKyNkZWZpbmUgQlBQIDMyCisjaW5jbHVkZSA8cmZiL2hleHRpbGVFbmNvZGUuaD4KKyNpbmNsdWRlIDxyZmIvaGV4dGlsZUVuY29kZUJldHRlci5oPgorI3VuZGVmIEJQUAorCitFbmNvZGVyKiBIZXh0aWxlRW5jb2Rlcjo6Y3JlYXRlKFNNc2dXcml0ZXIqIHdyaXRlcikKK3sKKyAgcmV0dXJuIG5ldyBIZXh0aWxlRW5jb2Rlcih3cml0ZXIpOworfQorCitIZXh0aWxlRW5jb2Rlcjo6SGV4dGlsZUVuY29kZXIoU01zZ1dyaXRlciogd3JpdGVyXykgOiB3cml0ZXIod3JpdGVyXykKK3sKK30KKworSGV4dGlsZUVuY29kZXI6On5IZXh0aWxlRW5jb2RlcigpCit7Cit9CisKK2Jvb2wgSGV4dGlsZUVuY29kZXI6OndyaXRlUmVjdChjb25zdCBSZWN0JiByLCBJbWFnZUdldHRlciogaWcsIFJlY3QqIGFjdHVhbCkKK3sKKyAgd3JpdGVyLT5zdGFydFJlY3QociwgZW5jb2RpbmdIZXh0aWxlKTsKKyAgcmRyOjpPdXRTdHJlYW0qIG9zID0gd3JpdGVyLT5nZXRPdXRTdHJlYW0oKTsKKyAgc3dpdGNoICh3cml0ZXItPmJwcCgpKSB7CisgIGNhc2UgODoKKyAgICBpZiAoaW1wcm92ZWRIZXh0aWxlKSB7CisgICAgICBoZXh0aWxlRW5jb2RlQmV0dGVyOChyLCBvcywgaWcpOworICAgIH0gZWxzZSB7CisgICAgICBoZXh0aWxlRW5jb2RlOChyLCBvcywgaWcpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxNjoKKyAgICBpZiAoaW1wcm92ZWRIZXh0aWxlKSB7CisgICAgICBoZXh0aWxlRW5jb2RlQmV0dGVyMTYociwgb3MsIGlnKTsKKyAgICB9IGVsc2UgeworICAgICAgaGV4dGlsZUVuY29kZTE2KHIsIG9zLCBpZyk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDMyOgorICAgIGlmIChpbXByb3ZlZEhleHRpbGUpIHsKKyAgICAgIGhleHRpbGVFbmNvZGVCZXR0ZXIzMihyLCBvcywgaWcpOworICAgIH0gZWxzZSB7CisgICAgICBoZXh0aWxlRW5jb2RlMzIociwgb3MsIGlnKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgd3JpdGVyLT5lbmRSZWN0KCk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9IZXh0aWxlRW5jb2Rlci5oIGIvY29tbW9uL3JmYi9IZXh0aWxlRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODEwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0hleHRpbGVFbmNvZGVyLmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2lmbmRlZiBfX1JGQl9IRVhUSUxFRU5DT0RFUl9IX18KKyNkZWZpbmUgX19SRkJfSEVYVElMRUVOQ09ERVJfSF9fCisKKyNpbmNsdWRlIDxyZmIvRW5jb2Rlci5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBIZXh0aWxlRW5jb2RlciA6IHB1YmxpYyBFbmNvZGVyIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBFbmNvZGVyKiBjcmVhdGUoU01zZ1dyaXRlciogd3JpdGVyKTsKKyAgICB2aXJ0dWFsIGJvb2wgd3JpdGVSZWN0KGNvbnN0IFJlY3QmIHIsIEltYWdlR2V0dGVyKiBpZywgUmVjdCogYWN0dWFsKTsKKyAgICB2aXJ0dWFsIH5IZXh0aWxlRW5jb2RlcigpOworICBwcml2YXRlOgorICAgIEhleHRpbGVFbmNvZGVyKFNNc2dXcml0ZXIqIHdyaXRlcik7CisgICAgU01zZ1dyaXRlciogd3JpdGVyOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0hvc3RuYW1lLmggYi9jb21tb24vcmZiL0hvc3RuYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkZjgxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvSG9zdG5hbWUuaApAQCAtMCwwICsxLDU1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpZm5kZWYgX19SRkJfSE9TVE5BTUVfSF9fCisjZGVmaW5lIF9fUkZCX0hPU1ROQU1FX0hfXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8cmRyL0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIHN0YXRpYyB2b2lkIGdldEhvc3RBbmRQb3J0KGNvbnN0IGNoYXIqIGhpLCBjaGFyKiogaG9zdCwgaW50KiBwb3J0LCBpbnQgYmFzZVBvcnQ9NTkwMCkgeworICAgIENoYXJBcnJheSBwb3J0QnVmOworICAgIENoYXJBcnJheSBob3N0QnVmOworICAgIGlmIChoaVswXSA9PSAnWycpIHsKKyAgICAgIGlmICghc3RyU3BsaXQoJmhpWzFdLCAnXScsICZob3N0QnVmLmJ1ZiwgJnBvcnRCdWYuYnVmKSkKKyAgICAgICAgdGhyb3cgcmRyOjpFeGNlcHRpb24oInVubWF0Y2hlZCBbIGluIGhvc3QiKTsKKyAgICB9IGVsc2UgeworICAgICAgcG9ydEJ1Zi5idWYgPSBzdHJEdXAoaGkpOworICAgIH0KKyAgICBpZiAoc3RyU3BsaXQocG9ydEJ1Zi5idWYsICc6JywgaG9zdEJ1Zi5idWYgPyAwIDogJmhvc3RCdWYuYnVmLCAmcG9ydEJ1Zi5idWYpKSB7CisgICAgICBpZiAocG9ydEJ1Zi5idWZbMF0gPT0gJzonKSB7CisgICAgICAgICpwb3J0ID0gYXRvaSgmcG9ydEJ1Zi5idWZbMV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKnBvcnQgPSBhdG9pKHBvcnRCdWYuYnVmKTsKKyAgICAgICAgaWYgKCpwb3J0IDwgMTAwKSAqcG9ydCArPSBiYXNlUG9ydDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKnBvcnQgPSBiYXNlUG9ydDsKKyAgICB9CisgICAgaWYgKHN0cmxlbihob3N0QnVmLmJ1ZikgPT0gMCkKKyAgICAgICpob3N0ID0gc3RyRHVwKCJsb2NhbGhvc3QiKTsKKyAgICBlbHNlCisgICAgICAqaG9zdCA9IGhvc3RCdWYudGFrZUJ1ZigpOworICB9CisKK307CisKKyNlbmRpZiAvLyBfX1JGQl9IT1NUTkFNRV9IX18KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvSW1hZ2VHZXR0ZXIuaCBiL2NvbW1vbi9yZmIvSW1hZ2VHZXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAyNDlmCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9JbWFnZUdldHRlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpZm5kZWYgX19SRkJfSU1BR0VHRVRURVJfSF9fCisjZGVmaW5lIF9fUkZCX0lNQUdFR0VUVEVSX0hfXworCisjaW5jbHVkZSA8cmZiL1JlY3QuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIEltYWdlR2V0dGVyIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBnZXRJbWFnZSh2b2lkKiBpbWFnZUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVjdCYgciwgaW50IHN0cmlkZT0wKSA9IDA7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvSW5wdXRIYW5kbGVyLmggYi9jb21tb24vcmZiL0lucHV0SGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZTVlODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0lucHV0SGFuZGxlci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBJbnB1dEhhbmRsZXIgLSBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGFjY2VwdGluZyBrZXlib2FyZCAmCisvLyBwb2ludGVyIGlucHV0IGFuZCBjbGlwYm9hcmQgZGF0YS4KKy8vCisKKyNpZm5kZWYgX19SRkJfSU5QVVRIQU5ETEVSX0hfXworI2RlZmluZSBfX1JGQl9JTlBVVEhBTkRMRVJfSF9fCisKKyNpbmNsdWRlIDxyZHIvdHlwZXMuaD4KKyNpbmNsdWRlIDxyZmIvUmVjdC5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBJbnB1dEhhbmRsZXIgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+SW5wdXRIYW5kbGVyKCkge30KKyAgICB2aXJ0dWFsIHZvaWQga2V5RXZlbnQocmRyOjpVMzIga2V5LCBib29sIGRvd24pIHt9CisgICAgdmlydHVhbCB2b2lkIHBvaW50ZXJFdmVudChjb25zdCBQb2ludCYgcG9zLCBpbnQgYnV0dG9uTWFzaykge30KKyAgICB2aXJ0dWFsIHZvaWQgY2xpZW50Q3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pIHt9CisgIH07CisKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9LZXlSZW1hcHBlci5jeHggYi9jb21tb24vcmZiL0tleVJlbWFwcGVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWYwNzYzCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9LZXlSZW1hcHBlci5jeHgKQEAgLTAsMCArMSw4NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxyZmIvS2V5UmVtYXBwZXIuaD4KKyNpbmNsdWRlIDxyZmIvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworc3RhdGljIExvZ1dyaXRlciB2bG9nKCJLZXlSZW1hcHBlciIpOworCitLZXlSZW1hcHBlciBLZXlSZW1hcHBlcjo6ZGVmSW5zdGFuY2U7CisKKyNpZmRlZiBfX1JGQl9USFJFQURJTkdfSU1QTAorc3RhdGljIE11dGV4IG1hcHBpbmdMb2NrOworI2VuZGlmCisKK3ZvaWQgS2V5UmVtYXBwZXI6OnNldE1hcHBpbmcoY29uc3QgY2hhciogbSkgeworI2lmZGVmIF9fUkZCX1RIUkVBRElOR19JTVBMCisgIExvY2sgbChtYXBwaW5nTG9jayk7CisjZW5kaWYKKyAgbWFwcGluZy5jbGVhcigpOworICB3aGlsZSAobVswXSkgeworICAgIGludCBmcm9tLCB0bzsKKyAgICBjaGFyIGJpZGk7CisgICAgY29uc3QgY2hhciogbmV4dENvbW1hID0gc3RyY2hyKG0sICcsJyk7CisgICAgaWYgKCFuZXh0Q29tbWEpCisgICAgICBuZXh0Q29tbWEgPSBtICsgc3RybGVuKG0pOworICAgIGlmIChzc2NhbmYobSwgIjB4JXglYz4weCV4IiwgJmZyb20sCisgICAgICAgICAgICAgICAmYmlkaSwgJnRvKSA9PSAzKSB7CisgICAgICBpZiAoYmlkaSAhPSAnLScgJiYgYmlkaSAhPSAnPCcpCisgICAgICAgIHZsb2cuZXJyb3IoIndhcm5pbmc6IHVua25vd24gb3BlcmF0aW9uICVjPiwgYXNzdW1pbmcgLT4iLCBiaWRpKTsKKyAgICAgIG1hcHBpbmdbZnJvbV0gPSB0bzsKKyAgICAgIGlmIChiaWRpID09ICc8JykKKyAgICAgICAgbWFwcGluZ1t0b10gPSBmcm9tOworICAgIH0gZWxzZSB7CisgICAgICB2bG9nLmVycm9yKCJ3YXJuaW5nOiBiYWQgbWFwcGluZyAlLipzIiwgbmV4dENvbW1hLW0sIG0pOworICAgIH0KKyAgICBtID0gbmV4dENvbW1hOworICAgIGlmIChuZXh0Q29tbWFbMF0pCisgICAgICBtKys7CisgIH0KK30KKworcmRyOjpVMzIgS2V5UmVtYXBwZXI6OnJlbWFwS2V5KHJkcjo6VTMyIGtleSkgY29uc3QgeworI2lmZGVmIF9fUkZCX1RIUkVBRElOR19JTVBMCisgIExvY2sgbChtYXBwaW5nTG9jayk7CisjZW5kaWYKKyAgc3RkOjptYXA8cmRyOjpVMzIscmRyOjpVMzI+Ojpjb25zdF9pdGVyYXRvciBpID0gbWFwcGluZy5maW5kKGtleSk7CisgIGlmIChpICE9IG1hcHBpbmcuZW5kKCkpCisgICAgcmV0dXJuIGktPnNlY29uZDsKKyAgcmV0dXJuIGtleTsKK30KKworCitjbGFzcyBLZXlNYXBQYXJhbWV0ZXIgOiBwdWJsaWMgU3RyaW5nUGFyYW1ldGVyIHsKK3B1YmxpYzoKKyAgS2V5TWFwUGFyYW1ldGVyKCkKKyAgICA6IFN0cmluZ1BhcmFtZXRlcigiUmVtYXBLZXlzIiwgIkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGluY29taW5nIGtleXN5bXMgdG8gcmVtYXAuICBNYXBwaW5ncyBhcmUgZXhwcmVzc2VkIGFzIHR3byBoZXggdmFsdWVzLCBwcmVmaXhlZCBieSAweCwgYW5kIHNlcGFyYXRlZCBieSAtPiIsICIiKSB7CisgICAgc2V0UGFyYW0odmFsdWUpOworICB9CisgIGJvb2wgc2V0UGFyYW0oY29uc3QgY2hhciogdikgeworICAgIEtleVJlbWFwcGVyOjpkZWZJbnN0YW5jZS5zZXRNYXBwaW5nKHYpOworICAgIHJldHVybiBTdHJpbmdQYXJhbWV0ZXI6OnNldFBhcmFtKHYpOworICB9Cit9IGRlZmF1bHRQYXJhbTsKKworCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0tleVJlbWFwcGVyLmggYi9jb21tb24vcmZiL0tleVJlbWFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiN2FhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvS2V5UmVtYXBwZXIuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpZm5kZWYgX19SRkJfS0VZUkVNQVBQRVJfSF9fCisjZGVmaW5lIF9fUkZCX0tFWVJFTUFQUEVSX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHJkci90eXBlcy5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBLZXlSZW1hcHBlciB7CisgIHB1YmxpYzoKKyAgICBLZXlSZW1hcHBlcihjb25zdCBjaGFyKiBtPSIiKSB7IHNldE1hcHBpbmcobSk7IH0KKyAgICB2b2lkIHNldE1hcHBpbmcoY29uc3QgY2hhciogbSk7CisgICAgcmRyOjpVMzIgcmVtYXBLZXkocmRyOjpVMzIga2V5KSBjb25zdDsKKyAgICBzdGF0aWMgS2V5UmVtYXBwZXIgZGVmSW5zdGFuY2U7CisgIHByaXZhdGU6CisgICAgc3RkOjptYXA8cmRyOjpVMzIscmRyOjpVMzI+IG1hcHBpbmc7CisgIH07CisKK307CisKKyNlbmRpZiAvLyBfX1JGQl9LRVlSRU1BUFBFUl9IX18KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvTGlzdENvbm5JbmZvLmggYi9jb21tb24vcmZiL0xpc3RDb25uSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmNiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0xpc3RDb25uSW5mby5oCkBAIC0wLDAgKzEsMTIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKworI2lmbmRlZiBfX1JGQl9MSVNUQ09OTklORk9fSU5DTFVERURfXworI2RlZmluZSBfX1JGQl9MSVNUQ09OTklORk9fSU5DTFVERURfXworCituYW1lc3BhY2UgcmZiIHsKKworICBzdHJ1Y3QgTGlzdENvbm5JbmZvICB7CisgICAgTGlzdENvbm5JbmZvKCkgOiBkaXNhYmxlQ2xpZW50cyhmYWxzZSkge30KKworICAgIHZvaWQgQ2xlYXIoKSB7CisgICAgICBjb25uLmNsZWFyKCk7CisgICAgICBJUF9hZGRyZXNzLmNsZWFyKCk7CisgICAgICB0aW1lX2Nvbm4uY2xlYXIoKTsKKyAgICAgIHN0YXR1cy5jbGVhcigpOworICAgIH0KKworICAgIGJvb2wgRW1wdHkoKSB7IHJldHVybiBjb25uLmVtcHR5KCk7fQorCisgICAgdm9pZCBpQmVnaW4oKSB7CisgICAgICBjaSA9IGNvbm4uYmVnaW4oKTsKKyAgICAgIElpID0gSVBfYWRkcmVzcy5iZWdpbigpOworICAgICAgdGkgPSB0aW1lX2Nvbm4uYmVnaW4oKTsKKyAgICAgIHNpID0gc3RhdHVzLmJlZ2luKCk7CisgICAgfQorCisgICAgYm9vbCBpRW5kKCkgeyByZXR1cm4gY2kgPT0gY29ubi5lbmQoKTt9CisKKyAgICB2b2lkIGlOZXh0KCkgeworICAgICAgY2krKzsKKyAgICAgIElpKys7CisgICAgICB0aSsrOworICAgICAgc2krKzsKKyAgICB9CisKKyAgICB2b2lkIGFkZEluZm8odm9pZCogQ29ubiwgY2hhciogSVAsIGNoYXIqIFRpbWUsIGludCBTdGF0dXMpIHsKKyAgICAgIGNvbm4ucHVzaF9iYWNrKENvbm4pOworICAgICAgSVBfYWRkcmVzcy5wdXNoX2JhY2soc3RyRHVwKElQKSk7CisgICAgICB0aW1lX2Nvbm4ucHVzaF9iYWNrKHN0ckR1cChUaW1lKSk7CisgICAgICBzdGF0dXMucHVzaF9iYWNrKFN0YXR1cyk7CisgICAgfQorCisgICAgdm9pZCBpR2V0Q2hhckluZm8oY2hhciogYnVmWzNdKSB7CisgICAgICBidWZbMF0gPSAqSWk7CisgICAgICBidWZbMV0gPSAqdGk7CisgICAgICBzd2l0Y2ggKCpzaSkgeworICAgICAgY2FzZSAwOgorICAgICAgICBidWZbMl0gPSBzdHJEdXAoIkZ1bGwgY29udHJvbCIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgYnVmWzJdID0gc3RyRHVwKCJWaWV3IG9ubHkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGJ1ZlsyXSA9IHN0ckR1cCgiU3RvcCB1cGRhdGluZyIpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJ1ZlsyXSA9IHN0ckR1cCgiVW5rbm93biIpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQqIGlHZXRDb25uKCkgeyByZXR1cm4gKmNpO30KKworICAgIGludCBpR2V0U3RhdHVzKCkgeyByZXR1cm4gKnNpO30KKworICAgIHZvaWQgaVNldFN0YXR1cyggaW50IHN0YXR1cykgeyAqc2kgPSBzdGF0dXM7fQorCisgICAgdm9pZCBDb3B5KExpc3RDb25uSW5mbyogSW5wdXRMaXN0KSB7CisgICAgICBDbGVhcigpOworICAgICAgaWYgKElucHV0TGlzdC0+RW1wdHkoKSkgcmV0dXJuOworICAgICAgZm9yIChJbnB1dExpc3QtPmlCZWdpbigpOyAhSW5wdXRMaXN0LT5pRW5kKCk7IElucHV0TGlzdC0+aU5leHQoKSkgeworICAgICAgICBpQWRkKElucHV0TGlzdCk7CisgICAgICB9CisgICAgICBzZXREaXNhYmxlKElucHV0TGlzdC0+Z2V0RGlzYWJsZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIGlBZGQgKExpc3RDb25uSW5mbyogSW5wdXRMaXN0KSB7CisgICAgICBjaGFyKiBidWZbM107CisgICAgICBJbnB1dExpc3QtPmlHZXRDaGFySW5mbyhidWYpOworICAgICAgYWRkSW5mbyhJbnB1dExpc3QtPmlHZXRDb25uKCksIGJ1ZlswXSwgYnVmWzFdLCBJbnB1dExpc3QtPmlHZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgdm9pZCBzZXREaXNhYmxlKGJvb2wgZGlzYWJsZSkge2Rpc2FibGVDbGllbnRzID0gZGlzYWJsZTt9CisKKyAgICBib29sIGdldERpc2FibGUoKSB7cmV0dXJuIGRpc2FibGVDbGllbnRzO30KKworICAgIHZvaWQgc2V0QWxsU3RhdHVzKGludCBzdGF0KSB7CisgICAgICBzdGQ6Omxpc3Q8aW50Pjo6aXRlcmF0b3Igc3Q7CisgICAgICBmb3IgKHN0ID0gc3RhdHVzLmJlZ2luKCk7IHN0ICE9IHN0YXR1cy5lbmQoKTsgc3QrKykKKyAgICAgICAgKnN0ID0gc3RhdDsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6Omxpc3Q8dm9pZCo+IGNvbm47CisgICAgc3RkOjpsaXN0PGNoYXIqPiBJUF9hZGRyZXNzOworICAgIHN0ZDo6bGlzdDxjaGFyKj4gdGltZV9jb25uOworICAgIHN0ZDo6bGlzdDxpbnQ+IHN0YXR1czsKKyAgICBzdGQ6Omxpc3Q8dm9pZCo+OjppdGVyYXRvciBjaTsKKyAgICBzdGQ6Omxpc3Q8Y2hhcio+OjppdGVyYXRvciBJaTsKKyAgICBzdGQ6Omxpc3Q8Y2hhcio+OjppdGVyYXRvciB0aTsKKyAgICBzdGQ6Omxpc3Q8aW50Pjo6aXRlcmF0b3Igc2k7CisgICAgYm9vbCBkaXNhYmxlQ2xpZW50czsKKyAgfTsKK307CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9Mb2dXcml0ZXIuY3h4IGIvY29tbW9uL3JmYi9Mb2dXcml0ZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDYxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL0xvZ1dyaXRlci5jeHgKQEAgLTAsMCArMSwxMzcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gLT0tIExvZ1dyaXRlci5jeHggLSBjbGllbnQtc2lkZSBsb2dnaW5nIGludGVyZmFjZQorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgc3RyY2FzZWNtcCBfc3RyaWNtcAorI2VuZGlmCisKKyNpbmNsdWRlIDxyZmIvTG9nV3JpdGVyLmg+CisjaW5jbHVkZSA8cmZiL0NvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxyZmIvdXRpbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCityZmI6OkxvZ1BhcmFtZXRlciByZmI6OmxvZ1BhcmFtczsKKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworCitMb2dXcml0ZXI6OkxvZ1dyaXRlcihjb25zdCBjaGFyKiBuYW1lKSA6IG1fbmFtZShuYW1lKSwgbV9sZXZlbCgwKSwgbV9sb2coMCksIG1fbmV4dChsb2dfd3JpdGVycykgeworICBsb2dfd3JpdGVycyA9IHRoaXM7Cit9CisKK0xvZ1dyaXRlcjo6fkxvZ1dyaXRlcigpIHsKKyAgLy8gKioqIFNob3VsZCByZW1vdmUgdGhpcyBsb2dnZXIgaGVyZSEKK30KKwordm9pZCBMb2dXcml0ZXI6OnNldExvZyhMb2dnZXIgKmxvZ2dlcikgeworICBtX2xvZyA9IGxvZ2dlcjsKK30KKwordm9pZCBMb2dXcml0ZXI6OnNldExldmVsKGludCBsZXZlbCkgeworICBtX2xldmVsID0gbGV2ZWw7Cit9CisKK3ZvaWQKK0xvZ1dyaXRlcjo6bGlzdExvZ1dyaXRlcnMoaW50IHdpZHRoKSB7CisgIC8vICoqKiBtYWtlIHRoaXMgcmVzcGVjdCB3aWR0aC4uLgorICBMb2dXcml0ZXIqIGN1cnJlbnQgPSBsb2dfd3JpdGVyczsKKyAgZnByaW50ZihzdGRlcnIsICIgICIpOworICB3aGlsZSAoY3VycmVudCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBjdXJyZW50LT5tX25hbWUpOworICAgIGN1cnJlbnQgPSBjdXJyZW50LT5tX25leHQ7CisgICAgaWYgKGN1cnJlbnQpIGZwcmludGYoc3RkZXJyLCAiLCAiKTsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK0xvZ1dyaXRlciogTG9nV3JpdGVyOjpsb2dfd3JpdGVyczsKKworTG9nV3JpdGVyKgorTG9nV3JpdGVyOjpnZXRMb2dXcml0ZXIoY29uc3QgY2hhciogbmFtZSkgeworICBMb2dXcml0ZXIqIGN1cnJlbnQgPSBsb2dfd3JpdGVyczsKKyAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICBpZiAoc3RyY2FzZWNtcChuYW1lLCBjdXJyZW50LT5tX25hbWUpID09IDApIHJldHVybiBjdXJyZW50OworICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm1fbmV4dDsKKyAgICB9CisgIHJldHVybiAwOworfQorCitib29sIExvZ1dyaXRlcjo6c2V0TG9nUGFyYW1zKGNvbnN0IGNoYXIqIHBhcmFtcykgeworICBDaGFyQXJyYXkgbG9nd3JpdGVyTmFtZSwgbG9nZ2VyTmFtZSwgbG9nTGV2ZWw7CisgIGlmICghc3RyU3BsaXQocGFyYW1zLCAnOicsICZsb2d3cml0ZXJOYW1lLmJ1ZiwgJmxvZ2dlck5hbWUuYnVmKSB8fAorICAgICFzdHJTcGxpdChsb2dnZXJOYW1lLmJ1ZiwgJzonLCAmbG9nZ2VyTmFtZS5idWYsICZsb2dMZXZlbC5idWYpKSB7CisgICAgZnByaW50ZihzdGRlcnIsImZhaWxlZCB0byBwYXJzZSBsb2cgcGFyYW1zOiVzXG4iLHBhcmFtcyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGludCBsZXZlbCA9IGF0b2kobG9nTGV2ZWwuYnVmKTsKKyAgTG9nZ2VyKiBsb2dnZXIgPSAwOworICBpZiAoc3RyY21wKCIiLCBsb2dnZXJOYW1lLmJ1ZikgIT0gMCkgeworICAgIGxvZ2dlciA9IExvZ2dlcjo6Z2V0TG9nZ2VyKGxvZ2dlck5hbWUuYnVmKTsKKyAgICBpZiAoIWxvZ2dlcikgZnByaW50ZihzdGRlcnIsIm5vIGxvZ2dlciBmb3VuZCEgJXNcbiIsbG9nZ2VyTmFtZS5idWYpOworICB9CisgIGlmIChzdHJjbXAoIioiLCBsb2d3cml0ZXJOYW1lLmJ1ZikgPT0gMCkgeworICAgIExvZ1dyaXRlciogY3VycmVudCA9IGxvZ193cml0ZXJzOworICAgIHdoaWxlIChjdXJyZW50KSB7CisgICAgICBjdXJyZW50LT5zZXRMb2cobG9nZ2VyKTsKKyAgICAgIGN1cnJlbnQtPnNldExldmVsKGxldmVsKTsKKyAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5tX25leHQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIExvZ1dyaXRlciogbG9nd3JpdGVyID0gZ2V0TG9nV3JpdGVyKGxvZ3dyaXRlck5hbWUuYnVmKTsKKyAgICBpZiAoIWxvZ3dyaXRlcikgeworICAgICAgZnByaW50ZihzdGRlcnIsIm5vIGxvZ3dyaXRlciBmb3VuZCEgJXNcbiIsbG9nd3JpdGVyTmFtZS5idWYpOworICAgIH0gZWxzZSB7CisgICAgICBsb2d3cml0ZXItPnNldExvZyhsb2dnZXIpOworICAgICAgbG9nd3JpdGVyLT5zZXRMZXZlbChsZXZlbCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisKK0xvZ1BhcmFtZXRlcjo6TG9nUGFyYW1ldGVyKCkKKyAgOiBTdHJpbmdQYXJhbWV0ZXIoIkxvZyIsCisgICAgIlNwZWNpZmllcyB3aGljaCBsb2cgb3V0cHV0IHNob3VsZCBiZSBkaXJlY3RlZCB0byAiCisgICAgIndoaWNoIHRhcmdldCBsb2dnZXIsIGFuZCB0aGUgbGV2ZWwgb2Ygb3V0cHV0IHRvIGxvZy4gIgorICAgICJGb3JtYXQgaXMgPGxvZz46PHRhcmdldD46PGxldmVsPlssIC4uLl0uIiwKKyAgICAiIikgeworfQorCitib29sIExvZ1BhcmFtZXRlcjo6c2V0UGFyYW0oY29uc3QgY2hhciogdikgeworICBpZiAoaW1tdXRhYmxlKSByZXR1cm4gdHJ1ZTsKKyAgTG9nV3JpdGVyOjpzZXRMb2dQYXJhbXMoIio6OjAiKTsKKyAgU3RyaW5nUGFyYW1ldGVyOjpzZXRQYXJhbSh2KTsKKyAgQ2hhckFycmF5IGxvZ1BhcmFtOworICBDaGFyQXJyYXkgcGFyYW1zKGdldERhdGEoKSk7CisgIHdoaWxlIChwYXJhbXMuYnVmKSB7CisgICAgc3RyU3BsaXQocGFyYW1zLmJ1ZiwgJywnLCAmbG9nUGFyYW0uYnVmLCAmcGFyYW1zLmJ1Zik7CisgICAgaWYgKHN0cmxlbihsb2dQYXJhbS5idWYpICYmICFMb2dXcml0ZXI6OnNldExvZ1BhcmFtcyhsb2dQYXJhbS5idWYpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIExvZ1BhcmFtZXRlcjo6c2V0RGVmYXVsdChjb25zdCBjaGFyKiBkKSB7CisgIGRlZl92YWx1ZSA9IGQ7CisgIHNldFBhcmFtKGRlZl92YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0xvZ1dyaXRlci5oIGIvY29tbW9uL3JmYi9Mb2dXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjRjNThlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9Mb2dXcml0ZXIuaApAQCAtMCwwICsxLDEwNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLyAtPS0gTG9nV3JpdGVyLmggLSBUaGUgTG9nIHdyaXRlciBjbGFzcy4KKworI2lmbmRlZiBfX1JGQl9MT0dfV1JJVEVSX0hfXworI2RlZmluZSBfX1JGQl9MT0dfV1JJVEVSX0hfXworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8cmZiL0xvZ2dlci5oPgorI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisKKy8vIEVhY2ggbG9nIHdyaXRlciBpbnN0YW5jZSBoYXMgYSB1bmlxdWUgdGV4dHVhbCBuYW1lLAorLy8gYW5kIGlzIGF0dGFjaGVkIHRvIGEgcGFydGljdWxhciBMb2cgaW5zdGFuY2UgYW5kCisvLyBpcyBhc3NpZ25lZCBhIHBhcnRpY3VsYXIgbG9nIGxldmVsLgorCisjZGVmaW5lIERFRl9MT0dGVU5DVElPTihuYW1lLCBsZXZlbCkgXAorICBpbmxpbmUgdm9pZCBuYW1lKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7IFwKKyAgICBpZiAobV9sb2cgJiYgKGxldmVsIDw9IG1fbGV2ZWwpKSB7ICAgICBcCisgICAgICB2YV9saXN0IGFwOyB2YV9zdGFydChhcCwgZm10KTsgICAgICAgXAorICAgICAgbV9sb2ctPndyaXRlKGxldmVsLCBtX25hbWUsIGZtdCwgYXApO1wKKyAgICAgIHZhX2VuZChhcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIExvZ1dyaXRlcjsKKworICBjbGFzcyBMb2dXcml0ZXIgeworICBwdWJsaWM6CisgICAgTG9nV3JpdGVyKGNvbnN0IGNoYXIqIG5hbWUpOworICAgIH5Mb2dXcml0ZXIoKTsKKworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7cmV0dXJuIG1fbmFtZTt9CisKKyAgICB2b2lkIHNldExvZyhMb2dnZXIgKmxvZ2dlcik7CisgICAgdm9pZCBzZXRMZXZlbChpbnQgbGV2ZWwpOworCisgICAgaW5saW5lIHZvaWQgd3JpdGUoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgeworICAgICAgaWYgKG1fbG9nICYmIChsZXZlbCA8PSBtX2xldmVsKSkgeworICAgICAgICB2YV9saXN0IGFwOworICAgICAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgICAgICAgbV9sb2ctPndyaXRlKGxldmVsLCBtX25hbWUsIGZvcm1hdCwgYXApOworICAgICAgICB2YV9lbmQoYXApOworICAgICAgfQorICAgIH0KKworICAgIERFRl9MT0dGVU5DVElPTihlcnJvciwgMCkKKyAgICBERUZfTE9HRlVOQ1RJT04oc3RhdHVzLCAxMCkKKyAgICBERUZfTE9HRlVOQ1RJT04oaW5mbywgMzApCisgICAgREVGX0xPR0ZVTkNUSU9OKGRlYnVnLCAxMDApCisKKyAgICAvLyAtPS0gRElBR05PU1RJQyAmIEhFTFBFUiBST1VUSU5FUworCisgICAgc3RhdGljIHZvaWQgbGlzdExvZ1dyaXRlcnMoaW50IHdpZHRoPTc5KTsKKworICAgIC8vIC09LSBDTEFTUyBGSUVMRFMgJiBGVU5DVElPTlMKKworICAgIHN0YXRpYyBMb2dXcml0ZXIqIGxvZ193cml0ZXJzOworCisgICAgc3RhdGljIExvZ1dyaXRlciogZ2V0TG9nV3JpdGVyKGNvbnN0IGNoYXIqIG5hbWUpOworCisgICAgc3RhdGljIGJvb2wgc2V0TG9nUGFyYW1zKGNvbnN0IGNoYXIqIHBhcmFtcyk7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBtX25hbWU7CisgICAgaW50IG1fbGV2ZWw7CisgICAgTG9nZ2VyKiBtX2xvZzsKKyAgICBMb2dXcml0ZXIqIG1fbmV4dDsKKyAgfTsKKworICBjbGFzcyBMb2dQYXJhbWV0ZXIgOiBwdWJsaWMgU3RyaW5nUGFyYW1ldGVyIHsKKyAgcHVibGljOgorICAgIExvZ1BhcmFtZXRlcigpOworICAgIHZpcnR1YWwgYm9vbCBzZXRQYXJhbShjb25zdCBjaGFyKiB2KTsKKworICAgIC8vIENhbGwgdGhpcyB0byBzZXQgYSBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlLgorICAgIC8vIENhbid0IHVzZSB0aGUgbm9ybWFsIGRlZmF1bHQgbWVjaGFuaXNtIGZvcgorICAgIC8vIHRoaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgb24gQysrCisgICAgLy8gY29uc3RydWN0b3Igb3JkZXJpbmcgLSBzb21lIExvZ1dyaXRlcnMgbWF5CisgICAgLy8gbm90IGV4aXN0IHdoZW4gTG9nUGFyYW1ldGVyIGdldHMgY29uc3RydWN0ZWQuCisgICAgLy8gTkI6IFRoZSBkZWZhdWx0IHZhbHVlIG11c3QgZXhpc3QgZm9yIHRoZQorICAgIC8vICAgICBsaWZldGltZSBvZiB0aGUgcHJvY2VzcyEKKyAgICB2b2lkIHNldERlZmF1bHQoY29uc3QgY2hhciogdik7CisgIH07CisgIGV4dGVybiBMb2dQYXJhbWV0ZXIgbG9nUGFyYW1zOworCit9OworCisjZW5kaWYgLy8gX19SRkJfTE9HX1dSSVRFUl9IX18KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvTG9nZ2VyLmN4eCBiL2NvbW1vbi9yZmIvTG9nZ2VyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQzMzA4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9Mb2dnZXIuY3h4CkBAIC0wLDAgKzEsMTE4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSBMb2dnZXIuY3h4IC0gc3VwcG9ydCBmb3IgdGhlIExvZ2dlciBhbmQgTG9nV3JpdGVyIGNsYXNzZXMKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgc3RyY2FzZWNtcCBfc3RyaWNtcAorI2RlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2RlZmluZSBIQVZFX1ZTTlBSSU5URgorI2VuZGlmCisKKyNpbmNsdWRlIDxyZmIvTG9nZ2VyLmg+CisjaW5jbHVkZSA8cmZiL0xvZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisjaW5jbHVkZSA8cmZiL1RocmVhZGluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCisjaWZuZGVmIEhBVkVfVlNOUFJJTlRGCisjaWZkZWYgX19SRkJfVEhSRUFESU5HX0lNUEwKK3N0YXRpYyBNdXRleCBmcExvY2s7CisjZW5kaWYKK3N0YXRpYyBGSUxFKiBmcCA9IDA7CitpbnQgdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyAgc3RyWzBdID0gMDsKKyAgaWYgKCFmcCkgeworICAgIC8vIFNhZmVseSBjcmVhdGUgYSBGSUxFKiBmb3IgL2Rldi9udWxsIGlmIHRoZXJlIGlzbid0IGFscmVhZHkgb25lCisjaWZkZWYgX19SRkJfVEhSRUFESU5HX0lNUEwKKyAgICBMb2NrIGwoZnBMb2NrKTsKKyNlbmRpZgorICAgIGlmICghZnApCisgICAgICBmcCA9IGZvcGVuKCIvZGV2L251bGwiLCJ3Iik7CisgICAgaWYgKCFmcCkgcmV0dXJuIDA7CisgIH0KKyAgaW50IGxlbiA9IHZmcHJpbnRmKGZwLCBmb3JtYXQsIGFwKTsKKyAgaWYgKGxlbiA8PSAwKSByZXR1cm4gMDsKKworICBDaGFyQXJyYXkgcyhsZW4rMSk7CisgIHZzcHJpbnRmKHMuYnVmLCBmb3JtYXQsIGFwKTsKKworICBpbnQgd3JpdHRlbiA9IF9fcmZibWluKGxlbiwgKGludCluLTEpOworICBtZW1jcHkoc3RyLCBzLmJ1Ziwgd3JpdHRlbik7CisgIHN0clt3cml0dGVuXSA9IDA7CisgIHJldHVybiBsZW47Cit9CisjZW5kaWYKKworCitMb2dnZXIqIExvZ2dlcjo6bG9nZ2VycyA9IDA7CisKK0xvZ2dlcjo6TG9nZ2VyKGNvbnN0IGNoYXIqIG5hbWUpIDogcmVnaXN0ZXJlZChmYWxzZSksIG1fbmFtZShuYW1lKSwgbV9uZXh0KDApIHsKK30KKworTG9nZ2VyOjp+TG9nZ2VyKCkgeworICAvLyAqKiogU2hvdWxkIHJlbW92ZSB0aGlzIGxvZ2dlciBoZXJlIQorfQorCit2b2lkIExvZ2dlcjo6d3JpdGUoaW50IGxldmVsLCBjb25zdCBjaGFyICpsb2duYW1lLCBjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcCkKK3sKKyAgLy8gLSBGb3JtYXQgdGhlIHN1cHBsaWVkIGRhdGEsIGFuZCBwYXNzIGl0IHRvIHRoZQorICAvLyAgIGFjdHVhbCBsb2dfbWVzc2FnZSBmdW5jdGlvbgorICAvLyAgIFRoZSBsb2cgbGV2ZWwgaXMgaW5jbHVkZWQgYXMgYSBoaW50IGZvciBsb2dnZXJzIGNhcGFibGUgb2YgcmVwcmVzZW50aW5nCisgIC8vICAgZGlmZmVyZW50IGxvZyBsZXZlbHMgaW4gc29tZSB3YXkuCisgIGNoYXIgYnVmMVs0MDk2XTsKKyAgdnNucHJpbnRmKGJ1ZjEsIHNpemVvZihidWYxKS0xLCBmb3JtYXQsIGFwKTsKKyAgYnVmMVtzaXplb2YoYnVmMSktMV0gPSAwOworICB3cml0ZShsZXZlbCwgbG9nbmFtZSwgYnVmMSk7Cit9CisKK3ZvaWQKK0xvZ2dlcjo6cmVnaXN0ZXJMb2dnZXIoKSB7CisgIGlmICghcmVnaXN0ZXJlZCkgeworICAgIHJlZ2lzdGVyZWQgPSB0cnVlOworICAgIG1fbmV4dCA9IGxvZ2dlcnM7CisgICAgbG9nZ2Vycz10aGlzOworICB9Cit9CisgICAgCitMb2dnZXIqCitMb2dnZXI6OmdldExvZ2dlcihjb25zdCBjaGFyKiBuYW1lKSB7CisgIExvZ2dlciogY3VycmVudCA9IGxvZ2dlcnM7CisgIHdoaWxlIChjdXJyZW50KSB7CisgICAgaWYgKHN0cmNhc2VjbXAobmFtZSwgY3VycmVudC0+bV9uYW1lKSA9PSAwKSByZXR1cm4gY3VycmVudDsKKyAgICBjdXJyZW50ID0gY3VycmVudC0+bV9uZXh0OworICB9CisgIHJldHVybiAwOworfQorCit2b2lkCitMb2dnZXI6Omxpc3RMb2dnZXJzKCkgeworICBMb2dnZXIqIGN1cnJlbnQgPSBsb2dnZXJzOworICB3aGlsZSAoY3VycmVudCkgeworICAgIHByaW50ZigiICAlc1xuIiwgY3VycmVudC0+bV9uYW1lKTsKKyAgICBjdXJyZW50ID0gY3VycmVudC0+bV9uZXh0OworICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9Mb2dnZXIuaCBiL2NvbW1vbi9yZmIvTG9nZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzNzY0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvTG9nZ2VyLmgKQEAgLTAsMCArMSw3MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLyAtPS0gTG9nZ2VyLmggLSBUaGUgTG9nZ2VyIGNsYXNzLgorCisjaWZuZGVmIF9fUkZCX0xPR0dFUl9IX18KKyNkZWZpbmUgX19SRkJfTE9HR0VSX0hfXworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8gRWFjaCBsb2cgd3JpdGVyIGluc3RhbmNlIGhhcyBhIHVuaXF1ZSB0ZXh0dWFsIG5hbWUsCisvLyBhbmQgaXMgYXR0YWNoZWQgdG8gYSBwYXJ0aWN1bGFyIExvZ2dlciBpbnN0YW5jZSBhbmQKKy8vIGlzIGFzc2lnbmVkIGEgcGFydGljdWxhciBsb2cgbGV2ZWwuCisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIExvZ2dlciB7CisgIHB1YmxpYzoKKworICAgIC8vIC09LSBDcmVhdGUgLyBEZXN0cm95IGEgbG9nZ2VyCisKKyAgICBMb2dnZXIoY29uc3QgY2hhciogbmFtZSk7CisgICAgdmlydHVhbCB+TG9nZ2VyKCk7CisKKyAgICAvLyAtPS0gR2V0IHRoZSBuYW1lIG9mIGEgbG9nZ2VyCisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkge3JldHVybiBtX25hbWU7fQorCisgICAgLy8gLT0tIFdyaXRlIGRhdGEgdG8gYSBsb2cKKworICAgIHZpcnR1YWwgdm9pZCB3cml0ZShpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmxvZ25hbWUsIGNvbnN0IGNoYXIgKnRleHQpID0gMDsKKyAgICB2b2lkIHdyaXRlKGludCBsZXZlbCwgY29uc3QgY2hhciAqbG9nbmFtZSwgY29uc3QgY2hhciogZm9ybWF0LCB2YV9saXN0IGFwKTsKKworICAgIC8vIC09LSBSZWdpc3RlciBhIGxvZ2dlcgorCisgICAgdm9pZCByZWdpc3RlckxvZ2dlcigpOworCisgICAgLy8gLT0tIENMQVNTIEZJRUxEUyAmIEZVTkNUSU9OUworCisgICAgc3RhdGljIExvZ2dlciogbG9nZ2VyczsKKworICAgIHN0YXRpYyBMb2dnZXIqIGdldExvZ2dlcihjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIHN0YXRpYyB2b2lkIGxpc3RMb2dnZXJzKCk7CisKKyAgcHJpdmF0ZToKKyAgICBib29sIHJlZ2lzdGVyZWQ7CisgICAgY29uc3QgY2hhciAqbV9uYW1lOworICAgIExvZ2dlciAqbV9uZXh0OworICB9OworCit9OworCisjZW5kaWYgLy8gX19SRkJfTE9HR0VSX0hfXwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9Mb2dnZXJfZmlsZS5jeHggYi9jb21tb24vcmZiL0xvZ2dlcl9maWxlLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTEwOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9Mb2dnZXJfZmlsZS5jeHgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gLT0tIExvZ2dlcl9maWxlLmN4eCAtIExvZ2dlciBpbnN0YW5jZSBmb3IgYSBmaWxlCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHJmYi91dGlsLmg+CisjaW5jbHVkZSA8cmZiL0xvZ2dlcl9maWxlLmg+CisjaW5jbHVkZSA8cmZiL1RocmVhZGluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCisKKy8vIElmIHRocmVhZGluZyBpcyBhdmFpbGFibGUgdGhlbiBwcm90ZWN0IHRoZSB3cml0ZSgpIG9wZXJhdGlvbgorLy8gZnJvbSBjb25jdXJyZW50IGFjY2Vzc2VzCisjaWZkZWYgX19SRkJfVEhSRUFESU5HX0lNUEwKK3N0YXRpYyBNdXRleCBsb2dMb2NrOworI2VuZGlmCisKKworTG9nZ2VyX0ZpbGU6OkxvZ2dlcl9GaWxlKGNvbnN0IGNoYXIqIGxvZ2dlck5hbWUpCisgIDogTG9nZ2VyKGxvZ2dlck5hbWUpLCBpbmRlbnQoMTMpLCB3aWR0aCg3OSksIG1fZmlsZW5hbWUoMCksIG1fZmlsZSgwKSwKKyAgICBtX2xhc3RMb2dUaW1lKDApCit7Cit9CisKK0xvZ2dlcl9GaWxlOjp+TG9nZ2VyX0ZpbGUoKQoreworICBjbG9zZUZpbGUoKTsKK30KKwordm9pZCBMb2dnZXJfRmlsZTo6d3JpdGUoaW50IGxldmVsLCBjb25zdCBjaGFyICpsb2duYW1lLCBjb25zdCBjaGFyICptZXNzYWdlKQoreworI2lmZGVmIF9fUkZCX1RIUkVBRElOR19JTVBMCisgIExvY2sgbChsb2dMb2NrKTsKKyNlbmRpZgorICBpZiAoIW1fZmlsZSkgeworICAgIGlmICghbV9maWxlbmFtZSkgcmV0dXJuOworICAgIENoYXJBcnJheSBiYWtGaWxlbmFtZShzdHJsZW4obV9maWxlbmFtZSkgKyAxICsgNCk7CisgICAgc3ByaW50ZihiYWtGaWxlbmFtZS5idWYsICIlcy5iYWsiLCBtX2ZpbGVuYW1lKTsKKyAgICByZW1vdmUoYmFrRmlsZW5hbWUuYnVmKTsKKyAgICByZW5hbWUobV9maWxlbmFtZSwgYmFrRmlsZW5hbWUuYnVmKTsKKyAgICBtX2ZpbGUgPSBmb3BlbihtX2ZpbGVuYW1lLCAidysiKTsKKyAgICBpZiAoIW1fZmlsZSkgcmV0dXJuOworICB9CisKKyNpZm5kZWYgX1dJTjMyX1dDRQorICB0aW1lX3QgY3VycmVudCA9IHRpbWUoMCk7CisgIGlmIChjdXJyZW50ICE9IG1fbGFzdExvZ1RpbWUpIHsKKyAgICBtX2xhc3RMb2dUaW1lID0gY3VycmVudDsKKyAgICBmcHJpbnRmKG1fZmlsZSwgIlxuJXMiLCBjdGltZSgmbV9sYXN0TG9nVGltZSkpOworICB9CisjZW5kaWYKKworICBmcHJpbnRmKG1fZmlsZSwiICVzOiIsIGxvZ25hbWUpOworICBpbnQgY29sdW1uID0gc3RybGVuKGxvZ25hbWUpICsgMjsKKyAgaWYgKGNvbHVtbiA8IGluZGVudCkgeworICAgIGZwcmludGYobV9maWxlLCIlKnMiLGluZGVudC1jb2x1bW4sIiIpOworICAgIGNvbHVtbiA9IGluZGVudDsKKyAgfQorICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnN0IGNoYXIqIHMgPSBzdHJjaHIobWVzc2FnZSwgJyAnKTsKKyAgICBpbnQgd29yZExlbjsKKyAgICBpZiAocykgd29yZExlbiA9IHMtbWVzc2FnZTsKKyAgICBlbHNlIHdvcmRMZW4gPSBzdHJsZW4obWVzc2FnZSk7CisKKyAgICBpZiAoY29sdW1uICsgd29yZExlbiArIDEgPiB3aWR0aCkgeworICAgICAgZnByaW50ZihtX2ZpbGUsIlxuJSpzIixpbmRlbnQsIiIpOworICAgICAgY29sdW1uID0gaW5kZW50OworICAgIH0KKyAgICBmcHJpbnRmKG1fZmlsZSwiICUuKnMiLHdvcmRMZW4sbWVzc2FnZSk7CisgICAgY29sdW1uICs9IHdvcmRMZW4gKyAxOworICAgIG1lc3NhZ2UgKz0gd29yZExlbiArIDE7CisgICAgaWYgKCFzKSBicmVhazsKKyAgfQorICBmcHJpbnRmKG1fZmlsZSwiXG4iKTsKKyAgZmZsdXNoKG1fZmlsZSk7Cit9CisKK3ZvaWQgTG9nZ2VyX0ZpbGU6OnNldEZpbGVuYW1lKGNvbnN0IGNoYXIqIGZpbGVuYW1lKQoreworICBjbG9zZUZpbGUoKTsKKyAgbV9maWxlbmFtZSA9IHN0ckR1cChmaWxlbmFtZSk7Cit9CisKK3ZvaWQgTG9nZ2VyX0ZpbGU6OnNldEZpbGUoRklMRSogZmlsZSkKK3sKKyAgY2xvc2VGaWxlKCk7CisgIG1fZmlsZSA9IGZpbGU7Cit9CisKK3ZvaWQgTG9nZ2VyX0ZpbGU6OmNsb3NlRmlsZSgpCit7CisgIGlmIChtX2ZpbGVuYW1lKSB7CisgICAgaWYgKG1fZmlsZSkgeworICAgICAgZmNsb3NlKG1fZmlsZSk7CisgICAgICBtX2ZpbGUgPSAwOworICAgIH0KKyAgICBzdHJGcmVlKG1fZmlsZW5hbWUpOworICAgIG1fZmlsZW5hbWUgPSAwOworICB9Cit9CisKK3N0YXRpYyBMb2dnZXJfRmlsZSBsb2dnZXIoImZpbGUiKTsKKworYm9vbCByZmI6OmluaXRGaWxlTG9nZ2VyKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7CisgIGxvZ2dlci5zZXRGaWxlbmFtZShmaWxlbmFtZSk7CisgIGxvZ2dlci5yZWdpc3RlckxvZ2dlcigpOworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvTG9nZ2VyX2ZpbGUuaCBiL2NvbW1vbi9yZmIvTG9nZ2VyX2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTBjOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9Mb2dnZXJfZmlsZS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gLT0tIExvZ2dlcl9maWxlIC0gbG9nIHRvIGEgZmlsZQorCisjaWZuZGVmIF9fUkZCX0xPR0dFUl9GSUxFX0hfXworI2RlZmluZSBfX1JGQl9MT0dHRVJfRklMRV9IX18KKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxyZmIvTG9nZ2VyLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIExvZ2dlcl9GaWxlIDogcHVibGljIExvZ2dlciB7CisgIHB1YmxpYzoKKyAgICBMb2dnZXJfRmlsZShjb25zdCBjaGFyKiBsb2dnZXJOYW1lKTsKKyAgICB+TG9nZ2VyX0ZpbGUoKTsKKworICAgIHZpcnR1YWwgdm9pZCB3cml0ZShpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmxvZ25hbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOworICAgIHZvaWQgc2V0RmlsZW5hbWUoY29uc3QgY2hhciogZmlsZW5hbWUpOworICAgIHZvaWQgc2V0RmlsZShGSUxFKiBmaWxlKTsKKworICAgIGludCBpbmRlbnQ7CisgICAgaW50IHdpZHRoOworCisgIHByb3RlY3RlZDoKKyAgICB2b2lkIGNsb3NlRmlsZSgpOworICAgIGNoYXIqIG1fZmlsZW5hbWU7CisgICAgRklMRSogbV9maWxlOworICAgIHRpbWVfdCBtX2xhc3RMb2dUaW1lOworICB9OworCisgIGJvb2wgaW5pdEZpbGVMb2dnZXIoY29uc3QgY2hhciogZmlsZW5hbWUpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0xvZ2dlcl9zdGRpby5jeHggYi9jb21tb24vcmZiL0xvZ2dlcl9zdGRpby5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxZGNkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvTG9nZ2VyX3N0ZGlvLmN4eApAQCAtMCwwICsxLDMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSBMb2dnZXJfc3RkaW8uY3h4IC0gTG9nZ2VyIGluc3RhbmNlcyBmb3Igc3RkZXJyIGFuZCBzdGRvdXQKKworI2luY2x1ZGUgPHJmYi9Mb2dnZXJfc3RkaW8uaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworc3RhdGljIExvZ2dlcl9TdGRJTyBsb2dTdGRFcnIoInN0ZGVyciIsIHN0ZGVycik7CitzdGF0aWMgTG9nZ2VyX1N0ZElPIGxvZ1N0ZE91dCgic3Rkb3V0Iiwgc3Rkb3V0KTsKKworYm9vbCByZmI6OmluaXRTdGRJT0xvZ2dlcnMoKSB7CisgIGxvZ1N0ZEVyci5yZWdpc3RlckxvZ2dlcigpOworICBsb2dTdGRPdXQucmVnaXN0ZXJMb2dnZXIoKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL0xvZ2dlcl9zdGRpby5oIGIvY29tbW9uL3JmYi9Mb2dnZXJfc3RkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWQxN2EwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9Mb2dnZXJfc3RkaW8uaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSBMb2dnZXJfc3RkaW8gLSBzdGFuZGFyZCBvdXRwdXQgbG9nZ2VyIGluc3RhbmNlcworCisjaWZuZGVmIF9fUkZCX0xPR0dFUl9TVERJT19IX18KKyNkZWZpbmUgX19SRkJfTE9HR0VSX1NURElPX0hfXworCisjaW5jbHVkZSA8cmZiL0xvZ2dlcl9maWxlLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIExvZ2dlcl9TdGRJTyA6IHB1YmxpYyBMb2dnZXJfRmlsZSB7CisgIHB1YmxpYzoKKyAgICBMb2dnZXJfU3RkSU8oY29uc3QgY2hhciAqbmFtZSwgRklMRSogZmlsZSkgOiBMb2dnZXJfRmlsZShuYW1lKSB7CisgICAgICBzZXRGaWxlKGZpbGUpOworICAgIH0KKyAgfTsKKworICBib29sIGluaXRTdGRJT0xvZ2dlcnMoKTsKKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL01ha2VmaWxlLmluIGIvY29tbW9uL3JmYi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzVlMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDgwIEBACisKK0NYWFNSQ1MgPSBcCisgIEJsYWNrbGlzdC5jeHggXAorICBDQ29ubmVjdGlvbi5jeHggXAorICBDTXNnSGFuZGxlci5jeHggXAorICBDTXNnUmVhZGVyLmN4eCBcCisgIENNc2dSZWFkZXJWMy5jeHggXAorICBDTXNnV3JpdGVyLmN4eCBcCisgIENNc2dXcml0ZXJWMy5jeHggXAorICBDU2VjdXJpdHlWbmNBdXRoLmN4eCBcCisgIENvbXBhcmluZ1VwZGF0ZVRyYWNrZXIuY3h4IFwKKyAgQ29uZmlndXJhdGlvbi5jeHggXAorICBDb25uUGFyYW1zLmN4eCBcCisgIEN1cnNvci5jeHggXAorICBEZWNvZGVyLmN4eCBcCisgIEVuY29kZXIuY3h4IFwKKyAgRmlsZUluZm8uY3h4IFwKKyAgRmlsZU1hbmFnZXIuY3h4IFwKKyAgRmlsZVJlYWRlci5jeHggXAorICBGaWxlV3JpdGVyLmN4eCBcCisgIEhUVFBTZXJ2ZXIuY3h4IFwKKyAgSGV4dGlsZURlY29kZXIuY3h4IFwKKyAgSGV4dGlsZUVuY29kZXIuY3h4IFwKKyAgS2V5UmVtYXBwZXIuY3h4IFwKKyAgTG9nV3JpdGVyLmN4eCBcCisgIExvZ2dlci5jeHggXAorICBMb2dnZXJfZmlsZS5jeHggXAorICBMb2dnZXJfc3RkaW8uY3h4IFwKKyAgUGFzc3dvcmQuY3h4IFwKKyAgUGl4ZWxCdWZmZXIuY3h4IFwKKyAgUGl4ZWxGb3JtYXQuY3h4IFwKKyAgUlJFRW5jb2Rlci5jeHggXAorICBSUkVEZWNvZGVyLmN4eCBcCisgIFJhd0RlY29kZXIuY3h4IFwKKyAgUmF3RW5jb2Rlci5jeHggXAorICBSZWdpb24uY3h4IFwKKyAgU0Nvbm5lY3Rpb24uY3h4IFwKKyAgU0ZUTXNnUmVhZGVyLmN4eCBcCisgIFNGVE1zZ1dyaXRlci5jeHggXAorICBTRmlsZVRyYW5zZmVyLmN4eCBcCisgIFNGaWxlVHJhbnNmZXJNYW5hZ2VyLmN4eCBcCisgIFNNc2dIYW5kbGVyLmN4eCBcCisgIFNNc2dSZWFkZXIuY3h4IFwKKyAgU01zZ1JlYWRlclYzLmN4eCBcCisgIFNNc2dXcml0ZXIuY3h4IFwKKyAgU01zZ1dyaXRlclYzLmN4eCBcCisgIFNlcnZlckNvcmUuY3h4IFwKKyAgU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkLmN4eCBcCisgIFNTZWN1cml0eVZuY0F1dGguY3h4IFwKKyAgVGltZXIuY3h4IFwKKyAgVGlnaHREZWNvZGVyLmN4eCBcCisgIFRpZ2h0RW5jb2Rlci5jeHggXAorICBUaWdodFBhbGV0dGUuY3h4IFwKKyAgVHJhbnNJbWFnZUdldHRlci5jeHggXAorICBUcmFuc2ZlclF1ZXVlLmN4eCBcCisgIFVwZGF0ZVRyYWNrZXIuY3h4IFwKKyAgVk5DU0Nvbm5lY3Rpb25TVC5jeHggXAorICBWTkNTZXJ2ZXJTVC5jeHggXAorICBaUkxFRW5jb2Rlci5jeHggXAorICBaUkxFRGVjb2Rlci5jeHggXAorICBlbmNvZGluZ3MuY3h4IFwKKyAgc2VjVHlwZXMuY3h4IFwKKyAgdXRpbC5jeHgKKworU1JDUyA9IGQzZGVzLmMgJChDWFhTUkNTKQorCitPQkpTID0gZDNkZXMubyAkKENYWFNSQ1M6LmN4eD0ubykKKworRElSX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpIEBaTElCX0lOQ0xVREVAIEBKUEVHX0lOQ0xVREVAIEBWU05QUklOVEZfREVGSU5FQAorCitsaWJyYXJ5ID0gbGlicmZiLmEKKworYWxsOjogJChsaWJyYXJ5KQorCiskKGxpYnJhcnkpOiAkKE9CSlMpCisJcm0gLWYgJChsaWJyYXJ5KQorCSQoQVIpICQobGlicmFyeSkgJChPQkpTKQorCSQoUkFOTElCKSAkKGxpYnJhcnkpCisKKyMgZm9sbG93ZWQgYnkgYm9pbGVycGxhdGUubWsKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvUGFzc3dvcmQuY3h4IGIvY29tbW9uL3JmYi9QYXNzd29yZC5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyNzg2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvUGFzc3dvcmQuY3h4CkBAIC0wLDAgKzEsNzcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8KKy8vIFhYWCBub3QgdGhyZWFkLXNhZmUsIGJlY2F1c2UgZDNkZXMgaXNuJ3QgLSBkbyB3ZSBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXM/CisvLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxyZmIvZDNkZXMuaD4KK30KKyNpbmNsdWRlIDxyZHIvdHlwZXMuaD4KKyNpbmNsdWRlIDxyZHIvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8cmZiL1Bhc3N3b3JkLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGQzZGVzT2JmdXNjYXRpb25LZXlbXSA9IHsyMyw4MiwxMDcsNiwzNSw3OCw4OCw3fTsKKworCitQbGFpblBhc3N3ZDo6UGxhaW5QYXNzd2QoKSB7fQorCitQbGFpblBhc3N3ZDo6UGxhaW5QYXNzd2QoY2hhciogcHdkKSA6IENoYXJBcnJheShwd2QpIHsKK30KKworUGxhaW5QYXNzd2Q6OlBsYWluUGFzc3dkKGNvbnN0IE9iZnVzY2F0ZWRQYXNzd2QmIG9iZlB3ZCkgOiBDaGFyQXJyYXkoOSkgeworICBpZiAob2JmUHdkLmxlbmd0aCA8IDgpCisgICAgdGhyb3cgcmRyOjpFeGNlcHRpb24oImJhZCBvYmZ1c2NhdGVkIHBhc3N3b3JkIGxlbmd0aCIpOworICBkZXNrZXkoZDNkZXNPYmZ1c2NhdGlvbktleSwgREUxKTsKKyAgZGVzKChyZHI6OlU4KilvYmZQd2QuYnVmLCAocmRyOjpVOCopYnVmKTsKKyAgYnVmWzhdID0gMDsKK30KKworUGxhaW5QYXNzd2Q6On5QbGFpblBhc3N3ZCgpIHsKKyAgcmVwbGFjZUJ1ZigwKTsKK30KKwordm9pZCBQbGFpblBhc3N3ZDo6cmVwbGFjZUJ1ZihjaGFyKiBiKSB7CisgIGlmIChidWYpCisgICAgbWVtc2V0KGJ1ZiwgMCwgc3RybGVuKGJ1ZikpOworICBDaGFyQXJyYXk6OnJlcGxhY2VCdWYoYik7Cit9CisKKworT2JmdXNjYXRlZFBhc3N3ZDo6T2JmdXNjYXRlZFBhc3N3ZCgpIDogbGVuZ3RoKDApIHsKK30KKworT2JmdXNjYXRlZFBhc3N3ZDo6T2JmdXNjYXRlZFBhc3N3ZChpbnQgbGVuKSA6IENoYXJBcnJheShsZW4pLCBsZW5ndGgobGVuKSB7Cit9CisKK09iZnVzY2F0ZWRQYXNzd2Q6Ok9iZnVzY2F0ZWRQYXNzd2QoY29uc3QgUGxhaW5QYXNzd2QmIHBsYWluUHdkKSA6IENoYXJBcnJheSg4KSwgbGVuZ3RoKDgpIHsKKyAgaW50IGwgPSBzdHJsZW4ocGxhaW5Qd2QuYnVmKSwgaTsKKyAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgIGJ1ZltpXSA9IGk8bCA/IHBsYWluUHdkLmJ1ZltpXSA6IDA7CisgIGRlc2tleShkM2Rlc09iZnVzY2F0aW9uS2V5LCBFTjApOworICBkZXMoKHJkcjo6VTgqKWJ1ZiwgKHJkcjo6VTgqKWJ1Zik7Cit9CisKK09iZnVzY2F0ZWRQYXNzd2Q6On5PYmZ1c2NhdGVkUGFzc3dkKCkgeworICBpZiAoYnVmKQorICAgIG1lbXNldChidWYsIDAsIGxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1Bhc3N3b3JkLmggYi9jb21tb24vcmZiL1Bhc3N3b3JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyNjkwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvUGFzc3dvcmQuaApAQCAtMCwwICsxLDQ2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fUkZCX1BBU1NXT1JEX0hfXworI2RlZmluZSBfX1JGQl9QQVNTV09SRF9IX18KKworI2luY2x1ZGUgPHJmYi91dGlsLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIE9iZnVzY2F0ZWRQYXNzd2Q7CisKKyAgY2xhc3MgUGxhaW5QYXNzd2QgOiBwdWJsaWMgQ2hhckFycmF5IHsKKyAgcHVibGljOgorICAgIFBsYWluUGFzc3dkKCk7CisgICAgUGxhaW5QYXNzd2QoY2hhciogcHdkKTsKKyAgICBQbGFpblBhc3N3ZChjb25zdCBPYmZ1c2NhdGVkUGFzc3dkJiBvYmZQd2QpOworICAgIH5QbGFpblBhc3N3ZCgpOworICAgIHZvaWQgcmVwbGFjZUJ1ZihjaGFyKiBiKTsKKyAgfTsKKworICBjbGFzcyBPYmZ1c2NhdGVkUGFzc3dkIDogcHVibGljIENoYXJBcnJheSB7CisgIHB1YmxpYzoKKyAgICBPYmZ1c2NhdGVkUGFzc3dkKCk7CisgICAgT2JmdXNjYXRlZFBhc3N3ZChpbnQgbCk7CisgICAgT2JmdXNjYXRlZFBhc3N3ZChjb25zdCBQbGFpblBhc3N3ZCYgcGxhaW5Qd2QpOworICAgIH5PYmZ1c2NhdGVkUGFzc3dkKCk7CisgICAgaW50IGxlbmd0aDsKKyAgfTsKKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1BpeGVsLmggYi9jb21tb24vcmZiL1BpeGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5ZDE2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvUGl4ZWwuaApAQCAtMCwwICsxLDI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fUkZCX1BJWEVMX0hfXworI2RlZmluZSBfX1JGQl9QSVhFTF9IX18KKworI2luY2x1ZGUgPHJkci90eXBlcy5oPgorCituYW1lc3BhY2UgcmZiIHsKKyAgdHlwZWRlZiByZHI6OlUzMiBQaXhlbDsgLy8gbXVzdCBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYW55IHBpeGVsIHZhbHVlCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvUGl4ZWxCdWZmZXIuY3h4IGIvY29tbW9uL3JmYi9QaXhlbEJ1ZmZlci5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5MzQyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvUGl4ZWxCdWZmZXIuY3h4CkBAIC0wLDAgKzEsMzA5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSBQaXhlbEJ1ZmZlci5jeHgKKy8vCisvLyBUaGUgUGl4ZWxCdWZmZXIgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBQaXhlbEZvcm1hdCBhbmQgZGltZW5zaW9ucworLy8gb2YgYSBibG9jayBvZiBwaXhlbCBkYXRhLgorCisjaW5jbHVkZSA8cmZiL0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvUGl4ZWxCdWZmZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKK3VzaW5nIG5hbWVzcGFjZSByZHI7CisKK3N0YXRpYyBMb2dXcml0ZXIgdmxvZygiUGl4ZWxCdWZmZXIiKTsKKworCisvLyAtPS0gR2VuZXJpYyBwaXhlbCBidWZmZXIgY2xhc3MKKworUGl4ZWxCdWZmZXI6OlBpeGVsQnVmZmVyKGNvbnN0IFBpeGVsRm9ybWF0JiBwZiwgaW50IHcsIGludCBoLCBDb2xvdXJNYXAqIGNtKQorICA6IGZvcm1hdChwZiksIHdpZHRoXyh3KSwgaGVpZ2h0XyhoKSwgY29sb3VybWFwKGNtKSB7fQorUGl4ZWxCdWZmZXI6OlBpeGVsQnVmZmVyKCkgOiB3aWR0aF8oMCksIGhlaWdodF8oMCksIGNvbG91cm1hcCgwKSB7fQorCitQaXhlbEJ1ZmZlcjo6flBpeGVsQnVmZmVyKCkge30KKworCit2b2lkIFBpeGVsQnVmZmVyOjpzZXRQRihjb25zdCBQaXhlbEZvcm1hdCAmcGYpIHtmb3JtYXQgPSBwZjt9Citjb25zdCBQaXhlbEZvcm1hdCYgUGl4ZWxCdWZmZXI6OmdldFBGKCkgY29uc3Qge3JldHVybiBmb3JtYXQ7fQorQ29sb3VyTWFwKiBQaXhlbEJ1ZmZlcjo6Z2V0Q29sb3VyTWFwKCkgY29uc3Qge3JldHVybiBjb2xvdXJtYXA7fQorCisKK3ZvaWQKK1BpeGVsQnVmZmVyOjpnZXRJbWFnZSh2b2lkKiBpbWFnZUJ1ZiwgY29uc3QgUmVjdCYgciwgaW50IG91dFN0cmlkZSkgeworICBpbnQgaW5TdHJpZGU7CisgIGNvbnN0IFU4KiBkYXRhID0gZ2V0UGl4ZWxzUihyLCAmaW5TdHJpZGUpOworICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpcyBwcmUtY2xpcHBlZCB0byB0aGUgYnVmZmVyCisgIGludCBieXRlc1BlclBpeGVsID0gZm9ybWF0LmJwcC84OworICBpbnQgaW5CeXRlc1BlclJvdyA9IGluU3RyaWRlICogYnl0ZXNQZXJQaXhlbDsKKyAgaWYgKCFvdXRTdHJpZGUpIG91dFN0cmlkZSA9IHIud2lkdGgoKTsKKyAgaW50IG91dEJ5dGVzUGVyUm93ID0gb3V0U3RyaWRlICogYnl0ZXNQZXJQaXhlbDsKKyAgaW50IGJ5dGVzUGVyTWVtQ3B5ID0gci53aWR0aCgpICogYnl0ZXNQZXJQaXhlbDsKKyAgVTgqIGltYWdlQnVmUG9zID0gKFU4KilpbWFnZUJ1ZjsKKyAgY29uc3QgVTgqIGVuZCA9IGRhdGEgKyAoaW5CeXRlc1BlclJvdyAqIHIuaGVpZ2h0KCkpOworICB3aGlsZSAoZGF0YSA8IGVuZCkgeworICAgIG1lbWNweShpbWFnZUJ1ZlBvcywgZGF0YSwgYnl0ZXNQZXJNZW1DcHkpOworICAgIGltYWdlQnVmUG9zICs9IG91dEJ5dGVzUGVyUm93OworICAgIGRhdGEgKz0gaW5CeXRlc1BlclJvdzsKKyAgfQorfQorCisvKiAqKioKK1BpeGVsIFBpeGVsQnVmZmVyOjpnZXRQaXhlbChjb25zdCBQb2ludCYgcCkgeworICBpbnQgc3RyaWRlOworICBSZWN0IHIgPSBSZWN0KHAueCwgcC55LCBwLngrMSwgcC55KzEpOworICBzd2l0Y2goZm9ybWF0LmJwcCkgeworICBjYXNlIDg6IHJldHVybiAqKChyZHI6OlU4KilnZXREYXRhQXQociwgJnN0cmlkZSkpOworICBjYXNlIDE2OiByZXR1cm4gKigocmRyOjpVMTYqKWdldERhdGFBdChyLCAmc3RyaWRlKSk7CisgIGNhc2UgMzI6IHJldHVybiAqKChyZHI6OlUzMiopZ2V0RGF0YUF0KHIsICZzdHJpZGUpKTsKKyAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH07Cit9CisqLworCisKK0Z1bGxGcmFtZVBpeGVsQnVmZmVyOjpGdWxsRnJhbWVQaXhlbEJ1ZmZlcihjb25zdCBQaXhlbEZvcm1hdCYgcGYsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZHI6OlU4KiBkYXRhXywgQ29sb3VyTWFwKiBjbSkKKyAgOiBQaXhlbEJ1ZmZlcihwZiwgdywgaCwgY20pLCBkYXRhKGRhdGFfKQoreworfQorCitGdWxsRnJhbWVQaXhlbEJ1ZmZlcjo6RnVsbEZyYW1lUGl4ZWxCdWZmZXIoKSA6IGRhdGEoMCkge30KKworRnVsbEZyYW1lUGl4ZWxCdWZmZXI6On5GdWxsRnJhbWVQaXhlbEJ1ZmZlcigpIHt9CisKKworaW50IEZ1bGxGcmFtZVBpeGVsQnVmZmVyOjpnZXRTdHJpZGUoKSBjb25zdCB7IHJldHVybiB3aWR0aCgpOyB9CisKK3Jkcjo6VTgqIEZ1bGxGcmFtZVBpeGVsQnVmZmVyOjpnZXRQaXhlbHNSVyhjb25zdCBSZWN0JiByLCBpbnQqIHN0cmlkZSkKK3sKKyAgKnN0cmlkZSA9IGdldFN0cmlkZSgpOworICByZXR1cm4gJmRhdGFbKHIudGwueCArIChyLnRsLnkgKiAqc3RyaWRlKSkgKiBmb3JtYXQuYnBwLzhdOworfQorCisKK3ZvaWQgRnVsbEZyYW1lUGl4ZWxCdWZmZXI6OmZpbGxSZWN0KGNvbnN0IFJlY3QmIHIsIFBpeGVsIHBpeCkgeworICBpbnQgc3RyaWRlOworICBVOCogZGF0YSA9IGdldFBpeGVsc1JXKHIsICZzdHJpZGUpOworICBpbnQgYnl0ZXNQZXJQaXhlbCA9IGdldFBGKCkuYnBwLzg7CisgIGludCBieXRlc1BlclJvdyA9IGJ5dGVzUGVyUGl4ZWwgKiBzdHJpZGU7CisgIGludCBieXRlc1BlckZpbGwgPSBieXRlc1BlclBpeGVsICogci53aWR0aCgpOworCisgIFU4KiBlbmQgPSBkYXRhICsgKGJ5dGVzUGVyUm93ICogci5oZWlnaHQoKSk7CisgIHdoaWxlIChkYXRhIDwgZW5kKSB7CisgICAgc3dpdGNoIChieXRlc1BlclBpeGVsKSB7CisgICAgY2FzZSAxOgorICAgICAgbWVtc2V0KGRhdGEsIHBpeCwgYnl0ZXNQZXJGaWxsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHsKKyAgICAgICAgVTE2KiBvcHRyID0gKFUxNiopZGF0YTsKKyAgICAgICAgVTE2KiBlb2wgPSBvcHRyICsgci53aWR0aCgpOworICAgICAgICB3aGlsZSAob3B0ciA8IGVvbCkKKyAgICAgICAgICAqb3B0cisrID0gcGl4OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgeworICAgICAgICBVMzIqIG9wdHIgPSAoVTMyKilkYXRhOworICAgICAgICBVMzIqIGVvbCA9IG9wdHIgKyByLndpZHRoKCk7CisgICAgICAgIHdoaWxlIChvcHRyIDwgZW9sKQorICAgICAgICAgICpvcHRyKysgPSBwaXg7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGF0YSArPSBieXRlc1BlclJvdzsKKyAgfQorfQorCit2b2lkIEZ1bGxGcmFtZVBpeGVsQnVmZmVyOjppbWFnZVJlY3QoY29uc3QgUmVjdCYgciwgY29uc3Qgdm9pZCogcGl4ZWxzLCBpbnQgc3JjU3RyaWRlKSB7CisgIGludCBieXRlc1BlclBpeGVsID0gZ2V0UEYoKS5icHAvODsKKyAgaW50IGRlc3RTdHJpZGU7CisgIFU4KiBkZXN0ID0gZ2V0UGl4ZWxzUlcociwgJmRlc3RTdHJpZGUpOworICBpbnQgYnl0ZXNQZXJEZXN0Um93ID0gYnl0ZXNQZXJQaXhlbCAqIGRlc3RTdHJpZGU7CisgIGlmICghc3JjU3RyaWRlKSBzcmNTdHJpZGUgPSByLndpZHRoKCk7CisgIGludCBieXRlc1BlclNyY1JvdyA9IGJ5dGVzUGVyUGl4ZWwgKiBzcmNTdHJpZGU7CisgIGludCBieXRlc1BlckZpbGwgPSBieXRlc1BlclBpeGVsICogci53aWR0aCgpOworICBjb25zdCBVOCogc3JjID0gKGNvbnN0IFU4KilwaXhlbHM7CisgIFU4KiBlbmQgPSBkZXN0ICsgKGJ5dGVzUGVyRGVzdFJvdyAqIHIuaGVpZ2h0KCkpOworICB3aGlsZSAoZGVzdCA8IGVuZCkgeworICAgIG1lbWNweShkZXN0LCBzcmMsIGJ5dGVzUGVyRmlsbCk7CisgICAgZGVzdCArPSBieXRlc1BlckRlc3RSb3c7CisgICAgc3JjICs9IGJ5dGVzUGVyU3JjUm93OworICB9Cit9CisKK3ZvaWQgRnVsbEZyYW1lUGl4ZWxCdWZmZXI6Om1hc2tSZWN0KGNvbnN0IFJlY3QmIHIsIGNvbnN0IHZvaWQqIHBpeGVscywgY29uc3Qgdm9pZCogbWFza18pIHsKKyAgUmVjdCBjciA9IGdldFJlY3QoKS5pbnRlcnNlY3Qocik7CisgIGlmIChjci5pc19lbXB0eSgpKSByZXR1cm47CisgIGludCBzdHJpZGU7CisgIFU4KiBkYXRhID0gZ2V0UGl4ZWxzUlcoY3IsICZzdHJpZGUpOworICBVOCogbWFzayA9IChVOCopIG1hc2tfOworICBpbnQgdyA9IGNyLndpZHRoKCk7CisgIGludCBoID0gY3IuaGVpZ2h0KCk7CisgIGludCBicHAgPSBnZXRQRigpLmJwcDsKKyAgaW50IHBpeGVsU3RyaWRlID0gci53aWR0aCgpOworICBpbnQgbWFza1N0cmlkZSA9IChyLndpZHRoKCkgKyA3KSAvIDg7CisKKyAgUG9pbnQgb2Zmc2V0ID0gUG9pbnQoY3IudGwueC1yLnRsLngsIGNyLnRsLnktci50bC55KTsKKyAgbWFzayArPSBvZmZzZXQueSAqIG1hc2tTdHJpZGU7CisgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgaW50IGN5ID0gb2Zmc2V0LnkgKyB5OworICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICBpbnQgY3ggPSBvZmZzZXQueCArIHg7CisgICAgICBVOCogYnl0ZSA9IG1hc2sgKyAoY3ggLyA4KTsKKyAgICAgIGludCBiaXQgPSA3IC0gY3ggJSA4OworICAgICAgaWYgKCgqYnl0ZSkgJiAoMSA8PCBiaXQpKSB7CisgICAgICAgIHN3aXRjaCAoYnBwKSB7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAoKFU4KilkYXRhKVt5ICogc3RyaWRlICsgeF0gPSAoKFU4KilwaXhlbHMpW2N5ICogcGl4ZWxTdHJpZGUgKyBjeF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgKChVMTYqKWRhdGEpW3kgKiBzdHJpZGUgKyB4XSA9ICgoVTE2KilwaXhlbHMpW2N5ICogcGl4ZWxTdHJpZGUgKyBjeF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgKChVMzIqKWRhdGEpW3kgKiBzdHJpZGUgKyB4XSA9ICgoVTMyKilwaXhlbHMpW2N5ICogcGl4ZWxTdHJpZGUgKyBjeF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWFzayArPSBtYXNrU3RyaWRlOworICB9Cit9CisKK3ZvaWQgRnVsbEZyYW1lUGl4ZWxCdWZmZXI6Om1hc2tSZWN0KGNvbnN0IFJlY3QmIHIsIFBpeGVsIHBpeGVsLCBjb25zdCB2b2lkKiBtYXNrXykgeworICBSZWN0IGNyID0gZ2V0UmVjdCgpLmludGVyc2VjdChyKTsKKyAgaWYgKGNyLmlzX2VtcHR5KCkpIHJldHVybjsKKyAgaW50IHN0cmlkZTsKKyAgVTgqIGRhdGEgPSBnZXRQaXhlbHNSVyhjciwgJnN0cmlkZSk7CisgIFU4KiBtYXNrID0gKFU4KikgbWFza187CisgIGludCB3ID0gY3Iud2lkdGgoKTsKKyAgaW50IGggPSBjci5oZWlnaHQoKTsKKyAgaW50IGJwcCA9IGdldFBGKCkuYnBwOworICBpbnQgbWFza1N0cmlkZSA9IChyLndpZHRoKCkgKyA3KSAvIDg7CisKKyAgUG9pbnQgb2Zmc2V0ID0gUG9pbnQoY3IudGwueC1yLnRsLngsIGNyLnRsLnktci50bC55KTsKKyAgbWFzayArPSBvZmZzZXQueSAqIG1hc2tTdHJpZGU7CisgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgIGludCBjeCA9IG9mZnNldC54ICsgeDsKKyAgICAgIFU4KiBieXRlID0gbWFzayArIChjeCAvIDgpOworICAgICAgaW50IGJpdCA9IDcgLSBjeCAlIDg7CisgICAgICBpZiAoKCpieXRlKSAmICgxIDw8IGJpdCkpIHsKKyAgICAgICAgc3dpdGNoIChicHApIHsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICgoVTgqKWRhdGEpW3kgKiBzdHJpZGUgKyB4XSA9IHBpeGVsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICgoVTE2KilkYXRhKVt5ICogc3RyaWRlICsgeF0gPSBwaXhlbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAoKFUzMiopZGF0YSlbeSAqIHN0cmlkZSArIHhdID0gcGl4ZWw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWFzayArPSBtYXNrU3RyaWRlOworICB9Cit9CisKK3ZvaWQgRnVsbEZyYW1lUGl4ZWxCdWZmZXI6OmNvcHlSZWN0KGNvbnN0IFJlY3QgJnJlY3QsIGNvbnN0IFBvaW50ICZtb3ZlX2J5X2RlbHRhKSB7CisgIGludCBzdHJpZGU7CisgIFU4KiBkYXRhID0gZ2V0UGl4ZWxzUlcoZ2V0UmVjdCgpLCAmc3RyaWRlKTsKKyAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgaXMgcHJlLWNsaXBwZWQgdG8gdGhlIGJ1ZmZlcgorICB1bnNpZ25lZCBpbnQgYnl0ZXNQZXJQaXhlbCwgYnl0ZXNQZXJSb3csIGJ5dGVzUGVyTWVtQ3B5OworICBSZWN0IHNyZWN0ID0gcmVjdC50cmFuc2xhdGUobW92ZV9ieV9kZWx0YS5uZWdhdGUoKSk7CisgIGJ5dGVzUGVyUGl4ZWwgPSBnZXRQRigpLmJwcC84OworICBieXRlc1BlclJvdyA9IHN0cmlkZSAqIGJ5dGVzUGVyUGl4ZWw7CisgIGJ5dGVzUGVyTWVtQ3B5ID0gcmVjdC53aWR0aCgpICogYnl0ZXNQZXJQaXhlbDsKKyAgaWYgKG1vdmVfYnlfZGVsdGEueSA8PSAwKSB7CisgICAgVTgqIGRlc3QgPSBkYXRhICsgcmVjdC50bC54KmJ5dGVzUGVyUGl4ZWwgKyByZWN0LnRsLnkqYnl0ZXNQZXJSb3c7CisgICAgVTgqIHNyYyA9IGRhdGEgKyBzcmVjdC50bC54KmJ5dGVzUGVyUGl4ZWwgKyBzcmVjdC50bC55KmJ5dGVzUGVyUm93OworICAgIGZvciAoaW50IGk9cmVjdC50bC55OyBpPHJlY3QuYnIueTsgaSsrKSB7CisgICAgICBtZW1tb3ZlKGRlc3QsIHNyYywgYnl0ZXNQZXJNZW1DcHkpOworICAgICAgZGVzdCArPSBieXRlc1BlclJvdzsKKyAgICAgIHNyYyArPSBieXRlc1BlclJvdzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgVTgqIGRlc3QgPSBkYXRhICsgcmVjdC50bC54KmJ5dGVzUGVyUGl4ZWwgKyAocmVjdC5ici55LTEpKmJ5dGVzUGVyUm93OworICAgIFU4KiBzcmMgPSBkYXRhICsgc3JlY3QudGwueCpieXRlc1BlclBpeGVsICsgKHNyZWN0LmJyLnktMSkqYnl0ZXNQZXJSb3c7CisgICAgZm9yIChpbnQgaT1yZWN0LnRsLnk7IGk8cmVjdC5ici55OyBpKyspIHsKKyAgICAgIG1lbW1vdmUoZGVzdCwgc3JjLCBieXRlc1Blck1lbUNweSk7CisgICAgICBkZXN0IC09IGJ5dGVzUGVyUm93OworICAgICAgc3JjIC09IGJ5dGVzUGVyUm93OworICAgIH0KKyAgfQorfQorCisKKy8vIC09LSBNYW5hZ2VkIHBpeGVsIGJ1ZmZlciBjbGFzcworLy8gQXV0b21hdGljYWxseSBhbGxvY2F0ZXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgc3BlY2lmaWVkIGZvcm1hdCAmIGFyZWEKKworTWFuYWdlZFBpeGVsQnVmZmVyOjpNYW5hZ2VkUGl4ZWxCdWZmZXIoKQorICA6IGRhdGFzaXplKDApLCBvd25fY29sb3VybWFwKGZhbHNlKQoreworICBjaGVja0RhdGFTaXplKCk7Cit9OworCitNYW5hZ2VkUGl4ZWxCdWZmZXI6Ok1hbmFnZWRQaXhlbEJ1ZmZlcihjb25zdCBQaXhlbEZvcm1hdCYgcGYsIGludCB3LCBpbnQgaCkKKyAgOiBGdWxsRnJhbWVQaXhlbEJ1ZmZlcihwZiwgdywgaCwgMCwgMCksIGRhdGFzaXplKDApLCBvd25fY29sb3VybWFwKGZhbHNlKQoreworICBjaGVja0RhdGFTaXplKCk7Cit9OworCitNYW5hZ2VkUGl4ZWxCdWZmZXI6On5NYW5hZ2VkUGl4ZWxCdWZmZXIoKSB7CisgIGlmIChkYXRhKSBkZWxldGUgW10gZGF0YTsKKyAgaWYgKGNvbG91cm1hcCAmJiBvd25fY29sb3VybWFwKSBkZWxldGUgY29sb3VybWFwOworfTsKKworCit2b2lkCitNYW5hZ2VkUGl4ZWxCdWZmZXI6OnNldFBGKGNvbnN0IFBpeGVsRm9ybWF0ICZwZikgeworICBmb3JtYXQgPSBwZjsgY2hlY2tEYXRhU2l6ZSgpOworfTsKK3ZvaWQKK01hbmFnZWRQaXhlbEJ1ZmZlcjo6c2V0U2l6ZShpbnQgdywgaW50IGgpIHsKKyAgd2lkdGhfID0gdzsgaGVpZ2h0XyA9IGg7IGNoZWNrRGF0YVNpemUoKTsKK307CisKKwordm9pZAorTWFuYWdlZFBpeGVsQnVmZmVyOjpzZXRDb2xvdXJNYXAoQ29sb3VyTWFwKiBjbSwgYm9vbCBvd25fY20pIHsKKyAgaWYgKGNvbG91cm1hcCAmJiBvd25fY29sb3VybWFwKSBkZWxldGUgY29sb3VybWFwOworICBjb2xvdXJtYXAgPSBjbTsKKyAgb3duX2NvbG91cm1hcCA9IG93bl9jbTsKK30KKworaW5saW5lIHZvaWQKK01hbmFnZWRQaXhlbEJ1ZmZlcjo6Y2hlY2tEYXRhU2l6ZSgpIHsKKyAgdW5zaWduZWQgbG9uZyBuZXdfZGF0YXNpemUgPSB3aWR0aF8gKiBoZWlnaHRfICogKGZvcm1hdC5icHAvOCk7CisgIGlmIChkYXRhc2l6ZSA8IG5ld19kYXRhc2l6ZSkgeworICAgIHZsb2cuZGVidWcoInJlYWxsb2NhdGluZyBtYW5hZ2VkIGJ1ZmZlciAoJWR4JWQpIiwgd2lkdGhfLCBoZWlnaHRfKTsKKyAgICBpZiAoZGF0YSkgeworICAgICAgZGVsZXRlIFtdIGRhdGE7CisgICAgICBkYXRhc2l6ZSA9IDA7IGRhdGEgPSAwOworICAgIH0KKyAgICBpZiAobmV3X2RhdGFzaXplKSB7CisgICAgICBkYXRhID0gbmV3IFU4W25ld19kYXRhc2l6ZV07CisgICAgICBpZiAoIWRhdGEpCisgICAgICAgIHRocm93IEV4Y2VwdGlvbigicmZiOjpNYW5hZ2VkUGl4ZWxCdWZmZXIgdW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciIpOworICAgICAgZGF0YXNpemUgPSBuZXdfZGF0YXNpemU7CisgICAgfQorICB9Cit9OwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9QaXhlbEJ1ZmZlci5oIGIvY29tbW9uL3JmYi9QaXhlbEJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTM5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1BpeGVsQnVmZmVyLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gLT0tIFBpeGVsQnVmZmVyLmgKKy8vCisvLyBUaGUgUGl4ZWxCdWZmZXIgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBQaXhlbEZvcm1hdCBhbmQgZGltZW5zaW9ucworLy8gb2YgYSBibG9jayBvZiBwaXhlbCBkYXRhLgorCisjaWZuZGVmIF9fUkZCX1BJWEVMX0JVRkZFUl9IX18KKyNkZWZpbmUgX19SRkJfUElYRUxfQlVGRkVSX0hfXworCisjaW5jbHVkZSA8cmZiL0ltYWdlR2V0dGVyLmg+CisjaW5jbHVkZSA8cmZiL1BpeGVsRm9ybWF0Lmg+CisjaW5jbHVkZSA8cmZiL0NvbG91ck1hcC5oPgorI2luY2x1ZGUgPHJmYi9SZWN0Lmg+CisjaW5jbHVkZSA8cmZiL1BpeGVsLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIFJlZ2lvbjsKKworICBjbGFzcyBQaXhlbEJ1ZmZlciA6IHB1YmxpYyBJbWFnZUdldHRlciB7CisgIHB1YmxpYzoKKyAgICBQaXhlbEJ1ZmZlcihjb25zdCBQaXhlbEZvcm1hdCYgcGYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgQ29sb3VyTWFwKiBjbSk7CisgICAgdmlydHVhbCB+UGl4ZWxCdWZmZXIoKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gRm9ybWF0IC8gTGF5b3V0CisgICAgLy8KKworICAgIC8vIFNldC9nZXQgcGl4ZWwgZm9ybWF0ICYgY29sb3VybWFwCisgICAgdmlydHVhbCB2b2lkIHNldFBGKGNvbnN0IFBpeGVsRm9ybWF0ICZwZik7CisgICAgdmlydHVhbCBjb25zdCBQaXhlbEZvcm1hdCAmZ2V0UEYoKSBjb25zdDsKKyAgICB2aXJ0dWFsIENvbG91ck1hcCogZ2V0Q29sb3VyTWFwKCkgY29uc3Q7CisKKyAgICAvLyBHZXQgd2lkdGgsIGhlaWdodCBhbmQgbnVtYmVyIG9mIHBpeGVscworICAgIGludCB3aWR0aCgpICBjb25zdCB7IHJldHVybiB3aWR0aF87IH0KKyAgICBpbnQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gaGVpZ2h0XzsgfQorICAgIGludCBhcmVhKCkgY29uc3QgeyByZXR1cm4gd2lkdGhfICogaGVpZ2h0XzsgfQorCisgICAgLy8gR2V0IHJlY3RhbmdsZSBlbmNvbXBhc3NpbmcgdGhpcyBidWZmZXIKKyAgICAvLyAgIFRvcC1sZWZ0IG9mIHJlY3RhbmdsZSBpcyBlaXRoZXIgYXQgKDAsMCksIG9yIHRoZSBzcGVjaWZpZWQgcG9pbnQuCisgICAgUmVjdCBnZXRSZWN0KCkgY29uc3QgeyByZXR1cm4gUmVjdCgwLCAwLCB3aWR0aF8sIGhlaWdodF8pOyB9CisgICAgUmVjdCBnZXRSZWN0KGNvbnN0IFBvaW50JiBwb3MpIGNvbnN0IHsKKyAgICAgIHJldHVybiBSZWN0KHBvcywgcG9zLnRyYW5zbGF0ZShQb2ludCh3aWR0aF8sIGhlaWdodF8pKSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBBY2Nlc3MgdG8gcGl4ZWwgZGF0YQorICAgIC8vCisKKyAgICAvLyBHZXQgYSBwb2ludGVyIGludG8gdGhlIGJ1ZmZlcgorICAgIC8vICAgVGhlIHBvaW50ZXIgaXMgdG8gdGhlIHRvcC1sZWZ0IHBpeGVsIG9mIHRoZSBzcGVjaWZpZWQgUmVjdC4KKyAgICAvLyAgIFRoZSBidWZmZXIgc3RyaWRlIChpbiBwaXhlbHMpIGlzIHJldHVybmVkLgorICAgIHZpcnR1YWwgY29uc3QgcmRyOjpVOCogZ2V0UGl4ZWxzUihjb25zdCBSZWN0JiByLCBpbnQqIHN0cmlkZSkgPSAwOworCisgICAgLy8gR2V0IHBpeGVsIGRhdGEgZm9yIGEgZ2l2ZW4gcGFydCBvZiB0aGUgYnVmZmVyCisgICAgLy8gICBEYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBzdXBwbGllZCBidWZmZXIsIHdpdGggdGhlIHNwZWNpZmllZAorICAgIC8vICAgc3RyaWRlLgorICAgIHZpcnR1YWwgdm9pZCBnZXRJbWFnZSh2b2lkKiBpbWFnZUJ1ZiwgY29uc3QgUmVjdCYgciwgaW50IHN0cmlkZT0wKTsKKworICAgIC8vIEdldCB0aGUgZGF0YSBhdCAoeCx5KSBhcyBhIFBpeGVsLgorICAgIC8vICAgVkVSWSBJTkVGRklDSUVOVCEhIQorICAgIC8vICoqKiBQaXhlbCBnZXRQaXhlbChjb25zdCBQb2ludCYgcCk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEZyYW1lYnVmZmVyIHVwZGF0ZSBtZXRob2RzCisgICAgLy8KKworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIG9mIGJ1ZmZlciBpcyB1cCB0byBkYXRlLgorICAgIC8vICAgT3ZlcnJpZGRlbiBieSBkZXJpdmVkIGNsYXNzZXMgaW1wbGVtZW50aW5nIGZyYW1lYnVmZmVyIGFjY2VzcworICAgIC8vICAgdG8gY29weSB0aGUgcmVxdWlyZWQgZGlzcGxheSBkYXRhIGludG8gcGxhY2UuCisgICAgdmlydHVhbCB2b2lkIGdyYWJSZWdpb24oY29uc3QgUmVnaW9uJiByZWdpb24pIHt9CisKKyAgcHJvdGVjdGVkOgorICAgIFBpeGVsQnVmZmVyKCk7CisgICAgUGl4ZWxGb3JtYXQgZm9ybWF0OworICAgIGludCB3aWR0aF8sIGhlaWdodF87CisgICAgQ29sb3VyTWFwKiBjb2xvdXJtYXA7CisgIH07CisKKyAgLy8gRnVsbEZyYW1lUGl4ZWxCdWZmZXIKKworICBjbGFzcyBGdWxsRnJhbWVQaXhlbEJ1ZmZlciA6IHB1YmxpYyBQaXhlbEJ1ZmZlciB7CisgIHB1YmxpYzoKKyAgICBGdWxsRnJhbWVQaXhlbEJ1ZmZlcihjb25zdCBQaXhlbEZvcm1hdCYgcGYsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZHI6OlU4KiBkYXRhXywgQ29sb3VyTWFwKiBjbSk7CisgICAgdmlydHVhbCB+RnVsbEZyYW1lUGl4ZWxCdWZmZXIoKTsKKworICAgIC8vIC0gR2V0IHRoZSBudW1iZXIgb2YgcGl4ZWxzIHBlciByb3cgaW4gdGhlIGFjdHVhbCBwaXhlbCBidWZmZXIgZGF0YSBhcmVhCisgICAgLy8gICBUaGlzIG1heSBpbiBzb21lIGNhc2VzIE5PVCBiZSB0aGUgc2FtZSBhcyB3aWR0aCgpLgorICAgIHZpcnR1YWwgaW50IGdldFN0cmlkZSgpIGNvbnN0OworCisgICAgLy8gR2V0IGEgcG9pbnRlciB0byBzcGVjaWZpZWQgcGl4ZWwgZGF0YQorICAgIHZpcnR1YWwgcmRyOjpVOCogZ2V0UGl4ZWxzUlcoY29uc3QgUmVjdCYgciwgaW50KiBzdHJpZGUpOworICAgIHZpcnR1YWwgY29uc3QgcmRyOjpVOCogZ2V0UGl4ZWxzUihjb25zdCBSZWN0JiByLCBpbnQqIHN0cmlkZSkgeworICAgICAgcmV0dXJuIGdldFBpeGVsc1JXKHIsIHN0cmlkZSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBCYXNpYyByZW5kZXJpbmcgb3BlcmF0aW9ucworICAgIC8vIFRoZXNlIG9wZXJhdGlvbnMgRE8gTk9UIGNsaXAgdG8gdGhlIHBpeGVsYnVmZmVyIGFyZWEsIG9yIHRyYXAgb3ZlcnJ1bnMuCisKKyAgICAvLyBGaWxsIGEgcmVjdGFuZ2xlCisgICAgdmlydHVhbCB2b2lkIGZpbGxSZWN0KGNvbnN0IFJlY3QgJmRlc3QsIFBpeGVsIHBpeCk7CisKKyAgICAvLyBDb3B5IHBpeGVsIGRhdGEgdG8gdGhlIGJ1ZmZlcgorICAgIHZpcnR1YWwgdm9pZCBpbWFnZVJlY3QoY29uc3QgUmVjdCAmZGVzdCwgY29uc3Qgdm9pZCogcGl4ZWxzLCBpbnQgc3RyaWRlPTApOworCisgICAgLy8gQ29weSBwaXhlbCBkYXRhIGZyb20gb25lIFBpeGVsQnVmZmVyIGxvY2F0aW9uIHRvIGFub3RoZXIKKyAgICB2aXJ0dWFsIHZvaWQgY29weVJlY3QoY29uc3QgUmVjdCAmZGVzdCwgY29uc3QgUG9pbnQgJm1vdmVfYnlfZGVsdGEpOworCisgICAgLy8gQ29weSBwaXhlbCBkYXRhIHRvIHRoZSBidWZmZXIgdGhyb3VnaCBhIG1hc2sKKyAgICAvLyAgIHBpeGVscyBpcyBhIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHRvIGJlIGNvcGllZCB0byByLnRsLgorICAgIC8vICAgbWFza1BvcyBzcGVjaWZpZXMgdGhlIHBpeGVsIG9mZnNldCBpbiB0aGUgbWFzayB0byBzdGFydCBmcm9tLgorICAgIC8vICAgbWFza18gaXMgYSBwb2ludGVyIHRvIHRoZSBtYXNrIGJpdHMgYXQgKDAsMCkuCisgICAgLy8gICBwU3RyaWRlIGFuZCBtU3RyaWRlIGFyZSB0aGUgc3RyaWRlcyBvZiB0aGUgcGl4ZWwgYW5kIG1hc2sgYnVmZmVycy4KKyAgICB2aXJ0dWFsIHZvaWQgbWFza1JlY3QoY29uc3QgUmVjdCYgciwgY29uc3Qgdm9pZCogcGl4ZWxzLCBjb25zdCB2b2lkKiBtYXNrXyk7CisKKyAgICAvLyAgIHBpeGVsIGlzIHRoZSBQaXhlbCB2YWx1ZSB0byBiZSB1c2VkIHdoZXJlIG1hc2tfIGlzIHNldAorICAgIHZpcnR1YWwgdm9pZCBtYXNrUmVjdChjb25zdCBSZWN0JiByLCBQaXhlbCBwaXhlbCwgY29uc3Qgdm9pZCogbWFza18pOworCisgICAgLy8gKioqIFNob3VsZCB0aGlzIGJlIHZpc2libGU/CisgICAgcmRyOjpVOCogZGF0YTsKKworICBwcm90ZWN0ZWQ6CisgICAgRnVsbEZyYW1lUGl4ZWxCdWZmZXIoKTsKKyAgfTsKKworICAvLyAtPS0gTWFuYWdlZCBwaXhlbCBidWZmZXIgY2xhc3MKKyAgLy8gQXV0b21hdGljYWxseSBhbGxvY2F0ZXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgc3BlY2lmaWVkIGZvcm1hdCAmIGFyZWEKKworICBjbGFzcyBNYW5hZ2VkUGl4ZWxCdWZmZXIgOiBwdWJsaWMgRnVsbEZyYW1lUGl4ZWxCdWZmZXIgeworICBwdWJsaWM6CisgICAgTWFuYWdlZFBpeGVsQnVmZmVyKCk7CisgICAgTWFuYWdlZFBpeGVsQnVmZmVyKGNvbnN0IFBpeGVsRm9ybWF0JiBwZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB2aXJ0dWFsIH5NYW5hZ2VkUGl4ZWxCdWZmZXIoKTsKKworICAgIC8vIE1hbmFnZSB0aGUgcGl4ZWwgYnVmZmVyIGxheW91dAorICAgIHZpcnR1YWwgdm9pZCBzZXRQRihjb25zdCBQaXhlbEZvcm1hdCAmcGYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRTaXplKGludCB3LCBpbnQgaCk7CisKKyAgICAvLyBBc3NpZ24gYSBjb2xvdXIgbWFwIHRvIHRoZSBidWZmZXIKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29sb3VyTWFwKENvbG91ck1hcCogY20sIGJvb2wgb3duX2NtKTsKKworICAgIC8vIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG9mIHBpeGVsIGRhdGEgaW4gdGhlIGJ1ZmZlcgorICAgIGludCBkYXRhTGVuKCkgY29uc3QgeyByZXR1cm4gd2lkdGhfICogaGVpZ2h0XyAqIChmb3JtYXQuYnBwLzgpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHVuc2lnbmVkIGxvbmcgZGF0YXNpemU7CisgICAgYm9vbCBvd25fY29sb3VybWFwOworICAgIHZvaWQgY2hlY2tEYXRhU2l6ZSgpOworICB9OworCit9OworCisjZW5kaWYgLy8gX19SRkJfUElYRUxfQlVGRkVSX0hfXwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9QaXhlbEZvcm1hdC5jeHggYi9jb21tb24vcmZiL1BpeGVsRm9ybWF0LmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGI2ODM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9QaXhlbEZvcm1hdC5jeHgKQEAgLTAsMCArMSwyMzkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHJkci9JblN0cmVhbS5oPgorI2luY2x1ZGUgPHJkci9PdXRTdHJlYW0uaD4KKyNpbmNsdWRlIDxyZmIvUGl4ZWxGb3JtYXQuaD4KKyNpbmNsdWRlIDxyZmIvdXRpbC5oPgorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIHN0cmNhc2VjbXAgX3N0cmljbXAKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitQaXhlbEZvcm1hdDo6UGl4ZWxGb3JtYXQoaW50IGIsIGludCBkLCBib29sIGUsIGJvb2wgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm0sIGludCBnbSwgaW50IGJtLCBpbnQgcnMsIGludCBncywgaW50IGJzKQorICA6IGJwcChiKSwgZGVwdGgoZCksIGJpZ0VuZGlhbihlKSwgdHJ1ZUNvbG91cih0KSwKKyAgICByZWRNYXgocm0pLCBncmVlbk1heChnbSksIGJsdWVNYXgoYm0pLAorICAgIHJlZFNoaWZ0KHJzKSwgZ3JlZW5TaGlmdChncyksIGJsdWVTaGlmdChicykKK3sKK30KKworUGl4ZWxGb3JtYXQ6OlBpeGVsRm9ybWF0KCkKKyAgOiBicHAoOCksIGRlcHRoKDgpLCBiaWdFbmRpYW4oZmFsc2UpLCB0cnVlQ29sb3VyKHRydWUpLAorICAgIHJlZE1heCg3KSwgZ3JlZW5NYXgoNyksIGJsdWVNYXgoMyksCisgICAgcmVkU2hpZnQoMCksIGdyZWVuU2hpZnQoMyksIGJsdWVTaGlmdCg2KQoreworfQorCitib29sIFBpeGVsRm9ybWF0OjplcXVhbChjb25zdCBQaXhlbEZvcm1hdCYgb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiAoYnBwID09IG90aGVyLmJwcCAmJgorICAgICAgICAgIGRlcHRoID09IG90aGVyLmRlcHRoICYmCisgICAgICAgICAgKGJpZ0VuZGlhbiA9PSBvdGhlci5iaWdFbmRpYW4gfHwgYnBwID09IDgpICYmCisgICAgICAgICAgdHJ1ZUNvbG91ciA9PSBvdGhlci50cnVlQ29sb3VyICYmCisgICAgICAgICAgKCF0cnVlQ29sb3VyIHx8IChyZWRNYXggPT0gb3RoZXIucmVkTWF4ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbk1heCA9PSBvdGhlci5ncmVlbk1heCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZU1heCA9PSBvdGhlci5ibHVlTWF4ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRTaGlmdCA9PSBvdGhlci5yZWRTaGlmdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW5TaGlmdCA9PSBvdGhlci5ncmVlblNoaWZ0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlU2hpZnQgPT0gb3RoZXIuYmx1ZVNoaWZ0KSkpOworfQorCit2b2lkIFBpeGVsRm9ybWF0OjpyZWFkKHJkcjo6SW5TdHJlYW0qIGlzKQoreworICBicHAgPSBpcy0+cmVhZFU4KCk7CisgIGRlcHRoID0gaXMtPnJlYWRVOCgpOworICBiaWdFbmRpYW4gPSBpcy0+cmVhZFU4KCk7CisgIHRydWVDb2xvdXIgPSBpcy0+cmVhZFU4KCk7CisgIHJlZE1heCA9IGlzLT5yZWFkVTE2KCk7CisgIGdyZWVuTWF4ID0gaXMtPnJlYWRVMTYoKTsKKyAgYmx1ZU1heCA9IGlzLT5yZWFkVTE2KCk7CisgIHJlZFNoaWZ0ID0gaXMtPnJlYWRVOCgpOworICBncmVlblNoaWZ0ID0gaXMtPnJlYWRVOCgpOworICBibHVlU2hpZnQgPSBpcy0+cmVhZFU4KCk7CisgIGlzLT5za2lwKDMpOworfQorCit2b2lkIFBpeGVsRm9ybWF0Ojp3cml0ZShyZHI6Ok91dFN0cmVhbSogb3MpIGNvbnN0Cit7CisgIG9zLT53cml0ZVU4KGJwcCk7CisgIG9zLT53cml0ZVU4KGRlcHRoKTsKKyAgb3MtPndyaXRlVTgoYmlnRW5kaWFuKTsKKyAgb3MtPndyaXRlVTgodHJ1ZUNvbG91cik7CisgIG9zLT53cml0ZVUxNihyZWRNYXgpOworICBvcy0+d3JpdGVVMTYoZ3JlZW5NYXgpOworICBvcy0+d3JpdGVVMTYoYmx1ZU1heCk7CisgIG9zLT53cml0ZVU4KHJlZFNoaWZ0KTsKKyAgb3MtPndyaXRlVTgoZ3JlZW5TaGlmdCk7CisgIG9zLT53cml0ZVU4KGJsdWVTaGlmdCk7CisgIG9zLT5wYWQoMyk7Cit9CisKK1BpeGVsIFBpeGVsRm9ybWF0OjpwaXhlbEZyb21SR0IocmRyOjpVMTYgcmVkLCByZHI6OlUxNiBncmVlbiwgcmRyOjpVMTYgYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyTWFwKiBjbSkgY29uc3QKK3sKKyAgaWYgKHRydWVDb2xvdXIpIHsKKyAgICByZHI6OlUzMiByID0gKChyZHI6OlUzMilyZWQgICAqIHJlZE1heCAgICsgMzI3NjcpIC8gNjU1MzU7CisgICAgcmRyOjpVMzIgZyA9ICgocmRyOjpVMzIpZ3JlZW4gKiBncmVlbk1heCArIDMyNzY3KSAvIDY1NTM1OworICAgIHJkcjo6VTMyIGIgPSAoKHJkcjo6VTMyKWJsdWUgICogYmx1ZU1heCAgKyAzMjc2NykgLyA2NTUzNTsKKworICAgIHJldHVybiAociA8PCByZWRTaGlmdCkgfCAoZyA8PCBncmVlblNoaWZ0KSB8IChiIDw8IGJsdWVTaGlmdCk7CisgIH0gZWxzZSBpZiAoY20pIHsKKyAgICAvLyBUcnkgdG8gZmluZCB0aGUgY2xvc2VzdCBwaXhlbCBieSBDYXJ0ZXNpYW4gZGlzdGFuY2UKKyAgICBpbnQgY29sb3VycyA9IDEgPDwgZGVwdGg7CisgICAgaW50IGRpZmYgPSAyNTYgKiAyNTYgKiA0OworICAgIGludCBjb2wgPSAwOworICAgIGZvciAoaW50IGk9MDsgaTxjb2xvdXJzOyBpKyspIHsKKyAgICAgIGludCByLCBnLCBiOworICAgICAgY20tPmxvb2t1cChpLCAmciwgJmcsICZiKTsKKyAgICAgIGludCByZCA9IChyLXJlZCkgPj4gODsKKyAgICAgIGludCBnZCA9IChnLWdyZWVuKSA+PiA4OworICAgICAgaW50IGJkID0gKGItYmx1ZSkgPj4gODsKKyAgICAgIGludCBkID0gcmQqcmQgKyBnZCpnZCArIGJkKmJkOworICAgICAgaWYgKGQgPCBkaWZmKSB7CisgICAgICAgIGNvbCA9IGk7CisgICAgICAgIGRpZmYgPSBkOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY29sOworICB9CisgIC8vIFhYWCBqdXN0IHJldHVybiAwIGZvciBjb2xvdXIgbWFwPworICByZXR1cm4gMDsKK30KKworCit2b2lkIFBpeGVsRm9ybWF0OjpyZ2JGcm9tUGl4ZWwoUGl4ZWwgcCwgQ29sb3VyTWFwKiBjbSwgQ29sb3VyKiByZ2IpIGNvbnN0Cit7CisgIGlmICh0cnVlQ29sb3VyKSB7CisgICAgcmdiLT5yID0gKCgocCA+PiByZWRTaGlmdCAgKSAmIHJlZE1heCAgKSAqIDY1NTM1ICsgcmVkTWF4ICAvMikgLyByZWRNYXg7CisgICAgcmdiLT5nID0gKCgocCA+PiBncmVlblNoaWZ0KSAmIGdyZWVuTWF4KSAqIDY1NTM1ICsgZ3JlZW5NYXgvMikgLyBncmVlbk1heDsKKyAgICByZ2ItPmIgPSAoKChwID4+IGJsdWVTaGlmdCApICYgYmx1ZU1heCApICogNjU1MzUgKyBibHVlTWF4IC8yKSAvIGJsdWVNYXg7CisgIH0gZWxzZSB7CisgICAgY20tPmxvb2t1cChwLCAmcmdiLT5yLCAmcmdiLT5nLCAmcmdiLT5iKTsKKyAgfQorfQorCisKK3ZvaWQgUGl4ZWxGb3JtYXQ6OnByaW50KGNoYXIqIHN0ciwgaW50IGxlbikgY29uc3QKK3sKKyAgLy8gVW5mb3J0dW5hdGVseSBzbnByaW50ZiBpcyBub3Qgd2lkZWx5IGF2YWlsYWJsZSBzbyB3ZSBidWlsZCB0aGUgc3RyaW5nIHVwCisgIC8vIHVzaW5nIHN0cm5jYXQgLSBub3QgcHJldHR5LCBidXQgc2hvdWxkIGJlIHNhZmUgYWdhaW5zdCBidWZmZXIgb3ZlcnJ1bnMuCisKKyAgY2hhciBudW1bMjBdOworICBpZiAobGVuIDwgMSkgcmV0dXJuOworICBzdHJbMF0gPSAwOworICBzdHJuY2F0KHN0ciwgImRlcHRoICIsIGxlbi0xLXN0cmxlbihzdHIpKTsKKyAgc3ByaW50ZihudW0sIiVkIixkZXB0aCk7CisgIHN0cm5jYXQoc3RyLCBudW0sIGxlbi0xLXN0cmxlbihzdHIpKTsKKyAgc3RybmNhdChzdHIsICIgKCIsIGxlbi0xLXN0cmxlbihzdHIpKTsKKyAgc3ByaW50ZihudW0sIiVkIixicHApOworICBzdHJuY2F0KHN0ciwgbnVtLCBsZW4tMS1zdHJsZW4oc3RyKSk7CisgIHN0cm5jYXQoc3RyLCAiYnBwKSIsIGxlbi0xLXN0cmxlbihzdHIpKTsKKyAgaWYgKGJwcCAhPSA4KSB7CisgICAgaWYgKGJpZ0VuZGlhbikKKyAgICAgIHN0cm5jYXQoc3RyLCAiIGJpZy1lbmRpYW4iLCBsZW4tMS1zdHJsZW4oc3RyKSk7CisgICAgZWxzZQorICAgICAgc3RybmNhdChzdHIsICIgbGl0dGxlLWVuZGlhbiIsIGxlbi0xLXN0cmxlbihzdHIpKTsKKyAgfQorCisgIGlmICghdHJ1ZUNvbG91cikgeworICAgIHN0cm5jYXQoc3RyLCAiIGNvbG9yLW1hcCIsIGxlbi0xLXN0cmxlbihzdHIpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYmx1ZVNoaWZ0ID09IDAgJiYgZ3JlZW5TaGlmdCA+IGJsdWVTaGlmdCAmJiByZWRTaGlmdCA+IGdyZWVuU2hpZnQgJiYKKyAgICAgIGJsdWVNYXggID09ICgxIDw8IGdyZWVuU2hpZnQpIC0gMSAmJgorICAgICAgZ3JlZW5NYXggPT0gKDEgPDwgKHJlZFNoaWZ0LWdyZWVuU2hpZnQpKSAtIDEgJiYKKyAgICAgIHJlZE1heCAgID09ICgxIDw8IChkZXB0aC1yZWRTaGlmdCkpIC0gMSkKKyAgeworICAgIHN0cm5jYXQoc3RyLCAiIHJnYiIsIGxlbi0xLXN0cmxlbihzdHIpKTsKKyAgICBzcHJpbnRmKG51bSwiJWQiLGRlcHRoLXJlZFNoaWZ0KTsKKyAgICBzdHJuY2F0KHN0ciwgbnVtLCBsZW4tMS1zdHJsZW4oc3RyKSk7CisgICAgc3ByaW50ZihudW0sIiVkIixyZWRTaGlmdC1ncmVlblNoaWZ0KTsKKyAgICBzdHJuY2F0KHN0ciwgbnVtLCBsZW4tMS1zdHJsZW4oc3RyKSk7CisgICAgc3ByaW50ZihudW0sIiVkIixncmVlblNoaWZ0KTsKKyAgICBzdHJuY2F0KHN0ciwgbnVtLCBsZW4tMS1zdHJsZW4oc3RyKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHJlZFNoaWZ0ID09IDAgJiYgZ3JlZW5TaGlmdCA+IHJlZFNoaWZ0ICYmIGJsdWVTaGlmdCA+IGdyZWVuU2hpZnQgJiYKKyAgICAgIHJlZE1heCAgID09ICgxIDw8IGdyZWVuU2hpZnQpIC0gMSAmJgorICAgICAgZ3JlZW5NYXggPT0gKDEgPDwgKGJsdWVTaGlmdC1ncmVlblNoaWZ0KSkgLSAxICYmCisgICAgICBibHVlTWF4ICA9PSAoMSA8PCAoZGVwdGgtYmx1ZVNoaWZ0KSkgLSAxKQorICB7CisgICAgc3RybmNhdChzdHIsICIgYmdyIiwgbGVuLTEtc3RybGVuKHN0cikpOworICAgIHNwcmludGYobnVtLCIlZCIsZGVwdGgtYmx1ZVNoaWZ0KTsKKyAgICBzdHJuY2F0KHN0ciwgbnVtLCBsZW4tMS1zdHJsZW4oc3RyKSk7CisgICAgc3ByaW50ZihudW0sIiVkIixibHVlU2hpZnQtZ3JlZW5TaGlmdCk7CisgICAgc3RybmNhdChzdHIsIG51bSwgbGVuLTEtc3RybGVuKHN0cikpOworICAgIHNwcmludGYobnVtLCIlZCIsZ3JlZW5TaGlmdCk7CisgICAgc3RybmNhdChzdHIsIG51bSwgbGVuLTEtc3RybGVuKHN0cikpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0cm5jYXQoc3RyLCAiIHJnYiBtYXggIiwgbGVuLTEtc3RybGVuKHN0cikpOworICBzcHJpbnRmKG51bSwiJWQsIixyZWRNYXgpOworICBzdHJuY2F0KHN0ciwgbnVtLCBsZW4tMS1zdHJsZW4oc3RyKSk7CisgIHNwcmludGYobnVtLCIlZCwiLGdyZWVuTWF4KTsKKyAgc3RybmNhdChzdHIsIG51bSwgbGVuLTEtc3RybGVuKHN0cikpOworICBzcHJpbnRmKG51bSwiJWQiLGJsdWVNYXgpOworICBzdHJuY2F0KHN0ciwgbnVtLCBsZW4tMS1zdHJsZW4oc3RyKSk7CisgIHN0cm5jYXQoc3RyLCAiIHNoaWZ0ICIsIGxlbi0xLXN0cmxlbihzdHIpKTsKKyAgc3ByaW50ZihudW0sIiVkLCIscmVkU2hpZnQpOworICBzdHJuY2F0KHN0ciwgbnVtLCBsZW4tMS1zdHJsZW4oc3RyKSk7CisgIHNwcmludGYobnVtLCIlZCwiLGdyZWVuU2hpZnQpOworICBzdHJuY2F0KHN0ciwgbnVtLCBsZW4tMS1zdHJsZW4oc3RyKSk7CisgIHNwcmludGYobnVtLCIlZCIsYmx1ZVNoaWZ0KTsKKyAgc3RybmNhdChzdHIsIG51bSwgbGVuLTEtc3RybGVuKHN0cikpOworfQorCisKK2Jvb2wgUGl4ZWxGb3JtYXQ6OnBhcnNlKGNvbnN0IGNoYXIqIHN0cikKK3sKKyAgY2hhciByZ2JiZ3JbNF07CisgIGludCBiaXRzMSwgYml0czIsIGJpdHMzOworICBpZiAoc3NjYW5mKHN0ciwgIiUzcyUxZCUxZCUxZCIsIHJnYmJnciwgJmJpdHMxLCAmYml0czIsICZiaXRzMykgPCA0KQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGRlcHRoID0gYml0czEgKyBiaXRzMiArIGJpdHMzOworICBicHAgPSBkZXB0aCA8PSA4ID8gOCA6ICgoZGVwdGggPD0gMTYpID8gMTYgOiAzMik7CisgIHRydWVDb2xvdXIgPSB0cnVlOworICByZHI6OlUzMiBlbmRpYW5UZXN0ID0gMTsKKyAgYmlnRW5kaWFuID0gKCoocmRyOjpVOCopJmVuZGlhblRlc3QgPT0gMCk7CisKKyAgZ3JlZW5TaGlmdCA9IGJpdHMzOworICBncmVlbk1heCA9ICgxIDw8IGJpdHMyKSAtIDE7CisKKyAgaWYgKHN0cmNhc2VjbXAocmdiYmdyLCAiYmdyIikgPT0gMCkgeworICAgIHJlZFNoaWZ0ID0gMDsKKyAgICByZWRNYXggPSAoMSA8PCBiaXRzMykgLSAxOworICAgIGJsdWVTaGlmdCA9IGJpdHMzICsgYml0czI7CisgICAgYmx1ZU1heCA9ICgxIDw8IGJpdHMxKSAtIDE7CisgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChyZ2JiZ3IsICJyZ2IiKSA9PSAwKSB7CisgICAgYmx1ZVNoaWZ0ID0gMDsKKyAgICBibHVlTWF4ID0gKDEgPDwgYml0czMpIC0gMTsKKyAgICByZWRTaGlmdCA9IGJpdHMzICsgYml0czI7CisgICAgcmVkTWF4ID0gKDEgPDwgYml0czEpIC0gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1BpeGVsRm9ybWF0LmggYi9jb21tb24vcmZiL1BpeGVsRm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExYzM4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvUGl4ZWxGb3JtYXQuaApAQCAtMCwwICsxLDU4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gUGl4ZWxGb3JtYXQgLSBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGEgcGl4ZWwgZm9ybWF0LiAgQWxzbyBoYXMgdXNlZnVsCisvLyBtZXRob2RzIGZvciByZWFkaW5nICYgd3JpdGluZyB0byBzdHJlYW1zLCBldGMuCisvLworCisjaWZuZGVmIF9fUkZCX1BJWEVMRk9STUFUX0hfXworI2RlZmluZSBfX1JGQl9QSVhFTEZPUk1BVF9IX18KKworI2luY2x1ZGUgPHJmYi9QaXhlbC5oPgorI2luY2x1ZGUgPHJmYi9Db2xvdXJNYXAuaD4KKworbmFtZXNwYWNlIHJkciB7IGNsYXNzIEluU3RyZWFtOyBjbGFzcyBPdXRTdHJlYW07IH0KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgUGl4ZWxGb3JtYXQgeworICBwdWJsaWM6CisgICAgUGl4ZWxGb3JtYXQoaW50IGIsIGludCBkLCBib29sIGUsIGJvb2wgdCwKKyAgICAgICAgICAgICAgICBpbnQgcm09MCwgaW50IGdtPTAsIGludCBibT0wLCBpbnQgcnM9MCwgaW50IGdzPTAsIGludCBicz0wKTsKKyAgICBQaXhlbEZvcm1hdCgpOworICAgIGJvb2wgZXF1YWwoY29uc3QgUGl4ZWxGb3JtYXQmIG90aGVyKSBjb25zdDsKKyAgICB2b2lkIHJlYWQocmRyOjpJblN0cmVhbSogaXMpOworICAgIHZvaWQgd3JpdGUocmRyOjpPdXRTdHJlYW0qIG9zKSBjb25zdDsKKyAgICBQaXhlbCBwaXhlbEZyb21SR0IocmRyOjpVMTYgcmVkLCByZHI6OlUxNiBncmVlbiwgcmRyOjpVMTYgYmx1ZSwgQ29sb3VyTWFwKiBjbT0wKSBjb25zdDsKKyAgICB2b2lkIHJnYkZyb21QaXhlbChQaXhlbCBwaXgsIENvbG91ck1hcCogY20sIENvbG91ciogcmdiKSBjb25zdDsKKyAgICB2b2lkIHByaW50KGNoYXIqIHN0ciwgaW50IGxlbikgY29uc3Q7CisgICAgYm9vbCBwYXJzZShjb25zdCBjaGFyKiBzdHIpOworCisgICAgaW50IGJwcDsKKyAgICBpbnQgZGVwdGg7CisgICAgYm9vbCBiaWdFbmRpYW47CisgICAgYm9vbCB0cnVlQ29sb3VyOworICAgIGludCByZWRNYXg7CisgICAgaW50IGdyZWVuTWF4OworICAgIGludCBibHVlTWF4OworICAgIGludCByZWRTaGlmdDsKKyAgICBpbnQgZ3JlZW5TaGlmdDsKKyAgICBpbnQgYmx1ZVNoaWZ0OworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1JSRURlY29kZXIuY3h4IGIvY29tbW9uL3JmYi9SUkVEZWNvZGVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTU2ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9SUkVEZWNvZGVyLmN4eApAQCAtMCwwICsxLDU4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8cmZiL0NNc2dSZWFkZXIuaD4KKyNpbmNsdWRlIDxyZmIvQ01zZ0hhbmRsZXIuaD4KKyNpbmNsdWRlIDxyZmIvUlJFRGVjb2Rlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCisjZGVmaW5lIEVYVFJBX0FSR1MgQ01zZ0hhbmRsZXIqIGhhbmRsZXIKKyNkZWZpbmUgRklMTF9SRUNUKHIsIHApIGhhbmRsZXItPmZpbGxSZWN0KHIsIHApCisjZGVmaW5lIElNQUdFX1JFQ1QociwgcCkgaGFuZGxlci0+aW1hZ2VSZWN0KHIsIHApCisjZGVmaW5lIEJQUCA4CisjaW5jbHVkZSA8cmZiL3JyZURlY29kZS5oPgorI3VuZGVmIEJQUAorI2RlZmluZSBCUFAgMTYKKyNpbmNsdWRlIDxyZmIvcnJlRGVjb2RlLmg+CisjdW5kZWYgQlBQCisjZGVmaW5lIEJQUCAzMgorI2luY2x1ZGUgPHJmYi9ycmVEZWNvZGUuaD4KKyN1bmRlZiBCUFAKKworRGVjb2RlciogUlJFRGVjb2Rlcjo6Y3JlYXRlKENNc2dSZWFkZXIqIHJlYWRlcikKK3sKKyAgcmV0dXJuIG5ldyBSUkVEZWNvZGVyKHJlYWRlcik7Cit9CisKK1JSRURlY29kZXI6OlJSRURlY29kZXIoQ01zZ1JlYWRlciogcmVhZGVyXykgOiByZWFkZXIocmVhZGVyXykKK3sKK30KKworUlJFRGVjb2Rlcjo6flJSRURlY29kZXIoKQoreworfQorCit2b2lkIFJSRURlY29kZXI6OnJlYWRSZWN0KGNvbnN0IFJlY3QmIHIsIENNc2dIYW5kbGVyKiBoYW5kbGVyKQoreworICByZHI6OkluU3RyZWFtKiBpcyA9IHJlYWRlci0+Z2V0SW5TdHJlYW0oKTsKKyAgc3dpdGNoIChyZWFkZXItPmJwcCgpKSB7CisgIGNhc2UgODogIHJyZURlY29kZTggKHIsIGlzLCBoYW5kbGVyKTsgYnJlYWs7CisgIGNhc2UgMTY6IHJyZURlY29kZTE2KHIsIGlzLCBoYW5kbGVyKTsgYnJlYWs7CisgIGNhc2UgMzI6IHJyZURlY29kZTMyKHIsIGlzLCBoYW5kbGVyKTsgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvUlJFRGVjb2Rlci5oIGIvY29tbW9uL3JmYi9SUkVEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwOWY3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvUlJFRGVjb2Rlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpZm5kZWYgX19SRkJfUlJFREVDT0RFUl9IX18KKyNkZWZpbmUgX19SRkJfUlJFREVDT0RFUl9IX18KKworI2luY2x1ZGUgPHJmYi9EZWNvZGVyLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIFJSRURlY29kZXIgOiBwdWJsaWMgRGVjb2RlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgRGVjb2RlciogY3JlYXRlKENNc2dSZWFkZXIqIHJlYWRlcik7CisgICAgdmlydHVhbCB2b2lkIHJlYWRSZWN0KGNvbnN0IFJlY3QmIHIsIENNc2dIYW5kbGVyKiBoYW5kbGVyKTsKKyAgICB2aXJ0dWFsIH5SUkVEZWNvZGVyKCk7CisgIHByaXZhdGU6CisgICAgUlJFRGVjb2RlcihDTXNnUmVhZGVyKiByZWFkZXIpOworICAgIENNc2dSZWFkZXIqIHJlYWRlcjsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9SUkVFbmNvZGVyLmN4eCBiL2NvbW1vbi9yZmIvUlJFRW5jb2Rlci5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwMGU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvUlJFRW5jb2Rlci5jeHgKQEAgLTAsMCArMSw3NSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2luY2x1ZGUgPHJkci9PdXRTdHJlYW0uaD4KKyNpbmNsdWRlIDxyZmIvSW1hZ2VHZXR0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvZW5jb2RpbmdzLmg+CisjaW5jbHVkZSA8cmZiL1NNc2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvUlJFRW5jb2Rlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCisjZGVmaW5lIEJQUCA4CisjaW5jbHVkZSA8cmZiL3JyZUVuY29kZS5oPgorI3VuZGVmIEJQUAorI2RlZmluZSBCUFAgMTYKKyNpbmNsdWRlIDxyZmIvcnJlRW5jb2RlLmg+CisjdW5kZWYgQlBQCisjZGVmaW5lIEJQUCAzMgorI2luY2x1ZGUgPHJmYi9ycmVFbmNvZGUuaD4KKyN1bmRlZiBCUFAKKworRW5jb2RlciogUlJFRW5jb2Rlcjo6Y3JlYXRlKFNNc2dXcml0ZXIqIHdyaXRlcikKK3sKKyAgcmV0dXJuIG5ldyBSUkVFbmNvZGVyKHdyaXRlcik7Cit9CisKK1JSRUVuY29kZXI6OlJSRUVuY29kZXIoU01zZ1dyaXRlciogd3JpdGVyXykgOiB3cml0ZXIod3JpdGVyXykKK3sKK30KKworUlJFRW5jb2Rlcjo6flJSRUVuY29kZXIoKQoreworfQorCitib29sIFJSRUVuY29kZXI6OndyaXRlUmVjdChjb25zdCBSZWN0JiByLCBJbWFnZUdldHRlciogaWcsIFJlY3QqIGFjdHVhbCkKK3sKKyAgaW50IHcgPSByLndpZHRoKCk7CisgIGludCBoID0gci5oZWlnaHQoKTsKKyAgcmRyOjpVOCogaW1hZ2VCdWYgPSB3cml0ZXItPmdldEltYWdlQnVmKHcqaCk7CisgIGlnLT5nZXRJbWFnZShpbWFnZUJ1Ziwgcik7CisKKyAgbW9zLmNsZWFyKCk7CisKKyAgaW50IG5TdWJyZWN0cyA9IC0xOworICBzd2l0Y2ggKHdyaXRlci0+YnBwKCkpIHsKKyAgY2FzZSA4OiAgblN1YnJlY3RzID0gcnJlRW5jb2RlOChpbWFnZUJ1ZiwgdywgaCwgJm1vcyk7ICBicmVhazsKKyAgY2FzZSAxNjogblN1YnJlY3RzID0gcnJlRW5jb2RlMTYoaW1hZ2VCdWYsIHcsIGgsICZtb3MpOyBicmVhazsKKyAgY2FzZSAzMjogblN1YnJlY3RzID0gcnJlRW5jb2RlMzIoaW1hZ2VCdWYsIHcsIGgsICZtb3MpOyBicmVhazsKKyAgfQorICAKKyAgaWYgKG5TdWJyZWN0cyA8IDApIHsKKyAgICByZXR1cm4gd3JpdGVyLT53cml0ZVJlY3QociwgZW5jb2RpbmdSYXcsIGlnLCBhY3R1YWwpOworICB9CisKKyAgd3JpdGVyLT5zdGFydFJlY3QociwgZW5jb2RpbmdSUkUpOworICByZHI6Ok91dFN0cmVhbSogb3MgPSB3cml0ZXItPmdldE91dFN0cmVhbSgpOworICBvcy0+d3JpdGVVMzIoblN1YnJlY3RzKTsKKyAgb3MtPndyaXRlQnl0ZXMobW9zLmRhdGEoKSwgbW9zLmxlbmd0aCgpKTsKKyAgd3JpdGVyLT5lbmRSZWN0KCk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9SUkVFbmNvZGVyLmggYi9jb21tb24vcmZiL1JSRUVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjgxNDEwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9SUkVFbmNvZGVyLmgKQEAgLTAsMCArMSwzNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2lmbmRlZiBfX1JGQl9SUkVFTkNPREVSX0hfXworI2RlZmluZSBfX1JGQl9SUkVFTkNPREVSX0hfXworCisjaW5jbHVkZSA8cmRyL01lbU91dFN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9FbmNvZGVyLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIFJSRUVuY29kZXIgOiBwdWJsaWMgRW5jb2RlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgRW5jb2RlciogY3JlYXRlKFNNc2dXcml0ZXIqIHdyaXRlcik7CisgICAgdmlydHVhbCBib29sIHdyaXRlUmVjdChjb25zdCBSZWN0JiByLCBJbWFnZUdldHRlciogaWcsIFJlY3QqIGFjdHVhbCk7CisgICAgdmlydHVhbCB+UlJFRW5jb2RlcigpOworICBwcml2YXRlOgorICAgIFJSRUVuY29kZXIoU01zZ1dyaXRlciogd3JpdGVyKTsKKyAgICBTTXNnV3JpdGVyKiB3cml0ZXI7CisgICAgcmRyOjpNZW1PdXRTdHJlYW0gbW9zOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1Jhd0RlY29kZXIuY3h4IGIvY29tbW9uL3JmYi9SYXdEZWNvZGVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2NiMzdiCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9SYXdEZWNvZGVyLmN4eApAQCAtMCwwICsxLDU1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8cmRyL0luU3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL0NNc2dSZWFkZXIuaD4KKyNpbmNsdWRlIDxyZmIvQ01zZ0hhbmRsZXIuaD4KKyNpbmNsdWRlIDxyZmIvUmF3RGVjb2Rlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitEZWNvZGVyKiBSYXdEZWNvZGVyOjpjcmVhdGUoQ01zZ1JlYWRlciogcmVhZGVyKQoreworICByZXR1cm4gbmV3IFJhd0RlY29kZXIocmVhZGVyKTsKK30KKworUmF3RGVjb2Rlcjo6UmF3RGVjb2RlcihDTXNnUmVhZGVyKiByZWFkZXJfKSA6IHJlYWRlcihyZWFkZXJfKQoreworfQorCitSYXdEZWNvZGVyOjp+UmF3RGVjb2RlcigpCit7Cit9CisKK3ZvaWQgUmF3RGVjb2Rlcjo6cmVhZFJlY3QoY29uc3QgUmVjdCYgciwgQ01zZ0hhbmRsZXIqIGhhbmRsZXIpCit7CisgIGludCB4ID0gci50bC54OworICBpbnQgeSA9IHIudGwueTsKKyAgaW50IHcgPSByLndpZHRoKCk7CisgIGludCBoID0gci5oZWlnaHQoKTsKKyAgaW50IG5QaXhlbHM7CisgIHJkcjo6VTgqIGltYWdlQnVmID0gcmVhZGVyLT5nZXRJbWFnZUJ1Zih3LCB3KmgsICZuUGl4ZWxzKTsKKyAgaW50IGJ5dGVzUGVyUm93ID0gdyAqIChyZWFkZXItPmJwcCgpIC8gOCk7CisgIHdoaWxlIChoID4gMCkgeworICAgIGludCBuUm93cyA9IG5QaXhlbHMgLyB3OworICAgIGlmIChuUm93cyA+IGgpIG5Sb3dzID0gaDsKKyAgICByZWFkZXItPmdldEluU3RyZWFtKCktPnJlYWRCeXRlcyhpbWFnZUJ1ZiwgblJvd3MgKiBieXRlc1BlclJvdyk7CisgICAgaGFuZGxlci0+aW1hZ2VSZWN0KFJlY3QoeCwgeSwgeCt3LCB5K25Sb3dzKSwgaW1hZ2VCdWYpOworICAgIGggLT0gblJvd3M7CisgICAgeSArPSBuUm93czsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9SYXdEZWNvZGVyLmggYi9jb21tb24vcmZiL1Jhd0RlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmRiYjIyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9SYXdEZWNvZGVyLmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2lmbmRlZiBfX1JGQl9SQVdERUNPREVSX0hfXworI2RlZmluZSBfX1JGQl9SQVdERUNPREVSX0hfXworCisjaW5jbHVkZSA8cmZiL0RlY29kZXIuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgUmF3RGVjb2RlciA6IHB1YmxpYyBEZWNvZGVyIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBEZWNvZGVyKiBjcmVhdGUoQ01zZ1JlYWRlciogcmVhZGVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZFJlY3QoY29uc3QgUmVjdCYgciwgQ01zZ0hhbmRsZXIqIGhhbmRsZXIpOworICAgIHZpcnR1YWwgflJhd0RlY29kZXIoKTsKKyAgcHJpdmF0ZToKKyAgICBSYXdEZWNvZGVyKENNc2dSZWFkZXIqIHJlYWRlcik7CisgICAgQ01zZ1JlYWRlciogcmVhZGVyOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1Jhd0VuY29kZXIuY3h4IGIvY29tbW9uL3JmYi9SYXdFbmNvZGVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjU0NWI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9SYXdFbmNvZGVyLmN4eApAQCAtMCwwICsxLDU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8cmRyL091dFN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9JbWFnZUdldHRlci5oPgorI2luY2x1ZGUgPHJmYi9lbmNvZGluZ3MuaD4KKyNpbmNsdWRlIDxyZmIvU01zZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9SYXdFbmNvZGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK0VuY29kZXIqIFJhd0VuY29kZXI6OmNyZWF0ZShTTXNnV3JpdGVyKiB3cml0ZXIpCit7CisgIHJldHVybiBuZXcgUmF3RW5jb2Rlcih3cml0ZXIpOworfQorCitSYXdFbmNvZGVyOjpSYXdFbmNvZGVyKFNNc2dXcml0ZXIqIHdyaXRlcl8pIDogd3JpdGVyKHdyaXRlcl8pCit7Cit9CisKK1Jhd0VuY29kZXI6On5SYXdFbmNvZGVyKCkKK3sKK30KKworYm9vbCBSYXdFbmNvZGVyOjp3cml0ZVJlY3QoY29uc3QgUmVjdCYgciwgSW1hZ2VHZXR0ZXIqIGlnLCBSZWN0KiBhY3R1YWwpCit7CisgIGludCB4ID0gci50bC54OworICBpbnQgeSA9IHIudGwueTsKKyAgaW50IHcgPSByLndpZHRoKCk7CisgIGludCBoID0gci5oZWlnaHQoKTsKKyAgaW50IG5QaXhlbHM7CisgIHJkcjo6VTgqIGltYWdlQnVmID0gd3JpdGVyLT5nZXRJbWFnZUJ1Zih3LCB3KmgsICZuUGl4ZWxzKTsKKyAgaW50IGJ5dGVzUGVyUm93ID0gdyAqICh3cml0ZXItPmJwcCgpIC8gOCk7CisgIHdyaXRlci0+c3RhcnRSZWN0KHIsIGVuY29kaW5nUmF3KTsKKyAgd2hpbGUgKGggPiAwKSB7CisgICAgaW50IG5Sb3dzID0gblBpeGVscyAvIHc7CisgICAgaWYgKG5Sb3dzID4gaCkgblJvd3MgPSBoOworICAgIGlnLT5nZXRJbWFnZShpbWFnZUJ1ZiwgUmVjdCh4LCB5LCB4K3csIHkrblJvd3MpKTsKKyAgICB3cml0ZXItPmdldE91dFN0cmVhbSgpLT53cml0ZUJ5dGVzKGltYWdlQnVmLCBuUm93cyAqIGJ5dGVzUGVyUm93KTsKKyAgICBoIC09IG5Sb3dzOworICAgIHkgKz0gblJvd3M7CisgIH0KKyAgd3JpdGVyLT5lbmRSZWN0KCk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9SYXdFbmNvZGVyLmggYi9jb21tb24vcmZiL1Jhd0VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjlhZDkyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9SYXdFbmNvZGVyLmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2lmbmRlZiBfX1JGQl9SQVdFTkNPREVSX0hfXworI2RlZmluZSBfX1JGQl9SQVdFTkNPREVSX0hfXworCisjaW5jbHVkZSA8cmZiL0VuY29kZXIuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgUmF3RW5jb2RlciA6IHB1YmxpYyBFbmNvZGVyIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBFbmNvZGVyKiBjcmVhdGUoU01zZ1dyaXRlciogd3JpdGVyKTsKKyAgICB2aXJ0dWFsIGJvb2wgd3JpdGVSZWN0KGNvbnN0IFJlY3QmIHIsIEltYWdlR2V0dGVyKiBpZywgUmVjdCogYWN0dWFsKTsKKyAgICB2aXJ0dWFsIH5SYXdFbmNvZGVyKCk7CisgIHByaXZhdGU6CisgICAgUmF3RW5jb2RlcihTTXNnV3JpdGVyKiB3cml0ZXIpOworICAgIFNNc2dXcml0ZXIqIHdyaXRlcjsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9SZWN0LmggYi9jb21tb24vcmZiL1JlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmU5MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9SZWN0LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gcmZiOjpSZWN0IGFuZCByZmI6OlBvaW50IHN0cnVjdHVyZXMKKworI2lmbmRlZiBfX1JGQl9SRUNUX0lOQ0xVREVEX18KKyNkZWZpbmUgX19SRkJfUkVDVF9JTkNMVURFRF9fCisKKy8vIFNvbWUgcGxhdGZvcm1zIChlLmcuIFdpbmRvd3MpIGluY2x1ZGUgbWF4KCkgYW5kIG1pbigpIG1hY3JvcyBpbiB0aGVpcgorLy8gc3RhbmRhcmQgaGVhZGVycywgYnV0IHRoZXkgYXJlIGFsc28gc3RhbmRhcmQgQysrIHRlbXBsYXRlIGZ1bmN0aW9ucywgc28gc29tZQorLy8gQysrIGhlYWRlcnMgd2lsbCB1bmRlZmluZSB0aGVtLiAgU28gd2Ugc3RlZXIgY2xlYXIgb2YgdGhlIG5hbWVzIG1pbiBhbmQgbWF4CisvLyBhbmQgZGVmaW5lIF9fcmZibWluIGFuZCBfX3JmYm1heCBpbnN0ZWFkLgorCisjaWZuZGVmIF9fcmZibWF4CisjZGVmaW5lIF9fcmZibWF4KGEsYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIF9fcmZibWluCisjZGVmaW5lIF9fcmZibWluKGEsYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKK25hbWVzcGFjZSByZmIgeworCisgIC8vIHJmYjo6UG9pbnQKKyAgLy8KKyAgLy8gUmVwcmVzZW50cyBhIHBvaW50IGluIDJEIHNwYWNlLCBieSBYIGFuZCBZIGNvb3JkaW5hdGVzLgorICAvLyBDYW4gYWxzbyBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIGRlbHRhLCBvciBvZmZzZXQsIGJldHdlZW4KKyAgLy8gdHdvIFBvaW50cy4KKyAgLy8gRnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBhbGxvdyBQb2ludHMgdG8gYmUgY29tcGFyZWQgZm9yCisgIC8vIGVxdWFsaXR5IGFuZCB0cmFuc2xhdGVkIGJ5IGEgc3VwcGxpZWQgb2Zmc2V0LgorICAvLyBGdW5jdGlvbnMgYXJlIGFsc28gcHJvdmlkZWQgdG8gbmVnYXRlIG9mZnNldCBQb2ludHMuCisKKyAgc3RydWN0IFBvaW50IHsKKyAgICBQb2ludCgpIDogeCgwKSwgeSgwKSB7fQorICAgIFBvaW50KGludCB4XywgaW50IHlfKSA6IHgoeF8pLCB5KHlfKSB7fQorICAgIGlubGluZSBQb2ludCBuZWdhdGUoKSBjb25zdCB7cmV0dXJuIFBvaW50KC14LCAteSk7fQorICAgIGlubGluZSBib29sIGVxdWFscyhjb25zdCBQb2ludCAmcCkgY29uc3Qge3JldHVybiB4PT1wLnggJiYgeT09cC55O30KKyAgICBpbmxpbmUgUG9pbnQgdHJhbnNsYXRlKGNvbnN0IFBvaW50ICZwKSBjb25zdCB7cmV0dXJuIFBvaW50KHgrcC54LCB5K3AueSk7fQorICAgIGlubGluZSBQb2ludCBzdWJ0cmFjdChjb25zdCBQb2ludCAmcCkgY29uc3Qge3JldHVybiBQb2ludCh4LXAueCwgeS1wLnkpO30KKyAgICBpbnQgeCwgeTsKKyAgfTsKKworICAvLyByZmI6OlJlY3QKKyAgLy8KKyAgLy8gUmVwcmVzZW50cyBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBkZWZpbmVkIGJ5IGl0cyB0b3AtbGVmdCAodGwpCisgIC8vIGFuZCBib3R0b20tcmlnaHQgKGJyKSBQb2ludHMuCisgIC8vIFJlY3RzIG1heSBiZSBjb21wYXJlZCBmb3IgZXF1YWxpdHksIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgLy8gb3Igbm90IHRoZXkgYXJlIGVtcHR5LCBjbGVhcmVkIChtYWRlIGVtcHR5KSwgb3IgaW50ZXJzZWN0ZWQgd2l0aAorICAvLyBvbmUgYW5vdGhlci4gIFRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdHdvIGV4aXN0aW5nIFJlY3RzCisgIC8vIG1heSBiZSBjYWxjdWxhdGVkLCBhcyBtYXkgdGhlIGFyZWEgb2YgYSBSZWN0LgorICAvLyBSZWN0cyBtYXkgYWxzbyBiZSB0cmFuc2xhdGVkLCBpbiB0aGUgc2FtZSB3YXkgYXMgUG9pbnRzLCBieQorICAvLyBhbiBvZmZzZXQgc3BlY2lmaWVkIGluIGEgUG9pbnQgc3RydWN0dXJlLgorCisgIHN0cnVjdCBSZWN0IHsKKyAgICBSZWN0KCkge30KKyAgICBSZWN0KFBvaW50IHRsXywgUG9pbnQgYnJfKSA6IHRsKHRsXyksIGJyKGJyXykge30KKyAgICBSZWN0KGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgOiB0bCh4MSwgeTEpLCBicih4MiwgeTIpIHt9CisgICAgaW5saW5lIHZvaWQgc2V0WFlXSChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkgeworICAgICAgdGwueCA9IHg7IHRsLnkgPSB5OyBici54ID0geCt3OyBici55ID0geStoOworICAgIH0KKyAgICBpbmxpbmUgUmVjdCBpbnRlcnNlY3QoY29uc3QgUmVjdCAmcikgY29uc3QgeworICAgICAgUmVjdCByZXN1bHQ7CisgICAgICByZXN1bHQudGwueCA9IF9fcmZibWF4KHRsLngsIHIudGwueCk7CisgICAgICByZXN1bHQudGwueSA9IF9fcmZibWF4KHRsLnksIHIudGwueSk7CisgICAgICByZXN1bHQuYnIueCA9IF9fcmZibWF4KF9fcmZibWluKGJyLngsIHIuYnIueCksIHJlc3VsdC50bC54KTsKKyAgICAgIHJlc3VsdC5ici55ID0gX19yZmJtYXgoX19yZmJtaW4oYnIueSwgci5ici55KSwgcmVzdWx0LnRsLnkpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgaW5saW5lIFJlY3QgdW5pb25fYm91bmRhcnkoY29uc3QgUmVjdCAmcikgY29uc3QgeworICAgICAgaWYgKHIuaXNfZW1wdHkoKSkgcmV0dXJuICp0aGlzOworICAgICAgaWYgKGlzX2VtcHR5KCkpIHJldHVybiByOworICAgICAgUmVjdCByZXN1bHQ7CisgICAgICByZXN1bHQudGwueCA9IF9fcmZibWluKHRsLngsIHIudGwueCk7CisgICAgICByZXN1bHQudGwueSA9IF9fcmZibWluKHRsLnksIHIudGwueSk7CisgICAgICByZXN1bHQuYnIueCA9IF9fcmZibWF4KGJyLngsIHIuYnIueCk7CisgICAgICByZXN1bHQuYnIueSA9IF9fcmZibWF4KGJyLnksIHIuYnIueSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBpbmxpbmUgUmVjdCB0cmFuc2xhdGUoY29uc3QgUG9pbnQgJnApIGNvbnN0IHsKKyAgICAgIHJldHVybiBSZWN0KHRsLnRyYW5zbGF0ZShwKSwgYnIudHJhbnNsYXRlKHApKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgZXF1YWxzKGNvbnN0IFJlY3QgJnIpIGNvbnN0IHtyZXR1cm4gci50bC5lcXVhbHModGwpICYmIHIuYnIuZXF1YWxzKGJyKTt9CisgICAgaW5saW5lIGJvb2wgaXNfZW1wdHkoKSBjb25zdCB7cmV0dXJuICh0bC54ID49IGJyLngpIHx8ICh0bC55ID49IGJyLnkpO30KKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHt0bCA9IFBvaW50KCk7IGJyID0gUG9pbnQoKTt9CisgICAgaW5saW5lIGJvb2wgZW5jbG9zZWRfYnkoY29uc3QgUmVjdCAmcikgY29uc3QgeworICAgICAgcmV0dXJuICh0bC54Pj1yLnRsLngpICYmICh0bC55Pj1yLnRsLnkpICYmIChici54PD1yLmJyLngpICYmIChici55PD1yLmJyLnkpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvdmVybGFwcyhjb25zdCBSZWN0ICZyKSBjb25zdCB7CisgICAgICByZXR1cm4gdGwueCA8IHIuYnIueCAmJiB0bC55IDwgci5ici55ICYmIGJyLnggPiByLnRsLnggJiYgYnIueSA+IHIudGwueTsKKyAgICB9CisgICAgaW5saW5lIHVuc2lnbmVkIGludCBhcmVhKCkgY29uc3Qge3JldHVybiBpc19lbXB0eSgpID8gMCA6IChici54LXRsLngpKihici55LXRsLnkpO30KKyAgICBpbmxpbmUgUG9pbnQgZGltZW5zaW9ucygpIGNvbnN0IHtyZXR1cm4gUG9pbnQod2lkdGgoKSwgaGVpZ2h0KCkpO30KKyAgICBpbmxpbmUgaW50IHdpZHRoKCkgY29uc3Qge3JldHVybiBici54LXRsLng7fQorICAgIGlubGluZSBpbnQgaGVpZ2h0KCkgY29uc3Qge3JldHVybiBici55LXRsLnk7fQorICAgIGlubGluZSBib29sIGNvbnRhaW5zKGNvbnN0IFBvaW50ICZwKSBjb25zdCB7CisgICAgICByZXR1cm4gKHRsLng8PXAueCkgJiYgKHRsLnk8PXAueSkgJiYgKGJyLng+cC54KSAmJiAoYnIueT5wLnkpOworICAgIH0KKyAgICBQb2ludCB0bDsKKyAgICBQb2ludCBicjsKKyAgfTsKK30KKyNlbmRpZiAvLyBfX1JGQl9SRUNUX0lOQ0xVREVEX18KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvUmVnaW9uLmN4eCBiL2NvbW1vbi9yZmIvUmVnaW9uLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTY1YTZjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9SZWdpb24uY3h4CkBAIC0wLDAgKzEsMjQ4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIENyb3NzLXBsYXRmb3JtIFJlZ2lvbiBjbGFzcyBiYXNlZCBvbiB0aGUgWDExIHJlZ2lvbiBpbXBsZW1lbnRhdGlvbi4gIE5vdGUKKy8vIHRoYXQgZm9yIGVmZmljaWVuY3kgdGhpcyBjb2RlIG1hbmlwdWxhdGVzIHRoZSBYbGliIHJlZ2lvbiBzdHJ1Y3R1cmUKKy8vIGRpcmVjdGx5LiAgQXBhcnQgZnJvbSB0aGUgbGF5b3V0IG9mIHRoZSBzdHJ1Y3R1cmUsIHRoZXJlIGlzIG9uZSBvdGhlciBrZXkKKy8vIGFzc3VtcHRpb24gbWFkZTogYSBSZWdpb24gcmV0dXJuZWQgZnJvbSBYQ3JlYXRlUmVnaW9uIG11c3QgYWx3YXlzIGhhdmUgaXRzCisvLyByZWN0cyBtZW1iZXIgYWxsb2NhdGVkIHNvIHRoYXQgdGhlcmUgaXMgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSByZWN0YW5nbGUuCisvLworCisjaW5jbHVkZSA8cmZiL1JlZ2lvbi5oPgorI2luY2x1ZGUgPFhyZWdpb24vWHJlZ2lvbi5oPgorI2luY2x1ZGUgPFhyZWdpb24vcmVnaW9uLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8gQSBfUmVjdFJlZ2lvbiBtdXN0IG5ldmVyIGJlIHBhc3NlZCBhcyBhIHJldHVybiBwYXJhbWV0ZXIgdG8gdGhlIFhsaWIgcmVnaW9uCisvLyBvcGVyYXRpb25zLiAgVGhpcyBpcyBiZWNhdXNlIGZvciBlZmZpY2llbmN5IGl0cyAicmVjdHMiIG1lbWJlciBoYXMgbm90IGJlZW4KKy8vIGFsbG9jYXRlZCB3aXRoIFhtYWxsb2MuICBJdCBpcyBob3dldmVyIHNhZmUgdG8gcGFzcyBpdCBhcyBhbiBpbnB1dAorLy8gcGFyYW1ldGVyLgorCitjbGFzcyBfUmVjdFJlZ2lvbiB7CitwdWJsaWM6CisgIF9SZWN0UmVnaW9uKGNvbnN0IHJmYjo6UmVjdCYgcikgeworICAgIHJlZ2lvbi5yZWN0cyA9ICZyZWdpb24uZXh0ZW50czsKKyAgICByZWdpb24ubnVtUmVjdHMgPSAxOworICAgIHJlZ2lvbi5leHRlbnRzLngxID0gci50bC54OworICAgIHJlZ2lvbi5leHRlbnRzLnkxID0gci50bC55OworICAgIHJlZ2lvbi5leHRlbnRzLngyID0gci5ici54OworICAgIHJlZ2lvbi5leHRlbnRzLnkyID0gci5ici55OworICAgIHJlZ2lvbi5zaXplID0gMTsKKyAgICBpZiAoci5pc19lbXB0eSgpKQorICAgICAgcmVnaW9uLm51bVJlY3RzID0gMDsKKyAgfQorICBSRUdJT04gcmVnaW9uOworfTsKKworCityZmI6OlJlZ2lvbjo6UmVnaW9uKCkgeworICB4cmduID0gWENyZWF0ZVJlZ2lvbigpOworICBhc3NlcnQoeHJnbik7Cit9CisKK3JmYjo6UmVnaW9uOjpSZWdpb24oY29uc3QgUmVjdCYgcikgeworICB4cmduID0gWENyZWF0ZVJlZ2lvbigpOworICBhc3NlcnQoeHJnbik7CisgIHJlc2V0KHIpOworfQorCityZmI6OlJlZ2lvbjo6UmVnaW9uKGNvbnN0IHJmYjo6UmVnaW9uJiByKSB7CisgIHhyZ24gPSBYQ3JlYXRlUmVnaW9uKCk7CisgIGFzc2VydCh4cmduKTsKKyAgWFVuaW9uUmVnaW9uKHhyZ24sIHIueHJnbiwgeHJnbik7Cit9CisKK3JmYjo6UmVnaW9uOjp+UmVnaW9uKCkgeworICBYRGVzdHJveVJlZ2lvbih4cmduKTsKK30KKworcmZiOjpSZWdpb24mIHJmYjo6UmVnaW9uOjpvcGVyYXRvcj0oY29uc3QgcmZiOjpSZWdpb24mIHIpIHsKKyAgY2xlYXIoKTsKKyAgWFVuaW9uUmVnaW9uKHhyZ24sIHIueHJnbiwgeHJnbik7CisgIHJldHVybiAqdGhpczsKK30KKwordm9pZCByZmI6OlJlZ2lvbjo6Y2xlYXIoKSB7CisgIHhyZ24tPm51bVJlY3RzID0gMDsKKyAgeHJnbi0+ZXh0ZW50cy54MSA9IDA7CisgIHhyZ24tPmV4dGVudHMueTEgPSAwOworICB4cmduLT5leHRlbnRzLngyID0gMDsKKyAgeHJnbi0+ZXh0ZW50cy55MiA9IDA7Cit9CisKK3ZvaWQgcmZiOjpSZWdpb246OnJlc2V0KGNvbnN0IFJlY3QmIHIpIHsKKyAgaWYgKHIuaXNfZW1wdHkoKSkgeworICAgIGNsZWFyKCk7CisgIH0gZWxzZSB7CisgICAgeHJnbi0+bnVtUmVjdHMgPSAxOworICAgIHhyZ24tPnJlY3RzWzBdLngxID0geHJnbi0+ZXh0ZW50cy54MSA9IHIudGwueDsKKyAgICB4cmduLT5yZWN0c1swXS55MSA9IHhyZ24tPmV4dGVudHMueTEgPSByLnRsLnk7CisgICAgeHJnbi0+cmVjdHNbMF0ueDIgPSB4cmduLT5leHRlbnRzLngyID0gci5ici54OworICAgIHhyZ24tPnJlY3RzWzBdLnkyID0geHJnbi0+ZXh0ZW50cy55MiA9IHIuYnIueTsKKyAgfQorfQorCit2b2lkIHJmYjo6UmVnaW9uOjp0cmFuc2xhdGUoY29uc3QgUG9pbnQmIGRlbHRhKSB7CisgIFhPZmZzZXRSZWdpb24oeHJnbiwgZGVsdGEueCwgZGVsdGEueSk7Cit9CisKK3ZvaWQgcmZiOjpSZWdpb246OnNldE9yZGVyZWRSZWN0cyhjb25zdCBzdGQ6OnZlY3RvcjxSZWN0PiYgcmVjdHMpIHsKKyAgY2xlYXIoKTsKKyAgc3RkOjp2ZWN0b3I8UmVjdD46OmNvbnN0X2l0ZXJhdG9yIGk7CisgIGZvciAoaT1yZWN0cy5iZWdpbigpOyBpICE9IHJlY3RzLmVuZCgpOyBpKyspIHsKKyAgICBfUmVjdFJlZ2lvbiBycigqaSk7CisgICAgWFVuaW9uUmVnaW9uKHhyZ24sICZyci5yZWdpb24sIHhyZ24pOworICB9Cit9CisKK3ZvaWQgcmZiOjpSZWdpb246OnNldEV4dGVudHNBbmRPcmRlcmVkUmVjdHMoY29uc3QgU2hvcnRSZWN0KiBleHRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblJlY3RzLCBjb25zdCBTaG9ydFJlY3QqIHJlY3RzKQoreworICBpZiAoeHJnbi0+c2l6ZSA8IG5SZWN0cykKKyAgeworICAgIEJPWCogcHJldlJlY3RzID0geHJnbi0+cmVjdHM7CisgICAgeHJnbi0+cmVjdHMgPSAoQk9YKilYcmVhbGxvYygoY2hhciopeHJnbi0+cmVjdHMsIG5SZWN0cyAqIHNpemVvZihCT1gpKTsKKyAgICBpZiAoIXhyZ24tPnJlY3RzKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwiWHJlYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgIFhmcmVlKHByZXZSZWN0cyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHhyZ24tPnNpemUgPSBuUmVjdHM7CisgIH0KKworICB4cmduLT5udW1SZWN0cyA9IG5SZWN0czsKKyAgeHJnbi0+ZXh0ZW50cy54MSA9IGV4dGVudHMtPngxOworICB4cmduLT5leHRlbnRzLnkxID0gZXh0ZW50cy0+eTE7CisgIHhyZ24tPmV4dGVudHMueDIgPSBleHRlbnRzLT54MjsKKyAgeHJnbi0+ZXh0ZW50cy55MiA9IGV4dGVudHMtPnkyOworICBmb3IgKGludCBpID0gMDsgaSA8IG5SZWN0czsgaSsrKSB7CisgICAgeHJnbi0+cmVjdHNbaV0ueDEgPSByZWN0c1tpXS54MTsKKyAgICB4cmduLT5yZWN0c1tpXS55MSA9IHJlY3RzW2ldLnkxOworICAgIHhyZ24tPnJlY3RzW2ldLngyID0gcmVjdHNbaV0ueDI7CisgICAgeHJnbi0+cmVjdHNbaV0ueTIgPSByZWN0c1tpXS55MjsKKyAgfQorfQorCit2b2lkIHJmYjo6UmVnaW9uOjpjb3B5RnJvbShjb25zdCByZmI6OlJlZ2lvbiYgcikgeworICBYVW5pb25SZWdpb24oci54cmduLCByLnhyZ24sIHhyZ24pOworfQorCit2b2lkIHJmYjo6UmVnaW9uOjphc3NpZ25faW50ZXJzZWN0KGNvbnN0IHJmYjo6UmVnaW9uJiByKSB7CisgIFhJbnRlcnNlY3RSZWdpb24oeHJnbiwgci54cmduLCB4cmduKTsKK30KKwordm9pZCByZmI6OlJlZ2lvbjo6YXNzaWduX3VuaW9uKGNvbnN0IHJmYjo6UmVnaW9uJiByKSB7CisgIFhVbmlvblJlZ2lvbih4cmduLCByLnhyZ24sIHhyZ24pOworfQorCit2b2lkIHJmYjo6UmVnaW9uOjphc3NpZ25fc3VidHJhY3QoY29uc3QgcmZiOjpSZWdpb24mIHIpIHsKKyAgWFN1YnRyYWN0UmVnaW9uKHhyZ24sIHIueHJnbiwgeHJnbik7Cit9CisKK3JmYjo6UmVnaW9uIHJmYjo6UmVnaW9uOjppbnRlcnNlY3QoY29uc3QgcmZiOjpSZWdpb24mIHIpIGNvbnN0IHsKKyAgcmZiOjpSZWdpb24gcmV0OworICBYSW50ZXJzZWN0UmVnaW9uKHhyZ24sIHIueHJnbiwgcmV0LnhyZ24pOworICByZXR1cm4gcmV0OworfQorCityZmI6OlJlZ2lvbiByZmI6OlJlZ2lvbjo6dW5pb25fKGNvbnN0IHJmYjo6UmVnaW9uJiByKSBjb25zdCB7CisgIHJmYjo6UmVnaW9uIHJldDsKKyAgWFVuaW9uUmVnaW9uKHhyZ24sIHIueHJnbiwgcmV0LnhyZ24pOworICByZXR1cm4gcmV0OworfQorCityZmI6OlJlZ2lvbiByZmI6OlJlZ2lvbjo6c3VidHJhY3QoY29uc3QgcmZiOjpSZWdpb24mIHIpIGNvbnN0IHsKKyAgcmZiOjpSZWdpb24gcmV0OworICBYU3VidHJhY3RSZWdpb24oeHJnbiwgci54cmduLCByZXQueHJnbik7CisgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgcmZiOjpSZWdpb246OmVxdWFscyhjb25zdCByZmI6OlJlZ2lvbiYgcikgY29uc3QgeworICByZXR1cm4gWEVxdWFsUmVnaW9uKHhyZ24sIHIueHJnbik7Cit9CisKK2ludCByZmI6OlJlZ2lvbjo6bnVtUmVjdHMoKSBjb25zdCB7CisgIHJldHVybiB4cmduLT5udW1SZWN0czsKK30KKworYm9vbCByZmI6OlJlZ2lvbjo6Z2V0X3JlY3RzKHN0ZDo6dmVjdG9yPFJlY3Q+KiByZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxlZnQycmlnaHQsIGJvb2wgdG9wZG93biwgaW50IG1heEFyZWEpIGNvbnN0Cit7CisgIGludCBuUmVjdHMgPSB4cmduLT5udW1SZWN0czsKKyAgaW50IHhJbmMgPSBsZWZ0MnJpZ2h0ID8gMSA6IC0xOworICBpbnQgeUluYyA9IHRvcGRvd24gPyAxIDogLTE7CisgIGludCBpID0gdG9wZG93biA/IDAgOiBuUmVjdHMtMTsKKyAgcmVjdHMtPmNsZWFyKCk7CisgIHJlY3RzLT5yZXNlcnZlKG5SZWN0cyk7CisKKyAgd2hpbGUgKG5SZWN0cyA+IDApIHsKKyAgICBpbnQgZmlyc3RJbk5leHRCYW5kID0gaTsKKyAgICBpbnQgblJlY3RzSW5CYW5kID0gMDsKKworICAgIHdoaWxlIChuUmVjdHMgPiAwICYmIHhyZ24tPnJlY3RzW2ZpcnN0SW5OZXh0QmFuZF0ueTEgPT0geHJnbi0+cmVjdHNbaV0ueTEpCisgICAgeworICAgICAgZmlyc3RJbk5leHRCYW5kICs9IHlJbmM7CisgICAgICBuUmVjdHMtLTsKKyAgICAgIG5SZWN0c0luQmFuZCsrOworICAgIH0KKworICAgIGlmICh4SW5jICE9IHlJbmMpCisgICAgICBpID0gZmlyc3RJbk5leHRCYW5kIC0geUluYzsKKworICAgIHdoaWxlIChuUmVjdHNJbkJhbmQgPiAwKSB7CisgICAgICBpbnQgeSA9IHhyZ24tPnJlY3RzW2ldLnkxOworICAgICAgaW50IGggPSBtYXhBcmVhIC8gKHhyZ24tPnJlY3RzW2ldLngyIC0geHJnbi0+cmVjdHNbaV0ueDEpOworICAgICAgaWYgKCFoKSBoID0geHJnbi0+cmVjdHNbaV0ueTIgLSB5OworICAgICAgZG8geworICAgICAgICBpZiAoaCA+IHhyZ24tPnJlY3RzW2ldLnkyIC0geSkKKyAgICAgICAgICBoID0geHJnbi0+cmVjdHNbaV0ueTIgLSB5OworICAgICAgICBSZWN0IHIoeHJnbi0+cmVjdHNbaV0ueDEsIHksIHhyZ24tPnJlY3RzW2ldLngyLCB5K2gpOworICAgICAgICByZWN0cy0+cHVzaF9iYWNrKHIpOworICAgICAgICB5ICs9IGg7CisgICAgICB9IHdoaWxlICh5IDwgeHJnbi0+cmVjdHNbaV0ueTIpOworICAgICAgaSArPSB4SW5jOworICAgICAgblJlY3RzSW5CYW5kLS07CisgICAgfQorCisgICAgaSA9IGZpcnN0SW5OZXh0QmFuZDsKKyAgfQorCisgIHJldHVybiAhcmVjdHMtPmVtcHR5KCk7Cit9CisKK3JmYjo6UmVjdCByZmI6OlJlZ2lvbjo6Z2V0X2JvdW5kaW5nX3JlY3QoKSBjb25zdCB7CisgIHJldHVybiBSZWN0KHhyZ24tPmV4dGVudHMueDEsIHhyZ24tPmV4dGVudHMueTEsCisgICAgICAgICAgICAgIHhyZ24tPmV4dGVudHMueDIsIHhyZ24tPmV4dGVudHMueTIpOworfQorCisKK3ZvaWQgcmZiOjpSZWdpb246OmRlYnVnX3ByaW50KGNvbnN0IGNoYXIqIHByZWZpeCkgY29uc3QKK3sKKyAgZnByaW50ZihzdGRlcnIsIiVzIG51bSByZWN0cyAlM2xkIGV4dGVudHMgJTNkLCUzZCAlM2R4JTNkXG4iLAorICAgICAgICAgIHByZWZpeCwgeHJnbi0+bnVtUmVjdHMsIHhyZ24tPmV4dGVudHMueDEsIHhyZ24tPmV4dGVudHMueTEsCisgICAgICAgICAgeHJnbi0+ZXh0ZW50cy54Mi14cmduLT5leHRlbnRzLngxLAorICAgICAgICAgIHhyZ24tPmV4dGVudHMueTIteHJnbi0+ZXh0ZW50cy55MSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB4cmduLT5udW1SZWN0czsgaSsrKSB7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICByZWN0ICUzZCwlM2QgJTNkeCUzZFxuIiwKKyAgICAgICAgICAgIHhyZ24tPnJlY3RzW2ldLngxLCB4cmduLT5yZWN0c1tpXS55MSwKKyAgICAgICAgICAgIHhyZ24tPnJlY3RzW2ldLngyLXhyZ24tPnJlY3RzW2ldLngxLAorICAgICAgICAgICAgeHJnbi0+cmVjdHNbaV0ueTIteHJnbi0+cmVjdHNbaV0ueTEpOworICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1JlZ2lvbi5oIGIvY29tbW9uL3JmYi9SZWdpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzM3NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9SZWdpb24uaApAQCAtMCwwICsxLDg0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIENyb3NzLXBsYXRmb3JtIFJlZ2lvbiBjbGFzcyBiYXNlZCBvbiB0aGUgWDExIHJlZ2lvbiBpbXBsZW1lbnRhdGlvbgorCisjaWZuZGVmIF9fUkZCX1JFR0lPTl9JTkNMVURFRF9fCisjZGVmaW5lIF9fUkZCX1JFR0lPTl9JTkNMVURFRF9fCisKKyNpbmNsdWRlIDxyZmIvUmVjdC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworc3RydWN0IF9YUmVnaW9uOworCituYW1lc3BhY2UgcmZiIHsKKworICBzdHJ1Y3QgU2hvcnRSZWN0IHsKKyAgICBzaG9ydCB4MSwgeTEsIHgyLCB5MjsKKyAgfTsKKworICBjbGFzcyBSZWdpb24geworICBwdWJsaWM6CisgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IHJlZ2lvbgorICAgIFJlZ2lvbigpOworICAgIC8vIENyZWF0ZSBhIHJlY3Rhbmd1bGFyIHJlZ2lvbgorICAgIFJlZ2lvbihjb25zdCBSZWN0JiByKTsKKworICAgIFJlZ2lvbihjb25zdCBSZWdpb24mIHIpOworICAgIFJlZ2lvbiAmb3BlcmF0b3I9KGNvbnN0IFJlZ2lvbiYgc3JjKTsKKworICAgIH5SZWdpb24oKTsKKworICAgIC8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhbHRlciB0aGUgcmVnaW9uIGluIHBsYWNlOgorCisgICAgdm9pZCBjbGVhcigpOworICAgIHZvaWQgcmVzZXQoY29uc3QgUmVjdCYgcik7CisgICAgdm9pZCB0cmFuc2xhdGUoY29uc3QgcmZiOjpQb2ludCYgZGVsdGEpOworICAgIHZvaWQgc2V0T3JkZXJlZFJlY3RzKGNvbnN0IHN0ZDo6dmVjdG9yPFJlY3Q+JiByZWN0cyk7CisgICAgdm9pZCBzZXRFeHRlbnRzQW5kT3JkZXJlZFJlY3RzKGNvbnN0IFNob3J0UmVjdCogZXh0ZW50cywgaW50IG5SZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2hvcnRSZWN0KiByZWN0cyk7CisgICAgdm9pZCBjb3B5RnJvbShjb25zdCBSZWdpb24mIHIpOworCisgICAgdm9pZCBhc3NpZ25faW50ZXJzZWN0KGNvbnN0IFJlZ2lvbiYgcik7CisgICAgdm9pZCBhc3NpZ25fdW5pb24oY29uc3QgUmVnaW9uJiByKTsKKyAgICB2b2lkIGFzc2lnbl9zdWJ0cmFjdChjb25zdCBSZWdpb24mIHIpOworCisgICAgLy8gdGhlIGZvbGxvd2luZyB0aHJlZSBvcGVyYXRpb25zIHJldHVybiBhIG5ldyByZWdpb246CisKKyAgICBSZWdpb24gaW50ZXJzZWN0KGNvbnN0IFJlZ2lvbiYgcikgY29uc3Q7CisgICAgUmVnaW9uIHVuaW9uXyhjb25zdCBSZWdpb24mIHIpIGNvbnN0OworICAgIFJlZ2lvbiBzdWJ0cmFjdChjb25zdCBSZWdpb24mIHIpIGNvbnN0OworCisgICAgYm9vbCBlcXVhbHMoY29uc3QgUmVnaW9uJiBiKSBjb25zdDsKKyAgICBpbnQgbnVtUmVjdHMoKSBjb25zdDsKKyAgICBib29sIGlzX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gbnVtUmVjdHMoKSA9PSAwOyB9CisKKyAgICBib29sIGdldF9yZWN0cyhzdGQ6OnZlY3RvcjxSZWN0PiogcmVjdHMsIGJvb2wgbGVmdDJyaWdodD10cnVlLAorICAgICAgICAgICAgICAgICAgIGJvb2wgdG9wZG93bj10cnVlLCBpbnQgbWF4QXJlYT0wKSBjb25zdDsKKyAgICBSZWN0IGdldF9ib3VuZGluZ19yZWN0KCkgY29uc3Q7CisKKyAgICB2b2lkIGRlYnVnX3ByaW50KGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisKKyAgcHJvdGVjdGVkOgorCisgICAgc3RydWN0IF9YUmVnaW9uKiB4cmduOworICB9OworCit9OworCisjZW5kaWYgLy8gX19SRkJfUkVHSU9OX0lOQ0xVREVEX18KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU0Nvbm5lY3Rpb24uY3h4IGIvY29tbW9uL3JmYi9TQ29ubmVjdGlvbi5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyMmI1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvU0Nvbm5lY3Rpb24uY3h4CkBAIC0wLDAgKzEsMzIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxyZmIvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8cmZiL3NlY1R5cGVzLmg+CisjaW5jbHVkZSA8cmZiL1NNc2dSZWFkZXJWMy5oPgorI2luY2x1ZGUgPHJmYi9TTXNnV3JpdGVyVjMuaD4KKyNpbmNsdWRlIDxyZmIvU0Nvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxyZmIvU2VydmVyQ29yZS5oPgorCisjaW5jbHVkZSA8cmZiL0xvZ1dyaXRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitzdGF0aWMgTG9nV3JpdGVyIHZsb2coIlNDb25uZWN0aW9uIik7CisKKy8vIEFjY2Vzc1JpZ2h0cyB2YWx1ZXMKK2NvbnN0IFNDb25uZWN0aW9uOjpBY2Nlc3NSaWdodHMgU0Nvbm5lY3Rpb246OkFjY2Vzc1ZpZXcgICAgICAgPSAweDAwMDE7Citjb25zdCBTQ29ubmVjdGlvbjo6QWNjZXNzUmlnaHRzIFNDb25uZWN0aW9uOjpBY2Nlc3NLZXlFdmVudHMgID0gMHgwMDAyOworY29uc3QgU0Nvbm5lY3Rpb246OkFjY2Vzc1JpZ2h0cyBTQ29ubmVjdGlvbjo6QWNjZXNzUHRyRXZlbnRzICA9IDB4MDAwNDsKK2NvbnN0IFNDb25uZWN0aW9uOjpBY2Nlc3NSaWdodHMgU0Nvbm5lY3Rpb246OkFjY2Vzc0N1dFRleHQgICAgPSAweDAwMDg7Citjb25zdCBTQ29ubmVjdGlvbjo6QWNjZXNzUmlnaHRzIFNDb25uZWN0aW9uOjpBY2Nlc3NEZWZhdWx0ICAgID0gMHgwM2ZmOworY29uc3QgU0Nvbm5lY3Rpb246OkFjY2Vzc1JpZ2h0cyBTQ29ubmVjdGlvbjo6QWNjZXNzTm9RdWVyeSAgICA9IDB4MDQwMDsKK2NvbnN0IFNDb25uZWN0aW9uOjpBY2Nlc3NSaWdodHMgU0Nvbm5lY3Rpb246OkFjY2Vzc0Z1bGwgICAgICAgPSAweGZmZmY7CisKKworU0Nvbm5lY3Rpb246OlNDb25uZWN0aW9uKFNTZWN1cml0eUZhY3RvcnkqIHNlY0ZhY3QsIGJvb2wgcmV2ZXJzZUNvbm5lY3Rpb25fKQorICA6IHJlYWR5Rm9yU2V0Q29sb3VyTWFwRW50cmllcyhmYWxzZSksCisgICAgaXMoMCksIG9zKDApLCByZWFkZXJfKDApLCB3cml0ZXJfKDApLAorICAgIHNlY3VyaXR5KDApLCBzZWN1cml0eUZhY3Rvcnkoc2VjRmFjdCksIHN0YXRlXyhSRkJTVEFURV9VTklOSVRJQUxJU0VEKSwKKyAgICByZXZlcnNlQ29ubmVjdGlvbihyZXZlcnNlQ29ubmVjdGlvbl8pCit7CisgIGRlZmF1bHRNYWpvclZlcnNpb24gPSAzOworICBkZWZhdWx0TWlub3JWZXJzaW9uID0gODsKKyAgaWYgKHJmYjo6U2VydmVyOjpwcm90b2NvbDNfMykKKyAgICBkZWZhdWx0TWlub3JWZXJzaW9uID0gMzsKKworICBjcC5zZXRWZXJzaW9uKGRlZmF1bHRNYWpvclZlcnNpb24sIGRlZmF1bHRNaW5vclZlcnNpb24pOworfQorCitTQ29ubmVjdGlvbjo6flNDb25uZWN0aW9uKCkKK3sKKyAgaWYgKHNlY3VyaXR5KSBzZWN1cml0eS0+ZGVzdHJveSgpOworICBkZWxldGVSZWFkZXJBbmRXcml0ZXIoKTsKK30KKwordm9pZCBTQ29ubmVjdGlvbjo6ZGVsZXRlUmVhZGVyQW5kV3JpdGVyKCkKK3sKKyAgZGVsZXRlIHJlYWRlcl87CisgIHJlYWRlcl8gPSAwOworICBkZWxldGUgd3JpdGVyXzsKKyAgd3JpdGVyXyA9IDA7Cit9CisKK3ZvaWQgU0Nvbm5lY3Rpb246OnNldFN0cmVhbXMocmRyOjpJblN0cmVhbSogaXNfLCByZHI6Ok91dFN0cmVhbSogb3NfKQoreworICBpcyA9IGlzXzsKKyAgb3MgPSBvc187Cit9CisKK3ZvaWQgU0Nvbm5lY3Rpb246OmluaXRpYWxpc2VQcm90b2NvbCgpCit7CisgIGNwLndyaXRlVmVyc2lvbihvcyk7CisgIHN0YXRlXyA9IFJGQlNUQVRFX1BST1RPQ09MX1ZFUlNJT047Cit9CisKK3ZvaWQgU0Nvbm5lY3Rpb246OnByb2Nlc3NNc2coKQoreworICBzd2l0Y2ggKHN0YXRlXykgeworICBjYXNlIFJGQlNUQVRFX1BST1RPQ09MX1ZFUlNJT046IHByb2Nlc3NWZXJzaW9uTXNnKCk7ICAgICAgYnJlYWs7CisgIGNhc2UgUkZCU1RBVEVfU0VDVVJJVFlfVFlQRTogICAgcHJvY2Vzc1NlY3VyaXR5VHlwZU1zZygpOyBicmVhazsKKyAgY2FzZSBSRkJTVEFURV9TRUNVUklUWTogICAgICAgICBwcm9jZXNzU2VjdXJpdHlNc2coKTsgICAgIGJyZWFrOworICBjYXNlIFJGQlNUQVRFX0lOSVRJQUxJU0FUSU9OOiAgIHByb2Nlc3NJbml0TXNnKCk7ICAgICAgICAgYnJlYWs7CisgIGNhc2UgUkZCU1RBVEVfTk9STUFMOiAgICAgICAgICAgcmVhZGVyXy0+cmVhZE1zZygpOyAgICAgICBicmVhazsKKyAgY2FzZSBSRkJTVEFURV9RVUVSWUlORzoKKyAgICB0aHJvdyBFeGNlcHRpb24oIlNDb25uZWN0aW9uOjpwcm9jZXNzTXNnOiBib2d1cyBkYXRhIGZyb20gY2xpZW50IHdoaWxlICIKKyAgICAgICAgICAgICAgICAgICAgInF1ZXJ5aW5nIik7CisgIGNhc2UgUkZCU1RBVEVfVU5JTklUSUFMSVNFRDoKKyAgICB0aHJvdyBFeGNlcHRpb24oIlNDb25uZWN0aW9uOjpwcm9jZXNzTXNnOiBub3QgaW5pdGlhbGlzZWQgeWV0PyIpOworICBkZWZhdWx0OgorICAgIHRocm93IEV4Y2VwdGlvbigiU0Nvbm5lY3Rpb246OnByb2Nlc3NNc2c6IGludmFsaWQgc3RhdGUiKTsKKyAgfQorfQorCit2b2lkIFNDb25uZWN0aW9uOjpwcm9jZXNzVmVyc2lvbk1zZygpCit7CisgIHZsb2cuZGVidWcoInJlYWRpbmcgcHJvdG9jb2wgdmVyc2lvbiIpOworICBib29sIGRvbmU7CisgIGlmICghY3AucmVhZFZlcnNpb24oaXMsICZkb25lKSkgeworICAgIHN0YXRlXyA9IFJGQlNUQVRFX0lOVkFMSUQ7CisgICAgdGhyb3cgRXhjZXB0aW9uKCJyZWFkaW5nIHZlcnNpb24gZmFpbGVkOiBub3QgYW4gUkZCIGNsaWVudD8iKTsKKyAgfQorICBpZiAoIWRvbmUpIHJldHVybjsKKworICB2bG9nLmluZm8oIkNsaWVudCBuZWVkcyBwcm90b2NvbCB2ZXJzaW9uICVkLiVkIiwKKyAgICAgICAgICAgIGNwLm1ham9yVmVyc2lvbiwgY3AubWlub3JWZXJzaW9uKTsKKworICBpZiAoY3AubWFqb3JWZXJzaW9uICE9IDMpIHsKKyAgICAvLyB1bmtub3duIHByb3RvY29sIHZlcnNpb24KKyAgICBjaGFyIG1zZ1syNTZdOworICAgIHNwcmludGYobXNnLCJFcnJvcjogY2xpZW50IG5lZWRzIHByb3RvY29sIHZlcnNpb24gJWQuJWQsIHNlcnZlciBoYXMgJWQuJWQiLAorICAgICAgICAgICAgY3AubWFqb3JWZXJzaW9uLCBjcC5taW5vclZlcnNpb24sCisgICAgICAgICAgICBkZWZhdWx0TWFqb3JWZXJzaW9uLCBkZWZhdWx0TWlub3JWZXJzaW9uKTsKKyAgICB0aHJvd0Nvbm5GYWlsZWRFeGNlcHRpb24obXNnKTsKKyAgfQorCisgIGlmIChjcC5taW5vclZlcnNpb24gIT0gMyAmJiBjcC5taW5vclZlcnNpb24gIT0gNyAmJiBjcC5taW5vclZlcnNpb24gIT0gOCkgeworICAgIHZsb2cuZXJyb3IoIkNsaWVudCB1c2VzIHVub2ZmaWNpYWwgcHJvdG9jb2wgdmVyc2lvbiAlZC4lZCIsCisgICAgICAgICAgICAgICBjcC5tYWpvclZlcnNpb24sY3AubWlub3JWZXJzaW9uKTsKKyAgICBpZiAoY3AubWlub3JWZXJzaW9uID49IDgpCisgICAgICBjcC5taW5vclZlcnNpb24gPSA4OworICAgIGVsc2UgaWYgKGNwLm1pbm9yVmVyc2lvbiA9PSA3KQorICAgICAgY3AubWlub3JWZXJzaW9uID0gNzsKKyAgICBlbHNlCisgICAgICBjcC5taW5vclZlcnNpb24gPSAzOworICAgIHZsb2cuZXJyb3IoIkFzc3VtaW5nIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9uICVkLiVkIiwKKyAgICAgICAgICAgICAgIGNwLm1ham9yVmVyc2lvbixjcC5taW5vclZlcnNpb24pOworICB9CisKKyAgdmVyc2lvblJlY2VpdmVkKCk7CisKKyAgc3RkOjpsaXN0PHJkcjo6VTg+IHNlY1R5cGVzOworICBzdGQ6Omxpc3Q8cmRyOjpVOD46Oml0ZXJhdG9yIGk7CisgIHNlY3VyaXR5RmFjdG9yeS0+Z2V0U2VjVHlwZXMoJnNlY1R5cGVzLCByZXZlcnNlQ29ubmVjdGlvbik7CisKKyAgaWYgKGNwLmlzVmVyc2lvbigzLDMpKSB7CisKKyAgICAvLyBjb3BlIHdpdGggbGVnYWN5IDMuMyBjbGllbnQgb25seSBpZiAibm8gYXV0aGVudGljYXRpb24iIG9yICJ2bmMKKyAgICAvLyBhdXRoZW50aWNhdGlvbiIgaXMgc3VwcG9ydGVkLgorICAgIGZvciAoaT1zZWNUeXBlcy5iZWdpbigpOyBpIT1zZWNUeXBlcy5lbmQoKTsgaSsrKSB7CisgICAgICBpZiAoKmkgPT0gc2VjVHlwZU5vbmUgfHwgKmkgPT0gc2VjVHlwZVZuY0F1dGgpIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSBzZWNUeXBlcy5lbmQoKSkgeworICAgICAgY2hhciBtc2dbMjU2XTsKKyAgICAgIHNwcmludGYobXNnLCJObyBzdXBwb3J0ZWQgc2VjdXJpdHkgdHlwZSBmb3IgJWQuJWQgY2xpZW50IiwKKyAgICAgICAgICAgICAgY3AubWFqb3JWZXJzaW9uLCBjcC5taW5vclZlcnNpb24pOworICAgICAgdGhyb3dDb25uRmFpbGVkRXhjZXB0aW9uKG1zZyk7CisgICAgfQorCisgICAgb3MtPndyaXRlVTMyKCppKTsKKyAgICBpZiAoKmkgPT0gc2VjVHlwZU5vbmUpIG9zLT5mbHVzaCgpOworICAgIHN0YXRlXyA9IFJGQlNUQVRFX1NFQ1VSSVRZOworICAgIHNlY3VyaXR5ID0gc2VjdXJpdHlGYWN0b3J5LT5nZXRTU2VjdXJpdHkoKmksIHJldmVyc2VDb25uZWN0aW9uKTsKKyAgICBwcm9jZXNzU2VjdXJpdHlNc2coKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBsaXN0IHN1cHBvcnRlZCBzZWN1cml0eSB0eXBlcyBmb3IgPj0zLjcgY2xpZW50cworCisgIGlmIChzZWNUeXBlcy5lbXB0eSgpKQorICAgIHRocm93Q29ubkZhaWxlZEV4Y2VwdGlvbigiTm8gc3VwcG9ydGVkIHNlY3VyaXR5IHR5cGVzIik7CisKKyAgb3MtPndyaXRlVTgoc2VjVHlwZXMuc2l6ZSgpKTsKKyAgZm9yIChpPXNlY1R5cGVzLmJlZ2luKCk7IGkhPXNlY1R5cGVzLmVuZCgpOyBpKyspCisgICAgb3MtPndyaXRlVTgoKmkpOworICBvcy0+Zmx1c2goKTsKKyAgc3RhdGVfID0gUkZCU1RBVEVfU0VDVVJJVFlfVFlQRTsKK30KKworCit2b2lkIFNDb25uZWN0aW9uOjpwcm9jZXNzU2VjdXJpdHlUeXBlTXNnKCkKK3sKKyAgdmxvZy5kZWJ1ZygicHJvY2Vzc2luZyBzZWN1cml0eSB0eXBlIG1lc3NhZ2UiKTsKKyAgaW50IHNlY1R5cGUgPSBpcy0+cmVhZFU4KCk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgdGhlIHJlcXVlc3RlZCBzZWN1cml0eSB0eXBlIHNob3VsZCBiZSBvZmZlcmVkCisgIHN0ZDo6bGlzdDxyZHI6OlU4PiBzZWNUeXBlczsKKyAgc3RkOjpsaXN0PHJkcjo6VTg+OjppdGVyYXRvciBpOworICBzZWN1cml0eUZhY3RvcnktPmdldFNlY1R5cGVzKCZzZWNUeXBlcywgcmV2ZXJzZUNvbm5lY3Rpb24pOworICBmb3IgKGk9c2VjVHlwZXMuYmVnaW4oKTsgaSE9c2VjVHlwZXMuZW5kKCk7IGkrKykKKyAgICBpZiAoKmkgPT0gc2VjVHlwZSkgYnJlYWs7CisgIGlmIChpID09IHNlY1R5cGVzLmVuZCgpKQorICAgIHRocm93IEV4Y2VwdGlvbigiUmVxdWVzdGVkIHNlY3VyaXR5IHR5cGUgbm90IGF2YWlsYWJsZSIpOworCisgIHZsb2cuaW5mbygiQ2xpZW50IHJlcXVlc3RzIHNlY3VyaXR5IHR5cGUgJXMoJWQpIiwKKyAgICAgICAgICAgIHNlY1R5cGVOYW1lKHNlY1R5cGUpLHNlY1R5cGUpOworCisgIHRyeSB7CisgICAgc3RhdGVfID0gUkZCU1RBVEVfU0VDVVJJVFk7CisgICAgc2VjdXJpdHkgPSBzZWN1cml0eUZhY3RvcnktPmdldFNTZWN1cml0eShzZWNUeXBlLCByZXZlcnNlQ29ubmVjdGlvbik7CisgIH0gY2F0Y2ggKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgdGhyb3dDb25uRmFpbGVkRXhjZXB0aW9uKGUuc3RyKCkpOworICB9CisKKyAgcHJvY2Vzc1NlY3VyaXR5TXNnKCk7Cit9CisKK3ZvaWQgU0Nvbm5lY3Rpb246OnByb2Nlc3NTZWN1cml0eU1zZygpCit7CisgIHZsb2cuZGVidWcoInByb2Nlc3Npbmcgc2VjdXJpdHkgbWVzc2FnZSIpOworICB0cnkgeworICAgIGJvb2wgZG9uZSA9IHNlY3VyaXR5LT5wcm9jZXNzTXNnKHRoaXMpOworICAgIGlmIChkb25lKSB7CisgICAgICBzdGF0ZV8gPSBSRkJTVEFURV9RVUVSWUlORzsKKyAgICAgIHF1ZXJ5Q29ubmVjdGlvbihzZWN1cml0eS0+Z2V0VXNlck5hbWUoKSk7CisgICAgfQorICB9IGNhdGNoIChBdXRoRmFpbHVyZUV4Y2VwdGlvbiYgZSkgeworICAgIHZsb2cuZXJyb3IoIkF1dGhGYWlsdXJlRXhjZXB0aW9uOiAlcyIsIGUuc3RyKCkpOworICAgIG9zLT53cml0ZVUzMihzZWNSZXN1bHRGYWlsZWQpOworICAgIGlmICghY3AuYmVmb3JlVmVyc2lvbigzLDgpKSAvLyAzLjggb253YXJkcyBoYXZlIGZhaWx1cmUgbWVzc2FnZQorICAgICAgb3MtPndyaXRlU3RyaW5nKGUuc3RyKCkpOworICAgIG9zLT5mbHVzaCgpOworICAgIHRocm93OworICB9Cit9CisKK3ZvaWQgU0Nvbm5lY3Rpb246OnByb2Nlc3NJbml0TXNnKCkKK3sKKyAgdmxvZy5kZWJ1ZygicmVhZGluZyBjbGllbnQgaW5pdGlhbGlzYXRpb24iKTsKKyAgcmVhZGVyXy0+cmVhZENsaWVudEluaXQoKTsKK30KKwordm9pZCBTQ29ubmVjdGlvbjo6dGhyb3dDb25uRmFpbGVkRXhjZXB0aW9uKGNvbnN0IGNoYXIqIG1zZykKK3sKKyAgdmxvZy5pbmZvKG1zZyk7CisgIGlmIChzdGF0ZV8gPT0gUkZCU1RBVEVfUFJPVE9DT0xfVkVSU0lPTikgeworICAgIGlmIChjcC5tYWpvclZlcnNpb24gPT0gMyAmJiBjcC5taW5vclZlcnNpb24gPT0gMykgeworICAgICAgb3MtPndyaXRlVTMyKDApOworICAgICAgb3MtPndyaXRlU3RyaW5nKG1zZyk7CisgICAgICBvcy0+Zmx1c2goKTsKKyAgICB9IGVsc2UgeworICAgICAgb3MtPndyaXRlVTgoMCk7CisgICAgICBvcy0+d3JpdGVTdHJpbmcobXNnKTsKKyAgICAgIG9zLT5mbHVzaCgpOworICAgIH0KKyAgfQorICBzdGF0ZV8gPSBSRkJTVEFURV9JTlZBTElEOworICB0aHJvdyBDb25uRmFpbGVkRXhjZXB0aW9uKG1zZyk7Cit9CisKK3ZvaWQgU0Nvbm5lY3Rpb246OndyaXRlQ29ubkZhaWxlZEZyb21TY3JhdGNoKGNvbnN0IGNoYXIqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJkcjo6T3V0U3RyZWFtKiBvcykKK3sKKyAgb3MtPndyaXRlQnl0ZXMoIlJGQiAwMDMuMDAzXG4iLCAxMik7CisgIG9zLT53cml0ZVUzMigwKTsKKyAgb3MtPndyaXRlU3RyaW5nKG1zZyk7CisgIG9zLT5mbHVzaCgpOworfQorCit2b2lkIFNDb25uZWN0aW9uOjp2ZXJzaW9uUmVjZWl2ZWQoKQoreworfQorCit2b2lkIFNDb25uZWN0aW9uOjphdXRoU3VjY2VzcygpCit7Cit9CisKK3ZvaWQgU0Nvbm5lY3Rpb246OnF1ZXJ5Q29ubmVjdGlvbihjb25zdCBjaGFyKiB1c2VyTmFtZSkKK3sKKyAgYXBwcm92ZUNvbm5lY3Rpb24odHJ1ZSk7Cit9CisKK3ZvaWQgU0Nvbm5lY3Rpb246OmFwcHJvdmVDb25uZWN0aW9uKGJvb2wgYWNjZXB0LCBjb25zdCBjaGFyKiByZWFzb24pCit7CisgIGlmIChzdGF0ZV8gIT0gUkZCU1RBVEVfUVVFUllJTkcpCisgICAgdGhyb3cgRXhjZXB0aW9uKCJTQ29ubmVjdGlvbjo6YXBwcm92ZUNvbm5lY3Rpb246IGludmFsaWQgc3RhdGUiKTsKKworICBpZiAoIXJlYXNvbikgcmVhc29uID0gIkF1dGhlbnRpY2F0aW9uIGZhaWx1cmUiOworCisgIGlmICghY3AuYmVmb3JlVmVyc2lvbigzLDgpIHx8IHNlY3VyaXR5LT5nZXRUeXBlKCkgIT0gc2VjVHlwZU5vbmUpIHsKKyAgICBpZiAoYWNjZXB0KSB7CisgICAgICBvcy0+d3JpdGVVMzIoc2VjUmVzdWx0T0spOworICAgIH0gZWxzZSB7CisgICAgICBvcy0+d3JpdGVVMzIoc2VjUmVzdWx0RmFpbGVkKTsKKyAgICAgIGlmICghY3AuYmVmb3JlVmVyc2lvbigzLDgpKSAvLyAzLjggb253YXJkcyBoYXZlIGZhaWx1cmUgbWVzc2FnZQorICAgICAgICBvcy0+d3JpdGVTdHJpbmcocmVhc29uKTsKKyAgICB9CisgICAgb3MtPmZsdXNoKCk7CisgIH0KKworICBpZiAoYWNjZXB0KSB7CisgICAgc3RhdGVfID0gUkZCU1RBVEVfSU5JVElBTElTQVRJT047CisgICAgcmVhZGVyXyA9IG5ldyBTTXNnUmVhZGVyVjModGhpcywgaXMpOworICAgIHdyaXRlcl8gPSBuZXcgU01zZ1dyaXRlclYzKCZjcCwgb3MpOworICAgIGF1dGhTdWNjZXNzKCk7CisgIH0gZWxzZSB7CisgICAgc3RhdGVfID0gUkZCU1RBVEVfSU5WQUxJRDsKKyAgICB0aHJvdyBBdXRoRmFpbHVyZUV4Y2VwdGlvbihyZWFzb24pOworICB9Cit9CisKK3ZvaWQgU0Nvbm5lY3Rpb246OnNldEluaXRpYWxDb2xvdXJNYXAoKQoreworfQorCit2b2lkIFNDb25uZWN0aW9uOjpjbGllbnRJbml0KGJvb2wgc2hhcmVkKQoreworICB3cml0ZXJfLT53cml0ZVNlcnZlckluaXQoKTsKKyAgc3RhdGVfID0gUkZCU1RBVEVfTk9STUFMOworfQorCit2b2lkIFNDb25uZWN0aW9uOjpzZXRQaXhlbEZvcm1hdChjb25zdCBQaXhlbEZvcm1hdCYgcGYpCit7CisgIFNNc2dIYW5kbGVyOjpzZXRQaXhlbEZvcm1hdChwZik7CisgIHJlYWR5Rm9yU2V0Q29sb3VyTWFwRW50cmllcyA9IHRydWU7Cit9CisKK3ZvaWQgU0Nvbm5lY3Rpb246OmZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdChjb25zdCBSZWN0JiByLCBib29sIGluY3JlbWVudGFsKQoreworICBpZiAoIXJlYWR5Rm9yU2V0Q29sb3VyTWFwRW50cmllcykgeworICAgIHJlYWR5Rm9yU2V0Q29sb3VyTWFwRW50cmllcyA9IHRydWU7CisgICAgaWYgKCFjcC5wZigpLnRydWVDb2xvdXIpIHsKKyAgICAgIHNldEluaXRpYWxDb2xvdXJNYXAoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU0Nvbm5lY3Rpb24uaCBiL2NvbW1vbi9yZmIvU0Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjk0M2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9TQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTkzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gU0Nvbm5lY3Rpb24gLSBjbGFzcyBvbiB0aGUgc2VydmVyIHNpZGUgcmVwcmVzZW50aW5nIGEgY29ubmVjdGlvbiB0byBhCisvLyBjbGllbnQuICBBIGRlcml2ZWQgY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIG1ldGhvZHMgYXBwcm9wcmlhdGVseS4KKy8vCisKKyNpZm5kZWYgX19SRkJfU0NPTk5FQ1RJT05fSF9fCisjZGVmaW5lIF9fUkZCX1NDT05ORUNUSU9OX0hfXworCisjaW5jbHVkZSA8cmRyL0luU3RyZWFtLmg+CisjaW5jbHVkZSA8cmRyL091dFN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9TTXNnSGFuZGxlci5oPgorI2luY2x1ZGUgPHJmYi9TU2VjdXJpdHkuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgU01zZ1JlYWRlcjsKKyAgY2xhc3MgU01zZ1dyaXRlcjsKKyAgY2xhc3MgU1NlY3VyaXR5OworCisgIGNsYXNzIFNDb25uZWN0aW9uIDogcHVibGljIFNNc2dIYW5kbGVyIHsKKyAgcHVibGljOgorCisgICAgU0Nvbm5lY3Rpb24oU1NlY3VyaXR5RmFjdG9yeSogc2YsIGJvb2wgcmV2ZXJzZUNvbm5lY3Rpb25fKTsKKyAgICB2aXJ0dWFsIH5TQ29ubmVjdGlvbigpOworCisgICAgLy8gTWV0aG9kcyB0byBpbml0aWFsaXNlIHRoZSBjb25uZWN0aW9uCisKKyAgICAvLyBzZXRTdHJlYW1zKCkgc2V0cyB0aGUgc3RyZWFtcyB0byBiZSB1c2VkIGZvciB0aGUgY29ubmVjdGlvbi4gIFRoZXNlIG11c3QKKyAgICAvLyBiZSBzZXQgYmVmb3JlIGluaXRpYWxpc2VQcm90b2NvbCgpIGFuZCBwcm9jZXNzTXNnKCkgYXJlIGNhbGxlZC4gIFRoZQorICAgIC8vIFNTZWN1cml0eSBvYmplY3QgbWF5IGNhbGwgc2V0U3RyZWFtcygpIGFnYWluIHRvIHByb3ZpZGUgYWx0ZXJuYXRpdmUKKyAgICAvLyBzdHJlYW1zIG92ZXIgd2hpY2ggdGhlIFJGQiBwcm90b2NvbCBpcyBzZW50IChpLmUuIGVuY3J5cHRpbmcvZGVjcnlwdGluZworICAgIC8vIHN0cmVhbXMpLiAgT3duZXJzaGlwIG9mIHRoZSBzdHJlYW1zIHJlbWFpbnMgd2l0aCB0aGUgY2FsbGVyCisgICAgLy8gKGkuZS4gU0Nvbm5lY3Rpb24gd2lsbCBub3QgZGVsZXRlIHRoZW0pLgorICAgIHZvaWQgc2V0U3RyZWFtcyhyZHI6OkluU3RyZWFtKiBpcywgcmRyOjpPdXRTdHJlYW0qIG9zKTsKKworICAgIC8vIGluaXRpYWxpc2VQcm90b2NvbCgpIHNob3VsZCBiZSBjYWxsZWQgb25jZSB0aGUgc3RyZWFtcyBhbmQgc2VjdXJpdHkKKyAgICAvLyB0eXBlcyBhcmUgc2V0LiAgU3Vic2VxdWVudGx5LCBwcm9jZXNzTXNnKCkgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlcgorICAgIC8vIHRoZXJlIGlzIGRhdGEgdG8gcmVhZCBvbiB0aGUgSW5TdHJlYW0uCisgICAgdm9pZCBpbml0aWFsaXNlUHJvdG9jb2woKTsKKworICAgIC8vIHByb2Nlc3NNc2coKSBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGRhdGEgdG8gcmVhZCBvbiB0aGUKKyAgICAvLyBJblN0cmVhbS4gIFlvdSBtdXN0IGhhdmUgY2FsbGVkIGluaXRpYWxpc2VQcm90b2NvbCgpIGZpcnN0LgorICAgIHZvaWQgcHJvY2Vzc01zZygpOworCisgICAgLy8gYXBwcm92ZUNvbm5lY3Rpb24oKSBpcyBjYWxsZWQgdG8gZWl0aGVyIGFjY2VwdCBvciByZWplY3QgdGhlIGNvbm5lY3Rpb24uCisgICAgLy8gSWYgYWNjZXB0IGlzIGZhbHNlLCB0aGUgcmVhc29uIHN0cmluZyBnaXZlcyB0aGUgcmVhc29uIGZvciB0aGUKKyAgICAvLyByZWplY3Rpb24uICBJdCBjYW4gZWl0aGVyIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIHF1ZXJ5Q29ubmVjdGlvbigpIG9yCisgICAgLy8gbGF0ZXIsIGFmdGVyIHF1ZXJ5Q29ubmVjdGlvbigpIGhhcyByZXR1cm5lZC4gIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuCisgICAgLy8gaW4gc3RhdGUgUkZCU1RBVEVfUVVFUllJTkcuICBPbiByZWplY3Rpb24sIGFuIEF1dGhGYWlsdXJlRXhjZXB0aW9uIGlzCisgICAgLy8gdGhyb3duLCBzbyB0aGlzIG11c3QgYmUgaGFuZGxlZCBhcHByb3ByaWF0ZWx5IGJ5IHRoZSBjYWxsZXIuCisgICAgdm9pZCBhcHByb3ZlQ29ubmVjdGlvbihib29sIGFjY2VwdCwgY29uc3QgY2hhciogcmVhc29uPTApOworCisKKyAgICAvLyBNZXRob2RzIHRvIGJlIG92ZXJyaWRkZW4gaW4gYSBkZXJpdmVkIGNsYXNzCisKKyAgICAvLyB2ZXJzaW9uUmVjZWl2ZWQoKSBpbmRpY2F0ZXMgdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIgaGFzIGp1c3QgYmVlbiByZWFkCisgICAgLy8gZnJvbSB0aGUgY2xpZW50LiAgVGhlIHZlcnNpb24gd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiAiY29va2VkIgorICAgIC8vIHRvIGRlYWwgd2l0aCB1bmtub3duL2JvZ3VzIHZpZXdlciBwcm90b2NvbCBudW1iZXJzLgorICAgIHZpcnR1YWwgdm9pZCB2ZXJzaW9uUmVjZWl2ZWQoKTsKKworICAgIC8vIGF1dGhTdWNjZXNzKCkgaXMgY2FsbGVkIHdoZW4gYXV0aGVudGljYXRpb24gaGFzIHN1Y2NlZWRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgYXV0aFN1Y2Nlc3MoKTsKKworICAgIC8vIHF1ZXJ5Q29ubmVjdGlvbigpIGlzIGNhbGxlZCB3aGVuIGF1dGhlbnRpY2F0aW9uIGhhcyBzdWNjZWVkZWQsIGJ1dAorICAgIC8vIGJlZm9yZSBpbmZvcm1pbmcgdGhlIGNsaWVudC4gIEl0IGNhbiBiZSBvdmVycmlkZGVuIHRvIHF1ZXJ5IGEgbG9jYWwgdXNlcgorICAgIC8vIHRvIGFjY2VwdCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiwgZm9yIGV4YW1wbGUuICBUaGUgdXNlck5hbWUgYXJndW1lbnQKKyAgICAvLyBpcyB0aGUgbmFtZSBvZiB0aGUgdXNlciBtYWtpbmcgdGhlIGNvbm5lY3Rpb24sIG9yIG51bGwgKG5vdGUgdGhhdCB0aGUKKyAgICAvLyBzdG9yYWdlIGZvciB1c2VyTmFtZSBpcyBvd25lZCBieSB0aGUgY2FsbGVyKS4gIFRoZSBjb25uZWN0aW9uIG11c3QgYmUKKyAgICAvLyBhY2NlcHRlZCBvciByZWplY3RlZCBieSBjYWxsaW5nIGFwcHJvdmVDb25uZWN0aW9uKCksIGVpdGhlciBkaXJlY3RseQorICAgIC8vIGZyb20gcXVlcnlDb25uZWN0aW9uKCkgb3Igc29tZSB0aW1lIGxhdGVyLgorICAgIHZpcnR1YWwgdm9pZCBxdWVyeUNvbm5lY3Rpb24oY29uc3QgY2hhciogdXNlck5hbWUpOworCisgICAgLy8gY2xpZW50SW5pdCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBDbGllbnRJbml0IG1lc3NhZ2UgaXMgcmVjZWl2ZWQuICBUaGUKKyAgICAvLyBkZXJpdmVkIGNsYXNzIG11c3QgY2FsbCBvbiB0byBTQ29ubmVjdGlvbjo6Y2xpZW50SW5pdCgpLgorICAgIHZpcnR1YWwgdm9pZCBjbGllbnRJbml0KGJvb2wgc2hhcmVkKTsKKworICAgIC8vIHNldFBpeGVsRm9ybWF0KCkgaXMgY2FsbGVkIHdoZW4gYSBTZXRQaXhlbEZvcm1hdCBtZXNzYWdlIGlzIHJlY2VpdmVkLgorICAgIC8vIFRoZSBkZXJpdmVkIGNsYXNzIG11c3QgY2FsbCBvbiB0byBTQ29ubmVjdGlvbjo6c2V0UGl4ZWxGb3JtYXQoKS4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGl4ZWxGb3JtYXQoY29uc3QgUGl4ZWxGb3JtYXQmIHBmKTsKKworICAgIC8vIGZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCgpIGlzIGNhbGxlZCB3aGVuIGEgRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0CisgICAgLy8gbWVzc2FnZSBpcyByZWNlaXZlZC4gIFRoZSBkZXJpdmVkIGNsYXNzIG11c3QgY2FsbCBvbiB0bworICAgIC8vIFNDb25uZWN0aW9uOjpmcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoKS4KKyAgICB2aXJ0dWFsIHZvaWQgZnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KGNvbnN0IFJlY3QmIHIsIGJvb2wgaW5jcmVtZW50YWwpOworCisgICAgLy8gc2V0SW5pdGlhbENvbG91ck1hcCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgbmVlZHMgYW4gaW5pdGlhbAorICAgIC8vIFNldENvbG91ck1hcEVudHJpZXMgbWVzc2FnZS4gIEluIGZhY3QgdGhpcyBvbmx5IGhhcHBlbnMgd2hlbiB0aGUgY2xpZW50CisgICAgLy8gYWNjZXB0cyB0aGUgc2VydmVyJ3MgZGVmYXVsdCBwaXhlbCBmb3JtYXQgYW5kIGl0IHVzZXMgYSBjb2xvdXIgbWFwLgorICAgIHZpcnR1YWwgdm9pZCBzZXRJbml0aWFsQ29sb3VyTWFwKCk7CisKKyAgICAvLyBzZXRBY2Nlc3NSaWdodHMoKSBhbGxvd3MgYSBzZWN1cml0eSBwYWNrYWdlIHRvIGxpbWl0IHRoZSBhY2Nlc3MgcmlnaHRzCisgICAgLy8gb2YgYSBWTkNTQ29ubmVjdGlvblNUIHRvIHRoZSBzZXJ2ZXIuICBIb3cgdGhlIGFjY2VzcyByaWdodHMgYXJlIHRyZWF0ZWQKKyAgICAvLyBpcyB1cCB0byB0aGUgZGVyaXZlZCBjbGFzcy4KKworICAgIHR5cGVkZWYgcmRyOjpVMTYgQWNjZXNzUmlnaHRzOworICAgIHN0YXRpYyBjb25zdCBBY2Nlc3NSaWdodHMgQWNjZXNzVmlldzsgICAgICAgICAvLyBWaWV3IGRpc3BsYXkgY29udGVudHMKKyAgICBzdGF0aWMgY29uc3QgQWNjZXNzUmlnaHRzIEFjY2Vzc0tleUV2ZW50czsgICAgLy8gU2VuZCBrZXkgZXZlbnRzCisgICAgc3RhdGljIGNvbnN0IEFjY2Vzc1JpZ2h0cyBBY2Nlc3NQdHJFdmVudHM7ICAgIC8vIFNlbmQgcG9pbnRlciBldmVudHMKKyAgICBzdGF0aWMgY29uc3QgQWNjZXNzUmlnaHRzIEFjY2Vzc0N1dFRleHQ7ICAgICAgLy8gU2VuZC9yZWNlaXZlIGNsaXBib2FyZCBldmVudHMKKyAgICBzdGF0aWMgY29uc3QgQWNjZXNzUmlnaHRzIEFjY2Vzc0RlZmF1bHQ7ICAgICAgLy8gVGhlIGRlZmF1bHQgcmlnaHRzLCBJTkNMVURJTkcgRlVUVVJFIE9ORVMKKyAgICBzdGF0aWMgY29uc3QgQWNjZXNzUmlnaHRzIEFjY2Vzc05vUXVlcnk7ICAgICAgLy8gQ29ubmVjdCB3aXRob3V0IGxvY2FsIHVzZXIgYWNjZXB0aW5nCisgICAgc3RhdGljIGNvbnN0IEFjY2Vzc1JpZ2h0cyBBY2Nlc3NGdWxsOyAgICAgICAgIC8vIEFsbCBvZiB0aGUgYXZhaWxhYmxlIEFORCBGVVRVUkUgcmlnaHRzCisgICAgdmlydHVhbCB2b2lkIHNldEFjY2Vzc1JpZ2h0cyhBY2Nlc3NSaWdodHMgYXIpID0gMDsKKworICAgIC8vIE90aGVyIG1ldGhvZHMKKworICAgIC8vIGF1dGhlbnRpY2F0ZWQoKSByZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBoYXMgYXV0aGVudGljYXRlZAorICAgIC8vIHN1Y2Nlc3NmdWxseS4KKyAgICBib29sIGF1dGhlbnRpY2F0ZWQoKSB7IHJldHVybiAoc3RhdGVfID09IFJGQlNUQVRFX0lOSVRJQUxJU0FUSU9OIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXyA9PSBSRkJTVEFURV9OT1JNQUwpOyB9CisKKyAgICAvLyBkZWxldGVSZWFkZXJBbmRXcml0ZXIoKSBkZWxldGVzIHRoZSByZWFkZXIgYW5kIHdyaXRlciBhc3NvY2lhdGVkIHdpdGgKKyAgICAvLyB0aGlzIGNvbm5lY3Rpb24uICBUaGlzIG1heSBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzdHJlYW1zCisgICAgLy8gYmVmb3JlIGRlbGV0aW5nIHRoZSBTQ29ubmVjdGlvbiB0byBtYWtlIHN1cmUgdGhhdCBubyBhdHRlbXB0IGJ5IHRoZQorICAgIC8vIFNDb25uZWN0aW9uIGlzIG1hZGUgdG8gcmVhZCBvciB3cml0ZS4KKyAgICAvLyBYWFggRG8gd2UgcmVhbGx5IG5lZWQgdGhpcyBhdCBhbGw/Pz8KKyAgICB2b2lkIGRlbGV0ZVJlYWRlckFuZFdyaXRlcigpOworCisgICAgLy8gdGhyb3dDb25uRmFpbGVkRXhjZXB0aW9uKCkgcHJpbnRzIGEgbWVzc2FnZSB0byB0aGUgbG9nLCBzZW5kcyBhIGNvbm4KKyAgICAvLyBmYWlsZWQgbWVzc2FnZSB0byB0aGUgY2xpZW50IChpZiBwb3NzaWJsZSkgYW5kIHRocm93cyBhCisgICAgLy8gQ29ubkZhaWxlZEV4Y2VwdGlvbi4KKyAgICB2b2lkIHRocm93Q29ubkZhaWxlZEV4Y2VwdGlvbihjb25zdCBjaGFyKiBtc2cpOworCisgICAgLy8gd3JpdGVDb25uRmFpbGVkRnJvbVNjcmF0Y2goKSBzZW5kcyBhIGNvbm4gZmFpbGVkIG1lc3NhZ2UgdG8gYW4gT3V0U3RyZWFtCisgICAgLy8gd2l0aG91dCB0aGUgbmVlZCB0byBuZWdvdGlhdGUgdGhlIHByb3RvY29sIHZlcnNpb24gZmlyc3QuICBJdCBhY3R1YWxseQorICAgIC8vIGRvZXMgdGhpcyBieSBhc3N1bWluZyB0aGF0IHRoZSBjbGllbnQgd2lsbCB1bmRlcnN0YW5kIHZlcnNpb24gMy4zIG9mIHRoZQorICAgIC8vIHByb3RvY29sLgorICAgIHN0YXRpYyB2b2lkIHdyaXRlQ29ubkZhaWxlZEZyb21TY3JhdGNoKGNvbnN0IGNoYXIqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZHI6Ok91dFN0cmVhbSogb3MpOworCisgICAgU01zZ1JlYWRlciogcmVhZGVyKCkgeyByZXR1cm4gcmVhZGVyXzsgfQorICAgIFNNc2dXcml0ZXIqIHdyaXRlcigpIHsgcmV0dXJuIHdyaXRlcl87IH0KKworICAgIHJkcjo6SW5TdHJlYW0qIGdldEluU3RyZWFtKCkgeyByZXR1cm4gaXM7IH0KKyAgICByZHI6Ok91dFN0cmVhbSogZ2V0T3V0U3RyZWFtKCkgeyByZXR1cm4gb3M7IH0KKworICAgIGVudW0gc3RhdGVFbnVtIHsKKyAgICAgIFJGQlNUQVRFX1VOSU5JVElBTElTRUQsCisgICAgICBSRkJTVEFURV9QUk9UT0NPTF9WRVJTSU9OLAorICAgICAgUkZCU1RBVEVfU0VDVVJJVFlfVFlQRSwKKyAgICAgIFJGQlNUQVRFX1NFQ1VSSVRZLAorICAgICAgUkZCU1RBVEVfUVVFUllJTkcsCisgICAgICBSRkJTVEFURV9JTklUSUFMSVNBVElPTiwKKyAgICAgIFJGQlNUQVRFX05PUk1BTCwKKyAgICAgIFJGQlNUQVRFX0NMT1NJTkcsCisgICAgICBSRkJTVEFURV9JTlZBTElECisgICAgfTsKKworICAgIHN0YXRlRW51bSBzdGF0ZSgpIHsgcmV0dXJuIHN0YXRlXzsgfQorCisgICAgLy8gc3NlY3VyaXR5KCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhpcyBjb25uZWN0aW9uJ3MgU1NlY3VyaXR5IG9iamVjdCwgaWYKKyAgICAvLyBhbnkKKyAgICBjb25zdCBTU2VjdXJpdHkqIHNzZWN1cml0eSgpIGNvbnN0IHsgcmV0dXJuIHNlY3VyaXR5OyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgc2V0U3RhdGUoc3RhdGVFbnVtIHMpIHsgc3RhdGVfID0gczsgfQorCisgICAgYm9vbCByZWFkeUZvclNldENvbG91ck1hcEVudHJpZXM7CisKKyAgICB2b2lkIHByb2Nlc3NWZXJzaW9uTXNnKCk7CisgICAgdm9pZCBwcm9jZXNzU2VjdXJpdHlUeXBlTXNnKCk7CisgICAgdm9pZCBwcm9jZXNzU2VjdXJpdHlNc2coKTsKKyAgICB2b2lkIHByb2Nlc3NJbml0TXNnKCk7CisKKyAgICBpbnQgZGVmYXVsdE1ham9yVmVyc2lvbiwgZGVmYXVsdE1pbm9yVmVyc2lvbjsKKyAgICByZHI6OkluU3RyZWFtKiBpczsKKyAgICByZHI6Ok91dFN0cmVhbSogb3M7CisgICAgU01zZ1JlYWRlciogcmVhZGVyXzsKKyAgICBTTXNnV3JpdGVyKiB3cml0ZXJfOworICAgIFNTZWN1cml0eSogc2VjdXJpdHk7CisgICAgU1NlY3VyaXR5RmFjdG9yeSogc2VjdXJpdHlGYWN0b3J5OworICAgIHN0YXRlRW51bSBzdGF0ZV87CisgICAgYm9vbCByZXZlcnNlQ29ubmVjdGlvbjsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9TRGVza3RvcC5oIGIvY29tbW9uL3JmYi9TRGVza3RvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDU0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NEZXNrdG9wLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gU0Rlc2t0b3AgaXMgYW4gaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGJhY2stZW5kcywgb24gd2hpY2ggY2FsbGJhY2tzIGFyZQorLy8gbWFkZSBieSB0aGUgVk5DU2VydmVyIGFzIGFwcHJvcHJpYXRlIGZvciBwb2ludGVyIGFuZCBrZXlib2FyZCBldmVudHMsIGV0Yy4KKy8vIFNEZXNrdG9wIG9iamVjdHMgYXJlIGFsd2F5cyBjcmVhdGVkIGJlZm9yZSB0aGUgVk5DU2VydmVyIC0gdGhlIFNEZXNrdG9wCisvLyB3aWxsIGJlIHBhc3NlZCBhIHBvaW50ZXIgdG8gdGhlIFZOQ1NlcnZlciBpbiB0aGUgc3RhcnQoKSBjYWxsLiAgSWYgYSBtb3JlCisvLyBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBwb2ludGVyIHRvIHRoZSBWTkNTZXJ2ZXIgaXMgcmVxdWlyZWQgdGhlbiB0aGlzCisvLyBjYW4gYmUgcHJvdmlkZWQgdG8gdGhlIFNEZXNrdG9wIHZpYSBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBtZXRob2QuCisvLworLy8gQW4gU0Rlc2t0b3AgdXN1YWxseSBoYXMgYW4gYXNzb2NpYXRlZCBQaXhlbEJ1ZmZlciB3aGljaCBpdCB0ZWxscyB0aGUKKy8vIFZOQ1NlcnZlciB2aWEgdGhlIFZOQ1NlcnZlcidzIHNldFBpeGVsQnVmZmVyKCkgbWV0aG9kLiAgSXQgY2FuIGRvIHRoaXMgYXQKKy8vIGFueSB0aW1lLCBidXQgdGhlIFBpeGVsQnVmZmVyIE1VU1QgYmUgdmFsaWQgYnkgdGhlIHRpbWUgdGhlIGNhbGwgdG8gc3RhcnQoKQorLy8gcmV0dXJucy4gIFRoZSBQaXhlbEJ1ZmZlciBtYXkgYmUgc2V0IHRvIG51bGwgYWdhaW4gaWYgZGVzaXJlZCB3aGVuIHN0b3AoKSBpcworLy8gY2FsbGVkLiAgTm90ZSB0aGF0IHN0YXJ0KCkgYW5kIHN0b3AoKSBhcmUgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQKKy8vIGFsdGVybmF0ZWx5OyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIGNhbGxzIHRvIHN0YXJ0KCkgd2l0aG91dCBhbgorLy8gaW50ZXJ2ZW5pbmcgc3RvcCgpIGFuZCB2aWNlLXZlcnNhLgorLy8KKworI2lmbmRlZiBfX1JGQl9TREVTS1RPUF9IX18KKyNkZWZpbmUgX19SRkJfU0RFU0tUT1BfSF9fCisKKyNpbmNsdWRlIDxyZmIvUGl4ZWxCdWZmZXIuaD4KKyNpbmNsdWRlIDxyZmIvVk5DU2VydmVyLmg+CisjaW5jbHVkZSA8cmZiL0lucHV0SGFuZGxlci5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgVk5DU2VydmVyOworCisgIGNsYXNzIFNEZXNrdG9wIDogcHVibGljIElucHV0SGFuZGxlciB7CisgIHB1YmxpYzoKKyAgICAvLyBzdGFydCgpIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIHdoZW4gdGhlIGZpcnN0IGNsaWVudCBhdXRoZW50aWNhdGVzCisgICAgLy8gc3VjY2Vzc2Z1bGx5LCBhbmQgY2FuIGJlIHVzZWQgdG8gYmVnaW4gYW55IGV4cGVuc2l2ZSB0YXNrcyB3aGljaCBhcmUgbm90CisgICAgLy8gbmVlZGVkIHdoZW4gdGhlcmUgYXJlIG5vIGNsaWVudHMuICBBIHZhbGlkIFBpeGVsQnVmZmVyIG11c3QgaGF2ZSBiZWVuCisgICAgLy8gc2V0IHZpYSB0aGUgVk5DU2VydmVyJ3Mgc2V0UGl4ZWxCdWZmZXIoKSBtZXRob2QgYnkgdGhlIHRpbWUgdGhpcyBjYWxsCisgICAgLy8gcmV0dXJucy4KKworICAgIHZpcnR1YWwgdm9pZCBzdGFydChWTkNTZXJ2ZXIqIHZzKSB7fQorCisgICAgLy8gc3RvcCgpIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIHdoZW4gdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkKKyAgICAvLyBhdXRoZW50aWNhdGVkIGNsaWVudHMsIGFuZCB0aGVyZWZvcmUgdGhlIGRlc2t0b3AgY2FuIGNlYXNlIGFueQorICAgIC8vIGV4cGVuc2l2ZSB0YXNrcy4gIE5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlIFZOQ1NlcnZlciBwYXNzZWQgdG8gc3RhcnQoKQorICAgIC8vIGNhbiBiZSBtYWRlIG9uY2Ugc3RvcCBoYXMgcmV0dXJuZWQuCisKKyAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpIHt9CisKKyAgICAvLyBmcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoKSBpcyBjYWxsZWQgdG8gbGV0IHRoZSBkZXNrdG9wIGtub3cgdGhhdCBhdAorICAgIC8vIGxlYXN0IG9uZSBjbGllbnQgaGFzIGJlY29tZSByZWFkeSBmb3IgYW4gdXBkYXRlLiAgRGVza3RvcHMgY2FuIGNoZWNrCisgICAgLy8gd2hldGhlciB0aGVyZSBhcmUgY2xpZW50cyByZWFkeSBhdCBhbnkgdGltZSBieSBjYWxsaW5nIHRoZSBWTkNTZXJ2ZXIncworICAgIC8vIGNsaWVudHNSZWFkeUZvclVwZGF0ZSgpIG1ldGhvZC4KKworICAgIHZpcnR1YWwgdm9pZCBmcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoKSB7fQorCisgICAgLy8gZ2V0RmJTaXplKCkgcmV0dXJucyB0aGUgY3VycmVudCBkaW1lbnNpb25zIG9mIHRoZSBmcmFtZWJ1ZmZlci4KKyAgICAvLyBUaGlzIGNhbiBiZSBjYWxsZWQgZXZlbiB3aGlsZSB0aGUgU0Rlc2t0b3AgaXMgbm90IHN0YXJ0KCllZC4KKworICAgIHZpcnR1YWwgUG9pbnQgZ2V0RmJTaXplKCkgPSAwOworCisgICAgLy8gSW5wdXRIYW5kbGVyIGludGVyZmFjZQorICAgIC8vIHBvaW50ZXJFdmVudCgpLCBrZXlFdmVudCgpIGFuZCBjbGllbnRDdXRUZXh0KCkgYXJlIGNhbGxlZCBpbiByZXNwb25zZSB0bworICAgIC8vIHRoZSByZWxldmFudCBSRkIgcHJvdG9jb2wgbWVzc2FnZXMgZnJvbSBjbGllbnRzLgorICAgIC8vIFNlZSBJbnB1dEhhbmRsZXIgZm9yIG1ldGhvZCBzaWduYXR1cmVzLgorICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U0Rlc2t0b3AoKSB7fQorICB9OworCisgIC8vIC09LSBTU3RhdGljRGVza3RvcAorICAvLyAgICAgVHJpdmlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0Rlc2t0b3AgaW50ZXJmYWNlLCB3aGljaCBwcm92aWRlcworICAvLyAgICAgZHVtbXkgaW5wdXQgaGFuZGxlcnMgYW5kIGV2ZW50IHByb2Nlc3Npbmcgcm91dGluZSwgYW5kIGV4cG9ydHMKKyAgLy8gICAgIGEgcGxhaW4gYmxhY2sgZGVza3RvcCBvZiB0aGUgc3BlY2lmaWVkIGZvcm1hdC4KKyAgY2xhc3MgU1N0YXRpY0Rlc2t0b3AgOiBwdWJsaWMgU0Rlc2t0b3AgeworICBwdWJsaWM6CisgICAgU1N0YXRpY0Rlc2t0b3AoY29uc3QgUG9pbnQmIHNpemUpIDogc2VydmVyKDApLCBidWZmZXIoMCkgeworICAgICAgUGl4ZWxGb3JtYXQgcGY7CisgICAgICBidWZmZXIgPSBuZXcgTWFuYWdlZFBpeGVsQnVmZmVyKHBmLCBzaXplLngsIHNpemUueSk7CisgICAgICBpZiAoYnVmZmVyKSBtZW1zZXQoYnVmZmVyLT5kYXRhLCAwLCAocGYuYnBwLzgpICogKHNpemUueCpzaXplLnkpKTsKKyAgICB9CisgICAgU1N0YXRpY0Rlc2t0b3AoY29uc3QgUG9pbnQmIHNpemUsIGNvbnN0IFBpeGVsRm9ybWF0JiBwZikgOiBidWZmZXIoMCkgeworICAgICAgYnVmZmVyID0gbmV3IE1hbmFnZWRQaXhlbEJ1ZmZlcihwZiwgc2l6ZS54LCBzaXplLnkpOworICAgICAgaWYgKGJ1ZmZlcikgbWVtc2V0KGJ1ZmZlci0+ZGF0YSwgMCwgKHBmLmJwcC84KSAqIChzaXplLngqc2l6ZS55KSk7CisgICAgfQorICAgIHZpcnR1YWwgflNTdGF0aWNEZXNrdG9wKCkgeworICAgICAgaWYgKGJ1ZmZlcikgZGVsZXRlIGJ1ZmZlcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoVk5DU2VydmVyKiB2cykgeworICAgICAgc2VydmVyID0gdnM7CisgICAgICBzZXJ2ZXItPnNldFBpeGVsQnVmZmVyKGJ1ZmZlcik7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkgeworICAgICAgc2VydmVyLT5zZXRQaXhlbEJ1ZmZlcigwKTsKKyAgICAgIHNlcnZlciA9IDA7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBWTkNTZXJ2ZXIqIHNlcnZlcjsKKyAgICBNYW5hZ2VkUGl4ZWxCdWZmZXIqIGJ1ZmZlcjsKKyAgfTsKKworfTsKKworI2VuZGlmIC8vIF9fUkZCX1NERVNLVE9QX0hfXwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9TRlRNc2dSZWFkZXIuY3h4IGIvY29tbW9uL3JmYi9TRlRNc2dSZWFkZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzg3YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NGVE1zZ1JlYWRlci5jeHgKQEAgLTAsMCArMSwyMDEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIFNGVE1zZ1JlYWRlci5jeHgKKworI2luY2x1ZGUgPHJmYi9TRlRNc2dSZWFkZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworU0ZUTXNnUmVhZGVyOjpTRlRNc2dSZWFkZXIocmRyOjpJblN0cmVhbSAqcElTKQoreworICBtX3BJUyA9IHBJUzsKK30KKworU0ZUTXNnUmVhZGVyOjp+U0ZUTXNnUmVhZGVyKCkKK3sKK30KKyAgICAKK2Jvb2wgCitTRlRNc2dSZWFkZXI6OnJlYWRGaWxlTGlzdFJxc3QodW5zaWduZWQgaW50ICpwRGlyTmFtZVNpemUsIGNoYXIgKnBEaXJOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnBGbGFncykKK3sKKyAgKnBGbGFncyA9IG1fcElTLT5yZWFkVTgoKTsKKyAgdW5zaWduZWQgaW50IGRpck5hbWVTaXplID0gbV9wSVMtPnJlYWRVMTYoKTsKKworICBpZiAoZGlyTmFtZVNpemUgPj0gRlRfRklMRU5BTUVfU0laRSkgeworICAgIG1fcElTLT5za2lwKGRpck5hbWVTaXplKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgbV9wSVMtPnJlYWRCeXRlcyhwRGlyTmFtZSwgZGlyTmFtZVNpemUpOworICAgICpwRGlyTmFtZVNpemUgPSBkaXJOYW1lU2l6ZTsKKyAgICBwRGlyTmFtZVtkaXJOYW1lU2l6ZV0gPSAnXDAnOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisgICAgCitib29sIAorU0ZUTXNnUmVhZGVyOjpyZWFkRmlsZURvd25sb2FkUnFzdCh1bnNpZ25lZCBpbnQgKnBGaWxlbmFtZVNpemUsIGNoYXIgKnBGaWxlbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcFBvc2l0aW9uKQoreworICB1bnNpZ25lZCBjaGFyIGNvbXByZXNzZWRMZXZlbCA9IDA7CisgIHJldHVybiByZWFkVThVMTZVMzJTdHJpbmdNc2coJmNvbXByZXNzZWRMZXZlbCwgcEZpbGVuYW1lU2l6ZSwgcFBvc2l0aW9uLCBwRmlsZW5hbWUpOworfQorCitib29sIAorU0ZUTXNnUmVhZGVyOjpyZWFkRmlsZVVwbG9hZFJxc3QodW5zaWduZWQgaW50ICpwRmlsZW5hbWVTaXplLCBjaGFyICpwRmlsZW5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwUG9zaXRpb24pCit7CisgIHVuc2lnbmVkIGNoYXIgY29tcHJlc3NlZExldmVsID0gMDsKKyAgcmV0dXJuIHJlYWRVOFUxNlUzMlN0cmluZ01zZygmY29tcHJlc3NlZExldmVsLCBwRmlsZW5hbWVTaXplLCBwUG9zaXRpb24sIHBGaWxlbmFtZSk7Cit9CisgICAgCitjaGFyICoKK1NGVE1zZ1JlYWRlcjo6cmVhZEZpbGVVcGxvYWREYXRhKHVuc2lnbmVkIGludCAqcERhdGFTaXplLCB1bnNpZ25lZCBpbnQgKnBNb2RUaW1lKQoreworICB1bnNpZ25lZCBjaGFyIGNvbXByZXNzZWRMZXZlbCA9IG1fcElTLT5yZWFkVTgoKTsKKyAgdW5zaWduZWQgaW50IHJlYWxTaXplID0gbV9wSVMtPnJlYWRVMTYoKTsKKyAgdW5zaWduZWQgaW50IGNvbXByZXNzZWRTaXplID0gbV9wSVMtPnJlYWRVMTYoKTsKKworICBpZiAoKHJlYWxTaXplID09IDApICYmIChjb21wcmVzc2VkU2l6ZSA9PSAwKSkgeworICAgICpwRGF0YVNpemUgPSAwOworICAgICpwTW9kVGltZSA9IG1fcElTLT5yZWFkVTMyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgY2hhciAqcERhdGEgPSBuZXcgY2hhciBbY29tcHJlc3NlZFNpemVdOworICAgIG1fcElTLT5yZWFkQnl0ZXMocERhdGEsIGNvbXByZXNzZWRTaXplKTsKKyAgICAqcERhdGFTaXplID0gY29tcHJlc3NlZFNpemU7CisgICAgKnBNb2RUaW1lID0gMDsKKyAgICByZXR1cm4gcERhdGE7CisgIH0KK30KKyAgICAKK2Jvb2wgCitTRlRNc2dSZWFkZXI6OnJlYWRGaWxlQ3JlYXRlRGlyUnFzdCh1bnNpZ25lZCBpbnQgKnBEaXJOYW1lU2l6ZSwgY2hhciAqcERpck5hbWUpCit7CisgIHJldHVybiByZWFkVThVMTZTdHJpbmdNc2cocERpck5hbWVTaXplLCBwRGlyTmFtZSk7Cit9CisKK2Jvb2wgCitTRlRNc2dSZWFkZXI6OnJlYWRGaWxlRGlyU2l6ZVJxc3QodW5zaWduZWQgaW50ICpwRGlyTmFtZVNpemUsIGNoYXIgKnBEaXJOYW1lKQoreworICByZXR1cm4gcmVhZFU4VTE2U3RyaW5nTXNnKHBEaXJOYW1lU2l6ZSwgcERpck5hbWUpOworfQorCitib29sIAorU0ZUTXNnUmVhZGVyOjpyZWFkRmlsZURlbGV0ZVJxc3QodW5zaWduZWQgaW50ICpwTmFtZVNpemUsIGNoYXIgKnBOYW1lKQoreworICByZXR1cm4gcmVhZFU4VTE2U3RyaW5nTXNnKHBOYW1lU2l6ZSwgcE5hbWUpOworfQorICAgIAorYm9vbCAKK1NGVE1zZ1JlYWRlcjo6cmVhZEZpbGVSZW5hbWVScXN0KHVuc2lnbmVkIGludCAqcE9sZE5hbWVTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcE5ld05hbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcE9sZE5hbWUsIGNoYXIgKnBOZXdOYW1lKQoreworICBtX3BJUy0+c2tpcCgxKTsKKworICB1bnNpZ25lZCBpbnQgb2xkTmFtZVNpemUgPSBtX3BJUy0+cmVhZFUxNigpOworICB1bnNpZ25lZCBpbnQgbmV3TmFtZVNpemUgPSBtX3BJUy0+cmVhZFUxNigpOworCisgIGlmICgob2xkTmFtZVNpemUgPj0gKnBPbGROYW1lU2l6ZSkgfHwgKG5ld05hbWVTaXplID49ICpwTmV3TmFtZVNpemUpKSB7CisgICAgbV9wSVMtPnNraXAob2xkTmFtZVNpemUpOworICAgIG1fcElTLT5za2lwKG5ld05hbWVTaXplKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAob2xkTmFtZVNpemUgIT0gMCkgeworICAgIG1fcElTLT5yZWFkQnl0ZXMocE9sZE5hbWUsIG9sZE5hbWVTaXplKTsKKyAgICBwT2xkTmFtZVtvbGROYW1lU2l6ZV0gPSAnXDAnOworICAgICpwT2xkTmFtZVNpemUgPSBvbGROYW1lU2l6ZTsKKyAgfSBlbHNlIHsKKyAgICAqcE9sZE5hbWVTaXplID0gMDsKKyAgICBwT2xkTmFtZVswXSA9ICdcMCc7CisgIH0KKworICBpZiAobmV3TmFtZVNpemUgIT0gMCkgeworICAgIG1fcElTLT5yZWFkQnl0ZXMocE5ld05hbWUsIG5ld05hbWVTaXplKTsKKyAgICBwTmV3TmFtZVtuZXdOYW1lU2l6ZV0gPSAnXDAnOworICB9IGVsc2UgeworICAgICpwTmV3TmFtZVNpemUgPSAwOworICAgIHBOZXdOYW1lWzBdID0gJ1wwJzsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sCitTRlRNc2dSZWFkZXI6OnJlYWRGaWxlRG93bmxvYWRDYW5jZWwodW5zaWduZWQgaW50ICpwUmVhc29uU2l6ZSwgY2hhciAqcFJlYXNvbikKK3sKKyAgcmV0dXJuIHJlYWRVOFUxNlN0cmluZ01zZyhwUmVhc29uU2l6ZSwgcFJlYXNvbik7Cit9CisKK2Jvb2wKK1NGVE1zZ1JlYWRlcjo6cmVhZEZpbGVVcGxvYWRGYWlsZWQodW5zaWduZWQgaW50ICpwUmVhc29uU2l6ZSwgY2hhciAqcFJlYXNvbikKK3sKKyAgcmV0dXJuIHJlYWRVOFUxNlN0cmluZ01zZyhwUmVhc29uU2l6ZSwgcFJlYXNvbik7Cit9CisKK2Jvb2wgCitTRlRNc2dSZWFkZXI6OnJlYWRVOFUxNlN0cmluZ01zZyh1bnNpZ25lZCBpbnQgKnBSZWFzb25TaXplLCBjaGFyICpwUmVhc29uKQoreworICBtX3BJUy0+c2tpcCgxKTsKKyAgdW5zaWduZWQgaW50IHJlYXNvblNpemUgPSBtX3BJUy0+cmVhZFUxNigpOworCisgIGlmIChyZWFzb25TaXplID49IEZUX0ZJTEVOQU1FX1NJWkUpIHsKKyAgICBtX3BJUy0+c2tpcChyZWFzb25TaXplKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgaWYgKHJlYXNvblNpemUgPT0gMCkgeworICAgICAgcFJlYXNvblswXSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcElTLT5yZWFkQnl0ZXMocFJlYXNvbiwgcmVhc29uU2l6ZSk7CisgICAgICBwUmVhc29uW3JlYXNvblNpemVdID0gJ1wwJzsKKyAgICB9CisgICAgICAqcFJlYXNvblNpemUgPSByZWFzb25TaXplOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2Jvb2wgCitTRlRNc2dSZWFkZXI6OnJlYWRVOFUxNlUzMlN0cmluZ01zZyh1bnNpZ25lZCBjaGFyICpwVTgsIHVuc2lnbmVkIGludCAqcFUxNiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnBVMzIsIGNoYXIgKnBTdHJpbmcpCit7CisgICpwVTggPSBtX3BJUy0+cmVhZFU4KCk7CisgIHVuc2lnbmVkIGludCBzdHJTaXplID0gbV9wSVMtPnJlYWRVMTYoKTsKKyAgKnBVMzIgPSBtX3BJUy0+cmVhZFUzMigpOworCisgIGlmIChzdHJTaXplID49IEZUX0ZJTEVOQU1FX1NJWkUpIHsKKyAgICBtX3BJUy0+c2tpcChzdHJTaXplKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgKnBVMTYgPSBzdHJTaXplOworICAgIGlmIChzdHJTaXplID09IDApIHsKKyAgICAgIHBTdHJpbmdbMF0gPSAnXDAnOworICAgIH0gZWxzZSB7CisgICAgICBtX3BJUy0+cmVhZEJ5dGVzKHBTdHJpbmcsIHN0clNpemUpOworICAgICAgcFN0cmluZ1tzdHJTaXplXSA9ICdcMCc7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1NGVE1zZ1JlYWRlci5oIGIvY29tbW9uL3JmYi9TRlRNc2dSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmFjODY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9TRlRNc2dSZWFkZXIuaApAQCAtMCwwICsxLDcxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGlnaHRWTkMgVGVhbS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGJ5IERlbm5pcyBTeXJvdmF0c2t5LgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqCisgKiBUaWdodFZOQyBkaXN0cmlidXRpb24gaG9tZXBhZ2Ugb24gdGhlIFdlYjogaHR0cDovL3d3dy50aWdodHZuYy5jb20vCisgKgorICovCisKKy8vIC09LSBTRlRNc2dSZWFkZXIuaAorCisjaWZuZGVmIF9fUkZCX1NGVE1TR1JFQURFUl9IX18KKyNkZWZpbmUgX19SRkJfU0ZUTVNHUkVBREVSX0hfXworCisjaW5jbHVkZSA8cmRyL0luU3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL2Z0dHlwZXMuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIFNGVE1zZ1JlYWRlcgorICB7CisgIHB1YmxpYzoKKyAgICBTRlRNc2dSZWFkZXIocmRyOjpJblN0cmVhbSAqcElTKTsKKyAgICB+U0ZUTXNnUmVhZGVyKCk7CisgICAgCisgICAgYm9vbCByZWFkRmlsZUxpc3RScXN0KHVuc2lnbmVkIGludCAqcERpck5hbWVTaXplLCBjaGFyICpwRGlyTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcEZsYWdzKTsKKyAgICAKKyAgICAKKyAgICBib29sIHJlYWRGaWxlRG93bmxvYWRScXN0KHVuc2lnbmVkIGludCAqcEZpbGVuYW1lU2l6ZSwgY2hhciAqcEZpbGVuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcFBvc2l0aW9uKTsKKworICAgIGJvb2wgcmVhZEZpbGVVcGxvYWRScXN0KHVuc2lnbmVkIGludCAqcEZpbGVuYW1lU2l6ZSwgY2hhciAqcEZpbGVuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnBQb3NpdGlvbik7CisgICAgCisgICAgY2hhciAqcmVhZEZpbGVVcGxvYWREYXRhKHVuc2lnbmVkIGludCAqcERhdGFTaXplLCB1bnNpZ25lZCBpbnQgKnBNb2RUaW1lKTsKKworICAgIAorICAgIGJvb2wgcmVhZEZpbGVDcmVhdGVEaXJScXN0KHVuc2lnbmVkIGludCAqcERpck5hbWVTaXplLCBjaGFyICpwRGlyTmFtZSk7CisgICAgYm9vbCByZWFkRmlsZURpclNpemVScXN0KHVuc2lnbmVkIGludCAqcERpck5hbWVTaXplLCBjaGFyICpwRGlyTmFtZSk7CisgICAgYm9vbCByZWFkRmlsZURlbGV0ZVJxc3QodW5zaWduZWQgaW50ICpwTmFtZVNpemUsIGNoYXIgKnBOYW1lKTsKKyAgICAKKyAgICBib29sIHJlYWRGaWxlUmVuYW1lUnFzdCh1bnNpZ25lZCBpbnQgKnBPbGROYW1lU2l6ZSwgdW5zaWduZWQgaW50ICpwTmV3TmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcE9sZE5hbWUsIGNoYXIgKnBOZXdOYW1lKTsKKworICAgIGJvb2wgcmVhZEZpbGVEb3dubG9hZENhbmNlbCh1bnNpZ25lZCBpbnQgKnBSZWFzb25TaXplLCBjaGFyICpwUmVhc29uKTsKKyAgICBib29sIHJlYWRGaWxlVXBsb2FkRmFpbGVkKHVuc2lnbmVkIGludCAqcFJlYXNvblNpemUsIGNoYXIgKnBSZWFzb24pOworCisgIHByaXZhdGU6CisgICAgcmRyOjpJblN0cmVhbSAqbV9wSVM7CisKKyAgICBib29sIHJlYWRVOFUxNlN0cmluZ01zZyh1bnNpZ25lZCBpbnQgKnBSZWFzb25TaXplLCBjaGFyICpwUmVhc29uKTsKKyAgICBib29sIHJlYWRVOFUxNlUzMlN0cmluZ01zZyh1bnNpZ25lZCBjaGFyICpwVTgsIHVuc2lnbmVkIGludCAqcFUxNiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwVTMyLCBjaGFyICpwU3RyaW5nKTsKKyAgfTsKK30KKworI2VuZGlmIC8vIF9fUkZCX1NGVE1TR1JFQURFUl9IX18KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU0ZUTXNnV3JpdGVyLmN4eCBiL2NvbW1vbi9yZmIvU0ZUTXNnV3JpdGVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTZhODJmCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9TRlRNc2dXcml0ZXIuY3h4CkBAIC0wLDAgKzEsMTUyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGlnaHRWTkMgVGVhbS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGJ5IERlbm5pcyBTeXJvdmF0c2t5LgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqCisgKiBUaWdodFZOQyBkaXN0cmlidXRpb24gaG9tZXBhZ2Ugb24gdGhlIFdlYjogaHR0cDovL3d3dy50aWdodHZuYy5jb20vCisgKgorICovCisKKy8vIC09LSBTRlRNc2dXcml0ZXIuY3h4CisKKyNpbmNsdWRlIDxyZmIvU0ZUTXNnV3JpdGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK1NGVE1zZ1dyaXRlcjo6U0ZUTXNnV3JpdGVyKHJkcjo6T3V0U3RyZWFtICpwT1MpCit7CisgIG1fcE9TID0gcE9TOworfQorCitTRlRNc2dXcml0ZXI6On5TRlRNc2dXcml0ZXIoKQoreworfQorICAgIAorYm9vbCAKK1NGVE1zZ1dyaXRlcjo6d3JpdGVGaWxlTGlzdERhdGEodW5zaWduZWQgY2hhciBmbGFncywgcmZiOjpGaWxlSW5mbyAqcEZpbGVJbmZvKQoreworICB1bnNpZ25lZCBpbnQgbnVtRmlsZXMgPSBwRmlsZUluZm8tPmdldE51bUVudHJpZXMoKTsKKworICBtX3BPUy0+d3JpdGVVOChtc2dUeXBlRmlsZUxpc3REYXRhKTsKKyAgbV9wT1MtPndyaXRlVTgoZmxhZ3MpOworICBtX3BPUy0+d3JpdGVVMTYobnVtRmlsZXMpOworICAKKyAgaWYgKG51bUZpbGVzID09IDApIHsKKyAgICBtX3BPUy0+d3JpdGVVMTYoMCk7CisgICAgbV9wT1MtPndyaXRlVTE2KDApOworICB9IGVsc2UgeworICAgIHVuc2lnbmVkIGludCBmaWxlbmFtZXNTaXplID0gcEZpbGVJbmZvLT5nZXRGaWxlbmFtZXNTaXplKCkgKyBudW1GaWxlczsKKworICAgIG1fcE9TLT53cml0ZVUxNihmaWxlbmFtZXNTaXplKTsKKyAgICBtX3BPUy0+d3JpdGVVMTYoZmlsZW5hbWVzU2l6ZSk7CisKKyAgICBjaGFyICpwRmlsZW5hbWVzID0gbmV3IGNoYXIgW2ZpbGVuYW1lc1NpemVdOworICAgIHVuc2lnbmVkIGludCBwb3MgPSAwOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBudW1GaWxlczsgaSsrKSB7CisgICAgICBjaGFyICpwTmFtZSA9IHBGaWxlSW5mby0+Z2V0TmFtZUF0KGkpOworICAgICAgdW5zaWduZWQgaW50IGxlbiA9IHN0cmxlbihwTmFtZSk7CisKKyAgICAgIG1lbWNweSgodm9pZCAqKSZwRmlsZW5hbWVzW3Bvc10sIHBOYW1lLCBsZW4gKyAxKTsKKyAgICAgIHBvcyArPSAobGVuICsgMSk7CisKKyAgICAgIGlmIChwRmlsZUluZm8tPmdldEZsYWdzQXQoaSkgJiBGVF9BVFRSX0RJUikgeworICAgICAgICBtX3BPUy0+d3JpdGVVMzIoRlRfTkVUX0FUVFJfRElSKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fcE9TLT53cml0ZVUzMihwRmlsZUluZm8tPmdldFNpemVBdChpKSk7CisgICAgICB9CisgICAgICBtX3BPUy0+d3JpdGVVMzIocEZpbGVJbmZvLT5nZXREYXRhQXQoaSkpOworICAgIH0KKworICAgIG1fcE9TLT53cml0ZUJ5dGVzKHBGaWxlbmFtZXMsIGZpbGVuYW1lc1NpemUpOworCisgICAgZGVsZXRlIFtdIHBGaWxlbmFtZXM7CisgIH0KKworICBtX3BPUy0+Zmx1c2goKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCAKK1NGVE1zZ1dyaXRlcjo6d3JpdGVGaWxlRG93bmxvYWREYXRhKHVuc2lnbmVkIGludCBkYXRhU2l6ZSwgdm9pZCAqcERhdGEpCit7CisgIG1fcE9TLT53cml0ZVU4KG1zZ1R5cGVGaWxlRG93bmxvYWREYXRhKTsKKyAgbV9wT1MtPndyaXRlVTgoMCk7CisgIG1fcE9TLT53cml0ZVUxNihkYXRhU2l6ZSk7CisgIG1fcE9TLT53cml0ZVUxNihkYXRhU2l6ZSk7CisgIG1fcE9TLT53cml0ZUJ5dGVzKHBEYXRhLCBkYXRhU2l6ZSk7CisgIG1fcE9TLT5mbHVzaCgpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCAKK1NGVE1zZ1dyaXRlcjo6d3JpdGVGaWxlRG93bmxvYWREYXRhKHVuc2lnbmVkIGludCBtb2RUaW1lKQoreworICBtX3BPUy0+d3JpdGVVOChtc2dUeXBlRmlsZURvd25sb2FkRGF0YSk7CisgIG1fcE9TLT53cml0ZVU4KDApOworICBtX3BPUy0+d3JpdGVVMTYoMCk7CisgIG1fcE9TLT53cml0ZVUxNigwKTsKKyAgbV9wT1MtPndyaXRlVTMyKG1vZFRpbWUpOworICBtX3BPUy0+Zmx1c2goKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK1NGVE1zZ1dyaXRlcjo6d3JpdGVGaWxlVXBsb2FkQ2FuY2VsKHVuc2lnbmVkIGludCByZWFzb25MZW4sIGNoYXIgKnBSZWFzb24pCit7CisgIG1fcE9TLT53cml0ZVU4KG1zZ1R5cGVGaWxlVXBsb2FkQ2FuY2VsKTsKKyAgcmV0dXJuIHdyaXRlVThVMTZTdHJpbmdNc2coMCwgcmVhc29uTGVuLCBwUmVhc29uKTsKK30KKworYm9vbCAKK1NGVE1zZ1dyaXRlcjo6d3JpdGVGaWxlRG93bmxvYWRGYWlsZWQodW5zaWduZWQgaW50IHJlYXNvbkxlbiwgY2hhciAqcFJlYXNvbikKK3sKKyAgbV9wT1MtPndyaXRlVTgobXNnVHlwZUZpbGVEb3dubG9hZEZhaWxlZCk7CisgIHJldHVybiB3cml0ZVU4VTE2U3RyaW5nTXNnKDAsIHJlYXNvbkxlbiwgcFJlYXNvbik7Cit9CisKK2Jvb2wgCitTRlRNc2dXcml0ZXI6OndyaXRlRmlsZURpclNpemVEYXRhKHVuc2lnbmVkIGludCBkaXJTaXplTG93LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGlyU2l6ZUhpZ2gpCit7CisgIG1fcE9TLT53cml0ZVU4KG1zZ1R5cGVGaWxlRGlyU2l6ZURhdGEpOworICBtX3BPUy0+d3JpdGVVOCgwKTsKKyAgbV9wT1MtPndyaXRlVTE2KGRpclNpemVIaWdoKTsKKyAgbV9wT1MtPndyaXRlVTMyKGRpclNpemVMb3cpOworICBtX3BPUy0+Zmx1c2goKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgCitTRlRNc2dXcml0ZXI6OndyaXRlRmlsZUxhc3RScXN0RmFpbGVkKHVuc2lnbmVkIGNoYXIgbGFzdFJlcXVlc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByZWFzb25MZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBSZWFzb24pCit7CisgIG1fcE9TLT53cml0ZVU4KG1zZ1R5cGVGaWxlTGFzdFJlcXVlc3RGYWlsZWQpOworICByZXR1cm4gd3JpdGVVOFUxNlN0cmluZ01zZyhsYXN0UmVxdWVzdCwgcmVhc29uTGVuLCBwUmVhc29uKTsKK30KKworYm9vbAorU0ZUTXNnV3JpdGVyOjp3cml0ZVU4VTE2U3RyaW5nTXNnKHVuc2lnbmVkIGNoYXIgcDEsIHVuc2lnbmVkIHNob3J0IHAyLCBjaGFyICpwUDMpCit7CisgIG1fcE9TLT53cml0ZVU4KHAxKTsKKyAgbV9wT1MtPndyaXRlVTE2KHAyKTsKKyAgbV9wT1MtPndyaXRlQnl0ZXMocFAzLCBwMik7CisgIG1fcE9TLT5mbHVzaCgpOworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU0ZUTXNnV3JpdGVyLmggYi9jb21tb24vcmZiL1NGVE1zZ1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YmVhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NGVE1zZ1dyaXRlci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIFNGVE1zZ1dyaXRlci5oCisKKyNpZm5kZWYgX19SRkJfU0ZUTVNHV1JJVEVSX0hfXworI2RlZmluZSBfX1JGQl9TRlRNU0dXUklURVJfSF9fCisKKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL0ZpbGVJbmZvLmg+CisjaW5jbHVkZSA8cmZiL21zZ1R5cGVzLmg+CisKK25hbWVzcGFjZSByZmIgeworICBjbGFzcyBTRlRNc2dXcml0ZXIKKyAgeworICBwdWJsaWM6CisgICAgU0ZUTXNnV3JpdGVyKHJkcjo6T3V0U3RyZWFtICpwT1MpOworICAgIH5TRlRNc2dXcml0ZXIoKTsKKyAgICAKKyAgICBib29sIHdyaXRlRmlsZUxpc3REYXRhKHVuc2lnbmVkIGNoYXIgZmxhZ3MsIHJmYjo6RmlsZUluZm8gKnBGaWxlSW5mbyk7CisgICAgYm9vbCB3cml0ZUZpbGVEb3dubG9hZERhdGEodW5zaWduZWQgaW50IGRhdGFTaXplLCB2b2lkICpwRGF0YSk7CisgICAgYm9vbCB3cml0ZUZpbGVEb3dubG9hZERhdGEodW5zaWduZWQgaW50IG1vZFRpbWUpOworICAgIGJvb2wgd3JpdGVGaWxlVXBsb2FkQ2FuY2VsKHVuc2lnbmVkIGludCByZWFzb25MZW4sIGNoYXIgKnBSZWFzb24pOworICAgIGJvb2wgd3JpdGVGaWxlRG93bmxvYWRGYWlsZWQodW5zaWduZWQgaW50IHJlYXNvbkxlbiwgY2hhciAqcFJlYXNvbik7CisgICAgYm9vbCB3cml0ZUZpbGVEaXJTaXplRGF0YSh1bnNpZ25lZCBpbnQgZGlyU2l6ZUxvdywgdW5zaWduZWQgc2hvcnQgZGlyU2l6ZUhpZ2gpOworICAgIGJvb2wgd3JpdGVGaWxlTGFzdFJxc3RGYWlsZWQodW5zaWduZWQgY2hhciBsYXN0UmVxdWVzdCwgdW5zaWduZWQgc2hvcnQgcmVhc29uTGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBSZWFzb24pOworCisgIHByaXZhdGU6CisgICAgcmRyOjpPdXRTdHJlYW0gKm1fcE9TOworCisgICAgYm9vbCB3cml0ZVU4VTE2U3RyaW5nTXNnKHVuc2lnbmVkIGNoYXIgcDEsIHVuc2lnbmVkIHNob3J0IHAyLCBjaGFyICpwUDMpOworICB9OworfQorCisjZW5kaWYgLy8gX19SRkJfU0ZUTVNHV1JJVEVSX0hfXwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9TRmlsZVRyYW5zZmVyLmN4eCBiL2NvbW1vbi9yZmIvU0ZpbGVUcmFuc2Zlci5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3ZTUwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvU0ZpbGVUcmFuc2Zlci5jeHgKQEAgLTAsMCArMSwzMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNiBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogRGV2ZWxvcGVkIGJ5IERlbm5pcyBTeXJvdmF0c2t5CisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKgorICogVGlnaHRWTkMgZGlzdHJpYnV0aW9uIGhvbWVwYWdlIG9uIHRoZSBXZWI6IGh0dHA6Ly93d3cudGlnaHR2bmMuY29tLworICoKKyAqLworCisvLyAtPS0gU0ZpbGVUcmFuc2Zlci5jeHgKKworI2luY2x1ZGUgPHJmYi9tc2dUeXBlcy5oPgorI2luY2x1ZGUgPHJmYi9TRmlsZVRyYW5zZmVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK1NGaWxlVHJhbnNmZXI6OlNGaWxlVHJhbnNmZXIobmV0d29yazo6U29ja2V0ICpzb2NrKSA6IAorICBtX2JVcGxvYWRTdGFydGVkKGZhbHNlKSwgbV9iRG93bmxvYWRTdGFydGVkKGZhbHNlKSwKKyAgbV9yZWFkZXIoJnNvY2stPmluU3RyZWFtKCkpLCBtX3dyaXRlcigmc29jay0+b3V0U3RyZWFtKCkpLCBtX3BTb2NrZXQoc29jaykKK3sKK30KKworU0ZpbGVUcmFuc2Zlcjo6flNGaWxlVHJhbnNmZXIoKQoreworfQorCitib29sCitTRmlsZVRyYW5zZmVyOjpwcm9jZXNzTWVzc2FnZXMoaW50IHR5cGUpCit7CisgIHN3aXRjaCh0eXBlKQorICB7CisgICAgY2FzZSBtc2dUeXBlRmlsZUxpc3RSZXF1ZXN0OgorICAgICAgcmV0dXJuIHByb2Nlc3NGaWxlTGlzdFJlcXVlc3QoKTsKKyAgICBjYXNlIG1zZ1R5cGVGaWxlRG93bmxvYWRSZXF1ZXN0OgorICAgICAgcmV0dXJuIHByb2Nlc3NGaWxlRG93bmxvYWRSZXF1ZXN0KCk7CisgICAgY2FzZSBtc2dUeXBlRmlsZVVwbG9hZFJlcXVlc3Q6CisgICAgICByZXR1cm4gcHJvY2Vzc0ZpbGVVcGxvYWRSZXF1ZXN0KCk7CisgICAgY2FzZSBtc2dUeXBlRmlsZVVwbG9hZERhdGE6CisgICAgICByZXR1cm4gcHJvY2Vzc0ZpbGVVcGxvYWREYXRhKCk7CisgICAgY2FzZSBtc2dUeXBlRmlsZURvd25sb2FkQ2FuY2VsOgorICAgICAgcmV0dXJuIHByb2Nlc3NGaWxlRG93bmxvYWRDYW5jZWwoKTsKKyAgICBjYXNlIG1zZ1R5cGVGaWxlVXBsb2FkRmFpbGVkOgorICAgICAgcmV0dXJuIHByb2Nlc3NGaWxlVXBsb2FkRmFpbGVkKCk7CisgICAgY2FzZSBtc2dUeXBlRmlsZUNyZWF0ZURpclJlcXVlc3Q6CisgICAgICByZXR1cm4gcHJvY2Vzc0ZpbGVDcmVhdGVEaXJSZXF1ZXN0KCk7CisgICAgY2FzZSBtc2dUeXBlRmlsZURpclNpemVSZXF1ZXN0OgorICAgICAgcmV0dXJuIHByb2Nlc3NGaWxlRGlyU2l6ZVJlcXVlc3QoKTsKKyAgICBjYXNlIG1zZ1R5cGVGaWxlUmVuYW1lUmVxdWVzdDoKKyAgICAgIHJldHVybiBwcm9jZXNzRmlsZVJlbmFtZVJlcXVlc3QoKTsKKyAgICBjYXNlIG1zZ1R5cGVGaWxlRGVsZXRlUmVxdWVzdDoKKyAgICAgIHJldHVybiBwcm9jZXNzRmlsZURlbGV0ZVJlcXVlc3QoKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgCitTRmlsZVRyYW5zZmVyOjpwcm9jZXNzRmlsZUxpc3RSZXF1ZXN0KCkKK3sKKyAgY2hhciBzekRpck5hbWVbRlRfRklMRU5BTUVfU0laRV0gPSB7MH07CisgIHVuc2lnbmVkIGludCBkaXJOYW1lU2l6ZSA9IEZUX0ZJTEVOQU1FX1NJWkU7CisgIHVuc2lnbmVkIGludCBmbGFncyA9IDA7CisKKyAgaWYgKCFtX3JlYWRlci5yZWFkRmlsZUxpc3RScXN0KCZkaXJOYW1lU2l6ZSwgc3pEaXJOYW1lLCAmZmxhZ3MpKSByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFjb252ZXJ0UGF0aEZyb21OZXQoc3pEaXJOYW1lKSkgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgYkRpck9ubHkgPSBmYWxzZTsKKyAgaWYgKGZsYWdzICYgMHgxMCkgYkRpck9ubHkgPSB0cnVlOworCisgIEZpbGVJbmZvIGZpOworICBpZiAoIW1ha2VGaWxlTGlzdChzekRpck5hbWUsICZmaSwgYkRpck9ubHkpKSB7CisgICAgZmxhZ3MgPSAoZmxhZ3MgfCAweDgwKTsgIAorICB9CisgIHJldHVybiBtX3dyaXRlci53cml0ZUZpbGVMaXN0RGF0YSgodW5zaWduZWQgY2hhcilmbGFncywgJmZpKTsKK30KKworYm9vbCAKK1NGaWxlVHJhbnNmZXI6OnByb2Nlc3NGaWxlRG93bmxvYWRSZXF1ZXN0KCkKK3sKKyAgY2hhciBzek5hbWVbRlRfRklMRU5BTUVfU0laRV0gPSB7MH07CisgIHVuc2lnbmVkIGludCBuYW1lU2l6ZSA9IEZUX0ZJTEVOQU1FX1NJWkU7CisgIHVuc2lnbmVkIGludCBwb3NpdGlvbiA9IDA7CisKKyAgaWYgKCFtX3JlYWRlci5yZWFkRmlsZURvd25sb2FkUnFzdCgmbmFtZVNpemUsIHN6TmFtZSwgJnBvc2l0aW9uKSkgcmV0dXJuIGZhbHNlOworCisgIGlmICghY29udmVydFBhdGhGcm9tTmV0KHN6TmFtZSkpIHJldHVybiBmYWxzZTsKKworICBpZiAobV9iRG93bmxvYWRTdGFydGVkKSB7CisgICAgY2hhciByZWFzb25bXSA9ICJUaGUgZG93bmxvYWQgaXMgYWxyZWFkeSBzdGFydGVkIjsKKyAgICBtX3dyaXRlci53cml0ZUZpbGVMYXN0UnFzdEZhaWxlZChtc2dUeXBlRmlsZURvd25sb2FkUmVxdWVzdCwgc3RybGVuKHJlYXNvbiksIHJlYXNvbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFtX2ZpbGVSZWFkZXIuY3JlYXRlKHN6TmFtZSkpIHJldHVybiBmYWxzZTsKKworICBtX2JEb3dubG9hZFN0YXJ0ZWQgPSB0cnVlOworCisgIHNlbmRGaWxlRG93bmxvYWRQb3J0aW9uKCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK1NGaWxlVHJhbnNmZXI6OnNlbmRGaWxlRG93bmxvYWRQb3J0aW9uKCkKK3sKKyAgY2hhciBidWZmZXJbRlRfTUFYX1NFTkRJTkdfU0laRV07CisgIHVuc2lnbmVkIGludCBieXRlc1JlYWQgPSAwOworCisgIGlmIChtX2ZpbGVSZWFkZXIucmVhZCgodm9pZCAqKWJ1ZmZlciwgRlRfTUFYX1NFTkRJTkdfU0laRSwgJmJ5dGVzUmVhZCkpIHsKKyAgICBpZiAoYnl0ZXNSZWFkID09IDApIHsKKyAgICAgIG1fd3JpdGVyLndyaXRlRmlsZURvd25sb2FkRGF0YShtX2ZpbGVSZWFkZXIuZ2V0VGltZSgpKTsKKyAgICAgIG1fZmlsZVJlYWRlci5jbG9zZSgpOworICAgICAgbV9iRG93bmxvYWRTdGFydGVkID0gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgbV93cml0ZXIud3JpdGVGaWxlRG93bmxvYWREYXRhKGJ5dGVzUmVhZCwgYnVmZmVyKTsKKyAgICAgIHJldHVybiBpbml0RG93bmxvYWRDYWxsYmFjaygpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjaGFyIHJlYXNvbltdID0gIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIjsKKyAgICBtX3dyaXRlci53cml0ZUZpbGVEb3dubG9hZEZhaWxlZChzdHJsZW4ocmVhc29uKSwgcmVhc29uKTsKKyAgICBtX2ZpbGVSZWFkZXIuY2xvc2UoKTsKKyAgICBtX2JEb3dubG9hZFN0YXJ0ZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitib29sIAorU0ZpbGVUcmFuc2Zlcjo6cHJvY2Vzc0ZpbGVVcGxvYWRSZXF1ZXN0KCkKK3sKKyAgY2hhciBzek5hbWVbRlRfRklMRU5BTUVfU0laRV0gPSB7MH07CisgIHVuc2lnbmVkIGludCBuYW1lU2l6ZSA9IEZUX0ZJTEVOQU1FX1NJWkU7CisgIHVuc2lnbmVkIGludCBwb3NpdGlvbiA9IDA7CisKKyAgaWYgKCFtX3JlYWRlci5yZWFkRmlsZVVwbG9hZFJxc3QoJm5hbWVTaXplLCBzek5hbWUsICZwb3NpdGlvbikpIHJldHVybiBmYWxzZTsKKworICBpZiAoIWNvbnZlcnRQYXRoRnJvbU5ldChzek5hbWUpKSByZXR1cm4gZmFsc2U7CisKKyAgaWYgKG1fYlVwbG9hZFN0YXJ0ZWQpIHsKKyAgICBjaGFyIHJlYXNvbltdID0gIlRoZSB1cGxvYWQgaXMgYWxyZWFkeSBzdGFydGVkIjsKKyAgICBtX3dyaXRlci53cml0ZUZpbGVMYXN0UnFzdEZhaWxlZChtc2dUeXBlRmlsZVVwbG9hZFJlcXVlc3QsIHN0cmxlbihyZWFzb24pLCByZWFzb24pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghbV9maWxlV3JpdGVyLmNyZWF0ZShzek5hbWUpKSB7CisgICAgY2hhciByZWFzb25bXSA9ICJDYW4ndCBjcmVhdGUgbG9jYWwgZmlsZSI7CisgICAgbV93cml0ZXIud3JpdGVGaWxlTGFzdFJxc3RGYWlsZWQobXNnVHlwZUZpbGVVcGxvYWRSZXF1ZXN0LCBzdHJsZW4ocmVhc29uKSwgcmVhc29uKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIG1fYlVwbG9hZFN0YXJ0ZWQgPSB0cnVlOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIAorU0ZpbGVUcmFuc2Zlcjo6cHJvY2Vzc0ZpbGVVcGxvYWREYXRhKCkKK3sKKyAgdW5zaWduZWQgaW50IGRhdGFTaXplID0gMDsKKyAgdW5zaWduZWQgaW50IG1vZFRpbWUgPSAwOworCisgIGNoYXIgKnBVcGxvYWREYXRhID0gbV9yZWFkZXIucmVhZEZpbGVVcGxvYWREYXRhKCZkYXRhU2l6ZSwgJm1vZFRpbWUpOworCisgIGlmICghbV9iVXBsb2FkU3RhcnRlZCkgeworICAgICAgY2hhciByZWFzb25bXSA9ICJVcGxvYWQgaXMgaW1wb3NzaWJsZSI7CisgICAgICBtX3dyaXRlci53cml0ZUZpbGVVcGxvYWRDYW5jZWwoc3RybGVuKHJlYXNvbiksIHJlYXNvbik7CisgIH0gZWxzZSB7CisgICAgaWYgKHBVcGxvYWREYXRhID09IE5VTEwpIHsKKyAgICAgIGlmIChtb2RUaW1lID09IDApIHsKKyAgICAgICAgY2hhciByZWFzb25bXSA9ICJVcGxvYWQgZmFpbGVkIjsKKyAgICAgICAgbV93cml0ZXIud3JpdGVGaWxlVXBsb2FkQ2FuY2VsKHN0cmxlbihyZWFzb24pLCByZWFzb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9maWxlV3JpdGVyLnNldFRpbWUobW9kVGltZSk7CisgICAgICB9CisgICAgICBtX2ZpbGVXcml0ZXIuY2xvc2UoKTsKKyAgICAgIG1fYlVwbG9hZFN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgdW5zaWduZWQgaW50IGRhdGFXcml0dGVuID0gMDsKKyAgICAgIG1fZmlsZVdyaXRlci53cml0ZShwVXBsb2FkRGF0YSwgZGF0YVNpemUsICZkYXRhV3JpdHRlbik7CisgICAgICBpZiAoZGF0YVdyaXR0ZW4gIT0gZGF0YVNpemUpIHsKKyAgICAgICAgY2hhciByZWFzb25bXSA9ICJVcGxvYWQgZmFpbGVkIjsKKyAgICAgICAgbV93cml0ZXIud3JpdGVGaWxlVXBsb2FkQ2FuY2VsKHN0cmxlbihyZWFzb24pLCByZWFzb24pOworICAgICAgICBtX2ZpbGVXcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgbV9iVXBsb2FkU3RhcnRlZCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICBkZWxldGUgW10gcFVwbG9hZERhdGE7CisgIHJldHVybiB0cnVlOworfQorCitib29sIAorU0ZpbGVUcmFuc2Zlcjo6cHJvY2Vzc0ZpbGVEb3dubG9hZENhbmNlbCgpCit7CisgIGNoYXIgc3pSZWFzb25bRlRfRklMRU5BTUVfU0laRV0gPSB7MH07CisgIHVuc2lnbmVkIGludCByZWFzb25TaXplID0gRlRfRklMRU5BTUVfU0laRTsKKworICBpZiAoIW1fcmVhZGVyLnJlYWRGaWxlRG93bmxvYWRDYW5jZWwoJnJlYXNvblNpemUsIHN6UmVhc29uKSkgcmV0dXJuIGZhbHNlOworCisgIG1fZmlsZVJlYWRlci5jbG9zZSgpOworICBtX2JEb3dubG9hZFN0YXJ0ZWQgPSBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgCitTRmlsZVRyYW5zZmVyOjpwcm9jZXNzRmlsZVVwbG9hZEZhaWxlZCgpCit7CisgIGNoYXIgc3pSZWFzb25bRlRfRklMRU5BTUVfU0laRV0gPSB7MH07CisgIHVuc2lnbmVkIGludCByZWFzb25TaXplID0gRlRfRklMRU5BTUVfU0laRTsKKworICBpZiAoIW1fcmVhZGVyLnJlYWRGaWxlVXBsb2FkRmFpbGVkKCZyZWFzb25TaXplLCBzelJlYXNvbikpIHJldHVybiBmYWxzZTsKKworICBkZWxldGVJdChtX2ZpbGVXcml0ZXIuZ2V0RmlsZW5hbWUoKSk7CisgIG1fZmlsZVdyaXRlci5jbG9zZSgpOworICBtX2JVcGxvYWRTdGFydGVkID0gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCitib29sIAorU0ZpbGVUcmFuc2Zlcjo6cHJvY2Vzc0ZpbGVDcmVhdGVEaXJSZXF1ZXN0KCkKK3sKKyAgY2hhciBzek5hbWVbRlRfRklMRU5BTUVfU0laRV0gPSB7MH07CisgIHVuc2lnbmVkIGludCBuYW1lU2l6ZSA9IEZUX0ZJTEVOQU1FX1NJWkU7CisKKyAgaWYgKCFtX3JlYWRlci5yZWFkRmlsZUNyZWF0ZURpclJxc3QoJm5hbWVTaXplLCBzek5hbWUpKSByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFjb252ZXJ0UGF0aEZyb21OZXQoc3pOYW1lKSkgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiBjcmVhdGVEaXIoc3pOYW1lKTsKK30KKworYm9vbCAKK1NGaWxlVHJhbnNmZXI6OnByb2Nlc3NGaWxlRGlyU2l6ZVJlcXVlc3QoKQoreworICBjaGFyIHN6TmFtZVtGVF9GSUxFTkFNRV9TSVpFXSA9IHswfTsKKyAgdW5zaWduZWQgaW50IG5hbWVTaXplID0gRlRfRklMRU5BTUVfU0laRTsKKworICBpZiAoIW1fcmVhZGVyLnJlYWRGaWxlRGlyU2l6ZVJxc3QoJm5hbWVTaXplLCBzek5hbWUpKSByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFjb252ZXJ0UGF0aEZyb21OZXQoc3pOYW1lKSkgcmV0dXJuIGZhbHNlOworCisgIHVuc2lnbmVkIHNob3J0IGhpZ2hTaXplMTYgPSAwOworICB1bnNpZ25lZCBpbnQgbG93U2l6ZTMyID0gMDsKKworICBpZiAoIWdldERpclNpemUoc3pOYW1lLCAmaGlnaFNpemUxNiwgJmxvd1NpemUzMikpIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gbV93cml0ZXIud3JpdGVGaWxlRGlyU2l6ZURhdGEobG93U2l6ZTMyLCBoaWdoU2l6ZTE2KTsKK30KKworYm9vbCAKK1NGaWxlVHJhbnNmZXI6OnByb2Nlc3NGaWxlUmVuYW1lUmVxdWVzdCgpCit7CisgIGNoYXIgc3pPbGROYW1lW0ZUX0ZJTEVOQU1FX1NJWkVdID0gezB9OworICBjaGFyIHN6TmV3TmFtZVtGVF9GSUxFTkFNRV9TSVpFXSA9IHswfTsKKworICB1bnNpZ25lZCBpbnQgb2xkTmFtZVNpemUgPSBGVF9GSUxFTkFNRV9TSVpFOworICB1bnNpZ25lZCBpbnQgbmV3TmFtZVNpemUgPSBGVF9GSUxFTkFNRV9TSVpFOworCisgIGlmICghbV9yZWFkZXIucmVhZEZpbGVSZW5hbWVScXN0KCZvbGROYW1lU2l6ZSwgJm5ld05hbWVTaXplLCBzek9sZE5hbWUsIHN6TmV3TmFtZSkpIHJldHVybiBmYWxzZTsKKworICBpZiAoKCFjb252ZXJ0UGF0aEZyb21OZXQoc3pPbGROYW1lKSkgfHwgKCFjb252ZXJ0UGF0aEZyb21OZXQoc3pOZXdOYW1lKSkpIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gcmVuYW1lSXQoc3pPbGROYW1lLCBzek5ld05hbWUpOworfQorCitib29sIAorU0ZpbGVUcmFuc2Zlcjo6cHJvY2Vzc0ZpbGVEZWxldGVSZXF1ZXN0KCkKK3sKKyAgY2hhciBzek5hbWVbRlRfRklMRU5BTUVfU0laRV0gPSB7MH07CisgIHVuc2lnbmVkIGludCBuYW1lU2l6ZSA9IEZUX0ZJTEVOQU1FX1NJWkU7CisKKyAgaWYgKCFtX3JlYWRlci5yZWFkRmlsZURlbGV0ZVJxc3QoJm5hbWVTaXplLCBzek5hbWUpKSByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFjb252ZXJ0UGF0aEZyb21OZXQoc3pOYW1lKSkgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiBkZWxldGVJdChzek5hbWUpOworfQorCitib29sIAorU0ZpbGVUcmFuc2Zlcjo6Y29udmVydFBhdGhGcm9tTmV0KGNoYXIgKnBzelBhdGgpCit7CisgIHJldHVybiB0cnVlOworfQorCitib29sIAorU0ZpbGVUcmFuc2Zlcjo6bWFrZUZpbGVMaXN0KGNoYXIgKnBzelBhdGgsIEZpbGVJbmZvICpwRkksIGJvb2wgYkRpck9ubHkpCit7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCAKK1NGaWxlVHJhbnNmZXI6OmRlbGV0ZUl0KGNoYXIgKnBzelBhdGgpCit7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCAKK1NGaWxlVHJhbnNmZXI6OnJlbmFtZUl0KGNoYXIgKnBzek9sZFBhdGgsIGNoYXIgKnBzek5ld1BhdGgpCit7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCAKK1NGaWxlVHJhbnNmZXI6OmNyZWF0ZURpcihjaGFyICpwc3pQYXRoKQoreworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgCitTRmlsZVRyYW5zZmVyOjpnZXREaXJTaXplKGNoYXIgKnBzek5hbWUsIHVuc2lnbmVkIHNob3J0ICpwSGlnaFNpemUxNiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcExvd1NpemUzMikKK3sKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sCitTRmlsZVRyYW5zZmVyOjppbml0RG93bmxvYWRDYWxsYmFjaygpCit7CisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU0ZpbGVUcmFuc2Zlci5oIGIvY29tbW9uL3JmYi9TRmlsZVRyYW5zZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhNDkyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvU0ZpbGVUcmFuc2Zlci5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNiBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kKKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKgorICogVGlnaHRWTkMgZGlzdHJpYnV0aW9uIGhvbWVwYWdlIG9uIHRoZSBXZWI6IGh0dHA6Ly93d3cudGlnaHR2bmMuY29tLworICoKKyAqLworCisvLyAtPS0gU0ZpbGVUcmFuc2Zlci5oCisKKyNpZm5kZWYgX19SRkJfU0ZJTEVUUkFOU0ZFUl9IX18KKyNkZWZpbmUgX19SRkJfU0ZJTEVUUkFOU0ZFUl9IX18KKworI2luY2x1ZGUgPG5ldHdvcmsvU29ja2V0Lmg+CisjaW5jbHVkZSA8cmZiL1NGVE1zZ1JlYWRlci5oPgorI2luY2x1ZGUgPHJmYi9TRlRNc2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvRmlsZVdyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9GaWxlUmVhZGVyLmg+CisjaW5jbHVkZSA8cmZiL0ZpbGVJbmZvLmg+CisjaW5jbHVkZSA8cmZiL2Z0dHlwZXMuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIFNGaWxlVHJhbnNmZXIKKyAgeworICBwdWJsaWM6CisgICAgU0ZpbGVUcmFuc2ZlcihuZXR3b3JrOjpTb2NrZXQgKnNvY2spOworICAgIHZpcnR1YWwgflNGaWxlVHJhbnNmZXIoKTsKKworICAgIGJvb2wgcHJvY2Vzc01lc3NhZ2VzKGludCB0eXBlKTsKKyAgICBib29sIHNlbmRGaWxlRG93bmxvYWRQb3J0aW9uKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIGJvb2wgcHJvY2Vzc0ZpbGVMaXN0UmVxdWVzdCgpOworICAgIGJvb2wgcHJvY2Vzc0ZpbGVEb3dubG9hZFJlcXVlc3QoKTsKKyAgICBib29sIHByb2Nlc3NGaWxlVXBsb2FkUmVxdWVzdCgpOworICAgIGJvb2wgcHJvY2Vzc0ZpbGVVcGxvYWREYXRhKCk7CisgICAgYm9vbCBwcm9jZXNzRmlsZURvd25sb2FkQ2FuY2VsKCk7CisgICAgYm9vbCBwcm9jZXNzRmlsZVVwbG9hZEZhaWxlZCgpOworICAgIGJvb2wgcHJvY2Vzc0ZpbGVDcmVhdGVEaXJSZXF1ZXN0KCk7CisgICAgYm9vbCBwcm9jZXNzRmlsZURpclNpemVSZXF1ZXN0KCk7CisgICAgYm9vbCBwcm9jZXNzRmlsZVJlbmFtZVJlcXVlc3QoKTsKKyAgICBib29sIHByb2Nlc3NGaWxlRGVsZXRlUmVxdWVzdCgpOworCisgICAgdmlydHVhbCBib29sIGluaXREb3dubG9hZENhbGxiYWNrKCk7CisgICAgdmlydHVhbCBib29sIG1ha2VGaWxlTGlzdChjaGFyICpwc3pQYXRoLCBGaWxlSW5mbyAqcEZJLCBib29sIGJEaXJPbmx5KTsKKyAgICB2aXJ0dWFsIGJvb2wgY29udmVydFBhdGhGcm9tTmV0KGNoYXIgKnBzelBhdGgpOworCisgICAgdmlydHVhbCBib29sIGRlbGV0ZUl0KGNoYXIgKnBzelBhdGgpOworICAgIHZpcnR1YWwgYm9vbCByZW5hbWVJdChjaGFyICpwc3pPbGRQYXRoLCBjaGFyICpwc3pOZXdQYXRoKTsKKyAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlRGlyKGNoYXIgKnBzelBhdGgpOworCisgICAgdmlydHVhbCBib29sIGdldERpclNpemUoY2hhciAqcHN6TmFtZSwgdW5zaWduZWQgc2hvcnQgKnBIaWdoU2l6ZTE2LCB1bnNpZ25lZCBpbnQgKnBMb3dTaXplMzIpOworCisgICAgYm9vbCBtX2JVcGxvYWRTdGFydGVkOworICAgIGJvb2wgbV9iRG93bmxvYWRTdGFydGVkOworICAgIAorICBwcml2YXRlOgorICAgIFNGVE1zZ1JlYWRlciBtX3JlYWRlcjsKKyAgICBTRlRNc2dXcml0ZXIgbV93cml0ZXI7CisKKyAgICBGaWxlV3JpdGVyIG1fZmlsZVdyaXRlcjsKKyAgICBGaWxlUmVhZGVyIG1fZmlsZVJlYWRlcjsKKworICAgIG5ldHdvcms6OlNvY2tldCAqbV9wU29ja2V0OworICB9OworfQorCisjZW5kaWYgLy8gX19SRkJfU0ZJTEVUUkFOU0ZFUl9IX18KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU0ZpbGVUcmFuc2Zlck1hbmFnZXIuY3h4IGIvY29tbW9uL3JmYi9TRmlsZVRyYW5zZmVyTWFuYWdlci5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5YTA3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvU0ZpbGVUcmFuc2Zlck1hbmFnZXIuY3h4CkBAIC0wLDAgKzEsNTUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNiBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIFNGaWxlVHJhbnNmZXJNYW5hZ2VyLmN4eAorCisjaW5jbHVkZSA8cmZiL1NGaWxlVHJhbnNmZXJNYW5hZ2VyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK1NGaWxlVHJhbnNmZXJNYW5hZ2VyOjpTRmlsZVRyYW5zZmVyTWFuYWdlcigpCit7CisKK30KKworU0ZpbGVUcmFuc2Zlck1hbmFnZXI6On5TRmlsZVRyYW5zZmVyTWFuYWdlcigpCit7CisgIGRlc3Ryb3koKTsKK30KKwordm9pZAorU0ZpbGVUcmFuc2Zlck1hbmFnZXI6OmRlc3Ryb3lPYmplY3QoU0ZpbGVUcmFuc2ZlciAqcEZUKQoreworICBpZiAocEZUID09IE5VTEwpIHJldHVybjsKKworICBtX2xzdEZUT2JqZWN0cy5yZW1vdmUocEZUKTsKKworICBkZWxldGUgcEZUOworfQorCit2b2lkCitTRmlsZVRyYW5zZmVyTWFuYWdlcjo6ZGVzdHJveSgpCit7CisgIHdoaWxlKCFtX2xzdEZUT2JqZWN0cy5lbXB0eSgpKQorICAgIGRlbGV0ZSBtX2xzdEZUT2JqZWN0cy5mcm9udCgpOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9TRmlsZVRyYW5zZmVyTWFuYWdlci5oIGIvY29tbW9uL3JmYi9TRmlsZVRyYW5zZmVyTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlODE2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NGaWxlVHJhbnNmZXJNYW5hZ2VyLmgKQEAgLTAsMCArMSw1MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA2IFRpZ2h0Vk5DIFRlYW0uICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBieSBEZW5uaXMgU3lyb3ZhdHNreS4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKgorICogVGlnaHRWTkMgZGlzdHJpYnV0aW9uIGhvbWVwYWdlIG9uIHRoZSBXZWI6IGh0dHA6Ly93d3cudGlnaHR2bmMuY29tLworICoKKyAqLworCisvLyAtPS0gU0ZpbGVUcmFuc2Zlck1hbmFnZXIuaAorCisjaWZuZGVmIF9fUkZCX1NGSUxFVFJBTlNGRVJNQU5BR0VSX0hfXworI2RlZmluZSBfX1JGQl9TRklMRVRSQU5TRkVSTUFOQUdFUl9IX18KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxyZmIvU0ZpbGVUcmFuc2Zlci5oPgorI2luY2x1ZGUgPG5ldHdvcmsvU29ja2V0Lmg+CisKK25hbWVzcGFjZSByZmIgeworICBjbGFzcyBTRmlsZVRyYW5zZmVyTWFuYWdlcgorICB7CisgIHB1YmxpYzoKKyAgICBTRmlsZVRyYW5zZmVyTWFuYWdlcigpOworICAgIHZpcnR1YWwgflNGaWxlVHJhbnNmZXJNYW5hZ2VyKCk7CisKKyAgICB2aXJ0dWFsIFNGaWxlVHJhbnNmZXIgKmNyZWF0ZU9iamVjdChuZXR3b3JrOjpTb2NrZXQgKnNvY2spID0gMDsKKyAgICB2b2lkIGRlc3Ryb3lPYmplY3QoU0ZpbGVUcmFuc2ZlciAqcEZUKTsKKworICBwcm90ZWN0ZWQ6CisgICAgc3RkOjpsaXN0PFNGaWxlVHJhbnNmZXIqPiBtX2xzdEZUT2JqZWN0czsKKworICAgIHZvaWQgZGVzdHJveSgpOworICB9OworfQorCisjZW5kaWYgLy8gX19SRkJfU0ZJTEVUUkFOU0ZFUk1BTkFHRVJfSF9fCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1NNc2dIYW5kbGVyLmN4eCBiL2NvbW1vbi9yZmIvU01zZ0hhbmRsZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYzk3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NNc2dIYW5kbGVyLmN4eApAQCAtMCwwICsxLDUyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8cmZiL0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHJmYi9TTXNnSGFuZGxlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitTTXNnSGFuZGxlcjo6U01zZ0hhbmRsZXIoKQoreworfQorCitTTXNnSGFuZGxlcjo6flNNc2dIYW5kbGVyKCkKK3sKK30KKwordm9pZCBTTXNnSGFuZGxlcjo6Y2xpZW50SW5pdChib29sIHNoYXJlZCkKK3sKK30KKwordm9pZCBTTXNnSGFuZGxlcjo6c2V0UGl4ZWxGb3JtYXQoY29uc3QgUGl4ZWxGb3JtYXQmIHBmKQoreworICBjcC5zZXRQRihwZik7Cit9CisKK3ZvaWQgU01zZ0hhbmRsZXI6OnNldEVuY29kaW5ncyhpbnQgbkVuY29kaW5ncywgcmRyOjpVMzIqIGVuY29kaW5ncykKK3sKKyAgY3Auc2V0RW5jb2RpbmdzKG5FbmNvZGluZ3MsIGVuY29kaW5ncyk7CisgIHN1cHBvcnRzTG9jYWxDdXJzb3IoKTsKK30KKwordm9pZCBTTXNnSGFuZGxlcjo6ZnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KGNvbnN0IFJlY3QmIHIsIGJvb2wgaW5jcmVtZW50YWwpCit7Cit9CisKK3ZvaWQgU01zZ0hhbmRsZXI6OnN1cHBvcnRzTG9jYWxDdXJzb3IoKQoreworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9TTXNnSGFuZGxlci5oIGIvY29tbW9uL3JmYi9TTXNnSGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzM3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NNc2dIYW5kbGVyLmgKQEAgLTAsMCArMSw2NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIFNNc2dIYW5kbGVyIC0gY2xhc3MgdG8gaGFuZGxlIGluY29taW5nIG1lc3NhZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZS4KKy8vCisKKyNpZm5kZWYgX19SRkJfU01TR0hBTkRMRVJfSF9fCisjZGVmaW5lIF9fUkZCX1NNU0dIQU5ETEVSX0hfXworCisjaW5jbHVkZSA8cmRyL3R5cGVzLmg+CisjaW5jbHVkZSA8cmZiL1BpeGVsRm9ybWF0Lmg+CisjaW5jbHVkZSA8cmZiL0Nvbm5QYXJhbXMuaD4KKyNpbmNsdWRlIDxyZmIvSW5wdXRIYW5kbGVyLmg+CisKK25hbWVzcGFjZSByZHIgeyBjbGFzcyBJblN0cmVhbTsgfQorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBTTXNnSGFuZGxlciA6IHB1YmxpYyBJbnB1dEhhbmRsZXIgeworICBwdWJsaWM6CisgICAgU01zZ0hhbmRsZXIoKTsKKyAgICB2aXJ0dWFsIH5TTXNnSGFuZGxlcigpOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBjYWxsZWQgYXMgY29ycmVzcG9uZGluZyBtZXNzYWdlcyBhcmUgcmVhZC4gIEEKKyAgICAvLyBkZXJpdmVkIGNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGVzZSBtZXRob2RzIGFzIGRlc2lyZWQuICBOb3RlIHRoYXQgZm9yCisgICAgLy8gdGhlIHNldFBpeGVsRm9ybWF0KCkgYW5kIHNldEVuY29kaW5ncygpIG1ldGhvZHMsIGEgZGVyaXZlZCBjbGFzcyBtdXN0CisgICAgLy8gY2FsbCBvbiB0byBTTXNnSGFuZGxlcidzIG1ldGhvZHMuCisKKyAgICB2aXJ0dWFsIHZvaWQgY2xpZW50SW5pdChib29sIHNoYXJlZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGl4ZWxGb3JtYXQoY29uc3QgUGl4ZWxGb3JtYXQmIHBmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RW5jb2RpbmdzKGludCBuRW5jb2RpbmdzLCByZHI6OlUzMiogZW5jb2RpbmdzKTsKKyAgICB2aXJ0dWFsIHZvaWQgZnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KGNvbnN0IFJlY3QmIHIsIGJvb2wgaW5jcmVtZW50YWwpOworCisgICAgLy8gSW5wdXRIYW5kbGVyIGludGVyZmFjZQorICAgIC8vIFRoZSBJbnB1dEhhbmRsZXIgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZXMuCisKKyAgICAvLyBzdXBwb3J0c0xvY2FsQ3Vyc29yKCkgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzdGF0dXMgb2YKKyAgICAvLyBjcC5zdXBwb3J0c0xvY2FsQ3Vyc29yIGhhcyBjaGFuZ2VkLiAgQXQgdGhlIG1vbWVudCB0aGlzIGhhcHBlbnMgb24gYQorICAgIC8vIHNldEVuY29kaW5ncyBtZXNzYWdlLCBidXQgaW4gdGhlIGZ1dHVyZSB0aGlzIG1heSBiZSBkdWUgdG8gYSBtZXNzYWdlCisgICAgLy8gc3BlY2lhbGx5IGZvciB0aGlzIHB1cnBvc2UuCisgICAgdmlydHVhbCB2b2lkIHN1cHBvcnRzTG9jYWxDdXJzb3IoKTsKKworICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzRlRNc2coaW50IHR5cGUpID0gMDsKKworICAgIENvbm5QYXJhbXMgY3A7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU01zZ1JlYWRlci5jeHggYi9jb21tb24vcmZiL1NNc2dSZWFkZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OWUwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NNc2dSZWFkZXIuY3h4CkBAIC0wLDAgKzEsOTcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHJkci9JblN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvdXRpbC5oPgorI2luY2x1ZGUgPHJmYi9TTXNnSGFuZGxlci5oPgorI2luY2x1ZGUgPHJmYi9TTXNnUmVhZGVyLmg+CisjaW5jbHVkZSA8cmZiL0NvbmZpZ3VyYXRpb24uaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworc3RhdGljIEludFBhcmFtZXRlciBtYXhDdXRUZXh0KCJNYXhDdXRUZXh0IiwgIk1heGltdW0gcGVybWl0dGVkIGxlbmd0aCBvZiBhbiBpbmNvbWluZyBjbGlwYm9hcmQgdXBkYXRlIiwgMjU2KjEwMjQpOworCitTTXNnUmVhZGVyOjpTTXNnUmVhZGVyKFNNc2dIYW5kbGVyKiBoYW5kbGVyXywgcmRyOjpJblN0cmVhbSogaXNfKQorICA6IGhhbmRsZXIoaGFuZGxlcl8pLCBpcyhpc18pCit7Cit9CisKK1NNc2dSZWFkZXI6On5TTXNnUmVhZGVyKCkKK3sKK30KKwordm9pZCBTTXNnUmVhZGVyOjpyZWFkU2V0UGl4ZWxGb3JtYXQoKQoreworICBpcy0+c2tpcCgzKTsKKyAgUGl4ZWxGb3JtYXQgcGY7CisgIHBmLnJlYWQoaXMpOworICBoYW5kbGVyLT5zZXRQaXhlbEZvcm1hdChwZik7Cit9CisKK3ZvaWQgU01zZ1JlYWRlcjo6cmVhZFNldEVuY29kaW5ncygpCit7CisgIGlzLT5za2lwKDEpOworICBpbnQgbkVuY29kaW5ncyA9IGlzLT5yZWFkVTE2KCk7CisgIHJkcjo6VTMyQXJyYXkgZW5jb2RpbmdzKG5FbmNvZGluZ3MpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5FbmNvZGluZ3M7IGkrKykKKyAgICBlbmNvZGluZ3MuYnVmW2ldID0gaXMtPnJlYWRVMzIoKTsKKyAgaGFuZGxlci0+c2V0RW5jb2RpbmdzKG5FbmNvZGluZ3MsIGVuY29kaW5ncy5idWYpOworfQorCit2b2lkIFNNc2dSZWFkZXI6OnJlYWRGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoKQoreworICBib29sIGluYyA9IGlzLT5yZWFkVTgoKTsKKyAgaW50IHggPSBpcy0+cmVhZFUxNigpOworICBpbnQgeSA9IGlzLT5yZWFkVTE2KCk7CisgIGludCB3ID0gaXMtPnJlYWRVMTYoKTsKKyAgaW50IGggPSBpcy0+cmVhZFUxNigpOworICBoYW5kbGVyLT5mcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoUmVjdCh4LCB5LCB4K3csIHkraCksIGluYyk7Cit9CisKK3ZvaWQgU01zZ1JlYWRlcjo6cmVhZEtleUV2ZW50KCkKK3sKKyAgYm9vbCBkb3duID0gaXMtPnJlYWRVOCgpOworICBpcy0+c2tpcCgyKTsKKyAgcmRyOjpVMzIga2V5ID0gaXMtPnJlYWRVMzIoKTsKKyAgaGFuZGxlci0+a2V5RXZlbnQoa2V5LCBkb3duKTsKK30KKwordm9pZCBTTXNnUmVhZGVyOjpyZWFkUG9pbnRlckV2ZW50KCkKK3sKKyAgaW50IG1hc2sgPSBpcy0+cmVhZFU4KCk7CisgIGludCB4ID0gaXMtPnJlYWRVMTYoKTsKKyAgaW50IHkgPSBpcy0+cmVhZFUxNigpOworICBoYW5kbGVyLT5wb2ludGVyRXZlbnQoUG9pbnQoeCwgeSksIG1hc2spOworfQorCisKK3ZvaWQgU01zZ1JlYWRlcjo6cmVhZENsaWVudEN1dFRleHQoKQoreworICBpcy0+c2tpcCgzKTsKKyAgaW50IGxlbiA9IGlzLT5yZWFkVTMyKCk7CisgIGlmIChsZW4gPiBtYXhDdXRUZXh0KSB7CisgICAgaXMtPnNraXAobGVuKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiY3V0IHRleHQgdG9vIGxvbmcgKCVkIGJ5dGVzKSAtIGlnbm9yaW5nXG4iLGxlbik7CisgICAgcmV0dXJuOworICB9CisgIENoYXJBcnJheSBjYShsZW4rMSk7CisgIGNhLmJ1ZltsZW5dID0gMDsKKyAgaXMtPnJlYWRCeXRlcyhjYS5idWYsIGxlbik7CisgIGhhbmRsZXItPmNsaWVudEN1dFRleHQoY2EuYnVmLCBsZW4pOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9TTXNnUmVhZGVyLmggYi9jb21tb24vcmZiL1NNc2dSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmU0MDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9TTXNnUmVhZGVyLmgKQEAgLTAsMCArMSw1NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIFNNc2dSZWFkZXIgLSBjbGFzcyBmb3IgcmVhZGluZyBSRkIgbWVzc2FnZXMgb24gdGhlIHNlcnZlciBzaWRlCisvLyAoaS5lLiBtZXNzYWdlcyBmcm9tIGNsaWVudCB0byBzZXJ2ZXIpLgorLy8KKworI2lmbmRlZiBfX1JGQl9TTVNHUkVBREVSX0hfXworI2RlZmluZSBfX1JGQl9TTVNHUkVBREVSX0hfXworCituYW1lc3BhY2UgcmRyIHsgY2xhc3MgSW5TdHJlYW07IH0KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIFNNc2dIYW5kbGVyOworCisgIGNsYXNzIFNNc2dSZWFkZXIgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+U01zZ1JlYWRlcigpOworCisgICAgdmlydHVhbCB2b2lkIHJlYWRDbGllbnRJbml0KCk9MDsKKworICAgIC8vIHJlYWRNc2coKSByZWFkcyBhIG1lc3NhZ2UsIGNhbGxpbmcgdGhlIGhhbmRsZXIgYXMgYXBwcm9wcmlhdGUuCisgICAgdmlydHVhbCB2b2lkIHJlYWRNc2coKT0wOworCisgICAgcmRyOjpJblN0cmVhbSogZ2V0SW5TdHJlYW0oKSB7IHJldHVybiBpczsgfQorCisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZFNldFBpeGVsRm9ybWF0KCk7CisgICAgdmlydHVhbCB2b2lkIHJlYWRTZXRFbmNvZGluZ3MoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCgpOworICAgIHZpcnR1YWwgdm9pZCByZWFkS2V5RXZlbnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZFBvaW50ZXJFdmVudCgpOworICAgIHZpcnR1YWwgdm9pZCByZWFkQ2xpZW50Q3V0VGV4dCgpOworCisgICAgU01zZ1JlYWRlcihTTXNnSGFuZGxlciogaGFuZGxlciwgcmRyOjpJblN0cmVhbSogaXMpOworCisgICAgU01zZ0hhbmRsZXIqIGhhbmRsZXI7CisgICAgcmRyOjpJblN0cmVhbSogaXM7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU01zZ1JlYWRlclYzLmN4eCBiL2NvbW1vbi9yZmIvU01zZ1JlYWRlclYzLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTAxYjVkCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9TTXNnUmVhZGVyVjMuY3h4CkBAIC0wLDAgKzEsNjggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxyZmIvUGl4ZWxGb3JtYXQuaD4KKyNpbmNsdWRlIDxyZmIvbXNnVHlwZXMuaD4KKyNpbmNsdWRlIDxyZmIvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8cmRyL0luU3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL1NNc2dSZWFkZXJWMy5oPgorI2luY2x1ZGUgPHJmYi9TTXNnSGFuZGxlci5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitTTXNnUmVhZGVyVjM6OlNNc2dSZWFkZXJWMyhTTXNnSGFuZGxlciogaGFuZGxlciwgcmRyOjpJblN0cmVhbSogaXMpCisgIDogU01zZ1JlYWRlcihoYW5kbGVyLCBpcykKK3sKK30KKworU01zZ1JlYWRlclYzOjp+U01zZ1JlYWRlclYzKCkKK3sKK30KKwordm9pZCBTTXNnUmVhZGVyVjM6OnJlYWRDbGllbnRJbml0KCkKK3sKKyAgYm9vbCBzaGFyZWQgPSBpcy0+cmVhZFU4KCk7CisgIGhhbmRsZXItPmNsaWVudEluaXQoc2hhcmVkKTsKK30KKwordm9pZCBTTXNnUmVhZGVyVjM6OnJlYWRNc2coKQoreworICBpbnQgbXNnVHlwZSA9IGlzLT5yZWFkVTgoKTsKKyAgc3dpdGNoIChtc2dUeXBlKSB7CisgIGNhc2UgbXNnVHlwZVNldFBpeGVsRm9ybWF0OiAgICAgICAgICAgcmVhZFNldFBpeGVsRm9ybWF0KCk7IGJyZWFrOworICBjYXNlIG1zZ1R5cGVTZXRFbmNvZGluZ3M6ICAgICAgICAgICAgIHJlYWRTZXRFbmNvZGluZ3MoKTsgYnJlYWs7CisgIGNhc2UgbXNnVHlwZUZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdDogcmVhZEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCgpOyBicmVhazsKKyAgY2FzZSBtc2dUeXBlS2V5RXZlbnQ6ICAgICAgICAgICAgICAgICByZWFkS2V5RXZlbnQoKTsgYnJlYWs7CisgIGNhc2UgbXNnVHlwZVBvaW50ZXJFdmVudDogICAgICAgICAgICAgcmVhZFBvaW50ZXJFdmVudCgpOyBicmVhazsKKyAgY2FzZSBtc2dUeXBlQ2xpZW50Q3V0VGV4dDogICAgICAgICAgICByZWFkQ2xpZW50Q3V0VGV4dCgpOyBicmVhazsKKworICBjYXNlIG1zZ1R5cGVGaWxlTGlzdFJlcXVlc3Q6CisgIGNhc2UgbXNnVHlwZUZpbGVEb3dubG9hZFJlcXVlc3Q6CisgIGNhc2UgbXNnVHlwZUZpbGVVcGxvYWRSZXF1ZXN0OgorICBjYXNlIG1zZ1R5cGVGaWxlVXBsb2FkRGF0YToKKyAgY2FzZSBtc2dUeXBlRmlsZURvd25sb2FkQ2FuY2VsOgorICBjYXNlIG1zZ1R5cGVGaWxlVXBsb2FkRmFpbGVkOgorICBjYXNlIG1zZ1R5cGVGaWxlQ3JlYXRlRGlyUmVxdWVzdDoKKyAgY2FzZSBtc2dUeXBlRmlsZURpclNpemVSZXF1ZXN0OgorICBjYXNlIG1zZ1R5cGVGaWxlUmVuYW1lUmVxdWVzdDoKKyAgY2FzZSBtc2dUeXBlRmlsZURlbGV0ZVJlcXVlc3Q6ICAgICAgICBoYW5kbGVyLT5wcm9jZXNzRlRNc2cobXNnVHlwZSk7IGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIG1lc3NhZ2UgdHlwZSAlZFxuIiwgbXNnVHlwZSk7CisgICAgdGhyb3cgRXhjZXB0aW9uKCJ1bmtub3duIG1lc3NhZ2UgdHlwZSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1NNc2dSZWFkZXJWMy5oIGIvY29tbW9uL3JmYi9TTXNnUmVhZGVyVjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI3YmY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9TTXNnUmVhZGVyVjMuaApAQCAtMCwwICsxLDMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fUkZCX1NNU0dSRUFERVJWM19IX18KKyNkZWZpbmUgX19SRkJfU01TR1JFQURFUlYzX0hfXworCisjaW5jbHVkZSA8cmZiL1NNc2dSZWFkZXIuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIFNNc2dSZWFkZXJWMyA6IHB1YmxpYyBTTXNnUmVhZGVyIHsKKyAgcHVibGljOgorICAgIFNNc2dSZWFkZXJWMyhTTXNnSGFuZGxlciogaGFuZGxlciwgcmRyOjpJblN0cmVhbSogaXMpOworICAgIHZpcnR1YWwgflNNc2dSZWFkZXJWMygpOworICAgIHZpcnR1YWwgdm9pZCByZWFkQ2xpZW50SW5pdCgpOworICAgIHZpcnR1YWwgdm9pZCByZWFkTXNnKCk7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU01zZ1dyaXRlci5jeHggYi9jb21tb24vcmZiL1NNc2dXcml0ZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NWRmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NNc2dXcml0ZXIuY3h4CkBAIC0wLDAgKzEsMjAyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL21zZ1R5cGVzLmg+CisjaW5jbHVkZSA8cmZiL0NvbG91ck1hcC5oPgorI2luY2x1ZGUgPHJmYi9Db25uUGFyYW1zLmg+CisjaW5jbHVkZSA8cmZiL1VwZGF0ZVRyYWNrZXIuaD4KKyNpbmNsdWRlIDxyZmIvU01zZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworc3RhdGljIExvZ1dyaXRlciB2bG9nKCJTTXNnV3JpdGVyIik7CisKK1NNc2dXcml0ZXI6OlNNc2dXcml0ZXIoQ29ublBhcmFtcyogY3BfLCByZHI6Ok91dFN0cmVhbSogb3NfKQorICA6IGltYWdlQnVmSWRlYWxTaXplKDApLCBjcChjcF8pLCBvcyhvc18pLCBsZW5CZWZvcmVSZWN0KDApLAorICAgIGN1cnJlbnRFbmNvZGluZygwKSwgdXBkYXRlc1NlbnQoMCksIHJhd0J5dGVzRXF1aXZhbGVudCgwKSwKKyAgICBpbWFnZUJ1ZigwKSwgaW1hZ2VCdWZTaXplKDApCit7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDw9IGVuY29kaW5nTWF4OyBpKyspIHsKKyAgICBlbmNvZGVyc1tpXSA9IDA7CisgICAgYnl0ZXNTZW50W2ldID0gMDsKKyAgICByZWN0c1NlbnRbaV0gPSAwOworICB9Cit9CisKK1NNc2dXcml0ZXI6On5TTXNnV3JpdGVyKCkKK3sKKyAgdmxvZy5pbmZvKCJmcmFtZWJ1ZmZlciB1cGRhdGVzICVkIix1cGRhdGVzU2VudCk7CisgIGludCBieXRlcyA9IDA7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDw9IGVuY29kaW5nTWF4OyBpKyspIHsKKyAgICBkZWxldGUgZW5jb2RlcnNbaV07CisgICAgaWYgKGkgIT0gZW5jb2RpbmdDb3B5UmVjdCkKKyAgICAgIGJ5dGVzICs9IGJ5dGVzU2VudFtpXTsKKyAgICBpZiAocmVjdHNTZW50W2ldKQorICAgICAgdmxvZy5pbmZvKCIgICVzIHJlY3RzICVkLCBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgZW5jb2RpbmdOYW1lKGkpLCByZWN0c1NlbnRbaV0sIGJ5dGVzU2VudFtpXSk7CisgIH0KKyAgdmxvZy5pbmZvKCIgIHJhdyBieXRlcyBlcXVpdmFsZW50ICVkLCBjb21wcmVzc2lvbiByYXRpbyAlZiIsCisgICAgICAgICAgcmF3Qnl0ZXNFcXVpdmFsZW50LCAoZG91YmxlKXJhd0J5dGVzRXF1aXZhbGVudCAvIGJ5dGVzKTsKKyAgZGVsZXRlIFtdIGltYWdlQnVmOworfQorCit2b2lkIFNNc2dXcml0ZXI6OndyaXRlU2V0Q29sb3VyTWFwRW50cmllcyhpbnQgZmlyc3RDb2xvdXIsIGludCBuQ29sb3VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ck1hcCogY20pCit7CisgIHN0YXJ0TXNnKG1zZ1R5cGVTZXRDb2xvdXJNYXBFbnRyaWVzKTsKKyAgb3MtPnBhZCgxKTsKKyAgb3MtPndyaXRlVTE2KGZpcnN0Q29sb3VyKTsKKyAgb3MtPndyaXRlVTE2KG5Db2xvdXJzKTsKKyAgZm9yIChpbnQgaSA9IGZpcnN0Q29sb3VyOyBpIDwgZmlyc3RDb2xvdXIrbkNvbG91cnM7IGkrKykgeworICAgIGludCByLCBnLCBiOworICAgIGNtLT5sb29rdXAoaSwgJnIsICZnLCAmYik7CisgICAgb3MtPndyaXRlVTE2KHIpOworICAgIG9zLT53cml0ZVUxNihnKTsKKyAgICBvcy0+d3JpdGVVMTYoYik7CisgIH0KKyAgZW5kTXNnKCk7Cit9CisKK3ZvaWQgU01zZ1dyaXRlcjo6d3JpdGVCZWxsKCkKK3sKKyAgc3RhcnRNc2cobXNnVHlwZUJlbGwpOworICBlbmRNc2coKTsKK30KKwordm9pZCBTTXNnV3JpdGVyOjp3cml0ZVNlcnZlckN1dFRleHQoY29uc3QgY2hhciogc3RyLCBpbnQgbGVuKQoreworICBzdGFydE1zZyhtc2dUeXBlU2VydmVyQ3V0VGV4dCk7CisgIG9zLT5wYWQoMyk7CisgIG9zLT53cml0ZVUzMihsZW4pOworICBvcy0+d3JpdGVCeXRlcyhzdHIsIGxlbik7CisgIGVuZE1zZygpOworfQorCit2b2lkIFNNc2dXcml0ZXI6OnNldHVwQ3VycmVudEVuY29kZXIoKQoreworICB1bnNpZ25lZCBpbnQgZW5jb2RpbmcgPSBjcC0+Y3VycmVudEVuY29kaW5nKCk7CisKKyAgLy8gRklYTUU6IENvZGUgZHVwbGljYXRpb24sIHNlZSB3cml0ZVJlY3QoKS4KKyAgaWYgKCFlbmNvZGVyc1tlbmNvZGluZ10pIHsKKyAgICBlbmNvZGVyc1tlbmNvZGluZ10gPSBFbmNvZGVyOjpjcmVhdGVFbmNvZGVyKGVuY29kaW5nLCB0aGlzKTsKKyAgICBhc3NlcnQoZW5jb2RlcnNbZW5jb2RpbmddKTsKKyAgfQorCisgIGVuY29kZXJzW2VuY29kaW5nXS0+c2V0Q29tcHJlc3NMZXZlbChjcC0+Y29tcHJlc3NMZXZlbCk7CisgIGVuY29kZXJzW2VuY29kaW5nXS0+c2V0UXVhbGl0eUxldmVsKGNwLT5xdWFsaXR5TGV2ZWwpOworfQorCitpbnQgU01zZ1dyaXRlcjo6Z2V0TnVtUmVjdHMoY29uc3QgUmVjdCAmcikKK3sKKyAgdW5zaWduZWQgaW50IGVuY29kaW5nID0gY3AtPmN1cnJlbnRFbmNvZGluZygpOworCisgIGlmICghZW5jb2RlcnNbZW5jb2RpbmddKQorICAgIHNldHVwQ3VycmVudEVuY29kZXIoKTsKKworICByZXR1cm4gZW5jb2RlcnNbZW5jb2RpbmddLT5nZXROdW1SZWN0cyhyKTsKK30KKworLy8gRklYTUU6IFRoaXMgZnVuY3Rpb25zIGRvZXMgbm90IGNvbXB1dGUgdGhlIG51bWJlciBvZiByZWN0YW5nbGVzIGNvcnJlY3RseQorLy8gICAgICAgIGlmIHRoZSBUaWdodCBlbmNvZGVyIGlzIHVzZWQgKGJ1dCBjdXJyZW50bHkgdGhhdCBkb2VzIG5vdCBtYXR0ZXIKKy8vICAgICAgICBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgbmV2ZXIgdXNlZCkuCit2b2lkIFNNc2dXcml0ZXI6OndyaXRlRnJhbWVidWZmZXJVcGRhdGUoY29uc3QgVXBkYXRlSW5mbyYgdWksIEltYWdlR2V0dGVyKiBpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb24qIHVwZGF0ZWRSZWdpb24pCit7CisgIHdyaXRlRnJhbWVidWZmZXJVcGRhdGVTdGFydCh1aS5udW1SZWN0cygpKTsKKyAgd3JpdGVSZWN0cyh1aSwgaWcsIHVwZGF0ZWRSZWdpb24pOworICB3cml0ZUZyYW1lYnVmZmVyVXBkYXRlRW5kKCk7Cit9CisKK3ZvaWQgU01zZ1dyaXRlcjo6d3JpdGVSZWN0cyhjb25zdCBVcGRhdGVJbmZvJiB1aSwgSW1hZ2VHZXR0ZXIqIGlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lvbiogdXBkYXRlZFJlZ2lvbikKK3sKKyAgc3RkOjp2ZWN0b3I8UmVjdD4gcmVjdHM7CisgIHN0ZDo6dmVjdG9yPFJlY3Q+Ojpjb25zdF9pdGVyYXRvciBpOworICB1cGRhdGVkUmVnaW9uLT5jb3B5RnJvbSh1aS5jaGFuZ2VkKTsKKyAgdXBkYXRlZFJlZ2lvbi0+YXNzaWduX3VuaW9uKHVpLmNvcGllZCk7CisKKyAgdWkuY29waWVkLmdldF9yZWN0cygmcmVjdHMsIHVpLmNvcHlfZGVsdGEueCA8PSAwLCB1aS5jb3B5X2RlbHRhLnkgPD0gMCk7CisgIGZvciAoaSA9IHJlY3RzLmJlZ2luKCk7IGkgIT0gcmVjdHMuZW5kKCk7IGkrKykKKyAgICB3cml0ZUNvcHlSZWN0KCppLCBpLT50bC54IC0gdWkuY29weV9kZWx0YS54LCBpLT50bC55IC0gdWkuY29weV9kZWx0YS55KTsKKworICB1aS5jaGFuZ2VkLmdldF9yZWN0cygmcmVjdHMpOworICBmb3IgKGkgPSByZWN0cy5iZWdpbigpOyBpICE9IHJlY3RzLmVuZCgpOyBpKyspIHsKKyAgICBSZWN0IGFjdHVhbDsKKyAgICBpZiAoIXdyaXRlUmVjdCgqaSwgaWcsICZhY3R1YWwpKSB7CisgICAgICB1cGRhdGVkUmVnaW9uLT5hc3NpZ25fc3VidHJhY3QoKmkpOworICAgICAgdXBkYXRlZFJlZ2lvbi0+YXNzaWduX3VuaW9uKGFjdHVhbCk7CisgICAgfQorICB9Cit9CisKKworYm9vbCBTTXNnV3JpdGVyOjpuZWVkRmFrZVVwZGF0ZSgpCit7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTTXNnV3JpdGVyOjp3cml0ZVJlY3QoY29uc3QgUmVjdCYgciwgSW1hZ2VHZXR0ZXIqIGlnLCBSZWN0KiBhY3R1YWwpCit7CisgIHJldHVybiB3cml0ZVJlY3QociwgY3AtPmN1cnJlbnRFbmNvZGluZygpLCBpZywgYWN0dWFsKTsKK30KKworYm9vbCBTTXNnV3JpdGVyOjp3cml0ZVJlY3QoY29uc3QgUmVjdCYgciwgdW5zaWduZWQgaW50IGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VHZXR0ZXIqIGlnLCBSZWN0KiBhY3R1YWwpCit7CisgIGlmICghZW5jb2RlcnNbZW5jb2RpbmddKSB7CisgICAgZW5jb2RlcnNbZW5jb2RpbmddID0gRW5jb2Rlcjo6Y3JlYXRlRW5jb2RlcihlbmNvZGluZywgdGhpcyk7CisgICAgYXNzZXJ0KGVuY29kZXJzW2VuY29kaW5nXSk7CisgIH0KKyAgcmV0dXJuIGVuY29kZXJzW2VuY29kaW5nXS0+d3JpdGVSZWN0KHIsIGlnLCBhY3R1YWwpOworfQorCit2b2lkIFNNc2dXcml0ZXI6OndyaXRlQ29weVJlY3QoY29uc3QgUmVjdCYgciwgaW50IHNyY1gsIGludCBzcmNZKQoreworICBzdGFydFJlY3QocixlbmNvZGluZ0NvcHlSZWN0KTsKKyAgb3MtPndyaXRlVTE2KHNyY1gpOworICBvcy0+d3JpdGVVMTYoc3JjWSk7CisgIGVuZFJlY3QoKTsKK30KKworcmRyOjpVOCogU01zZ1dyaXRlcjo6Z2V0SW1hZ2VCdWYoaW50IHJlcXVpcmVkLCBpbnQgcmVxdWVzdGVkLCBpbnQqIG5QaXhlbHMpCit7CisgIGludCByZXF1aXJlZEJ5dGVzID0gcmVxdWlyZWQgKiAoY3AtPnBmKCkuYnBwIC8gOCk7CisgIGludCByZXF1ZXN0ZWRCeXRlcyA9IHJlcXVlc3RlZCAqIChjcC0+cGYoKS5icHAgLyA4KTsKKyAgaW50IHNpemUgPSByZXF1ZXN0ZWRCeXRlczsKKyAgaWYgKHNpemUgPiBpbWFnZUJ1ZklkZWFsU2l6ZSkgc2l6ZSA9IGltYWdlQnVmSWRlYWxTaXplOworCisgIGlmIChzaXplIDwgcmVxdWlyZWRCeXRlcykKKyAgICBzaXplID0gcmVxdWlyZWRCeXRlczsKKworICBpZiAoaW1hZ2VCdWZTaXplIDwgc2l6ZSkgeworICAgIGltYWdlQnVmU2l6ZSA9IHNpemU7CisgICAgZGVsZXRlIFtdIGltYWdlQnVmOworICAgIGltYWdlQnVmID0gbmV3IHJkcjo6VThbaW1hZ2VCdWZTaXplXTsKKyAgfQorICBpZiAoblBpeGVscykKKyAgICAqblBpeGVscyA9IGltYWdlQnVmU2l6ZSAvIChjcC0+cGYoKS5icHAgLyA4KTsKKyAgcmV0dXJuIGltYWdlQnVmOworfQorCitpbnQgU01zZ1dyaXRlcjo6YnBwKCkKK3sKKyAgcmV0dXJuIGNwLT5wZigpLmJwcDsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU01zZ1dyaXRlci5oIGIvY29tbW9uL3JmYi9TTXNnV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4YWQwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvU01zZ1dyaXRlci5oCkBAIC0wLDAgKzEsMTYzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gU01zZ1dyaXRlciAtIGNsYXNzIGZvciB3cml0aW5nIFJGQiBtZXNzYWdlcyBvbiB0aGUgc2VydmVyIHNpZGUuCisvLworCisjaWZuZGVmIF9fUkZCX1NNU0dXUklURVJfSF9fCisjZGVmaW5lIF9fUkZCX1NNU0dXUklURVJfSF9fCisKKyNpbmNsdWRlIDxyZHIvdHlwZXMuaD4KKyNpbmNsdWRlIDxyZmIvZW5jb2RpbmdzLmg+CisjaW5jbHVkZSA8cmZiL0VuY29kZXIuaD4KKworbmFtZXNwYWNlIHJkciB7IGNsYXNzIE91dFN0cmVhbTsgfQorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBQaXhlbEZvcm1hdDsKKyAgY2xhc3MgQ29ublBhcmFtczsKKyAgY2xhc3MgSW1hZ2VHZXR0ZXI7CisgIGNsYXNzIENvbG91ck1hcDsKKyAgY2xhc3MgUmVnaW9uOworICBjbGFzcyBVcGRhdGVJbmZvOworCisgIGNsYXNzIFdyaXRlU2V0Q3Vyc29yQ2FsbGJhY2sgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIHdyaXRlU2V0Q3Vyc29yQ2FsbGJhY2soKSA9IDA7CisgIH07CisKKyAgY2xhc3MgU01zZ1dyaXRlciB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5TTXNnV3JpdGVyKCk7CisKKyAgICAvLyB3cml0ZVNlcnZlckluaXQoKSBtdXN0IG9ubHkgYmUgY2FsbGVkIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lIGluIHRoZQorICAgIC8vIHByb3RvY29sIGluaXRpYWxpc2F0aW9uLgorICAgIHZpcnR1YWwgdm9pZCB3cml0ZVNlcnZlckluaXQoKT0wOworCisgICAgLy8gTWV0aG9kcyB0byB3cml0ZSBub3JtYWwgcHJvdG9jb2wgbWVzc2FnZXMKKworICAgIC8vIHdyaXRlU2V0Q29sb3VyTWFwRW50cmllcygpIHdyaXRlcyBhIHNldENvbG91ck1hcEVudHJpZXMgbWVzc2FnZSwgdXNpbmcKKyAgICAvLyB0aGUgZ2l2ZW4gQ29sb3VyTWFwIG9iamVjdCB0byBsb29rdXAgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIGdpdmVuIHJhbmdlCisgICAgLy8gb2YgY29sb3Vycy4KKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVTZXRDb2xvdXJNYXBFbnRyaWVzKGludCBmaXJzdENvbG91ciwgaW50IG5Db2xvdXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyTWFwKiBjbSk7CisKKyAgICAvLyB3cml0ZUJlbGwoKSBhbmQgd3JpdGVTZXJ2ZXJDdXRUZXh0KCkgZG8gdGhlIG9idmlvdXMgdGhpbmcuCisgICAgdmlydHVhbCB2b2lkIHdyaXRlQmVsbCgpOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZVNlcnZlckN1dFRleHQoY29uc3QgY2hhciogc3RyLCBpbnQgbGVuKTsKKworICAgIC8vIHNldHVwQ3VycmVudEVuY29kZXIoKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBlYWNoIGZyYW1lYnVmZmVyIHVwZGF0ZSwKKyAgICAvLyBwcmlvciB0byBjYWxsaW5nIGdldE51bVJlY3RzKCkgb3Igd3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZVN0YXJ0KCkuCisgICAgdm9pZCBzZXR1cEN1cnJlbnRFbmNvZGVyKCk7CisKKyAgICAvLyBnZXROdW1SZWN0cygpIGNvbXB1dGVzIHRoZSBudW1iZXIgb2Ygc3ViLXJlY3RhbmdsZXMgdGhhdCB3aWxsIGNvbXBvc2UgYQorICAgIC8vIGdpdmVuIHJlY3RhbmdsZSwgZm9yIGN1cnJlbnQgZW5jb2Rlci4KKyAgICBpbnQgZ2V0TnVtUmVjdHMoY29uc3QgUmVjdCAmcik7CisKKyAgICAvLyB3cml0ZVNldERlc2t0b3BTaXplKCkgb24gYSBWMyB3cml0ZXIgd29uJ3QgYWN0dWFsbHkgd3JpdGUgaW1tZWRpYXRlbHksCisgICAgLy8gYnV0IHdpbGwgd3JpdGUgdGhlIHJlbGV2YW50IHBzZXVkby1yZWN0YW5nbGUgYXMgcGFydCBvZiB0aGUgbmV4dCB1cGRhdGUuCisgICAgdmlydHVhbCBib29sIHdyaXRlU2V0RGVza3RvcFNpemUoKT0wOworCisgICAgLy8gTGlrZSBzZXREZXNrdG9wU2l6ZSwgd2UgY2FuJ3QganVzdCB3cml0ZSBvdXQgYSBzZXRDdXJzb3IgbWVzc2FnZQorICAgIC8vIGltbWVkaWF0ZWx5IG9uIGEgVjMgd3JpdGVyLiAgSW5zdGVhZCBvZiBjYWxsaW5nIHdyaXRlU2V0Q3Vyc29yKCkKKyAgICAvLyBkaXJlY3RseSwgeW91IG11c3QgY2FsbCBjdXJzb3JDaGFuZ2UoKSwgYW5kIHRoZW4gaW52b2tlIHdyaXRlU2V0Q3Vyc29yKCkKKyAgICAvLyBpbiByZXNwb25zZSB0byB0aGUgd3JpdGVTZXRDdXJzb3JDYWxsYmFjaygpIGNhbGxiYWNrLiAgRm9yIGEgVjMgd3JpdGVyCisgICAgLy8gdGhpcyB3aWxsIGhhcHBlbiB3aGVuIHRoZSBuZXh0IHVwZGF0ZSBpcyBzZW50LgorICAgIHZpcnR1YWwgdm9pZCBjdXJzb3JDaGFuZ2UoV3JpdGVTZXRDdXJzb3JDYWxsYmFjayogY2IpPTA7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlU2V0Q3Vyc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgUG9pbnQmIGhvdHNwb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEsIHZvaWQqIG1hc2spPTA7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlU2V0WEN1cnNvcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBob3RzcG90WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhvdHNwb3RZLCB2b2lkKiBkYXRhLCB2b2lkKiBtYXNrKT0wOworCisgICAgLy8gbmVlZEZha2VVcGRhdGUoKSByZXR1cm5zIHRydWUgd2hlbiBhbiBpbW1lZGlhdGUgdXBkYXRlIGlzIG5lZWRlZCBpbgorICAgIC8vIG9yZGVyIHRvIGZsdXNoIG91dCBzZXREZXNrdG9wU2l6ZSBvciBzZXRDdXJzb3IgcHNldWRvLXJlY3RhbmdsZXMgdG8gdGhlCisgICAgLy8gY2xpZW50LgorICAgIHZpcnR1YWwgYm9vbCBuZWVkRmFrZVVwZGF0ZSgpOworCisgICAgLy8gd3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZSgpIHdyaXRlcyBhIGZyYW1lYnVmZmVyIHVwZGF0ZSB1c2luZyB0aGUgZ2l2ZW4KKyAgICAvLyBVcGRhdGVJbmZvIGFuZCBJbWFnZUdldHRlci4gIE9uIGEgVjMgd3JpdGVyIHRoaXMgbWF5IGhhdmUKKyAgICAvLyBwc2V1ZG8tcmVjdGFuZ2xlcyBmb3Igc2V0RGVza3RvcFNpemUgYW5kIHNldEN1cnNvciBhZGRlZCB0byBpdCwgYW5kIHNvCisgICAgLy8gbWF5IGludm9rZSB3cml0ZVNldEN1cnNvckNhbGxiYWNrKCkuCisgICAgdmlydHVhbCB2b2lkIHdyaXRlRnJhbWVidWZmZXJVcGRhdGUoY29uc3QgVXBkYXRlSW5mbyYgdWksIEltYWdlR2V0dGVyKiBpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb24qIHVwZGF0ZWRSZWdpb24pOworCisgICAgLy8gd3JpdGVSZWN0cygpIGFjY2VwdHMgYW4gVXBkYXRlSW5mbyAoY2hhbmdlZCAmIGNvcGllZCByZWdpb25zKSBhbmQgYW4KKyAgICAvLyBJbWFnZUdldHRlciB0byBmZXRjaCBwaXhlbHMgZnJvbS4gIEl0IHRoZW4gY2FsbHMgd3JpdGVDb3B5UmVjdCgpIGFuZAorICAgIC8vIHdyaXRlUmVjdCgpIGFzIGFwcHJvcHJpYXRlLiAgd3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZVN0YXJ0KCkgbXVzdCBiZSB1c2VkCisgICAgLy8gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZVJlY3RzKCkgY2FsbCBhbmQgd3JpdGVGcmFtZUJ1ZmZlclVwZGF0ZUVuZCgpIGFmdGVyCisgICAgLy8gdGhlIGxhc3Qgb25lLiAgSXQgcmV0dXJucyB0aGUgYWN0dWFsIHJlZ2lvbiBzZW50IHRvIHRoZSBjbGllbnQsIHdoaWNoCisgICAgLy8gbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgdXBkYXRlIHBhc3NlZCBpbi4KKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVSZWN0cyhjb25zdCBVcGRhdGVJbmZvJiB1cGRhdGUsIEltYWdlR2V0dGVyKiBpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb24qIHVwZGF0ZWRSZWdpb24pOworCisgICAgLy8gVG8gY29uc3RydWN0IGEgZnJhbWVidWZmZXIgdXBkYXRlIHlvdSBjYW4gY2FsbAorICAgIC8vIHdyaXRlRnJhbWVidWZmZXJVcGRhdGVTdGFydCgpLCBmb2xsb3dlZCBieSBhIG51bWJlciBvZiB3cml0ZUNvcHlSZWN0KClzCisgICAgLy8gYW5kIHdyaXRlUmVjdCgpcywgZmluaXNoaW5nIHdpdGggd3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZUVuZCgpLiAgSWYgeW91CisgICAgLy8ga25vdyB0aGUgZXhhY3QgbnVtYmVyIG9mIHJlY3RhbmdsZXMgYWhlYWQgb2YgdGltZSB5b3UgY2FuIHNwZWNpZnkgaXQgdG8KKyAgICAvLyB3cml0ZUZyYW1lYnVmZmVyVXBkYXRlU3RhcnQoKSB3aGljaCBjYW4gYmUgbW9yZSBlZmZpY2llbnQuCisgICAgdmlydHVhbCB2b2lkIHdyaXRlRnJhbWVidWZmZXJVcGRhdGVTdGFydChpbnQgblJlY3RzKT0wOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZUZyYW1lYnVmZmVyVXBkYXRlU3RhcnQoKT0wOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZUZyYW1lYnVmZmVyVXBkYXRlRW5kKCk9MDsKKworICAgIC8vIHdyaXRlUmVjdCgpIHRyaWVzIHRvIHdyaXRlIHRoZSBnaXZlbiByZWN0YW5nbGUuICBJZiBpdCBpcyB1bmFibGUgdG8KKyAgICAvLyB3cml0ZSB0aGUgd2hvbGUgcmVjdGFuZ2xlIGl0IHJldHVybnMgZmFsc2UgYW5kIHNldHMgYWN0dWFsIHRvIHRoZSBhY3R1YWwKKyAgICAvLyByZWN0YW5nbGUgd2hpY2ggd2FzIHVwZGF0ZWQuCisgICAgdmlydHVhbCBib29sIHdyaXRlUmVjdChjb25zdCBSZWN0JiByLCBJbWFnZUdldHRlciogaWcsIFJlY3QqIGFjdHVhbCk7CisgICAgdmlydHVhbCBib29sIHdyaXRlUmVjdChjb25zdCBSZWN0JiByLCB1bnNpZ25lZCBpbnQgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUdldHRlciogaWcsIFJlY3QqIGFjdHVhbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb3B5UmVjdChjb25zdCBSZWN0JiByLCBpbnQgc3JjWCwgaW50IHNyY1kpOworCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0UmVjdChjb25zdCBSZWN0JiByLCB1bnNpZ25lZCBpbnQgZW5jKT0wOworICAgIHZpcnR1YWwgdm9pZCBlbmRSZWN0KCk9MDsKKworICAgIENvbm5QYXJhbXMqIGdldENvbm5QYXJhbXMoKSB7IHJldHVybiBjcDsgfQorICAgIHJkcjo6T3V0U3RyZWFtKiBnZXRPdXRTdHJlYW0oKSB7IHJldHVybiBvczsgfQorICAgIHJkcjo6VTgqIGdldEltYWdlQnVmKGludCByZXF1aXJlZCwgaW50IHJlcXVlc3RlZD0wLCBpbnQqIG5QaXhlbHM9MCk7CisgICAgaW50IGJwcCgpOworCisgICAgaW50IGdldFVwZGF0ZXNTZW50KCkgICAgICAgICAgIHsgcmV0dXJuIHVwZGF0ZXNTZW50OyB9CisgICAgaW50IGdldFJlY3RzU2VudChpbnQgZW5jb2RpbmcpIHsgcmV0dXJuIHJlY3RzU2VudFtlbmNvZGluZ107IH0KKyAgICBpbnQgZ2V0Qnl0ZXNTZW50KGludCBlbmNvZGluZykgeyByZXR1cm4gYnl0ZXNTZW50W2VuY29kaW5nXTsgfQorICAgIGludCBnZXRSYXdCeXRlc0VxdWl2YWxlbnQoKSAgICB7IHJldHVybiByYXdCeXRlc0VxdWl2YWxlbnQ7IH0KKworICAgIGludCBpbWFnZUJ1ZklkZWFsU2l6ZTsKKworICBwcm90ZWN0ZWQ6CisgICAgU01zZ1dyaXRlcihDb25uUGFyYW1zKiBjcCwgcmRyOjpPdXRTdHJlYW0qIG9zKTsKKworICAgIHZpcnR1YWwgdm9pZCBzdGFydE1zZyhpbnQgdHlwZSk9MDsKKyAgICB2aXJ0dWFsIHZvaWQgZW5kTXNnKCk9MDsKKworICAgIENvbm5QYXJhbXMqIGNwOworICAgIHJkcjo6T3V0U3RyZWFtKiBvczsKKworICAgIEVuY29kZXIqIGVuY29kZXJzW2VuY29kaW5nTWF4KzFdOworICAgIGludCBsZW5CZWZvcmVSZWN0OworICAgIHVuc2lnbmVkIGludCBjdXJyZW50RW5jb2Rpbmc7CisgICAgaW50IHVwZGF0ZXNTZW50OworICAgIGludCBieXRlc1NlbnRbZW5jb2RpbmdNYXgrMV07CisgICAgaW50IHJlY3RzU2VudFtlbmNvZGluZ01heCsxXTsKKyAgICBpbnQgcmF3Qnl0ZXNFcXVpdmFsZW50OworCisgICAgcmRyOjpVOCogaW1hZ2VCdWY7CisgICAgaW50IGltYWdlQnVmU2l6ZTsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9TTXNnV3JpdGVyVjMuY3h4IGIvY29tbW9uL3JmYi9TTXNnV3JpdGVyVjMuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NWY4NWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NNc2dXcml0ZXJWMy5jeHgKQEAgLTAsMCArMSwxOTcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmRyL01lbU91dFN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9tc2dUeXBlcy5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvQ29ublBhcmFtcy5oPgorI2luY2x1ZGUgPHJmYi9TTXNnV3JpdGVyVjMuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworU01zZ1dyaXRlclYzOjpTTXNnV3JpdGVyVjMoQ29ublBhcmFtcyogY3AsIHJkcjo6T3V0U3RyZWFtKiBvcykKKyAgOiBTTXNnV3JpdGVyKGNwLCBvcyksIHVwZGF0ZU9TKDApLCByZWFsT1Mob3MpLCBuUmVjdHNJblVwZGF0ZSgwKSwKKyAgICBuUmVjdHNJbkhlYWRlcigwKSwgd3NjY2IoMCksCisgICAgbmVlZFNldERlc2t0b3BTaXplKGZhbHNlKQoreworfQorCitTTXNnV3JpdGVyVjM6On5TTXNnV3JpdGVyVjMoKQoreworICBkZWxldGUgdXBkYXRlT1M7Cit9CisKK3ZvaWQgU01zZ1dyaXRlclYzOjp3cml0ZVNlcnZlckluaXQoKQoreworICBvcy0+d3JpdGVVMTYoY3AtPndpZHRoKTsKKyAgb3MtPndyaXRlVTE2KGNwLT5oZWlnaHQpOworICBjcC0+cGYoKS53cml0ZShvcyk7CisgIG9zLT53cml0ZVN0cmluZyhjcC0+bmFtZSgpKTsKKyAgZW5kTXNnKCk7Cit9CisKK3ZvaWQgU01zZ1dyaXRlclYzOjpzdGFydE1zZyhpbnQgdHlwZSkKK3sKKyAgaWYgKG9zICE9IHJlYWxPUykKKyAgICB0aHJvdyBFeGNlcHRpb24oInN0YXJ0TXNnIGNhbGxlZCB3aGlsZSB3cml0aW5nIGFuIHVwZGF0ZT8iKTsKKworICBvcy0+d3JpdGVVOCh0eXBlKTsKK30KKwordm9pZCBTTXNnV3JpdGVyVjM6OmVuZE1zZygpCit7CisgIG9zLT5mbHVzaCgpOworfQorCitib29sIFNNc2dXcml0ZXJWMzo6d3JpdGVTZXREZXNrdG9wU2l6ZSgpIHsKKyAgaWYgKCFjcC0+c3VwcG9ydHNEZXNrdG9wUmVzaXplKSByZXR1cm4gZmFsc2U7CisgIG5lZWRTZXREZXNrdG9wU2l6ZSA9IHRydWU7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNNc2dXcml0ZXJWMzo6Y3Vyc29yQ2hhbmdlKFdyaXRlU2V0Q3Vyc29yQ2FsbGJhY2sqIGNiKQoreworICB3c2NjYiA9IGNiOworfQorCit2b2lkIFNNc2dXcml0ZXJWMzo6d3JpdGVTZXRDdXJzb3IoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBQb2ludCYgaG90c3BvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhLCB2b2lkKiBtYXNrKQoreworICBpZiAoIXdzY2NiKSByZXR1cm47CisgIGlmICgrK25SZWN0c0luVXBkYXRlID4gblJlY3RzSW5IZWFkZXIgJiYgblJlY3RzSW5IZWFkZXIpCisgICAgdGhyb3cgRXhjZXB0aW9uKCJTTXNnV3JpdGVyVjM6OndyaXRlU2V0Q3Vyc29yOiBuUmVjdHMgb3V0IG9mIHN5bmMiKTsKKyAgb3MtPndyaXRlUzE2KGhvdHNwb3QueCk7CisgIG9zLT53cml0ZVMxNihob3RzcG90LnkpOworICBvcy0+d3JpdGVVMTYod2lkdGgpOworICBvcy0+d3JpdGVVMTYoaGVpZ2h0KTsKKyAgb3MtPndyaXRlVTMyKHBzZXVkb0VuY29kaW5nQ3Vyc29yKTsKKyAgb3MtPndyaXRlQnl0ZXMoZGF0YSwgd2lkdGggKiBoZWlnaHQgKiAoY3AtPnBmKCkuYnBwLzgpKTsKKyAgb3MtPndyaXRlQnl0ZXMobWFzaywgKHdpZHRoKzcpLzggKiBoZWlnaHQpOworfQorCit2b2lkIFNNc2dXcml0ZXJWMzo6d3JpdGVTZXRYQ3Vyc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGhvdHNwb3RYLAorCQkJCSAgIGludCBob3RzcG90WSwgdm9pZCogZGF0YSwgdm9pZCogbWFzaykKK3sKKyAgaWYgKCF3c2NjYikgcmV0dXJuOworICBpZiAoKytuUmVjdHNJblVwZGF0ZSA+IG5SZWN0c0luSGVhZGVyICYmIG5SZWN0c0luSGVhZGVyKQorICAgIHRocm93IEV4Y2VwdGlvbigiU01zZ1dyaXRlclYzOjp3cml0ZVNldFhDdXJzb3I6IG5SZWN0cyBvdXQgb2Ygc3luYyIpOworICBvcy0+d3JpdGVTMTYoaG90c3BvdFgpOworICBvcy0+d3JpdGVTMTYoaG90c3BvdFkpOworICBvcy0+d3JpdGVVMTYod2lkdGgpOworICBvcy0+d3JpdGVVMTYoaGVpZ2h0KTsKKyAgb3MtPndyaXRlVTMyKHBzZXVkb0VuY29kaW5nWEN1cnNvcik7CisgIC8vIEZJWE1FOiBXZSBvbmx5IHN1cHBvcnQgYmxhY2sgYW5kIHdoaXRlIGN1cnNvcnMsIGN1cnJlbnRseS4gV2UKKyAgLy8gY291bGQgcGFzcyB0aGUgY29ycmVjdCBjb2xvciBieSB1c2luZyB0aGUgcGl4MC9waXgxIHZhbHVlcworICAvLyByZXR1cm5lZCBmcm9tIGdldEJpdG1hcCwgaW4gd3JpdGVTZXRDdXJzb3JDYWxsYmFjay4gSG93ZXZlciwgd2UKKyAgLy8gd291bGQgdGhlbiBuZWVkIHRvIHVuZG8gdGhlIGNvbnZlcnNpb24gZnJvbSByZ2IgdG8gUGl4ZWwgdGhhdCBpcworICAvLyBkb25lIGJ5IEZha2VBbGxvY0NvbG9yLiAKKyAgaWYgKHdpZHRoICogaGVpZ2h0KSB7CisgICAgb3MtPndyaXRlVTgoMCk7CisgICAgb3MtPndyaXRlVTgoMCk7CisgICAgb3MtPndyaXRlVTgoMCk7CisgICAgb3MtPndyaXRlVTgoMjU1KTsKKyAgICBvcy0+d3JpdGVVOCgyNTUpOworICAgIG9zLT53cml0ZVU4KDI1NSk7CisgICAgb3MtPndyaXRlQnl0ZXMoZGF0YSwgKHdpZHRoKzcpLzggKiBoZWlnaHQpOworICAgIG9zLT53cml0ZUJ5dGVzKG1hc2ssICh3aWR0aCs3KS84ICogaGVpZ2h0KTsKKyAgfQorfQorCit2b2lkIFNNc2dXcml0ZXJWMzo6d3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZVN0YXJ0KGludCBuUmVjdHMpCit7CisgIHN0YXJ0TXNnKG1zZ1R5cGVGcmFtZWJ1ZmZlclVwZGF0ZSk7CisgIG9zLT5wYWQoMSk7CisgIGlmICh3c2NjYikgblJlY3RzKys7CisgIGlmIChuZWVkU2V0RGVza3RvcFNpemUpIG5SZWN0cysrOworICBvcy0+d3JpdGVVMTYoblJlY3RzKTsKKyAgblJlY3RzSW5VcGRhdGUgPSAwOworICBuUmVjdHNJbkhlYWRlciA9IG5SZWN0czsKKyAgaWYgKHdzY2NiKSB7CisgICAgd3NjY2ItPndyaXRlU2V0Q3Vyc29yQ2FsbGJhY2soKTsKKyAgICB3c2NjYiA9IDA7CisgIH0KK30KKwordm9pZCBTTXNnV3JpdGVyVjM6OndyaXRlRnJhbWVidWZmZXJVcGRhdGVTdGFydCgpCit7CisgIG5SZWN0c0luVXBkYXRlID0gblJlY3RzSW5IZWFkZXIgPSAwOworICBpZiAoIXVwZGF0ZU9TKQorICAgIHVwZGF0ZU9TID0gbmV3IHJkcjo6TWVtT3V0U3RyZWFtOworICBvcyA9IHVwZGF0ZU9TOworfQorCit2b2lkIFNNc2dXcml0ZXJWMzo6d3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZUVuZCgpCit7CisgIGlmIChuZWVkU2V0RGVza3RvcFNpemUpIHsKKyAgICBpZiAoIWNwLT5zdXBwb3J0c0Rlc2t0b3BSZXNpemUpCisgICAgICB0aHJvdyBFeGNlcHRpb24oIkNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IGRlc2t0b3AgcmVzaXplIik7CisgICAgaWYgKCsrblJlY3RzSW5VcGRhdGUgPiBuUmVjdHNJbkhlYWRlciAmJiBuUmVjdHNJbkhlYWRlcikKKyAgICAgIHRocm93IEV4Y2VwdGlvbigiU01zZ1dyaXRlclYzIHNldERlc2t0b3BTaXplOiBuUmVjdHMgb3V0IG9mIHN5bmMiKTsKKyAgICBvcy0+d3JpdGVTMTYoMCk7CisgICAgb3MtPndyaXRlUzE2KDApOworICAgIG9zLT53cml0ZVUxNihjcC0+d2lkdGgpOworICAgIG9zLT53cml0ZVUxNihjcC0+aGVpZ2h0KTsKKyAgICBvcy0+d3JpdGVVMzIocHNldWRvRW5jb2RpbmdEZXNrdG9wU2l6ZSk7CisgICAgbmVlZFNldERlc2t0b3BTaXplID0gZmFsc2U7CisgIH0KKworICBpZiAoblJlY3RzSW5VcGRhdGUgIT0gblJlY3RzSW5IZWFkZXIgJiYgblJlY3RzSW5IZWFkZXIpCisgICAgdGhyb3cgRXhjZXB0aW9uKCJTTXNnV3JpdGVyVjM6OndyaXRlRnJhbWVidWZmZXJVcGRhdGVFbmQ6ICIKKyAgICAgICAgICAgICAgICAgICAgIm5SZWN0cyBvdXQgb2Ygc3luYyIpOworICBpZiAob3MgPT0gdXBkYXRlT1MpIHsKKyAgICBvcyA9IHJlYWxPUzsKKyAgICBzdGFydE1zZyhtc2dUeXBlRnJhbWVidWZmZXJVcGRhdGUpOworICAgIG9zLT5wYWQoMSk7CisgICAgb3MtPndyaXRlVTE2KG5SZWN0c0luVXBkYXRlKTsKKyAgICBvcy0+d3JpdGVCeXRlcyh1cGRhdGVPUy0+ZGF0YSgpLCB1cGRhdGVPUy0+bGVuZ3RoKCkpOworICAgIHVwZGF0ZU9TLT5jbGVhcigpOworICB9CisKKyAgdXBkYXRlc1NlbnQrKzsKKyAgZW5kTXNnKCk7Cit9CisKK2Jvb2wgU01zZ1dyaXRlclYzOjpuZWVkRmFrZVVwZGF0ZSgpCit7CisgIHJldHVybiB3c2NjYiB8fCBuZWVkU2V0RGVza3RvcFNpemU7Cit9CisKK3ZvaWQgU01zZ1dyaXRlclYzOjpzdGFydFJlY3QoY29uc3QgUmVjdCYgciwgdW5zaWduZWQgaW50IGVuY29kaW5nKQoreworICBpZiAoKytuUmVjdHNJblVwZGF0ZSA+IG5SZWN0c0luSGVhZGVyICYmIG5SZWN0c0luSGVhZGVyKQorICAgIHRocm93IEV4Y2VwdGlvbigiU01zZ1dyaXRlclYzOjpzdGFydFJlY3Q6IG5SZWN0cyBvdXQgb2Ygc3luYyIpOworCisgIGN1cnJlbnRFbmNvZGluZyA9IGVuY29kaW5nOworICBsZW5CZWZvcmVSZWN0ID0gb3MtPmxlbmd0aCgpOworICBpZiAoZW5jb2RpbmcgIT0gZW5jb2RpbmdDb3B5UmVjdCkKKyAgICByYXdCeXRlc0VxdWl2YWxlbnQgKz0gMTIgKyByLndpZHRoKCkgKiByLmhlaWdodCgpICogKGJwcCgpLzgpOworCisgIG9zLT53cml0ZVMxNihyLnRsLngpOworICBvcy0+d3JpdGVTMTYoci50bC55KTsKKyAgb3MtPndyaXRlVTE2KHIud2lkdGgoKSk7CisgIG9zLT53cml0ZVUxNihyLmhlaWdodCgpKTsKKyAgb3MtPndyaXRlVTMyKGVuY29kaW5nKTsKK30KKwordm9pZCBTTXNnV3JpdGVyVjM6OmVuZFJlY3QoKQoreworICBpZiAoY3VycmVudEVuY29kaW5nIDw9IGVuY29kaW5nTWF4KSB7CisgICAgYnl0ZXNTZW50W2N1cnJlbnRFbmNvZGluZ10gKz0gb3MtPmxlbmd0aCgpIC0gbGVuQmVmb3JlUmVjdDsKKyAgICByZWN0c1NlbnRbY3VycmVudEVuY29kaW5nXSsrOworICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1NNc2dXcml0ZXJWMy5oIGIvY29tbW9uL3JmYi9TTXNnV3JpdGVyVjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDFmYTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9TTXNnV3JpdGVyVjMuaApAQCAtMCwwICsxLDU3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fUkZCX1NNU0dXUklURVJWM19IX18KKyNkZWZpbmUgX19SRkJfU01TR1dSSVRFUlYzX0hfXworCisjaW5jbHVkZSA8cmZiL1NNc2dXcml0ZXIuaD4KKworbmFtZXNwYWNlIHJkciB7IGNsYXNzIE1lbU91dFN0cmVhbTsgfQorCituYW1lc3BhY2UgcmZiIHsKKyAgY2xhc3MgU01zZ1dyaXRlclYzIDogcHVibGljIFNNc2dXcml0ZXIgeworICBwdWJsaWM6CisgICAgU01zZ1dyaXRlclYzKENvbm5QYXJhbXMqIGNwLCByZHI6Ok91dFN0cmVhbSogb3MpOworICAgIHZpcnR1YWwgflNNc2dXcml0ZXJWMygpOworCisgICAgdmlydHVhbCB2b2lkIHdyaXRlU2VydmVySW5pdCgpOworICAgIHZpcnR1YWwgdm9pZCBzdGFydE1zZyhpbnQgdHlwZSk7CisgICAgdmlydHVhbCB2b2lkIGVuZE1zZygpOworICAgIHZpcnR1YWwgYm9vbCB3cml0ZVNldERlc2t0b3BTaXplKCk7CisgICAgdmlydHVhbCB2b2lkIGN1cnNvckNoYW5nZShXcml0ZVNldEN1cnNvckNhbGxiYWNrKiBjYik7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlU2V0Q3Vyc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgUG9pbnQmIGhvdHNwb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEsIHZvaWQqIG1hc2spOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZVNldFhDdXJzb3IoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgaG90c3BvdFgsCisJCQkJIGludCBob3RzcG90WSwgdm9pZCogZGF0YSwgdm9pZCogbWFzayk7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlRnJhbWVidWZmZXJVcGRhdGVTdGFydChpbnQgblJlY3RzKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZVN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlRnJhbWVidWZmZXJVcGRhdGVFbmQoKTsKKyAgICB2aXJ0dWFsIGJvb2wgbmVlZEZha2VVcGRhdGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRSZWN0KGNvbnN0IFJlY3QmIHIsIHVuc2lnbmVkIGludCBlbmNvZGluZyk7CisgICAgdmlydHVhbCB2b2lkIGVuZFJlY3QoKTsKKworICBwcml2YXRlOgorICAgIHJkcjo6TWVtT3V0U3RyZWFtKiB1cGRhdGVPUzsKKyAgICByZHI6Ok91dFN0cmVhbSogcmVhbE9TOworICAgIGludCBuUmVjdHNJblVwZGF0ZTsKKyAgICBpbnQgblJlY3RzSW5IZWFkZXI7CisgICAgV3JpdGVTZXRDdXJzb3JDYWxsYmFjayogd3NjY2I7CisgICAgYm9vbCBuZWVkU2V0RGVza3RvcFNpemU7CisgICAgYm9vbCBuZWVkTGFzdFJlY3Q7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU1NlY3VyaXR5LmggYi9jb21tb24vcmZiL1NTZWN1cml0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODk4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NTZWN1cml0eS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBTU2VjdXJpdHkgLSBjbGFzcyBvbiB0aGUgc2VydmVyIHNpZGUgZm9yIGhhbmRsaW5nIHNlY3VyaXR5IGhhbmRzaGFraW5nLiAgQQorLy8gZGVyaXZlZCBjbGFzcyBmb3IgYSBwYXJ0aWN1bGFyIHNlY3VyaXR5IHR5cGUgb3ZlcnJpZGVzIHRoZSBwcm9jZXNzTXNnKCkKKy8vIG1ldGhvZC4KKworLy8gcHJvY2Vzc01zZygpIGlzIGNhbGxlZCBmaXJzdCB3aGVuIHRoZSBzZWN1cml0eSB0eXBlIGhhcyBiZWVuIGRlY2lkZWQgb24sIGFuZAorLy8gd2lsbCBrZWVwIGJlaW5nIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBkYXRhIHRvIHJlYWQgZnJvbSB0aGUgY2xpZW50LiAgSXQKKy8vIHNob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBpdCBuZWVkcyBtb3JlIGRhdGEsIG9yIHRydWUgd2hlbiB0aGUgY29ubmVjdGlvbiBoYXMKKy8vIGJlZW4gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQuICBJbiB0aGUgZXZlbnQgb2YgYXV0aGVudGljYXRpb24gZmFpbHVyZSBhbgorLy8gQXV0aEZhaWx1cmVFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biAtIHRoaXMgd2lsbCByZXN1bHQgaW4gYSAiZmFpbGVkIgorLy8gc2VjdXJpdHkgcmVzdWx0IGJlaW5nIHNlbnQgdG8gdGhlIGNsaWVudCB3aXRoIHRoZSBzdHIoKSBmcm9tIHRoZSBleGNlcHRpb24KKy8vIGJlaW5nIHNlbnQgYXMgdGhlIHJlYXNvbi4gIEFueSBvdGhlciB0eXBlIG9mIGZhaWx1cmUgc2hvdWxkIGJlIGluZGljYXRlZCBieQorLy8gc29tZSBvdGhlciBraW5kIG9mIGV4Y2VwdGlvbiB3aGljaCB3aWxsIGNhdXNlIHRoZSBjb25uZWN0aW9uIHRvIGJlIGFib3J0ZWQuCisvLworLy8gcHJvY2Vzc01zZygpIG11c3QgbmV2ZXIgYmxvY2sgKG9yIGF0IGxlYXN0IG11c3QgbmV2ZXIgYmxvY2sgdW50aWwgdGhlIGNsaWVudAorLy8gaGFzIGJlZW4gYXV0aGVudGljYXRlZCkgLSB0aGlzIGlzIHRvIHByZXZlbnQgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrcy4KKy8vIE5vdGUgdGhhdCB0aGUgZmlyc3QgdGltZSBwcm9jZXNzTXNnKCkgaXMgY2FsbGVkLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorLy8gdGhlcmUgaXMgYW55IGRhdGEgdG8gcmVhZCBmcm9tIHRoZSBTQ29ubmVjdGlvbidzIEluU3RyZWFtLCBidXQgc3Vic2VxdWVudAorLy8gY2FsbHMgZ3VhcmFudGVlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBieXRlIHdoaWNoIGNhbiBiZSByZWFkIHdpdGhvdXQKKy8vIGJsb2NraW5nLgorLy8KKy8vIGdldFR5cGUoKSBzaG91bGQgcmV0dXJuIHRoZSBzZWNUeXBlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNTZWN1cml0eQorLy8gaW1wbGVtZW50YXRpb24uCisvLworCisjaWZuZGVmIF9fUkZCX1NTRUNVUklUWV9IX18KKyNkZWZpbmUgX19SRkJfU1NFQ1VSSVRZX0hfXworCisjaW5jbHVkZSA8cmRyL3R5cGVzLmg+CisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBTQ29ubmVjdGlvbjsKKworICBjbGFzcyBTU2VjdXJpdHkgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+U1NlY3VyaXR5KCkge30KKyAgICB2aXJ0dWFsIGJvb2wgcHJvY2Vzc01zZyhTQ29ubmVjdGlvbiogc2MpPTA7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzOyB9CisgICAgdmlydHVhbCBpbnQgZ2V0VHlwZSgpIGNvbnN0ID0gMDsKKworICAgIC8vIGdldFVzZXJOYW1lKCkgZ2V0cyB0aGUgbmFtZSBvZiB0aGUgdXNlciBhdHRlbXB0aW5nIGF1dGhlbnRpY2F0aW9uLiAgVGhlCisgICAgLy8gc3RvcmFnZSBpcyBvd25lZCBieSB0aGUgU1NlY3VyaXR5IG9iamVjdCwgc28gYSBjb3B5IG11c3QgYmUgdGFrZW4gaWYKKyAgICAvLyBuZWNlc3NhcnkuICBOdWxsIG1heSBiZSByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHVzZXIgbmFtZQorICAgIC8vIGZvciB0aGlzIHNlY3VyaXR5IHR5cGUuCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBnZXRVc2VyTmFtZSgpIGNvbnN0ID0gMDsKKyAgfTsKKworICAvLyBTU2VjdXJpdHlGYWN0b3J5IGNyZWF0ZXMgbmV3IFNTZWN1cml0eSBpbnN0YW5jZXMgZm9yCisgIC8vIHBhcnRpY3VsYXIgc2VjdXJpdHkgdHlwZXMuCisgIC8vIFRoZSBpbnN0YW5jZXMgbXVzdCBiZSBkZXN0cm95ZWQgYnkgY2FsbGluZyBkZXN0cm95KCkKKyAgLy8gb24gdGhlbSB3aGVuIGRvbmUuCisgIC8vIGdldFNlY1R5cGVzIHJldHVybnMgYSBsaXN0IG9mIHRoZSBzZWN1cml0eSB0eXBlcyB0aGF0IGFyZSBib3RoIGNvbmZpZ3VyZWQKKyAgLy8gYW5kIGFjdHVhbGx5IHN1cHBvcnRlZC4gIFdoaWNoIGNvbmZpZ3VyYXRpb24gaXMgY29uc2lkZXJlZCBkZXBlbmRzIG9uIHRoZQorICAvLyByZXZlcnNlQ29ubmVjdGlvbiBwYXJhbWV0ZXIuCisgIGNsYXNzIFNTZWN1cml0eUZhY3RvcnkgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+U1NlY3VyaXR5RmFjdG9yeSgpIHt9CisgICAgdmlydHVhbCBTU2VjdXJpdHkqIGdldFNTZWN1cml0eShyZHI6OlU4IHNlY1R5cGUsIGJvb2wgbm9BdXRoPWZhbHNlKT0wOworICAgIHZpcnR1YWwgdm9pZCBnZXRTZWNUeXBlcyhzdGQ6Omxpc3Q8cmRyOjpVOD4qIHNlY1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJldmVyc2VDb25uZWN0aW9uKSA9IDA7CisgIH07CisKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9TU2VjdXJpdHlGYWN0b3J5U3RhbmRhcmQuY3h4IGIvY29tbW9uL3JmYi9TU2VjdXJpdHlGYWN0b3J5U3RhbmRhcmQuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzI2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NTZWN1cml0eUZhY3RvcnlTdGFuZGFyZC5jeHgKQEAgLTAsMCArMSwxMjggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBTU2VjdXJpdHlGYWN0b3J5U3RhbmRhcmQKKy8vCisKKyNpbmNsdWRlIDxyZmIvc2VjVHlwZXMuaD4KKyNpbmNsdWRlIDxyZmIvU1NlY3VyaXR5Tm9uZS5oPgorI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8cmZiL0xvZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkLmg+CisjaW5jbHVkZSA8cmZiL1Bhc3N3b3JkLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK3N0YXRpYyBMb2dXcml0ZXIgdmxvZygiU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkIik7CisKK1N0cmluZ1BhcmFtZXRlciBTU2VjdXJpdHlGYWN0b3J5U3RhbmRhcmQ6OnNlY190eXBlcworKCJTZWN1cml0eVR5cGVzIiwKKyAiU3BlY2lmeSB3aGljaCBzZWN1cml0eSBzY2hlbWUgdG8gdXNlIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyAoTm9uZSwgVm5jQXV0aCkiLAorICJWbmNBdXRoIik7CisKK1N0cmluZ1BhcmFtZXRlciBTU2VjdXJpdHlGYWN0b3J5U3RhbmRhcmQ6OnJldl9zZWNfdHlwZXMKKygiUmV2ZXJzZVNlY3VyaXR5VHlwZXMiLAorICJTcGVjaWZ5IGVuY3J5cHRpb24gc2NoZW1lIHRvIHVzZSBmb3IgcmV2ZXJzZSBjb25uZWN0aW9ucyAoTm9uZSkiLAorICJOb25lIik7CisKKworU3RyaW5nUGFyYW1ldGVyIFNTZWN1cml0eUZhY3RvcnlTdGFuZGFyZDo6dm5jQXV0aFBhc3N3ZEZpbGUKKygiUGFzc3dvcmRGaWxlIiwgIlBhc3N3b3JkIGZpbGUgZm9yIFZOQyBhdXRoZW50aWNhdGlvbiIsICIiKTsKK1ZuY0F1dGhQYXNzd2RQYXJhbWV0ZXIgU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkOjp2bmNBdXRoUGFzc3dkCisoIlBhc3N3b3JkIiwgIk9iZnVzY2F0ZWQgYmluYXJ5IGVuY29kaW5nIG9mIHRoZSBwYXNzd29yZCB3aGljaCBjbGllbnRzIG11c3Qgc3VwcGx5IHRvICIKKyAiYWNjZXNzIHRoZSBzZXJ2ZXIiLCAmU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkOjp2bmNBdXRoUGFzc3dkRmlsZSk7CisKKworU1NlY3VyaXR5KiBTU2VjdXJpdHlGYWN0b3J5U3RhbmRhcmQ6OmdldFNTZWN1cml0eShyZHI6OlU4IHNlY1R5cGUsIGJvb2wgcmV2ZXJzZUNvbm5lY3Rpb24pIHsKKyAgc3dpdGNoIChzZWNUeXBlKSB7CisgIGNhc2Ugc2VjVHlwZU5vbmU6IHJldHVybiBuZXcgU1NlY3VyaXR5Tm9uZSgpOworICBjYXNlIHNlY1R5cGVWbmNBdXRoOgorICAgIHJldHVybiBuZXcgU1NlY3VyaXR5Vm5jQXV0aCgmdm5jQXV0aFBhc3N3ZCk7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgRXhjZXB0aW9uKCJTZWN1cml0eSB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgfQorfQorCit2b2lkIFNTZWN1cml0eUZhY3RvcnlTdGFuZGFyZDo6Z2V0U2VjVHlwZXMoc3RkOjpsaXN0PHJkcjo6VTg+KiBzZWNUeXBlcywgYm9vbCByZXZlcnNlQ29ubmVjdGlvbikgeworICBDaGFyQXJyYXkgc2VjVHlwZXNTdHI7CisgIGlmIChyZXZlcnNlQ29ubmVjdGlvbikKKyAgICBzZWNUeXBlc1N0ci5idWYgPSByZXZfc2VjX3R5cGVzLmdldERhdGEoKTsKKyAgZWxzZQorICAgIHNlY1R5cGVzU3RyLmJ1ZiA9IHNlY190eXBlcy5nZXREYXRhKCk7CisgIHN0ZDo6bGlzdDxpbnQ+IGNvbmZpZ3VyZWQgPSBwYXJzZVNlY1R5cGVzKHNlY1R5cGVzU3RyLmJ1Zik7CisgIHN0ZDo6bGlzdDxpbnQ+OjppdGVyYXRvciBpOworICBmb3IgKGk9Y29uZmlndXJlZC5iZWdpbigpOyBpIT1jb25maWd1cmVkLmVuZCgpOyBpKyspIHsKKyAgICBpZiAoaXNTZWNUeXBlU3VwcG9ydGVkKCppKSkKKyAgICAgIHNlY1R5cGVzLT5wdXNoX2JhY2soKmkpOworICB9Cit9CisKK2Jvb2wgU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkOjppc1NlY1R5cGVTdXBwb3J0ZWQocmRyOjpVOCBzZWNUeXBlKSB7CisgIHN3aXRjaCAoc2VjVHlwZSkgeworICBjYXNlIHNlY1R5cGVOb25lOgorICBjYXNlIHNlY1R5cGVWbmNBdXRoOgorICAgIHJldHVybiB0cnVlOworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisKK1ZuY0F1dGhQYXNzd2RQYXJhbWV0ZXI6OlZuY0F1dGhQYXNzd2RQYXJhbWV0ZXIoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGFyYW1ldGVyKiBwYXNzd2RGaWxlXykKKzogQmluYXJ5UGFyYW1ldGVyKG5hbWUsIGRlc2MsIDAsIDApLCBwYXNzd2RGaWxlKHBhc3N3ZEZpbGVfKSB7Cit9CisKK2NoYXIqIFZuY0F1dGhQYXNzd2RQYXJhbWV0ZXI6OmdldFZuY0F1dGhQYXNzd2QoKSB7CisgIE9iZnVzY2F0ZWRQYXNzd2Qgb2JmdXNjYXRlZDsKKyAgZ2V0RGF0YSgodm9pZCoqKSZvYmZ1c2NhdGVkLmJ1ZiwgJm9iZnVzY2F0ZWQubGVuZ3RoKTsKKworICBpZiAob2JmdXNjYXRlZC5sZW5ndGggPT0gMCkgeworICAgIGlmIChwYXNzd2RGaWxlKSB7CisgICAgICBDaGFyQXJyYXkgZm5hbWUocGFzc3dkRmlsZS0+Z2V0RGF0YSgpKTsKKyAgICAgIGlmICghZm5hbWUuYnVmWzBdKSB7CisgICAgICAgIHZsb2cuaW5mbygibmVpdGhlciAlcyBub3IgJXMgcGFyYW1zIHNldCIsIGdldE5hbWUoKSwgcGFzc3dkRmlsZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIEZJTEUqIGZwID0gZm9wZW4oZm5hbWUuYnVmLCAiciIpOworICAgICAgaWYgKCFmcCkgeworICAgICAgICB2bG9nLmVycm9yKCJvcGVuaW5nIHBhc3N3b3JkIGZpbGUgJyVzJyBmYWlsZWQiLGZuYW1lLmJ1Zik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICB2bG9nLmRlYnVnKCJyZWFkaW5nIHBhc3N3b3JkIGZpbGUiKTsKKyAgICAgIG9iZnVzY2F0ZWQuYnVmID0gbmV3IGNoYXJbMTI4XTsKKyAgICAgIG9iZnVzY2F0ZWQubGVuZ3RoID0gZnJlYWQob2JmdXNjYXRlZC5idWYsIDEsIDEyOCwgZnApOworICAgICAgZmNsb3NlKGZwKTsKKyAgICB9IGVsc2UgeworICAgICAgdmxvZy5pbmZvKCIlcyBwYXJhbWV0ZXIgbm90IHNldCIsIGdldE5hbWUoKSk7CisgICAgfQorICB9CisKKyAgdHJ5IHsKKyAgICBQbGFpblBhc3N3ZCBwYXNzd29yZChvYmZ1c2NhdGVkKTsKKyAgICByZXR1cm4gcGFzc3dvcmQudGFrZUJ1ZigpOworICB9IGNhdGNoICguLi4pIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkLmggYi9jb21tb24vcmZiL1NTZWN1cml0eUZhY3RvcnlTdGFuZGFyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTg4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NTZWN1cml0eUZhY3RvcnlTdGFuZGFyZC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8KKy8vIFNTZWN1cml0eUZhY3RvcnlTdGFuZGFyZCAtIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTU2VjdXJpdHlGYWN0b3J5CisvLyBpbnRlcmZhY2UuCisvLworLy8gU2VydmVyIGltcGxlbWVudGF0aW9ucyBtdXN0IGRlZmluZSBhbiBpbnN0YW5jZSBvZiBhCisvLyBWbmNBdXRoUGFzc3dkUGFyYW1ldGVyLWJhc2VkIGNsYXNzIHNvbWV3aGVyZS4gIEFueSBjbGFzcyBiYXNlZCBvbgorLy8gVm5jQXV0aFBhc3N3ZFBhcmFtZXRlciB3aWxsIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXIgaXRzZWxmIGFzIHRoZQorLy8gcGFzc3dvcmQgcGFyYW1ldGVyIHRvIGJlIHVzZWQgYnkgdGhlIFN0YW5kYXJkIGZhY3RvcnkuCisvLworLy8gVHdvIGltcGxlbWVudGF0aW9ucyBhcmUgcHJvdmlkZWQgaGVyZToKKy8vCisvLyBWbmNBdXRoUGFzc3dkQ29uZmlnUGFyYW1ldGVyIC0gcmVhZHMgdGhlIHBhc3N3b3JkIGZyb20gdGhlIEJpbmFyeQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciAiUGFzc3dvcmQiLgorLy8gVm5jQXV0aFBhc3N3ZEZpbGVQYXJhbWV0ZXIgICAtIHJlYWRzIHRoZSBwYXNzd29yZCBmcm9tIHRoZSBmaWxlIG5hbWVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIFN0cmluZyBwYXJhbWV0ZXIgIlBhc3N3b3JkRmlsZSIuCisvLworLy8gVGhpcyBmYWN0b3J5IHN1cHBvcnRzIG9ubHkgdGhlICJOb25lIiBhbmQgIlZuY0F1dGgiIHNlY3VyaXR5IHR5cGVzLgorLy8KKworI2lmbmRlZiBfX1JGQl9TU0VDVVJJVFlGQUNUT1JZX1NUQU5EQVJEX0hfXworI2RlZmluZSBfX1JGQl9TU0VDVVJJVFlGQUNUT1JZX1NUQU5EQVJEX0hfXworCisjaW5jbHVkZSA8cmZiL1NTZWN1cml0eVZuY0F1dGguaD4KKyNpbmNsdWRlIDxyZmIvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIFZuY0F1dGhQYXNzd2RQYXJhbWV0ZXIgOiBwdWJsaWMgVm5jQXV0aFBhc3N3ZEdldHRlciwgQmluYXJ5UGFyYW1ldGVyIHsKKyAgcHVibGljOgorICAgIFZuY0F1dGhQYXNzd2RQYXJhbWV0ZXIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogZGVzYywgU3RyaW5nUGFyYW1ldGVyKiBwYXNzd2RGaWxlXyk7CisgICAgdmlydHVhbCBjaGFyKiBnZXRWbmNBdXRoUGFzc3dkKCk7CisgIHByb3RlY3RlZDoKKyAgICBTdHJpbmdQYXJhbWV0ZXIqIHBhc3N3ZEZpbGU7CisgIH07CisKKyAgY2xhc3MgU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkIDogcHVibGljIFNTZWN1cml0eUZhY3RvcnkgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBTU2VjdXJpdHkqIGdldFNTZWN1cml0eShyZHI6OlU4IHNlY1R5cGUsIGJvb2wgcmV2ZXJzZSk7CisgICAgdmlydHVhbCB2b2lkIGdldFNlY1R5cGVzKHN0ZDo6bGlzdDxyZHI6OlU4Piogc2VjVHlwZXMsIGJvb2wgcmV2ZXJzZSk7CisgICAgc3RhdGljIFN0cmluZ1BhcmFtZXRlciBzZWNfdHlwZXM7CisgICAgc3RhdGljIFN0cmluZ1BhcmFtZXRlciByZXZfc2VjX3R5cGVzOworICAgIHN0YXRpYyBTdHJpbmdQYXJhbWV0ZXIgdm5jQXV0aFBhc3N3ZEZpbGU7CisgICAgc3RhdGljIFZuY0F1dGhQYXNzd2RQYXJhbWV0ZXIgdm5jQXV0aFBhc3N3ZDsKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCBpc1NlY1R5cGVTdXBwb3J0ZWQocmRyOjpVOCBzZWNUeXBlKTsKKyAgfTsKKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1NTZWN1cml0eU5vbmUuaCBiL2NvbW1vbi9yZmIvU1NlY3VyaXR5Tm9uZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMTlmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NTZWN1cml0eU5vbmUuaApAQCAtMCwwICsxLDM2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gU1NlY3VyaXR5Tm9uZS5oCisvLworCisjaWZuZGVmIF9fU1NFQ1VSSVRZTk9ORV9IX18KKyNkZWZpbmUgX19TU0VDVVJJVFlOT05FX0hfXworCisjaW5jbHVkZSA8cmZiL1NTZWN1cml0eS5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBTU2VjdXJpdHlOb25lIDogcHVibGljIFNTZWN1cml0eSB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgcHJvY2Vzc01zZyhTQ29ubmVjdGlvbiogc2MpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGludCBnZXRUeXBlKCkgY29uc3Qge3JldHVybiBzZWNUeXBlTm9uZTt9CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBnZXRVc2VyTmFtZSgpIGNvbnN0IHtyZXR1cm4gMDt9CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU1NlY3VyaXR5Vm5jQXV0aC5jeHggYi9jb21tb24vcmZiL1NTZWN1cml0eVZuY0F1dGguY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTNiOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NTZWN1cml0eVZuY0F1dGguY3h4CkBAIC0wLDAgKzEsODcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBTU2VjdXJpdHlWbmNBdXRoCisvLworLy8gWFhYIG5vdCB0aHJlYWQtc2FmZSwgYmVjYXVzZSBkM2RlcyBpc24ndCAtIGRvIHdlIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcz8KKy8vCisKKyNpbmNsdWRlIDxyZmIvU1NlY3VyaXR5Vm5jQXV0aC5oPgorI2luY2x1ZGUgPHJkci9SYW5kb21TdHJlYW0uaD4KKyNpbmNsdWRlIDxyZmIvU0Nvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxyZmIvUGFzc3dvcmQuaD4KKyNpbmNsdWRlIDxyZmIvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvdXRpbC5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8cmZiL2QzZGVzLmg+Cit9CisKKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworc3RhdGljIExvZ1dyaXRlciB2bG9nKCJTVm5jQXV0aCIpOworCisKK1NTZWN1cml0eVZuY0F1dGg6OlNTZWN1cml0eVZuY0F1dGgoVm5jQXV0aFBhc3N3ZEdldHRlciogcGdfKQorICA6IHNlbnRDaGFsbGVuZ2UoZmFsc2UpLCByZXNwb25zZVBvcygwKSwgcGcocGdfKQoreworfQorCitib29sIFNTZWN1cml0eVZuY0F1dGg6OnByb2Nlc3NNc2coU0Nvbm5lY3Rpb24qIHNjKQoreworICByZHI6OkluU3RyZWFtKiBpcyA9IHNjLT5nZXRJblN0cmVhbSgpOworICByZHI6Ok91dFN0cmVhbSogb3MgPSBzYy0+Z2V0T3V0U3RyZWFtKCk7CisKKyAgaWYgKCFzZW50Q2hhbGxlbmdlKSB7CisgICAgcmRyOjpSYW5kb21TdHJlYW0gcnM7CisgICAgcnMucmVhZEJ5dGVzKGNoYWxsZW5nZSwgdm5jQXV0aENoYWxsZW5nZVNpemUpOworICAgIG9zLT53cml0ZUJ5dGVzKGNoYWxsZW5nZSwgdm5jQXV0aENoYWxsZW5nZVNpemUpOworICAgIG9zLT5mbHVzaCgpOworICAgIHNlbnRDaGFsbGVuZ2UgPSB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHdoaWxlIChyZXNwb25zZVBvcyA8IHZuY0F1dGhDaGFsbGVuZ2VTaXplICYmIGlzLT5jaGVja05vV2FpdCgxKSkKKyAgICByZXNwb25zZVtyZXNwb25zZVBvcysrXSA9IGlzLT5yZWFkVTgoKTsKKworICBpZiAocmVzcG9uc2VQb3MgPCB2bmNBdXRoQ2hhbGxlbmdlU2l6ZSkgcmV0dXJuIGZhbHNlOworCisgIFBsYWluUGFzc3dkIHBhc3N3ZChwZy0+Z2V0Vm5jQXV0aFBhc3N3ZCgpKTsKKworICBpZiAoIXBhc3N3ZC5idWYpCisgICAgdGhyb3cgQXV0aEZhaWx1cmVFeGNlcHRpb24oIk5vIHBhc3N3b3JkIGNvbmZpZ3VyZWQgZm9yIFZOQyBBdXRoIik7CisKKyAgLy8gQ2FsY3VsYXRlIHRoZSBleHBlY3RlZCByZXNwb25zZQorICByZHI6OlU4IGtleVs4XTsKKyAgaW50IHB3ZExlbiA9IHN0cmxlbihwYXNzd2QuYnVmKTsKKyAgZm9yIChpbnQgaT0wOyBpPDg7IGkrKykKKyAgICBrZXlbaV0gPSBpPHB3ZExlbiA/IHBhc3N3ZC5idWZbaV0gOiAwOworICBkZXNrZXkoa2V5LCBFTjApOworICBmb3IgKGludCBqID0gMDsgaiA8IHZuY0F1dGhDaGFsbGVuZ2VTaXplOyBqICs9IDgpCisgICAgZGVzKGNoYWxsZW5nZStqLCBjaGFsbGVuZ2Uraik7CisKKyAgLy8gQ2hlY2sgdGhlIGFjdHVhbCByZXNwb25zZQorICBpZiAobWVtY21wKGNoYWxsZW5nZSwgcmVzcG9uc2UsIHZuY0F1dGhDaGFsbGVuZ2VTaXplKSAhPSAwKQorICAgIHRocm93IEF1dGhGYWlsdXJlRXhjZXB0aW9uKCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1NTZWN1cml0eVZuY0F1dGguaCBiL2NvbW1vbi9yZmIvU1NlY3VyaXR5Vm5jQXV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMGE4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NTZWN1cml0eVZuY0F1dGguaApAQCAtMCwwICsxLDU1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLyBTU2VjdXJpdHlWbmNBdXRoIC0gbGVnYWN5IFZOQyBhdXRoZW50aWNhdGlvbiBwcm90b2NvbC4KKy8vIFRoZSBnZXRQYXNzd2QgY2FsbCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB5b3Ugd2lzaCB0byBzdG9yZQorLy8gdGhlIFZuY0F1dGggcGFzc3dvcmQgaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcGxhY2UuCisvLyBPdGhlcndpc2UsIHRoZSBwYXNzd29yZCBpcyByZWFkIGZyb20gYSBCaW5hcnlQYXJhbWV0ZXIKKy8vIGNhbGxlZCBQYXNzd29yZC4KKworI2lmbmRlZiBfX1JGQl9TU0VDVVJJVFlWTkNBVVRIX0hfXworI2RlZmluZSBfX1JGQl9TU0VDVVJJVFlWTkNBVVRIX0hfXworCisjaW5jbHVkZSA8cmZiL1NTZWN1cml0eS5oPgorI2luY2x1ZGUgPHJmYi9zZWNUeXBlcy5oPgorI2luY2x1ZGUgPHJkci90eXBlcy5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBWbmNBdXRoUGFzc3dkR2V0dGVyIHsKKyAgcHVibGljOgorICAgIC8vIGdldFBhc3N3ZCgpIHJldHVybnMgYSBzdHJpbmcgb3IgbnVsbCBpZiB1bnN1Y2Nlc3NmdWwuICBUaGUKKyAgICAvLyBTU2VjdXJpdHlWbmNBdXRoIG9iamVjdCBkZWxldGVbXXMgdGhlIHN0cmluZyB3aGVuIGRvbmUuCisgICAgdmlydHVhbCBjaGFyKiBnZXRWbmNBdXRoUGFzc3dkKCk9MDsKKyAgfTsKKworICBjbGFzcyBTU2VjdXJpdHlWbmNBdXRoIDogcHVibGljIFNTZWN1cml0eSB7CisgIHB1YmxpYzoKKyAgICBTU2VjdXJpdHlWbmNBdXRoKFZuY0F1dGhQYXNzd2RHZXR0ZXIqIHBnKTsKKyAgICB2aXJ0dWFsIGJvb2wgcHJvY2Vzc01zZyhTQ29ubmVjdGlvbiogc2MpOworICAgIHZpcnR1YWwgaW50IGdldFR5cGUoKSBjb25zdCB7cmV0dXJuIHNlY1R5cGVWbmNBdXRoO30KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFVzZXJOYW1lKCkgY29uc3Qge3JldHVybiAwO30KKyAgcHJpdmF0ZToKKyAgICBlbnVtIHt2bmNBdXRoQ2hhbGxlbmdlU2l6ZSA9IDE2fTsKKyAgICByZHI6OlU4IGNoYWxsZW5nZVt2bmNBdXRoQ2hhbGxlbmdlU2l6ZV07CisgICAgcmRyOjpVOCByZXNwb25zZVt2bmNBdXRoQ2hhbGxlbmdlU2l6ZV07CisgICAgYm9vbCBzZW50Q2hhbGxlbmdlOworICAgIGludCByZXNwb25zZVBvczsKKyAgICBWbmNBdXRoUGFzc3dkR2V0dGVyKiBwZzsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9TY2FsZWRQaXhlbEJ1ZmZlci5jeHggYi9jb21tb24vcmZiL1NjYWxlZFBpeGVsQnVmZmVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjQ2MTJkCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9TY2FsZWRQaXhlbEJ1ZmZlci5jeHgKQEAgLTAsMCArMSwxMzIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gLT0tIFNjYWxlZFBpeGVsQnVmZmVyLmN4eAorCisjaW5jbHVkZSA8cmZiL1NjYWxlZFBpeGVsQnVmZmVyLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZHI7Cit1c2luZyBuYW1lc3BhY2UgcmZiOworCitTY2FsZWRQaXhlbEJ1ZmZlcjo6U2NhbGVkUGl4ZWxCdWZmZXIoVTggKipzcmNfZGF0YV8sIGludCBzcmNfd2lkdGhfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaGVpZ2h0XywgaW50IHNjYWxlKQorICA6IGJwcCgzMiksIHNjYWxlZF9kYXRhKDApLCBzY2FsZV9yYXRpbygxKSwgc2NhbGUoMTAwKSB7CisKKyAgc2V0U291cmNlQnVmZmVyKHNyY19kYXRhXywgc3JjX3dpZHRoXywgc3JjX2hlaWdodF8pOworfQorCitTY2FsZWRQaXhlbEJ1ZmZlcjo6U2NhbGVkUGl4ZWxCdWZmZXIoKSAKKyAgOiBzcmNfZGF0YSgwKSwgc3JjX3dpZHRoKDApLCBzcmNfaGVpZ2h0KDApLCBzY2FsZV9yYXRpbygxKSwgc2NhbGUoMTAwKSwKKyAgICBicHAoMzIpLCBzY2FsZWRfZGF0YSgwKSB7Cit9CisKK1NjYWxlZFBpeGVsQnVmZmVyOjp+U2NhbGVkUGl4ZWxCdWZmZXIoKSB7Cit9CisKK3ZvaWQgU2NhbGVkUGl4ZWxCdWZmZXI6OnNldFNvdXJjZUJ1ZmZlcihVOCAqKnNyY19kYXRhXywgaW50IHcsIGludCBoKSB7CisgIHNyY19kYXRhID0gc3JjX2RhdGFfOworICBzcmNfd2lkdGggID0gdzsKKyAgc3JjX2hlaWdodCA9IGg7CisgIGNhbGN1bGF0ZVNjYWxlZEJ1ZmZlclNpemUoKTsKKyAgcmVjcmVhdGVTY2FsZWRCdWZmZXIoKTsKK30KKwordm9pZCBTY2FsZWRQaXhlbEJ1ZmZlcjo6c2V0U2NhbGUoaW50IHNjYWxlXykgeworICBpZiAoc2NhbGUgIT0gc2NhbGVfKSB7CisgICAgc2NhbGUgPSBzY2FsZV87CisgICAgc2NhbGVfcmF0aW8gPSBkb3VibGUoc2NhbGUpIC8gMTAwOworICAgIGNhbGN1bGF0ZVNjYWxlZEJ1ZmZlclNpemUoKTsKKyAgICByZWNyZWF0ZVNjYWxlZEJ1ZmZlcigpOworICB9Cit9CisKK3ZvaWQgU2NhbGVkUGl4ZWxCdWZmZXI6OnNjYWxlUmVjdChjb25zdCBSZWN0JiByKSB7CisgIHN0YXRpYyBVOCAqc3JjX3B0ciwgKnB0cjsKKyAgc3RhdGljIFU4IHIwLCByMSwgcjIsIHIzOworICBzdGF0aWMgVTggZzAsIGcxLCBnMiwgZzM7CisgIHN0YXRpYyBVOCBiMCwgYjEsIGIyLCBiMzsKKyAgc3RhdGljIGRvdWJsZSBjMV9zdWJfZHgsIGMxX3N1Yl9keTsKKyAgc3RhdGljIGRvdWJsZSBkeCwgZHk7CisgIHN0YXRpYyBpbnQgaSwgajsKKyAgc3RhdGljIFJlY3QgY2hhbmdlZF9yZWN0OworCisgIC8vIENhbGN1bGF0ZSB0aGUgY2hhbmdlZCBwaXhlbCByZWN0IGluIHRoZSBzY2FsZWQgaW1hZ2UKKyAgY2hhbmdlZF9yZWN0ID0gY2FsY3VsYXRlU2NhbGVCb3VuZGFyeShyKTsKKworICAvLyBTY2FsZSB0aGUgc291cmNlIHJlY3QgdG8gdGhlIGRlc3RpbmF0aW9uIGltYWdlIGJ1ZmZlciB1c2luZworICAvLyBiaWxpbmVhciBpbnRlcnBsYXRpb24KKyAgZm9yIChpbnQgeSA9IGNoYW5nZWRfcmVjdC50bC55OyB5IDwgY2hhbmdlZF9yZWN0LmJyLnk7IHkrKykgeworICAgIGogPSAoaW50KShkeSA9IHkgLyBzY2FsZV9yYXRpbyk7CisgICAgZHkgLT0gajsKKyAgICBjMV9zdWJfZHkgPSAxIC0gZHk7CisKKyAgICBmb3IgKGludCB4ID0gY2hhbmdlZF9yZWN0LnRsLng7IHggPCBjaGFuZ2VkX3JlY3QuYnIueDsgeCsrKSB7CisgICAgICBwdHIgPSAmc2NhbGVkX2RhdGFbKHggKyB5KnNjYWxlZF93aWR0aCkgKiA0XTsKKworICAgICAgaSA9IChpbnQpKGR4ID0geCAvIHNjYWxlX3JhdGlvKTsKKyAgICAgIGR4IC09IGk7CisgICAgICBjMV9zdWJfZHggPSAxIC0gZHg7CisKKyAgICAgIHNyY19wdHIgPSAmKCpzcmNfZGF0YSlbKGkgKyAoaipzcmNfd2lkdGgpKSo0XTsKKyAgICAgIGIwID0gKnNyY19wdHI7IGcwID0gKihzcmNfcHRyKzEpOyByMCA9ICooc3JjX3B0cisyKTsKKyAgICAgIGlmIChpKzEgPCBzcmNfd2lkdGgpIHsKKyAgICAgICAgYjEgPSAqKHNyY19wdHIrNCk7IGcxID0gKihzcmNfcHRyKzUpOyByMSA9ICooc3JjX3B0cis2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGIxID0gYjA7IHIxID0gcjA7IGcxID0gZzA7CisgICAgICB9CisgICAgICBpZiAoaisxIDwgc3JjX2hlaWdodCkgeworICAgICAgICBzcmNfcHRyICs9IHNyY193aWR0aCAqIDQ7CisgICAgICAgIGIzID0gKnNyY19wdHI7IGczID0gKihzcmNfcHRyKzEpOyByMyA9ICooc3JjX3B0cisyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGIzID0gYjA7IHIzID0gcjA7IGczID0gZzA7CisgICAgICB9CisgICAgICBpZiAoKGkrMSA8IHNyY193aWR0aCkgJiYgKGorMSA8IHNyY19oZWlnaHQpKSB7CisgICAgICAgIGIyID0gKihzcmNfcHRyKzQpOyBnMiA9ICooc3JjX3B0cis1KTsgcjIgPSAqKHNyY19wdHIrNik7CisgICAgICB9IGVsc2UgaWYgKGkrMSA+PSBzcmNfd2lkdGgpIHsKKyAgICAgICAgYjIgPSBiMzsgcjIgPSByMzsgZzIgPSBnMzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGIyID0gYjE7IHIyID0gcjE7IGcyID0gZzE7CisgICAgICB9CisgICAgICAqcHRyKysgPSAoVTgpKChiMCpjMV9zdWJfZHgrYjEqZHgpKmMxX3N1Yl9keSArIChiMypjMV9zdWJfZHgrYjIqZHgpKmR5KTsKKyAgICAgICpwdHIrKyA9IChVOCkoKGcwKmMxX3N1Yl9keCtnMSpkeCkqYzFfc3ViX2R5ICsgKGczKmMxX3N1Yl9keCtnMipkeCkqZHkpOworICAgICAgKnB0ciAgID0gKFU4KSgocjAqYzFfc3ViX2R4K3IxKmR4KSpjMV9zdWJfZHkgKyAocjMqYzFfc3ViX2R4K3IyKmR4KSpkeSk7CisgICAgfQorICB9Cit9CisKK1JlY3QgU2NhbGVkUGl4ZWxCdWZmZXI6OmNhbGN1bGF0ZVNjYWxlQm91bmRhcnkoY29uc3QgUmVjdCYgcikgeworICBzdGF0aWMgaW50IHhfc3RhcnQsIHlfc3RhcnQsIHhfZW5kLCB5X2VuZDsKKyAgeF9zdGFydCA9IHIudGwueCA9PSAwID8gMCA6IGNlaWwoKHIudGwueC0xKSAqIHNjYWxlX3JhdGlvKTsKKyAgeV9zdGFydCA9IHIudGwueSA9PSAwID8gMCA6IGNlaWwoKHIudGwueS0xKSAqIHNjYWxlX3JhdGlvKTsKKyAgeF9lbmQgPSBjZWlsKHIuYnIueCAqIHNjYWxlX3JhdGlvIC0gMSk7IAorICB4X2VuZCA9IHhfZW5kIDwgc2NhbGVkX3dpZHRoID8geF9lbmQgKyAxIDogc2NhbGVkX3dpZHRoOworICB5X2VuZCA9IGNlaWwoci5ici55ICogc2NhbGVfcmF0aW8gLSAxKTsKKyAgeV9lbmQgPSB5X2VuZCA8IHNjYWxlZF9oZWlnaHQgPyB5X2VuZCArIDEgOiBzY2FsZWRfaGVpZ2h0OworICByZXR1cm4gUmVjdCh4X3N0YXJ0LCB5X3N0YXJ0LCB4X2VuZCwgeV9lbmQpOworfQorCit2b2lkIFNjYWxlZFBpeGVsQnVmZmVyOjpjYWxjdWxhdGVTY2FsZWRCdWZmZXJTaXplKCkgeworICBzY2FsZWRfd2lkdGggID0gKGludCljZWlsKHNyY193aWR0aCAgKiBzY2FsZV9yYXRpbyk7CisgIHNjYWxlZF9oZWlnaHQgPSAoaW50KWNlaWwoc3JjX2hlaWdodCAqIHNjYWxlX3JhdGlvKTsKK30KKwordm9pZCBTY2FsZWRQaXhlbEJ1ZmZlcjo6cmVjcmVhdGVTY2FsZWRCdWZmZXIoKSB7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1NjYWxlZFBpeGVsQnVmZmVyLmggYi9jb21tb24vcmZiL1NjYWxlZFBpeGVsQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2YWE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvU2NhbGVkUGl4ZWxCdWZmZXIuaApAQCAtMCwwICsxLDg1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGlnaHRWTkMgVGVhbS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSBTY2FsZWRQaXhlbEJ1ZmZlci5oCisvLworLy8gVGhlIFNjYWxlZFBpeGVsQnVmZmVyIGNsYXNzIGFsbG93cyB0byBzY2FsZSB0aGUgaW1hZ2UgZGF0YSAKKy8vIGZyb20gdGhlIHNvdXJjZSBidWZmZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyIHVzaW5nIGJpbGluZWFyIAorLy8gaW50ZXJwb2xhdGlvbi4KKworI2luY2x1ZGUgPHJkci90eXBlcy5oPgorI2luY2x1ZGUgPHJmYi9SZWN0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZHI7CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIFNjYWxlZFBpeGVsQnVmZmVyIHsKKyAgcHVibGljOgorICAgIFNjYWxlZFBpeGVsQnVmZmVyKFU4ICoqZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NhbGUpOworICAgIFNjYWxlZFBpeGVsQnVmZmVyKCk7CisgICAgdmlydHVhbCB+U2NhbGVkUGl4ZWxCdWZmZXIoKTsKKworICAgIC8vIEdldCB3aWR0aCwgaGVpZ2h0LCBudW1iZXIgb2YgcGl4ZWxzIGFuZCBzY2FsZQorICAgIGludCB3aWR0aCgpICBjb25zdCB7IHJldHVybiBzY2FsZWRfd2lkdGg7IH0KKyAgICBpbnQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gc2NhbGVkX2hlaWdodDsgfQorICAgIGludCBhcmVhKCkgY29uc3QgeyByZXR1cm4gc2NhbGVkX3dpZHRoICogc2NhbGVkX2hlaWdodDsgfQorICAgIGludCBnZXRTY2FsZSgpIGNvbnN0IHsgcmV0dXJuIHNjYWxlOyB9CisKKyAgICAvLyBHZXQgcmVjdGFuZ2xlIGVuY29tcGFzc2luZyB0aGlzIGJ1ZmZlcgorICAgIC8vICAgVG9wLWxlZnQgb2YgcmVjdGFuZ2xlIGlzIGVpdGhlciBhdCAoMCwwKSwgb3IgdGhlIHNwZWNpZmllZCBwb2ludC4KKyAgICBSZWN0IGdldFJlY3QoKSBjb25zdCB7IHJldHVybiBSZWN0KDAsIDAsIHNjYWxlZF93aWR0aCwgc2NhbGVkX2hlaWdodCk7IH0KKyAgICBSZWN0IGdldFJlY3QoY29uc3QgUG9pbnQmIHBvcykgY29uc3QgeworICAgICAgcmV0dXJuIFJlY3QocG9zLCBwb3MudHJhbnNsYXRlKFBvaW50KHNjYWxlZF93aWR0aCwgc2NhbGVkX2hlaWdodCkpKTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIG5ldyBzb3VyY2UgYnVmZmVyIGFuZCBpdHMgcGFyYW1ldGVycworICAgIHZvaWQgc2V0U291cmNlQnVmZmVyKFU4ICoqc3JjX2RhdGEsIGludCB3LCBpbnQgaCk7CisKKyAgICAvLyBTZXQgdGhlIG5ldyBzY2FsZSwgaW4gcGVyY2VudAorICAgIHZpcnR1YWwgdm9pZCBzZXRTY2FsZShpbnQgc2NhbGUpOworCisgICAgLy8gU2NhbGUgcmVjdCBmcm9tIHRoZSBzb3VyY2UgaW1hZ2UgYnVmZmVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAgICAvLyB1c2luZyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgdmlydHVhbCB2b2lkIHNjYWxlUmVjdChjb25zdCBSZWN0JiByKTsKKworICAgIC8vIENhbGN1bGF0ZSB0aGUgc2NhbGVkIGltYWdlIHJlY3RhbmdsZSB3aGljaCBkZXBlbmQgb24gdGhlIHNvdXJjZSAKKyAgICAvLyBpbWFnZSByZWN0YW5nbGUuCisgICAgaW5saW5lIFJlY3QgY2FsY3VsYXRlU2NhbGVCb3VuZGFyeShjb25zdCBSZWN0JiByKTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIHNjYWxlZCBidWZmZXIgc2l6ZSBkZXBlbmRpbmcgb24gdGhlIHNvdXJjZSBidWZmZXIKKyAgICAvLyBwYXJhbWV0ZXJzICh3aWR0aCwgaGVpZ2h0LCBwaXhlbCBmb3JtYXQpCisgICAgdm9pZCBjYWxjdWxhdGVTY2FsZWRCdWZmZXJTaXplKCk7CisKKyAgICAvLyBSZWNyZWF0ZSB0aGUgc2NhbGVkIHBpeGVsIGJ1ZmZlcgorICAgIHZpcnR1YWwgdm9pZCByZWNyZWF0ZVNjYWxlZEJ1ZmZlcigpOworCisgICAgaW50IHNyY193aWR0aDsKKyAgICBpbnQgc3JjX2hlaWdodDsKKyAgICBpbnQgc2NhbGVkX3dpZHRoOworICAgIGludCBzY2FsZWRfaGVpZ2h0OworICAgIGludCBicHA7CisgICAgaW50IHNjYWxlOworICAgIGRvdWJsZSBzY2FsZV9yYXRpbzsKKyAgICBVOCAqKnNyY19kYXRhOworICAgIFU4ICpzY2FsZWRfZGF0YTsKKyAgfTsKKworfTsKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvU2VydmVyQ29yZS5jeHggYi9jb21tb24vcmZiL1NlcnZlckNvcmUuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MGRhYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1NlcnZlckNvcmUuY3h4CkBAIC0wLDAgKzEsOTQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gLT0tIFNlcnZlckNvcmUuY3h4CisKKy8vIFRoaXMgaGVhZGVyIHdpbGwgZGVmaW5lIHRoZSBTZXJ2ZXIgaW50ZXJmYWNlLCBmcm9tIHdoaWNoIFNlcnZlck1UIGFuZAorLy8gU2VydmVyU1Qgd2lsbCBiZSBkZXJpdmVkLgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKyNpbmNsdWRlIDxyZmIvU2VydmVyQ29yZS5oPgorCityZmI6OkludFBhcmFtZXRlciByZmI6OlNlcnZlcjo6aWRsZVRpbWVvdXQKKygiSWRsZVRpbWVvdXQiLAorICJUaGUgbnVtYmVyIG9mIHNlY29uZHMgYWZ0ZXIgd2hpY2ggYW4gaWRsZSBWTkMgY29ubmVjdGlvbiB3aWxsIGJlIGRyb3BwZWQgIgorICIoemVybyBtZWFucyBubyB0aW1lb3V0KSIsCisgMCwgMCk7CityZmI6OkludFBhcmFtZXRlciByZmI6OlNlcnZlcjo6bWF4RGlzY29ubmVjdGlvblRpbWUKKygiTWF4RGlzY29ubmVjdGlvblRpbWUiLAorICJUZXJtaW5hdGUgd2hlbiBubyBjbGllbnQgaGFzIGJlZW4gY29ubmVjdGVkIGZvciBzIHNlY29uZHMiLCAKKyAwLCAwKTsKK3JmYjo6SW50UGFyYW1ldGVyIHJmYjo6U2VydmVyOjptYXhDb25uZWN0aW9uVGltZQorKCJNYXhDb25uZWN0aW9uVGltZSIsCisgIlRlcm1pbmF0ZSB3aGVuIGEgY2xpZW50IGhhcyBiZWVuIGNvbm5lY3RlZCBmb3IgcyBzZWNvbmRzIiwgCisgMCwgMCk7CityZmI6OkludFBhcmFtZXRlciByZmI6OlNlcnZlcjo6bWF4SWRsZVRpbWUKKygiTWF4SWRsZVRpbWUiLAorICJUZXJtaW5hdGUgYWZ0ZXIgcyBzZWNvbmRzIG9mIHVzZXIgaW5hY3Rpdml0eSIsIAorIDAsIDApOworcmZiOjpJbnRQYXJhbWV0ZXIgcmZiOjpTZXJ2ZXI6OmNsaWVudFdhaXRUaW1lTWlsbGlzCisoIkNsaWVudFdhaXRUaW1lTWlsbGlzIiwKKyAiVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgYSBjbGllbnQgd2hpY2ggaXMgbm8gbG9uZ2VyICIKKyAicmVzcG9uZGluZyIsCisgMjAwMDAsIDApOworcmZiOjpCb29sUGFyYW1ldGVyIHJmYjo6U2VydmVyOjpjb21wYXJlRkIKKygiQ29tcGFyZUZCIiwKKyAiUGVyZm9ybSBwaXhlbCBjb21wYXJpc29uIG9uIGZyYW1lYnVmZmVyIHRvIHJlZHVjZSB1bm5lY2Vzc2FyeSB1cGRhdGVzIiwKKyB0cnVlKTsKK3JmYjo6Qm9vbFBhcmFtZXRlciByZmI6OlNlcnZlcjo6cHJvdG9jb2wzXzMKKygiUHJvdG9jb2wzLjMiLAorICJBbHdheXMgdXNlIHByb3RvY29sIHZlcnNpb24gMy4zIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoICIKKyAiYmFkbHktYmVoYXZlZCBjbGllbnRzIiwKKyBmYWxzZSk7CityZmI6OkJvb2xQYXJhbWV0ZXIgcmZiOjpTZXJ2ZXI6OmFsd2F5c1NoYXJlZAorKCJBbHdheXNTaGFyZWQiLAorICJBbHdheXMgdHJlYXQgaW5jb21pbmcgY29ubmVjdGlvbnMgYXMgc2hhcmVkLCByZWdhcmRsZXNzIG9mIHRoZSBjbGllbnQtIgorICJzcGVjaWZpZWQgc2V0dGluZyIsCisgZmFsc2UpOworcmZiOjpCb29sUGFyYW1ldGVyIHJmYjo6U2VydmVyOjpuZXZlclNoYXJlZAorKCJOZXZlclNoYXJlZCIsCisgIk5ldmVyIHRyZWF0IGluY29taW5nIGNvbm5lY3Rpb25zIGFzIHNoYXJlZCwgcmVnYXJkbGVzcyBvZiB0aGUgY2xpZW50LSIKKyAic3BlY2lmaWVkIHNldHRpbmciLAorIGZhbHNlKTsKK3JmYjo6Qm9vbFBhcmFtZXRlciByZmI6OlNlcnZlcjo6ZGlzY29ubmVjdENsaWVudHMKKygiRGlzY29ubmVjdENsaWVudHMiLAorICJEaXNjb25uZWN0IGV4aXN0aW5nIGNsaWVudHMgaWYgYW4gaW5jb21pbmcgY29ubmVjdGlvbiBpcyBub24tc2hhcmVkLiAiCisgIklmIGNvbWJpbmVkIHdpdGggTmV2ZXJTaGFyZWQgdGhlbiBuZXcgY29ubmVjdGlvbnMgd2lsbCBiZSByZWZ1c2VkICIKKyAid2hpbGUgdGhlcmUgaXMgYSBjbGllbnQgYWN0aXZlIiwKKyB0cnVlKTsKK3JmYjo6Qm9vbFBhcmFtZXRlciByZmI6OlNlcnZlcjo6YWNjZXB0S2V5RXZlbnRzCisoIkFjY2VwdEtleUV2ZW50cyIsCisgIkFjY2VwdCBrZXkgcHJlc3MgYW5kIHJlbGVhc2UgZXZlbnRzIGZyb20gY2xpZW50cy4iLAorIHRydWUpOworcmZiOjpCb29sUGFyYW1ldGVyIHJmYjo6U2VydmVyOjphY2NlcHRQb2ludGVyRXZlbnRzCisoIkFjY2VwdFBvaW50ZXJFdmVudHMiLAorICJBY2NlcHQgcG9pbnRlciBwcmVzcyBhbmQgcmVsZWFzZSBldmVudHMgZnJvbSBjbGllbnRzLiIsCisgdHJ1ZSk7CityZmI6OkJvb2xQYXJhbWV0ZXIgcmZiOjpTZXJ2ZXI6OmFjY2VwdEN1dFRleHQKKygiQWNjZXB0Q3V0VGV4dCIsCisgIkFjY2VwdCBjbGlwYm9hcmQgdXBkYXRlcyBmcm9tIGNsaWVudHMuIiwKKyB0cnVlKTsKK3JmYjo6Qm9vbFBhcmFtZXRlciByZmI6OlNlcnZlcjo6c2VuZEN1dFRleHQKKygiU2VuZEN1dFRleHQiLAorICJTZW5kIGNsaXBib2FyZCBjaGFuZ2VzIHRvIGNsaWVudHMuIiwKKyB0cnVlKTsKK3JmYjo6Qm9vbFBhcmFtZXRlciByZmI6OlNlcnZlcjo6cXVlcnlDb25uZWN0CisoIlF1ZXJ5Q29ubmVjdCIsCisgIlByb21wdCB0aGUgbG9jYWwgdXNlciB0byBhY2NlcHQgb3IgcmVqZWN0IGluY29taW5nIGNvbm5lY3Rpb25zLiIsCisgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9TZXJ2ZXJDb3JlLmggYi9jb21tb24vcmZiL1NlcnZlckNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ3Yjc0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9TZXJ2ZXJDb3JlLmgKQEAgLTAsMCArMSw1NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLyAtPS0gU2VydmVyQ29yZS5oCisKKy8vIFRoaXMgaGVhZGVyIHdpbGwgZGVmaW5lIHRoZSBTZXJ2ZXIgaW50ZXJmYWNlLCBmcm9tIHdoaWNoIFNlcnZlck1UIGFuZAorLy8gU2VydmVyU1Qgd2lsbCBiZSBkZXJpdmVkLgorCisjaWZuZGVmIF9fUkZCX1NFUlZFUl9DT1JFX0hfXworI2RlZmluZSBfX1JGQl9TRVJWRVJfQ09SRV9IX18KKworI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgU2VydmVyIHsKKyAgcHVibGljOgorCisgICAgc3RhdGljIEludFBhcmFtZXRlciBpZGxlVGltZW91dDsKKyAgICBzdGF0aWMgSW50UGFyYW1ldGVyIG1heERpc2Nvbm5lY3Rpb25UaW1lOworICAgIHN0YXRpYyBJbnRQYXJhbWV0ZXIgbWF4Q29ubmVjdGlvblRpbWU7CisgICAgc3RhdGljIEludFBhcmFtZXRlciBtYXhJZGxlVGltZTsKKyAgICBzdGF0aWMgSW50UGFyYW1ldGVyIGNsaWVudFdhaXRUaW1lTWlsbGlzOworICAgIHN0YXRpYyBCb29sUGFyYW1ldGVyIGNvbXBhcmVGQjsKKyAgICBzdGF0aWMgQm9vbFBhcmFtZXRlciBwcm90b2NvbDNfMzsKKyAgICBzdGF0aWMgQm9vbFBhcmFtZXRlciBhbHdheXNTaGFyZWQ7CisgICAgc3RhdGljIEJvb2xQYXJhbWV0ZXIgbmV2ZXJTaGFyZWQ7CisgICAgc3RhdGljIEJvb2xQYXJhbWV0ZXIgZGlzY29ubmVjdENsaWVudHM7CisgICAgc3RhdGljIEJvb2xQYXJhbWV0ZXIgYWNjZXB0S2V5RXZlbnRzOworICAgIHN0YXRpYyBCb29sUGFyYW1ldGVyIGFjY2VwdFBvaW50ZXJFdmVudHM7CisgICAgc3RhdGljIEJvb2xQYXJhbWV0ZXIgYWNjZXB0Q3V0VGV4dDsKKyAgICBzdGF0aWMgQm9vbFBhcmFtZXRlciBzZW5kQ3V0VGV4dDsKKyAgICBzdGF0aWMgQm9vbFBhcmFtZXRlciBxdWVyeUNvbm5lY3Q7CisKKyAgfTsKKworfTsKKworI2VuZGlmIC8vIF9fUkZCX1NFUlZFUl9DT1JFX0hfXworCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1RocmVhZGluZy5oIGIvY29tbW9uL3JmYi9UaHJlYWRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmIzYWEwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9UaHJlYWRpbmcuaApAQCAtMCwwICsxLDMxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSBUaHJlYWRpbmcuaAorLy8gR2VuZXJhbCBwdXJwb3NlIHRocmVhZGluZyBpbnRlcmZhY2UuCisvLyBJZiB0aGUgY3VycmVudCBwbGF0Zm9ybSBzdXBwb3J0cyB0aHJlYWRpbmcgdGhlbiBfX1JGQl9USFJFQURJTkdfSU1QTAorLy8gd2lsbCBiZSBkZWZpbmVkIGFmdGVyIHRoaXMgaGVhZGVyIGhhcyBiZWVuIGluY2x1ZGVkLgorCisjaWZuZGVmIF9fUkZCX1RIUkVBRElOR19IX18KKyNkZWZpbmUgX19SRkJfVEhSRUFESU5HX0hfXworCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxyZmJfd2luMzIvVGhyZWFkaW5nLmg+CisjZW5kaWYKKworI2VuZGlmIC8vIF9fUkZCX1RIUkVBRElOR19IX18KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvVGlnaHREZWNvZGVyLmN4eCBiL2NvbW1vbi9yZmIvVGlnaHREZWNvZGVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjhjNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9UaWdodERlY29kZXIuY3h4CkBAIC0wLDAgKzEsMTU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBDb25zdGFudGluIEthcGxpbnNreS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBDZW5kaW8gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8cmZiL0NNc2dSZWFkZXIuaD4KKyNpbmNsdWRlIDxyZmIvQ01zZ0hhbmRsZXIuaD4KKyNpbmNsdWRlIDxyZmIvVGlnaHREZWNvZGVyLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4gLyoganBlZ2xpYi5oIG5lZWRzIEZJTEUgKi8KK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPGpwZWdsaWIuaD4KK30KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworI2RlZmluZSBSR0JfVE9fUElYRUwocixnLGIpCQkJCQkJXAorICAoKChQSVhFTF9UKShyKSAmIG15Rm9ybWF0LnJlZE1heCkgPDwgbXlGb3JtYXQucmVkU2hpZnQgfAkJXAorICAgKChQSVhFTF9UKShnKSAmIG15Rm9ybWF0LmdyZWVuTWF4KSA8PCBteUZvcm1hdC5ncmVlblNoaWZ0IHwJICAgICAgICBcCisgICAoKFBJWEVMX1QpKGIpICYgbXlGb3JtYXQuYmx1ZU1heCkgPDwgbXlGb3JtYXQuYmx1ZVNoaWZ0KQorCisjZGVmaW5lIFJHQjI0X1RPX1BJWEVMKHIsZyxiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoKChQSVhFTF9UKShyKSAmIDB4RkYpICogbXlGb3JtYXQucmVkTWF4ICsgMTI3KSAvIDI1NSAgICAgICAgICAgICBcCisgICAgPDwgbXlGb3JtYXQucmVkU2hpZnQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoUElYRUxfVCkoZykgJiAweEZGKSAqIG15Rm9ybWF0LmdyZWVuTWF4ICsgMTI3KSAvIDI1NSAgICAgICAgICAgXAorICAgIDw8IG15Rm9ybWF0LmdyZWVuU2hpZnQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKFBJWEVMX1QpKGIpICYgMHhGRikgKiBteUZvcm1hdC5ibHVlTWF4ICsgMTI3KSAvIDI1NSAgICAgICAgICAgIFwKKyAgICA8PCBteUZvcm1hdC5ibHVlU2hpZnQpCisKKyNkZWZpbmUgUkdCMjRfVE9fUElYRUwzMihyLGcsYikJCQkJCQlcCisgICgoKHJkcjo6VTMyKShyKSAmIDB4RkYpIDw8IG15Rm9ybWF0LnJlZFNoaWZ0IHwJCQkJXAorICAgKChyZHI6OlUzMikoZykgJiAweEZGKSA8PCBteUZvcm1hdC5ncmVlblNoaWZ0IHwJCQlcCisgICAoKHJkcjo6VTMyKShiKSAmIDB4RkYpIDw8IG15Rm9ybWF0LmJsdWVTaGlmdCkKKworI2RlZmluZSBUSUdIVF9NQVhfV0lEVEggMjA0OAorCitzdGF0aWMgdm9pZCBKcGVnU2V0U3JjTWFuYWdlcihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICpjb21wcmVzc2VkRGF0YSwKKwkJCSAgICAgIGludCBjb21wcmVzc2VkTGVuKTsKK3N0YXRpYyBib29sIGpwZWdFcnJvcjsKKworI2RlZmluZSBFWFRSQV9BUkdTIENNc2dIYW5kbGVyKiBoYW5kbGVyCisjZGVmaW5lIEZJTExfUkVDVChyLCBwKSBoYW5kbGVyLT5maWxsUmVjdChyLCBwKQorI2RlZmluZSBJTUFHRV9SRUNUKHIsIHApIGhhbmRsZXItPmltYWdlUmVjdChyLCBwKQorI2RlZmluZSBCUFAgOAorI2luY2x1ZGUgPHJmYi90aWdodERlY29kZS5oPgorI3VuZGVmIEJQUAorI2RlZmluZSBCUFAgMTYKKyNpbmNsdWRlIDxyZmIvdGlnaHREZWNvZGUuaD4KKyN1bmRlZiBCUFAKKyNkZWZpbmUgQlBQIDMyCisjaW5jbHVkZSA8cmZiL3RpZ2h0RGVjb2RlLmg+CisjdW5kZWYgQlBQCisKK0RlY29kZXIqIFRpZ2h0RGVjb2Rlcjo6Y3JlYXRlKENNc2dSZWFkZXIqIHJlYWRlcikKK3sKKyAgcmV0dXJuIG5ldyBUaWdodERlY29kZXIocmVhZGVyKTsKK30KKworVGlnaHREZWNvZGVyOjpUaWdodERlY29kZXIoQ01zZ1JlYWRlciogcmVhZGVyXykgOiByZWFkZXIocmVhZGVyXykKK3sKK30KKworVGlnaHREZWNvZGVyOjp+VGlnaHREZWNvZGVyKCkKK3sKK30KKwordm9pZCBUaWdodERlY29kZXI6OnJlYWRSZWN0KGNvbnN0IFJlY3QmIHIsIENNc2dIYW5kbGVyKiBoYW5kbGVyKQoreworICByZHI6OkluU3RyZWFtKiBpcyA9IHJlYWRlci0+Z2V0SW5TdHJlYW0oKTsKKyAgLyogVW5jb21wcmVzc2VkIFJHQjI0IEpQRUcgZGF0YSwgYmVmb3JlIHRyYW5zbGF0ZWQsIGNhbiBiZSB1cCB0byAzCisgICAgIHRpbWVzIGxhcmdlciwgaWYgVk5DIGJwcCBpcyA4LiAqLworICByZHI6OlU4KiBidWYgPSByZWFkZXItPmdldEltYWdlQnVmKHIuYXJlYSgpKjMpOworICBzd2l0Y2ggKHJlYWRlci0+YnBwKCkpIHsKKyAgY2FzZSA4OgorICAgIHRpZ2h0RGVjb2RlOCAociwgaXMsIHppcywgKHJkcjo6VTgqKSBidWYsIGhhbmRsZXIpOyBicmVhazsKKyAgY2FzZSAxNjoKKyAgICB0aWdodERlY29kZTE2KHIsIGlzLCB6aXMsIChyZHI6OlUxNiopYnVmLCBoYW5kbGVyKTsgYnJlYWs7CisgIGNhc2UgMzI6CisgICAgdGlnaHREZWNvZGUzMihyLCBpcywgemlzLCAocmRyOjpVMzIqKWJ1ZiwgaGFuZGxlcik7IGJyZWFrOworICB9Cit9CisKKworLy8KKy8vIEEgIlNvdXJjZSBtYW5hZ2VyIiBmb3IgdGhlIEpQRUcgbGlicmFyeS4KKy8vCisKK3N0YXRpYyBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIGpwZWdTcmNNYW5hZ2VyOworc3RhdGljIEpPQ1RFVCAqanBlZ0J1ZmZlclB0cjsKK3N0YXRpYyBzaXplX3QganBlZ0J1ZmZlckxlbjsKKworc3RhdGljIHZvaWQgSnBlZ0luaXRTb3VyY2Uoal9kZWNvbXByZXNzX3B0ciBjaW5mbyk7CitzdGF0aWMgYm9vbGVhbiBKcGVnRmlsbElucHV0QnVmZmVyKGpfZGVjb21wcmVzc19wdHIgY2luZm8pOworc3RhdGljIHZvaWQgSnBlZ1NraXBJbnB1dERhdGEoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpOworc3RhdGljIHZvaWQgSnBlZ1Rlcm1Tb3VyY2Uoal9kZWNvbXByZXNzX3B0ciBjaW5mbyk7CisKK3N0YXRpYyB2b2lkCitKcGVnSW5pdFNvdXJjZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBqcGVnRXJyb3IgPSBmYWxzZTsKK30KKworc3RhdGljIGJvb2xlYW4KK0pwZWdGaWxsSW5wdXRCdWZmZXIoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAganBlZ0Vycm9yID0gdHJ1ZTsKKyAganBlZ1NyY01hbmFnZXIuYnl0ZXNfaW5fYnVmZmVyID0ganBlZ0J1ZmZlckxlbjsKKyAganBlZ1NyY01hbmFnZXIubmV4dF9pbnB1dF9ieXRlID0gKEpPQ1RFVCAqKWpwZWdCdWZmZXJQdHI7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitKcGVnU2tpcElucHV0RGF0YShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykKK3sKKyAgaWYgKG51bV9ieXRlcyA8IDAgfHwgKHNpemVfdCludW1fYnl0ZXMgPiBqcGVnU3JjTWFuYWdlci5ieXRlc19pbl9idWZmZXIpIHsKKyAgICBqcGVnRXJyb3IgPSB0cnVlOworICAgIGpwZWdTcmNNYW5hZ2VyLmJ5dGVzX2luX2J1ZmZlciA9IGpwZWdCdWZmZXJMZW47CisgICAganBlZ1NyY01hbmFnZXIubmV4dF9pbnB1dF9ieXRlID0gKEpPQ1RFVCAqKWpwZWdCdWZmZXJQdHI7CisgIH0gZWxzZSB7CisgICAganBlZ1NyY01hbmFnZXIubmV4dF9pbnB1dF9ieXRlICs9IChzaXplX3QpIG51bV9ieXRlczsKKyAgICBqcGVnU3JjTWFuYWdlci5ieXRlc19pbl9idWZmZXIgLT0gKHNpemVfdCkgbnVtX2J5dGVzOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitKcGVnVGVybVNvdXJjZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBObyB3b3JrIG5lY2Vzc2FyeSBoZXJlLiAqLworfQorCitzdGF0aWMgdm9pZAorSnBlZ1NldFNyY01hbmFnZXIoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqY29tcHJlc3NlZERhdGEsIGludCBjb21wcmVzc2VkTGVuKQoreworICBqcGVnQnVmZmVyUHRyID0gKEpPQ1RFVCAqKWNvbXByZXNzZWREYXRhOworICBqcGVnQnVmZmVyTGVuID0gKHNpemVfdCljb21wcmVzc2VkTGVuOworCisgIGpwZWdTcmNNYW5hZ2VyLmluaXRfc291cmNlID0gSnBlZ0luaXRTb3VyY2U7CisgIGpwZWdTcmNNYW5hZ2VyLmZpbGxfaW5wdXRfYnVmZmVyID0gSnBlZ0ZpbGxJbnB1dEJ1ZmZlcjsKKyAganBlZ1NyY01hbmFnZXIuc2tpcF9pbnB1dF9kYXRhID0gSnBlZ1NraXBJbnB1dERhdGE7CisgIGpwZWdTcmNNYW5hZ2VyLnJlc3luY190b19yZXN0YXJ0ID0ganBlZ19yZXN5bmNfdG9fcmVzdGFydDsKKyAganBlZ1NyY01hbmFnZXIudGVybV9zb3VyY2UgPSBKcGVnVGVybVNvdXJjZTsKKyAganBlZ1NyY01hbmFnZXIubmV4dF9pbnB1dF9ieXRlID0ganBlZ0J1ZmZlclB0cjsKKyAganBlZ1NyY01hbmFnZXIuYnl0ZXNfaW5fYnVmZmVyID0ganBlZ0J1ZmZlckxlbjsKKworICBjaW5mby0+c3JjID0gJmpwZWdTcmNNYW5hZ2VyOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9UaWdodERlY29kZXIuaCBiL2NvbW1vbi9yZmIvVGlnaHREZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0N2IzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvVGlnaHREZWNvZGVyLmgKQEAgLTAsMCArMSw0OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgQ29uc3RhbnRpbiBLYXBsaW5za3kuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2lmbmRlZiBfX1JGQl9USUdIVERFQ09ERVJfSF9fCisjZGVmaW5lIF9fUkZCX1RJR0hUREVDT0RFUl9IX18KKworI2luY2x1ZGUgPHJkci9abGliSW5TdHJlYW0uaD4KKyNpbmNsdWRlIDxyZmIvRGVjb2Rlci5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBUaWdodERlY29kZXIgOiBwdWJsaWMgRGVjb2RlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgRGVjb2RlciogY3JlYXRlKENNc2dSZWFkZXIqIHJlYWRlcik7CisgICAgdmlydHVhbCB2b2lkIHJlYWRSZWN0KGNvbnN0IFJlY3QmIHIsIENNc2dIYW5kbGVyKiBoYW5kbGVyKTsKKyAgICB2aXJ0dWFsIH5UaWdodERlY29kZXIoKTsKKyAgcHJpdmF0ZToKKyAgICBUaWdodERlY29kZXIoQ01zZ1JlYWRlciogcmVhZGVyKTsKKyAgICBDTXNnUmVhZGVyKiByZWFkZXI7CisgICAgcmRyOjpabGliSW5TdHJlYW0gemlzWzRdOworICB9OworCisgIC8vIENvbXByZXNzaW9uIGNvbnRyb2wgCisgIGNvbnN0IHVuc2lnbmVkIGludCByZmJUaWdodEV4cGxpY2l0RmlsdGVyID0gMHgwNDsKKyAgY29uc3QgdW5zaWduZWQgaW50IHJmYlRpZ2h0RmlsbCA9IDB4MDg7CisgIGNvbnN0IHVuc2lnbmVkIGludCByZmJUaWdodEpwZWcgPSAweDA5OworICBjb25zdCB1bnNpZ25lZCBpbnQgcmZiVGlnaHRNYXhTdWJlbmNvZGluZyA9IDB4MDk7CisKKyAgLy8gRmlsdGVycyB0byBpbXByb3ZlIGNvbXByZXNzaW9uIGVmZmljaWVuY3kKKyAgY29uc3QgdW5zaWduZWQgaW50IHJmYlRpZ2h0RmlsdGVyQ29weSA9IDB4MDA7CisgIGNvbnN0IHVuc2lnbmVkIGludCByZmJUaWdodEZpbHRlclBhbGV0dGUgPSAweDAxOworICBjb25zdCB1bnNpZ25lZCBpbnQgcmZiVGlnaHRGaWx0ZXJHcmFkaWVudCA9IDB4MDI7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9UaWdodEVuY29kZXIuY3h4IGIvY29tbW9uL3JmYi9UaWdodEVuY29kZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OWE1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1RpZ2h0RW5jb2Rlci5jeHgKQEAgLTAsMCArMSwxOTMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIENvbnN0YW50aW4gS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL0ltYWdlR2V0dGVyLmg+CisjaW5jbHVkZSA8cmZiL2VuY29kaW5ncy5oPgorI2luY2x1ZGUgPHJmYi9Db25uUGFyYW1zLmg+CisjaW5jbHVkZSA8cmZiL1NNc2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvVGlnaHRFbmNvZGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKKy8vIE1pbmltdW0gYW1vdW50IG9mIGRhdGEgdG8gYmUgY29tcHJlc3NlZC4gVGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlCisvLyBjaGFuZ2VkLCBkb2luZyBzbyB3aWxsIGJyZWFrIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjbGllbnRzLgorI2RlZmluZSBUSUdIVF9NSU5fVE9fQ09NUFJFU1MgMTIKKworLy8gQWRqdXN0YWJsZSBwYXJhbWV0ZXJzLgorLy8gRklYTUU6IEdldCByaWQgb2YgI2RlZmluZXMKKyNkZWZpbmUgVElHSFRfSlBFR19NSU5fUkVDVF9TSVpFIDEwMjQKKyNkZWZpbmUgVElHSFRfREVURUNUX01JTl9XSURUSCAgICAgIDgKKyNkZWZpbmUgVElHSFRfREVURUNUX01JTl9IRUlHSFQgICAgIDgKKworLy8KKy8vIENvbXByZXNzaW9uIGxldmVsIHN0dWZmLiBUaGUgZm9sbG93aW5nIGFycmF5IGNvbnRhaW5zIHZhcmlvdXMKKy8vIGVuY29kZXIgcGFyYW1ldGVycyBmb3IgZWFjaCBvZiAxMCBjb21wcmVzc2lvbiBsZXZlbHMgKDAuLjkpLgorLy8gTGFzdCB0aHJlZSBwYXJhbWV0ZXJzIGNvcnJlc3BvbmQgdG8gSlBFRyBxdWFsaXR5IGxldmVscyAoMC4uOSkuCisvLworLy8gTk9URTogc19jb25mWzldLm1heFJlY3RTaXplIHNob3VsZCBiZSA+PSBzX2NvbmZbaV0ubWF4UmVjdFNpemUsCisvLyB3aGVyZSBpIGluIFswLi44XS4gUmVxdWlyZWRCdWZmU2l6ZSgpIG1ldGhvZCBkZXBlbmRzIG9uIHRoaXMuCisvLyBGSVhNRTogSXMgdGhpcyBjb21tZW50IG9ic29sZXRlPworLy8KKworY29uc3QgVElHSFRfQ09ORiBUaWdodEVuY29kZXI6OmNvbmZbMTBdID0geworICB7ICAgNTEyLCAgIDMyLCAgIDYsIDAsIDAsIDAsICAgNCwgIDUgfSwKKyAgeyAgMjA0OCwgICA2NCwgICA2LCAxLCAxLCAxLCAgIDgsIDEwIH0sCisgIHsgIDQwOTYsICAxMjgsICAgOCwgMywgMywgMiwgIDI0LCAxNSB9LAorICB7ICA4MTkyLCAgMjU2LCAgMTIsIDUsIDUsIDIsICAzMiwgMjUgfSwKKyAgeyAxNjM4NCwgIDUxMiwgIDEyLCA2LCA3LCAzLCAgMzIsIDM3IH0sCisgIHsgMzI3NjgsICA1MTIsICAxMiwgNywgOCwgNCwgIDMyLCA1MCB9LAorICB7IDY1NTM2LCAxMDI0LCAgMTYsIDcsIDgsIDUsICAzMiwgNjAgfSwKKyAgeyA2NTUzNiwgMTAyNCwgIDE2LCA4LCA5LCA2LCAgNjQsIDcwIH0sCisgIHsgNjU1MzYsIDIwNDgsICAyNCwgOSwgOSwgNywgIDY0LCA3NSB9LAorICB7IDY1NTM2LCAyMDQ4LCAgMzIsIDksIDksIDksICA5NiwgODAgfQorfTsKK2NvbnN0IGludCBUaWdodEVuY29kZXI6OmRlZmF1bHRDb21wcmVzc0xldmVsID0gNjsKKworLy8gRklYTUU6IE5vdCBnb29kIHRvIG1pcnJvciBUaWdodEVuY29kZXIncyBtZW1iZXJzIGhlcmUuCitzdGF0aWMgY29uc3QgVElHSFRfQ09ORiogc19wY29uZjsKK3N0YXRpYyBjb25zdCBUSUdIVF9DT05GKiBzX3BqY29uZjsKKworLy8KKy8vIEluY2x1ZGluZyBCUFAtZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyLgorLy8KKworI2RlZmluZSBFWFRSQV9BUkdTIEltYWdlR2V0dGVyKiBpZworI2RlZmluZSBHRVRfSU1BR0VfSU5UT19CVUYocixidWYpIGlnLT5nZXRJbWFnZShidWYsIHIpOworI2RlZmluZSBCUFAgOAorI2luY2x1ZGUgPHJmYi90aWdodEVuY29kZS5oPgorI3VuZGVmIEJQUAorI2RlZmluZSBCUFAgMTYKKyNpbmNsdWRlIDxyZmIvdGlnaHRFbmNvZGUuaD4KKyN1bmRlZiBCUFAKKyNkZWZpbmUgQlBQIDMyCisjaW5jbHVkZSA8cmZiL3RpZ2h0RW5jb2RlLmg+CisjdW5kZWYgQlBQCisKK0VuY29kZXIqIFRpZ2h0RW5jb2Rlcjo6Y3JlYXRlKFNNc2dXcml0ZXIqIHdyaXRlcikKK3sKKyAgcmV0dXJuIG5ldyBUaWdodEVuY29kZXIod3JpdGVyKTsKK30gCisKK1RpZ2h0RW5jb2Rlcjo6VGlnaHRFbmNvZGVyKFNNc2dXcml0ZXIqIHdyaXRlcl8pIDogd3JpdGVyKHdyaXRlcl8pCit7CisgIHNldENvbXByZXNzTGV2ZWwoZGVmYXVsdENvbXByZXNzTGV2ZWwpOworICBzZXRRdWFsaXR5TGV2ZWwoLTEpOworfQorCitUaWdodEVuY29kZXI6On5UaWdodEVuY29kZXIoKQoreworfQorCit2b2lkIFRpZ2h0RW5jb2Rlcjo6c2V0Q29tcHJlc3NMZXZlbChpbnQgbGV2ZWwpCit7CisgIGlmIChsZXZlbCA+PSAwICYmIGxldmVsIDw9IDkpIHsKKyAgICBwY29uZiA9ICZjb25mW2xldmVsXTsKKyAgfSBlbHNlIHsKKyAgICBwY29uZiA9ICZjb25mW2RlZmF1bHRDb21wcmVzc0xldmVsXTsKKyAgfQorfQorCit2b2lkIFRpZ2h0RW5jb2Rlcjo6c2V0UXVhbGl0eUxldmVsKGludCBsZXZlbCkKK3sKKyAgaWYgKGxldmVsID49IDAgJiYgbGV2ZWwgPD0gOSkgeworICAgIHBqY29uZiA9ICZjb25mW2xldmVsXTsKKyAgfSBlbHNlIHsKKyAgICBwamNvbmYgPSBOVUxMOworICB9Cit9CisKK2ludCBUaWdodEVuY29kZXI6OmdldE51bVJlY3RzKGNvbnN0IFJlY3QgJnIpCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCB3ID0gci53aWR0aCgpOworICBjb25zdCB1bnNpZ25lZCBpbnQgaCA9IHIuaGVpZ2h0KCk7CisKKyAgLy8gV2lsbCB0aGlzIHJlY3RhbmdsZSBzcGxpdCBpbnRvIHN1YnJlY3RzPworICBib29sIHJlY3RUb29CaWcgPSB3ID4gcGNvbmYtPm1heFJlY3RXaWR0aCB8fCB3ICogaCA+IHBjb25mLT5tYXhSZWN0U2l6ZTsKKyAgaWYgKCFyZWN0VG9vQmlnKQorICAgIHJldHVybiAxOworCisgIC8vIENvbXB1dGUgbWF4IHN1Yi1yZWN0YW5nbGUgc2l6ZS4KKyAgY29uc3QgdW5zaWduZWQgaW50IHN1YnJlY3RNYXhXaWR0aCA9CisgICAgKHcgPiBwY29uZi0+bWF4UmVjdFdpZHRoKSA/IHBjb25mLT5tYXhSZWN0V2lkdGggOiB3OworICBjb25zdCB1bnNpZ25lZCBpbnQgc3VicmVjdE1heEhlaWdodCA9CisgICAgcGNvbmYtPm1heFJlY3RTaXplIC8gc3VicmVjdE1heFdpZHRoOworCisgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHN1YnJlY3RzLgorICByZXR1cm4gKCgodyAtIDEpIC8gcGNvbmYtPm1heFJlY3RXaWR0aCArIDEpICoKKyAgICAgICAgICAoKGggLSAxKSAvIHN1YnJlY3RNYXhIZWlnaHQgKyAxKSk7Cit9CisKK2Jvb2wgVGlnaHRFbmNvZGVyOjp3cml0ZVJlY3QoY29uc3QgUmVjdCYgciwgSW1hZ2VHZXR0ZXIqIGlnLCBSZWN0KiBhY3R1YWwpCit7CisgIC8vIFNob3J0Y3V0cyB0byByZWN0YW5nbGUgY29vcmRpbmF0ZXMgYW5kIGRpbWVuc2lvbnMuCisgIGNvbnN0IGludCB4ID0gci50bC54OworICBjb25zdCBpbnQgeSA9IHIudGwueTsKKyAgY29uc3QgdW5zaWduZWQgaW50IHcgPSByLndpZHRoKCk7CisgIGNvbnN0IHVuc2lnbmVkIGludCBoID0gci5oZWlnaHQoKTsKKworICAvLyBDb3B5IG1lbWJlcnMgb2YgY3VycmVudCBUaWdodEVuY29kZXIgaW5zdGFuY2UgdG8gc3RhdGljIHZhcmlhYmxlcy4KKyAgc19wY29uZiA9IHBjb25mOworICBzX3BqY29uZiA9IHBqY29uZjsKKworICAvLyBFbmNvZGUgc21hbGwgcmVjdHMgYXMgaXMuCisgIGJvb2wgcmVjdFRvb0JpZyA9IHcgPiBwY29uZi0+bWF4UmVjdFdpZHRoIHx8IHcgKiBoID4gcGNvbmYtPm1heFJlY3RTaXplOworICBpZiAoIXJlY3RUb29CaWcpIHsKKyAgICB3cml0ZVN1YnJlY3QociwgaWcpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQ29tcHV0ZSBtYXggc3ViLXJlY3RhbmdsZSBzaXplLgorICBjb25zdCB1bnNpZ25lZCBpbnQgc3VicmVjdE1heFdpZHRoID0KKyAgICAodyA+IHBjb25mLT5tYXhSZWN0V2lkdGgpID8gcGNvbmYtPm1heFJlY3RXaWR0aCA6IHc7CisgIGNvbnN0IHVuc2lnbmVkIGludCBzdWJyZWN0TWF4SGVpZ2h0ID0KKyAgICBwY29uZi0+bWF4UmVjdFNpemUgLyBzdWJyZWN0TWF4V2lkdGg7CisKKyAgLy8gU3BsaXQgYmlnIHJlY3RzIGludG8gc2VwYXJhdGVseSBlbmNvZGVkIHN1YnJlY3RzLgorICBSZWN0IHNyOworICB1bnNpZ25lZCBpbnQgZHgsIGR5LCBzdywgc2g7CisgIGZvciAoZHkgPSAwOyBkeSA8IGg7IGR5ICs9IHN1YnJlY3RNYXhIZWlnaHQpIHsKKyAgICBmb3IgKGR4ID0gMDsgZHggPCB3OyBkeCArPSBwY29uZi0+bWF4UmVjdFdpZHRoKSB7CisgICAgICBzdyA9IChkeCArIHBjb25mLT5tYXhSZWN0V2lkdGggPCB3KSA/IHBjb25mLT5tYXhSZWN0V2lkdGggOiB3IC0gZHg7CisgICAgICBzaCA9IChkeSArIHN1YnJlY3RNYXhIZWlnaHQgPCBoKSA/IHN1YnJlY3RNYXhIZWlnaHQgOiBoIC0gZHk7CisgICAgICBzci5zZXRYWVdIKHggKyBkeCwgeSArIGR5LCBzdywgc2gpOworICAgICAgd3JpdGVTdWJyZWN0KHNyLCBpZyk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRpZ2h0RW5jb2Rlcjo6d3JpdGVTdWJyZWN0KGNvbnN0IFJlY3QmIHIsIEltYWdlR2V0dGVyKiBpZykKK3sKKyAgcmRyOjpVOCogaW1hZ2VCdWYgPSB3cml0ZXItPmdldEltYWdlQnVmKHIuYXJlYSgpKTsKKyAgQ29ublBhcmFtcyogY3AgPSB3cml0ZXItPmdldENvbm5QYXJhbXMoKTsKKyAgbW9zLmNsZWFyKCk7CisKKyAgc3dpdGNoICh3cml0ZXItPmJwcCgpKSB7CisgIGNhc2UgODoKKyAgICB0aWdodEVuY29kZTgociwgJm1vcywgem9zLCBpbWFnZUJ1ZiwgY3AsIGlnKTsgIGJyZWFrOworICBjYXNlIDE2OgorICAgIHRpZ2h0RW5jb2RlMTYociwgJm1vcywgem9zLCBpbWFnZUJ1ZiwgY3AsIGlnKTsgYnJlYWs7CisgIGNhc2UgMzI6CisgICAgdGlnaHRFbmNvZGUzMihyLCAmbW9zLCB6b3MsIGltYWdlQnVmLCBjcCwgaWcpOyBicmVhazsKKyAgfQorCisgIHdyaXRlci0+c3RhcnRSZWN0KHIsIGVuY29kaW5nVGlnaHQpOworICByZHI6Ok91dFN0cmVhbSogb3MgPSB3cml0ZXItPmdldE91dFN0cmVhbSgpOworICBvcy0+d3JpdGVCeXRlcyhtb3MuZGF0YSgpLCBtb3MubGVuZ3RoKCkpOworICB3cml0ZXItPmVuZFJlY3QoKTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvVGlnaHRFbmNvZGVyLmggYi9jb21tb24vcmZiL1RpZ2h0RW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTFlYWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1RpZ2h0RW5jb2Rlci5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIENvbnN0YW50aW4gS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpZm5kZWYgX19SRkJfVElHSFRFTkNPREVSX0hfXworI2RlZmluZSBfX1JGQl9USUdIVEVOQ09ERVJfSF9fCisKKyNpbmNsdWRlIDxyZHIvTWVtT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmRyL1psaWJPdXRTdHJlYW0uaD4KKyNpbmNsdWRlIDxyZmIvRW5jb2Rlci5oPgorCisvLyBGSVhNRTogQ2hlY2sgaWYgc3BlY2lmeWluZyBleHRlcm4gIkMiIGlzIHJlYWxseSBuZWNlc3NhcnkuCisjaW5jbHVkZSA8c3RkaW8uaD4KK2V4dGVybiAiQyIgeworI2luY2x1ZGUgImpwZWcvanBlZ2xpYi5oIgorfQorCituYW1lc3BhY2UgcmZiIHsKKworICBzdHJ1Y3QgVElHSFRfQ09ORiB7CisgICAgdW5zaWduZWQgaW50IG1heFJlY3RTaXplLCBtYXhSZWN0V2lkdGg7CisgICAgdW5zaWduZWQgaW50IG1vbm9NaW5SZWN0U2l6ZTsKKyAgICBpbnQgaWR4WmxpYkxldmVsLCBtb25vWmxpYkxldmVsLCByYXdabGliTGV2ZWw7CisgICAgaW50IGlkeE1heENvbG9yc0Rpdmlzb3I7CisgICAgaW50IGpwZWdRdWFsaXR5OworICB9OworCisgIC8vCisgIC8vIENvbXByZXNzaW9uIGxldmVsIHN0dWZmLiBUaGUgZm9sbG93aW5nIGFycmF5IGNvbnRhaW5zIHZhcmlvdXMKKyAgLy8gZW5jb2RlciBwYXJhbWV0ZXJzIGZvciBlYWNoIG9mIDEwIGNvbXByZXNzaW9uIGxldmVscyAoMC4uOSkuCisgIC8vIExhc3QgdGhyZWUgcGFyYW1ldGVycyBjb3JyZXNwb25kIHRvIEpQRUcgcXVhbGl0eSBsZXZlbHMgKDAuLjkpLgorICAvLworICAvLyBOT1RFOiBzX2NvbmZbOV0ubWF4UmVjdFNpemUgc2hvdWxkIGJlID49IHNfY29uZltpXS5tYXhSZWN0U2l6ZSwKKyAgLy8gd2hlcmUgaSBpbiBbMC4uOF0uIFJlcXVpcmVkQnVmZlNpemUoKSBtZXRob2QgZGVwZW5kcyBvbiB0aGlzLgorICAvLyBGSVhNRTogSXMgdGhpcyBjb21tZW50IG9ic29sZXRlPworICAvLworCisgIAorICBjbGFzcyBUaWdodEVuY29kZXIgOiBwdWJsaWMgRW5jb2RlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgRW5jb2RlciogY3JlYXRlKFNNc2dXcml0ZXIqIHdyaXRlcik7CisgICAgdmlydHVhbCB2b2lkIHNldENvbXByZXNzTGV2ZWwoaW50IGxldmVsKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UXVhbGl0eUxldmVsKGludCBsZXZlbCk7CisgICAgdmlydHVhbCBpbnQgZ2V0TnVtUmVjdHMoY29uc3QgUmVjdCAmcik7CisgICAgdmlydHVhbCBib29sIHdyaXRlUmVjdChjb25zdCBSZWN0JiByLCBJbWFnZUdldHRlciogaWcsIFJlY3QqIGFjdHVhbCk7CisgICAgdmlydHVhbCB+VGlnaHRFbmNvZGVyKCk7CisKKyAgcHJpdmF0ZToKKyAgICBUaWdodEVuY29kZXIoU01zZ1dyaXRlciogd3JpdGVyKTsKKyAgICB2b2lkIHdyaXRlU3VicmVjdChjb25zdCBSZWN0JiByLCBJbWFnZUdldHRlciogaWcpOworCisgICAgU01zZ1dyaXRlciogd3JpdGVyOworICAgIHJkcjo6TWVtT3V0U3RyZWFtIG1vczsKKyAgICByZHI6OlpsaWJPdXRTdHJlYW0gem9zWzRdOworCisgICAgc3RhdGljIGNvbnN0IGludCBkZWZhdWx0Q29tcHJlc3NMZXZlbDsKKyAgICBzdGF0aWMgY29uc3QgVElHSFRfQ09ORiBjb25mW107CisKKyAgICBjb25zdCBUSUdIVF9DT05GKiBwY29uZjsKKyAgICBjb25zdCBUSUdIVF9DT05GKiBwamNvbmY7CisgIH07CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1RpZ2h0UGFsZXR0ZS5jeHggYi9jb21tb24vcmZiL1RpZ2h0UGFsZXR0ZS5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlZDA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvVGlnaHRQYWxldHRlLmN4eApAQCAtMCwwICsxLDExMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgQ29uc3RhbnRpbiBLYXBsaW5za3kuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLworLy8gVGlnaHRQYWxldHRlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorLy8KKworI2luY2x1ZGUgPHJmYi9UaWdodFBhbGV0dGUuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworVGlnaHRQYWxldHRlOjpUaWdodFBhbGV0dGUoaW50IG1heENvbG9ycykKK3sKKyAgc2V0TWF4Q29sb3JzKG1heENvbG9ycyk7CisgIHJlc2V0KCk7Cit9CisKK3ZvaWQgVGlnaHRQYWxldHRlOjpyZXNldCgpCit7CisgIG1fbnVtQ29sb3JzID0gMDsKKyAgbWVtc2V0KG1faGFzaCwgMCwgMjU2ICogc2l6ZW9mKFRpZ2h0Q29sb3JMaXN0ICopKTsKK30KKwordm9pZCBUaWdodFBhbGV0dGU6OnNldE1heENvbG9ycyhpbnQgbWF4Q29sb3JzKQoreworICBtX21heENvbG9ycyA9IG1heENvbG9yczsKKyAgaWYgKG1fbWF4Q29sb3JzIDwgMCkgeworICAgIG1fbWF4Q29sb3JzID0gMDsKKyAgfSBlbHNlIGlmIChtX21heENvbG9ycyA+IDI1NCkgeworICAgIG1fbWF4Q29sb3JzID0gMjU0OworICB9Cit9CisKK2ludCBUaWdodFBhbGV0dGU6Omluc2VydChyZHI6OlUzMiByZ2IsIGludCBudW1QaXhlbHMpCit7CisgIFRpZ2h0Q29sb3JMaXN0ICpwbm9kZTsKKyAgVGlnaHRDb2xvckxpc3QgKnByZXZfcG5vZGUgPSBOVUxMOworICBpbnQgaGFzaF9rZXksIGlkeCwgbmV3X2lkeCwgY291bnQ7CisKKyAgaGFzaF9rZXkgPSBoYXNoRnVuYyhyZ2IpOworCisgIHBub2RlID0gbV9oYXNoW2hhc2hfa2V5XTsKKworICB3aGlsZSAocG5vZGUgIT0gTlVMTCkgeworICAgIGlmIChwbm9kZS0+cmdiID09IHJnYikgeworICAgICAgLy8gU3VjaCBwYWxldHRlIGVudHJ5IGFscmVhZHkgZXhpc3RzLgorICAgICAgbmV3X2lkeCA9IGlkeCA9IHBub2RlLT5pZHg7CisgICAgICBjb3VudCA9IG1fZW50cnlbaWR4XS5udW1QaXhlbHMgKyBudW1QaXhlbHM7CisgICAgICBpZiAobmV3X2lkeCAmJiBtX2VudHJ5W25ld19pZHgtMV0ubnVtUGl4ZWxzIDwgY291bnQpIHsKKyAgICAgICAgZG8geworICAgICAgICAgIG1fZW50cnlbbmV3X2lkeF0gPSBtX2VudHJ5W25ld19pZHgtMV07CisgICAgICAgICAgbV9lbnRyeVtuZXdfaWR4XS5saXN0Tm9kZS0+aWR4ID0gbmV3X2lkeDsKKyAgICAgICAgICBuZXdfaWR4LS07CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKG5ld19pZHggJiYgbV9lbnRyeVtuZXdfaWR4LTFdLm51bVBpeGVscyA8IGNvdW50KTsKKworICAgICAgICBtX2VudHJ5W25ld19pZHhdLmxpc3ROb2RlID0gcG5vZGU7CisgICAgICAgIHBub2RlLT5pZHggPSBuZXdfaWR4OworICAgICAgfQorICAgICAgbV9lbnRyeVtuZXdfaWR4XS5udW1QaXhlbHMgPSBjb3VudDsKKyAgICAgIHJldHVybiBtX251bUNvbG9yczsKKyAgICB9CisgICAgcHJldl9wbm9kZSA9IHBub2RlOworICAgIHBub2RlID0gcG5vZGUtPm5leHQ7CisgIH0KKworICAvLyBDaGVjayBpZiB0aGUgcGFsZXR0ZSBpcyBmdWxsLgorICBpZiAobV9udW1Db2xvcnMgPT0gMjU2IHx8IG1fbnVtQ29sb3JzID09IG1fbWF4Q29sb3JzKSB7CisgICAgbV9udW1Db2xvcnMgPSAwOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gTW92ZSBwYWxldHRlIGVudHJpZXMgd2l0aCBsZXNzZXIgcGl4ZWwgY291bnRzLgorICBmb3IgKCBpZHggPSBtX251bUNvbG9yczsKKyAgICAgICAgaWR4ID4gMCAmJiBtX2VudHJ5W2lkeC0xXS5udW1QaXhlbHMgPCBudW1QaXhlbHM7CisgICAgICAgIGlkeC0tICkgeworICAgIG1fZW50cnlbaWR4XSA9IG1fZW50cnlbaWR4LTFdOworICAgIG1fZW50cnlbaWR4XS5saXN0Tm9kZS0+aWR4ID0gaWR4OworICB9CisKKyAgLy8gQWRkIG5ldyBwYWxldHRlIGVudHJ5IGludG8gdGhlIGZyZWVkIHNsb3QuCisgIHBub2RlID0gJm1fbGlzdFttX251bUNvbG9yc107CisgIGlmIChwcmV2X3Bub2RlICE9IE5VTEwpIHsKKyAgICBwcmV2X3Bub2RlLT5uZXh0ID0gcG5vZGU7CisgIH0gZWxzZSB7CisgICAgbV9oYXNoW2hhc2hfa2V5XSA9IHBub2RlOworICB9CisgIHBub2RlLT5uZXh0ID0gTlVMTDsKKyAgcG5vZGUtPmlkeCA9IGlkeDsKKyAgcG5vZGUtPnJnYiA9IHJnYjsKKyAgbV9lbnRyeVtpZHhdLmxpc3ROb2RlID0gcG5vZGU7CisgIG1fZW50cnlbaWR4XS5udW1QaXhlbHMgPSBudW1QaXhlbHM7CisKKyAgcmV0dXJuICsrbV9udW1Db2xvcnM7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1RpZ2h0UGFsZXR0ZS5oIGIvY29tbW9uL3JmYi9UaWdodFBhbGV0dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjY0NDhlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9UaWdodFBhbGV0dGUuaApAQCAtMCwwICsxLDEyNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgQ29uc3RhbnRpbiBLYXBsaW5za3kuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLworLy8gVGlnaHRQYWxldHRlIGNsYXNzIGlzIGEgY29udGFpbmVyIGZvciBvcmRlcmVkIGNvbG9yIHZhbHVlcy4gQ29sb3JzCisvLyBhcmUga2V5cyBpbiBhIGhhc2ggd2hlcmUgdmFsdWVzIGFyZSBmcmVxdWVuY3kgY291bnRzLiBBbHNvLCB0aGVyZQorLy8gaXMgYSBsaXN0IHdoZXJlIGNvbG9ycyBhcmUgYWx3YXlzIHNvcnRlZCBieSB0aGVzZSBjb3VudHMgKG1vcmUKKy8vIGZyZXF1ZW50IGZpcnN0KS4KKy8vCisKKyNpZm5kZWYgX19SRkJfVElHSFRQQUxFVFRFX0hfXworI2RlZmluZSBfX1JGQl9USUdIVFBBTEVUVEVfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxyZHIvdHlwZXMuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgc3RydWN0IFRpZ2h0Q29sb3JMaXN0IHsKKyAgICBUaWdodENvbG9yTGlzdCAqbmV4dDsKKyAgICBpbnQgaWR4OworICAgIHJkcjo6VTMyIHJnYjsKKyAgfTsKKworICBzdHJ1Y3QgVGlnaHRQYWxldHRlRW50cnkgeworICAgIFRpZ2h0Q29sb3JMaXN0ICpsaXN0Tm9kZTsKKyAgICBpbnQgbnVtUGl4ZWxzOworICB9OworCisgIGNsYXNzIFRpZ2h0UGFsZXR0ZSB7CisKKyAgcHJvdGVjdGVkOgorCisgICAgLy8gRklYTUU6IEJpZ2dlciBoYXNoIHRhYmxlPyBCZXR0ZXIgaGFzaCBmdW5jdGlvbj8KKyAgICBpbmxpbmUgc3RhdGljIGludCBoYXNoRnVuYyhyZHI6OlUzMiByZ2IpIHsKKyAgICAgIHJldHVybiAocmdiIF4gKHJnYiA+PiAxMykpICYgMHhGRjsKKyAgICB9CisKKyAgcHVibGljOgorCisgICAgVGlnaHRQYWxldHRlKGludCBtYXhDb2xvcnMgPSAyNTQpOworCisgICAgLy8KKyAgICAvLyBSZS1pbml0aWFsaXplIHRoZSBvYmplY3QuIFRoaXMgZG9lcyBub3QgY2hhbmdlIG1heGltdW0gbnVtYmVyCisgICAgLy8gb2YgY29sb3JzLgorICAgIC8vCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8KKyAgICAvLyBTZXQgbGltaXQgb24gdGhlIG51bWJlciBvZiBjb2xvcnMgaW4gdGhlIHBhbGV0dGUuIE5vdGUgdGhhdAorICAgIC8vIHRoaXMgdmFsdWUgY2Fubm90IGV4Y2VlZCAyNTQuCisgICAgLy8KKyAgICB2b2lkIHNldE1heENvbG9ycyhpbnQgbWF4Q29sb3JzKTsKKworICAgIC8vCisgICAgLy8gSW5zZXJ0IG5ldyBjb2xvciBpbnRvIHRoZSBwYWxldHRlLCBvciBpbmNyZW1lbnQgaXRzIGNvdW50ZXIgaWYKKyAgICAvLyB0aGUgY29sb3IgaXMgYWxyZWFkeSB0aGVyZS4gUmV0dXJucyBuZXcgbnVtYmVyIG9mIGNvbG9ycywgb3IKKyAgICAvLyB6ZXJvIGlmIHRoZSBwYWxldHRlIGlzIGZ1bGwuIElmIHRoZSBwYWxldHRlIGJlY29tZXMgZnVsbCwgaXQKKyAgICAvLyByZXBvcnRzIHplcm8gY29sb3JzIGFuZCBjYW5ub3QgYmUgdXNlZCBhbnkgbW9yZSB3aXRob3V0IGNhbGxpbmcKKyAgICAvLyByZXNldCgpLgorICAgIC8vCisgICAgaW50IGluc2VydChyZHI6OlUzMiByZ2IsIGludCBudW1QaXhlbHMpOworCisgICAgLy8KKyAgICAvLyBSZXR1cm4gbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZS4KKyAgICAvLworICAgIGlubGluZSBpbnQgZ2V0TnVtQ29sb3JzKCkgY29uc3QgeworICAgICAgcmV0dXJuIG1fbnVtQ29sb3JzOworICAgIH0KKworICAgIC8vCisgICAgLy8gUmV0dXJuIHRoZSBjb2xvciBzcGVjaWZpZWQgYnkgaXRzIGluZGV4IGluIHRoZSBwYWxldHRlLgorICAgIC8vCisgICAgaW5saW5lIHJkcjo6VTMyIGdldEVudHJ5KGludCBpKSBjb25zdCB7CisgICAgICByZXR1cm4gKGkgPCBtX251bUNvbG9ycykgPyBtX2VudHJ5W2ldLmxpc3ROb2RlLT5yZ2IgOiAocmRyOjpVMzIpLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSZXR1cm4gdGhlIHBpeGVsIGNvdW50ZXIgb2YgdGhlIGNvbG9yIHNwZWNpZmllZCBieSBpdHMgaW5kZXguCisgICAgLy8KKyAgICBpbmxpbmUgaW50IGdldENvdW50KGludCBpKSBjb25zdCB7CisgICAgICByZXR1cm4gKGkgPCBtX251bUNvbG9ycykgPyBtX2VudHJ5W2ldLm51bVBpeGVscyA6IDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSZXR1cm4gdGhlIGluZGV4IG9mIGEgc3BlY2lmaWVkIGNvbG9yLgorICAgIC8vCisgICAgaW5saW5lIHJkcjo6VTggZ2V0SW5kZXgocmRyOjpVMzIgcmdiKSBjb25zdCB7CisgICAgICBUaWdodENvbG9yTGlzdCAqcG5vZGUgPSBtX2hhc2hbaGFzaEZ1bmMocmdiKV07CisgICAgICB3aGlsZSAocG5vZGUgIT0gTlVMTCkgeworICAgICAgICBpZiAocG5vZGUtPnJnYiA9PSByZ2IpIHsKKyAgICAgICAgICByZXR1cm4gKHJkcjo6VTgpcG5vZGUtPmlkeDsKKyAgICAgICAgfQorICAgICAgICBwbm9kZSA9IHBub2RlLT5uZXh0OworICAgICAgfQorICAgICAgcmV0dXJuIDB4RkY7ICAgICAgICAgICAgICAvLyBubyBzdWNoIGNvbG9yCisgICAgfQorCisgIHByb3RlY3RlZDoKKworICAgIGludCBtX21heENvbG9yczsKKyAgICBpbnQgbV9udW1Db2xvcnM7CisKKyAgICBUaWdodFBhbGV0dGVFbnRyeSBtX2VudHJ5WzI1Nl07CisgICAgVGlnaHRDb2xvckxpc3QgKm1faGFzaFsyNTZdOworICAgIFRpZ2h0Q29sb3JMaXN0IG1fbGlzdFsyNTZdOworCisgIH07CisKK30gLy8gbmFtZXNwYWNlIHJmYgorCisjZW5kaWYgLy8gX19SRkJfVElHSFRQQUxFVFRFX0hfXwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9UaW1lci5jeHggYi9jb21tb24vcmZiL1RpbWVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmZkMmIxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9UaW1lci5jeHgKQEAgLTAsMCArMSwxNzkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gLT0tIFRpbWVyLmN4eAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpZm5kZWYgX1dJTjMyX1dDRQorI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxyZmIvVGltZXIuaD4KKyNpbmNsdWRlIDxyZmIvdXRpbC5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKworLy8gWFhYIEx5bngvT1MgMi4zOiBwcm90byBmb3IgZ2V0dGltZW9mZGF5KCkKKyNpZmRlZiBMeW54CisjaW5jbHVkZSA8c3lzL3Byb3RvLmg+CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworI2lmbmRlZiBfX05PX0RFRklORV9WTE9HX18KK3N0YXRpYyBMb2dXcml0ZXIgdmxvZygiVGltZXIiKTsKKyNlbmRpZgorCisKKy8vIFdpbjMyIGRvZXMgbm90IHByb3ZpZGUgZ2V0dGltZW9mZGF5LCBzbyB3ZSBlbXVsYXRlIGl0IHRvIHNpbXBsaWZ5IHRoZQorLy8gVGltZXIgY29kZS4KKworI2lmZGVmIF9XSU4zMgorc3RhdGljIHZvaWQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiB0diwgdm9pZCopCit7CisgIExBUkdFX0lOVEVHRVIgY291bnRzLCBjb3VudHNQZXJTZWM7CisgIHN0YXRpYyBkb3VibGUgdXNlY1BlckNvdW50ID0gMC4wOworCisgIGlmIChRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmY291bnRzKSkgeworICAgIGlmICh1c2VjUGVyQ291bnQgPT0gMC4wKSB7CisgICAgICBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZjb3VudHNQZXJTZWMpOworICAgICAgdXNlY1BlckNvdW50ID0gMTAwMDAwMC4wIC8gY291bnRzUGVyU2VjLlF1YWRQYXJ0OworICAgIH0KKworICAgIExPTkdMT05HIHVzZWNzID0gKExPTkdMT05HKShjb3VudHMuUXVhZFBhcnQgKiB1c2VjUGVyQ291bnQpOworICAgIHR2LT50dl91c2VjID0gKGxvbmcpKHVzZWNzICUgMTAwMDAwMCk7CisgICAgdHYtPnR2X3NlYyA9IChsb25nKSh1c2VjcyAvIDEwMDAwMDApOworCisgIH0gZWxzZSB7CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICBzdHJ1Y3QgdGltZWIgdGI7CisgICAgZnRpbWUoJnRiKTsKKyAgICB0di0+dHZfc2VjID0gdGIudGltZTsKKyAgICB0di0+dHZfdXNlYyA9IHRiLm1pbGxpdG0gKiAxMDAwOworI2Vsc2UKKyAgICB0aHJvdyBTeXN0ZW1FeGNlcHRpb24oIlF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyIiwgR2V0TGFzdEVycm9yKCkpOworI2VuZGlmCisgIH0KK30KKyNlbmRpZgorCisKKy8vIE1pbGxpc2Vjb25kIHRpbWVvdXQgcHJvY2Vzc2luZyBoZWxwZXIgZnVuY3Rpb25zCisKK2lubGluZSBzdGF0aWMgdGltZXZhbCBhZGRNaWxsaXModGltZXZhbCBpblRpbWUsIGludCBtaWxsaXMpIHsKKyAgaW50IHNlY3MgPSBtaWxsaXMgLyAxMDAwOworICBtaWxsaXMgPSBtaWxsaXMgJSAxMDAwOworICBpblRpbWUudHZfc2VjICs9IHNlY3M7CisgIGluVGltZS50dl91c2VjICs9IG1pbGxpcyAqIDEwMDA7CisgIGlmIChpblRpbWUudHZfdXNlYyA+PSAxMDAwMDAwKSB7CisgICAgaW5UaW1lLnR2X3NlYysrOworICAgIGluVGltZS50dl91c2VjIC09IDEwMDAwMDA7CisgIH0KKyAgcmV0dXJuIGluVGltZTsKK30KKworaW5saW5lIHN0YXRpYyBpbnQgZGlmZlRpbWVNaWxsaXModGltZXZhbCBsYXRlciwgdGltZXZhbCBlYXJsaWVyKSB7CisgIHJldHVybiAoKGxhdGVyLnR2X3NlYyAtIGVhcmxpZXIudHZfc2VjKSAqIDEwMDApICsgKChsYXRlci50dl91c2VjIC0gZWFybGllci50dl91c2VjKSAvIDEwMDApOworfQorCitzdGQ6Omxpc3Q8VGltZXIqPiBUaW1lcjo6cGVuZGluZzsKKworaW50IFRpbWVyOjpjaGVja1RpbWVvdXRzKCkgeworICBpZiAocGVuZGluZy5lbXB0eSgpKQorICAgIHJldHVybiAwOworICB0aW1ldmFsIG5vdzsKKyAgZ2V0dGltZW9mZGF5KCZub3csIDApOworICB3aGlsZSAocGVuZGluZy5mcm9udCgpLT5pc0JlZm9yZShub3cpKSB7CisgICAgVGltZXIqIHRpbWVyID0gcGVuZGluZy5mcm9udCgpOworICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgdmxvZy5kZWJ1ZygiaGFuZGxlVGltZW91dCglcCkiLCB0aW1lcik7CisgICAgaWYgKHRpbWVyLT5jYi0+aGFuZGxlVGltZW91dCh0aW1lcikpIHsKKyAgICAgIHRpbWVyLT5kdWVUaW1lID0gYWRkTWlsbGlzKHRpbWVyLT5kdWVUaW1lLCB0aW1lci0+dGltZW91dE1zKTsKKyAgICAgIGlmICh0aW1lci0+aXNCZWZvcmUobm93KSkgeworICAgICAgICAvLyBUaW1lIGhhcyBqdW1wZWQgZm9yd2FyZHMhCisJICAgICAgdmxvZy5pbmZvKCJ0aW1lIGhhcyBtb3ZlZCBmb3J3YXJkcyEiKTsKKyAgICAgICAgdGltZXItPmR1ZVRpbWUgPSBhZGRNaWxsaXMobm93LCB0aW1lci0+dGltZW91dE1zKTsKKyAgICAgIH0KKyAgICAgIGluc2VydFRpbWVyKHRpbWVyKTsKKyAgICB9IGVsc2UgaWYgKHBlbmRpbmcuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiBnZXROZXh0VGltZW91dCgpOworfQorCitpbnQgVGltZXI6OmdldE5leHRUaW1lb3V0KCkgeworICB0aW1ldmFsIG5vdzsKKyAgZ2V0dGltZW9mZGF5KCZub3csIDApOworICBpbnQgdG9XYWl0ID0gX19yZmJtYXgoMSwgZGlmZlRpbWVNaWxsaXMocGVuZGluZy5mcm9udCgpLT5kdWVUaW1lLCBub3cpKTsKKyAgaWYgKHRvV2FpdCA+IHBlbmRpbmcuZnJvbnQoKS0+dGltZW91dE1zKSB7CisgICAgaWYgKHRvV2FpdCAtIHBlbmRpbmcuZnJvbnQoKS0+dGltZW91dE1zIDwgMTAwMCkgeworICAgICAgdmxvZy5pbmZvKCJnZXR0aW1lb2ZkYXkgaXMgYnJva2VuLi4uIik7CisgICAgICByZXR1cm4gdG9XYWl0OworICAgIH0KKyAgICAvLyBUaW1lIGhhcyBqdW1wZWQgYmFja3dhcmRzIQorICAgIHZsb2cuaW5mbygidGltZSBoYXMgbW92ZWQgYmFja3dhcmRzISIpOworICAgIHBlbmRpbmcuZnJvbnQoKS0+ZHVlVGltZSA9IG5vdzsKKyAgICB0b1dhaXQgPSAxOworICB9CisgIHJldHVybiB0b1dhaXQ7Cit9CisKK3ZvaWQgVGltZXI6Omluc2VydFRpbWVyKFRpbWVyKiB0KSB7CisgIHN0ZDo6bGlzdDxUaW1lcio+OjppdGVyYXRvciBpOworICBmb3IgKGk9cGVuZGluZy5iZWdpbigpOyBpIT1wZW5kaW5nLmVuZCgpOyBpKyspIHsKKyAgICBpZiAodC0+aXNCZWZvcmUoKCppKS0+ZHVlVGltZSkpIHsKKyAgICAgIHBlbmRpbmcuaW5zZXJ0KGksIHQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBwZW5kaW5nLnB1c2hfYmFjayh0KTsKK30KKwordm9pZCBUaW1lcjo6c3RhcnQoaW50IHRpbWVvdXRNc18pIHsKKyAgdGltZXZhbCBub3c7CisgIGdldHRpbWVvZmRheSgmbm93LCAwKTsKKyAgc3RvcCgpOworICB0aW1lb3V0TXMgPSB0aW1lb3V0TXNfOworICBkdWVUaW1lID0gYWRkTWlsbGlzKG5vdywgdGltZW91dE1zKTsKKyAgaW5zZXJ0VGltZXIodGhpcyk7Cit9CisKK3ZvaWQgVGltZXI6OnN0b3AoKSB7CisgIHBlbmRpbmcucmVtb3ZlKHRoaXMpOworfQorCitib29sIFRpbWVyOjppc1N0YXJ0ZWQoKSB7CisgIHN0ZDo6bGlzdDxUaW1lcio+OjppdGVyYXRvciBpOworICBmb3IgKGk9cGVuZGluZy5iZWdpbigpOyBpIT1wZW5kaW5nLmVuZCgpOyBpKyspIHsKKyAgICBpZiAoKmkgPT0gdGhpcykKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworaW50IFRpbWVyOjpnZXRUaW1lb3V0TXMoKSB7CisgIHJldHVybiB0aW1lb3V0TXM7Cit9CisKK2Jvb2wgVGltZXI6OmlzQmVmb3JlKHRpbWV2YWwgb3RoZXIpIHsKKyAgcmV0dXJuIChkdWVUaW1lLnR2X3NlYyA8IG90aGVyLnR2X3NlYykgfHwKKyAgICAoKGR1ZVRpbWUudHZfc2VjID09IG90aGVyLnR2X3NlYykgJiYKKyAgICAgKGR1ZVRpbWUudHZfdXNlYyA8IG90aGVyLnR2X3VzZWMpKTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvVGltZXIuaCBiL2NvbW1vbi9yZmIvVGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjk1YjgyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9UaW1lci5oCkBAIC0wLDAgKzEsMTAyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpZm5kZWYgX19SRkJfVElNRVJfSF9fCisjZGVmaW5lIF9fUkZCX1RJTUVSX0hfXworCisjaW5jbHVkZSA8bGlzdD4KKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIHJmYiB7CisKKyAgLyogVGltZXIKKworICAgICBDcm9zcy1wbGF0Zm9ybSB0aW1lb3V0IGhhbmRsaW5nLiAgVGhlIGNhbGxlciBjcmVhdGVzIGluc3RhbmNlcyBvZiBUaW1lciBhbmQgcGFzc2VzIGEKKyAgICAgQ2FsbGJhY2sgaW1wbGVtZW50YXRpb24gdG8gZWFjaC4gIFRoZSBDYWxsYmFjayB3aWxsIHRoZW4gYmUgY2FsbGVkIHdpdGggYSBwb2ludGVyIHRvCisgICAgIHRoZSBUaW1lciBpbnN0YW5jZSB0aGF0IHRpbWVkLW91dCB3aGVuIHRoZSB0aW1lb3V0IG9jY3Vycy4KKworICAgICBUaGUgc3RhdGljIG1ldGhvZHMgb2YgVGltZXIgYXJlIHVzZWQgYnkgdGhlIG1haW4gbG9vcCBvZiB0aGUgYXBwbGljYXRpb24gYm90aCB0bworICAgICBkaXNwYXRjaCBlbGFwc2VkIFRpbWVyIGNhbGxiYWNrcyBhbmQgdG8gZGV0ZXJtaW5lIGhvdyBsb25nIHRvIHdhaXQgaW4gc2VsZWN0KCkgZm9yCisgICAgIHRoZSBuZXh0IHRpbWVvdXQgdG8gb2NjdXIuCisKKyAgKi8KKworICBzdHJ1Y3QgVGltZXIgeworCisgICAgc3RydWN0IENhbGxiYWNrIHsKKyAgICAgIC8vIGhhbmRsZVRpbWVvdXQKKyAgICAgIC8vICAgUGFzc2VkIGEgcG9pbnRlciB0byB0aGUgVGltZXIgdGhhdCBoYXMgdGltZWQgb3V0LiAgSWYgdGhlIGhhbmRsZXIgcmV0dXJucyB0cnVlCisgICAgICAvLyAgIHRoZW4gdGhlIFRpbWVyIGlzIHJlc2V0IGFuZCBsZWZ0IHJ1bm5pbmcsIGNhdXNpbmcgYW5vdGhlciB0aW1lb3V0IGFmdGVyIHRoZQorICAgICAgLy8gICBhcHByb3ByaWF0ZSBpbnRlcnZhbC4KKyAgICAgIC8vICAgSWYgdGhlIGhhbmRsZXIgcmV0dXJucyBmYWxzZSB0aGVuIHRoZSBUaW1lciBpcyBjYW5jZWxsZWQuCisgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlVGltZW91dChUaW1lciogdCkgPSAwOworICAgIH07CisKKyAgICAvLyBjaGVja1RpbWVvdXRzKCkKKyAgICAvLyAgIERpc3BhdGNoZXMgYW55IGVsYXBzZWQgVGltZXJzLCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB1bnRpbCB0aGUKKyAgICAvLyAgIG5leHQgVGltZXIgd2lsbCB0aW1lb3V0LgorICAgIHN0YXRpYyBpbnQgY2hlY2tUaW1lb3V0cygpOworCisgICAgLy8gZ2V0TmV4dFRpbWVvdXQoKQorICAgIC8vICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB1bnRpbCB0aGUgbmV4dCB0aW1lb3V0LCB3aXRob3V0IGRpc3BhdGNoaW5nCisgICAgLy8gICBhbnkgZWxhcHNlZCBUaW1lcnMuCisgICAgc3RhdGljIGludCBnZXROZXh0VGltZW91dCgpOworCisgICAgLy8gQ3JlYXRlIGEgVGltZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrIGhhbmRsZXIKKyAgICBUaW1lcihDYWxsYmFjayogY2JfKSB7Y2IgPSBjYl87fQorICAgIH5UaW1lcigpIHtzdG9wKCk7fQorCisgICAgLy8gc3RhcnRUaW1lcgorICAgIC8vICAgU3RhcnRzIHRoZSB0aW1lciwgY2F1c2luZyBhIHRpbWVvdXQgYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgorICAgIC8vICAgSWYgdGhlIHRpbWVyIGlzIGFscmVhZHkgYWN0aXZlIHRoZW4gaXQgd2lsbCBiZSBpbXBsaWNpdGx5IGNhbmNlbGxlZCBhbmQgcmUtc3RhcnRlZC4KKyAgICB2b2lkIHN0YXJ0KGludCB0aW1lb3V0TXNfKTsKKworICAgIC8vIHN0b3BUaW1lcgorICAgIC8vICAgQ2FuY2VscyB0aGUgdGltZXIuCisgICAgdm9pZCBzdG9wKCk7CisKKyAgICAvLyBpc1N0YXJ0ZWQKKyAgICAvLyAgIERldGVybWluZXMgd2hldGhlciB0aGUgdGltZXIgaXMgc3RhcnRlZC4KKyAgICBib29sIGlzU3RhcnRlZCgpOworCisgICAgLy8gZ2V0VGltZW91dE1zCisgICAgLy8gICBEZXRlcm1pbmVzIHRoZSBwcmV2aW91c2x5IHVzZWQgdGltZW91dCB2YWx1ZSwgaWYgYW55LgorICAgIC8vICAgVXN1YWxseSB1c2VkIHdpdGggaXNTdGFydGVkKCkgdG8gZ2V0IHRoZSBfY3VycmVudF8gdGltZW91dC4KKyAgICBpbnQgZ2V0VGltZW91dE1zKCk7CisKKyAgICAvLyBpc0JlZm9yZQorICAgIC8vICAgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFRpbWVyIHdpbGwgdGltZW91dCBiZWZvcmUgdGhlIHNwZWNpZmllZCB0aW1lLgorICAgIGJvb2wgaXNCZWZvcmUodGltZXZhbCBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorICAgIHRpbWV2YWwgZHVlVGltZTsKKyAgICBpbnQgdGltZW91dE1zOworICAgIENhbGxiYWNrKiBjYjsKKworICAgIHN0YXRpYyB2b2lkIGluc2VydFRpbWVyKFRpbWVyKiB0KTsKKyAgICAvLyBUaGUgbGlzdCBvZiBjdXJyZW50bHkgYWN0aXZlIFRpbWVycywgb3JkZXJlZCBieSB0aW1lIGxlZnQgdW50aWwgdGltZW91dC4KKyAgICBzdGF0aWMgc3RkOjpsaXN0PFRpbWVyKj4gcGVuZGluZzsKKyAgfTsKKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1RyYW5zSW1hZ2VHZXR0ZXIuY3h4IGIvY29tbW9uL3JmYi9UcmFuc0ltYWdlR2V0dGVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmMyOTFiCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9UcmFuc0ltYWdlR2V0dGVyLmN4eApAQCAtMCwwICsxLDI3OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8cmZiL1BpeGVsRm9ybWF0Lmg+CisjaW5jbHVkZSA8cmZiL0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHJmYi9Db25uUGFyYW1zLmg+CisjaW5jbHVkZSA8cmZiL1NNc2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvQ29sb3VyTWFwLmg+CisjaW5jbHVkZSA8cmZiL1RydWVDb2xvdXJNYXAuaD4KKyNpbmNsdWRlIDxyZmIvUGl4ZWxCdWZmZXIuaD4KKyNpbmNsdWRlIDxyZmIvQ29sb3VyQ3ViZS5oPgorI2luY2x1ZGUgPHJmYi9UcmFuc0ltYWdlR2V0dGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK2NvbnN0IFBpeGVsRm9ybWF0IGJncjIzM1BGKDgsIDgsIGZhbHNlLCB0cnVlLCA3LCA3LCAzLCAwLCAzLCA2KTsKKworc3RhdGljIHZvaWQgbm9UcmFuc0ZuKHZvaWQqIHRhYmxlXywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhlbEZvcm1hdCYgaW5QRiwgdm9pZCogaW5QdHIsIGludCBpblN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhlbEZvcm1hdCYgb3V0UEYsIHZvaWQqIG91dFB0ciwgaW50IG91dFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgIHJkcjo6VTgqIGlwID0gKHJkcjo6VTgqKWluUHRyOworICByZHI6OlU4KiBvcCA9IChyZHI6OlU4KilvdXRQdHI7CisgIGludCBpblN0cmlkZUJ5dGVzID0gaW5TdHJpZGUgKiAoaW5QRi5icHAvOCk7CisgIGludCBvdXRTdHJpZGVCeXRlcyA9IG91dFN0cmlkZSAqIChvdXRQRi5icHAvOCk7CisgIGludCB3aWR0aEJ5dGVzID0gd2lkdGggKiAob3V0UEYuYnBwLzgpOworCisgIHdoaWxlIChoZWlnaHQgPiAwKSB7CisgICAgbWVtY3B5KG9wLCBpcCwgd2lkdGhCeXRlcyk7CisgICAgaXAgKz0gaW5TdHJpZGVCeXRlczsKKyAgICBvcCArPSBvdXRTdHJpZGVCeXRlczsKKyAgICBoZWlnaHQtLTsKKyAgfQorfQorCisjZGVmaW5lIEJQUE9VVCA4CisjaW5jbHVkZSAidHJhbnNJbml0VGVtcGwuaCIKKyNkZWZpbmUgQlBQSU4gOAorI2luY2x1ZGUgInRyYW5zVGVtcGwuaCIKKyN1bmRlZiBCUFBJTgorI2RlZmluZSBCUFBJTiAxNgorI2luY2x1ZGUgInRyYW5zVGVtcGwuaCIKKyN1bmRlZiBCUFBJTgorI2RlZmluZSBCUFBJTiAzMgorI2luY2x1ZGUgInRyYW5zVGVtcGwuaCIKKyN1bmRlZiBCUFBJTgorI3VuZGVmIEJQUE9VVAorCisjZGVmaW5lIEJQUE9VVCAxNgorI2luY2x1ZGUgInRyYW5zSW5pdFRlbXBsLmgiCisjZGVmaW5lIEJQUElOIDgKKyNpbmNsdWRlICJ0cmFuc1RlbXBsLmgiCisjdW5kZWYgQlBQSU4KKyNkZWZpbmUgQlBQSU4gMTYKKyNpbmNsdWRlICJ0cmFuc1RlbXBsLmgiCisjdW5kZWYgQlBQSU4KKyNkZWZpbmUgQlBQSU4gMzIKKyNpbmNsdWRlICJ0cmFuc1RlbXBsLmgiCisjdW5kZWYgQlBQSU4KKyN1bmRlZiBCUFBPVVQKKworI2RlZmluZSBCUFBPVVQgMzIKKyNpbmNsdWRlICJ0cmFuc0luaXRUZW1wbC5oIgorI2RlZmluZSBCUFBJTiA4CisjaW5jbHVkZSAidHJhbnNUZW1wbC5oIgorI3VuZGVmIEJQUElOCisjZGVmaW5lIEJQUElOIDE2CisjaW5jbHVkZSAidHJhbnNUZW1wbC5oIgorI3VuZGVmIEJQUElOCisjZGVmaW5lIEJQUElOIDMyCisjaW5jbHVkZSAidHJhbnNUZW1wbC5oIgorI3VuZGVmIEJQUElOCisjdW5kZWYgQlBQT1VUCisKKworLy8gVHJhbnNsYXRpb24gZnVuY3Rpb25zLiAgTm90ZSB0aGF0IHRyYW5zU2ltcGxlKiBpcyBvbmx5IHVzZWQgZm9yIDgvMTZicHAgYW5kCisvLyB0cmFuc1JHQiogaXMgdXNlZCBmb3IgMTYvMzJicHAKKworc3RhdGljIHRyYW5zRm5UeXBlIHRyYW5zU2ltcGxlRm5zW11bM10gPSB7CisgIHsgdHJhbnNTaW1wbGU4dG84LCAgdHJhbnNTaW1wbGU4dG8xNiwgIHRyYW5zU2ltcGxlOHRvMzIgfSwKKyAgeyB0cmFuc1NpbXBsZTE2dG84LCB0cmFuc1NpbXBsZTE2dG8xNiwgdHJhbnNTaW1wbGUxNnRvMzIgfSwKK307CitzdGF0aWMgdHJhbnNGblR5cGUgdHJhbnNSR0JGbnNbXVszXSA9IHsKKyAgeyB0cmFuc1JHQjE2dG84LCB0cmFuc1JHQjE2dG8xNiwgdHJhbnNSR0IxNnRvMzIgfSwKKyAgeyB0cmFuc1JHQjMydG84LCB0cmFuc1JHQjMydG8xNiwgdHJhbnNSR0IzMnRvMzIgfQorfTsKK3N0YXRpYyB0cmFuc0ZuVHlwZSB0cmFuc1JHQkN1YmVGbnNbXVszXSA9IHsKKyAgeyB0cmFuc1JHQkN1YmUxNnRvOCwgdHJhbnNSR0JDdWJlMTZ0bzE2LCB0cmFuc1JHQkN1YmUxNnRvMzIgfSwKKyAgeyB0cmFuc1JHQkN1YmUzMnRvOCwgdHJhbnNSR0JDdWJlMzJ0bzE2LCB0cmFuc1JHQkN1YmUzMnRvMzIgfQorfTsKKworLy8gVGFibGUgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zLgorCit0eXBlZGVmIHZvaWQgKCppbml0Q010b1RDRm5UeXBlKShyZHI6OlU4KiogdGFibGVwLCBjb25zdCBQaXhlbEZvcm1hdCYgaW5QRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ck1hcCogY20sIGNvbnN0IFBpeGVsRm9ybWF0JiBvdXRQRik7Cit0eXBlZGVmIHZvaWQgKCppbml0VEN0b1RDRm5UeXBlKShyZHI6OlU4KiogdGFibGVwLCBjb25zdCBQaXhlbEZvcm1hdCYgaW5QRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpeGVsRm9ybWF0JiBvdXRQRik7Cit0eXBlZGVmIHZvaWQgKCppbml0Q010b0N1YmVGblR5cGUpKHJkcjo6VTgqKiB0YWJsZXAsIGNvbnN0IFBpeGVsRm9ybWF0JiBpblBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXJNYXAqIGNtLCBDb2xvdXJDdWJlKiBjdWJlKTsKK3R5cGVkZWYgdm9pZCAoKmluaXRUQ3RvQ3ViZUZuVHlwZSkocmRyOjpVOCoqIHRhYmxlcCwgY29uc3QgUGl4ZWxGb3JtYXQmIGluUEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ckN1YmUqIGN1YmUpOworCisKK3N0YXRpYyBpbml0Q010b1RDRm5UeXBlIGluaXRTaW1wbGVDTXRvVENGbnNbXSA9IHsKKyAgICBpbml0U2ltcGxlQ010b1RDOCwgaW5pdFNpbXBsZUNNdG9UQzE2LCBpbml0U2ltcGxlQ010b1RDMzIKK307CisKK3N0YXRpYyBpbml0VEN0b1RDRm5UeXBlIGluaXRTaW1wbGVUQ3RvVENGbnNbXSA9IHsKKyAgICBpbml0U2ltcGxlVEN0b1RDOCwgaW5pdFNpbXBsZVRDdG9UQzE2LCBpbml0U2ltcGxlVEN0b1RDMzIKK307CisKK3N0YXRpYyBpbml0Q010b0N1YmVGblR5cGUgaW5pdFNpbXBsZUNNdG9DdWJlRm5zW10gPSB7CisgICAgaW5pdFNpbXBsZUNNdG9DdWJlOCwgaW5pdFNpbXBsZUNNdG9DdWJlMTYsIGluaXRTaW1wbGVDTXRvQ3ViZTMyCit9OworCitzdGF0aWMgaW5pdFRDdG9DdWJlRm5UeXBlIGluaXRTaW1wbGVUQ3RvQ3ViZUZuc1tdID0geworICAgIGluaXRTaW1wbGVUQ3RvQ3ViZTgsIGluaXRTaW1wbGVUQ3RvQ3ViZTE2LCBpbml0U2ltcGxlVEN0b0N1YmUzMgorfTsKKworc3RhdGljIGluaXRUQ3RvVENGblR5cGUgaW5pdFJHQlRDdG9UQ0Zuc1tdID0geworICAgIGluaXRSR0JUQ3RvVEM4LCBpbml0UkdCVEN0b1RDMTYsIGluaXRSR0JUQ3RvVEMzMgorfTsKKworc3RhdGljIGluaXRUQ3RvQ3ViZUZuVHlwZSBpbml0UkdCVEN0b0N1YmVGbnNbXSA9IHsKKyAgICBpbml0UkdCVEN0b0N1YmU4LCBpbml0UkdCVEN0b0N1YmUxNiwgaW5pdFJHQlRDdG9DdWJlMzIKK307CisKKworVHJhbnNJbWFnZUdldHRlcjo6VHJhbnNJbWFnZUdldHRlcihib29sIGVjb24pCisgIDogZWNvbm9taWMoZWNvbiksIHBiKDApLCB0YWJsZSgwKSwgdHJhbnNGbigwKSwgY3ViZSgwKQoreworfQorCitUcmFuc0ltYWdlR2V0dGVyOjp+VHJhbnNJbWFnZUdldHRlcigpCit7CisgIGRlbGV0ZSBbXSB0YWJsZTsKK30KKwordm9pZCBUcmFuc0ltYWdlR2V0dGVyOjppbml0KFBpeGVsQnVmZmVyKiBwYl8sIGNvbnN0IFBpeGVsRm9ybWF0JiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01zZ1dyaXRlciogd3JpdGVyLCBDb2xvdXJDdWJlKiBjdWJlXykKK3sKKyAgcGIgPSBwYl87CisgIG91dFBGID0gb3V0OworICB0cmFuc0ZuID0gMDsKKyAgY3ViZSA9IGN1YmVfOworICBjb25zdCBQaXhlbEZvcm1hdCYgaW5QRiA9IHBiLT5nZXRQRigpOworCisgIGlmICgoaW5QRi5icHAgIT0gOCkgJiYgKGluUEYuYnBwICE9IDE2KSAmJiAoaW5QRi5icHAgIT0gMzIpKQorICAgIHRocm93IEV4Y2VwdGlvbigiVHJhbnNJbWFnZUdldHRlcjogYnBwIGluIG5vdCA4LCAxNiBvciAzMiIpOworCisgIGlmICgob3V0UEYuYnBwICE9IDgpICYmIChvdXRQRi5icHAgIT0gMTYpICYmIChvdXRQRi5icHAgIT0gMzIpKQorICAgIHRocm93IEV4Y2VwdGlvbigiVHJhbnNJbWFnZUdldHRlcjogYnBwIG91dCBub3QgOCwgMTYgb3IgMzIiKTsKKworICBpZiAoIW91dFBGLnRydWVDb2xvdXIpIHsKKyAgICBpZiAob3V0UEYuYnBwICE9IDgpCisgICAgICB0aHJvdyBFeGNlcHRpb24oIlRyYW5zSW1hZ2VHZXR0ZXI6IG91dFBGIGhhcyBjb2xvciBtYXAgYnV0IG5vdCA4YnBwIik7CisKKyAgICBpZiAoIWluUEYudHJ1ZUNvbG91cikgeworICAgICAgaWYgKGluUEYuYnBwICE9IDgpCisgICAgICAgIHRocm93IEV4Y2VwdGlvbigiVHJhbnNJbWFnZUdldHRlcjogaW5QRiBoYXMgY29sb3JNYXAgYnV0IG5vdCA4YnBwIik7CisKKyAgICAgIC8vIENNIHRvIENNL0N1YmUKKworICAgICAgaWYgKGN1YmUpIHsKKyAgICAgICAgdHJhbnNGbiA9IHRyYW5zU2ltcGxlRm5zW2luUEYuYnBwLzE2XVtvdXRQRi5icHAvMTZdOworICAgICAgICAoKmluaXRTaW1wbGVDTXRvQ3ViZUZuc1tvdXRQRi5icHAvMTZdKSAoJnRhYmxlLCBpblBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGItPmdldENvbG91ck1hcCgpLCBjdWJlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zRm4gPSBub1RyYW5zRm47CisgICAgICAgIHNldENvbG91ck1hcEVudHJpZXMoMCwgMjU2LCB3cml0ZXIpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRDIHRvIENNL0N1YmUKKworICAgIENvbG91ckN1YmUgZGVmYXVsdEN1YmUoNiw2LDYpOworICAgIGlmICghY3ViZSkgY3ViZSA9ICZkZWZhdWx0Q3ViZTsKKworICAgIGlmICgoaW5QRi5icHAgPiAxNikgfHwgKGVjb25vbWljICYmIChpblBGLmJwcCA9PSAxNikpKSB7CisgICAgICB0cmFuc0ZuID0gdHJhbnNSR0JDdWJlRm5zW2luUEYuYnBwLzMyXVtvdXRQRi5icHAvMTZdOworICAgICAgKCppbml0UkdCVEN0b0N1YmVGbnNbb3V0UEYuYnBwLzE2XSkgKCZ0YWJsZSwgaW5QRiwgY3ViZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRyYW5zRm4gPSB0cmFuc1NpbXBsZUZuc1tpblBGLmJwcC8xNl1bb3V0UEYuYnBwLzE2XTsKKyAgICAgICgqaW5pdFNpbXBsZVRDdG9DdWJlRm5zW291dFBGLmJwcC8xNl0pICgmdGFibGUsIGluUEYsIGN1YmUpOworICAgIH0KKworICAgIGlmIChjdWJlICE9ICZkZWZhdWx0Q3ViZSkKKyAgICAgIHJldHVybjsKKworICAgIGlmICh3cml0ZXIpIHdyaXRlci0+d3JpdGVTZXRDb2xvdXJNYXBFbnRyaWVzKDAsIDIxNiwgY3ViZSk7CisgICAgY3ViZSA9IDA7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGluUEYuZXF1YWwob3V0UEYpKSB7CisgICAgdHJhbnNGbiA9IG5vVHJhbnNGbjsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIWluUEYudHJ1ZUNvbG91cikgeworCisgICAgLy8gQ00gdG8gVEMKKworICAgIGlmIChpblBGLmJwcCAhPSA4KQorICAgICAgdGhyb3cgRXhjZXB0aW9uKCJUcmFuc0ltYWdlR2V0dGVyOiBpblBGIGhhcyBjb2xvck1hcCBidXQgbm90IDhicHAiKTsKKyAgICB0cmFuc0ZuID0gdHJhbnNTaW1wbGVGbnNbaW5QRi5icHAvMTZdW291dFBGLmJwcC8xNl07CisgICAgKCppbml0U2ltcGxlQ010b1RDRm5zW291dFBGLmJwcC8xNl0pICgmdGFibGUsIGluUEYsIHBiLT5nZXRDb2xvdXJNYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBGKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUQyB0byBUQworCisgIGlmICgoaW5QRi5icHAgPiAxNikgfHwgKGVjb25vbWljICYmIChpblBGLmJwcCA9PSAxNikpKSB7CisgICAgdHJhbnNGbiA9IHRyYW5zUkdCRm5zW2luUEYuYnBwLzMyXVtvdXRQRi5icHAvMTZdOworICAgICgqaW5pdFJHQlRDdG9UQ0Zuc1tvdXRQRi5icHAvMTZdKSAoJnRhYmxlLCBpblBGLCBvdXRQRik7CisgIH0gZWxzZSB7CisgICAgdHJhbnNGbiA9IHRyYW5zU2ltcGxlRm5zW2luUEYuYnBwLzE2XVtvdXRQRi5icHAvMTZdOworICAgICgqaW5pdFNpbXBsZVRDdG9UQ0Zuc1tvdXRQRi5icHAvMTZdKSAoJnRhYmxlLCBpblBGLCBvdXRQRik7CisgIH0KK30KKwordm9pZCBUcmFuc0ltYWdlR2V0dGVyOjpzZXRDb2xvdXJNYXBFbnRyaWVzKGludCBmaXJzdENvbCwgaW50IG5Db2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNc2dXcml0ZXIqIHdyaXRlcikKK3sKKyAgaWYgKG5Db2xzID09IDApCisgICAgbkNvbHMgPSAoMSA8PCBwYi0+Z2V0UEYoKS5kZXB0aCkgLSBmaXJzdENvbDsKKyAgaWYgKHBiLT5nZXRQRigpLnRydWVDb2xvdXIpIHJldHVybjsgLy8gc2hvdWxkbid0IGJlIGNhbGxlZCBpbiB0aGlzIGNhc2UKKworICBpZiAob3V0UEYudHJ1ZUNvbG91cikgeworICAgICgqaW5pdFNpbXBsZUNNdG9UQ0Zuc1tvdXRQRi5icHAvMTZdKSAoJnRhYmxlLCBwYi0+Z2V0UEYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiLT5nZXRDb2xvdXJNYXAoKSwgb3V0UEYpOworICB9IGVsc2UgaWYgKGN1YmUpIHsKKyAgICAoKmluaXRTaW1wbGVDTXRvQ3ViZUZuc1tvdXRQRi5icHAvMTZdKSAoJnRhYmxlLCBwYi0+Z2V0UEYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGItPmdldENvbG91ck1hcCgpLCBjdWJlKTsKKyAgfSBlbHNlIGlmICh3cml0ZXIgJiYgcGItPmdldENvbG91ck1hcCgpKSB7CisgICAgd3JpdGVyLT53cml0ZVNldENvbG91ck1hcEVudHJpZXMoZmlyc3RDb2wsIG5Db2xzLCBwYi0+Z2V0Q29sb3VyTWFwKCkpOworICB9Cit9CisKK3ZvaWQgVHJhbnNJbWFnZUdldHRlcjo6Z2V0SW1hZ2Uodm9pZCogb3V0UHRyLCBjb25zdCBSZWN0JiByLCBpbnQgb3V0U3RyaWRlKQoreworICBpZiAoIXRyYW5zRm4pCisgICAgdGhyb3cgRXhjZXB0aW9uKCJUcmFuc0ltYWdlR2V0dGVyOiBub3QgaW5pdGlhbGlzZWQgeWV0Iik7CisKKyAgaW50IGluU3RyaWRlOworICBjb25zdCByZHI6OlU4KiBpblB0ciA9IHBiLT5nZXRQaXhlbHNSKHIudHJhbnNsYXRlKG9mZnNldC5uZWdhdGUoKSksICZpblN0cmlkZSk7CisKKyAgaWYgKCFvdXRTdHJpZGUpIG91dFN0cmlkZSA9IHIud2lkdGgoKTsKKworICAoKnRyYW5zRm4pKHRhYmxlLCBwYi0+Z2V0UEYoKSwgKHZvaWQqKWluUHRyLCBpblN0cmlkZSwKKyAgICAgICAgICAgICBvdXRQRiwgb3V0UHRyLCBvdXRTdHJpZGUsIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7Cit9CisKK3ZvaWQgVHJhbnNJbWFnZUdldHRlcjo6dHJhbnNsYXRlUGl4ZWxzKHZvaWQqIGluUHRyLCB2b2lkKiBvdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBpeGVscykgY29uc3QKK3sKKyAgKCp0cmFuc0ZuKSh0YWJsZSwgcGItPmdldFBGKCksIGluUHRyLCBuUGl4ZWxzLAorICAgICAgICAgICAgIG91dFBGLCBvdXRQdHIsIG5QaXhlbHMsIG5QaXhlbHMsIDEpOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9UcmFuc0ltYWdlR2V0dGVyLmggYi9jb21tb24vcmZiL1RyYW5zSW1hZ2VHZXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI4ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9UcmFuc0ltYWdlR2V0dGVyLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBUcmFuc0ltYWdlR2V0dGVyIC0gY2xhc3MgdG8gcGVyZm9ybSB0cmFuc2xhdGlvbiBiZXR3ZWVuIHBpeGVsIGZvcm1hdHMsCisvLyBpbXBsZW1lbnRpbmcgdGhlIEltYWdlR2V0dGVyIGludGVyZmFjZS4KKy8vCisKKyNpZm5kZWYgX19SRkJfVFJBTlNJTUFHRUdFVFRFUl9IX18KKyNkZWZpbmUgX19SRkJfVFJBTlNJTUFHRUdFVFRFUl9IX18KKworI2luY2x1ZGUgPHJmYi9SZWN0Lmg+CisjaW5jbHVkZSA8cmZiL1BpeGVsRm9ybWF0Lmg+CisjaW5jbHVkZSA8cmZiL0ltYWdlR2V0dGVyLmg+CisKK25hbWVzcGFjZSByZmIgeworICB0eXBlZGVmIHZvaWQgKCp0cmFuc0ZuVHlwZSkodm9pZCogdGFibGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4ZWxGb3JtYXQmIGluUEYsIHZvaWQqIGluUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4ZWxGb3JtYXQmIG91dFBGLCB2b2lkKiBvdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0U3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgIGNsYXNzIFNNc2dXcml0ZXI7CisgIGNsYXNzIENvbG91ck1hcDsKKyAgY2xhc3MgUGl4ZWxCdWZmZXI7CisgIGNsYXNzIENvbG91ckN1YmU7CisKKyAgY2xhc3MgVHJhbnNJbWFnZUdldHRlciA6IHB1YmxpYyBJbWFnZUdldHRlciB7CisgIHB1YmxpYzoKKworICAgIFRyYW5zSW1hZ2VHZXR0ZXIoYm9vbCBlY29uPWZhbHNlKTsKKyAgICB2aXJ0dWFsIH5UcmFuc0ltYWdlR2V0dGVyKCk7CisKKyAgICAvLyBpbml0KCkgaXMgY2FsbGVkIHRvIGluaXRpYWxpc2UgdGhlIHRyYW5zbGF0aW9uIHRhYmxlcy4gIFRoZSBQaXhlbEJ1ZmZlcgorICAgIC8vIGFyZ3VtZW50IGdpdmVzIHRoZSBzb3VyY2UgZGF0YSBhbmQgZm9ybWF0IGRldGFpbHMsIG91dFBGIGdpdmVzIHRoZQorICAgIC8vIGNsaWVudCdzIHBpeGVsIGZvcm1hdC4gIElmIHRoZSBjbGllbnQgaGFzIGEgY29sb3VyIG1hcCwgdGhlbiB0aGUgd3JpdGVyCisgICAgLy8gYXJndW1lbnQgaXMgdXNlZCB0byBzZW5kIGEgU2V0Q29sb3VyTWFwRW50cmllcyBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCisKKyAgICB2b2lkIGluaXQoUGl4ZWxCdWZmZXIqIHBiLCBjb25zdCBQaXhlbEZvcm1hdCYgb3V0UEYsIFNNc2dXcml0ZXIqIHdyaXRlcj0wLAorICAgICAgICAgICAgICBDb2xvdXJDdWJlKiBjdWJlPTApOworCisgICAgLy8gc2V0Q29sb3VyTWFwRW50cmllcygpIGlzIGNhbGxlZCB3aGVuIHRoZSBQaXhlbEJ1ZmZlciBoYXMgYSBjb2xvdXIgbWFwCisgICAgLy8gd2hpY2ggaGFzIGNoYW5nZWQuICBmaXJzdENvbG91ciBhbmQgbkNvbG91cnMgc3BlY2lmeSB3aGljaCBwYXJ0IG9mIHRoZQorICAgIC8vIGNvbG91ciBtYXAgaGFzIGNoYW5nZWQuICBJZiBuQ29sb3VycyBpcyAwLCB0aGlzIG1lYW5zIHRoZSByZXN0IG9mIHRoZQorICAgIC8vIGNvbG91ciBtYXAuICBUaGUgUGl4ZWxCdWZmZXIgcHJldmlvdXNseSBwYXNzZWQgdG8gaW5pdCgpIG11c3QgaGF2ZSBhCisgICAgLy8gdmFsaWQgQ29sb3VyTWFwIG9iamVjdC4gIElmIHRoZSBjbGllbnQgYWxzbyBoYXMgYSBjb2xvdXIgbWFwLCB0aGVuIHRoZQorICAgIC8vIHdyaXRlciBhcmd1bWVudCBpcyB1c2VkIHRvIHNlbmQgYSBTZXRDb2xvdXJNYXBFbnRyaWVzIG1lc3NhZ2UgdG8gdGhlCisgICAgLy8gY2xpZW50LiAgSWYgdGhlIGNsaWVudCBpcyB0cnVlIGNvbG91ciB0aGVuIGluc3RlYWQgd2UgdXBkYXRlIHRoZQorICAgIC8vIGludGVybmFsIHRyYW5zbGF0aW9uIHRhYmxlIC0gaW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgc2hvdWxkIGFsc28gbWFrZQorICAgIC8vIHN1cmUgdGhhdCB0aGUgY2xpZW50IHJlY2VpdmVzIGFuIHVwZGF0ZSBvZiB0aGUgcmVsZXZhbnQgcGFydHMgb2YgdGhlCisgICAgLy8gZnJhbWVidWZmZXIgKHRoZSBzaW1wbGVzdCB0aGluZyB0byBkbyBpcyBqdXN0IHVwZGF0ZSB0aGUgd2hvbGUKKyAgICAvLyBmcmFtZWJ1ZmZlciwgdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvIGJlIHNtYXJ0ZXIgdGhhbiB0aGlzKS4KKworICAgIHZvaWQgc2V0Q29sb3VyTWFwRW50cmllcyhpbnQgZmlyc3RDb2xvdXIsIGludCBuQ29sb3VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01zZ1dyaXRlciogd3JpdGVyPTApOworCisgICAgLy8gZ2V0SW1hZ2UoKSBnZXRzIHRoZSBnaXZlbiByZWN0YW5nbGUgb2YgZGF0YSBmcm9tIHRoZSBQaXhlbEJ1ZmZlciwKKyAgICAvLyB0cmFuc2xhdGVzIGl0IGludG8gdGhlIGNsaWVudCdzIHBpeGVsIGZvcm1hdCBhbmQgcHV0cyBpdCBpbiB0aGUgYnVmZmVyCisgICAgLy8gcG9pbnRlZCB0byBieSB0aGUgb3V0UHRyIGFyZ3VtZW50LiAgVGhlIG9wdGlvbmFsIG91dFN0cmlkZSBhcmd1bWVudCBjYW4KKyAgICAvLyBiZSB1c2VkIHdoZXJlIHBhZGRpbmcgaXMgcmVxdWlyZWQgYmV0d2VlbiB0aGUgb3V0cHV0IHNjYW5saW5lcyAodGhlCisgICAgLy8gcGFkZGluZyB3aWxsIGJlIG91dFN0cmlkZS1yLndpZHRoKCkgcGl4ZWxzKS4KKyAgICB2b2lkIGdldEltYWdlKHZvaWQqIG91dFB0ciwgY29uc3QgUmVjdCYgciwgaW50IG91dFN0cmlkZT0wKTsKKworICAgIC8vIHRyYW5zbGF0ZVBpeGVscygpIHRyYW5zbGF0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiBwaXhlbHMgZnJvbSBpblB0ciwKKyAgICAvLyBwdXR0aW5nIGl0IGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IG91dFB0ci4gIFRoZSBwaXhlbHMgYXQgaW5QdHIKKyAgICAvLyBzaG91bGQgYmUgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBQaXhlbEJ1ZmZlciwgYW5kIHRoZSB0cmFuc2xhdGVkCisgICAgLy8gcGl4ZWxzIHdpbGwgYmUgaW4gdGhlIGZvcm1hdCBwcmV2aW91c2x5IGdpdmVuIGJ5IHRoZSBvdXRQRiBhcmd1bWVudCB0bworICAgIC8vIGluaXQoKS4gIE5vdGUgdGhhdCB0aGlzIGNhbGwgZG9lcyBub3QgdXNlIHRoZSBQaXhlbEJ1ZmZlcidzIHBpeGVsIGRhdGEuCisgICAgdm9pZCB0cmFuc2xhdGVQaXhlbHModm9pZCogaW5QdHIsIHZvaWQqIG91dFB0ciwgaW50IG5QaXhlbHMpIGNvbnN0OworCisgICAgLy8gc2V0UGl4ZWxCdWZmZXIoKSBjaGFuZ2VzIHRoZSBwaXhlbCBidWZmZXIgdG8gYmUgdXNlZC4gIFRoZSBuZXcgcGl4ZWwKKyAgICAvLyBidWZmZXIgTVVTVCBoYXZlIHRoZSBzYW1lIHBpeGVsIGZvcm1hdCBhcyB0aGUgb2xkIG9uZSAtIGlmIG5vdCB5b3UKKyAgICAvLyBzaG91bGQgY2FsbCBpbml0KCkgaW5zdGVhZC4KKyAgICB2b2lkIHNldFBpeGVsQnVmZmVyKFBpeGVsQnVmZmVyKiBwYl8pIHsgcGIgPSBwYl87IH0KKworICAgIC8vIHNldE9mZnNldCgpIHNldHMgYW4gb2Zmc2V0IHdoaWNoIGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgY29vcmRpbmF0ZXMgb2YKKyAgICAvLyB0aGUgcmVjdGFuZ2xlIGdpdmVuIHRvIGdldEltYWdlKCkuCisgICAgdm9pZCBzZXRPZmZzZXQoY29uc3QgUG9pbnQmIG9mZnNldF8pIHsgb2Zmc2V0ID0gb2Zmc2V0XzsgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBlY29ub21pYzsKKyAgICBQaXhlbEJ1ZmZlciogcGI7CisgICAgUGl4ZWxGb3JtYXQgb3V0UEY7CisgICAgcmRyOjpVOCogdGFibGU7CisgICAgdHJhbnNGblR5cGUgdHJhbnNGbjsKKyAgICBDb2xvdXJDdWJlKiBjdWJlOworICAgIFBvaW50IG9mZnNldDsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9UcmFuc2ZlclF1ZXVlLmN4eCBiL2NvbW1vbi9yZmIvVHJhbnNmZXJRdWV1ZS5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4MDc1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvVHJhbnNmZXJRdWV1ZS5jeHgKQEAgLTAsMCArMSwzMTEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIFRyYW5zZmVyUXVldWUuCisKKyNpbmNsdWRlIDxyZmIvVHJhbnNmZXJRdWV1ZS5oPgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitUcmFuc2ZlclF1ZXVlOjpUcmFuc2ZlclF1ZXVlKCkKK3sKKwkgbV9udW1FbnRyaWVzID0gMDsKKyAgICAgbV9wRW50cmllcyA9IE5VTEw7Cit9CisKK1RyYW5zZmVyUXVldWU6On5UcmFuc2ZlclF1ZXVlKCkKK3sKKyAgZnJlZSgpOworfQorCit2b2lkCitUcmFuc2ZlclF1ZXVlOjphZGQoVHJhbnNmZXJRdWV1ZSAqcFRRKQoreworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBUUS0+Z2V0TnVtRW50cmllcygpOyBpKyspIHsKKyAgICBhZGQocFRRLT5nZXRMb2NQYXRoQXQoaSksIHBUUS0+Z2V0UmVtUGF0aEF0KGkpLAlwVFEtPmdldExvY05hbWVBdChpKSwgCisgICAgICBwVFEtPmdldFJlbU5hbWVBdChpKSwgcFRRLT5nZXRTaXplQXQoaSksIHBUUS0+Z2V0RGF0YUF0KGkpLCBwVFEtPmdldEZsYWdzQXQoaSkpOworICB9Cit9CisKK3ZvaWQKK1RyYW5zZmVyUXVldWU6OmFkZChjaGFyICpwTG9jUGF0aCwgY2hhciAqcFJlbVBhdGgsIEZpbGVJbmZvICpwRkksIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgY2hhciBsb2NQYXRoW0ZUX0ZJTEVOQU1FX1NJWkVdOworICBjaGFyIHJlbVBhdGhbRlRfRklMRU5BTUVfU0laRV07CisgIHN0cmNweShsb2NQYXRoLCBwTG9jUGF0aCk7CisgIHN0cmNweShyZW1QYXRoLCBwUmVtUGF0aCk7CisgIAorICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBGSS0+Z2V0TnVtRW50cmllcygpOyBpKyspIHsKKyAgICBhZGQobG9jUGF0aCwgcmVtUGF0aCwgcEZJLT5nZXROYW1lQXQoaSksIHBGSS0+Z2V0TmFtZUF0KGkpLCAKKyAgICAgIHBGSS0+Z2V0U2l6ZUF0KGkpLCBwRkktPmdldERhdGFBdChpKSwgKHBGSS0+Z2V0RmxhZ3NBdChpKSB8IGZsYWdzKSk7CisgIH0KK30KKwordm9pZCAKK1RyYW5zZmVyUXVldWU6OmFkZChjaGFyICpwTG9jUGF0aCwgY2hhciAqcFJlbVBhdGgsIGNoYXIgKnBMb2NOYW1lLCBjaGFyICpwUmVtTmFtZSwgCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgIEZJTEVJTkZPRVggKnBUZW1wb3JhcnkgPSBuZXcgRklMRUlORk9FWFttX251bUVudHJpZXMgKyAxXTsKKyAgaWYgKG1fbnVtRW50cmllcyAhPSAwKSAKKyAgICBtZW1jcHkocFRlbXBvcmFyeSwgbV9wRW50cmllcywgbV9udW1FbnRyaWVzICogc2l6ZW9mKEZJTEVJTkZPRVgpKTsKKyAgCisgIHN0cmNweShwVGVtcG9yYXJ5W21fbnVtRW50cmllc10ubG9jUGF0aCwgcExvY1BhdGgpOworICBzdHJjcHkocFRlbXBvcmFyeVttX251bUVudHJpZXNdLmxvY05hbWUsIHBMb2NOYW1lKTsKKyAgc3RyY3B5KHBUZW1wb3JhcnlbbV9udW1FbnRyaWVzXS5yZW1QYXRoLCBwUmVtUGF0aCk7CisgIHN0cmNweShwVGVtcG9yYXJ5W21fbnVtRW50cmllc10ucmVtTmFtZSwgcFJlbU5hbWUpOworICAKKyAgcFRlbXBvcmFyeVttX251bUVudHJpZXNdLmluZm8uc2l6ZSA9IHNpemU7CisgIHBUZW1wb3JhcnlbbV9udW1FbnRyaWVzXS5pbmZvLmRhdGEgPSBkYXRhOworICBwVGVtcG9yYXJ5W21fbnVtRW50cmllc10uaW5mby5mbGFncyA9IGZsYWdzOworICAKKyAgaWYgKG1fcEVudHJpZXMgIT0gTlVMTCkgeworICAgIGRlbGV0ZSBbXSBtX3BFbnRyaWVzOworICAgIG1fcEVudHJpZXMgPSBOVUxMOworICB9CisgIAorICBtX3BFbnRyaWVzID0gcFRlbXBvcmFyeTsKKyAgcFRlbXBvcmFyeSA9IE5VTEw7CisgIG1fbnVtRW50cmllcysrOworfQorCitjaGFyICoKK1RyYW5zZmVyUXVldWU6OmdldExvY1BhdGhBdCh1bnNpZ25lZCBpbnQgbnVtYmVyKQoreworICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgbV9udW1FbnRyaWVzKSkgeworICAgIHJldHVybiBtX3BFbnRyaWVzW251bWJlcl0ubG9jUGF0aDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitUcmFuc2ZlclF1ZXVlOjpnZXRMb2NOYW1lQXQodW5zaWduZWQgaW50IG51bWJlcikKK3sKKyAgaWYgKChudW1iZXIgPj0gMCkgJiYgKG51bWJlciA8IG1fbnVtRW50cmllcykpIHsKKyAgICByZXR1cm4gbV9wRW50cmllc1tudW1iZXJdLmxvY05hbWU7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKgorVHJhbnNmZXJRdWV1ZTo6Z2V0UmVtUGF0aEF0KHVuc2lnbmVkIGludCBudW1iZXIpCit7CisgIGlmICgobnVtYmVyID49IDApICYmIChudW1iZXIgPCBtX251bUVudHJpZXMpKSB7CisgICAgcmV0dXJuIG1fcEVudHJpZXNbbnVtYmVyXS5yZW1QYXRoOworICB9CisgIHJldHVybiBOVUxMOworfQorCitjaGFyICoKK1RyYW5zZmVyUXVldWU6OmdldFJlbU5hbWVBdCh1bnNpZ25lZCBpbnQgbnVtYmVyKQoreworICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgbV9udW1FbnRyaWVzKSkgeworICAgIHJldHVybiBtX3BFbnRyaWVzW251bWJlcl0ucmVtTmFtZTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitUcmFuc2ZlclF1ZXVlOjpnZXRGdWxsTG9jUGF0aEF0KHVuc2lnbmVkIGludCBudW1iZXIpCit7CisgIGlmICgobnVtYmVyID49IDApICYmIChudW1iZXIgPCBtX251bUVudHJpZXMpKSB7CisgICAgc3ByaW50ZihtX3N6RnVsbExvY1BhdGgsICIlc1xcJXMiLCBnZXRMb2NQYXRoQXQobnVtYmVyKSwgZ2V0TG9jTmFtZUF0KG51bWJlcikpOworICAgIHJldHVybiBtX3N6RnVsbExvY1BhdGg7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKgorVHJhbnNmZXJRdWV1ZTo6Z2V0RnVsbFJlbVBhdGhBdCh1bnNpZ25lZCBpbnQgbnVtYmVyKQoreworICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgbV9udW1FbnRyaWVzKSkgeworICAgIHNwcmludGYobV9zekZ1bGxSZW1QYXRoLCAiJXNcXCVzIiwgZ2V0UmVtUGF0aEF0KG51bWJlciksIGdldFJlbU5hbWVBdChudW1iZXIpKTsKKyAgICByZXR1cm4gbV9zekZ1bGxSZW1QYXRoOworICB9CisgIHJldHVybiBOVUxMOworfQorCitTSVpFREFUQUZMQUdTSU5GTyAqIAorVHJhbnNmZXJRdWV1ZTo6Z2V0U2l6ZURhdGFGbGFnc0F0KHVuc2lnbmVkIGludCBudW1iZXIpCit7CisgIGlmICgobnVtYmVyID49IDApICYmIChudW1iZXIgPCBtX251bUVudHJpZXMpKSB7CisgICAgcmV0dXJuICZtX3BFbnRyaWVzW251bWJlcl0uaW5mbzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworYm9vbCAKK1RyYW5zZmVyUXVldWU6OnNldExvY1BhdGhBdCh1bnNpZ25lZCBpbnQgbnVtYmVyLCBjaGFyICpwTmFtZSkKK3sKKyAgaWYgKChudW1iZXIgPj0gMCkgJiYgKG51bWJlciA8IG1fbnVtRW50cmllcykpIHsKKyAgICBzdHJjcHkobV9wRW50cmllc1tudW1iZXJdLmxvY1BhdGgsIHBOYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgCitUcmFuc2ZlclF1ZXVlOjpzZXRMb2NOYW1lQXQodW5zaWduZWQgaW50IG51bWJlciwgY2hhciAqcE5hbWUpCit7CisgIGlmICgobnVtYmVyID49IDApICYmIChudW1iZXIgPCBtX251bUVudHJpZXMpKSB7CisgICAgc3RyY3B5KG1fcEVudHJpZXNbbnVtYmVyXS5sb2NOYW1lLCBwTmFtZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIAorVHJhbnNmZXJRdWV1ZTo6c2V0UmVtUGF0aEF0KHVuc2lnbmVkIGludCBudW1iZXIsIGNoYXIgKnBOYW1lKQoreworICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgbV9udW1FbnRyaWVzKSkgeworICAgIHN0cmNweShtX3BFbnRyaWVzW251bWJlcl0ucmVtUGF0aCwgcE5hbWUpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCAKK1RyYW5zZmVyUXVldWU6OnNldFJlbU5hbWVBdCh1bnNpZ25lZCBpbnQgbnVtYmVyLCBjaGFyICpwTmFtZSkKK3sKKyAgaWYgKChudW1iZXIgPj0gMCkgJiYgKG51bWJlciA8IG1fbnVtRW50cmllcykpIHsKKyAgICBzdHJjcHkobV9wRW50cmllc1tudW1iZXJdLnJlbU5hbWUsIHBOYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3Vuc2lnbmVkIGludAorVHJhbnNmZXJRdWV1ZTo6Z2V0U2l6ZUF0KHVuc2lnbmVkIGludCBudW1iZXIpCit7CisgIGlmICgobnVtYmVyID49IDApICYmIChudW1iZXIgPCBtX251bUVudHJpZXMpKSB7CisgICAgcmV0dXJuIG1fcEVudHJpZXNbbnVtYmVyXS5pbmZvLnNpemU7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludAorVHJhbnNmZXJRdWV1ZTo6Z2V0RGF0YUF0KHVuc2lnbmVkIGludCBudW1iZXIpCit7CisgIGlmICgobnVtYmVyID49IDApICYmIChudW1iZXIgPCBtX251bUVudHJpZXMpKSB7CisgICAgcmV0dXJuIG1fcEVudHJpZXNbbnVtYmVyXS5pbmZvLmRhdGE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludCAKK1RyYW5zZmVyUXVldWU6OmdldEZsYWdzQXQodW5zaWduZWQgaW50IG51bWJlcikKK3sKKyAgaWYgKChudW1iZXIgPj0gMCkgJiYgKG51bWJlciA8IG1fbnVtRW50cmllcykpIHsKKyAgICByZXR1cm4gbV9wRW50cmllc1tudW1iZXJdLmluZm8uZmxhZ3M7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgCitUcmFuc2ZlclF1ZXVlOjpzZXRTaXplQXQodW5zaWduZWQgaW50IG51bWJlciwgdW5zaWduZWQgaW50IHZhbHVlKQoreworICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgbV9udW1FbnRyaWVzKSkgeworICAgIG1fcEVudHJpZXNbbnVtYmVyXS5pbmZvLnNpemUgPSB2YWx1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgCitUcmFuc2ZlclF1ZXVlOjpzZXREYXRhQXQodW5zaWduZWQgaW50IG51bWJlciwgdW5zaWduZWQgaW50IHZhbHVlKQoreworICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgbV9udW1FbnRyaWVzKSkgeworICAgIG1fcEVudHJpZXNbbnVtYmVyXS5pbmZvLmRhdGEgPSB2YWx1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgCitUcmFuc2ZlclF1ZXVlOjpzZXRGbGFnc0F0KHVuc2lnbmVkIGludCBudW1iZXIsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKyAgaWYgKChudW1iZXIgPj0gMCkgJiYgKG51bWJlciA8IG1fbnVtRW50cmllcykpIHsKKyAgICBtX3BFbnRyaWVzW251bWJlcl0uaW5mby5mbGFncyA9IG1fcEVudHJpZXNbbnVtYmVyXS5pbmZvLmZsYWdzIHwgdmFsdWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIAorVHJhbnNmZXJRdWV1ZTo6Y2xlYXJGbGFnQXQodW5zaWduZWQgaW50IG51bWJlciwgdW5zaWduZWQgaW50IHZhbHVlKQoreworICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgbV9udW1FbnRyaWVzKSkgeworICAgIG1fcEVudHJpZXNbbnVtYmVyXS5pbmZvLmZsYWdzID0gKG1fcEVudHJpZXNbbnVtYmVyXS5pbmZvLmZsYWdzICYgKHZhbHVlIF4gMHhGRkZGRkZGRikpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCAKK1RyYW5zZmVyUXVldWU6OnNldEZsYWdUb0FsbCh1bnNpZ25lZCBpbnQgZmxhZykKK3sKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBtX251bUVudHJpZXM7IGkrKykgeworICAgIHNldEZsYWdzQXQoaSwgZmxhZyk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgCitUcmFuc2ZlclF1ZXVlOjpkZWxldGVBdCh1bnNpZ25lZCBpbnQgbnVtYmVyKQoreworICBpZiAoKG51bWJlciA+PSBtX251bUVudHJpZXMpIHx8IChudW1iZXIgPCAwKSkgcmV0dXJuIGZhbHNlOworICAKKyAgRklMRUlORk9FWCAqcFRlbXBvcmFyeSA9IG5ldyBGSUxFSU5GT0VYW21fbnVtRW50cmllcyAtIDFdOworICAKKyAgaWYgKG51bWJlciA9PSAwKSB7CisgICAgbWVtY3B5KHBUZW1wb3JhcnksICZtX3BFbnRyaWVzWzFdLCAobV9udW1FbnRyaWVzIC0gMSkgKiBzaXplb2YoRklMRUlORk9FWCkpOworICB9IGVsc2UgeworICAgIG1lbWNweShwVGVtcG9yYXJ5LCBtX3BFbnRyaWVzLCBudW1iZXIgKiBzaXplb2YoRklMRUlORk9FWCkpOworICAgIGlmIChudW1iZXIgIT0gKG1fbnVtRW50cmllcyAtIDEpKSAKKyAgICAgIG1lbWNweSgmcFRlbXBvcmFyeVtudW1iZXJdLCAmbV9wRW50cmllc1tudW1iZXIgKyAxXSwgKG1fbnVtRW50cmllcyAtIG51bWJlciAtIDEpICogc2l6ZW9mKEZJTEVJTkZPRVgpKTsKKyAgfQorICAKKyAgaWYgKG1fcEVudHJpZXMgIT0gTlVMTCkgeworICAgIGRlbGV0ZSBbXSBtX3BFbnRyaWVzOworICAgIG1fcEVudHJpZXMgPSBOVUxMOworICB9CisgIG1fcEVudHJpZXMgPSBwVGVtcG9yYXJ5OworICBwVGVtcG9yYXJ5ID0gTlVMTDsKKyAgbV9udW1FbnRyaWVzLS07CisgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBpbnQgCitUcmFuc2ZlclF1ZXVlOjpnZXROdW1FbnRyaWVzKCkKK3sKKyAgcmV0dXJuIG1fbnVtRW50cmllczsKK30KKwordm9pZCAKK1RyYW5zZmVyUXVldWU6OmZyZWUoKQoreworICBpZiAobV9wRW50cmllcyAhPSBOVUxMKSB7CisgICAgZGVsZXRlIFtdIG1fcEVudHJpZXM7CisgICAgbV9wRW50cmllcyA9IE5VTEw7CisgIH0KKyAgbV9udW1FbnRyaWVzID0gMDsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvVHJhbnNmZXJRdWV1ZS5oIGIvY29tbW9uL3JmYi9UcmFuc2ZlclF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3NDhlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvVHJhbnNmZXJRdWV1ZS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBUaWdodFZOQyBUZWFtLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYnkgRGVubmlzIFN5cm92YXRza3kuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbiBob21lcGFnZSBvbiB0aGUgV2ViOiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS8KKyAqCisgKi8KKworLy8gLT0tIFRyYW5zZmVyUXVldWUuCisKKyNpZm5kZWYgX19SRkJfVFJBTlNGRVJRVUVVRV9IX18KKyNkZWZpbmUgX19SRkJfVFJBTlNGRVJRVUVVRV9IX18KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8cmZiL0ZpbGVJbmZvLmg+CisjaW5jbHVkZSA8cmZiL2Z0dHlwZXMuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIFRyYW5zZmVyUXVldWUgIAorICB7CisgIHB1YmxpYzoKKyAgICBUcmFuc2ZlclF1ZXVlKCk7CisgICAgflRyYW5zZmVyUXVldWUoKTsKKworICAgIHZvaWQgYWRkKFRyYW5zZmVyUXVldWUgKnBUUSk7CisgICAgdm9pZCBhZGQoY2hhciAqcExvY1BhdGgsIGNoYXIqcFJlbVBhdGgsIEZpbGVJbmZvICpwRkksIHVuc2lnbmVkIGludCBmbGFncyk7CisgICAgdm9pZCBhZGQoY2hhciAqcExvY1BhdGgsIGNoYXIgKnBSZW1QYXRoLCBjaGFyICpwTG9jTmFtZSwgY2hhciAqcFJlbU5hbWUsCisgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IGRhdGEsIHVuc2lnbmVkIGludCBmbGFncyk7CisgICAgCisgICAgY2hhciAqZ2V0TG9jUGF0aEF0KHVuc2lnbmVkIGludCBudW1iZXIpOworICAgIGNoYXIgKmdldExvY05hbWVBdCh1bnNpZ25lZCBpbnQgbnVtYmVyKTsKKyAgICBjaGFyICpnZXRSZW1QYXRoQXQodW5zaWduZWQgaW50IG51bWJlcik7CisgICAgY2hhciAqZ2V0UmVtTmFtZUF0KHVuc2lnbmVkIGludCBudW1iZXIpOworICAgIAorICAgIGNoYXIgKmdldEZ1bGxMb2NQYXRoQXQodW5zaWduZWQgaW50IG51bWJlcik7CisgICAgY2hhciAqZ2V0RnVsbFJlbVBhdGhBdCh1bnNpZ25lZCBpbnQgbnVtYmVyKTsKKyAgICAKKyAgICBib29sIHNldExvY1BhdGhBdCh1bnNpZ25lZCBpbnQgbnVtYmVyLCBjaGFyICpwTmFtZSk7CisgICAgYm9vbCBzZXRMb2NOYW1lQXQodW5zaWduZWQgaW50IG51bWJlciwgY2hhciAqcE5hbWUpOworICAgIGJvb2wgc2V0UmVtUGF0aEF0KHVuc2lnbmVkIGludCBudW1iZXIsIGNoYXIgKnBOYW1lKTsKKyAgICBib29sIHNldFJlbU5hbWVBdCh1bnNpZ25lZCBpbnQgbnVtYmVyLCBjaGFyICpwTmFtZSk7CisgICAgCisgICAgdW5zaWduZWQgaW50IGdldFNpemVBdCh1bnNpZ25lZCBpbnQgbnVtYmVyKTsKKyAgICB1bnNpZ25lZCBpbnQgZ2V0RGF0YUF0KHVuc2lnbmVkIGludCBudW1iZXIpOworICAgIHVuc2lnbmVkIGludCBnZXRGbGFnc0F0KHVuc2lnbmVkIGludCBudW1iZXIpOworICAgIAorICAgIFNJWkVEQVRBRkxBR1NJTkZPICogZ2V0U2l6ZURhdGFGbGFnc0F0KHVuc2lnbmVkIGludCBudW1iZXIpOworICAgIAorICAgIAorICAgIGJvb2wgc2V0U2l6ZUF0KHVuc2lnbmVkIGludCBudW1iZXIsIHVuc2lnbmVkIGludCB2YWx1ZSk7CisgICAgYm9vbCBzZXREYXRhQXQodW5zaWduZWQgaW50IG51bWJlciwgdW5zaWduZWQgaW50IHZhbHVlKTsKKyAgICBib29sIHNldEZsYWdzQXQodW5zaWduZWQgaW50IG51bWJlciwgdW5zaWduZWQgaW50IHZhbHVlKTsKKyAgICBib29sIGNsZWFyRmxhZ0F0KHVuc2lnbmVkIGludCBudW1iZXIsIHVuc2lnbmVkIGludCB2YWx1ZSk7CisgICAgYm9vbCBzZXRGbGFnVG9BbGwodW5zaWduZWQgaW50IGZsYWcpOworICAgIAorICAgIGJvb2wgZGVsZXRlQXQodW5zaWduZWQgaW50IG51bWJlcik7CisgICAgCisgICAgdW5zaWduZWQgaW50IGdldE51bUVudHJpZXMoKTsKKyAgICAKKyAgICB2b2lkIGZyZWUoKTsKKyAgICAKKyAgcHJpdmF0ZToKKyAgICBGSUxFSU5GT0VYICptX3BFbnRyaWVzOworICAgIHVuc2lnbmVkIGludCBtX251bUVudHJpZXM7CisgICAgCisgICAgY2hhciBtX3N6RnVsbExvY1BhdGhbRlRfRklMRU5BTUVfU0laRV07CisgICAgY2hhciBtX3N6RnVsbFJlbVBhdGhbRlRfRklMRU5BTUVfU0laRV07CisgIH07Cit9CisKKyNlbmRpZiAvLyBfX1JGQl9UUkFOU0ZFUlFVRVVFX0hfXwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9UcnVlQ29sb3VyTWFwLmggYi9jb21tb24vcmZiL1RydWVDb2xvdXJNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTg3ZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9UcnVlQ29sb3VyTWFwLmgKQEAgLTAsMCArMSw0MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2lmbmRlZiBfX1JGQl9UUlVFQ09MT1VSTUFQX0hfXworI2RlZmluZSBfX1JGQl9UUlVFQ09MT1VSTUFQX0hfXworCisjaW5jbHVkZSA8cmZiL0NvbG91ck1hcC5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBUcnVlQ29sb3VyTWFwIDogcHVibGljIENvbG91ck1hcCB7CisgIHB1YmxpYzoKKyAgICBUcnVlQ29sb3VyTWFwKGNvbnN0IFBpeGVsRm9ybWF0JiBwZl8pIDogcGYocGZfKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGxvb2t1cChpbnQgaSwgaW50KiByLCBpbnQqIGcsIGludCogYikKKyAgICB7CisgICAgICAqciA9ICgoKGkgPj4gcGYucmVkU2hpZnQgICkgJiBwZi5yZWRNYXgpCisgICAgICAgICAgICAqIDY1NTM1ICsgcGYucmVkTWF4LzIpIC8gcGYucmVkTWF4OworICAgICAgKmcgPSAoKChpID4+IHBmLmdyZWVuU2hpZnQpICYgcGYuZ3JlZW5NYXgpCisgICAgICAgICAgICAqIDY1NTM1ICsgcGYuZ3JlZW5NYXgvMikgLyBwZi5ncmVlbk1heDsKKyAgICAgICpiID0gKCgoaSA+PiBwZi5ibHVlU2hpZnQpICYgcGYuYmx1ZU1heCkKKyAgICAgICAgICAgICogNjU1MzUgKyBwZi5ibHVlTWF4LzIpIC8gcGYuYmx1ZU1heDsKKyAgICB9CisgIHByaXZhdGU6CisgICAgUGl4ZWxGb3JtYXQgcGY7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvVXBkYXRlVHJhY2tlci5jeHggYi9jb21tb24vcmZiL1VwZGF0ZVRyYWNrZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWM0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1VwZGF0ZVRyYWNrZXIuY3h4CkBAIC0wLDAgKzEsMTU2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSByZmJVcGRhdGVUcmFja2VyLmNwcAorLy8KKy8vIFRyYWNrcyB1cGRhdGVkIHJlZ2lvbnMgYW5kIGEgcmVnaW9uLWNvcHkgZXZlbnQsIHRvbworLy8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8cmZiL1VwZGF0ZVRyYWNrZXIuaD4KKyNpbmNsdWRlIDxyZmIvTG9nV3JpdGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK3N0YXRpYyBMb2dXcml0ZXIgdmxvZygiVXBkYXRlVHJhY2tlciIpOworCisKKy8vIC09LSBDbGlwcGluZ1VwZGF0ZVRyYWNrZXIKKwordm9pZCBDbGlwcGluZ1VwZGF0ZVRyYWNrZXI6OmFkZF9jaGFuZ2VkKGNvbnN0IFJlZ2lvbiAmcmVnaW9uKSB7CisgIHV0LT5hZGRfY2hhbmdlZChyZWdpb24uaW50ZXJzZWN0KGNsaXBSZWN0KSk7Cit9CisKK3ZvaWQgQ2xpcHBpbmdVcGRhdGVUcmFja2VyOjphZGRfY29waWVkKGNvbnN0IFJlZ2lvbiAmZGVzdCwgY29uc3QgUG9pbnQgJmRlbHRhKSB7CisgIC8vIENsaXAgdGhlIGRlc3RpbmF0aW9uIHRvIHRoZSBkaXNwbGF5IGFyZWEKKyAgUmVnaW9uIGNsaXBkZXN0ID0gZGVzdC5pbnRlcnNlY3QoY2xpcFJlY3QpOworICBpZiAoY2xpcGRlc3QuaXNfZW1wdHkoKSkgIHJldHVybjsKKworICAvLyBDbGlwIHRoZSBzb3VyY2UgdG8gdGhlIHNjcmVlbgorICBSZWdpb24gdG1wID0gY2xpcGRlc3Q7CisgIHRtcC50cmFuc2xhdGUoZGVsdGEubmVnYXRlKCkpOworICB0bXAuYXNzaWduX2ludGVyc2VjdChjbGlwUmVjdCk7CisgIGlmICghdG1wLmlzX2VtcHR5KCkpIHsKKyAgICAvLyBUcmFuc2xhdGUgdGhlIHNvdXJjZSBiYWNrIHRvIGEgZGVzdGluYXRpb24gcmVnaW9uCisgICAgdG1wLnRyYW5zbGF0ZShkZWx0YSk7CisKKyAgICAvLyBQYXNzIHRoZSBjb3B5IHJlZ2lvbiB0byB0aGUgY2hpbGQgdHJhY2tlcgorICAgIHV0LT5hZGRfY29waWVkKHRtcCwgZGVsdGEpOworICB9CisKKyAgLy8gQW5kIGFkZCBhbnkgYml0cyB0aGF0IHdlIGhhZCB0byByZW1vdmUgdG8gdGhlIGNoYW5nZWQgcmVnaW9uCisgIHRtcCA9IGNsaXBkZXN0LnN1YnRyYWN0KHRtcCk7CisgIGlmICghdG1wLmlzX2VtcHR5KCkpCisgICAgdXQtPmFkZF9jaGFuZ2VkKHRtcCk7Cit9CisKKy8vIFNpbXBsZVVwZGF0ZVRyYWNrZXIKKworU2ltcGxlVXBkYXRlVHJhY2tlcjo6U2ltcGxlVXBkYXRlVHJhY2tlcihib29sIHVzZV9jb3B5cmVjdCkgeworICBjb3B5X2VuYWJsZWQgPSB1c2VfY29weXJlY3Q7Cit9CisKK1NpbXBsZVVwZGF0ZVRyYWNrZXI6On5TaW1wbGVVcGRhdGVUcmFja2VyKCkgeworfQorCit2b2lkIFNpbXBsZVVwZGF0ZVRyYWNrZXI6OmVuYWJsZV9jb3B5cmVjdChib29sIGVuYWJsZSkgeworICBpZiAoIWVuYWJsZSAmJiBjb3B5X2VuYWJsZWQpIHsKKyAgICBhZGRfY2hhbmdlZChjb3BpZWQpOworICAgIGNvcGllZC5jbGVhcigpOworICB9CisgIGNvcHlfZW5hYmxlZD1lbmFibGU7Cit9CisKK3ZvaWQgU2ltcGxlVXBkYXRlVHJhY2tlcjo6YWRkX2NoYW5nZWQoY29uc3QgUmVnaW9uICZyZWdpb24pIHsKKyAgY2hhbmdlZC5hc3NpZ25fdW5pb24ocmVnaW9uKTsKK30KKwordm9pZCBTaW1wbGVVcGRhdGVUcmFja2VyOjphZGRfY29waWVkKGNvbnN0IFJlZ2lvbiAmZGVzdCwgY29uc3QgUG9pbnQgJmRlbHRhKSB7CisgIC8vIERvIHdlIHN1cHBvcnQgY29weXJlY3Q/CisgIGlmICghY29weV9lbmFibGVkKSB7CisgICAgYWRkX2NoYW5nZWQoZGVzdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSXMgdGhlcmUgYW55dGhpbmcgdG8gZG8/CisgIGlmIChkZXN0LmlzX2VtcHR5KCkpIHJldHVybjsKKworICAvLyBDYWxjdWxhdGUgd2hldGhlciBhbnkgb2YgdGhpcyBjb3B5IGNhbiBiZSB0cmVhdGVkIGFzIGEgY29udGludWF0aW9uCisgIC8vIG9mIGFuIGVhcmxpZXIgb25lCisgIFJlZ2lvbiBzcmMgPSBkZXN0OworICBzcmMudHJhbnNsYXRlKGRlbHRhLm5lZ2F0ZSgpKTsKKyAgUmVnaW9uIG92ZXJsYXAgPSBzcmMuaW50ZXJzZWN0KGNvcGllZCk7CisKKyAgaWYgKG92ZXJsYXAuaXNfZW1wdHkoKSkgeworICAgIC8vIFRoZXJlIGlzIG5vIG92ZXJsYXAKKworICAgIFJlY3QgbmV3YnIgPSBkZXN0LmdldF9ib3VuZGluZ19yZWN0KCk7CisgICAgUmVjdCBvbGRiciA9IGNvcGllZC5nZXRfYm91bmRpbmdfcmVjdCgpOworICAgIGlmIChvbGRici5hcmVhKCkgPiBuZXdici5hcmVhKCkpIHsKKyAgICAgIC8vIE9sZCBjb3B5cmVjdCBpcyAocHJvYmFibHkpIGJpZ2dlciAtIHVzZSBpdAorICAgICAgY2hhbmdlZC5hc3NpZ25fdW5pb24oZGVzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5ldyBjb3B5cmVjdCBpcyBwcm9iYWJseSBiaWdnZXIKKyAgICAgIC8vIFVzZSB0aGUgbmV3IG9uZQorICAgICAgLy8gQnV0IGJlIGNhcmVmdWwgbm90IHRvIGNvcHkgc3R1ZmYgdGhhdCBzdGlsbCBuZWVkcworICAgICAgLy8gdG8gYmUgdXBkYXRlZC4KKyAgICAgIFJlZ2lvbiBpbnZhbGlkX3NyYyA9IHNyYy5pbnRlcnNlY3QoY2hhbmdlZCk7CisgICAgICBpbnZhbGlkX3NyYy50cmFuc2xhdGUoZGVsdGEpOworICAgICAgY2hhbmdlZC5hc3NpZ25fdW5pb24oaW52YWxpZF9zcmMpOworICAgICAgY2hhbmdlZC5hc3NpZ25fdW5pb24oY29waWVkKTsKKyAgICAgIGNvcGllZCA9IGRlc3Q7CisgICAgICBjb3B5X2RlbHRhID0gZGVsdGE7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIFJlZ2lvbiBpbnZhbGlkX3NyYyA9IG92ZXJsYXAuaW50ZXJzZWN0KGNoYW5nZWQpOworICBpbnZhbGlkX3NyYy50cmFuc2xhdGUoZGVsdGEpOworICBjaGFuZ2VkLmFzc2lnbl91bmlvbihpbnZhbGlkX3NyYyk7CisgIAorICBvdmVybGFwLnRyYW5zbGF0ZShkZWx0YSk7CisKKyAgUmVnaW9uIG5vbm92ZXJsYXBwZWRfY29waWVkID0gZGVzdC51bmlvbl8oY29waWVkKS5zdWJ0cmFjdChvdmVybGFwKTsKKyAgY2hhbmdlZC5hc3NpZ25fdW5pb24obm9ub3ZlcmxhcHBlZF9jb3BpZWQpOworCisgIGNvcGllZCA9IG92ZXJsYXA7CisgIGNvcHlfZGVsdGEgPSBjb3B5X2RlbHRhLnRyYW5zbGF0ZShkZWx0YSk7CisKKyAgcmV0dXJuOworfQorCit2b2lkIFNpbXBsZVVwZGF0ZVRyYWNrZXI6OnN1YnRyYWN0KGNvbnN0IFJlZ2lvbiYgcmVnaW9uKSB7CisgIGNvcGllZC5hc3NpZ25fc3VidHJhY3QocmVnaW9uKTsKKyAgY2hhbmdlZC5hc3NpZ25fc3VidHJhY3QocmVnaW9uKTsKK30KKwordm9pZCBTaW1wbGVVcGRhdGVUcmFja2VyOjpnZXRVcGRhdGVJbmZvKFVwZGF0ZUluZm8qIGluZm8sIGNvbnN0IFJlZ2lvbiYgY2xpcCkKK3sKKyAgY29waWVkLmFzc2lnbl9zdWJ0cmFjdChjaGFuZ2VkKTsKKyAgaW5mby0+Y2hhbmdlZCA9IGNoYW5nZWQuaW50ZXJzZWN0KGNsaXApOworICBpbmZvLT5jb3BpZWQgPSBjb3BpZWQuaW50ZXJzZWN0KGNsaXApOworICBpbmZvLT5jb3B5X2RlbHRhID0gY29weV9kZWx0YTsKK30KKwordm9pZCBTaW1wbGVVcGRhdGVUcmFja2VyOjpjb3B5VG8oVXBkYXRlVHJhY2tlciogdG8pIGNvbnN0IHsKKyAgaWYgKCFjb3BpZWQuaXNfZW1wdHkoKSkKKyAgICB0by0+YWRkX2NvcGllZChjb3BpZWQsIGNvcHlfZGVsdGEpOworICBpZiAoIWNoYW5nZWQuaXNfZW1wdHkoKSkKKyAgICB0by0+YWRkX2NoYW5nZWQoY2hhbmdlZCk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1VwZGF0ZVRyYWNrZXIuaCBiL2NvbW1vbi9yZmIvVXBkYXRlVHJhY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTEzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1VwZGF0ZVRyYWNrZXIuaApAQCAtMCwwICsxLDEwMyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisjaWZuZGVmIF9fUkZCX1VQREFURVRSQUNLRVJfSU5DTFVERURfXworI2RlZmluZSBfX1JGQl9VUERBVEVUUkFDS0VSX0lOQ0xVREVEX18KKworI2luY2x1ZGUgPHJmYi9SZWN0Lmg+CisjaW5jbHVkZSA8cmZiL1JlZ2lvbi5oPgorI2luY2x1ZGUgPHJmYi9QaXhlbEJ1ZmZlci5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBVcGRhdGVJbmZvIHsKKyAgcHVibGljOgorICAgIFJlZ2lvbiBjaGFuZ2VkOworICAgIFJlZ2lvbiBjb3BpZWQ7CisgICAgUG9pbnQgY29weV9kZWx0YTsKKyAgICBib29sIGlzX2VtcHR5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvcGllZC5pc19lbXB0eSgpICYmIGNoYW5nZWQuaXNfZW1wdHkoKTsKKyAgICB9CisgICAgaW50IG51bVJlY3RzKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvcGllZC5udW1SZWN0cygpICsgY2hhbmdlZC5udW1SZWN0cygpOworICAgIH0KKyAgfTsKKworICBjbGFzcyBVcGRhdGVUcmFja2VyIHsKKyAgcHVibGljOgorICAgIFVwZGF0ZVRyYWNrZXIoKSB7fTsKKyAgICB2aXJ0dWFsIH5VcGRhdGVUcmFja2VyKCkge307CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRkX2NoYW5nZWQoY29uc3QgUmVnaW9uICZyZWdpb24pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkX2NvcGllZChjb25zdCBSZWdpb24gJmRlc3QsIGNvbnN0IFBvaW50ICZkZWx0YSkgPSAwOworICB9OworCisgIGNsYXNzIENsaXBwaW5nVXBkYXRlVHJhY2tlciA6IHB1YmxpYyBVcGRhdGVUcmFja2VyIHsKKyAgcHVibGljOgorICAgIENsaXBwaW5nVXBkYXRlVHJhY2tlcigpIDogdXQoMCkge30KKyAgICBDbGlwcGluZ1VwZGF0ZVRyYWNrZXIoVXBkYXRlVHJhY2tlciogdXRfLCBjb25zdCBSZWN0JiByPVJlY3QoKSkgOiB1dCh1dF8pLCBjbGlwUmVjdChyKSB7fQorICAgIAorICAgIHZvaWQgc2V0VXBkYXRlVHJhY2tlcihVcGRhdGVUcmFja2VyKiB1dF8pIHt1dCA9IHV0Xzt9CisgICAgdm9pZCBzZXRDbGlwUmVjdChjb25zdCBSZWN0JiBjcikge2NsaXBSZWN0ID0gY3I7fQorCisgICAgdmlydHVhbCB2b2lkIGFkZF9jaGFuZ2VkKGNvbnN0IFJlZ2lvbiAmcmVnaW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkX2NvcGllZChjb25zdCBSZWdpb24gJmRlc3QsIGNvbnN0IFBvaW50ICZkZWx0YSk7CisgIHByb3RlY3RlZDoKKyAgICBVcGRhdGVUcmFja2VyKiB1dDsKKyAgICBSZWdpb24gY2xpcFJlY3Q7CisgIH07CisKKyAgY2xhc3MgU2ltcGxlVXBkYXRlVHJhY2tlciA6IHB1YmxpYyBVcGRhdGVUcmFja2VyIHsKKyAgcHVibGljOgorICAgIFNpbXBsZVVwZGF0ZVRyYWNrZXIoYm9vbCB1c2VfY29weXJlY3Q9dHJ1ZSk7CisgICAgdmlydHVhbCB+U2ltcGxlVXBkYXRlVHJhY2tlcigpOworCisgICAgdmlydHVhbCB2b2lkIGVuYWJsZV9jb3B5cmVjdChib29sIGVuYWJsZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRkX2NoYW5nZWQoY29uc3QgUmVnaW9uICZyZWdpb24pOworICAgIHZpcnR1YWwgdm9pZCBhZGRfY29waWVkKGNvbnN0IFJlZ2lvbiAmZGVzdCwgY29uc3QgUG9pbnQgJmRlbHRhKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3VidHJhY3QoY29uc3QgUmVnaW9uJiByZWdpb24pOworCisgICAgLy8gRmlsbCB0aGUgc3VwcGxpZWQgVXBkYXRlSW5mbyBzdHJ1Y3R1cmUgd2l0aCB1cGRhdGUgaW5mb3JtYXRpb24KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0VXBkYXRlSW5mbyhVcGRhdGVJbmZvKiBpbmZvLCBjb25zdCBSZWdpb24mIGNsaXByZ24pOworCisgICAgLy8gQ29weSB0aGUgY29udGFpbmVkIHVwZGF0ZXMgdG8gYW5vdGhlciB0cmFja2VyCisgICAgdmlydHVhbCB2b2lkIGNvcHlUbyhVcGRhdGVUcmFja2VyKiB0bykgY29uc3Q7CisKKworICAgIC8vIEdldCB0aGUgY2hhbmdlZC9jb3BpZWQgcmVnaW9ucworICAgIGNvbnN0IFJlZ2lvbiYgZ2V0X2NoYW5nZWQoKSBjb25zdCB7cmV0dXJuIGNoYW5nZWQ7fQorICAgIGNvbnN0IFJlZ2lvbiYgZ2V0X2NvcGllZCgpIGNvbnN0IHtyZXR1cm4gY29waWVkO30KKyAgICBjb25zdCBQb2ludCYgZ2V0X2RlbHRhKCkgY29uc3Qge3JldHVybiBjb3B5X2RlbHRhO30KKworICAgIC8vIE1vdmUgdGhlIGVudGlyZSB1cGRhdGUgcmVnaW9uIGJ5IGFuIG9mZnNldAorICAgIHZvaWQgdHJhbnNsYXRlKGNvbnN0IFBvaW50JiBwKSB7Y2hhbmdlZC50cmFuc2xhdGUocCk7IGNvcGllZC50cmFuc2xhdGUocCk7fQorCisgICAgdmlydHVhbCBib29sIGlzX2VtcHR5KCkgY29uc3Qge3JldHVybiBjaGFuZ2VkLmlzX2VtcHR5KCkgJiYgY29waWVkLmlzX2VtcHR5KCk7fQorCisgICAgdmlydHVhbCB2b2lkIGNsZWFyKCkge2NoYW5nZWQuY2xlYXIoKTsgY29waWVkLmNsZWFyKCk7fTsKKyAgcHJvdGVjdGVkOgorICAgIFJlZ2lvbiBjaGFuZ2VkOworICAgIFJlZ2lvbiBjb3BpZWQ7CisgICAgUG9pbnQgY29weV9kZWx0YTsKKyAgICBib29sIGNvcHlfZW5hYmxlZDsKKyAgfTsKKworfQorCisjZW5kaWYgLy8gX19SRkJfVVBEQVRFVFJBQ0tFUl9JTkNMVURFRF9fCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1VzZXJQYXNzd2RHZXR0ZXIuaCBiL2NvbW1vbi9yZmIvVXNlclBhc3N3ZEdldHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjBiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL1VzZXJQYXNzd2RHZXR0ZXIuaApAQCAtMCwwICsxLDMwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fUkZCX1VTRVJQQVNTV0RHRVRURVJfSF9fCisjZGVmaW5lIF9fUkZCX1VTRVJQQVNTV0RHRVRURVJfSF9fCituYW1lc3BhY2UgcmZiIHsKKyAgY2xhc3MgVXNlclBhc3N3ZEdldHRlciB7CisgIHB1YmxpYzoKKyAgICAvLyBnZXRVc2VyUGFzc3dkIGdldHMgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4gIFRoaXMgbWlnaHQgaW52b2x2ZSBhCisgICAgLy8gZGlhbG9nLCBnZXRwYXNzKCksIGV0Yy4gIFRoZSB1c2VyIGJ1ZmZlciBwb2ludGVyIGNhbiBiZSBudWxsLCBpbiB3aGljaAorICAgIC8vIGNhc2Ugbm8gdXNlciBuYW1lIHdpbGwgYmUgcmV0cmlldmVkLiAgVGhlIGNhbGxlciBNVVNUIGRlbGV0ZSBbXSB0aGUKKyAgICAvLyByZXN1bHQocykuCisgICAgdmlydHVhbCB2b2lkIGdldFVzZXJQYXNzd2QoY2hhcioqIHVzZXIsIGNoYXIqKiBwYXNzd29yZCk9MDsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9WTkNTQ29ubmVjdGlvblNULmN4eCBiL2NvbW1vbi9yZmIvVk5DU0Nvbm5lY3Rpb25TVC5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2MGU0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvVk5DU0Nvbm5lY3Rpb25TVC5jeHgKQEAgLTAsMCArMSw3MTQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2luY2x1ZGUgPHJmYi9WTkNTQ29ubmVjdGlvblNULmg+CisjaW5jbHVkZSA8cmZiL0xvZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9zZWNUeXBlcy5oPgorI2luY2x1ZGUgPHJmYi9TZXJ2ZXJDb3JlLmg+CisjaW5jbHVkZSA8cmZiL0NvbXBhcmluZ1VwZGF0ZVRyYWNrZXIuaD4KKyNpbmNsdWRlIDxyZmIvS2V5UmVtYXBwZXIuaD4KKyNkZWZpbmUgWEtfTUlTQ0VMTEFOWQorI2RlZmluZSBYS19YS0JfS0VZUworI2luY2x1ZGUgPHJmYi9rZXlzeW1kZWYuaD4KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworc3RhdGljIExvZ1dyaXRlciB2bG9nKCJWTkNTQ29ublNUIik7CisKK1ZOQ1NDb25uZWN0aW9uU1Q6OlZOQ1NDb25uZWN0aW9uU1QoVk5DU2VydmVyU1QqIHNlcnZlcl8sIG5ldHdvcms6OlNvY2tldCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXZlcnNlKQorICA6IFNDb25uZWN0aW9uKHNlcnZlcl8tPnNlY3VyaXR5RmFjdG9yeSwgcmV2ZXJzZSksIHNvY2socyksIHNlcnZlcihzZXJ2ZXJfKSwKKyAgICB1cGRhdGVzKGZhbHNlKSwgaW1hZ2VfZ2V0dGVyKHNlcnZlci0+dXNlRWNvbm9taWNUcmFuc2xhdGUpLAorICAgIGRyYXdSZW5kZXJlZEN1cnNvcihmYWxzZSksIHJlbW92ZVJlbmRlcmVkQ3Vyc29yKGZhbHNlKSwKKyAgICBwb2ludGVyRXZlbnRUaW1lKDApLCBhY2Nlc3NSaWdodHMoQWNjZXNzRGVmYXVsdCksCisgICAgc3RhcnRUaW1lKHRpbWUoMCkpLCBtX3BGaWxlVHJhbnNmZXIoMCkKK3sKKyAgc2V0U3RyZWFtcygmc29jay0+aW5TdHJlYW0oKSwgJnNvY2stPm91dFN0cmVhbSgpKTsKKyAgcGVlckVuZHBvaW50LmJ1ZiA9IHNvY2stPmdldFBlZXJFbmRwb2ludCgpOworICBWTkNTZXJ2ZXJTVDo6Y29ubmVjdGlvbnNMb2cud3JpdGUoMSwiYWNjZXB0ZWQ6ICVzIiwgcGVlckVuZHBvaW50LmJ1Zik7CisKKyAgLy8gQ29uZmlndXJlIHRoZSBzb2NrZXQKKyAgc2V0U29ja2V0VGltZW91dHMoKTsKKyAgbGFzdEV2ZW50VGltZSA9IHRpbWUoMCk7CisKKyAgLy8gQWRkIHRoaXMgY2xpZW50IHRvIHRoZSBWTkNTZXJ2ZXJTVAorICBpZiAoc2VydmVyLT5tX3BGVE1hbmFnZXIgIT0gTlVMTCkgeworICAgIFNGaWxlVHJhbnNmZXIgKnBGVCA9IHNlcnZlci0+bV9wRlRNYW5hZ2VyLT5jcmVhdGVPYmplY3Qoc29jayk7CisgICAgaWYgKHBGVCAhPSBOVUxMKSB7CisgICAgICBtX3BGaWxlVHJhbnNmZXIgPSBwRlQ7CisgICAgfQorICB9CisKKyAgc2VydmVyLT5jbGllbnRzLnB1c2hfZnJvbnQodGhpcyk7Cit9CisKKworVk5DU0Nvbm5lY3Rpb25TVDo6flZOQ1NDb25uZWN0aW9uU1QoKQoreworICAvLyBJZiB3ZSByZWFjaCBoZXJlIHRoZW4gVk5DU2VydmVyU1QgaXMgZGVsZXRpbmcgdXMhCisgIFZOQ1NlcnZlclNUOjpjb25uZWN0aW9uc0xvZy53cml0ZSgxLCJjbG9zZWQ6ICVzICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlckVuZHBvaW50LmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZVJlYXNvbi5idWYpID8gY2xvc2VSZWFzb24uYnVmIDogIiIpOworCisgIC8vIFJlbGVhc2UgYW55IGtleXMgdGhlIGNsaWVudCBzdGlsbCBoYWQgcHJlc3NlZAorICBzdGQ6OnNldDxyZHI6OlUzMj46Oml0ZXJhdG9yIGk7CisgIGZvciAoaT1wcmVzc2VkS2V5cy5iZWdpbigpOyBpIT1wcmVzc2VkS2V5cy5lbmQoKTsgaSsrKQorICAgIHNlcnZlci0+ZGVza3RvcC0+a2V5RXZlbnQoKmksIGZhbHNlKTsKKyAgaWYgKHNlcnZlci0+cG9pbnRlckNsaWVudCA9PSB0aGlzKQorICAgIHNlcnZlci0+cG9pbnRlckNsaWVudCA9IDA7CisKKyAgaWYgKG1fcEZpbGVUcmFuc2ZlcikgCisgICAgc2VydmVyLT5tX3BGVE1hbmFnZXItPmRlc3Ryb3lPYmplY3QobV9wRmlsZVRyYW5zZmVyKTsKKworICAvLyBSZW1vdmUgdGhpcyBjbGllbnQgZnJvbSB0aGUgc2VydmVyCisgIHNlcnZlci0+Y2xpZW50cy5yZW1vdmUodGhpcyk7CisKK30KKworCisvLyBNZXRob2RzIGNhbGxlZCBmcm9tIFZOQ1NlcnZlclNUCisKK2Jvb2wgVk5DU0Nvbm5lY3Rpb25TVDo6aW5pdCgpCit7CisgIHRyeSB7CisgICAgaW5pdGlhbGlzZVByb3RvY29sKCk7CisgIH0gY2F0Y2ggKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgY2xvc2UoZS5zdHIoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFZOQ1NDb25uZWN0aW9uU1Q6OmNsb3NlKGNvbnN0IGNoYXIqIHJlYXNvbikKK3sKKyAgLy8gTG9nIHRoZSByZWFzb24gZm9yIHRoZSBjbG9zZQorICBpZiAoIWNsb3NlUmVhc29uLmJ1ZikKKyAgICBjbG9zZVJlYXNvbi5idWYgPSBzdHJEdXAocmVhc29uKTsKKyAgZWxzZQorICAgIHZsb2cuZGVidWcoInNlY29uZCBjbG9zZTogJXMgKCVzKSIsIHBlZXJFbmRwb2ludC5idWYsIHJlYXNvbik7CisKKyAgaWYgKGF1dGhlbnRpY2F0ZWQoKSkgeworICAgICAgc2VydmVyLT5sYXN0RGlzY29ubmVjdFRpbWUgPSB0aW1lKDApOworICB9CisKKyAgLy8gSnVzdCBzaHV0ZG93biB0aGUgc29ja2V0IGFuZCBtYXJrIG91ciBzdGF0ZSBhcyBjbG9zaW5nLiAgRXZlbnR1YWxseSB0aGUKKyAgLy8gY2FsbGluZyBjb2RlIHdpbGwgY2FsbCBWTkNTZXJ2ZXJTVCdzIHJlbW92ZVNvY2tldCgpIG1ldGhvZCBjYXVzaW5nIHVzIHRvCisgIC8vIGJlIGRlbGV0ZWQuCisgIHNvY2stPnNodXRkb3duKCk7CisgIHNldFN0YXRlKFJGQlNUQVRFX0NMT1NJTkcpOworfQorCisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6cHJvY2Vzc01lc3NhZ2VzKCkKK3sKKyAgaWYgKHN0YXRlKCkgPT0gUkZCU1RBVEVfQ0xPU0lORykgcmV0dXJuOworICB0cnkgeworICAgIC8vIC0gTm93IHNldCBhcHByb3ByaWF0ZSBzb2NrZXQgdGltZW91dHMgYW5kIHByb2Nlc3MgZGF0YQorICAgIHNldFNvY2tldFRpbWVvdXRzKCk7CisgICAgYm9vbCBjbGllbnRzUmVhZHlCZWZvcmUgPSBzZXJ2ZXItPmNsaWVudHNSZWFkeUZvclVwZGF0ZSgpOworCisgICAgd2hpbGUgKGdldEluU3RyZWFtKCktPmNoZWNrTm9XYWl0KDEpKSB7CisgICAgICBwcm9jZXNzTXNnKCk7CisgICAgfQorCisgICAgaWYgKCFjbGllbnRzUmVhZHlCZWZvcmUgJiYgIXJlcXVlc3RlZC5pc19lbXB0eSgpKQorICAgICAgc2VydmVyLT5kZXNrdG9wLT5mcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoKTsKKyAgfSBjYXRjaCAocmRyOjpFbmRPZlN0cmVhbSYpIHsKKyAgICBjbG9zZSgiQ2xlYW4gZGlzY29ubmVjdGlvbiIpOworICB9IGNhdGNoIChyZHI6OkV4Y2VwdGlvbiAmZSkgeworICAgIGNsb3NlKGUuc3RyKCkpOworICB9Cit9CisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6d3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZU9yQ2xvc2UoKQoreworICB0cnkgeworICAgIHdyaXRlRnJhbWVidWZmZXJVcGRhdGUoKTsKKyAgfSBjYXRjaChyZHI6OkV4Y2VwdGlvbiAmZSkgeworICAgIGNsb3NlKGUuc3RyKCkpOworICB9Cit9CisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6cGl4ZWxCdWZmZXJDaGFuZ2UoKQoreworICB0cnkgeworICAgIGlmICghYXV0aGVudGljYXRlZCgpKSByZXR1cm47CisgICAgaWYgKGNwLndpZHRoICYmIGNwLmhlaWdodCAmJiAoc2VydmVyLT5wYi0+d2lkdGgoKSAhPSBjcC53aWR0aCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci0+cGItPmhlaWdodCgpICE9IGNwLmhlaWdodCkpCisgICAgeworICAgICAgLy8gV2UgbmVlZCB0byBjbGlwIHRoZSBuZXh0IHVwZGF0ZSB0byB0aGUgbmV3IHNpemUsIGJ1dCBhbHNvIGFkZCBhbnkKKyAgICAgIC8vIGV4dHJhIGJpdHMgaWYgaXQncyBiaWdnZXIuICBJZiB3ZSB3YW50ZWQgdG8gZG8gdGhpcyBleGFjdGx5LCBzb21ldGhpbmcKKyAgICAgIC8vIGxpa2UgdGhlIGNvZGUgYmVsb3cgd291bGQgZG8gaXQsIGJ1dCBhdCB0aGUgbW9tZW50IHdlIGp1c3QgdXBkYXRlIHRoZQorICAgICAgLy8gZW50aXJlIG5ldyBzaXplLiAgSG93ZXZlciwgd2UgZG8gbmVlZCB0byBjbGlwIHRoZSByZW5kZXJlZEN1cnNvclJlY3QKKyAgICAgIC8vIGJlY2F1c2UgdGhhdCBtaWdodCBiZSBhZGRlZCB0byB1cGRhdGVzIGluIHdyaXRlRnJhbWVidWZmZXJVcGRhdGUoKS4KKworICAgICAgLy91cGRhdGVzLmludGVyc2VjdChzZXJ2ZXItPnBiLT5nZXRSZWN0KCkpOworICAgICAgLy8KKyAgICAgIC8vaWYgKHNlcnZlci0+cGItPndpZHRoKCkgPiBjcC53aWR0aCkKKyAgICAgIC8vICB1cGRhdGVzLmFkZF9jaGFuZ2VkKFJlY3QoY3Aud2lkdGgsIDAsIHNlcnZlci0+cGItPndpZHRoKCksCisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci0+cGItPmhlaWdodCgpKSk7CisgICAgICAvL2lmIChzZXJ2ZXItPnBiLT5oZWlnaHQoKSA+IGNwLmhlaWdodCkKKyAgICAgIC8vICB1cGRhdGVzLmFkZF9jaGFuZ2VkKFJlY3QoMCwgY3AuaGVpZ2h0LCBjcC53aWR0aCwKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLT5wYi0+aGVpZ2h0KCkpKTsKKworICAgICAgcmVuZGVyZWRDdXJzb3JSZWN0ID0gcmVuZGVyZWRDdXJzb3JSZWN0LmludGVyc2VjdChzZXJ2ZXItPnBiLT5nZXRSZWN0KCkpOworCisgICAgICBjcC53aWR0aCA9IHNlcnZlci0+cGItPndpZHRoKCk7CisgICAgICBjcC5oZWlnaHQgPSBzZXJ2ZXItPnBiLT5oZWlnaHQoKTsKKyAgICAgIGlmIChzdGF0ZSgpID09IFJGQlNUQVRFX05PUk1BTCkgeworICAgICAgICBpZiAoIXdyaXRlcigpLT53cml0ZVNldERlc2t0b3BTaXplKCkpIHsKKyAgICAgICAgICBjbG9zZSgiQ2xpZW50IGRvZXMgbm90IHN1cHBvcnQgZGVza3RvcCByZXNpemUiKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLy8gSnVzdCB1cGRhdGUgdGhlIHdob2xlIHNjcmVlbiBhdCB0aGUgbW9tZW50IGJlY2F1c2Ugd2UncmUgdG9vIGxhenkgdG8KKyAgICAvLyB3b3JrIG91dCB3aGF0J3MgYWN0dWFsbHkgY2hhbmdlZC4KKyAgICB1cGRhdGVzLmNsZWFyKCk7CisgICAgdXBkYXRlcy5hZGRfY2hhbmdlZChzZXJ2ZXItPnBiLT5nZXRSZWN0KCkpOworICAgIHZsb2cuZGVidWcoInBpeGVsIGJ1ZmZlciBjaGFuZ2VkIC0gcmUtaW5pdGlhbGlzaW5nIGltYWdlIGdldHRlciIpOworICAgIGltYWdlX2dldHRlci5pbml0KHNlcnZlci0+cGIsIGNwLnBmKCksIHdyaXRlcigpKTsKKyAgICBpZiAod3JpdGVyKCktPm5lZWRGYWtlVXBkYXRlKCkpCisgICAgICB3cml0ZUZyYW1lYnVmZmVyVXBkYXRlKCk7CisgIH0gY2F0Y2gocmRyOjpFeGNlcHRpb24gJmUpIHsKKyAgICBjbG9zZShlLnN0cigpKTsKKyAgfQorfQorCit2b2lkIFZOQ1NDb25uZWN0aW9uU1Q6OnNldENvbG91ck1hcEVudHJpZXNPckNsb3NlKGludCBmaXJzdENvbG91cixpbnQgbkNvbG91cnMpCit7CisgIHRyeSB7CisgICAgc2V0Q29sb3VyTWFwRW50cmllcyhmaXJzdENvbG91ciwgbkNvbG91cnMpOworICB9IGNhdGNoKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgY2xvc2UoZS5zdHIoKSk7CisgIH0KK30KKwordm9pZCBWTkNTQ29ubmVjdGlvblNUOjpiZWxsKCkKK3sKKyAgdHJ5IHsKKyAgICBpZiAoc3RhdGUoKSA9PSBSRkJTVEFURV9OT1JNQUwpIHdyaXRlcigpLT53cml0ZUJlbGwoKTsKKyAgfSBjYXRjaChyZHI6OkV4Y2VwdGlvbiYgZSkgeworICAgIGNsb3NlKGUuc3RyKCkpOworICB9Cit9CisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6c2VydmVyQ3V0VGV4dChjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCit7CisgIHRyeSB7CisgICAgaWYgKCEoYWNjZXNzUmlnaHRzICYgQWNjZXNzQ3V0VGV4dCkpIHJldHVybjsKKyAgICBpZiAoIXJmYjo6U2VydmVyOjpzZW5kQ3V0VGV4dCkgcmV0dXJuOworICAgIGlmIChzdGF0ZSgpID09IFJGQlNUQVRFX05PUk1BTCkKKyAgICAgIHdyaXRlcigpLT53cml0ZVNlcnZlckN1dFRleHQoc3RyLCBsZW4pOworICB9IGNhdGNoKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgY2xvc2UoZS5zdHIoKSk7CisgIH0KK30KKwordm9pZCBWTkNTQ29ubmVjdGlvblNUOjpzZXRDdXJzb3JPckNsb3NlKCkKK3sKKyAgdHJ5IHsKKyAgICBzZXRDdXJzb3IoKTsKKyAgfSBjYXRjaChyZHI6OkV4Y2VwdGlvbiYgZSkgeworICAgIGNsb3NlKGUuc3RyKCkpOworICB9Cit9CisKKworaW50IFZOQ1NDb25uZWN0aW9uU1Q6OmNoZWNrSWRsZVRpbWVvdXQoKQoreworICBpbnQgaWRsZVRpbWVvdXQgPSByZmI6OlNlcnZlcjo6aWRsZVRpbWVvdXQ7CisgIGlmIChpZGxlVGltZW91dCA9PSAwKSByZXR1cm4gMDsKKyAgaWYgKHN0YXRlKCkgIT0gUkZCU1RBVEVfTk9STUFMICYmIGlkbGVUaW1lb3V0IDwgMTUpCisgICAgaWRsZVRpbWVvdXQgPSAxNTsgLy8gbWluaW11bSBvZiAxNSBzZWNvbmRzIHdoaWxlIGF1dGhlbnRpY2F0aW5nCisgIHRpbWVfdCBub3cgPSB0aW1lKDApOworICBpZiAobm93IDwgbGFzdEV2ZW50VGltZSkgeworICAgIC8vIFNvbWVvbmUgbXVzdCBoYXZlIHNldCB0aGUgdGltZSBiYWNrd2FyZHMuICBTZXQgbGFzdEV2ZW50VGltZSBzbyB0aGF0IHRoZQorICAgIC8vIGlkbGVUaW1lb3V0IHdpbGwgY291bnQgZnJvbSBub3cuCisgICAgdmxvZy5pbmZvKCJUaW1lIGhhcyBnb25lIGJhY2t3YXJkcyAtIHJlc2V0dGluZyBpZGxlIHRpbWVvdXQiKTsKKyAgICBsYXN0RXZlbnRUaW1lID0gbm93OworICB9CisgIGludCB0aW1lTGVmdCA9IGxhc3RFdmVudFRpbWUgKyBpZGxlVGltZW91dCAtIG5vdzsKKyAgaWYgKHRpbWVMZWZ0IDwgLTYwKSB7CisgICAgLy8gT3VyIGNhbGxiYWNrIGlzIG92ZXIgYSBtaW51dGUgbGF0ZSAtIHNvbWVvbmUgbXVzdCBoYXZlIHNldCB0aGUgdGltZQorICAgIC8vIGZvcndhcmRzLiAgU2V0IGxhc3RFdmVudFRpbWUgc28gdGhhdCB0aGUgaWRsZVRpbWVvdXQgd2lsbCBjb3VudCBmcm9tCisgICAgLy8gbm93LgorICAgIHZsb2cuaW5mbygiVGltZSBoYXMgZ29uZSBmb3J3YXJkcyAtIHJlc2V0dGluZyBpZGxlIHRpbWVvdXQiKTsKKyAgICBsYXN0RXZlbnRUaW1lID0gbm93OworICAgIHJldHVybiBzZWNzVG9NaWxsaXMoaWRsZVRpbWVvdXQpOworICB9CisgIGlmICh0aW1lTGVmdCA8PSAwKSB7CisgICAgY2xvc2UoIklkbGUgdGltZW91dCIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBzZWNzVG9NaWxsaXModGltZUxlZnQpOworfQorCisvLyByZW5kZXJlZEN1cnNvckNoYW5nZSgpIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc2VydmVyLXNpZGUgcmVuZGVyZWQgY3Vyc29yCisvLyBjaGFuZ2VzIHNoYXBlIG9yIHBvc2l0aW9uLiAgSXQgZW5zdXJlcyB0aGF0IHRoZSBuZXh0IHVwZGF0ZSB3aWxsIGNsZWFuIHVwCisvLyB0aGUgb2xkIHJlbmRlcmVkIGN1cnNvciBhbmQgaWYgbmVjZXNzYXJ5IGRyYXcgdGhlIG5ldyByZW5kZXJlZCBjdXJzb3IuCisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6cmVuZGVyZWRDdXJzb3JDaGFuZ2UoKQoreworICBpZiAoc3RhdGUoKSAhPSBSRkJTVEFURV9OT1JNQUwpIHJldHVybjsKKyAgcmVtb3ZlUmVuZGVyZWRDdXJzb3IgPSB0cnVlOworICBpZiAobmVlZFJlbmRlcmVkQ3Vyc29yKCkpCisgICAgZHJhd1JlbmRlcmVkQ3Vyc29yID0gdHJ1ZTsKK30KKworLy8gbmVlZFJlbmRlcmVkQ3Vyc29yKCkgcmV0dXJucyB0cnVlIGlmIHRoaXMgY2xpZW50IG5lZWRzIHRoZSBzZXJ2ZXItc2lkZQorLy8gcmVuZGVyZWQgY3Vyc29yLiAgVGhpcyBtYXkgYmUgYmVjYXVzZSBpdCBkb2VzIG5vdCBzdXBwb3J0IGxvY2FsIGN1cnNvciBvcgorLy8gYmVjYXVzZSB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaGFzIG5vdCBiZWVuIHNldCBieSB0aGlzIGNsaWVudC4KKy8vIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3Qga25vdyBmb3Igc3VyZSB3aGVuIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBoYXMKKy8vIGJlZW4gc2V0IGJ5IHRoaXMgY2xpZW50LiAgV2UgZ3Vlc3MgdGhhdCB0aGlzIGlzIHRoZSBjYXNlIHdoZW4gdGhlIGN1cnJlbnQKKy8vIGN1cnNvciBwb3NpdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCBwb2ludGVyIGV2ZW50IGZyb20gdGhpcyBjbGllbnQsIG9yCisvLyBpZiBpdCBpcyBhIHZlcnkgc2hvcnQgdGltZSBzaW5jZSB0aGlzIGNsaWVudCdzIGxhc3QgcG9pbnRlciBldmVudCAodXAgdG8gYQorLy8gc2Vjb25kKS4gIFsgSWRlYWxseSB3ZSBzaG91bGQgZG8gZmluZXItZ3JhaW5lZCB0aW1pbmcgaGVyZSBhbmQgbWFrZSB0aGUgdGltZQorLy8gY29uZmlndXJhYmxlLCBidXQgSSBkb24ndCB0aGluayBpdCdzIHRoYXQgaW1wb3J0YW50LiBdCisKK2Jvb2wgVk5DU0Nvbm5lY3Rpb25TVDo6bmVlZFJlbmRlcmVkQ3Vyc29yKCkKK3sKKyAgcmV0dXJuIChzdGF0ZSgpID09IFJGQlNUQVRFX05PUk1BTAorICAgICAgICAgICYmICghY3Auc3VwcG9ydHNMb2NhbEN1cnNvciAmJiAhY3Auc3VwcG9ydHNMb2NhbFhDdXJzb3IKKyAgICAgICAgICAgICAgfHwgKCFzZXJ2ZXItPmN1cnNvclBvcy5lcXVhbHMocG9pbnRlckV2ZW50UG9zKSAmJgorICAgICAgICAgICAgICAgICAgKHRpbWUoMCkgLSBwb2ludGVyRXZlbnRUaW1lKSA+IDApKSk7Cit9CisKKwordm9pZCBWTkNTQ29ubmVjdGlvblNUOjphcHByb3ZlQ29ubmVjdGlvbk9yQ2xvc2UoYm9vbCBhY2NlcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZWFzb24pCit7CisgIHRyeSB7CisgICAgYXBwcm92ZUNvbm5lY3Rpb24oYWNjZXB0LCByZWFzb24pOworICB9IGNhdGNoIChyZHI6OkV4Y2VwdGlvbiYgZSkgeworICAgIGNsb3NlKGUuc3RyKCkpOworICB9Cit9CisKKworCisvLyAtPS0gQ2FsbGJhY2tzIGZyb20gU0Nvbm5lY3Rpb24KKwordm9pZCBWTkNTQ29ubmVjdGlvblNUOjphdXRoU3VjY2VzcygpCit7CisgIGxhc3RFdmVudFRpbWUgPSB0aW1lKDApOworCisgIHNlcnZlci0+c3RhcnREZXNrdG9wKCk7CisKKyAgLy8gLSBTZXQgdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyBhcHByb3ByaWF0ZWx5CisgIGNwLndpZHRoID0gc2VydmVyLT5wYi0+d2lkdGgoKTsKKyAgY3AuaGVpZ2h0ID0gc2VydmVyLT5wYi0+aGVpZ2h0KCk7CisgIGNwLnNldE5hbWUoc2VydmVyLT5nZXROYW1lKCkpOworICAKKyAgLy8gLSBTZXQgdGhlIGRlZmF1bHQgcGl4ZWwgZm9ybWF0CisgIGNwLnNldFBGKHNlcnZlci0+cGItPmdldFBGKCkpOworICBjaGFyIGJ1ZmZlclsyNTZdOworICBjcC5wZigpLnByaW50KGJ1ZmZlciwgMjU2KTsKKyAgdmxvZy5pbmZvKCJTZXJ2ZXIgZGVmYXVsdCBwaXhlbCBmb3JtYXQgJXMiLCBidWZmZXIpOworICBpbWFnZV9nZXR0ZXIuaW5pdChzZXJ2ZXItPnBiLCBjcC5wZigpLCAwKTsKKworICAvLyAtIE1hcmsgdGhlIGVudGlyZSBkaXNwbGF5IGFzICJkaXJ0eSIKKyAgdXBkYXRlcy5hZGRfY2hhbmdlZChzZXJ2ZXItPnBiLT5nZXRSZWN0KCkpOworICBzdGFydFRpbWUgPSB0aW1lKDApOworfQorCit2b2lkIFZOQ1NDb25uZWN0aW9uU1Q6OnF1ZXJ5Q29ubmVjdGlvbihjb25zdCBjaGFyKiB1c2VyTmFtZSkKK3sKKyAgLy8gLSBBdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQgLSBjbGVhciBmcm9tIGJsYWNrbGlzdAorICBDaGFyQXJyYXkgbmFtZTsgbmFtZS5idWYgPSBzb2NrLT5nZXRQZWVyQWRkcmVzcygpOworICBzZXJ2ZXItPmJsSG9zdHMtPmNsZWFyQmxhY2ttYXJrKG5hbWUuYnVmKTsKKworICAvLyAtIFNwZWNpYWwgY2FzZSB0byBwcm92aWRlIGEgbW9yZSB1c2VmdWwgZXJyb3IgbWVzc2FnZQorICBpZiAocmZiOjpTZXJ2ZXI6Om5ldmVyU2hhcmVkICYmICFyZmI6OlNlcnZlcjo6ZGlzY29ubmVjdENsaWVudHMgJiYKKyAgICBzZXJ2ZXItPmF1dGhDbGllbnRDb3VudCgpID4gMCkgeworICAgIGFwcHJvdmVDb25uZWN0aW9uKGZhbHNlLCAiVGhlIHNlcnZlciBpcyBhbHJlYWR5IGluIHVzZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIC0gRG9lcyB0aGUgY2xpZW50IGhhdmUgdGhlIHJpZ2h0IHRvIGJ5cGFzcyB0aGUgcXVlcnk/CisgIGlmIChyZXZlcnNlQ29ubmVjdGlvbiB8fAorICAgICAgIShyZmI6OlNlcnZlcjo6cXVlcnlDb25uZWN0IHx8IHNvY2stPnJlcXVpcmVzUXVlcnkoKSkgfHwKKyAgICAgIChhY2Nlc3NSaWdodHMgJiBBY2Nlc3NOb1F1ZXJ5KSkKKyAgeworICAgIGFwcHJvdmVDb25uZWN0aW9uKHRydWUpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIC0gR2V0IHRoZSBzZXJ2ZXIgdG8gZGlzcGxheSBhbiBBY2NlcHQvUmVqZWN0IGRpYWxvZywgaWYgcmVxdWlyZWQKKyAgLy8gICBJZiBhIGRpYWxvZyBpcyBkaXNwbGF5ZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBQRU5ESU5HLCBhbmQgdGhlCisgIC8vICAgc2VydmVyIHdpbGwgY2FsbCBhcHByb3ZlQ29ubmVjdGlvbiBhdCBhIGxhdGVyIHRpbWUKKyAgQ2hhckFycmF5IHJlYXNvbjsKKyAgVk5DU2VydmVyU1Q6OnF1ZXJ5UmVzdWx0IHFyID0gc2VydmVyLT5xdWVyeUNvbm5lY3Rpb24oc29jaywgdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFzb24uYnVmKTsKKyAgaWYgKHFyID09IFZOQ1NlcnZlclNUOjpQRU5ESU5HKQorICAgIHJldHVybjsKKworICAvLyAtIElmIHNlcnZlciByZXR1cm5zIEFDQ0VQVC9SRUpFQ1QgdGhlbiBwYXNzIHJlc3VsdCB0byBTQ29ubmVjdGlvbgorICBhcHByb3ZlQ29ubmVjdGlvbihxciA9PSBWTkNTZXJ2ZXJTVDo6QUNDRVBULCByZWFzb24uYnVmKTsKK30KKwordm9pZCBWTkNTQ29ubmVjdGlvblNUOjpjbGllbnRJbml0KGJvb2wgc2hhcmVkKQoreworICBsYXN0RXZlbnRUaW1lID0gdGltZSgwKTsKKyAgaWYgKHJmYjo6U2VydmVyOjphbHdheXNTaGFyZWQgfHwgcmV2ZXJzZUNvbm5lY3Rpb24pIHNoYXJlZCA9IHRydWU7CisgIGlmIChyZmI6OlNlcnZlcjo6bmV2ZXJTaGFyZWQpIHNoYXJlZCA9IGZhbHNlOworICBpZiAoIXNoYXJlZCkgeworICAgIGlmIChyZmI6OlNlcnZlcjo6ZGlzY29ubmVjdENsaWVudHMpIHsKKyAgICAgIC8vIC0gQ2xvc2UgYWxsIHRoZSBvdGhlciBjb25uZWN0ZWQgY2xpZW50cworICAgICAgdmxvZy5kZWJ1Zygibm9uLXNoYXJlZCBjb25uZWN0aW9uIC0gY2xvc2luZyBjbGllbnRzIik7CisgICAgICBzZXJ2ZXItPmNsb3NlQ2xpZW50cygiTm9uLXNoYXJlZCBjb25uZWN0aW9uIHJlcXVlc3RlZCIsIGdldFNvY2soKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIC0gUmVmdXNlIHRoaXMgY29ubmVjdGlvbiBpZiB0aGVyZSBhcmUgZXhpc3RpbmcgY2xpZW50cywgaW4gYWRkaXRpb24gdG8KKyAgICAgIC8vIHRoaXMgb25lCisgICAgICBpZiAoc2VydmVyLT5hdXRoQ2xpZW50Q291bnQoKSA+IDEpIHsKKyAgICAgICAgY2xvc2UoIlNlcnZlciBpcyBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisgIFNDb25uZWN0aW9uOjpjbGllbnRJbml0KHNoYXJlZCk7Cit9CisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6c2V0UGl4ZWxGb3JtYXQoY29uc3QgUGl4ZWxGb3JtYXQmIHBmKQoreworICBTQ29ubmVjdGlvbjo6c2V0UGl4ZWxGb3JtYXQocGYpOworICBjaGFyIGJ1ZmZlclsyNTZdOworICBwZi5wcmludChidWZmZXIsIDI1Nik7CisgIHZsb2cuaW5mbygiQ2xpZW50IHBpeGVsIGZvcm1hdCAlcyIsIGJ1ZmZlcik7CisgIGltYWdlX2dldHRlci5pbml0KHNlcnZlci0+cGIsIHBmLCB3cml0ZXIoKSk7CisgIHNldEN1cnNvcigpOworfQorCit2b2lkIFZOQ1NDb25uZWN0aW9uU1Q6OnBvaW50ZXJFdmVudChjb25zdCBQb2ludCYgcG9zLCBpbnQgYnV0dG9uTWFzaykKK3sKKyAgcG9pbnRlckV2ZW50VGltZSA9IGxhc3RFdmVudFRpbWUgPSB0aW1lKDApOworICBzZXJ2ZXItPmxhc3RVc2VySW5wdXRUaW1lID0gbGFzdEV2ZW50VGltZTsKKyAgaWYgKCEoYWNjZXNzUmlnaHRzICYgQWNjZXNzUHRyRXZlbnRzKSkgcmV0dXJuOworICBpZiAoIXJmYjo6U2VydmVyOjphY2NlcHRQb2ludGVyRXZlbnRzKSByZXR1cm47CisgIGlmICghc2VydmVyLT5wb2ludGVyQ2xpZW50IHx8IHNlcnZlci0+cG9pbnRlckNsaWVudCA9PSB0aGlzKSB7CisgICAgcG9pbnRlckV2ZW50UG9zID0gcG9zOworICAgIGlmIChidXR0b25NYXNrKQorICAgICAgc2VydmVyLT5wb2ludGVyQ2xpZW50ID0gdGhpczsKKyAgICBlbHNlCisgICAgICBzZXJ2ZXItPnBvaW50ZXJDbGllbnQgPSAwOworICAgIHNlcnZlci0+ZGVza3RvcC0+cG9pbnRlckV2ZW50KHBvaW50ZXJFdmVudFBvcywgYnV0dG9uTWFzayk7CisgIH0KK30KKworCitjbGFzcyBWTkNTQ29ubmVjdGlvblNUU2hpZnRQcmVzc2VyIHsKK3B1YmxpYzoKKyAgVk5DU0Nvbm5lY3Rpb25TVFNoaWZ0UHJlc3NlcihTRGVza3RvcCogZGVza3RvcF8pCisgICAgOiBkZXNrdG9wKGRlc2t0b3BfKSwgcHJlc3NlZChmYWxzZSkge30KKyAgflZOQ1NDb25uZWN0aW9uU1RTaGlmdFByZXNzZXIoKSB7CisgICAgaWYgKHByZXNzZWQpIHsgZGVza3RvcC0+a2V5RXZlbnQoWEtfU2hpZnRfTCwgZmFsc2UpOyB9CisgIH0KKyAgdm9pZCBwcmVzcygpIHsKKyAgICBkZXNrdG9wLT5rZXlFdmVudChYS19TaGlmdF9MLCB0cnVlKTsKKyAgICBwcmVzc2VkID0gdHJ1ZTsKKyAgfQorICBTRGVza3RvcCogZGVza3RvcDsKKyAgYm9vbCBwcmVzc2VkOworfTsKKworLy8ga2V5RXZlbnQoKSAtIHJlY29yZCBpbiB0aGUgcHJlc3NlZEtleXMgd2hpY2gga2V5cyB3ZXJlIHByZXNzZWQuICBBbGxvdworLy8gbXVsdGlwbGUgZG93biBldmVudHMgKGZvciBhdXRvcmVwZWF0KSwgYnV0IG9ubHkgYWxsb3cgYSBzaW5nbGUgdXAgZXZlbnQuCit2b2lkIFZOQ1NDb25uZWN0aW9uU1Q6OmtleUV2ZW50KHJkcjo6VTMyIGtleSwgYm9vbCBkb3duKSB7CisgIGxhc3RFdmVudFRpbWUgPSB0aW1lKDApOworICBzZXJ2ZXItPmxhc3RVc2VySW5wdXRUaW1lID0gbGFzdEV2ZW50VGltZTsKKyAgaWYgKCEoYWNjZXNzUmlnaHRzICYgQWNjZXNzS2V5RXZlbnRzKSkgcmV0dXJuOworICBpZiAoIXJmYjo6U2VydmVyOjphY2NlcHRLZXlFdmVudHMpIHJldHVybjsKKworICAvLyBSZW1hcCB0aGUga2V5IGlmIHJlcXVpcmVkCisgIGlmIChzZXJ2ZXItPmtleVJlbWFwcGVyKQorICAgIGtleSA9IHNlcnZlci0+a2V5UmVtYXBwZXItPnJlbWFwS2V5KGtleSk7CisKKyAgLy8gVHVybiBJU09fTGVmdF9UYWIgaW50byBzaGlmdGVkIFRhYi4KKyAgVk5DU0Nvbm5lY3Rpb25TVFNoaWZ0UHJlc3NlciBzaGlmdFByZXNzZXIoc2VydmVyLT5kZXNrdG9wKTsKKyAgaWYgKGtleSA9PSBYS19JU09fTGVmdF9UYWIpIHsKKyAgICBpZiAocHJlc3NlZEtleXMuZmluZChYS19TaGlmdF9MKSA9PSBwcmVzc2VkS2V5cy5lbmQoKSAmJgorICAgICAgICBwcmVzc2VkS2V5cy5maW5kKFhLX1NoaWZ0X1IpID09IHByZXNzZWRLZXlzLmVuZCgpKQorICAgICAgc2hpZnRQcmVzc2VyLnByZXNzKCk7CisgICAga2V5ID0gWEtfVGFiOworICB9CisKKyAgaWYgKGRvd24pIHsKKyAgICBwcmVzc2VkS2V5cy5pbnNlcnQoa2V5KTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIXByZXNzZWRLZXlzLmVyYXNlKGtleSkpIHJldHVybjsKKyAgfQorICBzZXJ2ZXItPmRlc2t0b3AtPmtleUV2ZW50KGtleSwgZG93bik7Cit9CisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6Y2xpZW50Q3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pCit7CisgIGlmICghKGFjY2Vzc1JpZ2h0cyAmIEFjY2Vzc0N1dFRleHQpKSByZXR1cm47CisgIGlmICghcmZiOjpTZXJ2ZXI6OmFjY2VwdEN1dFRleHQpIHJldHVybjsKKyAgc2VydmVyLT5kZXNrdG9wLT5jbGllbnRDdXRUZXh0KHN0ciwgbGVuKTsKK30KKwordm9pZCBWTkNTQ29ubmVjdGlvblNUOjpmcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoY29uc3QgUmVjdCYgcixib29sIGluY3JlbWVudGFsKQoreworICBpZiAoIShhY2Nlc3NSaWdodHMgJiBBY2Nlc3NWaWV3KSkgcmV0dXJuOworCisgIFNDb25uZWN0aW9uOjpmcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QociwgaW5jcmVtZW50YWwpOworCisgIFJlZ2lvbiByZXFSZ24ocik7CisgIHJlcXVlc3RlZC5hc3NpZ25fdW5pb24ocmVxUmduKTsKKworICBpZiAoIWluY3JlbWVudGFsKSB7CisgICAgLy8gTm9uLWluY3JlbWVudGFsIHVwZGF0ZSAtIHRyZWF0IGFzIGlmIGFyZWEgcmVxdWVzdGVkIGhhcyBjaGFuZ2VkCisgICAgdXBkYXRlcy5hZGRfY2hhbmdlZChyZXFSZ24pOworICAgIHNlcnZlci0+Y29tcGFyZXItPmFkZF9jaGFuZ2VkKHJlcVJnbik7CisgIH0KKworICB3cml0ZUZyYW1lYnVmZmVyVXBkYXRlKCk7Cit9CisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6c2V0SW5pdGlhbENvbG91ck1hcCgpCit7CisgIHNldENvbG91ck1hcEVudHJpZXMoMCwgMCk7Cit9CisKKy8vIHN1cHBvcnRzTG9jYWxDdXJzb3IoKSBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHN0YXR1cyBvZgorLy8gY3Auc3VwcG9ydHNMb2NhbEN1cnNvciBoYXMgY2hhbmdlZC4gIElmIHRoZSBjbGllbnQgZG9lcyBub3cgc3VwcG9ydCBsb2NhbAorLy8gY3Vyc29yLCB3ZSBtYWtlIHN1cmUgdGhhdCB0aGUgb2xkIHNlcnZlci1zaWRlIHJlbmRlcmVkIGN1cnNvciBpcyBjbGVhbmVkIHVwCisvLyBhbmQgdGhlIGN1cnNvciBpcyBzZW50IHRvIHRoZSBjbGllbnQuCisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6c3VwcG9ydHNMb2NhbEN1cnNvcigpCit7CisgIGlmIChjcC5zdXBwb3J0c0xvY2FsQ3Vyc29yIHx8IGNwLnN1cHBvcnRzTG9jYWxYQ3Vyc29yKSB7CisgICAgcmVtb3ZlUmVuZGVyZWRDdXJzb3IgPSB0cnVlOworICAgIGRyYXdSZW5kZXJlZEN1cnNvciA9IGZhbHNlOworICAgIHNldEN1cnNvcigpOworICB9Cit9CisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6d3JpdGVTZXRDdXJzb3JDYWxsYmFjaygpCit7CisgIGlmIChjcC5zdXBwb3J0c0xvY2FsWEN1cnNvcikgeworICAgIFBpeGVsIHBpeDAsIHBpeDE7CisgICAgcmRyOjpVOEFycmF5IGJpdG1hcChzZXJ2ZXItPmN1cnNvci5nZXRCaXRtYXAoJnBpeDAsICZwaXgxKSk7CisgICAgaWYgKGJpdG1hcC5idWYpIHsKKyAgICAgIC8vIFRoZSBjbGllbnQgc3VwcG9ydHMgWEN1cnNvciBhbmQgdGhlIGN1cnNvciBvbmx5IGhhcyB0d28KKyAgICAgIC8vIGNvbG9ycy4gVXNlIHRoZSBYQ3Vyc29yIGVuY29kaW5nLgorICAgICAgd3JpdGVyKCktPndyaXRlU2V0WEN1cnNvcihzZXJ2ZXItPmN1cnNvci53aWR0aCgpLAorCQkJCXNlcnZlci0+Y3Vyc29yLmhlaWdodCgpLAorCQkJCXNlcnZlci0+Y3Vyc29yLmhvdHNwb3QueCwKKwkJCQlzZXJ2ZXItPmN1cnNvci5ob3RzcG90LnksCisJCQkJYml0bWFwLmJ1Ziwgc2VydmVyLT5jdXJzb3IubWFzay5idWYpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAvLyBNb3JlIHRoYW4gdHdvIGNvbG9ycworICAgICAgaWYgKCFjcC5zdXBwb3J0c0xvY2FsQ3Vyc29yKSB7CisJLy8gRklYTUU6IFdlIGNvdWxkIHJlZHVjZSB0byB0d28gY29sb3JzLiAKKwl2bG9nLmluZm8oIlVuYWJsZSB0byBzZW5kIG11bHRpY29sb3IgY3Vyc29yOiBSaWNoQ3Vyc29yIG5vdCBzdXBwb3J0ZWQgYnkgY2xpZW50Iik7CisJcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFVzZSBSaWNoQ3Vyc29yCisgIHJkcjo6VTgqIHRyYW5zRGF0YSA9IHdyaXRlcigpLT5nZXRJbWFnZUJ1ZihzZXJ2ZXItPmN1cnNvci5hcmVhKCkpOworICBpbWFnZV9nZXR0ZXIudHJhbnNsYXRlUGl4ZWxzKHNlcnZlci0+Y3Vyc29yLmRhdGEsIHRyYW5zRGF0YSwKKwkJCSAgICAgICBzZXJ2ZXItPmN1cnNvci5hcmVhKCkpOworICB3cml0ZXIoKS0+d3JpdGVTZXRDdXJzb3Ioc2VydmVyLT5jdXJzb3Iud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci0+Y3Vyc29yLmhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLT5jdXJzb3IuaG90c3BvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zRGF0YSwgc2VydmVyLT5jdXJzb3IubWFzay5idWYpOworfQorCisKK3ZvaWQgVk5DU0Nvbm5lY3Rpb25TVDo6d3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZSgpCit7CisgIGlmIChzdGF0ZSgpICE9IFJGQlNUQVRFX05PUk1BTCB8fCByZXF1ZXN0ZWQuaXNfZW1wdHkoKSkgcmV0dXJuOworCisgIHNlcnZlci0+Y2hlY2tVcGRhdGUoKTsKKworICAvLyBJZiB0aGUgcHJldmlvdXMgcG9zaXRpb24gb2YgdGhlIHJlbmRlcmVkIGN1cnNvciBvdmVybGFwcyB0aGUgc291cmNlIG9mIHRoZQorICAvLyBjb3B5LCB0aGVuIHdoZW4gdGhlIGNvcHkgaGFwcGVucyB0aGUgY29ycmVzcG9uZGluZyByZWN0YW5nbGUgaW4gdGhlCisgIC8vIGRlc3RpbmF0aW9uIHdpbGwgYmUgd3JvbmcsIHNvIGFkZCBpdCB0byB0aGUgY2hhbmdlZCByZWdpb24uCisKKyAgaWYgKCF1cGRhdGVzLmdldF9jb3BpZWQoKS5pc19lbXB0eSgpICYmICFyZW5kZXJlZEN1cnNvclJlY3QuaXNfZW1wdHkoKSkgeworICAgIFJlY3QgYm9ndXNDb3BpZWRDdXJzb3IgPSAocmVuZGVyZWRDdXJzb3JSZWN0LnRyYW5zbGF0ZSh1cGRhdGVzLmdldF9kZWx0YSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyc2VjdChzZXJ2ZXItPnBiLT5nZXRSZWN0KCkpKTsKKyAgICBpZiAoIXVwZGF0ZXMuZ2V0X2NvcGllZCgpLmludGVyc2VjdChib2d1c0NvcGllZEN1cnNvcikuaXNfZW1wdHkoKSkgeworICAgICAgdXBkYXRlcy5hZGRfY2hhbmdlZChib2d1c0NvcGllZEN1cnNvcik7CisgICAgfQorICB9CisKKyAgLy8gSWYgd2UgbmVlZCB0byByZW1vdmUgdGhlIG9sZCByZW5kZXJlZCBjdXJzb3IsIGp1c3QgYWRkIHRoZSByZWN0YW5nbGUgdG8KKyAgLy8gdGhlIGNoYW5nZWQgcmVnaW9uLgorCisgIGlmIChyZW1vdmVSZW5kZXJlZEN1cnNvcikgeworICAgIHVwZGF0ZXMuYWRkX2NoYW5nZWQocmVuZGVyZWRDdXJzb3JSZWN0KTsKKyAgICByZW5kZXJlZEN1cnNvclJlY3QuY2xlYXIoKTsKKyAgICByZW1vdmVSZW5kZXJlZEN1cnNvciA9IGZhbHNlOworICB9CisKKyAgLy8gUmV0dXJuIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2VuZCB0aGUgY2xpZW50LgorCisgIGlmICh1cGRhdGVzLmlzX2VtcHR5KCkgJiYgIXdyaXRlcigpLT5uZWVkRmFrZVVwZGF0ZSgpICYmICFkcmF3UmVuZGVyZWRDdXJzb3IpCisgICAgcmV0dXJuOworCisgIC8vIElmIHRoZSBjbGllbnQgbmVlZHMgYSBzZXJ2ZXItc2lkZSByZW5kZXJlZCBjdXJzb3IsIHdvcmsgb3V0IHRoZSBjdXJzb3IKKyAgLy8gcmVjdGFuZ2xlLiAgSWYgaXQncyBlbXB0eSB0aGVuIGRvbid0IGJvdGhlciBkcmF3aW5nIGl0LCBidXQgaWYgaXQgb3ZlcmxhcHMKKyAgLy8gd2l0aCB0aGUgdXBkYXRlIHJlZ2lvbiwgd2UgbmVlZCB0byBkcmF3IHRoZSByZW5kZXJlZCBjdXJzb3IgcmVnYXJkbGVzcyBvZgorICAvLyB3aGV0aGVyIGl0IGhhcyBjaGFuZ2VkLgorCisgIGlmIChuZWVkUmVuZGVyZWRDdXJzb3IoKSkgeworICAgIHJlbmRlcmVkQ3Vyc29yUmVjdAorICAgICAgPSAoc2VydmVyLT5yZW5kZXJlZEN1cnNvci5nZXRSZWN0KHNlcnZlci0+cmVuZGVyZWRDdXJzb3JUTCkKKyAgICAgICAgIC5pbnRlcnNlY3QocmVxdWVzdGVkLmdldF9ib3VuZGluZ19yZWN0KCkpKTsKKworICAgIGlmIChyZW5kZXJlZEN1cnNvclJlY3QuaXNfZW1wdHkoKSkgeworICAgICAgZHJhd1JlbmRlcmVkQ3Vyc29yID0gZmFsc2U7CisgICAgfSBlbHNlIGlmICghdXBkYXRlcy5nZXRfY2hhbmdlZCgpLnVuaW9uXyh1cGRhdGVzLmdldF9jb3BpZWQoKSkKKyAgICAgICAgICAgICAgIC5pbnRlcnNlY3QocmVuZGVyZWRDdXJzb3JSZWN0KS5pc19lbXB0eSgpKSB7CisgICAgICBkcmF3UmVuZGVyZWRDdXJzb3IgPSB0cnVlOworICAgIH0KKworICAgIC8vIFdlIGNvdWxkIHJlbW92ZSB0aGUgbmV3IGN1cnNvciByZWN0IGZyb20gdXBkYXRlcyBoZXJlLiAgSXQncyBub3QgY2xlYXIKKyAgICAvLyB3aGV0aGVyIHRoaXMgaXMgd29ydGggaXQuICBJZiB3ZSBkbyByZW1vdmUgaXQsIHRoZW4gd2Ugd29uJ3QgZHJhdyBvdmVyCisgICAgLy8gdGhlIHNhbWUgYml0IG9mIHNjcmVlbiB0d2ljZSwgYnV0IHdlIGhhdmUgdGhlIG92ZXJoZWFkIG9mIGEgbW9yZSBjb21wbGV4CisgICAgLy8gcmVnaW9uLgorCisgICAgLy9pZiAoZHJhd1JlbmRlcmVkQ3Vyc29yKQorICAgIC8vICB1cGRhdGVzLnN1YnRyYWN0KHJlbmRlcmVkQ3Vyc29yUmVjdCk7CisgIH0KKworICBVcGRhdGVJbmZvIHVwZGF0ZTsKKyAgdXBkYXRlcy5lbmFibGVfY29weXJlY3QoY3AudXNlQ29weVJlY3QpOworICB1cGRhdGVzLmdldFVwZGF0ZUluZm8oJnVwZGF0ZSwgcmVxdWVzdGVkKTsKKyAgaWYgKCF1cGRhdGUuaXNfZW1wdHkoKSB8fCB3cml0ZXIoKS0+bmVlZEZha2VVcGRhdGUoKSB8fCBkcmF3UmVuZGVyZWRDdXJzb3IpIHsKKyAgICAvLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgcmVjdGFuZ2xlcy4gVGlnaHQgZW5jb2RlciBtYWtlcyB0aGUgdGhpbmdzIG1vcmUKKyAgICAvLyBjb21wbGljYXRlZCBhcyBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgUmVhbFZOQy4KKyAgICB3cml0ZXIoKS0+c2V0dXBDdXJyZW50RW5jb2RlcigpOworICAgIGludCBuUmVjdHMgPSB1cGRhdGUuY29waWVkLm51bVJlY3RzKCkgKyAoZHJhd1JlbmRlcmVkQ3Vyc29yID8gMSA6IDApOworICAgIHN0ZDo6dmVjdG9yPFJlY3Q+IHJlY3RzOworICAgIHN0ZDo6dmVjdG9yPFJlY3Q+Ojpjb25zdF9pdGVyYXRvciBpOworICAgIHVwZGF0ZS5jaGFuZ2VkLmdldF9yZWN0cygmcmVjdHMpOworICAgIGZvciAoaSA9IHJlY3RzLmJlZ2luKCk7IGkgIT0gcmVjdHMuZW5kKCk7IGkrKykgeworICAgICAgaWYgKGktPndpZHRoKCkgJiYgaS0+aGVpZ2h0KCkpCisJblJlY3RzICs9IHdyaXRlcigpLT5nZXROdW1SZWN0cygqaSk7CisgICAgfQorICAgIAorICAgIHdyaXRlcigpLT53cml0ZUZyYW1lYnVmZmVyVXBkYXRlU3RhcnQoblJlY3RzKTsKKyAgICBSZWdpb24gdXBkYXRlZFJlZ2lvbjsKKyAgICB3cml0ZXIoKS0+d3JpdGVSZWN0cyh1cGRhdGUsICZpbWFnZV9nZXR0ZXIsICZ1cGRhdGVkUmVnaW9uKTsKKyAgICB1cGRhdGVzLnN1YnRyYWN0KHVwZGF0ZWRSZWdpb24pOworICAgIGlmIChkcmF3UmVuZGVyZWRDdXJzb3IpCisgICAgICB3cml0ZVJlbmRlcmVkQ3Vyc29yUmVjdCgpOworICAgIHdyaXRlcigpLT53cml0ZUZyYW1lYnVmZmVyVXBkYXRlRW5kKCk7CisgICAgcmVxdWVzdGVkLmNsZWFyKCk7CisgIH0KK30KKworCisvLyB3cml0ZVJlbmRlcmVkQ3Vyc29yUmVjdCgpIHdyaXRlcyBhIHNpbmdsZSByZWN0YW5nbGUgZHJhd2luZyB0aGUgcmVuZGVyZWQKKy8vIGN1cnNvciBvbiB0aGUgY2xpZW50LgorCit2b2lkIFZOQ1NDb25uZWN0aW9uU1Q6OndyaXRlUmVuZGVyZWRDdXJzb3JSZWN0KCkKK3sKKyAgaW1hZ2VfZ2V0dGVyLnNldFBpeGVsQnVmZmVyKCZzZXJ2ZXItPnJlbmRlcmVkQ3Vyc29yKTsKKyAgaW1hZ2VfZ2V0dGVyLnNldE9mZnNldChzZXJ2ZXItPnJlbmRlcmVkQ3Vyc29yVEwpOworCisgIFJlY3QgYWN0dWFsOworICB3cml0ZXIoKS0+d3JpdGVSZWN0KHJlbmRlcmVkQ3Vyc29yUmVjdCwgJmltYWdlX2dldHRlciwgJmFjdHVhbCk7CisKKyAgaW1hZ2VfZ2V0dGVyLnNldFBpeGVsQnVmZmVyKHNlcnZlci0+cGIpOworICBpbWFnZV9nZXR0ZXIuc2V0T2Zmc2V0KFBvaW50KDAsMCkpOworCisgIGRyYXdSZW5kZXJlZEN1cnNvciA9IGZhbHNlOworfQorCit2b2lkIFZOQ1NDb25uZWN0aW9uU1Q6OnNldENvbG91ck1hcEVudHJpZXMoaW50IGZpcnN0Q29sb3VyLCBpbnQgbkNvbG91cnMpCit7CisgIGlmICghcmVhZHlGb3JTZXRDb2xvdXJNYXBFbnRyaWVzKSByZXR1cm47CisgIGlmIChzZXJ2ZXItPnBiLT5nZXRQRigpLnRydWVDb2xvdXIpIHJldHVybjsKKworICBpbWFnZV9nZXR0ZXIuc2V0Q29sb3VyTWFwRW50cmllcyhmaXJzdENvbG91ciwgbkNvbG91cnMsIHdyaXRlcigpKTsKKworICBpZiAoY3AucGYoKS50cnVlQ29sb3VyKSB7CisgICAgdXBkYXRlcy5hZGRfY2hhbmdlZChzZXJ2ZXItPnBiLT5nZXRSZWN0KCkpOworICB9Cit9CisKKworLy8gc2V0Q3Vyc29yKCkgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjdXJzb3IgaGFzIGNoYW5nZWQgc2hhcGUgb3IgcGl4ZWwgZm9ybWF0LgorLy8gSWYgdGhlIGNsaWVudCBzdXBwb3J0cyBsb2NhbCBjdXJzb3IgdGhlbiBpdCB3aWxsIGFycmFuZ2UgZm9yIHRoZSBjdXJzb3IgdG8KKy8vIGJlIHNlbnQgdG8gdGhlIGNsaWVudC4KKwordm9pZCBWTkNTQ29ubmVjdGlvblNUOjpzZXRDdXJzb3IoKQoreworICBpZiAoc3RhdGUoKSAhPSBSRkJTVEFURV9OT1JNQUwgfHwgIWNwLnN1cHBvcnRzTG9jYWxDdXJzb3IpIHJldHVybjsKKyAgd3JpdGVyKCktPmN1cnNvckNoYW5nZSh0aGlzKTsKKyAgaWYgKHdyaXRlcigpLT5uZWVkRmFrZVVwZGF0ZSgpKQorICAgIHdyaXRlRnJhbWVidWZmZXJVcGRhdGUoKTsKK30KKwordm9pZCBWTkNTQ29ubmVjdGlvblNUOjpzZXRTb2NrZXRUaW1lb3V0cygpCit7CisgIGludCB0aW1lb3V0bXMgPSByZmI6OlNlcnZlcjo6Y2xpZW50V2FpdFRpbWVNaWxsaXM7CisgIHNvb25lc3RUaW1lb3V0KCZ0aW1lb3V0bXMsIHNlY3NUb01pbGxpcyhyZmI6OlNlcnZlcjo6aWRsZVRpbWVvdXQpKTsKKyAgaWYgKHRpbWVvdXRtcyA9PSAwKQorICAgIHRpbWVvdXRtcyA9IC0xOworICBzb2NrLT5pblN0cmVhbSgpLnNldFRpbWVvdXQodGltZW91dG1zKTsKKyAgc29jay0+b3V0U3RyZWFtKCkuc2V0VGltZW91dCh0aW1lb3V0bXMpOworfQorCitjaGFyKiBWTkNTQ29ubmVjdGlvblNUOjpnZXRTdGFydFRpbWUoKQoreworICBjaGFyKiByZXN1bHQgPSBjdGltZSgmc3RhcnRUaW1lKTsKKyAgcmVzdWx0WzI0XSA9ICdcMCc7CisgIHJldHVybiByZXN1bHQ7IAorfQorCit2b2lkIFZOQ1NDb25uZWN0aW9uU1Q6OnNldFN0YXR1cyhpbnQgc3RhdHVzKQoreworICBzd2l0Y2ggKHN0YXR1cykgeworICBjYXNlIDA6CisgICAgYWNjZXNzUmlnaHRzID0gYWNjZXNzUmlnaHRzIHwgQWNjZXNzUHRyRXZlbnRzIHwgQWNjZXNzS2V5RXZlbnRzIHwgQWNjZXNzVmlldzsKKyAgICBicmVhazsKKyAgY2FzZSAxOgorICAgIGFjY2Vzc1JpZ2h0cyA9IGFjY2Vzc1JpZ2h0cyAmICEoQWNjZXNzUHRyRXZlbnRzIHwgQWNjZXNzS2V5RXZlbnRzKSB8IEFjY2Vzc1ZpZXc7CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBhY2Nlc3NSaWdodHMgPSBhY2Nlc3NSaWdodHMgJiAhKEFjY2Vzc1B0ckV2ZW50cyB8IEFjY2Vzc0tleUV2ZW50cyB8IEFjY2Vzc1ZpZXcpOworICAgIGJyZWFrOworICB9CisgIGZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdChzZXJ2ZXItPnBiLT5nZXRSZWN0KCksIGZhbHNlKTsKK30KK2ludCBWTkNTQ29ubmVjdGlvblNUOjpnZXRTdGF0dXMoKQoreworICBpZiAoKGFjY2Vzc1JpZ2h0cyAmIChBY2Nlc3NQdHJFdmVudHMgfCBBY2Nlc3NLZXlFdmVudHMgfCBBY2Nlc3NWaWV3KSkgPT0gMHgwMDA3KQorICAgIHJldHVybiAwOworICBpZiAoKGFjY2Vzc1JpZ2h0cyAmIChBY2Nlc3NQdHJFdmVudHMgfCBBY2Nlc3NLZXlFdmVudHMgfCBBY2Nlc3NWaWV3KSkgPT0gMHgwMDAxKQorICAgIHJldHVybiAxOworICBpZiAoKGFjY2Vzc1JpZ2h0cyAmIChBY2Nlc3NQdHJFdmVudHMgfCBBY2Nlc3NLZXlFdmVudHMgfCBBY2Nlc3NWaWV3KSkgPT0gMHgwMDAwKQorICAgIHJldHVybiAyOworICByZXR1cm4gNDsKK30KKworYm9vbCBWTkNTQ29ubmVjdGlvblNUOjpwcm9jZXNzRlRNc2coaW50IHR5cGUpCit7CisgIGlmIChtX3BGaWxlVHJhbnNmZXIgIT0gTlVMTCkgCisgICAgcmV0dXJuIG1fcEZpbGVUcmFuc2Zlci0+cHJvY2Vzc01lc3NhZ2VzKHR5cGUpOworICBlbHNlIAorICAgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvVk5DU0Nvbm5lY3Rpb25TVC5oIGIvY29tbW9uL3JmYi9WTkNTQ29ubmVjdGlvblNULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0Mjk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvVk5DU0Nvbm5lY3Rpb25TVC5oCkBAIC0wLDAgKzEsMTc2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vCisvLyBWTkNTQ29ubmVjdGlvblNUIGlzIG91ciBkZXJpdmVkIGNsYXNzIG9mIFNDb25uZWN0aW9uIGZvciBWTkNTZXJ2ZXJTVCAtIHRoZXJlCisvLyBpcyBvbmUgZm9yIGVhY2ggY29ubmVjdGVkIGNsaWVudC4gIFdlIHRoaW5rIG9mIFZOQ1NDb25uZWN0aW9uU1QgYXMgcGFydCBvZgorLy8gdGhlIFZOQ1NlcnZlclNUIGltcGxlbWVudGF0aW9uLCBzbyBpdHMgbWV0aG9kcyBhcmUgYWxsb3dlZCBmdWxsIGFjY2VzcyB0bworLy8gbWVtYmVycyBvZiBWTkNTZXJ2ZXJTVC4KKy8vCisKKyNpZm5kZWYgX19SRkJfVk5DU0NPTk5FQ1RJT05TVF9IX18KKyNkZWZpbmUgX19SRkJfVk5DU0NPTk5FQ1RJT05TVF9IX18KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxyZmIvU0Nvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxyZmIvU01zZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9UcmFuc0ltYWdlR2V0dGVyLmg+CisjaW5jbHVkZSA8cmZiL1ZOQ1NlcnZlclNULmg+CisjaW5jbHVkZSA8cmZiL1NGaWxlVHJhbnNmZXIuaD4KKworbmFtZXNwYWNlIHJmYiB7CisgIGNsYXNzIFZOQ1NDb25uZWN0aW9uU1QgOiBwdWJsaWMgU0Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV3JpdGVTZXRDdXJzb3JDYWxsYmFjayB7CisgIHB1YmxpYzoKKyAgICBWTkNTQ29ubmVjdGlvblNUKFZOQ1NlcnZlclNUKiBzZXJ2ZXJfLCBuZXR3b3JrOjpTb2NrZXQqIHMsIGJvb2wgcmV2ZXJzZSk7CisgICAgdmlydHVhbCB+Vk5DU0Nvbm5lY3Rpb25TVCgpOworCisgICAgLy8gTWV0aG9kcyBjYWxsZWQgZnJvbSBWTkNTZXJ2ZXJTVC4gIE5vbmUgb2YgdGhlc2UgbWV0aG9kcyBldmVyIGtub3dpbmdseQorICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbi4KKworICAgIC8vIFVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCB0aGUgU0Nvbm5lY3Rpb25TVCBtYXkgbm90IGJlIHZhbGlkIGFmdGVyIGFueSBvZgorICAgIC8vIHRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCwgc2luY2UgdGhleSBjYXRjaCBleGNlcHRpb25zIGFuZCBtYXkgaGF2ZQorICAgIC8vIGNhbGxlZCBjbG9zZSgpIHdoaWNoIGRlbGV0ZXMgdGhlIG9iamVjdC4KKworICAgIC8vIGluaXQoKSBtdXN0IGJlIGNhbGxlZCB0byBpbml0aWFsaXNlIHRoZSBwcm90b2NvbC4gIElmIGl0IGZhaWxzIGl0CisgICAgLy8gcmV0dXJucyBmYWxzZSwgYW5kIGNsb3NlKCkgd2lsbCBoYXZlIGJlZW4gY2FsbGVkLgorICAgIGJvb2wgaW5pdCgpOworCisgICAgLy8gY2xvc2UoKSBzaHV0cyBkb3duIHRoZSBzb2NrZXQgdG8gdGhlIGNsaWVudCBhbmQgZGVsZXRlcyB0aGUKKyAgICAvLyBTQ29ubmVjdGlvblNUIG9iamVjdC4KKyAgICB2b2lkIGNsb3NlKGNvbnN0IGNoYXIqIHJlYXNvbik7CisKKyAgICAvLyBwcm9jZXNzTWVzc2FnZXMoKSBwcm9jZXNzZXMgaW5jb21pbmcgbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50LCBpbnZva2luZworICAgIC8vIHZhcmlvdXMgY2FsbGJhY2tzIGFzIGEgcmVzdWx0LiAgSXQgY29udGludWVzIHRvIHByb2Nlc3MgbWVzc2FnZXMgdW50aWwKKyAgICAvLyByZWFkaW5nIG1pZ2h0IGJsb2NrLiAgc2h1dGRvd24oKSB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgY29ubmVjdGlvbidzCisgICAgLy8gU29ja2V0IGlmIGFuIGVycm9yIG9jY3VycywgdmlhIHRoZSBjbG9zZSgpIGNhbGwuCisgICAgdm9pZCBwcm9jZXNzTWVzc2FnZXMoKTsKKworICAgIHZvaWQgd3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZU9yQ2xvc2UoKTsKKyAgICB2b2lkIHBpeGVsQnVmZmVyQ2hhbmdlKCk7CisgICAgdm9pZCBzZXRDb2xvdXJNYXBFbnRyaWVzT3JDbG9zZShpbnQgZmlyc3RDb2xvdXIsIGludCBuQ29sb3Vycyk7CisgICAgdm9pZCBiZWxsKCk7CisgICAgdm9pZCBzZXJ2ZXJDdXRUZXh0KGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbik7CisgICAgdm9pZCBzZXRDdXJzb3JPckNsb3NlKCk7CisKKyAgICAvLyBjaGVja0lkbGVUaW1lb3V0KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWZ0IHVudGlsIHRoZQorICAgIC8vIGlkbGUgdGltZW91dCBleHBpcmVzLiAgSWYgaXQgaGFzIGV4cGlyZWQsIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBhbmQKKyAgICAvLyB6ZXJvIGlzIHJldHVybmVkLiAgWmVybyBpcyBhbHNvIHJldHVybmVkIGlmIHRoZXJlIGlzIG5vIGlkbGUgdGltZW91dC4KKyAgICBpbnQgY2hlY2tJZGxlVGltZW91dCgpOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIG5ldmVyIHRocm93IGV4Y2VwdGlvbnMgbm9yIGRvIHRoZXkgZXZlciBkZWxldGUgdGhlCisgICAgLy8gU0Nvbm5lY3Rpb25TVCBvYmplY3QuCisKKyAgICAvLyByZW5kZXJlZEN1cnNvckNoYW5nZSgpIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc2VydmVyLXNpZGUgcmVuZGVyZWQKKyAgICAvLyBjdXJzb3IgY2hhbmdlcyBzaGFwZSBvciBwb3NpdGlvbi4gIEl0IGVuc3VyZXMgdGhhdCB0aGUgbmV4dCB1cGRhdGUgd2lsbAorICAgIC8vIGNsZWFuIHVwIHRoZSBvbGQgcmVuZGVyZWQgY3Vyc29yIGFuZCBpZiBuZWNlc3NhcnkgZHJhdyB0aGUgbmV3IHJlbmRlcmVkCisgICAgLy8gY3Vyc29yLgorICAgIHZvaWQgcmVuZGVyZWRDdXJzb3JDaGFuZ2UoKTsKKworICAgIC8vIG5lZWRSZW5kZXJlZEN1cnNvcigpIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGNsaWVudCBuZWVkcyB0aGUgc2VydmVyLXNpZGUKKyAgICAvLyByZW5kZXJlZCBjdXJzb3IuICBUaGlzIG1heSBiZSBiZWNhdXNlIGl0IGRvZXMgbm90IHN1cHBvcnQgbG9jYWwgY3Vyc29yCisgICAgLy8gb3IgYmVjYXVzZSB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaGFzIG5vdCBiZWVuIHNldCBieSB0aGlzIGNsaWVudC4KKyAgICBib29sIG5lZWRSZW5kZXJlZEN1cnNvcigpOworCisgICAgbmV0d29yazo6U29ja2V0KiBnZXRTb2NrKCkgeyByZXR1cm4gc29jazsgfQorICAgIGJvb2wgcmVhZHlGb3JVcGRhdGUoKSB7IHJldHVybiAhcmVxdWVzdGVkLmlzX2VtcHR5KCk7IH0KKyAgICB2b2lkIGFkZF9jaGFuZ2VkKGNvbnN0IFJlZ2lvbiYgcmVnaW9uKSB7IHVwZGF0ZXMuYWRkX2NoYW5nZWQocmVnaW9uKTsgfQorICAgIHZvaWQgYWRkX2NvcGllZChjb25zdCBSZWdpb24mIGRlc3QsIGNvbnN0IFBvaW50JiBkZWx0YSkgeworICAgICAgdXBkYXRlcy5hZGRfY29waWVkKGRlc3QsIGRlbHRhKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBnZXRQZWVyRW5kcG9pbnQoKSBjb25zdCB7cmV0dXJuIHBlZXJFbmRwb2ludC5idWY7fQorCisgICAgLy8gYXBwcm92ZUNvbm5lY3Rpb25PckNsb3NlKCkgaXMgY2FsbGVkIHNvbWUgdGltZSBhZnRlcgorICAgIC8vIFZOQ1NlcnZlclNUOjpxdWVyeUNvbm5lY3Rpb24oKSBoYXMgcmV0dXJuZWQgd2l0aCBQRU5ESU5HIHRvIGFjY2VwdCBvcgorICAgIC8vIHJlamVjdCB0aGUgY29ubmVjdGlvbi4gIFRoZSBhY2NlcHQgYXJndW1lbnQgc2hvdWxkIGJlIHRydWUgZm9yCisgICAgLy8gYWNjZXB0YW5jZSwgb3IgZmFsc2UgZm9yIHJlamVjdGlvbiwgaW4gd2hpY2ggY2FzZSBhIHN0cmluZyByZWFzb24gbWF5CisgICAgLy8gYWxzbyBiZSBnaXZlbi4KKworICAgIHZvaWQgYXBwcm92ZUNvbm5lY3Rpb25PckNsb3NlKGJvb2wgYWNjZXB0LCBjb25zdCBjaGFyKiByZWFzb24pOworCisgICAgY2hhciogZ2V0U3RhcnRUaW1lKCk7CisKKyAgICB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKTsKKyAgICBpbnQgZ2V0U3RhdHVzKCk7CisKKyAgICBib29sIHByb2Nlc3NGVE1zZyhpbnQgdHlwZSk7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBTQ29ubmVjdGlvbiBjYWxsYmFja3MKKworICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGludm9rZWQgYXMgY2FsbGJhY2tzIGZyb20gcHJvY2Vzc01zZygpLiAgTm90ZSB0aGF0CisgICAgLy8gbm9uZSBvZiB0aGVzZSBtZXRob2RzIHNob3VsZCBjYWxsIGFueSBvZiB0aGUgYWJvdmUgbWV0aG9kcyB3aGljaCBtYXkKKyAgICAvLyBkZWxldGUgdGhlIFNDb25uZWN0aW9uU1Qgb2JqZWN0LgorCisgICAgdmlydHVhbCB2b2lkIGF1dGhTdWNjZXNzKCk7CisgICAgdmlydHVhbCB2b2lkIHF1ZXJ5Q29ubmVjdGlvbihjb25zdCBjaGFyKiB1c2VyTmFtZSk7CisgICAgdmlydHVhbCB2b2lkIGNsaWVudEluaXQoYm9vbCBzaGFyZWQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRQaXhlbEZvcm1hdChjb25zdCBQaXhlbEZvcm1hdCYgcGYpOworICAgIHZpcnR1YWwgdm9pZCBwb2ludGVyRXZlbnQoY29uc3QgUG9pbnQmIHBvcywgaW50IGJ1dHRvbk1hc2spOworICAgIHZpcnR1YWwgdm9pZCBrZXlFdmVudChyZHI6OlUzMiBrZXksIGJvb2wgZG93bik7CisgICAgdmlydHVhbCB2b2lkIGNsaWVudEN1dFRleHQoY29uc3QgY2hhciogc3RyLCBpbnQgbGVuKTsKKyAgICB2aXJ0dWFsIHZvaWQgZnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KGNvbnN0IFJlY3QmIHIsIGJvb2wgaW5jcmVtZW50YWwpOworICAgIHZpcnR1YWwgdm9pZCBzZXRJbml0aWFsQ29sb3VyTWFwKCk7CisgICAgdmlydHVhbCB2b2lkIHN1cHBvcnRzTG9jYWxDdXJzb3IoKTsKKworICAgIC8vIHNldEFjY2Vzc1JpZ2h0cygpIGFsbG93cyBhIHNlY3VyaXR5IHBhY2thZ2UgdG8gbGltaXQgdGhlIGFjY2VzcyByaWdodHMKKyAgICAvLyBvZiBhIFZOQ1NDb25uZWN0aW9TVCB0byB0aGUgc2VydmVyLiAgVGhlc2UgYWNjZXNzIHJpZ2h0cyBhcmUgYXBwbGllZAorICAgIC8vIHN1Y2ggdGhhdCB0aGUgYWN0dWFsIHJpZ2h0cyBncmFudGVkIGFyZSB0aGUgbWluaW11bSBvZiB0aGUgc2VydmVyJ3MKKyAgICAvLyBkZWZhdWx0IGFjY2VzcyBzZXR0aW5ncyBhbmQgdGhlIGNvbm5lY3Rpb24ncyBhY2Nlc3Mgc2V0dGluZ3MuCisgICAgdmlydHVhbCB2b2lkIHNldEFjY2Vzc1JpZ2h0cyhBY2Nlc3NSaWdodHMgYXIpIHthY2Nlc3NSaWdodHM9YXI7fQorCisgICAgLy8gV3JpdGVTZXRDdXJzb3JDYWxsYmFjaworICAgIHZpcnR1YWwgdm9pZCB3cml0ZVNldEN1cnNvckNhbGxiYWNrKCk7CisKKyAgICAvLyBJbnRlcm5hbCBtZXRob2RzCisKKyAgICAvLyB3cml0ZUZyYW1lYnVmZmVyVXBkYXRlKCkgYXR0ZW1wdHMgdG8gd3JpdGUgYSBmcmFtZWJ1ZmZlciB1cGRhdGUgdG8gdGhlCisgICAgLy8gY2xpZW50LgorCisgICAgdm9pZCB3cml0ZUZyYW1lYnVmZmVyVXBkYXRlKCk7CisKKyAgICB2b2lkIHdyaXRlUmVuZGVyZWRDdXJzb3JSZWN0KCk7CisgICAgdm9pZCBzZXRDb2xvdXJNYXBFbnRyaWVzKGludCBmaXJzdENvbG91ciwgaW50IG5Db2xvdXJzKTsKKyAgICB2b2lkIHNldEN1cnNvcigpOworICAgIHZvaWQgc2V0U29ja2V0VGltZW91dHMoKTsKKworICAgIG5ldHdvcms6OlNvY2tldCogc29jazsKKyAgICBDaGFyQXJyYXkgcGVlckVuZHBvaW50OworICAgIFZOQ1NlcnZlclNUKiBzZXJ2ZXI7CisgICAgU2ltcGxlVXBkYXRlVHJhY2tlciB1cGRhdGVzOworICAgIFRyYW5zSW1hZ2VHZXR0ZXIgaW1hZ2VfZ2V0dGVyOworICAgIFJlZ2lvbiByZXF1ZXN0ZWQ7CisgICAgYm9vbCBkcmF3UmVuZGVyZWRDdXJzb3IsIHJlbW92ZVJlbmRlcmVkQ3Vyc29yOworICAgIFJlY3QgcmVuZGVyZWRDdXJzb3JSZWN0OworCisgICAgc3RkOjpzZXQ8cmRyOjpVMzI+IHByZXNzZWRLZXlzOworCisgICAgdGltZV90IGxhc3RFdmVudFRpbWU7CisgICAgdGltZV90IHBvaW50ZXJFdmVudFRpbWU7CisgICAgUG9pbnQgcG9pbnRlckV2ZW50UG9zOworCisgICAgQWNjZXNzUmlnaHRzIGFjY2Vzc1JpZ2h0czsKKworICAgIENoYXJBcnJheSBjbG9zZVJlYXNvbjsKKyAgICB0aW1lX3Qgc3RhcnRUaW1lOworCisgICAgU0ZpbGVUcmFuc2ZlciAqbV9wRmlsZVRyYW5zZmVyOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL1ZOQ1NlcnZlci5oIGIvY29tbW9uL3JmYi9WTkNTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjBmYjBlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9WTkNTZXJ2ZXIuaApAQCAtMCwwICsxLDg2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gVk5DU2VydmVyIC0gYWJzdHJhY3QgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBSRkIgbGlicmFyeS4gIFRoZSBiYWNrLWVuZAorLy8gY29kZSBjYWxscyB0aGUgcmVsZXZhbnQgbWV0aG9kcyBhcyBhcHByb3ByaWF0ZS4KKworI2lmbmRlZiBfX1JGQl9WTkNTRVJWRVJfSF9fCisjZGVmaW5lIF9fUkZCX1ZOQ1NFUlZFUl9IX18KKworI2luY2x1ZGUgPHJmYi9VcGRhdGVUcmFja2VyLmg+CisjaW5jbHVkZSA8cmZiL1NTZWN1cml0eS5oPgorCituYW1lc3BhY2UgcmZiIHsKKworICBjbGFzcyBWTkNTZXJ2ZXIgOiBwdWJsaWMgVXBkYXRlVHJhY2tlciB7CisgIHB1YmxpYzoKKworICAgIC8vIHNldFBpeGVsQnVmZmVyKCkgdGVsbHMgdGhlIHNlcnZlciB0byB1c2UgdGhlIGdpdmVuIHBpeGVsIGJ1ZmZlci4gIElmCisgICAgLy8gdGhpcyBkaWZmZXJzIGluIHNpemUgZnJvbSB0aGUgcHJldmlvdXMgcGl4ZWwgYnVmZmVyLCB0aGlzIG1heSByZXN1bHQgaW4KKyAgICAvLyBwcm90b2NvbCBtZXNzYWdlcyBiZWluZyBzZW50LCBvciBjbGllbnRzIGJlaW5nIGRpc2Nvbm5lY3RlZC4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGl4ZWxCdWZmZXIoUGl4ZWxCdWZmZXIqIHBiKSA9IDA7CisKKyAgICAvLyBzZXRDb2xvdXJNYXBFbnRyaWVzKCkgdGVsbHMgdGhlIHNlcnZlciB0aGF0IHNvbWUgZW50cmllcyBpbiB0aGUgY29sb3VyCisgICAgLy8gbWFwIGhhdmUgY2hhbmdlZC4gIFRoZSBzZXJ2ZXIgd2lsbCByZXRyaWV2ZSB0aGVtIHZpYSB0aGUgUGl4ZWxCdWZmZXIncworICAgIC8vIENvbG91ck1hcCBvYmplY3QuICBUaGlzIG1heSByZXN1bHQgaW4gcHJvdG9jb2wgbWVzc2FnZXMgYmVpbmcgc2VudC4KKyAgICAvLyBJZiBuQ29sb3VycyBpcyAwLCB0aGlzIG1lYW5zIHRoZSByZXN0IG9mIHRoZSBjb2xvdXIgbWFwLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2xvdXJNYXBFbnRyaWVzKGludCBmaXJzdENvbG91cj0wLCBpbnQgbkNvbG91cnM9MCkgPSAwOworCisgICAgLy8gc2VydmVyQ3V0VGV4dCgpIHRlbGxzIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgY3V0IHRleHQgaGFzIGNoYW5nZWQuICBUaGlzCisgICAgLy8gd2lsbCBub3JtYWxseSBiZSBzZW50IHRvIGFsbCBjbGllbnRzLgorICAgIHZpcnR1YWwgdm9pZCBzZXJ2ZXJDdXRUZXh0KGNvbnN0IGNoYXIqIHN0ciwgaW50IGxlbikgPSAwOworCisgICAgLy8gYmVsbCgpIHRlbGxzIHRoZSBzZXJ2ZXIgdGhhdCBpdCBzaG91bGQgbWFrZSBhbGwgY2xpZW50cyBtYWtlIGEgYmVsbCBzb3VuZC4KKyAgICB2aXJ0dWFsIHZvaWQgYmVsbCgpID0gMDsKKworICAgIC8vIGNsaWVudHNSZWFkeUZvclVwZGF0ZSgpIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2xpZW50CisgICAgLy8gd2FpdGluZyBmb3IgYW4gdXBkYXRlLCBmYWxzZSBpZiBubyBjbGllbnRzIGFyZSByZWFkeS4KKyAgICB2aXJ0dWFsIGJvb2wgY2xpZW50c1JlYWR5Rm9yVXBkYXRlKCkgPSAwOworCisgICAgLy8gLSBDbG9zZSBhbGwgY3VycmVudGx5LWNvbm5lY3RlZCBjbGllbnRzLCBieSBjYWxsaW5nCisgICAgLy8gICB0aGVpciBjbG9zZSgpIG1ldGhvZCB3aXRoIHRoZSBzdXBwbGllZCByZWFzb24uCisgICAgdmlydHVhbCB2b2lkIGNsb3NlQ2xpZW50cyhjb25zdCBjaGFyKiByZWFzb24pID0gMDsKKworICAgIC8vIHRyeVVwZGF0ZSgpIGNhdXNlcyB0aGUgc2VydmVyIHRvIGF0dGVtcHQgdG8gc2VuZCB1cGRhdGVzIHRvIGFueSB3YWl0aW5nCisgICAgLy8gY2xpZW50cy4KKyAgICB2aXJ0dWFsIHZvaWQgdHJ5VXBkYXRlKCkgPSAwOworCisgICAgLy8gc2V0Q3Vyc29yKCkgdGVsbHMgdGhlIHNlcnZlciB0aGF0IHRoZSBjdXJzb3IgaGFzIGNoYW5nZWQuICBUaGUKKyAgICAvLyBjdXJzb3JEYXRhIGFyZ3VtZW50IGNvbnRhaW5zIHdpZHRoKmhlaWdodCBwaXhlbCB2YWx1ZXMgaW4gdGhlIHBpeGVsCisgICAgLy8gYnVmZmVyJ3MgZm9ybWF0LiAgVGhlIG1hc2sgYXJndW1lbnQgaXMgYSBiaXRtYXNrIHdpdGggYSAxLWJpdCBtZWFuaW5nCisgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgcGl4ZWwgaW4gY3Vyc29yRGF0YSBpcyB2YWxpZC4gIFRoZSBtYXNrIGNvbnNpc3RzIG9mCisgICAgLy8gbGVmdC10by1yaWdodCwgdG9wLXRvLWJvdHRvbSBzY2FubGluZXMsIHdoZXJlIGVhY2ggc2NhbmxpbmUgaXMgcGFkZGVkIHRvCisgICAgLy8gYSB3aG9sZSBudW1iZXIgb2YgYnl0ZXMgWyh3aWR0aCs3KS84XS4gIFdpdGhpbiBlYWNoIGJ5dGUgdGhlIG1vc3QKKyAgICAvLyBzaWduaWZpY2FudCBiaXQgcmVwcmVzZW50cyB0aGUgbGVmdG1vc3QgcGl4ZWwsIGFuZCB0aGUgYnl0ZXMgYXJlIHNpbXBseQorICAgIC8vIGluIGxlZnQtdG8tcmlnaHQgb3JkZXIuICBUaGUgc2VydmVyIHRha2VzIGl0cyBvd24gY29weSBvZiB0aGUgZGF0YSBpbgorICAgIC8vIGN1cnNvckRhdGEgYW5kIG1hc2suCisgICAgdmlydHVhbCB2b2lkIHNldEN1cnNvcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IFBvaW50JiBob3RzcG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY3Vyc29yRGF0YSwgdm9pZCogbWFzaykgPSAwOworCisgICAgLy8gc2V0Q3Vyc29yUG9zKCkgdGVsbHMgdGhlIHNlcnZlciB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDdXJzb3JQb3MoY29uc3QgUG9pbnQmIHApID0gMDsKKworICAgIC8vIHNldFNTZWN1cml0eUZhY3RvcnkoKSB0ZWxscyB0aGUgc2VydmVyIHdoaWNoIGZhY3RvcnkgdG8gdXNlIHdoZW4KKyAgICAvLyBhdHRlbXB0aW5nIHRvIGF1dGhlbnRpY2F0ZSBjb25uZWN0aW9ucy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0U1NlY3VyaXR5RmFjdG9yeShTU2VjdXJpdHlGYWN0b3J5KiBmKSA9IDA7CisKKyAgICAvLyBzZXROYW1lKCkgdGVsbHMgdGhlIHNlcnZlciB3aGF0IGRlc2t0b3AgdGl0bGUgdG8gc3VwcGx5IHRvIGNsaWVudHMKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSA9IDA7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvVk5DU2VydmVyU1QuY3h4IGIvY29tbW9uL3JmYi9WTkNTZXJ2ZXJTVC5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxOGZhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvVk5DU2VydmVyU1QuY3h4CkBAIC0wLDAgKzEsNTMxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSBTaW5nbGUtVGhyZWFkZWQgVk5DIFNlcnZlciBpbXBsZW1lbnRhdGlvbgorCisKKy8vIE5vdGUgYWJvdXQgaG93IHNvY2tldHMgZ2V0IGNsb3NlZDoKKy8vCisvLyBDbG9zaW5nIHNvY2tldHMgdG8gY2xpZW50cyBpcyBub24tdHJpdmlhbCBiZWNhdXNlIHRoZSBjb2RlIHdoaWNoIGNhbGxzCisvLyBWTkNTZXJ2ZXJTVCBtdXN0IGV4cGxpY2l0bHkga25vdyBhYm91dCBhbGwgdGhlIHNvY2tldHMgKHNvIHRoYXQgaXQgY2FuIGJsb2NrCisvLyBvbiB0aGVtIGFwcHJvcHJpYXRlbHkpLiAgSG93ZXZlciwgVk5DU2VydmVyU1QgbWF5IHdhbnQgdG8gY2xvc2UgY2xpZW50cyBmb3IKKy8vIGEgbnVtYmVyIG9mIHJlYXNvbnMsIGFuZCBmcm9tIGEgdmFyaWV0eSBvZiBlbnRyeSBwb2ludHMuICBUaGUgc2ltcGxlc3QgaXMKKy8vIHdoZW4gcHJvY2Vzc1NvY2tldEV2ZW50KCkgaXMgY2FsbGVkIGZvciBhIGNsaWVudCwgYW5kIHRoZSByZW1vdGUgZW5kIGhhcworLy8gY2xvc2VkIGl0cyBzb2NrZXQuICBBIG1vcmUgY29tcGxleCByZWFzb24gaXMgd2hlbiBwcm9jZXNzU29ja2V0RXZlbnQoKSBpcworLy8gY2FsbGVkIGZvciBhIGNsaWVudCB3aGljaCBoYXMganVzdCBzZW50IGEgQ2xpZW50SW5pdCB3aXRoIHRoZSBzaGFyZWQgZmxhZworLy8gc2V0IHRvIGZhbHNlIC0gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gY2xvc2UgYWxsIG90aGVyIGNsaWVudHMuICBZZXQgYW5vdGhlcgorLy8gcmVhc29uIGZvciBkaXNjb25uZWN0aW5nIGNsaWVudHMgaXMgd2hlbiB0aGUgZGVza3RvcCBzaXplIGhhcyBjaGFuZ2VkIGFzIGEKKy8vIHJlc3VsdCBvZiBhIGNhbGwgdG8gc2V0UGl4ZWxCdWZmZXIoKS4KKy8vCisvLyBUaGUgcmVzcG9uc2liaWxpdHkgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBzb2NrZXRzIGlzIGVudGlyZWx5IHdpdGggdGhlCisvLyBjYWxsaW5nIGNvZGUuICBXaGVuIFZOQ1NlcnZlclNUIHdhbnRzIHRvIGNsb3NlIGEgY29ubmVjdGlvbiB0byBhIGNsaWVudCBpdAorLy8gY2FsbHMgdGhlIFZOQ1NDb25uZWN0aW9uU1QncyBjbG9zZSgpIG1ldGhvZCB3aGljaCBjYWxscyBzaHV0ZG93bigpIG9uIHRoZQorLy8gc29ja2V0LiAgRXZlbnR1YWxseSB0aGUgY2FsbGluZyBjb2RlIHdpbGwgbm90aWNlIHRoYXQgdGhlIHNvY2tldCBoYXMgYmVlbgorLy8gc2h1dCBkb3duIGFuZCBjYWxsIHJlbW92ZVNvY2tldCgpIHNvIHRoYXQgd2UgY2FuIGRlbGV0ZSB0aGUKKy8vIFZOQ1NDb25uZWN0aW9uU1QuICBOb3RlIHRoYXQgdGhlIHNvY2tldCBtdXN0IG5vdCBiZSBkZWxldGVkIGJ5IHRoZSBjYWxsaW5nCisvLyBjb2RlIHVudGlsIGFmdGVyIHJlbW92ZVNvY2tldCgpIGhhcyBiZWVuIGNhbGxlZC4KKy8vCisvLyBPbmUgbWlub3IgY29tcGxpY2F0aW9uIGlzIHRoYXQgd2UgZG9uJ3QgYWxsb2NhdGUgYSBWTkNTQ29ubmVjdGlvblNUIG9iamVjdAorLy8gZm9yIGEgYmxhY2tsaXN0ZWQgaG9zdCAoc2luY2Ugd2Ugd2FudCB0byBtaW5pbWlzZSB0aGUgcmVzb3VyY2VzIHVzZWQgZm9yCisvLyBkZWFsaW5nIHdpdGggc3VjaCBhIGNvbm5lY3Rpb24pLiAgSW4gb3JkZXIgdG8gcHJvcGVybHkgaW1wbGVtZW50IHRoZQorLy8gZ2V0U29ja2V0cyBmdW5jdGlvbiwgd2UgbXVzdCBtYWludGFpbiBhIHNlcGFyYXRlIGNsb3NpbmdTb2NrZXRzIGxpc3QsCisvLyBvdGhlcndpc2UgYmxhY2tsaXN0ZWQgY29ubmVjdGlvbnMgbWlnaHQgYmUgImZvcmdvdHRlbiIuCisKKworI2luY2x1ZGUgPHJmYi9TZXJ2ZXJDb3JlLmg+CisjaW5jbHVkZSA8cmZiL1ZOQ1NlcnZlclNULmg+CisjaW5jbHVkZSA8cmZiL1ZOQ1NDb25uZWN0aW9uU1QuaD4KKyNpbmNsdWRlIDxyZmIvQ29tcGFyaW5nVXBkYXRlVHJhY2tlci5oPgorI2luY2x1ZGUgPHJmYi9TU2VjdXJpdHlGYWN0b3J5U3RhbmRhcmQuaD4KKyNpbmNsdWRlIDxyZmIvS2V5UmVtYXBwZXIuaD4KKyNpbmNsdWRlIDxyZmIvdXRpbC5oPgorCisjaW5jbHVkZSA8cmRyL3R5cGVzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK3N0YXRpYyBMb2dXcml0ZXIgc2xvZygiVk5DU2VydmVyU1QiKTsKK0xvZ1dyaXRlciBWTkNTZXJ2ZXJTVDo6Y29ubmVjdGlvbnNMb2coIkNvbm5lY3Rpb25zIik7CitzdGF0aWMgU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkIGRlZmF1bHRTZWN1cml0eUZhY3Rvcnk7CisKKy8vCisvLyAtPS0gVk5DU2VydmVyU1QgSW1wbGVtZW50YXRpb24KKy8vCisKKy8vIC09LSBDb25zdHJ1Y3RvcnMvRGVzdHJ1Y3RvcgorCitWTkNTZXJ2ZXJTVDo6Vk5DU2VydmVyU1QoY29uc3QgY2hhciogbmFtZV8sIFNEZXNrdG9wKiBkZXNrdG9wXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTU2VjdXJpdHlGYWN0b3J5KiBzZikKKyAgOiBibEhvc3RzKCZibGFja2xpc3QpLCBkZXNrdG9wKGRlc2t0b3BfKSwgZGVza3RvcFN0YXJ0ZWQoZmFsc2UpLCBwYigwKSwKKyAgICBtX3BGVE1hbmFnZXIoMCksIG5hbWUoc3RyRHVwKG5hbWVfKSksIHBvaW50ZXJDbGllbnQoMCksIGNvbXBhcmVyKDApLAorICAgIHJlbmRlcmVkQ3Vyc29ySW52YWxpZChmYWxzZSksCisgICAgc2VjdXJpdHlGYWN0b3J5KHNmID8gc2YgOiAmZGVmYXVsdFNlY3VyaXR5RmFjdG9yeSksCisgICAgcXVlcnlDb25uZWN0aW9uSGFuZGxlcigwKSwga2V5UmVtYXBwZXIoJktleVJlbWFwcGVyOjpkZWZJbnN0YW5jZSksCisgICAgdXNlRWNvbm9taWNUcmFuc2xhdGUoZmFsc2UpLAorICAgIGxhc3RDb25uZWN0aW9uVGltZSgwKSwgZGlzYWJsZWNsaWVudHMoZmFsc2UpCit7CisgIGxhc3RVc2VySW5wdXRUaW1lID0gbGFzdERpc2Nvbm5lY3RUaW1lID0gdGltZSgwKTsKKyAgc2xvZy5kZWJ1ZygiY3JlYXRpbmcgc2luZ2xlLXRocmVhZGVkIHNlcnZlciAlcyIsIG5hbWUuYnVmKTsKK30KKworVk5DU2VydmVyU1Q6On5WTkNTZXJ2ZXJTVCgpCit7CisgIHNsb2cuZGVidWcoInNodXR0aW5nIGRvd24gc2VydmVyICVzIiwgbmFtZS5idWYpOworCisgIC8vIENsb3NlIGFueSBhY3RpdmUgY2xpZW50cywgd2l0aCBhcHByb3ByaWF0ZSBsb2dnaW5nICYgY2xlYW51cAorICBjbG9zZUNsaWVudHMoIlNlcnZlciBzaHV0ZG93biIpOworCisgIC8vIERlbGV0ZSBhbGwgdGhlIGNsaWVudHMsIGFuZCB0aGVpciBzb2NrZXRzLCBhbmQgYW55IGNsb3Npbmcgc29ja2V0cworICAvLyAgIE5COiBEZWxldGluZyBhIGNsaWVudCBpbXBsaWNpdGx5IHJlbW92ZXMgaXQgZnJvbSB0aGUgY2xpZW50cyBsaXN0CisgIHdoaWxlICghY2xpZW50cy5lbXB0eSgpKSB7CisgICAgZGVsZXRlIGNsaWVudHMuZnJvbnQoKTsKKyAgfQorCisgIC8vIFN0b3AgdGhlIGRlc2t0b3Agb2JqZWN0IGlmIGFjdGl2ZSwgKm9ubHkqIGFmdGVyIGRlbGV0aW5nIGFsbCBjbGllbnRzIQorICBpZiAoZGVza3RvcFN0YXJ0ZWQpIHsKKyAgICBkZXNrdG9wU3RhcnRlZCA9IGZhbHNlOworICAgIGRlc2t0b3AtPnN0b3AoKTsKKyAgfQorCisgIGRlbGV0ZSBjb21wYXJlcjsKK30KKworCisvLyBTb2NrZXRTZXJ2ZXIgbWV0aG9kcworCit2b2lkIFZOQ1NlcnZlclNUOjphZGRTb2NrZXQobmV0d29yazo6U29ja2V0KiBzb2NrLCBib29sIG91dGdvaW5nKQoreworICAvLyAtIENoZWNrIHRoZSBjb25uZWN0aW9uIGlzbid0IGJsYWNrLW1hcmtlZAorICAvLyAqKiogZG8gdGhpcyBpbiBnZXRTZWN1cml0eSBpbnN0ZWFkPworICBDaGFyQXJyYXkgYWRkcmVzcyhzb2NrLT5nZXRQZWVyQWRkcmVzcygpKTsKKyAgaWYgKGJsSG9zdHMtPmlzQmxhY2ttYXJrZWQoYWRkcmVzcy5idWYpKSB7CisgICAgY29ubmVjdGlvbnNMb2cuZXJyb3IoImJsYWNrbGlzdGVkOiAlcyIsIGFkZHJlc3MuYnVmKTsKKyAgICB0cnkgeworICAgICAgU0Nvbm5lY3Rpb246OndyaXRlQ29ubkZhaWxlZEZyb21TY3JhdGNoKCJUb28gbWFueSBzZWN1cml0eSBmYWlsdXJlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2stPm91dFN0cmVhbSgpKTsKKyAgICB9IGNhdGNoIChyZHI6OkV4Y2VwdGlvbiYpIHsKKyAgICB9CisgICAgc29jay0+c2h1dGRvd24oKTsKKyAgICBjbG9zaW5nU29ja2V0cy5wdXNoX2JhY2soc29jayk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGNsaWVudHMuZW1wdHkoKSkgeworICAgIGxhc3RDb25uZWN0aW9uVGltZSA9IHRpbWUoMCk7CisgIH0KKworICBWTkNTQ29ubmVjdGlvblNUKiBjbGllbnQgPSBuZXcgVk5DU0Nvbm5lY3Rpb25TVCh0aGlzLCBzb2NrLCBvdXRnb2luZyk7CisgIGNsaWVudC0+aW5pdCgpOworfQorCit2b2lkIFZOQ1NlcnZlclNUOjpyZW1vdmVTb2NrZXQobmV0d29yazo6U29ja2V0KiBzb2NrKSB7CisgIC8vIC0gSWYgdGhlIHNvY2tldCBoYXMgcmVzb3VyY2VzIGFsbG9jYXRlZCB0byBpdCwgZGVsZXRlIHRoZW0KKyAgc3RkOjpsaXN0PFZOQ1NDb25uZWN0aW9uU1QqPjo6aXRlcmF0b3IgY2k7CisgIGZvciAoY2kgPSBjbGllbnRzLmJlZ2luKCk7IGNpICE9IGNsaWVudHMuZW5kKCk7IGNpKyspIHsKKyAgICBpZiAoKCpjaSktPmdldFNvY2soKSA9PSBzb2NrKSB7CisgICAgICAvLyAtIERlbGV0ZSB0aGUgcGVyLVNvY2tldCByZXNvdXJjZXMKKyAgICAgIGRlbGV0ZSAqY2k7CisKKyAgICAgIC8vIC0gQ2hlY2sgdGhhdCB0aGUgZGVza3RvcCBvYmplY3QgaXMgc3RpbGwgcmVxdWlyZWQKKyAgICAgIGlmIChhdXRoQ2xpZW50Q291bnQoKSA9PSAwICYmIGRlc2t0b3BTdGFydGVkKSB7CisgICAgICAgIHNsb2cuZGVidWcoIm5vIGF1dGhlbnRpY2F0ZWQgY2xpZW50cyAtIHN0b3BwaW5nIGRlc2t0b3AiKTsKKyAgICAgICAgZGVza3RvcFN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgZGVza3RvcC0+c3RvcCgpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIC0gSWYgdGhlIFNvY2tldCBoYXMgbm8gcmVzb3VyY2VzLCBpdCBtYXkgaGF2ZSBiZWVuIGEgY2xvc2luZ1NvY2tldAorICBjbG9zaW5nU29ja2V0cy5yZW1vdmUoc29jayk7Cit9CisKK3ZvaWQgVk5DU2VydmVyU1Q6OnByb2Nlc3NTb2NrZXRFdmVudChuZXR3b3JrOjpTb2NrZXQqIHNvY2spCit7CisgIC8vIC0gRmluZCB0aGUgYXBwcm9wcmlhdGUgVk5DU0Nvbm5lY3Rpb25TVCBhbmQgcHJvY2VzcyB0aGUgZXZlbnQKKyAgc3RkOjpsaXN0PFZOQ1NDb25uZWN0aW9uU1QqPjo6aXRlcmF0b3IgY2k7CisgIGZvciAoY2kgPSBjbGllbnRzLmJlZ2luKCk7IGNpICE9IGNsaWVudHMuZW5kKCk7IGNpKyspIHsKKyAgICBpZiAoKCpjaSktPmdldFNvY2soKSA9PSBzb2NrKSB7CisgICAgICAoKmNpKS0+cHJvY2Vzc01lc3NhZ2VzKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIHRocm93IHJkcjo6RXhjZXB0aW9uKCJpbnZhbGlkIFNvY2tldCBpbiBWTkNTZXJ2ZXJTVCIpOworfQorCitpbnQgVk5DU2VydmVyU1Q6OmNoZWNrVGltZW91dHMoKQoreworICBpbnQgdGltZW91dCA9IDA7CisgIHN0ZDo6bGlzdDxWTkNTQ29ubmVjdGlvblNUKj46Oml0ZXJhdG9yIGNpLCBjaV9uZXh0OworICBmb3IgKGNpPWNsaWVudHMuYmVnaW4oKTtjaSE9Y2xpZW50cy5lbmQoKTtjaT1jaV9uZXh0KSB7CisgICAgY2lfbmV4dCA9IGNpOyBjaV9uZXh0Kys7CisgICAgc29vbmVzdFRpbWVvdXQoJnRpbWVvdXQsICgqY2kpLT5jaGVja0lkbGVUaW1lb3V0KCkpOworICB9CisKKyAgaW50IHRpbWVMZWZ0OworICB0aW1lX3Qgbm93OworCisgIC8vIE9wdGltaXphdGlvbjogT25seSBjYWxsIHRpbWUoKSBpZiB1c2luZyBhbnkgbWF4VGltZS4gCisgIGlmIChyZmI6OlNlcnZlcjo6bWF4RGlzY29ubmVjdGlvblRpbWUgfHwgcmZiOjpTZXJ2ZXI6Om1heENvbm5lY3Rpb25UaW1lIHx8IHJmYjo6U2VydmVyOjptYXhJZGxlVGltZSkgeworICAgIG5vdyA9IHRpbWUoMCk7CisgIH0KKyAgCisgIC8vIENoZWNrIE1heERpc2Nvbm5lY3Rpb25UaW1lIAorICBpZiAocmZiOjpTZXJ2ZXI6Om1heERpc2Nvbm5lY3Rpb25UaW1lICYmIGNsaWVudHMuZW1wdHkoKSkgeworICAgIGlmIChub3cgPCBsYXN0RGlzY29ubmVjdFRpbWUpIHsKKyAgICAgIC8vIFNvbWVvbmUgbXVzdCBoYXZlIHNldCB0aGUgdGltZSBiYWNrd2FyZHMuIAorICAgICAgc2xvZy5pbmZvKCJUaW1lIGhhcyBnb25lIGJhY2t3YXJkcyAtIHJlc2V0dGluZyBsYXN0RGlzY29ubmVjdFRpbWUiKTsKKyAgICAgIGxhc3REaXNjb25uZWN0VGltZSA9IG5vdzsKKyAgICB9CisgICAgdGltZUxlZnQgPSBsYXN0RGlzY29ubmVjdFRpbWUgKyByZmI6OlNlcnZlcjo6bWF4RGlzY29ubmVjdGlvblRpbWUgLSBub3c7CisgICAgaWYgKHRpbWVMZWZ0IDwgLTYwKSB7CisgICAgICAvLyBTb21lb25lIG11c3QgaGF2ZSBzZXQgdGhlIHRpbWUgZm9yd2FyZHMuCisgICAgICBzbG9nLmluZm8oIlRpbWUgaGFzIGdvbmUgZm9yd2FyZHMgLSByZXNldHRpbmcgbGFzdERpc2Nvbm5lY3RUaW1lIik7CisgICAgICBsYXN0RGlzY29ubmVjdFRpbWUgPSBub3c7CisgICAgICB0aW1lTGVmdCA9IHJmYjo6U2VydmVyOjptYXhEaXNjb25uZWN0aW9uVGltZTsKKyAgICB9CisgICAgaWYgKHRpbWVMZWZ0IDw9IDApIHsgCisgICAgICBzbG9nLmluZm8oIk1heERpc2Nvbm5lY3Rpb25UaW1lIHJlYWNoZWQsIGV4aXRpbmciKTsKKyAgICAgIGV4aXQoMCk7CisgICAgfQorICAgIHNvb25lc3RUaW1lb3V0KCZ0aW1lb3V0LCB0aW1lTGVmdCAqIDEwMDApOworICB9CisKKyAgLy8gQ2hlY2sgTWF4Q29ubmVjdGlvblRpbWUgCisgIGlmIChyZmI6OlNlcnZlcjo6bWF4Q29ubmVjdGlvblRpbWUgJiYgbGFzdENvbm5lY3Rpb25UaW1lICYmICFjbGllbnRzLmVtcHR5KCkpIHsKKyAgICBpZiAobm93IDwgbGFzdENvbm5lY3Rpb25UaW1lKSB7CisgICAgICAvLyBTb21lb25lIG11c3QgaGF2ZSBzZXQgdGhlIHRpbWUgYmFja3dhcmRzLiAKKyAgICAgIHNsb2cuaW5mbygiVGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgLSByZXNldHRpbmcgbGFzdENvbm5lY3Rpb25UaW1lIik7CisgICAgICBsYXN0Q29ubmVjdGlvblRpbWUgPSBub3c7CisgICAgfQorICAgIHRpbWVMZWZ0ID0gbGFzdENvbm5lY3Rpb25UaW1lICsgcmZiOjpTZXJ2ZXI6Om1heENvbm5lY3Rpb25UaW1lIC0gbm93OworICAgIGlmICh0aW1lTGVmdCA8IC02MCkgeworICAgICAgLy8gU29tZW9uZSBtdXN0IGhhdmUgc2V0IHRoZSB0aW1lIGZvcndhcmRzLgorICAgICAgc2xvZy5pbmZvKCJUaW1lIGhhcyBnb25lIGZvcndhcmRzIC0gcmVzZXR0aW5nIGxhc3RDb25uZWN0aW9uVGltZSIpOworICAgICAgbGFzdENvbm5lY3Rpb25UaW1lID0gbm93OworICAgICAgdGltZUxlZnQgPSByZmI6OlNlcnZlcjo6bWF4Q29ubmVjdGlvblRpbWU7CisgICAgfQorICAgIGlmICh0aW1lTGVmdCA8PSAwKSB7CisgICAgICBzbG9nLmluZm8oIk1heENvbm5lY3Rpb25UaW1lIHJlYWNoZWQsIGV4aXRpbmciKTsKKyAgICAgIGV4aXQoMCk7CisgICAgfQorICAgIHNvb25lc3RUaW1lb3V0KCZ0aW1lb3V0LCB0aW1lTGVmdCAqIDEwMDApOworICB9CisKKyAgCisgIC8vIENoZWNrIE1heElkbGVUaW1lIAorICBpZiAocmZiOjpTZXJ2ZXI6Om1heElkbGVUaW1lKSB7CisgICAgaWYgKG5vdyA8IGxhc3RVc2VySW5wdXRUaW1lKSB7CisgICAgICAvLyBTb21lb25lIG11c3QgaGF2ZSBzZXQgdGhlIHRpbWUgYmFja3dhcmRzLiAKKyAgICAgIHNsb2cuaW5mbygiVGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgLSByZXNldHRpbmcgbGFzdFVzZXJJbnB1dFRpbWUiKTsKKyAgICAgIGxhc3RVc2VySW5wdXRUaW1lID0gbm93OworICAgIH0KKyAgICB0aW1lTGVmdCA9IGxhc3RVc2VySW5wdXRUaW1lICsgcmZiOjpTZXJ2ZXI6Om1heElkbGVUaW1lIC0gbm93OworICAgIGlmICh0aW1lTGVmdCA8IC02MCkgeworICAgICAgLy8gU29tZW9uZSBtdXN0IGhhdmUgc2V0IHRoZSB0aW1lIGZvcndhcmRzLgorICAgICAgc2xvZy5pbmZvKCJUaW1lIGhhcyBnb25lIGZvcndhcmRzIC0gcmVzZXR0aW5nIGxhc3RVc2VySW5wdXRUaW1lIik7CisgICAgICBsYXN0VXNlcklucHV0VGltZSA9IG5vdzsKKyAgICAgIHRpbWVMZWZ0ID0gcmZiOjpTZXJ2ZXI6Om1heElkbGVUaW1lOworICAgIH0KKyAgICBpZiAodGltZUxlZnQgPD0gMCkgeworICAgICAgc2xvZy5pbmZvKCJNYXhJZGxlVGltZSByZWFjaGVkLCBleGl0aW5nIik7CisgICAgICBleGl0KDApOworICAgIH0KKyAgICBzb29uZXN0VGltZW91dCgmdGltZW91dCwgdGltZUxlZnQgKiAxMDAwKTsKKyAgfQorICAKKyAgcmV0dXJuIHRpbWVvdXQ7Cit9CisKKworLy8gVk5DU2VydmVyIG1ldGhvZHMKKwordm9pZCBWTkNTZXJ2ZXJTVDo6c2V0UGl4ZWxCdWZmZXIoUGl4ZWxCdWZmZXIqIHBiXykKK3sKKyAgcGIgPSBwYl87CisgIGRlbGV0ZSBjb21wYXJlcjsKKyAgY29tcGFyZXIgPSAwOworCisgIGlmIChwYikgeworICAgIGNvbXBhcmVyID0gbmV3IENvbXBhcmluZ1VwZGF0ZVRyYWNrZXIocGIpOworICAgIGN1cnNvci5zZXRQRihwYi0+Z2V0UEYoKSk7CisgICAgcmVuZGVyZWRDdXJzb3Iuc2V0UEYocGItPmdldFBGKCkpOworCisgICAgc3RkOjpsaXN0PFZOQ1NDb25uZWN0aW9uU1QqPjo6aXRlcmF0b3IgY2ksIGNpX25leHQ7CisgICAgZm9yIChjaT1jbGllbnRzLmJlZ2luKCk7Y2khPWNsaWVudHMuZW5kKCk7Y2k9Y2lfbmV4dCkgeworICAgICAgY2lfbmV4dCA9IGNpOyBjaV9uZXh0Kys7CisgICAgICAoKmNpKS0+cGl4ZWxCdWZmZXJDaGFuZ2UoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGRlc2t0b3BTdGFydGVkKQorICAgICAgdGhyb3cgRXhjZXB0aW9uKCJzZXRQaXhlbEJ1ZmZlcjogbnVsbCBQaXhlbEJ1ZmZlciB3aGVuIGRlc2t0b3BTdGFydGVkPyIpOworICB9Cit9CisKK3ZvaWQgVk5DU2VydmVyU1Q6OnNldENvbG91ck1hcEVudHJpZXMoaW50IGZpcnN0Q29sb3VyLCBpbnQgbkNvbG91cnMpCit7CisgIHN0ZDo6bGlzdDxWTkNTQ29ubmVjdGlvblNUKj46Oml0ZXJhdG9yIGNpLCBjaV9uZXh0OworICBmb3IgKGNpID0gY2xpZW50cy5iZWdpbigpOyBjaSAhPSBjbGllbnRzLmVuZCgpOyBjaSA9IGNpX25leHQpIHsKKyAgICBjaV9uZXh0ID0gY2k7IGNpX25leHQrKzsKKyAgICAoKmNpKS0+c2V0Q29sb3VyTWFwRW50cmllc09yQ2xvc2UoZmlyc3RDb2xvdXIsIG5Db2xvdXJzKTsKKyAgfQorfQorCit2b2lkIFZOQ1NlcnZlclNUOjpiZWxsKCkKK3sKKyAgc3RkOjpsaXN0PFZOQ1NDb25uZWN0aW9uU1QqPjo6aXRlcmF0b3IgY2ksIGNpX25leHQ7CisgIGZvciAoY2kgPSBjbGllbnRzLmJlZ2luKCk7IGNpICE9IGNsaWVudHMuZW5kKCk7IGNpID0gY2lfbmV4dCkgeworICAgIGNpX25leHQgPSBjaTsgY2lfbmV4dCsrOworICAgICgqY2kpLT5iZWxsKCk7CisgIH0KK30KKwordm9pZCBWTkNTZXJ2ZXJTVDo6c2VydmVyQ3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pCit7CisgIHN0ZDo6bGlzdDxWTkNTQ29ubmVjdGlvblNUKj46Oml0ZXJhdG9yIGNpLCBjaV9uZXh0OworICBmb3IgKGNpID0gY2xpZW50cy5iZWdpbigpOyBjaSAhPSBjbGllbnRzLmVuZCgpOyBjaSA9IGNpX25leHQpIHsKKyAgICBjaV9uZXh0ID0gY2k7IGNpX25leHQrKzsKKyAgICAoKmNpKS0+c2VydmVyQ3V0VGV4dChzdHIsIGxlbik7CisgIH0KK30KKwordm9pZCBWTkNTZXJ2ZXJTVDo6YWRkX2NoYW5nZWQoY29uc3QgUmVnaW9uJiByZWdpb24pCit7CisgIGNvbXBhcmVyLT5hZGRfY2hhbmdlZChyZWdpb24pOworfQorCit2b2lkIFZOQ1NlcnZlclNUOjphZGRfY29waWVkKGNvbnN0IFJlZ2lvbiYgZGVzdCwgY29uc3QgUG9pbnQmIGRlbHRhKQoreworICBjb21wYXJlci0+YWRkX2NvcGllZChkZXN0LCBkZWx0YSk7Cit9CisKK2Jvb2wgVk5DU2VydmVyU1Q6OmNsaWVudHNSZWFkeUZvclVwZGF0ZSgpCit7CisgIHN0ZDo6bGlzdDxWTkNTQ29ubmVjdGlvblNUKj46Oml0ZXJhdG9yIGNpOworICBmb3IgKGNpID0gY2xpZW50cy5iZWdpbigpOyBjaSAhPSBjbGllbnRzLmVuZCgpOyBjaSsrKSB7CisgICAgaWYgKCgqY2kpLT5yZWFkeUZvclVwZGF0ZSgpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFZOQ1NlcnZlclNUOjp0cnlVcGRhdGUoKQoreworICBzdGQ6Omxpc3Q8Vk5DU0Nvbm5lY3Rpb25TVCo+OjppdGVyYXRvciBjaSwgY2lfbmV4dDsKKyAgZm9yIChjaSA9IGNsaWVudHMuYmVnaW4oKTsgY2kgIT0gY2xpZW50cy5lbmQoKTsgY2kgPSBjaV9uZXh0KSB7CisgICAgY2lfbmV4dCA9IGNpOyBjaV9uZXh0Kys7CisgICAgKCpjaSktPndyaXRlRnJhbWVidWZmZXJVcGRhdGVPckNsb3NlKCk7CisgIH0KK30KKwordm9pZCBWTkNTZXJ2ZXJTVDo6c2V0Q3Vyc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgUG9pbnQmIG5ld0hvdHNwb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSwgdm9pZCogbWFzaykKK3sKKyAgY3Vyc29yLmhvdHNwb3QgPSBuZXdIb3RzcG90OworICBjdXJzb3Iuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgbWVtY3B5KGN1cnNvci5kYXRhLCBkYXRhLCBjdXJzb3IuZGF0YUxlbigpKTsKKyAgbWVtY3B5KGN1cnNvci5tYXNrLmJ1ZiwgbWFzaywgY3Vyc29yLm1hc2tMZW4oKSk7CisKKyAgY3Vyc29yLmNyb3AoKTsKKworICByZW5kZXJlZEN1cnNvckludmFsaWQgPSB0cnVlOworCisgIHN0ZDo6bGlzdDxWTkNTQ29ubmVjdGlvblNUKj46Oml0ZXJhdG9yIGNpLCBjaV9uZXh0OworICBmb3IgKGNpID0gY2xpZW50cy5iZWdpbigpOyBjaSAhPSBjbGllbnRzLmVuZCgpOyBjaSA9IGNpX25leHQpIHsKKyAgICBjaV9uZXh0ID0gY2k7IGNpX25leHQrKzsKKyAgICAoKmNpKS0+cmVuZGVyZWRDdXJzb3JDaGFuZ2UoKTsKKyAgICAoKmNpKS0+c2V0Q3Vyc29yT3JDbG9zZSgpOworICB9Cit9CisKK3ZvaWQgVk5DU2VydmVyU1Q6OnNldEN1cnNvclBvcyhjb25zdCBQb2ludCYgcG9zKQoreworICBpZiAoIWN1cnNvclBvcy5lcXVhbHMocG9zKSkgeworICAgIGN1cnNvclBvcyA9IHBvczsKKyAgICByZW5kZXJlZEN1cnNvckludmFsaWQgPSB0cnVlOworICAgIHN0ZDo6bGlzdDxWTkNTQ29ubmVjdGlvblNUKj46Oml0ZXJhdG9yIGNpOworICAgIGZvciAoY2kgPSBjbGllbnRzLmJlZ2luKCk7IGNpICE9IGNsaWVudHMuZW5kKCk7IGNpKyspCisgICAgICAoKmNpKS0+cmVuZGVyZWRDdXJzb3JDaGFuZ2UoKTsKKyAgfQorfQorCisvLyBPdGhlciBwdWJsaWMgbWV0aG9kcworCit2b2lkIFZOQ1NlcnZlclNUOjphcHByb3ZlQ29ubmVjdGlvbihuZXR3b3JrOjpTb2NrZXQqIHNvY2ssIGJvb2wgYWNjZXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmVhc29uKQoreworICBzdGQ6Omxpc3Q8Vk5DU0Nvbm5lY3Rpb25TVCo+OjppdGVyYXRvciBjaTsKKyAgZm9yIChjaSA9IGNsaWVudHMuYmVnaW4oKTsgY2kgIT0gY2xpZW50cy5lbmQoKTsgY2krKykgeworICAgIGlmICgoKmNpKS0+Z2V0U29jaygpID09IHNvY2spIHsKKyAgICAgICgqY2kpLT5hcHByb3ZlQ29ubmVjdGlvbk9yQ2xvc2UoYWNjZXB0LCByZWFzb24pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCit2b2lkIFZOQ1NlcnZlclNUOjpjbG9zZUNsaWVudHMoY29uc3QgY2hhciogcmVhc29uLCBuZXR3b3JrOjpTb2NrZXQqIGV4Y2VwdCkKK3sKKyAgc3RkOjpsaXN0PFZOQ1NDb25uZWN0aW9uU1QqPjo6aXRlcmF0b3IgaSwgbmV4dF9pOworICBmb3IgKGk9Y2xpZW50cy5iZWdpbigpOyBpIT1jbGllbnRzLmVuZCgpOyBpPW5leHRfaSkgeworICAgIG5leHRfaSA9IGk7IG5leHRfaSsrOworICAgIGlmICgoKmkpLT5nZXRTb2NrKCkgIT0gZXhjZXB0KQorICAgICAgKCppKS0+Y2xvc2UocmVhc29uKTsKKyAgfQorfQorCit2b2lkIFZOQ1NlcnZlclNUOjpnZXRTb2NrZXRzKHN0ZDo6bGlzdDxuZXR3b3JrOjpTb2NrZXQqPiogc29ja2V0cykKK3sKKyAgc29ja2V0cy0+Y2xlYXIoKTsKKyAgc3RkOjpsaXN0PFZOQ1NDb25uZWN0aW9uU1QqPjo6aXRlcmF0b3IgY2k7CisgIGZvciAoY2kgPSBjbGllbnRzLmJlZ2luKCk7IGNpICE9IGNsaWVudHMuZW5kKCk7IGNpKyspIHsKKyAgICBzb2NrZXRzLT5wdXNoX2JhY2soKCpjaSktPmdldFNvY2soKSk7CisgIH0KKyAgc3RkOjpsaXN0PG5ldHdvcms6OlNvY2tldCo+OjppdGVyYXRvciBzaTsKKyAgZm9yIChzaSA9IGNsb3NpbmdTb2NrZXRzLmJlZ2luKCk7IHNpICE9IGNsb3NpbmdTb2NrZXRzLmVuZCgpOyBzaSsrKSB7CisgICAgc29ja2V0cy0+cHVzaF9iYWNrKCpzaSk7CisgIH0KK30KKworU0Nvbm5lY3Rpb24qIFZOQ1NlcnZlclNUOjpnZXRTQ29ubmVjdGlvbihuZXR3b3JrOjpTb2NrZXQqIHNvY2spIHsKKyAgc3RkOjpsaXN0PFZOQ1NDb25uZWN0aW9uU1QqPjo6aXRlcmF0b3IgY2k7CisgIGZvciAoY2kgPSBjbGllbnRzLmJlZ2luKCk7IGNpICE9IGNsaWVudHMuZW5kKCk7IGNpKyspIHsKKyAgICBpZiAoKCpjaSktPmdldFNvY2soKSA9PSBzb2NrKQorICAgICAgcmV0dXJuICpjaTsKKyAgfQorICByZXR1cm4gMDsKK30KKworCisvLyAtPS0gSW50ZXJuYWwgbWV0aG9kcworCit2b2lkIFZOQ1NlcnZlclNUOjpzdGFydERlc2t0b3AoKQoreworICBpZiAoIWRlc2t0b3BTdGFydGVkKSB7CisgICAgc2xvZy5kZWJ1Zygic3RhcnRpbmcgZGVza3RvcCIpOworICAgIGRlc2t0b3AtPnN0YXJ0KHRoaXMpOworICAgIGRlc2t0b3BTdGFydGVkID0gdHJ1ZTsKKyAgICBpZiAoIXBiKQorICAgICAgdGhyb3cgRXhjZXB0aW9uKCJTRGVza3RvcDo6c3RhcnQoKSBkaWQgbm90IHNldCBhIHZhbGlkIFBpeGVsQnVmZmVyIik7CisgIH0KK30KKworaW50IFZOQ1NlcnZlclNUOjphdXRoQ2xpZW50Q291bnQoKSB7CisgIGludCBjb3VudCA9IDA7CisgIHN0ZDo6bGlzdDxWTkNTQ29ubmVjdGlvblNUKj46Oml0ZXJhdG9yIGNpOworICBmb3IgKGNpID0gY2xpZW50cy5iZWdpbigpOyBjaSAhPSBjbGllbnRzLmVuZCgpOyBjaSsrKSB7CisgICAgaWYgKCgqY2kpLT5hdXRoZW50aWNhdGVkKCkpCisgICAgICBjb3VudCsrOworICB9CisgIHJldHVybiBjb3VudDsKK30KKworaW5saW5lIGJvb2wgVk5DU2VydmVyU1Q6Om5lZWRSZW5kZXJlZEN1cnNvcigpCit7CisgIHN0ZDo6bGlzdDxWTkNTQ29ubmVjdGlvblNUKj46Oml0ZXJhdG9yIGNpOworICBmb3IgKGNpID0gY2xpZW50cy5iZWdpbigpOyBjaSAhPSBjbGllbnRzLmVuZCgpOyBjaSsrKQorICAgIGlmICgoKmNpKS0+bmVlZFJlbmRlcmVkQ3Vyc29yKCkpIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIGNoZWNrVXBkYXRlKCkgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIHNlbmRpbmcgYW4gdXBkYXRlLiAgSXQgY2hlY2tzIHRvIHNlZQorLy8gd2hhdCB1cGRhdGVzIGFyZSBwZW5kaW5nIGFuZCBwcm9wYWdhdGVzIHRoZW0gdG8gdGhlIHVwZGF0ZSB0cmFja2VyIGZvciBlYWNoCisvLyBjbGllbnQuICBJdCB1c2VzIHRoZSBDb21wYXJpbmdVcGRhdGVUcmFja2VyJ3MgY29tcGFyZSgpIG1ldGhvZCB0byBmaWx0ZXIgb3V0CisvLyBhcmVhcyBvZiB0aGUgc2NyZWVuIHdoaWNoIGhhdmVuJ3QgYWN0dWFsbHkgY2hhbmdlZC4gIEl0IGFsc28gY2hlY2tzIHRoZQorLy8gc3RhdGUgb2YgdGhlIChzZXJ2ZXItc2lkZSkgcmVuZGVyZWQgY3Vyc29yLCBpZiBuZWNlc3NhcnkgcmVuZGVyaW5nIGl0IGFnYWluCisvLyB3aXRoIHRoZSBjb3JyZWN0IGJhY2tncm91bmQuCisKK3ZvaWQgVk5DU2VydmVyU1Q6OmNoZWNrVXBkYXRlKCkKK3sKKyAgYm9vbCByZW5kZXJDdXJzb3IgPSBuZWVkUmVuZGVyZWRDdXJzb3IoKTsKKworICBpZiAoY29tcGFyZXItPmlzX2VtcHR5KCkgJiYgIShyZW5kZXJDdXJzb3IgJiYgcmVuZGVyZWRDdXJzb3JJbnZhbGlkKSkKKyAgICByZXR1cm47CisKKyAgUmVnaW9uIHRvQ2hlY2sgPSBjb21wYXJlci0+Z2V0X2NoYW5nZWQoKS51bmlvbl8oY29tcGFyZXItPmdldF9jb3BpZWQoKSk7CisKKyAgaWYgKHJlbmRlckN1cnNvcikgeworICAgIFJlY3QgY2xpcHBlZEN1cnNvclJlY3QKKyAgICAgID0gY3Vyc29yLmdldFJlY3QoY3Vyc29yVEwoKSkuaW50ZXJzZWN0KHBiLT5nZXRSZWN0KCkpOworCisgICAgaWYgKCFyZW5kZXJlZEN1cnNvckludmFsaWQgJiYgKHRvQ2hlY2suaW50ZXJzZWN0KGNsaXBwZWRDdXJzb3JSZWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNfZW1wdHkoKSkpIHsKKyAgICAgIHJlbmRlckN1cnNvciA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZW5kZXJlZEN1cnNvclRMID0gY2xpcHBlZEN1cnNvclJlY3QudGw7CisgICAgICByZW5kZXJlZEN1cnNvci5zZXRTaXplKGNsaXBwZWRDdXJzb3JSZWN0LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwZWRDdXJzb3JSZWN0LmhlaWdodCgpKTsKKyAgICAgIHRvQ2hlY2suYXNzaWduX3VuaW9uKGNsaXBwZWRDdXJzb3JSZWN0KTsKKyAgICB9CisgIH0KKworICBwYi0+Z3JhYlJlZ2lvbih0b0NoZWNrKTsKKworICBpZiAocmZiOjpTZXJ2ZXI6OmNvbXBhcmVGQikKKyAgICBjb21wYXJlci0+Y29tcGFyZSgpOworCisgIGlmIChyZW5kZXJDdXJzb3IpIHsKKyAgICBwYi0+Z2V0SW1hZ2UocmVuZGVyZWRDdXJzb3IuZGF0YSwKKyAgICAgICAgICAgICAgICAgcmVuZGVyZWRDdXJzb3IuZ2V0UmVjdChyZW5kZXJlZEN1cnNvclRMKSk7CisgICAgcmVuZGVyZWRDdXJzb3IubWFza1JlY3QoY3Vyc29yLmdldFJlY3QoY3Vyc29yVEwoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJ0cmFjdChyZW5kZXJlZEN1cnNvclRMKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmRhdGEsIGN1cnNvci5tYXNrLmJ1Zik7CisgICAgcmVuZGVyZWRDdXJzb3JJbnZhbGlkID0gZmFsc2U7CisgIH0KKworICBzdGQ6Omxpc3Q8Vk5DU0Nvbm5lY3Rpb25TVCo+OjppdGVyYXRvciBjaSwgY2lfbmV4dDsKKyAgZm9yIChjaSA9IGNsaWVudHMuYmVnaW4oKTsgY2kgIT0gY2xpZW50cy5lbmQoKTsgY2kgPSBjaV9uZXh0KSB7CisgICAgY2lfbmV4dCA9IGNpOyBjaV9uZXh0Kys7CisgICAgKCpjaSktPmFkZF9jb3BpZWQoY29tcGFyZXItPmdldF9jb3BpZWQoKSwgY29tcGFyZXItPmdldF9kZWx0YSgpKTsKKyAgICAoKmNpKS0+YWRkX2NoYW5nZWQoY29tcGFyZXItPmdldF9jaGFuZ2VkKCkpOworICB9CisKKyAgY29tcGFyZXItPmNsZWFyKCk7Cit9CisKK3ZvaWQgVk5DU2VydmVyU1Q6OmdldENvbm5JbmZvKExpc3RDb25uSW5mbyAqIGxpc3RDb25uKQoreworICBsaXN0Q29ubi0+Q2xlYXIoKTsKKyAgbGlzdENvbm4tPnNldERpc2FibGUoZ2V0RGlzYWJsZSgpKTsKKyAgaWYgKGNsaWVudHMuZW1wdHkoKSkKKyAgICByZXR1cm47CisgIHN0ZDo6bGlzdDxWTkNTQ29ubmVjdGlvblNUKj46Oml0ZXJhdG9yIGk7CisgIGZvciAoaSA9IGNsaWVudHMuYmVnaW4oKTsgaSAhPSBjbGllbnRzLmVuZCgpOyBpKyspCisgICAgbGlzdENvbm4tPmFkZEluZm8oKHZvaWQqKSgqaSksICgqaSktPmdldFNvY2soKS0+Z2V0UGVlckFkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmkpLT5nZXRTdGFydFRpbWUoKSwgKCppKS0+Z2V0U3RhdHVzKCkpOworfQorCit2b2lkIFZOQ1NlcnZlclNUOjpzZXRDb25uU3RhdHVzKExpc3RDb25uSW5mbyogbGlzdENvbm4pCit7CisgIHNldERpc2FibGUobGlzdENvbm4tPmdldERpc2FibGUoKSk7CisgIGlmIChsaXN0Q29ubi0+RW1wdHkoKSB8fCBjbGllbnRzLmVtcHR5KCkpIHJldHVybjsKKyAgZm9yIChsaXN0Q29ubi0+aUJlZ2luKCk7ICFsaXN0Q29ubi0+aUVuZCgpOyBsaXN0Q29ubi0+aU5leHQoKSkgeworICAgIFZOQ1NDb25uZWN0aW9uU1QqIGNvbm4gPSAoVk5DU0Nvbm5lY3Rpb25TVCopbGlzdENvbm4tPmlHZXRDb25uKCk7CisgICAgc3RkOjpsaXN0PFZOQ1NDb25uZWN0aW9uU1QqPjo6aXRlcmF0b3IgaTsKKyAgICBmb3IgKGkgPSBjbGllbnRzLmJlZ2luKCk7IGkgIT0gY2xpZW50cy5lbmQoKTsgaSsrKSB7CisgICAgICBpZiAoKCppKSA9PSBjb25uKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBsaXN0Q29ubi0+aUdldFN0YXR1cygpOworICAgICAgICBpZiAoc3RhdHVzID09IDMpIHsKKyAgICAgICAgICAoKmkpLT5jbG9zZSgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoKmkpLT5zZXRTdGF0dXMoc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvVk5DU2VydmVyU1QuaCBiL2NvbW1vbi9yZmIvVk5DU2VydmVyU1QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzE1YjdmCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9WTkNTZXJ2ZXJTVC5oCkBAIC0wLDAgKzEsMjQ1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vIC09LSBWTkNTZXJ2ZXJTVC5oCisKKy8vIFNpbmdsZS10aHJlYWRlZCBWTkNTZXJ2ZXIgaW1wbGVtZW50YXRpb24KKworI2lmbmRlZiBfX1JGQl9WTkNTRVJWRVJTVF9IX18KKyNkZWZpbmUgX19SRkJfVk5DU0VSVkVSU1RfSF9fCisKKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8cmZiL1NEZXNrdG9wLmg+CisjaW5jbHVkZSA8cmZiL1ZOQ1NlcnZlci5oPgorI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8cmZiL0xvZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9CbGFja2xpc3QuaD4KKyNpbmNsdWRlIDxyZmIvQ3Vyc29yLmg+CisjaW5jbHVkZSA8bmV0d29yay9Tb2NrZXQuaD4KKyNpbmNsdWRlIDxyZmIvTGlzdENvbm5JbmZvLmg+CisjaW5jbHVkZSA8cmZiL1NGaWxlVHJhbnNmZXJNYW5hZ2VyLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIFZOQ1NDb25uZWN0aW9uU1Q7CisgIGNsYXNzIENvbXBhcmluZ1VwZGF0ZVRyYWNrZXI7CisgIGNsYXNzIFBpeGVsQnVmZmVyOworICBjbGFzcyBLZXlSZW1hcHBlcjsKKworICBjbGFzcyBWTkNTZXJ2ZXJTVCA6IHB1YmxpYyBWTkNTZXJ2ZXIsIHB1YmxpYyBuZXR3b3JrOjpTb2NrZXRTZXJ2ZXIgeworICBwdWJsaWM6CisgICAgLy8gLT0tIENvbnN0cnVjdG9ycworCisgICAgLy8gICBDcmVhdGUgYSBzZXJ2ZXIgZXhwb3J0aW5nIHRoZSBzdXBwbGllZCBkZXNrdG9wLgorICAgIFZOQ1NlcnZlclNUKGNvbnN0IGNoYXIqIG5hbWVfLCBTRGVza3RvcCogZGVza3RvcF8sCisgICAgICAgICAgICAgICAgU1NlY3VyaXR5RmFjdG9yeSogc2VjdXJpdHlGYWN0b3J5Xz0wKTsKKyAgICB2aXJ0dWFsIH5WTkNTZXJ2ZXJTVCgpOworCisKKyAgICAvLyBNZXRob2RzIG92ZXJyaWRkZW4gZnJvbSBTb2NrZXRTZXJ2ZXIKKworICAgIC8vIGFkZFNvY2tldAorICAgIC8vICAgQ2F1c2VzIHRoZSBzZXJ2ZXIgdG8gYWxsb2NhdGUgYW4gUkZCLXByb3RvY29sIG1hbmFnZW1lbnQKKyAgICAvLyAgIHN0cnVjdHVyZSBmb3IgdGhlIHNvY2tldCAmIGluaXRpYWxpc2UgaXQuCisgICAgdmlydHVhbCB2b2lkIGFkZFNvY2tldChuZXR3b3JrOjpTb2NrZXQqIHNvY2ssIGJvb2wgb3V0Z29pbmc9ZmFsc2UpOworCisgICAgLy8gcmVtb3ZlU29ja2V0CisgICAgLy8gICBDbGVhbiB1cCBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgU29ja2V0CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVNvY2tldChuZXR3b3JrOjpTb2NrZXQqIHNvY2spOworCisgICAgLy8gcHJvY2Vzc1NvY2tldEV2ZW50CisgICAgLy8gICBSZWFkIG1vcmUgUkZCIGRhdGEgZnJvbSB0aGUgU29ja2V0LiAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZworICAgIC8vICAgcHJvY2Vzc2luZyB0aGVuIHNodXRkb3duKCkgaXMgY2FsbGVkIG9uIHRoZSBTb2NrZXQsIGNhdXNpbmcKKyAgICAvLyAgIHJlbW92ZVNvY2tldCgpIHRvIGJlIGNhbGxlZCBieSB0aGUgY2FsbGVyIGF0IGEgbGF0ZXIgdGltZS4KKyAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc1NvY2tldEV2ZW50KG5ldHdvcms6OlNvY2tldCogc29jayk7CisKKyAgICAvLyBjaGVja1RpbWVvdXRzCisgICAgLy8gICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZnQgdW50aWwgdGhlIG5leHQgaWRsZSB0aW1lb3V0CisgICAgLy8gICBleHBpcmVzLiAgSWYgYW55IGhhdmUgYWxyZWFkeSBleHBpcmVkLCB0aGUgY29ycmVzcG9uZGluZyBjb25uZWN0aW9ucworICAgIC8vICAgYXJlIGNsb3NlZC4gIFplcm8gaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gaWRsZSB0aW1lb3V0LgorICAgIHZpcnR1YWwgaW50IGNoZWNrVGltZW91dHMoKTsKKworCisgICAgLy8gTWV0aG9kcyBvdmVycmlkZGVuIGZyb20gVk5DU2VydmVyCisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGl4ZWxCdWZmZXIoUGl4ZWxCdWZmZXIqIHBiKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29sb3VyTWFwRW50cmllcyhpbnQgZmlyc3RDb2xvdXI9MCwgaW50IG5Db2xvdXJzPTApOworICAgIHZpcnR1YWwgdm9pZCBzZXJ2ZXJDdXRUZXh0KGNvbnN0IGNoYXIqIHN0ciwgaW50IGxlbik7CisgICAgdmlydHVhbCB2b2lkIGFkZF9jaGFuZ2VkKGNvbnN0IFJlZ2lvbiAmcmVnaW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkX2NvcGllZChjb25zdCBSZWdpb24gJmRlc3QsIGNvbnN0IFBvaW50ICZkZWx0YSk7CisgICAgdmlydHVhbCBib29sIGNsaWVudHNSZWFkeUZvclVwZGF0ZSgpOworICAgIHZpcnR1YWwgdm9pZCB0cnlVcGRhdGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q3Vyc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgUG9pbnQmIGhvdHNwb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjdXJzb3JEYXRhLCB2b2lkKiBtYXNrKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q3Vyc29yUG9zKGNvbnN0IFBvaW50JiBwKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U1NlY3VyaXR5RmFjdG9yeShTU2VjdXJpdHlGYWN0b3J5KiBmKSB7c2VjdXJpdHlGYWN0b3J5PWY7fQorCisgICAgdmlydHVhbCB2b2lkIGJlbGwoKTsKKworICAgIC8vIC0gQ2xvc2UgYWxsIGN1cnJlbnRseS1jb25uZWN0ZWQgY2xpZW50cywgYnkgY2FsbGluZworICAgIC8vICAgdGhlaXIgY2xvc2UoKSBtZXRob2Qgd2l0aCB0aGUgc3VwcGxpZWQgcmVhc29uLgorICAgIHZpcnR1YWwgdm9pZCBjbG9zZUNsaWVudHMoY29uc3QgY2hhciogcmVhc29uKSB7Y2xvc2VDbGllbnRzKHJlYXNvbiwgMCk7fQorCisgICAgLy8gVk5DU2VydmVyU1Qtb25seSBtZXRob2RzCisKKyAgICAvLyBjbG9zZUNsaWVudHMoKSBjbG9zZXMgYWxsIFJGQiBzZXNzaW9ucywgZXhjZXB0IHRoZSBzcGVjaWZpZWQgb25lIChpZgorICAgIC8vIGFueSksIGFuZCBsb2dzIHRoZSBzcGVjaWZpZWQgcmVhc29uIGZvciBjbG9zdXJlLgorICAgIHZvaWQgY2xvc2VDbGllbnRzKGNvbnN0IGNoYXIqIHJlYXNvbiwgbmV0d29yazo6U29ja2V0KiBzb2NrKTsKKworICAgIC8vIGdldFNvY2tldHMoKSBnZXRzIGEgbGlzdCBvZiBzb2NrZXRzLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhbgorICAgIC8vIGZkX3NldCBmb3IgY2FsbGluZyBzZWxlY3QoKS4KKworICAgIHZvaWQgZ2V0U29ja2V0cyhzdGQ6Omxpc3Q8bmV0d29yazo6U29ja2V0Kj4qIHNvY2tldHMpOworCisgICAgLy8gZ2V0U0Nvbm5lY3Rpb24oKSBnZXRzIHRoZSBTQ29ubmVjdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIFNvY2tldC4gIElmCisgICAgLy8gdGhlIFNvY2tldCBpcyBub3QgcmVjb2duaXNlZCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCisKKyAgICBTQ29ubmVjdGlvbiogZ2V0U0Nvbm5lY3Rpb24obmV0d29yazo6U29ja2V0KiBzb2NrKTsKKworICAgIC8vIGdldERlc2t0b3BTaXplKCkgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgU0Rlc2t0b3AgZXhwb3J0ZWQgYnkgdGhpcworICAgIC8vIHNlcnZlci4KKyAgICBQb2ludCBnZXREZXNrdG9wU2l6ZSgpIGNvbnN0IHtyZXR1cm4gZGVza3RvcC0+Z2V0RmJTaXplKCk7fQorCisgICAgLy8gZ2V0TmFtZSgpIHJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBWTkMgU2VydmVyLiAgTkI6IFRoZSB2YWx1ZSByZXR1cm5lZAorICAgIC8vIGlzIHRoZSBzZXJ2ZXIncyBpbnRlcm5hbCBidWZmZXIgd2hpY2ggbWF5IGNoYW5nZSBhZnRlciBhbnkgb3RoZXIgbWV0aG9kcworICAgIC8vIGFyZSBjYWxsZWQgLSB0YWtlIGEgY29weSBpZiBuZWNlc3NhcnkuCisgICAgY29uc3QgY2hhciogZ2V0TmFtZSgpIGNvbnN0IHtyZXR1cm4gbmFtZS5idWY7fQorCisgICAgLy8gc2V0TmFtZSgpIHNwZWNpZmllcyB0aGUgZGVza3RvcCBuYW1lIHRoYXQgdGhlIHNlcnZlciBzaG91bGQgcHJvdmlkZSB0bworICAgIC8vIGNsaWVudHMKKyAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciogbmFtZV8pIHtuYW1lLnJlcGxhY2VCdWYoc3RyRHVwKG5hbWVfKSk7fQorCisgICAgLy8gQSBRdWVyeUNvbm5lY3Rpb25IYW5kbGVyLCBpZiBzdXBwbGllZCwgaXMgcGFzc2VkIGRldGFpbHMgb2YgaW5jb21pbmcKKyAgICAvLyBjb25uZWN0aW9ucyB0byBhcHByb3ZlLCByZWplY3QsIG9yIHF1ZXJ5IHRoZSB1c2VyIGFib3V0LgorICAgIC8vCisgICAgLy8gcXVlcnlDb25uZWN0aW9uKCkgaXMgY2FsbGVkIHdoZW4gYSBjb25uZWN0aW9uIGhhcyBiZWVuCisgICAgLy8gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQuICBUaGUgc29jayBhbmQgdXNlck5hbWUgYXJndW1lbnRzIGlkZW50aWZ5CisgICAgLy8gdGhlIHNvY2tldCBhbmQgdGhlIG5hbWUgb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlciwgaWYgYW55LiAgSXQgc2hvdWxkCisgICAgLy8gcmV0dXJuIEFDQ0VQVCBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQsIFJFSkVDVCBpZiBpdCBzaG91bGQKKyAgICAvLyBiZSByZWplY3RlZCwgb3IgUEVORElORyBpZiBhIGRlY2lzaW9uIGNhbm5vdCB5ZXQgYmUgcmVhY2hlZC4gIElmIFJFSkVDVAorICAgIC8vIGlzIHJldHVybmVkLCAqcmVhc29uIGNhbiBiZSBzZXQgdG8gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcmVhc29uIC0gdGhpcworICAgIC8vIHdpbGwgYmUgZGVsZXRlW11lZCB3aGVuIGl0IGlzIGZpbmlzaGVkIHdpdGguICBJZiBQRU5ESU5HIGlzIHJldHVybmVkLAorICAgIC8vIGFwcHJvdmVDb25uZWN0aW9uKCkgbXVzdCBiZSBjYWxsZWQgc29tZSB0aW1lIGxhdGVyIHRvIGFjY2VwdCBvciByZWplY3QKKyAgICAvLyB0aGUgY29ubmVjdGlvbi4KKyAgICBlbnVtIHF1ZXJ5UmVzdWx0IHsgQUNDRVBULCBSRUpFQ1QsIFBFTkRJTkcgfTsKKyAgICBzdHJ1Y3QgUXVlcnlDb25uZWN0aW9uSGFuZGxlciB7CisgICAgICB2aXJ0dWFsIH5RdWVyeUNvbm5lY3Rpb25IYW5kbGVyKCkge30KKyAgICAgIHZpcnR1YWwgcXVlcnlSZXN1bHQgcXVlcnlDb25uZWN0aW9uKG5ldHdvcms6OlNvY2tldCogc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqIHJlYXNvbikgPSAwOworICAgIH07CisgICAgdm9pZCBzZXRRdWVyeUNvbm5lY3Rpb25IYW5kbGVyKFF1ZXJ5Q29ubmVjdGlvbkhhbmRsZXIqIHFjaCkgeworICAgICAgcXVlcnlDb25uZWN0aW9uSGFuZGxlciA9IHFjaDsKKyAgICB9CisKKyAgICAvLyBxdWVyeUNvbm5lY3Rpb24gaXMgY2FsbGVkIGFzIGRlc2NyaWJlZCBhYm92ZSwgYW5kIGVpdGhlciBwYXNzZXMgdGhlCisgICAgLy8gcmVxdWVzdCBvbiB0byB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVyLCBvciBhY2NlcHRzIHRoZSBjb25uZWN0aW9uIGlmCisgICAgLy8gbm8gaGFuZGxlciBoYXMgYmVlbiBzcGVjaWZpZWQuCisgICAgdmlydHVhbCBxdWVyeVJlc3VsdCBxdWVyeUNvbm5lY3Rpb24obmV0d29yazo6U29ja2V0KiBzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiByZWFzb24pIHsKKyAgICAgIHJldHVybiBxdWVyeUNvbm5lY3Rpb25IYW5kbGVyCisgICAgICAgID8gcXVlcnlDb25uZWN0aW9uSGFuZGxlci0+cXVlcnlDb25uZWN0aW9uKHNvY2ssIHVzZXJOYW1lLCByZWFzb24pCisgICAgICAgIDogQUNDRVBUOworICAgIH0KKworICAgIC8vIGFwcHJvdmVDb25uZWN0aW9uKCkgaXMgY2FsbGVkIGJ5IHRoZSBhY3RpdmUgUXVlcnlDb25uZWN0aW9uSGFuZGxlciwKKyAgICAvLyBzb21lIHRpbWUgYWZ0ZXIgcXVlcnlDb25uZWN0aW9uKCkgaGFzIHJldHVybmVkIHdpdGggUEVORElORywgdG8gYWNjZXB0CisgICAgLy8gb3IgcmVqZWN0IHRoZSBjb25uZWN0aW9uLiAgVGhlIGFjY2VwdCBhcmd1bWVudCBzaG91bGQgYmUgdHJ1ZSBmb3IKKyAgICAvLyBhY2NlcHRhbmNlLCBvciBmYWxzZSBmb3IgcmVqZWN0aW9uLCBpbiB3aGljaCBjYXNlIGEgc3RyaW5nIHJlYXNvbiBtYXkKKyAgICAvLyBhbHNvIGJlIGdpdmVuLgorICAgIHZvaWQgYXBwcm92ZUNvbm5lY3Rpb24obmV0d29yazo6U29ja2V0KiBzb2NrLCBib29sIGFjY2VwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJlYXNvbik7CisKKyAgICAvLyBzZXRCbGFja2xpc3QoKSBpcyBjYWxsZWQgdG8gcmVwbGFjZSB0aGUgVk5DU2VydmVyU1QncyBpbnRlcm5hbAorICAgIC8vIEJsYWNrbGlzdCBpbnN0YW5jZSB3aXRoIGFub3RoZXIgaW5zdGFuY2UuICBUaGlzIGFsbG93cyBhIHNpbmdsZQorICAgIC8vIEJsYWNrbGlzdCB0byBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgVk5DU2VydmVyU1QgaW5zdGFuY2VzLgorICAgIHZvaWQgc2V0QmxhY2tsaXN0KEJsYWNrbGlzdCogYmwpIHtibEhvc3RzID0gYmwgPyBibCA6ICZibGFja2xpc3Q7fQorCisgICAgLy8gc2V0RWNvbm9taWNUcmFuc2xhdGUoKSBkZXRlcm1pbmVzIChmb3IgbmV3IGNvbm5lY3Rpb25zKSB3aGV0aGVyIHBpeGVscworICAgIC8vIHNob3VsZCBiZSB0cmFuc2xhdGVkIGZvciA8PTE2YnBwIGNsaWVudHMgdXNpbmcgYSBsYXJnZSBsb29rdXAgdGFibGUKKyAgICAvLyAoZmFzdCkgb3Igc2VwYXJhdGUsIHNtYWxsZXIgUiwgRyBhbmQgQiB0YWJsZXMgKHNsb3dlcikuICBJZiBzZXQgdG8gdHJ1ZSwKKyAgICAvLyBzbWFsbCB0YWJsZXMgYXJlIHVzZWQsIHRvIHNhdmUgbWVtb3J5LgorICAgIHZvaWQgc2V0RWNvbm9taWNUcmFuc2xhdGUoYm9vbCBldCkgeyB1c2VFY29ub21pY1RyYW5zbGF0ZSA9IGV0OyB9CisKKyAgICAvLyBzZXRLZXlSZW1hcHBlcigpIHJlcGxhY2VzIHRoZSBWTkNTZXJ2ZXJTVCdzIGRlZmF1bHQga2V5IHJlbWFwcGVyLgorICAgIC8vIE5COiBBIG51bGwgcG9pbnRlciBpcyB2YWxpZCBoZXJlLgorICAgIHZvaWQgc2V0S2V5UmVtYXBwZXIoS2V5UmVtYXBwZXIqIGtyKSB7IGtleVJlbWFwcGVyID0ga3I7IH0KKworICAgIHZvaWQgZ2V0Q29ubkluZm8oTGlzdENvbm5JbmZvICogbGlzdENvbm4pOworICAgIHZvaWQgc2V0Q29ublN0YXR1cyhMaXN0Q29ubkluZm8qIGxpc3RDb25uKTsKKworICAgIGJvb2wgZ2V0RGlzYWJsZSgpIHsgcmV0dXJuIGRpc2FibGVjbGllbnRzO307CisgICAgdm9pZCBzZXREaXNhYmxlKGJvb2wgZGlzYWJsZSkgeyBkaXNhYmxlY2xpZW50cyA9IGRpc2FibGU7fTsKKworICAgIHZvaWQgc2V0RlRNYW5hZ2VyKHJmYjo6U0ZpbGVUcmFuc2Zlck1hbmFnZXIgKnBGVE1hbmFnZXIpIHsgbV9wRlRNYW5hZ2VyID0gcEZUTWFuYWdlcjsgfTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgVk5DU0Nvbm5lY3Rpb25TVDsKKworICAgIHZvaWQgc3RhcnREZXNrdG9wKCk7CisKKyAgICBzdGF0aWMgTG9nV3JpdGVyIGNvbm5lY3Rpb25zTG9nOworICAgIEJsYWNrbGlzdCBibGFja2xpc3Q7CisgICAgQmxhY2tsaXN0KiBibEhvc3RzOworCisgICAgU0Rlc2t0b3AqIGRlc2t0b3A7CisgICAgYm9vbCBkZXNrdG9wU3RhcnRlZDsKKyAgICBQaXhlbEJ1ZmZlciogcGI7CisKKyAgICBTRmlsZVRyYW5zZmVyTWFuYWdlciAqbV9wRlRNYW5hZ2VyOworCisgICAgQ2hhckFycmF5IG5hbWU7CisKKyAgICBzdGQ6Omxpc3Q8Vk5DU0Nvbm5lY3Rpb25TVCo+IGNsaWVudHM7CisgICAgVk5DU0Nvbm5lY3Rpb25TVCogcG9pbnRlckNsaWVudDsKKyAgICBzdGQ6Omxpc3Q8bmV0d29yazo6U29ja2V0Kj4gY2xvc2luZ1NvY2tldHM7CisKKyAgICBDb21wYXJpbmdVcGRhdGVUcmFja2VyKiBjb21wYXJlcjsKKworICAgIFBvaW50IGN1cnNvclBvczsKKyAgICBDdXJzb3IgY3Vyc29yOworICAgIFBvaW50IGN1cnNvclRMKCkgeyByZXR1cm4gY3Vyc29yUG9zLnN1YnRyYWN0KGN1cnNvci5ob3RzcG90KTsgfQorICAgIFBvaW50IHJlbmRlcmVkQ3Vyc29yVEw7CisgICAgTWFuYWdlZFBpeGVsQnVmZmVyIHJlbmRlcmVkQ3Vyc29yOworICAgIGJvb2wgcmVuZGVyZWRDdXJzb3JJbnZhbGlkOworCisgICAgLy8gLSBDaGVjayBob3cgbWFueSBvZiB0aGUgY2xpZW50cyBhcmUgYXV0aGVudGljYXRlZC4KKyAgICBpbnQgYXV0aENsaWVudENvdW50KCk7CisKKyAgICBib29sIG5lZWRSZW5kZXJlZEN1cnNvcigpOworICAgIHZvaWQgY2hlY2tVcGRhdGUoKTsKKworICAgIFNTZWN1cml0eUZhY3RvcnkqIHNlY3VyaXR5RmFjdG9yeTsKKyAgICBRdWVyeUNvbm5lY3Rpb25IYW5kbGVyKiBxdWVyeUNvbm5lY3Rpb25IYW5kbGVyOworICAgIEtleVJlbWFwcGVyKiBrZXlSZW1hcHBlcjsKKyAgICBib29sIHVzZUVjb25vbWljVHJhbnNsYXRlOworICAgIAorICAgIHRpbWVfdCBsYXN0VXNlcklucHV0VGltZTsKKyAgICB0aW1lX3QgbGFzdERpc2Nvbm5lY3RUaW1lOworICAgIHRpbWVfdCBsYXN0Q29ubmVjdGlvblRpbWU7CisKKyAgICBib29sIGRpc2FibGVjbGllbnRzOworICB9OworCit9OworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9aUkxFRGVjb2Rlci5jeHggYi9jb21tb24vcmZiL1pSTEVEZWNvZGVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2M2OTEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9aUkxFRGVjb2Rlci5jeHgKQEAgLTAsMCArMSw5MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2luY2x1ZGUgPHJmYi9DTXNnUmVhZGVyLmg+CisjaW5jbHVkZSA8cmZiL0NNc2dIYW5kbGVyLmg+CisjaW5jbHVkZSA8cmZiL1pSTEVEZWNvZGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKKyNkZWZpbmUgRVhUUkFfQVJHUyBDTXNnSGFuZGxlciogaGFuZGxlcgorI2RlZmluZSBGSUxMX1JFQ1QociwgcCkgaGFuZGxlci0+ZmlsbFJlY3QociwgcCkKKyNkZWZpbmUgSU1BR0VfUkVDVChyLCBwKSBoYW5kbGVyLT5pbWFnZVJlY3QociwgcCkKKyNkZWZpbmUgQlBQIDgKKyNpbmNsdWRlIDxyZmIvenJsZURlY29kZS5oPgorI3VuZGVmIEJQUAorI2RlZmluZSBCUFAgMTYKKyNpbmNsdWRlIDxyZmIvenJsZURlY29kZS5oPgorI3VuZGVmIEJQUAorI2RlZmluZSBCUFAgMzIKKyNpbmNsdWRlIDxyZmIvenJsZURlY29kZS5oPgorI2RlZmluZSBDUElYRUwgMjRBCisjaW5jbHVkZSA8cmZiL3pybGVEZWNvZGUuaD4KKyN1bmRlZiBDUElYRUwKKyNkZWZpbmUgQ1BJWEVMIDI0QgorI2luY2x1ZGUgPHJmYi96cmxlRGVjb2RlLmg+CisjdW5kZWYgQ1BJWEVMCisjdW5kZWYgQlBQCisKK0RlY29kZXIqIFpSTEVEZWNvZGVyOjpjcmVhdGUoQ01zZ1JlYWRlciogcmVhZGVyKQoreworICByZXR1cm4gbmV3IFpSTEVEZWNvZGVyKHJlYWRlcik7Cit9CisKK1pSTEVEZWNvZGVyOjpaUkxFRGVjb2RlcihDTXNnUmVhZGVyKiByZWFkZXJfKSA6IHJlYWRlcihyZWFkZXJfKQoreworfQorCitaUkxFRGVjb2Rlcjo6flpSTEVEZWNvZGVyKCkKK3sKK30KKwordm9pZCBaUkxFRGVjb2Rlcjo6cmVhZFJlY3QoY29uc3QgUmVjdCYgciwgQ01zZ0hhbmRsZXIqIGhhbmRsZXIpCit7CisgIHJkcjo6SW5TdHJlYW0qIGlzID0gcmVhZGVyLT5nZXRJblN0cmVhbSgpOworICByZHI6OlU4KiBidWYgPSByZWFkZXItPmdldEltYWdlQnVmKDY0ICogNjQgKiA0KTsKKyAgc3dpdGNoIChyZWFkZXItPmJwcCgpKSB7CisgIGNhc2UgODogIHpybGVEZWNvZGU4IChyLCBpcywgJnppcywgKHJkcjo6VTgqKSBidWYsIGhhbmRsZXIpOyBicmVhazsKKyAgY2FzZSAxNjogenJsZURlY29kZTE2KHIsIGlzLCAmemlzLCAocmRyOjpVMTYqKWJ1ZiwgaGFuZGxlcik7IGJyZWFrOworICBjYXNlIDMyOgorICAgIHsKKyAgICAgIGNvbnN0IHJmYjo6UGl4ZWxGb3JtYXQmIHBmID0gaGFuZGxlci0+Y3AucGYoKTsKKyAgICAgIGJvb2wgZml0c0luTFMzQnl0ZXMgPSAoKHBmLnJlZE1heCAgIDw8IHBmLnJlZFNoaWZ0KSAgIDwgKDE8PDI0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGYuZ3JlZW5NYXggPDwgcGYuZ3JlZW5TaGlmdCkgPCAoMTw8MjQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwZi5ibHVlTWF4ICA8PCBwZi5ibHVlU2hpZnQpICA8ICgxPDwyNCkpOworCisgICAgICBib29sIGZpdHNJbk1TM0J5dGVzID0gKHBmLnJlZFNoaWZ0ICAgPiA3ICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZi5ncmVlblNoaWZ0ID4gNyAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGYuYmx1ZVNoaWZ0ICA+IDcpOworCisgICAgICBpZiAoKGZpdHNJbkxTM0J5dGVzICYmICFwZi5iaWdFbmRpYW4pIHx8CisgICAgICAgICAgKGZpdHNJbk1TM0J5dGVzICYmIHBmLmJpZ0VuZGlhbikpCisgICAgICB7CisgICAgICAgIHpybGVEZWNvZGUyNEEociwgaXMsICZ6aXMsIChyZHI6OlUzMiopYnVmLCBoYW5kbGVyKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChmaXRzSW5MUzNCeXRlcyAmJiBwZi5iaWdFbmRpYW4pIHx8CisgICAgICAgICAgICAgICAoZml0c0luTVMzQnl0ZXMgJiYgIXBmLmJpZ0VuZGlhbikpCisgICAgICB7CisgICAgICAgIHpybGVEZWNvZGUyNEIociwgaXMsICZ6aXMsIChyZHI6OlUzMiopYnVmLCBoYW5kbGVyKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgenJsZURlY29kZTMyKHIsIGlzLCAmemlzLCAocmRyOjpVMzIqKWJ1ZiwgaGFuZGxlcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvWlJMRURlY29kZXIuaCBiL2NvbW1vbi9yZmIvWlJMRURlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk2YzczCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9aUkxFRGVjb2Rlci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpZm5kZWYgX19SRkJfWlJMRURFQ09ERVJfSF9fCisjZGVmaW5lIF9fUkZCX1pSTEVERUNPREVSX0hfXworCisjaW5jbHVkZSA8cmRyL1psaWJJblN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9EZWNvZGVyLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIGNsYXNzIFpSTEVEZWNvZGVyIDogcHVibGljIERlY29kZXIgeworICBwdWJsaWM6CisgICAgc3RhdGljIERlY29kZXIqIGNyZWF0ZShDTXNnUmVhZGVyKiByZWFkZXIpOworICAgIHZpcnR1YWwgdm9pZCByZWFkUmVjdChjb25zdCBSZWN0JiByLCBDTXNnSGFuZGxlciogaGFuZGxlcik7CisgICAgdmlydHVhbCB+WlJMRURlY29kZXIoKTsKKyAgcHJpdmF0ZToKKyAgICBaUkxFRGVjb2RlcihDTXNnUmVhZGVyKiByZWFkZXIpOworICAgIENNc2dSZWFkZXIqIHJlYWRlcjsKKyAgICByZHI6OlpsaWJJblN0cmVhbSB6aXM7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvWlJMRUVuY29kZXIuY3h4IGIvY29tbW9uL3JmYi9aUkxFRW5jb2Rlci5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0YzRjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvWlJMRUVuY29kZXIuY3h4CkBAIC0wLDAgKzEsMTIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8cmRyL091dFN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvSW1hZ2VHZXR0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvZW5jb2RpbmdzLmg+CisjaW5jbHVkZSA8cmZiL0Nvbm5QYXJhbXMuaD4KKyNpbmNsdWRlIDxyZmIvU01zZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9aUkxFRW5jb2Rlci5oPgorI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK3Jkcjo6TWVtT3V0U3RyZWFtKiBaUkxFRW5jb2Rlcjo6c2hhcmVkTW9zID0gMDsKK2ludCBaUkxFRW5jb2Rlcjo6bWF4TGVuID0gNDA5NyAqIDEwMjQ7IC8vIGVub3VnaCBmb3Igd2lkdGggMTYzODQgMzItYml0IHBpeGVscworCitJbnRQYXJhbWV0ZXIgemxpYkxldmVsKCJabGliTGV2ZWwiLCJabGliIGNvbXByZXNzaW9uIGxldmVsIiwtMSk7CisKKyNkZWZpbmUgRVhUUkFfQVJHUyBJbWFnZUdldHRlciogaWcKKyNkZWZpbmUgR0VUX0lNQUdFX0lOVE9fQlVGKHIsYnVmKSBpZy0+Z2V0SW1hZ2UoYnVmLCByKTsKKyNkZWZpbmUgQlBQIDgKKyNpbmNsdWRlIDxyZmIvenJsZUVuY29kZS5oPgorI3VuZGVmIEJQUAorI2RlZmluZSBCUFAgMTYKKyNpbmNsdWRlIDxyZmIvenJsZUVuY29kZS5oPgorI3VuZGVmIEJQUAorI2RlZmluZSBCUFAgMzIKKyNpbmNsdWRlIDxyZmIvenJsZUVuY29kZS5oPgorI2RlZmluZSBDUElYRUwgMjRBCisjaW5jbHVkZSA8cmZiL3pybGVFbmNvZGUuaD4KKyN1bmRlZiBDUElYRUwKKyNkZWZpbmUgQ1BJWEVMIDI0QgorI2luY2x1ZGUgPHJmYi96cmxlRW5jb2RlLmg+CisjdW5kZWYgQ1BJWEVMCisjdW5kZWYgQlBQCisKK0VuY29kZXIqIFpSTEVFbmNvZGVyOjpjcmVhdGUoU01zZ1dyaXRlciogd3JpdGVyKQoreworICByZXR1cm4gbmV3IFpSTEVFbmNvZGVyKHdyaXRlcik7Cit9CisKK1pSTEVFbmNvZGVyOjpaUkxFRW5jb2RlcihTTXNnV3JpdGVyKiB3cml0ZXJfKQorICA6IHdyaXRlcih3cml0ZXJfKSwgem9zKDAsMCx6bGliTGV2ZWwpCit7CisgIGlmIChzaGFyZWRNb3MpCisgICAgbW9zID0gc2hhcmVkTW9zOworICBlbHNlCisgICAgbW9zID0gbmV3IHJkcjo6TWVtT3V0U3RyZWFtKDEyOSoxMDI0KTsKK30KKworWlJMRUVuY29kZXI6On5aUkxFRW5jb2RlcigpCit7CisgIGlmICghc2hhcmVkTW9zKQorICAgIGRlbGV0ZSBtb3M7Cit9CisKK2Jvb2wgWlJMRUVuY29kZXI6OndyaXRlUmVjdChjb25zdCBSZWN0JiByLCBJbWFnZUdldHRlciogaWcsIFJlY3QqIGFjdHVhbCkKK3sKKyAgcmRyOjpVOCogaW1hZ2VCdWYgPSB3cml0ZXItPmdldEltYWdlQnVmKDY0ICogNjQgKiA0ICsgNCk7CisgIG1vcy0+Y2xlYXIoKTsKKyAgYm9vbCB3cm90ZUFsbCA9IHRydWU7CisgICphY3R1YWwgPSByOworCisgIHN3aXRjaCAod3JpdGVyLT5icHAoKSkgeworICBjYXNlIDg6CisgICAgd3JvdGVBbGwgPSB6cmxlRW5jb2RlOChyLCBtb3MsICZ6b3MsIGltYWdlQnVmLCBtYXhMZW4sIGFjdHVhbCwgaWcpOworICAgIGJyZWFrOworICBjYXNlIDE2OgorICAgIHdyb3RlQWxsID0genJsZUVuY29kZTE2KHIsIG1vcywgJnpvcywgaW1hZ2VCdWYsIG1heExlbiwgYWN0dWFsLCBpZyk7CisgICAgYnJlYWs7CisgIGNhc2UgMzI6CisgICAgeworICAgICAgY29uc3QgUGl4ZWxGb3JtYXQmIHBmID0gd3JpdGVyLT5nZXRDb25uUGFyYW1zKCktPnBmKCk7CisKKyAgICAgIGJvb2wgZml0c0luTFMzQnl0ZXMgPSAoKHBmLnJlZE1heCAgIDw8IHBmLnJlZFNoaWZ0KSAgIDwgKDE8PDI0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGYuZ3JlZW5NYXggPDwgcGYuZ3JlZW5TaGlmdCkgPCAoMTw8MjQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwZi5ibHVlTWF4ICA8PCBwZi5ibHVlU2hpZnQpICA8ICgxPDwyNCkpOworCisgICAgICBib29sIGZpdHNJbk1TM0J5dGVzID0gKHBmLnJlZFNoaWZ0ICAgPiA3ICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZi5ncmVlblNoaWZ0ID4gNyAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGYuYmx1ZVNoaWZ0ICA+IDcpOworCisgICAgICBpZiAoKGZpdHNJbkxTM0J5dGVzICYmICFwZi5iaWdFbmRpYW4pIHx8CisgICAgICAgICAgKGZpdHNJbk1TM0J5dGVzICYmIHBmLmJpZ0VuZGlhbikpCisgICAgICB7CisgICAgICAgIHdyb3RlQWxsID0genJsZUVuY29kZTI0QShyLCBtb3MsICZ6b3MsIGltYWdlQnVmLCBtYXhMZW4sIGFjdHVhbCwgaWcpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKGZpdHNJbkxTM0J5dGVzICYmIHBmLmJpZ0VuZGlhbikgfHwKKyAgICAgICAgICAgICAgIChmaXRzSW5NUzNCeXRlcyAmJiAhcGYuYmlnRW5kaWFuKSkKKyAgICAgIHsKKyAgICAgICAgd3JvdGVBbGwgPSB6cmxlRW5jb2RlMjRCKHIsIG1vcywgJnpvcywgaW1hZ2VCdWYsIG1heExlbiwgYWN0dWFsLCBpZyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHdyb3RlQWxsID0genJsZUVuY29kZTMyKHIsIG1vcywgJnpvcywgaW1hZ2VCdWYsIG1heExlbiwgYWN0dWFsLCBpZyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICB3cml0ZXItPnN0YXJ0UmVjdCgqYWN0dWFsLCBlbmNvZGluZ1pSTEUpOworICByZHI6Ok91dFN0cmVhbSogb3MgPSB3cml0ZXItPmdldE91dFN0cmVhbSgpOworICBvcy0+d3JpdGVVMzIobW9zLT5sZW5ndGgoKSk7CisgIG9zLT53cml0ZUJ5dGVzKG1vcy0+ZGF0YSgpLCBtb3MtPmxlbmd0aCgpKTsKKyAgd3JpdGVyLT5lbmRSZWN0KCk7CisgIHJldHVybiB3cm90ZUFsbDsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvWlJMRUVuY29kZXIuaCBiL2NvbW1vbi9yZmIvWlJMRUVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzY4OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9aUkxFRW5jb2Rlci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpZm5kZWYgX19SRkJfWlJMRUVOQ09ERVJfSF9fCisjZGVmaW5lIF9fUkZCX1pSTEVFTkNPREVSX0hfXworCisjaW5jbHVkZSA8cmRyL01lbU91dFN0cmVhbS5oPgorI2luY2x1ZGUgPHJkci9abGliT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL0VuY29kZXIuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKyAgY2xhc3MgWlJMRUVuY29kZXIgOiBwdWJsaWMgRW5jb2RlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgRW5jb2RlciogY3JlYXRlKFNNc2dXcml0ZXIqIHdyaXRlcik7CisgICAgdmlydHVhbCBib29sIHdyaXRlUmVjdChjb25zdCBSZWN0JiByLCBJbWFnZUdldHRlciogaWcsIFJlY3QqIGFjdHVhbCk7CisgICAgdmlydHVhbCB+WlJMRUVuY29kZXIoKTsKKworICAgIC8vIHNldE1heExlbigpIHNldHMgdGhlIG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBhbnkgWlJMRSByZWN0YW5nbGUuICBUaGlzCisgICAgLy8gY2FuIGJlIHVzZWQgdG8gc3RvcCB0aGUgTWVtT3V0U3RyZWFtIGZyb20gZ3Jvd2luZyB0b28gbGFyZ2UuICBUaGUgdmFsdWUKKyAgICAvLyBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBhbGxvdyBmb3IgYXQgbGVhc3Qgb25lIHJvdyBvZiBaUkxFIHRpbGVzLiAgU28KKyAgICAvLyBmb3IgZXhhbXBsZSBmb3IgYSBzY3JlZW4gd2lkdGggb2YgMjA0OCAzMi1iaXQgcGl4ZWxzIHRoaXMgaXMgMksqNCo2NCA9CisgICAgLy8gNTEyS2J5dGVzIHBsdXMgYSBiaXQgb2Ygb3ZlcmhlYWQgKHRoZSBvdmVyaGVhZCBpcyBhYm91dCAxLzE2IG9mIHRoZQorICAgIC8vIHdpZHRoLCBpbiB0aGlzIGV4YW1wbGUgYWJvdXQgMTI4IGJ5dGVzKS4KKyAgICBzdGF0aWMgdm9pZCBzZXRNYXhMZW4oaW50IG0pIHsgbWF4TGVuID0gbTsgfQorCisgICAgLy8gc2V0U2hhcmVkTW9zKCkgc2V0cyBhIE1lbU91dFN0cmVhbSB0byBiZSBzaGFyZWQgYW1vbmdzdCBhbGwKKyAgICAvLyBaUkxFRW5jb2RlcnMuICBTaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgWlJMRUVuY29kZXJzIGFyZSBjcmVhdGVkLgorICAgIHN0YXRpYyB2b2lkIHNldFNoYXJlZE1vcyhyZHI6Ok1lbU91dFN0cmVhbSogbW9zXykgeyBzaGFyZWRNb3MgPSBtb3NfOyB9CisKKyAgcHJpdmF0ZToKKyAgICBaUkxFRW5jb2RlcihTTXNnV3JpdGVyKiB3cml0ZXIpOworICAgIFNNc2dXcml0ZXIqIHdyaXRlcjsKKyAgICByZHI6OlpsaWJPdXRTdHJlYW0gem9zOworICAgIHJkcjo6TWVtT3V0U3RyZWFtKiBtb3M7CisgICAgc3RhdGljIHJkcjo6TWVtT3V0U3RyZWFtKiBzaGFyZWRNb3M7CisgICAgc3RhdGljIGludCBtYXhMZW47CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvZDNkZXMuYyBiL2NvbW1vbi9yZmIvZDNkZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWNhNTgxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9kM2Rlcy5jCkBAIC0wLDAgKzEsNDM0IEBACisvKgorICogVGhpcyBpcyBEM0RFUyAoVjUuMDkpIGJ5IFJpY2hhcmQgT3V0ZXJicmlkZ2Ugd2l0aCB0aGUgZG91YmxlIGFuZAorICogdHJpcGxlLWxlbmd0aCBzdXBwb3J0IHJlbW92ZWQgZm9yIHVzZSBpbiBWTkMuICBBbHNvIHRoZSBieXRlYml0W10gYXJyYXkKKyAqIGhhcyBiZWVuIHJldmVyc2VkIHNvIHRoYXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIGVhY2ggYnl0ZSBvZiB0aGUKKyAqIGtleSBpcyBpZ25vcmVkLCBub3QgdGhlIGxlYXN0IHNpZ25pZmljYW50LgorICoKKyAqIFRoZXNlIGNoYW5nZXMgYXJlOgorICogIENvcHlyaWdodCAoQykgMTk5OSBBVCZUIExhYm9yYXRvcmllcyBDYW1icmlkZ2UuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworLyogRDNERVMgKFY1LjA5KSAtCisgKgorICogQSBwb3J0YWJsZSwgcHVibGljIGRvbWFpbiwgdmVyc2lvbiBvZiB0aGUgRGF0YSBFbmNyeXB0aW9uIFN0YW5kYXJkLgorICoKKyAqIFdyaXR0ZW4gd2l0aCBTeW1hbnRlYydzIFRISU5LIChMaWdodHNwZWVkKSBDIGJ5IFJpY2hhcmQgT3V0ZXJicmlkZ2UuCisgKiBUaGFua3MgdG86IERhbiBIb2V5IGZvciBoaXMgZXhjZWxsZW50IEluaXRpYWwgYW5kIEludmVyc2UgcGVybXV0YXRpb24KKyAqIGNvZGU7ICBKaW0gR2lsbG9nbHkgJiBQaGlsIEthcm4gZm9yIHRoZSBERVMga2V5IHNjaGVkdWxlIGNvZGU7IERlbm5pcworICogRmVyZ3Vzb24sIEVyaWMgWW91bmcgYW5kIERhbmEgSG93IGZvciBjb21wYXJpbmcgbm90ZXM7IGFuZCBSYXkgTGF1LAorICogZm9yIGh1bW91cmluZyBtZSBvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsMTk4OSwxOTkwLDE5OTEsMTk5MiBieSBSaWNoYXJkIE91dGVyYnJpZGdlLgorICogKEdFbmllIDogT1VURVI7IENJUyA6IFs3MTc1NSwyMDRdKSBHcmF2ZW4gSW1hZ2VyeSwgMTk5Mi4KKyAqLworCisjaW5jbHVkZSAiZDNkZXMuaCIKKworc3RhdGljIHZvaWQgc2NydW5jaCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKik7CitzdGF0aWMgdm9pZCB1bnNjcnVuKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgY2hhciAqKTsKK3N0YXRpYyB2b2lkIGRlc2Z1bmModW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICopOworc3RhdGljIHZvaWQgY29va2V5KHVuc2lnbmVkIGxvbmcgKik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEtuTFszMl0gPSB7IDBMIH07CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBieXRlYml0WzhdCT0geworCTAxLCAwMiwgMDQsIDAxMCwgMDIwLCAwNDAsIDAxMDAsIDAyMDAgfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmlnYnl0ZVsyNF0gPSB7CisJMHg4MDAwMDBMLAkweDQwMDAwMEwsCTB4MjAwMDAwTCwJMHgxMDAwMDBMLAorCTB4ODAwMDBMLAkweDQwMDAwTCwJMHgyMDAwMEwsCTB4MTAwMDBMLAorCTB4ODAwMEwsCTB4NDAwMEwsCTB4MjAwMEwsCTB4MTAwMEwsCisJMHg4MDBMLCAJMHg0MDBMLCAJMHgyMDBMLCAJMHgxMDBMLAorCTB4ODBMLAkJMHg0MEwsCQkweDIwTCwJCTB4MTBMLAorCTB4OEwsCQkweDRMLAkJMHgyTCwJCTB4MUwJfTsKKworLyogVXNlIHRoZSBrZXkgc2NoZWR1bGUgc3BlY2lmaWVkIGluIHRoZSBTdGFuZGFyZCAoQU5TSSBYMy45Mi0xOTgxKS4gKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGMxWzU2XSA9IHsKKwk1NiwgNDgsIDQwLCAzMiwgMjQsIDE2LCAgOCwJIDAsIDU3LCA0OSwgNDEsIDMzLCAyNSwgMTcsCisJIDksICAxLCA1OCwgNTAsIDQyLCAzNCwgMjYsCTE4LCAxMCwgIDIsIDU5LCA1MSwgNDMsIDM1LAorCTYyLCA1NCwgNDYsIDM4LCAzMCwgMjIsIDE0LAkgNiwgNjEsIDUzLCA0NSwgMzcsIDI5LCAyMSwKKwkxMywgIDUsIDYwLCA1MiwgNDQsIDM2LCAyOCwJMjAsIDEyLCAgNCwgMjcsIDE5LCAxMSwgIDMgfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdG90cm90WzE2XSA9IHsKKwkxLDIsNCw2LDgsMTAsMTIsMTQsMTUsMTcsMTksMjEsMjMsMjUsMjcsMjggfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGMyWzQ4XSA9IHsKKwkxMywgMTYsIDEwLCAyMywgIDAsICA0LCAgMiwgMjcsIDE0LCAgNSwgMjAsICA5LAorCTIyLCAxOCwgMTEsICAzLCAyNSwgIDcsIDE1LCAgNiwgMjYsIDE5LCAxMiwgIDEsCisJNDAsIDUxLCAzMCwgMzYsIDQ2LCA1NCwgMjksIDM5LCA1MCwgNDQsIDMyLCA0NywKKwk0MywgNDgsIDM4LCA1NSwgMzMsIDUyLCA0NSwgNDEsIDQ5LCAzNSwgMjgsIDMxIH07CisKK3ZvaWQgZGVza2V5KGtleSwgZWRmKQkvKiBUaGFua3MgdG8gSmFtZXMgR2lsbG9nbHkgJiBQaGlsIEthcm4hICovCit1bnNpZ25lZCBjaGFyICprZXk7CitpbnQgZWRmOworeworCXJlZ2lzdGVyIGludCBpLCBqLCBsLCBtLCBuOworCXVuc2lnbmVkIGNoYXIgcGMxbVs1Nl0sIHBjcls1Nl07CisJdW5zaWduZWQgbG9uZyBrblszMl07CisKKwlmb3IgKCBqID0gMDsgaiA8IDU2OyBqKysgKSB7CisJCWwgPSBwYzFbal07CisJCW0gPSBsICYgMDc7CisJCXBjMW1bal0gPSAoa2V5W2wgPj4gM10gJiBieXRlYml0W21dKSA/IDEgOiAwOworCQl9CisJZm9yKCBpID0gMDsgaSA8IDE2OyBpKysgKSB7CisJCWlmKCBlZGYgPT0gREUxICkgbSA9ICgxNSAtIGkpIDw8IDE7CisJCWVsc2UgbSA9IGkgPDwgMTsKKwkJbiA9IG0gKyAxOworCQlrblttXSA9IGtuW25dID0gMEw7CisJCWZvciggaiA9IDA7IGogPCAyODsgaisrICkgeworCQkJbCA9IGogKyB0b3Ryb3RbaV07CisJCQlpZiggbCA8IDI4ICkgcGNyW2pdID0gcGMxbVtsXTsKKwkJCWVsc2UgcGNyW2pdID0gcGMxbVtsIC0gMjhdOworCQkJfQorCQlmb3IoIGogPSAyODsgaiA8IDU2OyBqKysgKSB7CisJCSAgICBsID0gaiArIHRvdHJvdFtpXTsKKwkJICAgIGlmKCBsIDwgNTYgKSBwY3Jbal0gPSBwYzFtW2xdOworCQkgICAgZWxzZSBwY3Jbal0gPSBwYzFtW2wgLSAyOF07CisJCSAgICB9CisJCWZvciggaiA9IDA7IGogPCAyNDsgaisrICkgeworCQkJaWYoIHBjcltwYzJbal1dICkga25bbV0gfD0gYmlnYnl0ZVtqXTsKKwkJCWlmKCBwY3JbcGMyW2orMjRdXSApIGtuW25dIHw9IGJpZ2J5dGVbal07CisJCQl9CisJCX0KKwljb29rZXkoa24pOworCXJldHVybjsKKwl9CisKK3N0YXRpYyB2b2lkIGNvb2tleShyYXcxKQorcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqcmF3MTsKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nICpjb29rLCAqcmF3MDsKKwl1bnNpZ25lZCBsb25nIGRvdWdoWzMyXTsKKwlyZWdpc3RlciBpbnQgaTsKKworCWNvb2sgPSBkb3VnaDsKKwlmb3IoIGkgPSAwOyBpIDwgMTY7IGkrKywgcmF3MSsrICkgeworCQlyYXcwID0gcmF3MSsrOworCQkqY29vawkgPSAoKnJhdzAgJiAweDAwZmMwMDAwTCkgPDwgNjsKKwkJKmNvb2sJfD0gKCpyYXcwICYgMHgwMDAwMGZjMEwpIDw8IDEwOworCQkqY29vawl8PSAoKnJhdzEgJiAweDAwZmMwMDAwTCkgPj4gMTA7CisJCSpjb29rKysgfD0gKCpyYXcxICYgMHgwMDAwMGZjMEwpID4+IDY7CisJCSpjb29rCSA9ICgqcmF3MCAmIDB4MDAwM2YwMDBMKSA8PCAxMjsKKwkJKmNvb2sJfD0gKCpyYXcwICYgMHgwMDAwMDAzZkwpIDw8IDE2OworCQkqY29vawl8PSAoKnJhdzEgJiAweDAwMDNmMDAwTCkgPj4gNDsKKwkJKmNvb2srKyB8PSAoKnJhdzEgJiAweDAwMDAwMDNmTCk7CisJCX0KKwl1c2VrZXkoZG91Z2gpOworCXJldHVybjsKKwl9CisKK3ZvaWQgY3BrZXkoaW50bykKK3JlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKmludG87Cit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqZnJvbSwgKmVuZHA7CisKKwlmcm9tID0gS25MLCBlbmRwID0gJktuTFszMl07CisJd2hpbGUoIGZyb20gPCBlbmRwICkgKmludG8rKyA9ICpmcm9tKys7CisJcmV0dXJuOworCX0KKwordm9pZCB1c2VrZXkoZnJvbSkKK3JlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKmZyb207Cit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqdG8sICplbmRwOworCisJdG8gPSBLbkwsIGVuZHAgPSAmS25MWzMyXTsKKwl3aGlsZSggdG8gPCBlbmRwICkgKnRvKysgPSAqZnJvbSsrOworCXJldHVybjsKKwl9CisKK3ZvaWQgZGVzKGluYmxvY2ssIG91dGJsb2NrKQordW5zaWduZWQgY2hhciAqaW5ibG9jaywgKm91dGJsb2NrOworeworCXVuc2lnbmVkIGxvbmcgd29ya1syXTsKKworCXNjcnVuY2goaW5ibG9jaywgd29yayk7CisJZGVzZnVuYyh3b3JrLCBLbkwpOworCXVuc2NydW4od29yaywgb3V0YmxvY2spOworCXJldHVybjsKKwl9CisKK3N0YXRpYyB2b2lkIHNjcnVuY2gob3V0b2YsIGludG8pCityZWdpc3RlciB1bnNpZ25lZCBjaGFyICpvdXRvZjsKK3JlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKmludG87Cit7CisJKmludG8JID0gKCpvdXRvZisrICYgMHhmZkwpIDw8IDI0OworCSppbnRvCXw9ICgqb3V0b2YrKyAmIDB4ZmZMKSA8PCAxNjsKKwkqaW50bwl8PSAoKm91dG9mKysgJiAweGZmTCkgPDwgODsKKwkqaW50bysrIHw9ICgqb3V0b2YrKyAmIDB4ZmZMKTsKKwkqaW50bwkgPSAoKm91dG9mKysgJiAweGZmTCkgPDwgMjQ7CisJKmludG8JfD0gKCpvdXRvZisrICYgMHhmZkwpIDw8IDE2OworCSppbnRvCXw9ICgqb3V0b2YrKyAmIDB4ZmZMKSA8PCA4OworCSppbnRvCXw9ICgqb3V0b2YgICAmIDB4ZmZMKTsKKwlyZXR1cm47CisJfQorCitzdGF0aWMgdm9pZCB1bnNjcnVuKG91dG9mLCBpbnRvKQorcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqb3V0b2Y7CityZWdpc3RlciB1bnNpZ25lZCBjaGFyICppbnRvOworeworCSppbnRvKysgPSAodW5zaWduZWQgY2hhcikoKCpvdXRvZiA+PiAyNCkgJiAweGZmTCk7CisJKmludG8rKyA9ICh1bnNpZ25lZCBjaGFyKSgoKm91dG9mID4+IDE2KSAmIDB4ZmZMKTsKKwkqaW50bysrID0gKHVuc2lnbmVkIGNoYXIpKCgqb3V0b2YgPj4gIDgpICYgMHhmZkwpOworCSppbnRvKysgPSAodW5zaWduZWQgY2hhcikoKm91dG9mKysJICYgMHhmZkwpOworCSppbnRvKysgPSAodW5zaWduZWQgY2hhcikoKCpvdXRvZiA+PiAyNCkgJiAweGZmTCk7CisJKmludG8rKyA9ICh1bnNpZ25lZCBjaGFyKSgoKm91dG9mID4+IDE2KSAmIDB4ZmZMKTsKKwkqaW50bysrID0gKHVuc2lnbmVkIGNoYXIpKCgqb3V0b2YgPj4gIDgpICYgMHhmZkwpOworCSppbnRvCT0gICh1bnNpZ25lZCBjaGFyKSgqb3V0b2YJICYgMHhmZkwpOworCXJldHVybjsKKwl9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFNQMVs2NF0gPSB7CisJMHgwMTAxMDQwMEwsIDB4MDAwMDAwMDBMLCAweDAwMDEwMDAwTCwgMHgwMTAxMDQwNEwsCisJMHgwMTAxMDAwNEwsIDB4MDAwMTA0MDRMLCAweDAwMDAwMDA0TCwgMHgwMDAxMDAwMEwsCisJMHgwMDAwMDQwMEwsIDB4MDEwMTA0MDBMLCAweDAxMDEwNDA0TCwgMHgwMDAwMDQwMEwsCisJMHgwMTAwMDQwNEwsIDB4MDEwMTAwMDRMLCAweDAxMDAwMDAwTCwgMHgwMDAwMDAwNEwsCisJMHgwMDAwMDQwNEwsIDB4MDEwMDA0MDBMLCAweDAxMDAwNDAwTCwgMHgwMDAxMDQwMEwsCisJMHgwMDAxMDQwMEwsIDB4MDEwMTAwMDBMLCAweDAxMDEwMDAwTCwgMHgwMTAwMDQwNEwsCisJMHgwMDAxMDAwNEwsIDB4MDEwMDAwMDRMLCAweDAxMDAwMDA0TCwgMHgwMDAxMDAwNEwsCisJMHgwMDAwMDAwMEwsIDB4MDAwMDA0MDRMLCAweDAwMDEwNDA0TCwgMHgwMTAwMDAwMEwsCisJMHgwMDAxMDAwMEwsIDB4MDEwMTA0MDRMLCAweDAwMDAwMDA0TCwgMHgwMTAxMDAwMEwsCisJMHgwMTAxMDQwMEwsIDB4MDEwMDAwMDBMLCAweDAxMDAwMDAwTCwgMHgwMDAwMDQwMEwsCisJMHgwMTAxMDAwNEwsIDB4MDAwMTAwMDBMLCAweDAwMDEwNDAwTCwgMHgwMTAwMDAwNEwsCisJMHgwMDAwMDQwMEwsIDB4MDAwMDAwMDRMLCAweDAxMDAwNDA0TCwgMHgwMDAxMDQwNEwsCisJMHgwMTAxMDQwNEwsIDB4MDAwMTAwMDRMLCAweDAxMDEwMDAwTCwgMHgwMTAwMDQwNEwsCisJMHgwMTAwMDAwNEwsIDB4MDAwMDA0MDRMLCAweDAwMDEwNDA0TCwgMHgwMTAxMDQwMEwsCisJMHgwMDAwMDQwNEwsIDB4MDEwMDA0MDBMLCAweDAxMDAwNDAwTCwgMHgwMDAwMDAwMEwsCisJMHgwMDAxMDAwNEwsIDB4MDAwMTA0MDBMLCAweDAwMDAwMDAwTCwgMHgwMTAxMDAwNEwgfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgU1AyWzY0XSA9IHsKKwkweDgwMTA4MDIwTCwgMHg4MDAwODAwMEwsIDB4MDAwMDgwMDBMLCAweDAwMTA4MDIwTCwKKwkweDAwMTAwMDAwTCwgMHgwMDAwMDAyMEwsIDB4ODAxMDAwMjBMLCAweDgwMDA4MDIwTCwKKwkweDgwMDAwMDIwTCwgMHg4MDEwODAyMEwsIDB4ODAxMDgwMDBMLCAweDgwMDAwMDAwTCwKKwkweDgwMDA4MDAwTCwgMHgwMDEwMDAwMEwsIDB4MDAwMDAwMjBMLCAweDgwMTAwMDIwTCwKKwkweDAwMTA4MDAwTCwgMHgwMDEwMDAyMEwsIDB4ODAwMDgwMjBMLCAweDAwMDAwMDAwTCwKKwkweDgwMDAwMDAwTCwgMHgwMDAwODAwMEwsIDB4MDAxMDgwMjBMLCAweDgwMTAwMDAwTCwKKwkweDAwMTAwMDIwTCwgMHg4MDAwMDAyMEwsIDB4MDAwMDAwMDBMLCAweDAwMTA4MDAwTCwKKwkweDAwMDA4MDIwTCwgMHg4MDEwODAwMEwsIDB4ODAxMDAwMDBMLCAweDAwMDA4MDIwTCwKKwkweDAwMDAwMDAwTCwgMHgwMDEwODAyMEwsIDB4ODAxMDAwMjBMLCAweDAwMTAwMDAwTCwKKwkweDgwMDA4MDIwTCwgMHg4MDEwMDAwMEwsIDB4ODAxMDgwMDBMLCAweDAwMDA4MDAwTCwKKwkweDgwMTAwMDAwTCwgMHg4MDAwODAwMEwsIDB4MDAwMDAwMjBMLCAweDgwMTA4MDIwTCwKKwkweDAwMTA4MDIwTCwgMHgwMDAwMDAyMEwsIDB4MDAwMDgwMDBMLCAweDgwMDAwMDAwTCwKKwkweDAwMDA4MDIwTCwgMHg4MDEwODAwMEwsIDB4MDAxMDAwMDBMLCAweDgwMDAwMDIwTCwKKwkweDAwMTAwMDIwTCwgMHg4MDAwODAyMEwsIDB4ODAwMDAwMjBMLCAweDAwMTAwMDIwTCwKKwkweDAwMTA4MDAwTCwgMHgwMDAwMDAwMEwsIDB4ODAwMDgwMDBMLCAweDAwMDA4MDIwTCwKKwkweDgwMDAwMDAwTCwgMHg4MDEwMDAyMEwsIDB4ODAxMDgwMjBMLCAweDAwMTA4MDAwTCB9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBTUDNbNjRdID0geworCTB4MDAwMDAyMDhMLCAweDA4MDIwMjAwTCwgMHgwMDAwMDAwMEwsIDB4MDgwMjAwMDhMLAorCTB4MDgwMDAyMDBMLCAweDAwMDAwMDAwTCwgMHgwMDAyMDIwOEwsIDB4MDgwMDAyMDBMLAorCTB4MDAwMjAwMDhMLCAweDA4MDAwMDA4TCwgMHgwODAwMDAwOEwsIDB4MDAwMjAwMDBMLAorCTB4MDgwMjAyMDhMLCAweDAwMDIwMDA4TCwgMHgwODAyMDAwMEwsIDB4MDAwMDAyMDhMLAorCTB4MDgwMDAwMDBMLCAweDAwMDAwMDA4TCwgMHgwODAyMDIwMEwsIDB4MDAwMDAyMDBMLAorCTB4MDAwMjAyMDBMLCAweDA4MDIwMDAwTCwgMHgwODAyMDAwOEwsIDB4MDAwMjAyMDhMLAorCTB4MDgwMDAyMDhMLCAweDAwMDIwMjAwTCwgMHgwMDAyMDAwMEwsIDB4MDgwMDAyMDhMLAorCTB4MDAwMDAwMDhMLCAweDA4MDIwMjA4TCwgMHgwMDAwMDIwMEwsIDB4MDgwMDAwMDBMLAorCTB4MDgwMjAyMDBMLCAweDA4MDAwMDAwTCwgMHgwMDAyMDAwOEwsIDB4MDAwMDAyMDhMLAorCTB4MDAwMjAwMDBMLCAweDA4MDIwMjAwTCwgMHgwODAwMDIwMEwsIDB4MDAwMDAwMDBMLAorCTB4MDAwMDAyMDBMLCAweDAwMDIwMDA4TCwgMHgwODAyMDIwOEwsIDB4MDgwMDAyMDBMLAorCTB4MDgwMDAwMDhMLCAweDAwMDAwMjAwTCwgMHgwMDAwMDAwMEwsIDB4MDgwMjAwMDhMLAorCTB4MDgwMDAyMDhMLCAweDAwMDIwMDAwTCwgMHgwODAwMDAwMEwsIDB4MDgwMjAyMDhMLAorCTB4MDAwMDAwMDhMLCAweDAwMDIwMjA4TCwgMHgwMDAyMDIwMEwsIDB4MDgwMDAwMDhMLAorCTB4MDgwMjAwMDBMLCAweDA4MDAwMjA4TCwgMHgwMDAwMDIwOEwsIDB4MDgwMjAwMDBMLAorCTB4MDAwMjAyMDhMLCAweDAwMDAwMDA4TCwgMHgwODAyMDAwOEwsIDB4MDAwMjAyMDBMIH07CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFNQNFs2NF0gPSB7CisJMHgwMDgwMjAwMUwsIDB4MDAwMDIwODFMLCAweDAwMDAyMDgxTCwgMHgwMDAwMDA4MEwsCisJMHgwMDgwMjA4MEwsIDB4MDA4MDAwODFMLCAweDAwODAwMDAxTCwgMHgwMDAwMjAwMUwsCisJMHgwMDAwMDAwMEwsIDB4MDA4MDIwMDBMLCAweDAwODAyMDAwTCwgMHgwMDgwMjA4MUwsCisJMHgwMDAwMDA4MUwsIDB4MDAwMDAwMDBMLCAweDAwODAwMDgwTCwgMHgwMDgwMDAwMUwsCisJMHgwMDAwMDAwMUwsIDB4MDAwMDIwMDBMLCAweDAwODAwMDAwTCwgMHgwMDgwMjAwMUwsCisJMHgwMDAwMDA4MEwsIDB4MDA4MDAwMDBMLCAweDAwMDAyMDAxTCwgMHgwMDAwMjA4MEwsCisJMHgwMDgwMDA4MUwsIDB4MDAwMDAwMDFMLCAweDAwMDAyMDgwTCwgMHgwMDgwMDA4MEwsCisJMHgwMDAwMjAwMEwsIDB4MDA4MDIwODBMLCAweDAwODAyMDgxTCwgMHgwMDAwMDA4MUwsCisJMHgwMDgwMDA4MEwsIDB4MDA4MDAwMDFMLCAweDAwODAyMDAwTCwgMHgwMDgwMjA4MUwsCisJMHgwMDAwMDA4MUwsIDB4MDAwMDAwMDBMLCAweDAwMDAwMDAwTCwgMHgwMDgwMjAwMEwsCisJMHgwMDAwMjA4MEwsIDB4MDA4MDAwODBMLCAweDAwODAwMDgxTCwgMHgwMDAwMDAwMUwsCisJMHgwMDgwMjAwMUwsIDB4MDAwMDIwODFMLCAweDAwMDAyMDgxTCwgMHgwMDAwMDA4MEwsCisJMHgwMDgwMjA4MUwsIDB4MDAwMDAwODFMLCAweDAwMDAwMDAxTCwgMHgwMDAwMjAwMEwsCisJMHgwMDgwMDAwMUwsIDB4MDAwMDIwMDFMLCAweDAwODAyMDgwTCwgMHgwMDgwMDA4MUwsCisJMHgwMDAwMjAwMUwsIDB4MDAwMDIwODBMLCAweDAwODAwMDAwTCwgMHgwMDgwMjAwMUwsCisJMHgwMDAwMDA4MEwsIDB4MDA4MDAwMDBMLCAweDAwMDAyMDAwTCwgMHgwMDgwMjA4MEwgfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgU1A1WzY0XSA9IHsKKwkweDAwMDAwMTAwTCwgMHgwMjA4MDEwMEwsIDB4MDIwODAwMDBMLCAweDQyMDAwMTAwTCwKKwkweDAwMDgwMDAwTCwgMHgwMDAwMDEwMEwsIDB4NDAwMDAwMDBMLCAweDAyMDgwMDAwTCwKKwkweDQwMDgwMTAwTCwgMHgwMDA4MDAwMEwsIDB4MDIwMDAxMDBMLCAweDQwMDgwMTAwTCwKKwkweDQyMDAwMTAwTCwgMHg0MjA4MDAwMEwsIDB4MDAwODAxMDBMLCAweDQwMDAwMDAwTCwKKwkweDAyMDAwMDAwTCwgMHg0MDA4MDAwMEwsIDB4NDAwODAwMDBMLCAweDAwMDAwMDAwTCwKKwkweDQwMDAwMTAwTCwgMHg0MjA4MDEwMEwsIDB4NDIwODAxMDBMLCAweDAyMDAwMTAwTCwKKwkweDQyMDgwMDAwTCwgMHg0MDAwMDEwMEwsIDB4MDAwMDAwMDBMLCAweDQyMDAwMDAwTCwKKwkweDAyMDgwMTAwTCwgMHgwMjAwMDAwMEwsIDB4NDIwMDAwMDBMLCAweDAwMDgwMTAwTCwKKwkweDAwMDgwMDAwTCwgMHg0MjAwMDEwMEwsIDB4MDAwMDAxMDBMLCAweDAyMDAwMDAwTCwKKwkweDQwMDAwMDAwTCwgMHgwMjA4MDAwMEwsIDB4NDIwMDAxMDBMLCAweDQwMDgwMTAwTCwKKwkweDAyMDAwMTAwTCwgMHg0MDAwMDAwMEwsIDB4NDIwODAwMDBMLCAweDAyMDgwMTAwTCwKKwkweDQwMDgwMTAwTCwgMHgwMDAwMDEwMEwsIDB4MDIwMDAwMDBMLCAweDQyMDgwMDAwTCwKKwkweDQyMDgwMTAwTCwgMHgwMDA4MDEwMEwsIDB4NDIwMDAwMDBMLCAweDQyMDgwMTAwTCwKKwkweDAyMDgwMDAwTCwgMHgwMDAwMDAwMEwsIDB4NDAwODAwMDBMLCAweDQyMDAwMDAwTCwKKwkweDAwMDgwMTAwTCwgMHgwMjAwMDEwMEwsIDB4NDAwMDAxMDBMLCAweDAwMDgwMDAwTCwKKwkweDAwMDAwMDAwTCwgMHg0MDA4MDAwMEwsIDB4MDIwODAxMDBMLCAweDQwMDAwMTAwTCB9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBTUDZbNjRdID0geworCTB4MjAwMDAwMTBMLCAweDIwNDAwMDAwTCwgMHgwMDAwNDAwMEwsIDB4MjA0MDQwMTBMLAorCTB4MjA0MDAwMDBMLCAweDAwMDAwMDEwTCwgMHgyMDQwNDAxMEwsIDB4MDA0MDAwMDBMLAorCTB4MjAwMDQwMDBMLCAweDAwNDA0MDEwTCwgMHgwMDQwMDAwMEwsIDB4MjAwMDAwMTBMLAorCTB4MDA0MDAwMTBMLCAweDIwMDA0MDAwTCwgMHgyMDAwMDAwMEwsIDB4MDAwMDQwMTBMLAorCTB4MDAwMDAwMDBMLCAweDAwNDAwMDEwTCwgMHgyMDAwNDAxMEwsIDB4MDAwMDQwMDBMLAorCTB4MDA0MDQwMDBMLCAweDIwMDA0MDEwTCwgMHgwMDAwMDAxMEwsIDB4MjA0MDAwMTBMLAorCTB4MjA0MDAwMTBMLCAweDAwMDAwMDAwTCwgMHgwMDQwNDAxMEwsIDB4MjA0MDQwMDBMLAorCTB4MDAwMDQwMTBMLCAweDAwNDA0MDAwTCwgMHgyMDQwNDAwMEwsIDB4MjAwMDAwMDBMLAorCTB4MjAwMDQwMDBMLCAweDAwMDAwMDEwTCwgMHgyMDQwMDAxMEwsIDB4MDA0MDQwMDBMLAorCTB4MjA0MDQwMTBMLCAweDAwNDAwMDAwTCwgMHgwMDAwNDAxMEwsIDB4MjAwMDAwMTBMLAorCTB4MDA0MDAwMDBMLCAweDIwMDA0MDAwTCwgMHgyMDAwMDAwMEwsIDB4MDAwMDQwMTBMLAorCTB4MjAwMDAwMTBMLCAweDIwNDA0MDEwTCwgMHgwMDQwNDAwMEwsIDB4MjA0MDAwMDBMLAorCTB4MDA0MDQwMTBMLCAweDIwNDA0MDAwTCwgMHgwMDAwMDAwMEwsIDB4MjA0MDAwMTBMLAorCTB4MDAwMDAwMTBMLCAweDAwMDA0MDAwTCwgMHgyMDQwMDAwMEwsIDB4MDA0MDQwMTBMLAorCTB4MDAwMDQwMDBMLCAweDAwNDAwMDEwTCwgMHgyMDAwNDAxMEwsIDB4MDAwMDAwMDBMLAorCTB4MjA0MDQwMDBMLCAweDIwMDAwMDAwTCwgMHgwMDQwMDAxMEwsIDB4MjAwMDQwMTBMIH07CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFNQN1s2NF0gPSB7CisJMHgwMDIwMDAwMEwsIDB4MDQyMDAwMDJMLCAweDA0MDAwODAyTCwgMHgwMDAwMDAwMEwsCisJMHgwMDAwMDgwMEwsIDB4MDQwMDA4MDJMLCAweDAwMjAwODAyTCwgMHgwNDIwMDgwMEwsCisJMHgwNDIwMDgwMkwsIDB4MDAyMDAwMDBMLCAweDAwMDAwMDAwTCwgMHgwNDAwMDAwMkwsCisJMHgwMDAwMDAwMkwsIDB4MDQwMDAwMDBMLCAweDA0MjAwMDAyTCwgMHgwMDAwMDgwMkwsCisJMHgwNDAwMDgwMEwsIDB4MDAyMDA4MDJMLCAweDAwMjAwMDAyTCwgMHgwNDAwMDgwMEwsCisJMHgwNDAwMDAwMkwsIDB4MDQyMDAwMDBMLCAweDA0MjAwODAwTCwgMHgwMDIwMDAwMkwsCisJMHgwNDIwMDAwMEwsIDB4MDAwMDA4MDBMLCAweDAwMDAwODAyTCwgMHgwNDIwMDgwMkwsCisJMHgwMDIwMDgwMEwsIDB4MDAwMDAwMDJMLCAweDA0MDAwMDAwTCwgMHgwMDIwMDgwMEwsCisJMHgwNDAwMDAwMEwsIDB4MDAyMDA4MDBMLCAweDAwMjAwMDAwTCwgMHgwNDAwMDgwMkwsCisJMHgwNDAwMDgwMkwsIDB4MDQyMDAwMDJMLCAweDA0MjAwMDAyTCwgMHgwMDAwMDAwMkwsCisJMHgwMDIwMDAwMkwsIDB4MDQwMDAwMDBMLCAweDA0MDAwODAwTCwgMHgwMDIwMDAwMEwsCisJMHgwNDIwMDgwMEwsIDB4MDAwMDA4MDJMLCAweDAwMjAwODAyTCwgMHgwNDIwMDgwMEwsCisJMHgwMDAwMDgwMkwsIDB4MDQwMDAwMDJMLCAweDA0MjAwODAyTCwgMHgwNDIwMDAwMEwsCisJMHgwMDIwMDgwMEwsIDB4MDAwMDAwMDBMLCAweDAwMDAwMDAyTCwgMHgwNDIwMDgwMkwsCisJMHgwMDAwMDAwMEwsIDB4MDAyMDA4MDJMLCAweDA0MjAwMDAwTCwgMHgwMDAwMDgwMEwsCisJMHgwNDAwMDAwMkwsIDB4MDQwMDA4MDBMLCAweDAwMDAwODAwTCwgMHgwMDIwMDAwMkwgfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgU1A4WzY0XSA9IHsKKwkweDEwMDAxMDQwTCwgMHgwMDAwMTAwMEwsIDB4MDAwNDAwMDBMLCAweDEwMDQxMDQwTCwKKwkweDEwMDAwMDAwTCwgMHgxMDAwMTA0MEwsIDB4MDAwMDAwNDBMLCAweDEwMDAwMDAwTCwKKwkweDAwMDQwMDQwTCwgMHgxMDA0MDAwMEwsIDB4MTAwNDEwNDBMLCAweDAwMDQxMDAwTCwKKwkweDEwMDQxMDAwTCwgMHgwMDA0MTA0MEwsIDB4MDAwMDEwMDBMLCAweDAwMDAwMDQwTCwKKwkweDEwMDQwMDAwTCwgMHgxMDAwMDA0MEwsIDB4MTAwMDEwMDBMLCAweDAwMDAxMDQwTCwKKwkweDAwMDQxMDAwTCwgMHgwMDA0MDA0MEwsIDB4MTAwNDAwNDBMLCAweDEwMDQxMDAwTCwKKwkweDAwMDAxMDQwTCwgMHgwMDAwMDAwMEwsIDB4MDAwMDAwMDBMLCAweDEwMDQwMDQwTCwKKwkweDEwMDAwMDQwTCwgMHgxMDAwMTAwMEwsIDB4MDAwNDEwNDBMLCAweDAwMDQwMDAwTCwKKwkweDAwMDQxMDQwTCwgMHgwMDA0MDAwMEwsIDB4MTAwNDEwMDBMLCAweDAwMDAxMDAwTCwKKwkweDAwMDAwMDQwTCwgMHgxMDA0MDA0MEwsIDB4MDAwMDEwMDBMLCAweDAwMDQxMDQwTCwKKwkweDEwMDAxMDAwTCwgMHgwMDAwMDA0MEwsIDB4MTAwMDAwNDBMLCAweDEwMDQwMDAwTCwKKwkweDEwMDQwMDQwTCwgMHgxMDAwMDAwMEwsIDB4MDAwNDAwMDBMLCAweDEwMDAxMDQwTCwKKwkweDAwMDAwMDAwTCwgMHgxMDA0MTA0MEwsIDB4MDAwNDAwNDBMLCAweDEwMDAwMDQwTCwKKwkweDEwMDQwMDAwTCwgMHgxMDAwMTAwMEwsIDB4MTAwMDEwNDBMLCAweDAwMDAwMDAwTCwKKwkweDEwMDQxMDQwTCwgMHgwMDA0MTAwMEwsIDB4MDAwNDEwMDBMLCAweDAwMDAxMDQwTCwKKwkweDAwMDAxMDQwTCwgMHgwMDA0MDA0MEwsIDB4MTAwMDAwMDBMLCAweDEwMDQxMDAwTCB9OworCitzdGF0aWMgdm9pZCBkZXNmdW5jKGJsb2NrLCBrZXlzKQorcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqYmxvY2ssICprZXlzOworeworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgZnZhbCwgd29yaywgcmlnaHQsIGxlZnR0OworCXJlZ2lzdGVyIGludCByb3VuZDsKKworCWxlZnR0ID0gYmxvY2tbMF07CisJcmlnaHQgPSBibG9ja1sxXTsKKwl3b3JrID0gKChsZWZ0dCA+PiA0KSBeIHJpZ2h0KSAmIDB4MGYwZjBmMGZMOworCXJpZ2h0IF49IHdvcms7CisJbGVmdHQgXj0gKHdvcmsgPDwgNCk7CisJd29yayA9ICgobGVmdHQgPj4gMTYpIF4gcmlnaHQpICYgMHgwMDAwZmZmZkw7CisJcmlnaHQgXj0gd29yazsKKwlsZWZ0dCBePSAod29yayA8PCAxNik7CisJd29yayA9ICgocmlnaHQgPj4gMikgXiBsZWZ0dCkgJiAweDMzMzMzMzMzTDsKKwlsZWZ0dCBePSB3b3JrOworCXJpZ2h0IF49ICh3b3JrIDw8IDIpOworCXdvcmsgPSAoKHJpZ2h0ID4+IDgpIF4gbGVmdHQpICYgMHgwMGZmMDBmZkw7CisJbGVmdHQgXj0gd29yazsKKwlyaWdodCBePSAod29yayA8PCA4KTsKKwlyaWdodCA9ICgocmlnaHQgPDwgMSkgfCAoKHJpZ2h0ID4+IDMxKSAmIDFMKSkgJiAweGZmZmZmZmZmTDsKKwl3b3JrID0gKGxlZnR0IF4gcmlnaHQpICYgMHhhYWFhYWFhYUw7CisJbGVmdHQgXj0gd29yazsKKwlyaWdodCBePSB3b3JrOworCWxlZnR0ID0gKChsZWZ0dCA8PCAxKSB8ICgobGVmdHQgPj4gMzEpICYgMUwpKSAmIDB4ZmZmZmZmZmZMOworCisJZm9yKCByb3VuZCA9IDA7IHJvdW5kIDwgODsgcm91bmQrKyApIHsKKwkJd29yayAgPSAocmlnaHQgPDwgMjgpIHwgKHJpZ2h0ID4+IDQpOworCQl3b3JrIF49ICprZXlzKys7CisJCWZ2YWwgID0gU1A3WyB3b3JrCQkgJiAweDNmTF07CisJCWZ2YWwgfD0gU1A1Wyh3b3JrID4+ICA4KSAmIDB4M2ZMXTsKKwkJZnZhbCB8PSBTUDNbKHdvcmsgPj4gMTYpICYgMHgzZkxdOworCQlmdmFsIHw9IFNQMVsod29yayA+PiAyNCkgJiAweDNmTF07CisJCXdvcmsgID0gcmlnaHQgXiAqa2V5cysrOworCQlmdmFsIHw9IFNQOFsgd29yawkJICYgMHgzZkxdOworCQlmdmFsIHw9IFNQNlsod29yayA+PiAgOCkgJiAweDNmTF07CisJCWZ2YWwgfD0gU1A0Wyh3b3JrID4+IDE2KSAmIDB4M2ZMXTsKKwkJZnZhbCB8PSBTUDJbKHdvcmsgPj4gMjQpICYgMHgzZkxdOworCQlsZWZ0dCBePSBmdmFsOworCQl3b3JrICA9IChsZWZ0dCA8PCAyOCkgfCAobGVmdHQgPj4gNCk7CisJCXdvcmsgXj0gKmtleXMrKzsKKwkJZnZhbCAgPSBTUDdbIHdvcmsJCSAmIDB4M2ZMXTsKKwkJZnZhbCB8PSBTUDVbKHdvcmsgPj4gIDgpICYgMHgzZkxdOworCQlmdmFsIHw9IFNQM1sod29yayA+PiAxNikgJiAweDNmTF07CisJCWZ2YWwgfD0gU1AxWyh3b3JrID4+IDI0KSAmIDB4M2ZMXTsKKwkJd29yayAgPSBsZWZ0dCBeICprZXlzKys7CisJCWZ2YWwgfD0gU1A4WyB3b3JrCQkgJiAweDNmTF07CisJCWZ2YWwgfD0gU1A2Wyh3b3JrID4+ICA4KSAmIDB4M2ZMXTsKKwkJZnZhbCB8PSBTUDRbKHdvcmsgPj4gMTYpICYgMHgzZkxdOworCQlmdmFsIHw9IFNQMlsod29yayA+PiAyNCkgJiAweDNmTF07CisJCXJpZ2h0IF49IGZ2YWw7CisJCX0KKworCXJpZ2h0ID0gKHJpZ2h0IDw8IDMxKSB8IChyaWdodCA+PiAxKTsKKwl3b3JrID0gKGxlZnR0IF4gcmlnaHQpICYgMHhhYWFhYWFhYUw7CisJbGVmdHQgXj0gd29yazsKKwlyaWdodCBePSB3b3JrOworCWxlZnR0ID0gKGxlZnR0IDw8IDMxKSB8IChsZWZ0dCA+PiAxKTsKKwl3b3JrID0gKChsZWZ0dCA+PiA4KSBeIHJpZ2h0KSAmIDB4MDBmZjAwZmZMOworCXJpZ2h0IF49IHdvcms7CisJbGVmdHQgXj0gKHdvcmsgPDwgOCk7CisJd29yayA9ICgobGVmdHQgPj4gMikgXiByaWdodCkgJiAweDMzMzMzMzMzTDsKKwlyaWdodCBePSB3b3JrOworCWxlZnR0IF49ICh3b3JrIDw8IDIpOworCXdvcmsgPSAoKHJpZ2h0ID4+IDE2KSBeIGxlZnR0KSAmIDB4MDAwMGZmZmZMOworCWxlZnR0IF49IHdvcms7CisJcmlnaHQgXj0gKHdvcmsgPDwgMTYpOworCXdvcmsgPSAoKHJpZ2h0ID4+IDQpIF4gbGVmdHQpICYgMHgwZjBmMGYwZkw7CisJbGVmdHQgXj0gd29yazsKKwlyaWdodCBePSAod29yayA8PCA0KTsKKwkqYmxvY2srKyA9IHJpZ2h0OworCSpibG9jayA9IGxlZnR0OworCXJldHVybjsKKwl9CisKKy8qIFZhbGlkYXRpb24gc2V0czoKKyAqCisgKiBTaW5nbGUtbGVuZ3RoIGtleSwgc2luZ2xlLWxlbmd0aCBwbGFpbnRleHQgLQorICogS2V5CSAgOiAwMTIzIDQ1NjcgODlhYiBjZGVmCisgKiBQbGFpbiAgOiAwMTIzIDQ1NjcgODlhYiBjZGU3CisgKiBDaXBoZXIgOiBjOTU3IDQ0MjUgNmE1ZSBkMzFkCisgKgorICogRG91YmxlLWxlbmd0aCBrZXksIHNpbmdsZS1sZW5ndGggcGxhaW50ZXh0IC0KKyAqIEtleQkgIDogMDEyMyA0NTY3IDg5YWIgY2RlZiBmZWRjIGJhOTggNzY1NCAzMjEwCisgKiBQbGFpbiAgOiAwMTIzIDQ1NjcgODlhYiBjZGU3CisgKiBDaXBoZXIgOiA3ZjFkIDBhNzcgODI2YiA4YWZmCisgKgorICogRG91YmxlLWxlbmd0aCBrZXksIGRvdWJsZS1sZW5ndGggcGxhaW50ZXh0IC0KKyAqIEtleQkgIDogMDEyMyA0NTY3IDg5YWIgY2RlZiBmZWRjIGJhOTggNzY1NCAzMjEwCisgKiBQbGFpbiAgOiAwMTIzIDQ1NjcgODlhYiBjZGVmIDAxMjMgNDU2NyA4OWFiIGNkZmYKKyAqIENpcGhlciA6IDI3YTAgODQ0MCA0MDZhIGRmNjAgMjc4ZiA0N2NmIDQyZDYgMTVkNworICoKKyAqIFRyaXBsZS1sZW5ndGgga2V5LCBzaW5nbGUtbGVuZ3RoIHBsYWludGV4dCAtCisgKiBLZXkJICA6IDAxMjMgNDU2NyA4OWFiIGNkZWYgZmVkYyBiYTk4IDc2NTQgMzIxMCA4OWFiIGNkZWYgMDEyMyA0NTY3CisgKiBQbGFpbiAgOiAwMTIzIDQ1NjcgODlhYiBjZGU3CisgKiBDaXBoZXIgOiBkZTBiIDdjMDYgYWU1ZSAwZWQ1CisgKgorICogVHJpcGxlLWxlbmd0aCBrZXksIGRvdWJsZS1sZW5ndGggcGxhaW50ZXh0IC0KKyAqIEtleQkgIDogMDEyMyA0NTY3IDg5YWIgY2RlZiBmZWRjIGJhOTggNzY1NCAzMjEwIDg5YWIgY2RlZiAwMTIzIDQ1NjcKKyAqIFBsYWluICA6IDAxMjMgNDU2NyA4OWFiIGNkZWYgMDEyMyA0NTY3IDg5YWIgY2RmZgorICogQ2lwaGVyIDogYWQwZCAxYjMwIGFjMTcgY2YwNyAwZWQxIDFjNjMgODFlNCA0ZGU1CisgKgorICogZDNkZXMgVjUuMGEgcndvIDkyMDguMDcgMTg6NDQgR3JhdmVuIEltYWdlcnkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9kM2Rlcy5oIGIvY29tbW9uL3JmYi9kM2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhM2RhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL2QzZGVzLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIFRoaXMgaXMgRDNERVMgKFY1LjA5KSBieSBSaWNoYXJkIE91dGVyYnJpZGdlIHdpdGggdGhlIGRvdWJsZSBhbmQKKyAqIHRyaXBsZS1sZW5ndGggc3VwcG9ydCByZW1vdmVkIGZvciB1c2UgaW4gVk5DLgorICoKKyAqIFRoZXNlIGNoYW5nZXMgYXJlOgorICogIENvcHlyaWdodCAoQykgMTk5OSBBVCZUIExhYm9yYXRvcmllcyBDYW1icmlkZ2UuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworLyogZDNkZXMuaCAtCisgKgorICoJSGVhZGVycyBhbmQgZGVmaW5lcyBmb3IgZDNkZXMuYworICoJR3JhdmVuIEltYWdlcnksIDE5OTIuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg4LDE5ODksMTk5MCwxOTkxLDE5OTIgYnkgUmljaGFyZCBPdXRlcmJyaWRnZQorICoJKEdFbmllIDogT1VURVI7IENJUyA6IFs3MTc1NSwyMDRdKQorICovCisKKyNkZWZpbmUgRU4wCTAJLyogTU9ERSA9PSBlbmNyeXB0ICovCisjZGVmaW5lIERFMQkxCS8qIE1PREUgPT0gZGVjcnlwdCAqLworCitleHRlcm4gdm9pZCBkZXNrZXkodW5zaWduZWQgY2hhciAqLCBpbnQpOworLyoJCSAgICAgIGhleGtleVs4XSAgICAgTU9ERQorICogU2V0cyB0aGUgaW50ZXJuYWwga2V5IHJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgaGV4YWRlY2ltYWwKKyAqIGtleSBjb250YWluZWQgaW4gdGhlIDggYnl0ZXMgb2YgaGV4a2V5LCBhY2NvcmRpbmcgdG8gdGhlIERFUywKKyAqIGZvciBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gYWNjb3JkaW5nIHRvIE1PREUuCisgKi8KKworZXh0ZXJuIHZvaWQgdXNla2V5KHVuc2lnbmVkIGxvbmcgKik7CisvKgkJICAgIGNvb2tlZGtleVszMl0KKyAqIExvYWRzIHRoZSBpbnRlcm5hbCBrZXkgcmVnaXN0ZXIgd2l0aCB0aGUgZGF0YSBpbiBjb29rZWRrZXkuCisgKi8KKworZXh0ZXJuIHZvaWQgY3BrZXkodW5zaWduZWQgbG9uZyAqKTsKKy8qCQkgICBjb29rZWRrZXlbMzJdCisgKiBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnRlcm5hbCBrZXkgcmVnaXN0ZXIgaW50byB0aGUgc3RvcmFnZQorICogbG9jYXRlZCBhdCAmY29va2Vka2V5WzBdLgorICovCisKK2V4dGVybiB2b2lkIGRlcyh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKik7CisvKgkJICAgIGZyb21bOF0JICAgICAgdG9bOF0KKyAqIEVuY3J5cHRzL0RlY3J5cHRzIChhY2NvcmRpbmcgdG8gdGhlIGtleSBjdXJyZW50bHkgbG9hZGVkIGluIHRoZQorICogaW50ZXJuYWwga2V5IHJlZ2lzdGVyKSBvbmUgYmxvY2sgb2YgZWlnaHQgYnl0ZXMgYXQgYWRkcmVzcyAnZnJvbScKKyAqIGludG8gdGhlIGJsb2NrIGF0IGFkZHJlc3MgJ3RvJy4gIFRoZXkgY2FuIGJlIHRoZSBzYW1lLgorICovCisKKy8qIGQzZGVzLmggVjUuMDkgcndvIDkyMDguMDQgMTU6MDYgR3JhdmVuIEltYWdlcnkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvZW5jb2RpbmdzLmN4eCBiL2NvbW1vbi9yZmIvZW5jb2RpbmdzLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWE4MWM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9lbmNvZGluZ3MuY3h4CkBAIC0wLDAgKzEsNDkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgc3RyY2FzZWNtcCBfc3RyaWNtcAorI2VuZGlmCisjaW5jbHVkZSA8cmZiL2VuY29kaW5ncy5oPgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisKK2ludCByZmI6OmVuY29kaW5nTnVtKGNvbnN0IGNoYXIqIG5hbWUpCit7CisgIGlmIChzdHJjYXNlY21wKG5hbWUsICJyYXciKSA9PSAwKSAgICAgIHJldHVybiBlbmNvZGluZ1JhdzsKKyAgaWYgKHN0cmNhc2VjbXAobmFtZSwgImNvcHlSZWN0IikgPT0gMCkgcmV0dXJuIGVuY29kaW5nQ29weVJlY3Q7CisgIGlmIChzdHJjYXNlY21wKG5hbWUsICJSUkUiKSA9PSAwKSAgICAgIHJldHVybiBlbmNvZGluZ1JSRTsKKyAgaWYgKHN0cmNhc2VjbXAobmFtZSwgIkNvUlJFIikgPT0gMCkgICAgcmV0dXJuIGVuY29kaW5nQ29SUkU7CisgIGlmIChzdHJjYXNlY21wKG5hbWUsICJoZXh0aWxlIikgPT0gMCkgIHJldHVybiBlbmNvZGluZ0hleHRpbGU7CisgIGlmIChzdHJjYXNlY21wKG5hbWUsICJaUkxFIikgPT0gMCkgICAgIHJldHVybiBlbmNvZGluZ1pSTEU7CisgIGlmIChzdHJjYXNlY21wKG5hbWUsICJUaWdodCIpID09IDApICAgIHJldHVybiBlbmNvZGluZ1RpZ2h0OworICByZXR1cm4gLTE7Cit9CisKK2NvbnN0IGNoYXIqIHJmYjo6ZW5jb2RpbmdOYW1lKHVuc2lnbmVkIGludCBudW0pCit7CisgIHN3aXRjaCAobnVtKSB7CisgIGNhc2UgZW5jb2RpbmdSYXc6ICAgICAgcmV0dXJuICJyYXciOworICBjYXNlIGVuY29kaW5nQ29weVJlY3Q6IHJldHVybiAiY29weVJlY3QiOworICBjYXNlIGVuY29kaW5nUlJFOiAgICAgIHJldHVybiAiUlJFIjsKKyAgY2FzZSBlbmNvZGluZ0NvUlJFOiAgICByZXR1cm4gIkNvUlJFIjsKKyAgY2FzZSBlbmNvZGluZ0hleHRpbGU6ICByZXR1cm4gImhleHRpbGUiOworICBjYXNlIGVuY29kaW5nWlJMRTogICAgIHJldHVybiAiWlJMRSI7CisgIGNhc2UgZW5jb2RpbmdUaWdodDogICAgcmV0dXJuICJUaWdodCI7CisgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgcmV0dXJuICJbdW5rbm93biBlbmNvZGluZ10iOworICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL2VuY29kaW5ncy5oIGIvY29tbW9uL3JmYi9lbmNvZGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWY2ZjFlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9lbmNvZGluZ3MuaApAQCAtMCwwICsxLDQ3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fUkZCX0VOQ09ESU5HU19IX18KKyNkZWZpbmUgX19SRkJfRU5DT0RJTkdTX0hfXworCituYW1lc3BhY2UgcmZiIHsKKworICBjb25zdCB1bnNpZ25lZCBpbnQgZW5jb2RpbmdSYXcgPSAwOworICBjb25zdCB1bnNpZ25lZCBpbnQgZW5jb2RpbmdDb3B5UmVjdCA9IDE7CisgIGNvbnN0IHVuc2lnbmVkIGludCBlbmNvZGluZ1JSRSA9IDI7CisgIGNvbnN0IHVuc2lnbmVkIGludCBlbmNvZGluZ0NvUlJFID0gNDsKKyAgY29uc3QgdW5zaWduZWQgaW50IGVuY29kaW5nSGV4dGlsZSA9IDU7CisgIGNvbnN0IHVuc2lnbmVkIGludCBlbmNvZGluZ1RpZ2h0ID0gNzsKKyAgY29uc3QgdW5zaWduZWQgaW50IGVuY29kaW5nWlJMRSA9IDE2OworCisgIGNvbnN0IHVuc2lnbmVkIGludCBlbmNvZGluZ01heCA9IDI1NTsKKworICBjb25zdCB1bnNpZ25lZCBpbnQgcHNldWRvRW5jb2RpbmdYQ3Vyc29yID0gMHhmZmZmZmYxMDsKKyAgY29uc3QgdW5zaWduZWQgaW50IHBzZXVkb0VuY29kaW5nQ3Vyc29yID0gMHhmZmZmZmYxMTsKKyAgY29uc3QgdW5zaWduZWQgaW50IHBzZXVkb0VuY29kaW5nRGVza3RvcFNpemUgPSAweGZmZmZmZjIxOworCisgIC8vIFRpZ2h0Vk5DLXNwZWNpZmljCisgIGNvbnN0IHVuc2lnbmVkIGludCBwc2V1ZG9FbmNvZGluZ0xhc3RSZWN0ID0gMHhGRkZGRkYyMDsKKyAgY29uc3QgdW5zaWduZWQgaW50IHBzZXVkb0VuY29kaW5nUXVhbGl0eUxldmVsMCA9IDB4RkZGRkZGRTA7CisgIGNvbnN0IHVuc2lnbmVkIGludCBwc2V1ZG9FbmNvZGluZ1F1YWxpdHlMZXZlbDkgPSAweEZGRkZGRkU5OworICBjb25zdCB1bnNpZ25lZCBpbnQgcHNldWRvRW5jb2RpbmdDb21wcmVzc0xldmVsMCA9IDB4RkZGRkZGMDA7CisgIGNvbnN0IHVuc2lnbmVkIGludCBwc2V1ZG9FbmNvZGluZ0NvbXByZXNzTGV2ZWw5ID0gMHhGRkZGRkYwOTsKKworICBpbnQgZW5jb2RpbmdOdW0oY29uc3QgY2hhciogbmFtZSk7CisgIGNvbnN0IGNoYXIqIGVuY29kaW5nTmFtZSh1bnNpZ25lZCBpbnQgbnVtKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9mdHR5cGVzLmggYi9jb21tb24vcmZiL2Z0dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDA0NTA4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9mdHR5cGVzLmgKQEAgLTAsMCArMSw5MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA1IFRpZ2h0Vk5DIFRlYW0uICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBieSBEZW5uaXMgU3lyb3ZhdHNreS4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gLT0tIGZ0dHlwZXMuaAorCisjaWZuZGVmIF9fUkZCX0ZUVFlQRVNfSF9fCisjZGVmaW5lIF9fUkZCX0ZUVFlQRVNfSF9fCisKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgInN0ZGxpYi5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorCisjZGVmaW5lIEZUX0ZJTEVOQU1FX1NJWkUgMjU2CisKKyNkZWZpbmUgRlRfTUFYX1NUQVRVU19TVFJJTkdTCQkgMjU1CisjZGVmaW5lIEZUX01BWF9MRU5HVEhfU1RBVFVTX1NUUklOR1MgMTMwCisKKyNkZWZpbmUgRlRfTUFYX1NFTkRJTkdfU0laRSA4MTkyCisKKyNkZWZpbmUgRlRfTkVUX0FUVFJfRElSICgodW5zaWduZWQgaW50KS0xKQorCisjZGVmaW5lIEZUX0FUVFJfVU5LTk9XTgkJCSAgICAweDAwMDAwMDAwCisjZGVmaW5lIEZUX0FUVFJfRklMRQkJCSAgICAweDAwMDAwMDAxCisjZGVmaW5lIEZUX0FUVFJfRElSIAkJCSAgICAweDAwMDAwMDAyCisKKyNkZWZpbmUgRlRfQVRUUl9SRVNJWkVfTkVFREVECSAgICAweDAwMDQwMDAwCisjZGVmaW5lIEZUX0FUVFJfRk9MREVSX0VYSVNUUwkgICAgMHgwMDA4MDAwMAorI2RlZmluZSBGVF9BVFRSX0NPUFlfT1ZFUldSSVRFCSAgICAweDAwMTAwMDAwCisjZGVmaW5lIEZUX0FUVFJfRkxSX1VQTE9BRF9DSEVDSwkweDAwMjAwMDAwCisjZGVmaW5lIEZUX0FUVFJfRkxSX1VQTE9BRF9BREQJICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgRlRfQVRUUl9DT1BZX1VQTE9BRAkgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgRlRfQVRUUl9GTFJfRE9XTkxPQURfQ0hFQ0sgIDB4MDEwMDAwMDAKKyNkZWZpbmUgRlRfQVRUUl9GTFJfRE9XTkxPQURfQURECTB4MDIwMDAwMDAKKyNkZWZpbmUgRlRfQVRUUl9DT1BZX0RPV05MT0FECSAgICAweDA0MDAwMDAwCisjZGVmaW5lIEZUX0FUVFJfREVMRVRFX0xPQ0FMCSAgICAweDA4MDAwMDAwCisjZGVmaW5lIEZUX0FUVFJfREVMRVRFX1JFTU9URQkgICAgMHgxMDAwMDAwMAorI2RlZmluZSBGVF9BVFRSX1JFTkFNRV9MT0NBTAkgICAgMHgyMDAwMDAwMAorI2RlZmluZSBGVF9BVFRSX1JFTkFNRV9SRU1PVEUJICAgIDB4NDAwMDAwMDAKKworI2RlZmluZSBGVF9GTFJfREVTVF9NQUlOICAgICAxMDEKKyNkZWZpbmUgRlRfRkxSX0RFU1RfQlJPV1NFICAgMTAyCisjZGVmaW5lIEZUX0ZMUl9ERVNUX0RPV05MT0FEIDEwMworI2RlZmluZSBGVF9GTFJfREVTVF9VUExPQUQgICAxMDQKKyNkZWZpbmUgRlRfRkxSX0RFU1RfREVMRVRFICAgMTA1CisjZGVmaW5lIEZUX0ZMUl9ERVNUX1JFTkFNRSAgIDEwNgorCit0eXBlZGVmIHN0cnVjdCB0YWdTSVpFREFUQUlORk8KK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKK30gU0laRURBVEFJTkZPOworCit0eXBlZGVmIHN0cnVjdCB0YWdTSVpFREFUQUZMQUdTSU5GTworeworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBkYXRhOworCXVuc2lnbmVkIGludCBmbGFnczsKK30gU0laRURBVEFGTEFHU0lORk87CisKK3R5cGVkZWYgc3RydWN0IHRhZ0ZJTEVJTkZPCit7CisJY2hhciBuYW1lW0ZUX0ZJTEVOQU1FX1NJWkVdOworCVNJWkVEQVRBRkxBR1NJTkZPIGluZm87Cit9IEZJTEVJTkZPOworCit0eXBlZGVmIHN0cnVjdCB0YWdGSUxFSU5GT0VYCit7CisJY2hhciBsb2NQYXRoW0ZUX0ZJTEVOQU1FX1NJWkVdOworCWNoYXIgbG9jTmFtZVtGVF9GSUxFTkFNRV9TSVpFXTsKKwljaGFyIHJlbVBhdGhbRlRfRklMRU5BTUVfU0laRV07CisJY2hhciByZW1OYW1lW0ZUX0ZJTEVOQU1FX1NJWkVdOworCVNJWkVEQVRBRkxBR1NJTkZPIGluZm87Cit9IEZJTEVJTkZPRVg7CisKKyNlbmRpZiAvLyBfX1JGQl9GVFRZUEVTX0hfXwpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9oZXh0aWxlQ29uc3RhbnRzLmggYi9jb21tb24vcmZiL2hleHRpbGVDb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODcxM2NiCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi9oZXh0aWxlQ29uc3RhbnRzLmgKQEAgLTAsMCArMSwyNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2lmbmRlZiBfX1JGQl9IRVhUSUxFQ09OU1RBTlRTX0hfXworI2RlZmluZSBfX1JGQl9IRVhUSUxFQ09OU1RBTlRTX0hfXworbmFtZXNwYWNlIHJmYiB7CisgIGNvbnN0IGludCBoZXh0aWxlUmF3ID0gKDEgPDwgMCk7CisgIGNvbnN0IGludCBoZXh0aWxlQmdTcGVjaWZpZWQgPSAoMSA8PCAxKTsKKyAgY29uc3QgaW50IGhleHRpbGVGZ1NwZWNpZmllZCA9ICgxIDw8IDIpOworICBjb25zdCBpbnQgaGV4dGlsZUFueVN1YnJlY3RzID0gKDEgPDwgMyk7CisgIGNvbnN0IGludCBoZXh0aWxlU3VicmVjdHNDb2xvdXJlZCA9ICgxIDw8IDQpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL2hleHRpbGVEZWNvZGUuaCBiL2NvbW1vbi9yZmIvaGV4dGlsZURlY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YmVmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL2hleHRpbGVEZWNvZGUuaApAQCAtMCwwICsxLDEyNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIEhleHRpbGUgZGVjb2RpbmcgZnVuY3Rpb24uCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBhZnRlciBoYXZpbmcgc2V0IHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorLy8gQlBQICAgICAgICAgICAgICAgIC0gOCwgMTYgb3IgMzIKKy8vIEVYVFJBX0FSR1MgICAgICAgICAtIG9wdGlvbmFsIGV4dHJhIGFyZ3VtZW50cworLy8gRklMTF9SRUNUICAgICAgICAgIC0gZmlsbCBhIHJlY3RhbmdsZSB3aXRoIGEgc2luZ2xlIGNvbG91cgorLy8gSU1BR0VfUkVDVCAgICAgICAgIC0gZHJhdyBhIHJlY3RhbmdsZSBvZiBwaXhlbCBkYXRhIGZyb20gYSBidWZmZXIKKworI2luY2x1ZGUgPHJkci9JblN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9oZXh0aWxlQ29uc3RhbnRzLmg+CisKK25hbWVzcGFjZSByZmIgeworCisvLyBDT05DQVQyRSBjb25jYXRlbmF0ZXMgaXRzIGFyZ3VtZW50cywgZXhwYW5kaW5nIHRoZW0gaWYgdGhleSBhcmUgbWFjcm9zCisKKyNpZm5kZWYgQ09OQ0FUMkUKKyNkZWZpbmUgQ09OQ0FUMihhLGIpIGEjI2IKKyNkZWZpbmUgQ09OQ0FUMkUoYSxiKSBDT05DQVQyKGEsYikKKyNlbmRpZgorCisjZGVmaW5lIFBJWEVMX1QgcmRyOjpDT05DQVQyRShVLEJQUCkKKyNkZWZpbmUgUkVBRF9QSVhFTCBDT05DQVQyRShyZWFkT3BhcXVlLEJQUCkKKyNkZWZpbmUgSEVYVElMRV9ERUNPREUgQ09OQ0FUMkUoaGV4dGlsZURlY29kZSxCUFApCisKK3ZvaWQgSEVYVElMRV9ERUNPREUgKGNvbnN0IFJlY3QmIHIsIHJkcjo6SW5TdHJlYW0qIGlzLCBQSVhFTF9UKiBidWYKKyNpZmRlZiBFWFRSQV9BUkdTCisgICAgICAgICAgICAgICAgICAgICAsIEVYVFJBX0FSR1MKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgKQoreworICBSZWN0IHQ7CisgIFBJWEVMX1QgYmcgPSAwOworICBQSVhFTF9UIGZnID0gMDsKKworICBmb3IgKHQudGwueSA9IHIudGwueTsgdC50bC55IDwgci5ici55OyB0LnRsLnkgKz0gMTYpIHsKKworICAgIHQuYnIueSA9IF9fcmZibWluKHIuYnIueSwgdC50bC55ICsgMTYpOworCisgICAgZm9yICh0LnRsLnggPSByLnRsLng7IHQudGwueCA8IHIuYnIueDsgdC50bC54ICs9IDE2KSB7CisKKyAgICAgIHQuYnIueCA9IF9fcmZibWluKHIuYnIueCwgdC50bC54ICsgMTYpOworCisgICAgICBpbnQgdGlsZVR5cGUgPSBpcy0+cmVhZFU4KCk7CisKKyAgICAgIGlmICh0aWxlVHlwZSAmIGhleHRpbGVSYXcpIHsKKwlpcy0+cmVhZEJ5dGVzKGJ1ZiwgdC5hcmVhKCkgKiAoQlBQLzgpKTsKKwlJTUFHRV9SRUNUKHQsIGJ1Zik7CisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmICh0aWxlVHlwZSAmIGhleHRpbGVCZ1NwZWNpZmllZCkKKwliZyA9IGlzLT5SRUFEX1BJWEVMKCk7CisKKyNpZmRlZiBGQVZPVVJfRklMTF9SRUNUCisgICAgICBGSUxMX1JFQ1QodCwgYmcpOworI2Vsc2UKKyAgICAgIGludCBsZW4gPSB0LmFyZWEoKTsKKyAgICAgIFBJWEVMX1QqIHB0ciA9IChQSVhFTF9UKilidWY7CisgICAgICB3aGlsZSAobGVuLS0gPiAwKSAqcHRyKysgPSBiZzsKKyNlbmRpZgorCisgICAgICBpZiAodGlsZVR5cGUgJiBoZXh0aWxlRmdTcGVjaWZpZWQpCisJZmcgPSBpcy0+UkVBRF9QSVhFTCgpOworCisgICAgICBpZiAodGlsZVR5cGUgJiBoZXh0aWxlQW55U3VicmVjdHMpIHsKKyAgICAgICAgaW50IG5TdWJyZWN0cyA9IGlzLT5yZWFkVTgoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5TdWJyZWN0czsgaSsrKSB7CisKKyAgICAgICAgICBpZiAodGlsZVR5cGUgJiBoZXh0aWxlU3VicmVjdHNDb2xvdXJlZCkKKyAgICAgICAgICAgIGZnID0gaXMtPlJFQURfUElYRUwoKTsKKworICAgICAgICAgIGludCB4eSA9IGlzLT5yZWFkVTgoKTsKKyAgICAgICAgICBpbnQgd2ggPSBpcy0+cmVhZFU4KCk7CisKKyNpZmRlZiBGQVZPVVJfRklMTF9SRUNUCisgICAgICAgICAgUmVjdCBzOworICAgICAgICAgIHMudGwueCA9IHQudGwueCArICgoeHkgPj4gNCkgJiAxNSk7CisgICAgICAgICAgcy50bC55ID0gdC50bC55ICsgKHh5ICYgMTUpOworICAgICAgICAgIHMuYnIueCA9IHMudGwueCArICgod2ggPj4gNCkgJiAxNSkgKyAxOworICAgICAgICAgIHMuYnIueSA9IHMudGwueSArICh3aCAmIDE1KSArIDE7CisgICAgICAgICAgRklMTF9SRUNUKHMsIGZnKTsKKyNlbHNlCisgICAgICAgICAgaW50IHggPSAoKHh5ID4+IDQpICYgMTUpOworICAgICAgICAgIGludCB5ID0gKHh5ICYgMTUpOworICAgICAgICAgIGludCB3ID0gKCh3aCA+PiA0KSAmIDE1KSArIDE7CisgICAgICAgICAgaW50IGggPSAod2ggJiAxNSkgKyAxOworICAgICAgICAgIFBJWEVMX1QqIHB0ciA9IChQSVhFTF9UKilidWYgKyB5ICogdC53aWR0aCgpICsgeDsKKyAgICAgICAgICBpbnQgcm93QWRkID0gdC53aWR0aCgpIC0gdzsKKyAgICAgICAgICB3aGlsZSAoaC0tID4gMCkgeworICAgICAgICAgICAgaW50IGxlbiA9IHc7CisgICAgICAgICAgICB3aGlsZSAobGVuLS0gPiAwKSAqcHRyKysgPSBmZzsKKyAgICAgICAgICAgIHB0ciArPSByb3dBZGQ7CisgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICAgIH0KKyNpZm5kZWYgRkFWT1VSX0ZJTExfUkVDVAorICAgICAgSU1BR0VfUkVDVCh0LCBidWYpOworI2VuZGlmCisgICAgfQorICB9Cit9CisKKyN1bmRlZiBQSVhFTF9UCisjdW5kZWYgUkVBRF9QSVhFTAorI3VuZGVmIEhFWFRJTEVfREVDT0RFCit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL2hleHRpbGVFbmNvZGUuaCBiL2NvbW1vbi9yZmIvaGV4dGlsZUVuY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOGJkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL2hleHRpbGVFbmNvZGUuaApAQCAtMCwwICsxLDIyOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA1IENvbnN0YW50aW4gS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBIZXh0aWxlIGVuY29kaW5nIGZ1bmN0aW9uLgorLy8KKy8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgYWZ0ZXIgaGF2aW5nIHNldCB0aGUgZm9sbG93aW5nIG1hY3JvczoKKy8vIEJQUCAgICAgICAgICAgICAgICAtIDgsIDE2IG9yIDMyCisvLyBFWFRSQV9BUkdTICAgICAgICAgLSBvcHRpb25hbCBleHRyYSBhcmd1bWVudHMKKy8vIEdFVF9JTUFHRV9JTlRPX0JVRiAtIGdldHMgYSByZWN0YW5nbGUgb2YgcGl4ZWwgZGF0YSBpbnRvIGEgYnVmZmVyCisKKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL2hleHRpbGVDb25zdGFudHMuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKy8vIENPTkNBVDJFIGNvbmNhdGVuYXRlcyBpdHMgYXJndW1lbnRzLCBleHBhbmRpbmcgdGhlbSBpZiB0aGV5IGFyZSBtYWNyb3MKKworI2lmbmRlZiBDT05DQVQyRQorI2RlZmluZSBDT05DQVQyKGEsYikgYSMjYgorI2RlZmluZSBDT05DQVQyRShhLGIpIENPTkNBVDIoYSxiKQorI2VuZGlmCisKKyNkZWZpbmUgUElYRUxfVCByZHI6OkNPTkNBVDJFKFUsQlBQKQorI2RlZmluZSBXUklURV9QSVhFTCBDT05DQVQyRSh3cml0ZU9wYXF1ZSxCUFApCisjZGVmaW5lIEhFWFRJTEVfRU5DT0RFIENPTkNBVDJFKGhleHRpbGVFbmNvZGUsQlBQKQorI2RlZmluZSBIRVhUSUxFX0VOQ09ERV9USUxFIENPTkNBVDJFKGhleHRpbGVFbmNvZGVUaWxlLEJQUCkKKyNkZWZpbmUgVEVTVF9USUxFX1RZUEUgQ09OQ0FUMkUoaGV4dGlsZVRlc3RUaWxlVHlwZSxCUFApCisKK2ludCBURVNUX1RJTEVfVFlQRSAoUElYRUxfVCogZGF0YSwgaW50IHcsIGludCBoLCBQSVhFTF9UKiBiZywgUElYRUxfVCogZmcpOworaW50IEhFWFRJTEVfRU5DT0RFX1RJTEUgKFBJWEVMX1QqIGRhdGEsIGludCB3LCBpbnQgaCwgaW50IHRpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJkcjo6VTgqIGVuY29kZWQsIFBJWEVMX1QgYmcpOworCit2b2lkIEhFWFRJTEVfRU5DT0RFKGNvbnN0IFJlY3QmIHIsIHJkcjo6T3V0U3RyZWFtKiBvcworI2lmZGVmIEVYVFJBX0FSR1MKKyAgICAgICAgICAgICAgICAgICAgLCBFWFRSQV9BUkdTCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKQoreworICBSZWN0IHQ7CisgIFBJWEVMX1QgYnVmWzI1Nl07CisgIFBJWEVMX1Qgb2xkQmcgPSAwLCBvbGRGZyA9IDA7CisgIGJvb2wgb2xkQmdWYWxpZCA9IGZhbHNlOworICBib29sIG9sZEZnVmFsaWQgPSBmYWxzZTsKKyAgcmRyOjpVOCBlbmNvZGVkWzI1NiooQlBQLzgpXTsKKworICBmb3IgKHQudGwueSA9IHIudGwueTsgdC50bC55IDwgci5ici55OyB0LnRsLnkgKz0gMTYpIHsKKworICAgIHQuYnIueSA9IF9fcmZibWluKHIuYnIueSwgdC50bC55ICsgMTYpOworCisgICAgZm9yICh0LnRsLnggPSByLnRsLng7IHQudGwueCA8IHIuYnIueDsgdC50bC54ICs9IDE2KSB7CisKKyAgICAgIHQuYnIueCA9IF9fcmZibWluKHIuYnIueCwgdC50bC54ICsgMTYpOworCisgICAgICBHRVRfSU1BR0VfSU5UT19CVUYodCxidWYpOworCisgICAgICBQSVhFTF9UIGJnLCBmZzsKKyAgICAgIGludCB0aWxlVHlwZSA9IFRFU1RfVElMRV9UWVBFKGJ1ZiwgdC53aWR0aCgpLCB0LmhlaWdodCgpLCAmYmcsICZmZyk7CisKKyAgICAgIGlmICghb2xkQmdWYWxpZCB8fCBvbGRCZyAhPSBiZykgeworICAgICAgICB0aWxlVHlwZSB8PSBoZXh0aWxlQmdTcGVjaWZpZWQ7CisgICAgICAgIG9sZEJnID0gYmc7CisgICAgICAgIG9sZEJnVmFsaWQgPSB0cnVlOworICAgICAgfQorCisgICAgICBpbnQgZW5jb2RlZExlbiA9IDA7CisKKyAgICAgIGlmICh0aWxlVHlwZSAmIGhleHRpbGVBbnlTdWJyZWN0cykgeworCisgICAgICAgIGlmICh0aWxlVHlwZSAmIGhleHRpbGVTdWJyZWN0c0NvbG91cmVkKSB7CisgICAgICAgICAgb2xkRmdWYWxpZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICghb2xkRmdWYWxpZCB8fCBvbGRGZyAhPSBmZykgeworICAgICAgICAgICAgdGlsZVR5cGUgfD0gaGV4dGlsZUZnU3BlY2lmaWVkOworICAgICAgICAgICAgb2xkRmcgPSBmZzsKKyAgICAgICAgICAgIG9sZEZnVmFsaWQgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVuY29kZWRMZW4gPSBIRVhUSUxFX0VOQ09ERV9USUxFKGJ1ZiwgdC53aWR0aCgpLCB0LmhlaWdodCgpLCB0aWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCwgYmcpOworCisgICAgICAgIGlmIChlbmNvZGVkTGVuIDwgMCkgeworICAgICAgICAgIEdFVF9JTUFHRV9JTlRPX0JVRih0LGJ1Zik7CisgICAgICAgICAgb3MtPndyaXRlVTgoaGV4dGlsZVJhdyk7CisgICAgICAgICAgb3MtPndyaXRlQnl0ZXMoYnVmLCB0LndpZHRoKCkgKiB0LmhlaWdodCgpICogKEJQUC84KSk7CisgICAgICAgICAgb2xkQmdWYWxpZCA9IG9sZEZnVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBvcy0+d3JpdGVVOCh0aWxlVHlwZSk7CisgICAgICBpZiAodGlsZVR5cGUgJiBoZXh0aWxlQmdTcGVjaWZpZWQpIG9zLT5XUklURV9QSVhFTChiZyk7CisgICAgICBpZiAodGlsZVR5cGUgJiBoZXh0aWxlRmdTcGVjaWZpZWQpIG9zLT5XUklURV9QSVhFTChmZyk7CisgICAgICBpZiAodGlsZVR5cGUgJiBoZXh0aWxlQW55U3VicmVjdHMpIG9zLT53cml0ZUJ5dGVzKGVuY29kZWQsIGVuY29kZWRMZW4pOworICAgIH0KKyAgfQorfQorCisKK2ludCBIRVhUSUxFX0VOQ09ERV9USUxFIChQSVhFTF9UKiBkYXRhLCBpbnQgdywgaW50IGgsIGludCB0aWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZHI6OlU4KiBlbmNvZGVkLCBQSVhFTF9UIGJnKQoreworICByZHI6OlU4KiBuU3VicmVjdHNQdHIgPSBlbmNvZGVkOworICAqblN1YnJlY3RzUHRyID0gMDsKKyAgZW5jb2RlZCsrOworCisgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKQorICB7CisgICAgaW50IHggPSAwOworICAgIHdoaWxlICh4IDwgdykgeworICAgICAgaWYgKCpkYXRhID09IGJnKSB7CisgICAgICAgIHgrKzsKKyAgICAgICAgZGF0YSsrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gRmluZCBob3Jpem9udGFsIHN1YnJlY3QgZmlyc3QKKyAgICAgIFBJWEVMX1QqIHB0ciA9IGRhdGErMTsKKyAgICAgIFBJWEVMX1QqIGVvbCA9IGRhdGErdy14OworICAgICAgd2hpbGUgKHB0ciA8IGVvbCAmJiAqcHRyID09ICpkYXRhKSBwdHIrKzsKKyAgICAgIGludCBzdyA9IHB0ciAtIGRhdGE7CisKKyAgICAgIHB0ciA9IGRhdGEgKyB3OworICAgICAgaW50IHNoID0gMTsKKyAgICAgIHdoaWxlIChzaCA8IGgteSkgeworICAgICAgICBlb2wgPSBwdHIgKyBzdzsKKyAgICAgICAgd2hpbGUgKHB0ciA8IGVvbCkKKyAgICAgICAgICBpZiAoKnB0cisrICE9ICpkYXRhKSBnb3RvIGVuZE9mU3VicmVjdDsKKyAgICAgICAgcHRyICs9IHcgLSBzdzsKKyAgICAgICAgc2grKzsKKyAgICAgIH0KKyAgICBlbmRPZlN1YnJlY3Q6CisKKyAgICAgICgqblN1YnJlY3RzUHRyKSsrOworCisgICAgICBpZiAodGlsZVR5cGUgJiBoZXh0aWxlU3VicmVjdHNDb2xvdXJlZCkgeworICAgICAgICBpZiAoZW5jb2RlZCAtIG5TdWJyZWN0c1B0ciArIChCUFAvOCkgPiB3KmgqKEJQUC84KSkgcmV0dXJuIC0xOworI2lmIChCUFAgPT0gOCkKKyAgICAgICAgKmVuY29kZWQrKyA9ICpkYXRhOworI2VsaWYgKEJQUCA9PSAxNikKKyAgICAgICAgKmVuY29kZWQrKyA9ICgocmRyOjpVOCopZGF0YSlbMF07CisgICAgICAgICplbmNvZGVkKysgPSAoKHJkcjo6VTgqKWRhdGEpWzFdOworI2VsaWYgKEJQUCA9PSAzMikKKyAgICAgICAgKmVuY29kZWQrKyA9ICgocmRyOjpVOCopZGF0YSlbMF07CisgICAgICAgICplbmNvZGVkKysgPSAoKHJkcjo6VTgqKWRhdGEpWzFdOworICAgICAgICAqZW5jb2RlZCsrID0gKChyZHI6OlU4KilkYXRhKVsyXTsKKyAgICAgICAgKmVuY29kZWQrKyA9ICgocmRyOjpVOCopZGF0YSlbM107CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgaWYgKGVuY29kZWQgLSBuU3VicmVjdHNQdHIgKyAyID4gdypoKihCUFAvOCkpIHJldHVybiAtMTsKKyAgICAgICplbmNvZGVkKysgPSAoeCA8PCA0KSB8IHk7CisgICAgICAqZW5jb2RlZCsrID0gKChzdy0xKSA8PCA0KSB8IChzaC0xKTsKKworICAgICAgcHRyID0gZGF0YSt3OworICAgICAgUElYRUxfVCogZW9yID0gZGF0YSt3KnNoOworICAgICAgd2hpbGUgKHB0ciA8IGVvcikgeworICAgICAgICBlb2wgPSBwdHIgKyBzdzsKKyAgICAgICAgd2hpbGUgKHB0ciA8IGVvbCkgKnB0cisrID0gYmc7CisgICAgICAgIHB0ciArPSB3IC0gc3c7CisgICAgICB9CisgICAgICB4ICs9IHN3OworICAgICAgZGF0YSArPSBzdzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVuY29kZWQgLSBuU3VicmVjdHNQdHI7Cit9CisKKworaW50IFRFU1RfVElMRV9UWVBFIChQSVhFTF9UKiBkYXRhLCBpbnQgdywgaW50IGgsIFBJWEVMX1QqIGJnLCBQSVhFTF9UKiBmZykKK3sKKyAgUElYRUxfVCBwaXgxID0gKmRhdGE7CisgIFBJWEVMX1QqIGVuZCA9IGRhdGEgKyB3ICogaDsKKworICBQSVhFTF9UKiBwdHIgPSBkYXRhICsgMTsKKyAgd2hpbGUgKHB0ciA8IGVuZCAmJiAqcHRyID09IHBpeDEpCisgICAgcHRyKys7CisKKyAgaWYgKHB0ciA9PSBlbmQpIHsKKyAgICAqYmcgPSBwaXgxOworICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvLyBzb2xpZC1jb2xvciB0aWxlCisgIH0KKworICBpbnQgY291bnQxID0gcHRyIC0gZGF0YTsKKyAgaW50IGNvdW50MiA9IDE7CisgIFBJWEVMX1QgcGl4MiA9ICpwdHIrKzsKKyAgaW50IHRpbGVUeXBlID0gaGV4dGlsZUFueVN1YnJlY3RzOworCisgIGZvciAoOyBwdHIgPCBlbmQ7IHB0cisrKSB7CisgICAgaWYgKCpwdHIgPT0gcGl4MSkgeworICAgICAgY291bnQxKys7CisgICAgfSBlbHNlIGlmICgqcHRyID09IHBpeDIpIHsKKyAgICAgIGNvdW50MisrOworICAgIH0gZWxzZSB7CisgICAgICB0aWxlVHlwZSB8PSBoZXh0aWxlU3VicmVjdHNDb2xvdXJlZDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChjb3VudDEgPj0gY291bnQyKSB7CisgICAgKmJnID0gcGl4MTsgKmZnID0gcGl4MjsKKyAgfSBlbHNlIHsKKyAgICAqYmcgPSBwaXgyOyAqZmcgPSBwaXgxOworICB9CisgIHJldHVybiB0aWxlVHlwZTsKK30KKworI3VuZGVmIFBJWEVMX1QKKyN1bmRlZiBXUklURV9QSVhFTAorI3VuZGVmIEhFWFRJTEVfRU5DT0RFCisjdW5kZWYgSEVYVElMRV9FTkNPREVfVElMRQorI3VuZGVmIFRFU1RfVElMRV9UWVBFCit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL2hleHRpbGVFbmNvZGVCZXR0ZXIuaCBiL2NvbW1vbi9yZmIvaGV4dGlsZUVuY29kZUJldHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmIxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL2hleHRpbGVFbmNvZGVCZXR0ZXIuaApAQCAtMCwwICsxLDM1MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA1IENvbnN0YW50aW4gS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBIZXh0aWxlIGVuY29kaW5nIGZ1bmN0aW9uLgorLy8KKy8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgYWZ0ZXIgaGF2aW5nIHNldCB0aGUgZm9sbG93aW5nIG1hY3JvczoKKy8vIEJQUCAgICAgICAgICAgICAgICAtIDgsIDE2IG9yIDMyCisvLyBFWFRSQV9BUkdTICAgICAgICAgLSBvcHRpb25hbCBleHRyYSBhcmd1bWVudHMKKy8vIEdFVF9JTUFHRV9JTlRPX0JVRiAtIGdldHMgYSByZWN0YW5nbGUgb2YgcGl4ZWwgZGF0YSBpbnRvIGEgYnVmZmVyCisKKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmZiL2hleHRpbGVDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxyZmIvVGlnaHRQYWxldHRlLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKy8vIENPTkNBVDJFIGNvbmNhdGVuYXRlcyBpdHMgYXJndW1lbnRzLCBleHBhbmRpbmcgdGhlbSBpZiB0aGV5IGFyZSBtYWNyb3MKKworI2lmbmRlZiBDT05DQVQyRQorI2RlZmluZSBDT05DQVQyKGEsYikgYSMjYgorI2RlZmluZSBDT05DQVQyRShhLGIpIENPTkNBVDIoYSxiKQorI2VuZGlmCisKKyNkZWZpbmUgUElYRUxfVCByZHI6OkNPTkNBVDJFKFUsQlBQKQorI2RlZmluZSBXUklURV9QSVhFTCBDT05DQVQyRSh3cml0ZU9wYXF1ZSxCUFApCisjZGVmaW5lIEhFWFRJTEVfVElMRSBDT05DQVQyRShIZXh0aWxlVGlsZSxCUFApCisjZGVmaW5lIEhFWFRJTEVfRU5DT0RFIENPTkNBVDJFKGhleHRpbGVFbmNvZGVCZXR0ZXIsQlBQKQorCisvLworLy8gVGhpcyBjbGFzcyBhbmFseXplcyBhIHNlcGFyYXRlIHRpbGUgYW5kIGVuY29kZXMgaXRzIHN1YnJlY3RhbmdsZXMuCisvLworCitjbGFzcyBIRVhUSUxFX1RJTEUgeworCisgcHVibGljOgorCisgIEhFWFRJTEVfVElMRSAoKTsKKworICAvLworICAvLyBJbml0aWFsaXplIGV4aXN0aW5nIG9iamVjdCBpbnN0YW5jZSB3aXRoIG5ldyB0aWxlIGRhdGEuCisgIC8vCisgIHZvaWQgbmV3VGlsZShjb25zdCBQSVhFTF9UICpzcmMsIGludCB3LCBpbnQgaCk7CisKKyAgLy8KKyAgLy8gRmxhZ3MgY2FuIGluY2x1ZGU6IGhleHRpbGVSYXcsIGhleHRpbGVBbnlTdWJyZWN0cyBhbmQKKyAgLy8gaGV4dGlsZVN1YnJlY3RzQ29sb3VyZWQuIE5vdGUgdGhhdCBpZiBoZXh0aWxlUmF3IGlzIHNldCwgb3RoZXIKKyAgLy8gZmxhZ3MgbWFrZSBubyBzZW5zZS4gQWxzbywgaGV4dGlsZVN1YnJlY3RzQ29sb3VyZWQgaXMgbWVhbmluZ2Z1bAorICAvLyBvbmx5IHdoZW4gaGV4dGlsZUFueVN1YnJlY3RzIGlzIHNldCBhcyB3ZWxsLgorICAvLworICBpbnQgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtX2ZsYWdzOyB9CisKKyAgLy8KKyAgLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiBlbmNvZGVkIHN1YnJlY3RzIGRhdGEsIGluY2x1ZGluZyBzdWJyZWN0IGNvdW50LgorICAvLyBUaGUgc2l6ZSBpcyB6ZXJvIGlmIGZsYWdzIGRvIG5vdCBpbmNsdWRlIGhleHRpbGVBbnlTdWJyZWN0cy4KKyAgLy8KKyAgaW50IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKworICAvLworICAvLyBSZXR1cm4gb3B0aW1hbCBiYWNrZ3JvdW5kLgorICAvLworICBpbnQgZ2V0QmFja2dyb3VuZCgpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZDsgfQorCisgIC8vCisgIC8vIFJldHVybiBmb3JlZ3JvdW5kIGlmIGZsYWdzIGluY2x1ZGUgaGV4dGlsZVN1YnJlY3RzQ29sb3VyZWQuCisgIC8vCisgIGludCBnZXRGb3JlZ3JvdW5kKCkgY29uc3QgeyByZXR1cm4gbV9mb3JlZ3JvdW5kOyB9CisKKyAgLy8KKyAgLy8gRW5jb2RlIHN1YnJlY3RzLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgb25seSBpZgorICAvLyBoZXh0aWxlQW55U3VicmVjdHMgYml0IGlzIHNldCBpbiBmbGFncy4gVGhlIGJ1ZmZlciBzaXplIHNob3VsZCBiZQorICAvLyBiaWcgZW5vdWdoIHRvIHN0b3JlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmV0dXJuZWQgYnkgdGhlCisgIC8vIGdldFNpemUoKSBtZXRob2QuCisgIC8vCisgIHZvaWQgZW5jb2RlKHJkcjo6VTgqIGRzdCkgY29uc3Q7CisKKyBwcm90ZWN0ZWQ6CisKKyAgLy8KKyAgLy8gQW5hbHl6ZSB0aGUgdGlsZSBwaXhlbHMsIGZpbGwgaW4gYWxsIHRoZSBkYXRhIGZpZWxkcy4KKyAgLy8KKyAgdm9pZCBhbmFseXplKCk7CisKKyAgY29uc3QgUElYRUxfVCAqbV90aWxlOworICBpbnQgbV93aWR0aDsKKyAgaW50IG1faGVpZ2h0OworCisgIGludCBtX3NpemU7CisgIGludCBtX2ZsYWdzOworICBQSVhFTF9UIG1fYmFja2dyb3VuZDsKKyAgUElYRUxfVCBtX2ZvcmVncm91bmQ7CisKKyAgaW50IG1fbnVtU3VicmVjdHM7CisgIHJkcjo6VTggbV9jb29yZHNbMjU2ICogMl07CisgIFBJWEVMX1QgbV9jb2xvcnNbMjU2XTsKKworIHByaXZhdGU6CisKKyAgYm9vbCBtX3Byb2Nlc3NlZFsxNl1bMTZdOworICBUaWdodFBhbGV0dGUgbV9wYWw7Cit9OworCitIRVhUSUxFX1RJTEU6OkhFWFRJTEVfVElMRSgpCisgIDogbV90aWxlKE5VTEwpLCBtX3dpZHRoKDApLCBtX2hlaWdodCgwKSwKKyAgICBtX3NpemUoMCksIG1fZmxhZ3MoMCksIG1fYmFja2dyb3VuZCgwKSwgbV9mb3JlZ3JvdW5kKDApLAorICAgIG1fbnVtU3VicmVjdHMoMCksIG1fcGFsKDQ4ICsgMiAqIEJQUCkKK3sKK30KKwordm9pZCBIRVhUSUxFX1RJTEU6Om5ld1RpbGUoY29uc3QgUElYRUxfVCAqc3JjLCBpbnQgdywgaW50IGgpCit7CisgIG1fdGlsZSA9IHNyYzsKKyAgbV93aWR0aCA9IHc7CisgIG1faGVpZ2h0ID0gaDsKKworICBhbmFseXplKCk7Cit9CisKK3ZvaWQgSEVYVElMRV9USUxFOjphbmFseXplKCkKK3sKKyAgYXNzZXJ0KG1fdGlsZSAmJiBtX3dpZHRoICYmIG1faGVpZ2h0KTsKKworICBjb25zdCBQSVhFTF9UICpwdHIgPSBtX3RpbGU7CisgIGNvbnN0IFBJWEVMX1QgKmVuZCA9ICZtX3RpbGVbbV93aWR0aCAqIG1faGVpZ2h0XTsKKyAgUElYRUxfVCBjb2xvciA9ICpwdHIrKzsKKyAgd2hpbGUgKHB0ciAhPSBlbmQgJiYgKnB0ciA9PSBjb2xvcikKKyAgICBwdHIrKzsKKworICAvLyBIYW5kbGUgc29saWQgdGlsZQorICBpZiAocHRyID09IGVuZCkgeworICAgIG1fYmFja2dyb3VuZCA9IG1fdGlsZVswXTsKKyAgICBtX2ZsYWdzID0gMDsKKyAgICBtX3NpemUgPSAwOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIENvbXB1dGUgbnVtYmVyIG9mIGNvbXBsZXRlIHJvd3Mgb2YgdGhlIHNhbWUgY29sb3IsIGF0IHRoZSB0b3AKKyAgaW50IHkgPSAocHRyIC0gbV90aWxlKSAvIG1fd2lkdGg7CisKKyAgUElYRUxfVCAqY29sb3JzUHRyID0gbV9jb2xvcnM7CisgIHJkcjo6VTggKmNvb3Jkc1B0ciA9IG1fY29vcmRzOworICBtX3BhbC5yZXNldCgpOworICBtX251bVN1YnJlY3RzID0gMDsKKworICAvLyBIYXZlIHdlIGZvdW5kIHRoZSBmaXJzdCBzdWJyZWN0IGFscmVhZHk/CisgIGlmICh5ID4gMCkgeworICAgICpjb2xvcnNQdHIrKyA9IGNvbG9yOworICAgICpjb29yZHNQdHIrKyA9IDA7CisgICAgKmNvb3Jkc1B0cisrID0gKHJkcjo6VTgpKCgobV93aWR0aCAtIDEpIDw8IDQpIHwgKCh5IC0gMSkgJiAweDBGKSk7CisgICAgbV9wYWwuaW5zZXJ0KGNvbG9yLCAxKTsKKyAgICBtX251bVN1YnJlY3RzKys7CisgIH0KKworICBtZW1zZXQobV9wcm9jZXNzZWQsIDAsIDE2ICogMTYgKiBzaXplb2YoYm9vbCkpOworCisgIGludCB4LCBzeCwgc3ksIHN3LCBzaCwgbWF4X3g7CisKKyAgZm9yICg7IHkgPCBtX2hlaWdodDsgeSsrKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IG1fd2lkdGg7IHgrKykgeworICAgICAgLy8gU2tpcCBwaXhlbHMgdGhhdCB3ZXJlIHByb2Nlc3NlZCBlYXJsaWVyCisgICAgICBpZiAobV9wcm9jZXNzZWRbeV1beF0pIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvLyBEZXRlcm1pbmUgZGltZW5zaW9ucyBvZiB0aGUgaG9yaXpvbnRhbCBzdWJyZWN0CisgICAgICBjb2xvciA9IG1fdGlsZVt5ICogbV93aWR0aCArIHhdOworICAgICAgZm9yIChzeCA9IHggKyAxOyBzeCA8IG1fd2lkdGg7IHN4KyspIHsKKyAgICAgICAgaWYgKG1fdGlsZVt5ICogbV93aWR0aCArIHN4XSAhPSBjb2xvcikKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN3ID0gc3ggLSB4OworICAgICAgbWF4X3ggPSBzeDsKKyAgICAgIGZvciAoc3kgPSB5ICsgMTsgc3kgPCBtX2hlaWdodDsgc3krKykgeworICAgICAgICBmb3IgKHN4ID0geDsgc3ggPCBtYXhfeDsgc3grKykgeworICAgICAgICAgIGlmIChtX3RpbGVbc3kgKiBtX3dpZHRoICsgc3hdICE9IGNvbG9yKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgICB9CisgICAgZG9uZToKKyAgICAgIHNoID0gc3kgLSB5OworCisgICAgICAvLyBTYXZlIHByb3BlcnRpZXMgb2YgdGhpcyBzdWJyZWN0CisgICAgICAqY29sb3JzUHRyKysgPSBjb2xvcjsKKyAgICAgICpjb29yZHNQdHIrKyA9IChyZHI6OlU4KSgoeCA8PCA0KSB8ICh5ICYgMHgwRikpOworICAgICAgKmNvb3Jkc1B0cisrID0gKHJkcjo6VTgpKCgoc3cgLSAxKSA8PCA0KSB8ICgoc2ggLSAxKSAmIDB4MEYpKTsKKworICAgICAgaWYgKG1fcGFsLmluc2VydChjb2xvciwgMSkgPT0gMCkgeworICAgICAgICAvLyBIYW5kbGUgcGFsZXR0ZSBvdmVyZmxvdworICAgICAgICBtX2ZsYWdzID0gaGV4dGlsZVJhdzsKKyAgICAgICAgbV9zaXplID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBtX251bVN1YnJlY3RzKys7CisKKyAgICAgIC8vIE1hcmsgcGl4ZWxzIG9mIHRoaXMgc3VicmVjdCBhcyBwcm9jZXNzZWQsIGJlbG93IHRoaXMgcm93CisgICAgICBmb3IgKHN5ID0geSArIDE7IHN5IDwgeSArIHNoOyBzeSsrKSB7CisgICAgICAgIGZvciAoc3ggPSB4OyBzeCA8IHggKyBzdzsgc3grKykKKyAgICAgICAgICBtX3Byb2Nlc3NlZFtzeV1bc3hdID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gU2tpcCBwcm9jZXNzZWQgcGl4ZWxzIG9mIHRoaXMgcm93CisgICAgICB4ICs9IChzdyAtIDEpOworICAgIH0KKyAgfQorCisgIC8vIFNhdmUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGlzIHRpbGUgKHNob3VsZCBiZSBubyBsZXNzIHRoYW4gMikKKyAgaW50IG51bUNvbG9ycyA9IG1fcGFsLmdldE51bUNvbG9ycygpOworICBhc3NlcnQobnVtQ29sb3JzID49IDIpOworCisgIG1fYmFja2dyb3VuZCA9IChQSVhFTF9UKW1fcGFsLmdldEVudHJ5KDApOworICBtX2ZsYWdzID0gaGV4dGlsZUFueVN1YnJlY3RzOworICBpbnQgbnVtU3VicmVjdHMgPSBtX251bVN1YnJlY3RzIC0gbV9wYWwuZ2V0Q291bnQoMCk7CisKKyAgaWYgKG51bUNvbG9ycyA9PSAyKSB7CisgICAgLy8gTW9ub2Nocm9tZSB0aWxlCisgICAgbV9mb3JlZ3JvdW5kID0gKFBJWEVMX1QpbV9wYWwuZ2V0RW50cnkoMSk7CisgICAgbV9zaXplID0gMSArIDIgKiBudW1TdWJyZWN0czsKKyAgfSBlbHNlIHsKKyAgICAvLyBDb2xvcmVkIHRpbGUKKyAgICBtX2ZsYWdzIHw9IGhleHRpbGVTdWJyZWN0c0NvbG91cmVkOworICAgIG1fc2l6ZSA9IDEgKyAoMiArIChCUFAvOCkpICogbnVtU3VicmVjdHM7CisgIH0KK30KKwordm9pZCBIRVhUSUxFX1RJTEU6OmVuY29kZShyZHI6OlU4ICpkc3QpIGNvbnN0Cit7CisgIGFzc2VydChtX251bVN1YnJlY3RzICYmIChtX2ZsYWdzICYgaGV4dGlsZUFueVN1YnJlY3RzKSk7CisKKyAgLy8gWmVybyBzdWJyZWN0cyBjb3VudGVyCisgIHJkcjo6VTggKm51bVN1YnJlY3RzUHRyID0gZHN0OworICAqZHN0KysgPSAwOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9udW1TdWJyZWN0czsgaSsrKSB7CisgICAgaWYgKG1fY29sb3JzW2ldID09IG1fYmFja2dyb3VuZCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKG1fZmxhZ3MgJiBoZXh0aWxlU3VicmVjdHNDb2xvdXJlZCkgeworI2lmIChCUFAgPT0gOCkKKyAgICAgICpkc3QrKyA9IG1fY29sb3JzW2ldOworI2VsaWYgKEJQUCA9PSAxNikKKyAgICAgICpkc3QrKyA9ICgocmRyOjpVOCopJm1fY29sb3JzW2ldKVswXTsKKyAgICAgICpkc3QrKyA9ICgocmRyOjpVOCopJm1fY29sb3JzW2ldKVsxXTsKKyNlbGlmIChCUFAgPT0gMzIpCisgICAgICAqZHN0KysgPSAoKHJkcjo6VTgqKSZtX2NvbG9yc1tpXSlbMF07CisgICAgICAqZHN0KysgPSAoKHJkcjo6VTgqKSZtX2NvbG9yc1tpXSlbMV07CisgICAgICAqZHN0KysgPSAoKHJkcjo6VTgqKSZtX2NvbG9yc1tpXSlbMl07CisgICAgICAqZHN0KysgPSAoKHJkcjo6VTgqKSZtX2NvbG9yc1tpXSlbM107CisjZW5kaWYKKyAgICB9CisgICAgKmRzdCsrID0gbV9jb29yZHNbaSAqIDJdOworICAgICpkc3QrKyA9IG1fY29vcmRzW2kgKiAyICsgMV07CisKKyAgICAoKm51bVN1YnJlY3RzUHRyKSsrOworICB9CisKKyAgYXNzZXJ0KGRzdCAtIG51bVN1YnJlY3RzUHRyID09IG1fc2l6ZSk7Cit9CisKKy8vCisvLyBNYWluIGVuY29kaW5nIGZ1bmN0aW9uLgorLy8KKwordm9pZCBIRVhUSUxFX0VOQ09ERShjb25zdCBSZWN0JiByLCByZHI6Ok91dFN0cmVhbSogb3MKKyNpZmRlZiBFWFRSQV9BUkdTCisgICAgICAgICAgICAgICAgICAgICwgRVhUUkFfQVJHUworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgUmVjdCB0OworICBQSVhFTF9UIGJ1ZlsyNTZdOworICBQSVhFTF9UIG9sZEJnID0gMCwgb2xkRmcgPSAwOworICBib29sIG9sZEJnVmFsaWQgPSBmYWxzZTsKKyAgYm9vbCBvbGRGZ1ZhbGlkID0gZmFsc2U7CisgIHJkcjo6VTggZW5jb2RlZFsyNTYqKEJQUC84KV07CisKKyAgSEVYVElMRV9USUxFIHRpbGU7CisKKyAgZm9yICh0LnRsLnkgPSByLnRsLnk7IHQudGwueSA8IHIuYnIueTsgdC50bC55ICs9IDE2KSB7CisKKyAgICB0LmJyLnkgPSBfX3JmYm1pbihyLmJyLnksIHQudGwueSArIDE2KTsKKworICAgIGZvciAodC50bC54ID0gci50bC54OyB0LnRsLnggPCByLmJyLng7IHQudGwueCArPSAxNikgeworCisgICAgICB0LmJyLnggPSBfX3JmYm1pbihyLmJyLngsIHQudGwueCArIDE2KTsKKworICAgICAgR0VUX0lNQUdFX0lOVE9fQlVGKHQsYnVmKTsKKworICAgICAgdGlsZS5uZXdUaWxlKGJ1ZiwgdC53aWR0aCgpLCB0LmhlaWdodCgpKTsKKyAgICAgIGludCB0aWxlVHlwZSA9IHRpbGUuZ2V0RmxhZ3MoKTsKKyAgICAgIGludCBlbmNvZGVkTGVuID0gdGlsZS5nZXRTaXplKCk7CisKKyAgICAgIGlmICggKHRpbGVUeXBlICYgaGV4dGlsZVJhdykgIT0gMCB8fAorICAgICAgICAgICBlbmNvZGVkTGVuID49IHQud2lkdGgoKSAqIHQuaGVpZ2h0KCkgKiAoQlBQLzgpKSB7CisgICAgICAgIG9zLT53cml0ZVU4KGhleHRpbGVSYXcpOworICAgICAgICBvcy0+d3JpdGVCeXRlcyhidWYsIHQud2lkdGgoKSAqIHQuaGVpZ2h0KCkgKiAoQlBQLzgpKTsKKyAgICAgICAgb2xkQmdWYWxpZCA9IG9sZEZnVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIFBJWEVMX1QgYmcgPSB0aWxlLmdldEJhY2tncm91bmQoKTsKKyAgICAgIFBJWEVMX1QgZmcgPSAwOworCisgICAgICBpZiAoIW9sZEJnVmFsaWQgfHwgb2xkQmcgIT0gYmcpIHsKKyAgICAgICAgdGlsZVR5cGUgfD0gaGV4dGlsZUJnU3BlY2lmaWVkOworICAgICAgICBvbGRCZyA9IGJnOworICAgICAgICBvbGRCZ1ZhbGlkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHRpbGVUeXBlICYgaGV4dGlsZUFueVN1YnJlY3RzKSB7CisgICAgICAgIGlmICh0aWxlVHlwZSAmIGhleHRpbGVTdWJyZWN0c0NvbG91cmVkKSB7CisgICAgICAgICAgb2xkRmdWYWxpZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZnID0gdGlsZS5nZXRGb3JlZ3JvdW5kKCk7CisgICAgICAgICAgaWYgKCFvbGRGZ1ZhbGlkIHx8IG9sZEZnICE9IGZnKSB7CisgICAgICAgICAgICB0aWxlVHlwZSB8PSBoZXh0aWxlRmdTcGVjaWZpZWQ7CisgICAgICAgICAgICBvbGRGZyA9IGZnOworICAgICAgICAgICAgb2xkRmdWYWxpZCA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRpbGUuZW5jb2RlKGVuY29kZWQpOworICAgICAgfQorCisgICAgICBvcy0+d3JpdGVVOCh0aWxlVHlwZSk7CisgICAgICBpZiAodGlsZVR5cGUgJiBoZXh0aWxlQmdTcGVjaWZpZWQpIG9zLT5XUklURV9QSVhFTChiZyk7CisgICAgICBpZiAodGlsZVR5cGUgJiBoZXh0aWxlRmdTcGVjaWZpZWQpIG9zLT5XUklURV9QSVhFTChmZyk7CisgICAgICBpZiAodGlsZVR5cGUgJiBoZXh0aWxlQW55U3VicmVjdHMpIG9zLT53cml0ZUJ5dGVzKGVuY29kZWQsIGVuY29kZWRMZW4pOworICAgIH0KKyAgfQorfQorCisjdW5kZWYgUElYRUxfVAorI3VuZGVmIFdSSVRFX1BJWEVMCisjdW5kZWYgSEVYVElMRV9USUxFCisjdW5kZWYgSEVYVElMRV9FTkNPREUKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIva2V5c3ltZGVmLmggYi9jb21tb24vcmZiL2tleXN5bWRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OWViZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL2tleXN5bWRlZi5oCkBAIC0wLDAgKzEsMTU5NSBAQAorLyogJFRPRzoga2V5c3ltZGVmLmggL21haW4vMjggMTk5OC8wNS8yMiAxNjoxODowMSBrYWxlYiAkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IDE5ODcsIDE5OTQsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cworCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFhLX1ZvaWRTeW1ib2wJCTB4RkZGRkZGCS8qIHZvaWQgc3ltYm9sICovCisKKyNpZmRlZiBYS19NSVNDRUxMQU5ZCisvKgorICogVFRZIEZ1bmN0aW9ucywgY2xldmVybHkgY2hvc2VuIHRvIG1hcCB0byBhc2NpaSwgZm9yIGNvbnZlbmllbmNlIG9mCisgKiBwcm9ncmFtbWluZywgYnV0IGNvdWxkIGhhdmUgYmVlbiBhcmJpdHJhcnkgKGF0IHRoZSBjb3N0IG9mIGxvb2t1cAorICogdGFibGVzIGluIGNsaWVudCBjb2RlLgorICovCisKKyNkZWZpbmUgWEtfQmFja1NwYWNlCQkweEZGMDgJLyogYmFjayBzcGFjZSwgYmFjayBjaGFyICovCisjZGVmaW5lIFhLX1RhYgkJCTB4RkYwOQorI2RlZmluZSBYS19MaW5lZmVlZAkJMHhGRjBBCS8qIExpbmVmZWVkLCBMRiAqLworI2RlZmluZSBYS19DbGVhcgkJMHhGRjBCCisjZGVmaW5lIFhLX1JldHVybgkJMHhGRjBECS8qIFJldHVybiwgZW50ZXIgKi8KKyNkZWZpbmUgWEtfUGF1c2UJCTB4RkYxMwkvKiBQYXVzZSwgaG9sZCAqLworI2RlZmluZSBYS19TY3JvbGxfTG9jawkJMHhGRjE0CisjZGVmaW5lIFhLX1N5c19SZXEJCTB4RkYxNQorI2RlZmluZSBYS19Fc2NhcGUJCTB4RkYxQgorI2RlZmluZSBYS19EZWxldGUJCTB4RkZGRgkvKiBEZWxldGUsIHJ1Ym91dCAqLworCisKKworLyogSW50ZXJuYXRpb25hbCAmIG11bHRpLWtleSBjaGFyYWN0ZXIgY29tcG9zaXRpb24gKi8KKworI2RlZmluZSBYS19NdWx0aV9rZXkJCTB4RkYyMCAgLyogTXVsdGkta2V5IGNoYXJhY3RlciBjb21wb3NlICovCisjZGVmaW5lIFhLX0NvZGVpbnB1dAkJMHhGRjM3CisjZGVmaW5lIFhLX1NpbmdsZUNhbmRpZGF0ZQkweEZGM0MKKyNkZWZpbmUgWEtfTXVsdGlwbGVDYW5kaWRhdGUJMHhGRjNECisjZGVmaW5lIFhLX1ByZXZpb3VzQ2FuZGlkYXRlCTB4RkYzRQorCisvKiBKYXBhbmVzZSBrZXlib2FyZCBzdXBwb3J0ICovCisKKyNkZWZpbmUgWEtfS2FuamkJCTB4RkYyMQkvKiBLYW5qaSwgS2FuamkgY29udmVydCAqLworI2RlZmluZSBYS19NdWhlbmthbgkJMHhGRjIyICAvKiBDYW5jZWwgQ29udmVyc2lvbiAqLworI2RlZmluZSBYS19IZW5rYW5fTW9kZQkJMHhGRjIzICAvKiBTdGFydC9TdG9wIENvbnZlcnNpb24gKi8KKyNkZWZpbmUgWEtfSGVua2FuCQkweEZGMjMgIC8qIEFsaWFzIGZvciBIZW5rYW5fTW9kZSAqLworI2RlZmluZSBYS19Sb21hamkJCTB4RkYyNCAgLyogdG8gUm9tYWppICovCisjZGVmaW5lIFhLX0hpcmFnYW5hCQkweEZGMjUgIC8qIHRvIEhpcmFnYW5hICovCisjZGVmaW5lIFhLX0thdGFrYW5hCQkweEZGMjYgIC8qIHRvIEthdGFrYW5hICovCisjZGVmaW5lIFhLX0hpcmFnYW5hX0thdGFrYW5hCTB4RkYyNyAgLyogSGlyYWdhbmEvS2F0YWthbmEgdG9nZ2xlICovCisjZGVmaW5lIFhLX1plbmtha3UJCTB4RkYyOCAgLyogdG8gWmVua2FrdSAqLworI2RlZmluZSBYS19IYW5rYWt1CQkweEZGMjkgIC8qIHRvIEhhbmtha3UgKi8KKyNkZWZpbmUgWEtfWmVua2FrdV9IYW5rYWt1CTB4RkYyQSAgLyogWmVua2FrdS9IYW5rYWt1IHRvZ2dsZSAqLworI2RlZmluZSBYS19Ub3Vyb2t1CQkweEZGMkIgIC8qIEFkZCB0byBEaWN0aW9uYXJ5ICovCisjZGVmaW5lIFhLX01hc3N5bwkJMHhGRjJDICAvKiBEZWxldGUgZnJvbSBEaWN0aW9uYXJ5ICovCisjZGVmaW5lIFhLX0thbmFfTG9jawkJMHhGRjJEICAvKiBLYW5hIExvY2sgKi8KKyNkZWZpbmUgWEtfS2FuYV9TaGlmdAkJMHhGRjJFICAvKiBLYW5hIFNoaWZ0ICovCisjZGVmaW5lIFhLX0Vpc3VfU2hpZnQJCTB4RkYyRiAgLyogQWxwaGFudW1lcmljIFNoaWZ0ICovCisjZGVmaW5lIFhLX0Vpc3VfdG9nZ2xlCQkweEZGMzAgIC8qIEFscGhhbnVtZXJpYyB0b2dnbGUgKi8KKyNkZWZpbmUgWEtfS2FuamlfQmFuZ291CQkweEZGMzcgIC8qIENvZGVpbnB1dCAqLworI2RlZmluZSBYS19aZW5fS29obwkJMHhGRjNECS8qIE11bHRpcGxlL0FsbCBDYW5kaWRhdGUocykgKi8KKyNkZWZpbmUgWEtfTWFlX0tvaG8JCTB4RkYzRQkvKiBQcmV2aW91cyBDYW5kaWRhdGUgKi8KKworLyogMHhGRjMxIHRocnUgMHhGRjNGIGFyZSB1bmRlciBYS19LT1JFQU4gKi8KKworLyogQ3Vyc29yIGNvbnRyb2wgJiBtb3Rpb24gKi8KKworI2RlZmluZSBYS19Ib21lCQkJMHhGRjUwCisjZGVmaW5lIFhLX0xlZnQJCQkweEZGNTEJLyogTW92ZSBsZWZ0LCBsZWZ0IGFycm93ICovCisjZGVmaW5lIFhLX1VwCQkJMHhGRjUyCS8qIE1vdmUgdXAsIHVwIGFycm93ICovCisjZGVmaW5lIFhLX1JpZ2h0CQkweEZGNTMJLyogTW92ZSByaWdodCwgcmlnaHQgYXJyb3cgKi8KKyNkZWZpbmUgWEtfRG93bgkJCTB4RkY1NAkvKiBNb3ZlIGRvd24sIGRvd24gYXJyb3cgKi8KKyNkZWZpbmUgWEtfUHJpb3IJCTB4RkY1NQkvKiBQcmlvciwgcHJldmlvdXMgKi8KKyNkZWZpbmUgWEtfUGFnZV9VcAkJMHhGRjU1CisjZGVmaW5lIFhLX05leHQJCQkweEZGNTYJLyogTmV4dCAqLworI2RlZmluZSBYS19QYWdlX0Rvd24JCTB4RkY1NgorI2RlZmluZSBYS19FbmQJCQkweEZGNTcJLyogRU9MICovCisjZGVmaW5lIFhLX0JlZ2luCQkweEZGNTgJLyogQk9MICovCisKKworLyogTWlzYyBGdW5jdGlvbnMgKi8KKworI2RlZmluZSBYS19TZWxlY3QJCTB4RkY2MAkvKiBTZWxlY3QsIG1hcmsgKi8KKyNkZWZpbmUgWEtfUHJpbnQJCTB4RkY2MQorI2RlZmluZSBYS19FeGVjdXRlCQkweEZGNjIJLyogRXhlY3V0ZSwgcnVuLCBkbyAqLworI2RlZmluZSBYS19JbnNlcnQJCTB4RkY2MwkvKiBJbnNlcnQsIGluc2VydCBoZXJlICovCisjZGVmaW5lIFhLX1VuZG8JCQkweEZGNjUJLyogVW5kbywgb29wcyAqLworI2RlZmluZSBYS19SZWRvCQkJMHhGRjY2CS8qIHJlZG8sIGFnYWluICovCisjZGVmaW5lIFhLX01lbnUJCQkweEZGNjcKKyNkZWZpbmUgWEtfRmluZAkJCTB4RkY2OAkvKiBGaW5kLCBzZWFyY2ggKi8KKyNkZWZpbmUgWEtfQ2FuY2VsCQkweEZGNjkJLyogQ2FuY2VsLCBzdG9wLCBhYm9ydCwgZXhpdCAqLworI2RlZmluZSBYS19IZWxwCQkJMHhGRjZBCS8qIEhlbHAgKi8KKyNkZWZpbmUgWEtfQnJlYWsJCTB4RkY2QgorI2RlZmluZSBYS19Nb2RlX3N3aXRjaAkJMHhGRjdFCS8qIENoYXJhY3RlciBzZXQgc3dpdGNoICovCisjZGVmaW5lIFhLX3NjcmlwdF9zd2l0Y2ggICAgICAgIDB4RkY3RSAgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCisjZGVmaW5lIFhLX051bV9Mb2NrCQkweEZGN0YKKworLyogS2V5cGFkIEZ1bmN0aW9ucywga2V5cGFkIG51bWJlcnMgY2xldmVybHkgY2hvc2VuIHRvIG1hcCB0byBhc2NpaSAqLworCisjZGVmaW5lIFhLX0tQX1NwYWNlCQkweEZGODAJLyogc3BhY2UgKi8KKyNkZWZpbmUgWEtfS1BfVGFiCQkweEZGODkKKyNkZWZpbmUgWEtfS1BfRW50ZXIJCTB4RkY4RAkvKiBlbnRlciAqLworI2RlZmluZSBYS19LUF9GMQkJMHhGRjkxCS8qIFBGMSwgS1BfQSwgLi4uICovCisjZGVmaW5lIFhLX0tQX0YyCQkweEZGOTIKKyNkZWZpbmUgWEtfS1BfRjMJCTB4RkY5MworI2RlZmluZSBYS19LUF9GNAkJMHhGRjk0CisjZGVmaW5lIFhLX0tQX0hvbWUJCTB4RkY5NQorI2RlZmluZSBYS19LUF9MZWZ0CQkweEZGOTYKKyNkZWZpbmUgWEtfS1BfVXAJCTB4RkY5NworI2RlZmluZSBYS19LUF9SaWdodAkJMHhGRjk4CisjZGVmaW5lIFhLX0tQX0Rvd24JCTB4RkY5OQorI2RlZmluZSBYS19LUF9QcmlvcgkJMHhGRjlBCisjZGVmaW5lIFhLX0tQX1BhZ2VfVXAJCTB4RkY5QQorI2RlZmluZSBYS19LUF9OZXh0CQkweEZGOUIKKyNkZWZpbmUgWEtfS1BfUGFnZV9Eb3duCQkweEZGOUIKKyNkZWZpbmUgWEtfS1BfRW5kCQkweEZGOUMKKyNkZWZpbmUgWEtfS1BfQmVnaW4JCTB4RkY5RAorI2RlZmluZSBYS19LUF9JbnNlcnQJCTB4RkY5RQorI2RlZmluZSBYS19LUF9EZWxldGUJCTB4RkY5RgorI2RlZmluZSBYS19LUF9FcXVhbAkJMHhGRkJECS8qIGVxdWFscyAqLworI2RlZmluZSBYS19LUF9NdWx0aXBseQkJMHhGRkFBCisjZGVmaW5lIFhLX0tQX0FkZAkJMHhGRkFCCisjZGVmaW5lIFhLX0tQX1NlcGFyYXRvcgkJMHhGRkFDCS8qIHNlcGFyYXRvciwgb2Z0ZW4gY29tbWEgKi8KKyNkZWZpbmUgWEtfS1BfU3VidHJhY3QJCTB4RkZBRAorI2RlZmluZSBYS19LUF9EZWNpbWFsCQkweEZGQUUKKyNkZWZpbmUgWEtfS1BfRGl2aWRlCQkweEZGQUYKKworI2RlZmluZSBYS19LUF8wCQkJMHhGRkIwCisjZGVmaW5lIFhLX0tQXzEJCQkweEZGQjEKKyNkZWZpbmUgWEtfS1BfMgkJCTB4RkZCMgorI2RlZmluZSBYS19LUF8zCQkJMHhGRkIzCisjZGVmaW5lIFhLX0tQXzQJCQkweEZGQjQKKyNkZWZpbmUgWEtfS1BfNQkJCTB4RkZCNQorI2RlZmluZSBYS19LUF82CQkJMHhGRkI2CisjZGVmaW5lIFhLX0tQXzcJCQkweEZGQjcKKyNkZWZpbmUgWEtfS1BfOAkJCTB4RkZCOAorI2RlZmluZSBYS19LUF85CQkJMHhGRkI5CisKKworCisvKgorICogQXV4aWxsaWFyeSBGdW5jdGlvbnM7IG5vdGUgdGhlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBmb3IgbGVmdCBhbmQgcmlnaHQKKyAqIGZ1bmN0aW9uIGtleXM7ICBTdW4ga2V5Ym9hcmRzIGFuZCBhIGZldyBvdGhlciBtYW51ZmFjdHVyZXMgaGF2ZSBzdWNoCisgKiBmdW5jdGlvbiBrZXkgZ3JvdXBzIG9uIHRoZSBsZWZ0IGFuZC9vciByaWdodCBzaWRlcyBvZiB0aGUga2V5Ym9hcmQuCisgKiBXZSd2ZSBub3QgZm91bmQgYSBrZXlib2FyZCB3aXRoIG1vcmUgdGhhbiAzNSBmdW5jdGlvbiBrZXlzIHRvdGFsLgorICovCisKKyNkZWZpbmUgWEtfRjEJCQkweEZGQkUKKyNkZWZpbmUgWEtfRjIJCQkweEZGQkYKKyNkZWZpbmUgWEtfRjMJCQkweEZGQzAKKyNkZWZpbmUgWEtfRjQJCQkweEZGQzEKKyNkZWZpbmUgWEtfRjUJCQkweEZGQzIKKyNkZWZpbmUgWEtfRjYJCQkweEZGQzMKKyNkZWZpbmUgWEtfRjcJCQkweEZGQzQKKyNkZWZpbmUgWEtfRjgJCQkweEZGQzUKKyNkZWZpbmUgWEtfRjkJCQkweEZGQzYKKyNkZWZpbmUgWEtfRjEwCQkJMHhGRkM3CisjZGVmaW5lIFhLX0YxMQkJCTB4RkZDOAorI2RlZmluZSBYS19MMQkJCTB4RkZDOAorI2RlZmluZSBYS19GMTIJCQkweEZGQzkKKyNkZWZpbmUgWEtfTDIJCQkweEZGQzkKKyNkZWZpbmUgWEtfRjEzCQkJMHhGRkNBCisjZGVmaW5lIFhLX0wzCQkJMHhGRkNBCisjZGVmaW5lIFhLX0YxNAkJCTB4RkZDQgorI2RlZmluZSBYS19MNAkJCTB4RkZDQgorI2RlZmluZSBYS19GMTUJCQkweEZGQ0MKKyNkZWZpbmUgWEtfTDUJCQkweEZGQ0MKKyNkZWZpbmUgWEtfRjE2CQkJMHhGRkNECisjZGVmaW5lIFhLX0w2CQkJMHhGRkNECisjZGVmaW5lIFhLX0YxNwkJCTB4RkZDRQorI2RlZmluZSBYS19MNwkJCTB4RkZDRQorI2RlZmluZSBYS19GMTgJCQkweEZGQ0YKKyNkZWZpbmUgWEtfTDgJCQkweEZGQ0YKKyNkZWZpbmUgWEtfRjE5CQkJMHhGRkQwCisjZGVmaW5lIFhLX0w5CQkJMHhGRkQwCisjZGVmaW5lIFhLX0YyMAkJCTB4RkZEMQorI2RlZmluZSBYS19MMTAJCQkweEZGRDEKKyNkZWZpbmUgWEtfRjIxCQkJMHhGRkQyCisjZGVmaW5lIFhLX1IxCQkJMHhGRkQyCisjZGVmaW5lIFhLX0YyMgkJCTB4RkZEMworI2RlZmluZSBYS19SMgkJCTB4RkZEMworI2RlZmluZSBYS19GMjMJCQkweEZGRDQKKyNkZWZpbmUgWEtfUjMJCQkweEZGRDQKKyNkZWZpbmUgWEtfRjI0CQkJMHhGRkQ1CisjZGVmaW5lIFhLX1I0CQkJMHhGRkQ1CisjZGVmaW5lIFhLX0YyNQkJCTB4RkZENgorI2RlZmluZSBYS19SNQkJCTB4RkZENgorI2RlZmluZSBYS19GMjYJCQkweEZGRDcKKyNkZWZpbmUgWEtfUjYJCQkweEZGRDcKKyNkZWZpbmUgWEtfRjI3CQkJMHhGRkQ4CisjZGVmaW5lIFhLX1I3CQkJMHhGRkQ4CisjZGVmaW5lIFhLX0YyOAkJCTB4RkZEOQorI2RlZmluZSBYS19SOAkJCTB4RkZEOQorI2RlZmluZSBYS19GMjkJCQkweEZGREEKKyNkZWZpbmUgWEtfUjkJCQkweEZGREEKKyNkZWZpbmUgWEtfRjMwCQkJMHhGRkRCCisjZGVmaW5lIFhLX1IxMAkJCTB4RkZEQgorI2RlZmluZSBYS19GMzEJCQkweEZGREMKKyNkZWZpbmUgWEtfUjExCQkJMHhGRkRDCisjZGVmaW5lIFhLX0YzMgkJCTB4RkZERAorI2RlZmluZSBYS19SMTIJCQkweEZGREQKKyNkZWZpbmUgWEtfRjMzCQkJMHhGRkRFCisjZGVmaW5lIFhLX1IxMwkJCTB4RkZERQorI2RlZmluZSBYS19GMzQJCQkweEZGREYKKyNkZWZpbmUgWEtfUjE0CQkJMHhGRkRGCisjZGVmaW5lIFhLX0YzNQkJCTB4RkZFMAorI2RlZmluZSBYS19SMTUJCQkweEZGRTAKKworLyogTW9kaWZpZXJzICovCisKKyNkZWZpbmUgWEtfU2hpZnRfTAkJMHhGRkUxCS8qIExlZnQgc2hpZnQgKi8KKyNkZWZpbmUgWEtfU2hpZnRfUgkJMHhGRkUyCS8qIFJpZ2h0IHNoaWZ0ICovCisjZGVmaW5lIFhLX0NvbnRyb2xfTAkJMHhGRkUzCS8qIExlZnQgY29udHJvbCAqLworI2RlZmluZSBYS19Db250cm9sX1IJCTB4RkZFNAkvKiBSaWdodCBjb250cm9sICovCisjZGVmaW5lIFhLX0NhcHNfTG9jawkJMHhGRkU1CS8qIENhcHMgbG9jayAqLworI2RlZmluZSBYS19TaGlmdF9Mb2NrCQkweEZGRTYJLyogU2hpZnQgbG9jayAqLworCisjZGVmaW5lIFhLX01ldGFfTAkJMHhGRkU3CS8qIExlZnQgbWV0YSAqLworI2RlZmluZSBYS19NZXRhX1IJCTB4RkZFOAkvKiBSaWdodCBtZXRhICovCisjZGVmaW5lIFhLX0FsdF9MCQkweEZGRTkJLyogTGVmdCBhbHQgKi8KKyNkZWZpbmUgWEtfQWx0X1IJCTB4RkZFQQkvKiBSaWdodCBhbHQgKi8KKyNkZWZpbmUgWEtfU3VwZXJfTAkJMHhGRkVCCS8qIExlZnQgc3VwZXIgKi8KKyNkZWZpbmUgWEtfU3VwZXJfUgkJMHhGRkVDCS8qIFJpZ2h0IHN1cGVyICovCisjZGVmaW5lIFhLX0h5cGVyX0wJCTB4RkZFRAkvKiBMZWZ0IGh5cGVyICovCisjZGVmaW5lIFhLX0h5cGVyX1IJCTB4RkZFRQkvKiBSaWdodCBoeXBlciAqLworI2VuZGlmIC8qIFhLX01JU0NFTExBTlkgKi8KKworLyoKKyAqIElTTyA5OTk1IEZ1bmN0aW9uIGFuZCBNb2RpZmllciBLZXlzCisgKiBCeXRlIDMgPSAweEZFCisgKi8KKworI2lmZGVmIFhLX1hLQl9LRVlTCisjZGVmaW5lCVhLX0lTT19Mb2NrCQkJCQkweEZFMDEKKyNkZWZpbmUJWEtfSVNPX0xldmVsMl9MYXRjaAkJCQkweEZFMDIKKyNkZWZpbmUJWEtfSVNPX0xldmVsM19TaGlmdAkJCQkweEZFMDMKKyNkZWZpbmUJWEtfSVNPX0xldmVsM19MYXRjaAkJCQkweEZFMDQKKyNkZWZpbmUJWEtfSVNPX0xldmVsM19Mb2NrCQkJCTB4RkUwNQorI2RlZmluZQlYS19JU09fR3JvdXBfU2hpZnQJCTB4RkY3RQkvKiBBbGlhcyBmb3IgbW9kZV9zd2l0Y2ggKi8KKyNkZWZpbmUJWEtfSVNPX0dyb3VwX0xhdGNoCQkJCTB4RkUwNgorI2RlZmluZQlYS19JU09fR3JvdXBfTG9jawkJCQkweEZFMDcKKyNkZWZpbmUJWEtfSVNPX05leHRfR3JvdXAJCQkJMHhGRTA4CisjZGVmaW5lCVhLX0lTT19OZXh0X0dyb3VwX0xvY2sJCQkJMHhGRTA5CisjZGVmaW5lCVhLX0lTT19QcmV2X0dyb3VwCQkJCTB4RkUwQQorI2RlZmluZQlYS19JU09fUHJldl9Hcm91cF9Mb2NrCQkJCTB4RkUwQgorI2RlZmluZQlYS19JU09fRmlyc3RfR3JvdXAJCQkJMHhGRTBDCisjZGVmaW5lCVhLX0lTT19GaXJzdF9Hcm91cF9Mb2NrCQkJCTB4RkUwRAorI2RlZmluZQlYS19JU09fTGFzdF9Hcm91cAkJCQkweEZFMEUKKyNkZWZpbmUJWEtfSVNPX0xhc3RfR3JvdXBfTG9jawkJCQkweEZFMEYKKworI2RlZmluZQlYS19JU09fTGVmdF9UYWIJCQkJCTB4RkUyMAorI2RlZmluZQlYS19JU09fTW92ZV9MaW5lX1VwCQkJCTB4RkUyMQorI2RlZmluZQlYS19JU09fTW92ZV9MaW5lX0Rvd24JCQkJMHhGRTIyCisjZGVmaW5lCVhLX0lTT19QYXJ0aWFsX0xpbmVfVXAJCQkJMHhGRTIzCisjZGVmaW5lCVhLX0lTT19QYXJ0aWFsX0xpbmVfRG93bgkJCTB4RkUyNAorI2RlZmluZQlYS19JU09fUGFydGlhbF9TcGFjZV9MZWZ0CQkJMHhGRTI1CisjZGVmaW5lCVhLX0lTT19QYXJ0aWFsX1NwYWNlX1JpZ2h0CQkJMHhGRTI2CisjZGVmaW5lCVhLX0lTT19TZXRfTWFyZ2luX0xlZnQJCQkJMHhGRTI3CisjZGVmaW5lCVhLX0lTT19TZXRfTWFyZ2luX1JpZ2h0CQkJCTB4RkUyOAorI2RlZmluZQlYS19JU09fUmVsZWFzZV9NYXJnaW5fTGVmdAkJCTB4RkUyOQorI2RlZmluZQlYS19JU09fUmVsZWFzZV9NYXJnaW5fUmlnaHQJCQkweEZFMkEKKyNkZWZpbmUJWEtfSVNPX1JlbGVhc2VfQm90aF9NYXJnaW5zCQkJMHhGRTJCCisjZGVmaW5lCVhLX0lTT19GYXN0X0N1cnNvcl9MZWZ0CQkJCTB4RkUyQworI2RlZmluZQlYS19JU09fRmFzdF9DdXJzb3JfUmlnaHQJCQkweEZFMkQKKyNkZWZpbmUJWEtfSVNPX0Zhc3RfQ3Vyc29yX1VwCQkJCTB4RkUyRQorI2RlZmluZQlYS19JU09fRmFzdF9DdXJzb3JfRG93bgkJCQkweEZFMkYKKyNkZWZpbmUJWEtfSVNPX0NvbnRpbnVvdXNfVW5kZXJsaW5lCQkJMHhGRTMwCisjZGVmaW5lCVhLX0lTT19EaXNjb250aW51b3VzX1VuZGVybGluZQkJCTB4RkUzMQorI2RlZmluZQlYS19JU09fRW1waGFzaXplCQkJCTB4RkUzMgorI2RlZmluZQlYS19JU09fQ2VudGVyX09iamVjdAkJCQkweEZFMzMKKyNkZWZpbmUJWEtfSVNPX0VudGVyCQkJCQkweEZFMzQKKworI2RlZmluZQlYS19kZWFkX2dyYXZlCQkJCQkweEZFNTAKKyNkZWZpbmUJWEtfZGVhZF9hY3V0ZQkJCQkJMHhGRTUxCisjZGVmaW5lCVhLX2RlYWRfY2lyY3VtZmxleAkJCQkweEZFNTIKKyNkZWZpbmUJWEtfZGVhZF90aWxkZQkJCQkJMHhGRTUzCisjZGVmaW5lCVhLX2RlYWRfbWFjcm9uCQkJCQkweEZFNTQKKyNkZWZpbmUJWEtfZGVhZF9icmV2ZQkJCQkJMHhGRTU1CisjZGVmaW5lCVhLX2RlYWRfYWJvdmVkb3QJCQkJMHhGRTU2CisjZGVmaW5lCVhLX2RlYWRfZGlhZXJlc2lzCQkJCTB4RkU1NworI2RlZmluZQlYS19kZWFkX2Fib3ZlcmluZwkJCQkweEZFNTgKKyNkZWZpbmUJWEtfZGVhZF9kb3VibGVhY3V0ZQkJCQkweEZFNTkKKyNkZWZpbmUJWEtfZGVhZF9jYXJvbgkJCQkJMHhGRTVBCisjZGVmaW5lCVhLX2RlYWRfY2VkaWxsYQkJCQkJMHhGRTVCCisjZGVmaW5lCVhLX2RlYWRfb2dvbmVrCQkJCQkweEZFNUMKKyNkZWZpbmUJWEtfZGVhZF9pb3RhCQkJCQkweEZFNUQKKyNkZWZpbmUJWEtfZGVhZF92b2ljZWRfc291bmQJCQkJMHhGRTVFCisjZGVmaW5lCVhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZAkJCTB4RkU1RgorI2RlZmluZQlYS19kZWFkX2JlbG93ZG90CQkJCTB4RkU2MAorCisjZGVmaW5lCVhLX0ZpcnN0X1ZpcnR1YWxfU2NyZWVuCQkJCTB4RkVEMAorI2RlZmluZQlYS19QcmV2X1ZpcnR1YWxfU2NyZWVuCQkJCTB4RkVEMQorI2RlZmluZQlYS19OZXh0X1ZpcnR1YWxfU2NyZWVuCQkJCTB4RkVEMgorI2RlZmluZQlYS19MYXN0X1ZpcnR1YWxfU2NyZWVuCQkJCTB4RkVENAorI2RlZmluZQlYS19UZXJtaW5hdGVfU2VydmVyCQkJCTB4RkVENQorCisjZGVmaW5lCVhLX0FjY2Vzc1hfRW5hYmxlCQkJCTB4RkU3MAorI2RlZmluZQlYS19BY2Nlc3NYX0ZlZWRiYWNrX0VuYWJsZQkJCTB4RkU3MQorI2RlZmluZQlYS19SZXBlYXRLZXlzX0VuYWJsZQkJCQkweEZFNzIKKyNkZWZpbmUJWEtfU2xvd0tleXNfRW5hYmxlCQkJCTB4RkU3MworI2RlZmluZQlYS19Cb3VuY2VLZXlzX0VuYWJsZQkJCQkweEZFNzQKKyNkZWZpbmUJWEtfU3RpY2t5S2V5c19FbmFibGUJCQkJMHhGRTc1CisjZGVmaW5lCVhLX01vdXNlS2V5c19FbmFibGUJCQkJMHhGRTc2CisjZGVmaW5lCVhLX01vdXNlS2V5c19BY2NlbF9FbmFibGUJCQkweEZFNzcKKyNkZWZpbmUJWEtfT3ZlcmxheTFfRW5hYmxlCQkJCTB4RkU3OAorI2RlZmluZQlYS19PdmVybGF5Ml9FbmFibGUJCQkJMHhGRTc5CisjZGVmaW5lCVhLX0F1ZGlibGVCZWxsX0VuYWJsZQkJCQkweEZFN0EKKworI2RlZmluZQlYS19Qb2ludGVyX0xlZnQJCQkJCTB4RkVFMAorI2RlZmluZQlYS19Qb2ludGVyX1JpZ2h0CQkJCTB4RkVFMQorI2RlZmluZQlYS19Qb2ludGVyX1VwCQkJCQkweEZFRTIKKyNkZWZpbmUJWEtfUG9pbnRlcl9Eb3duCQkJCQkweEZFRTMKKyNkZWZpbmUJWEtfUG9pbnRlcl9VcExlZnQJCQkJMHhGRUU0CisjZGVmaW5lCVhLX1BvaW50ZXJfVXBSaWdodAkJCQkweEZFRTUKKyNkZWZpbmUJWEtfUG9pbnRlcl9Eb3duTGVmdAkJCQkweEZFRTYKKyNkZWZpbmUJWEtfUG9pbnRlcl9Eb3duUmlnaHQJCQkJMHhGRUU3CisjZGVmaW5lCVhLX1BvaW50ZXJfQnV0dG9uX0RmbHQJCQkJMHhGRUU4CisjZGVmaW5lCVhLX1BvaW50ZXJfQnV0dG9uMQkJCQkweEZFRTkKKyNkZWZpbmUJWEtfUG9pbnRlcl9CdXR0b24yCQkJCTB4RkVFQQorI2RlZmluZQlYS19Qb2ludGVyX0J1dHRvbjMJCQkJMHhGRUVCCisjZGVmaW5lCVhLX1BvaW50ZXJfQnV0dG9uNAkJCQkweEZFRUMKKyNkZWZpbmUJWEtfUG9pbnRlcl9CdXR0b241CQkJCTB4RkVFRAorI2RlZmluZQlYS19Qb2ludGVyX0RibENsaWNrX0RmbHQJCQkweEZFRUUKKyNkZWZpbmUJWEtfUG9pbnRlcl9EYmxDbGljazEJCQkJMHhGRUVGCisjZGVmaW5lCVhLX1BvaW50ZXJfRGJsQ2xpY2syCQkJCTB4RkVGMAorI2RlZmluZQlYS19Qb2ludGVyX0RibENsaWNrMwkJCQkweEZFRjEKKyNkZWZpbmUJWEtfUG9pbnRlcl9EYmxDbGljazQJCQkJMHhGRUYyCisjZGVmaW5lCVhLX1BvaW50ZXJfRGJsQ2xpY2s1CQkJCTB4RkVGMworI2RlZmluZQlYS19Qb2ludGVyX0RyYWdfRGZsdAkJCQkweEZFRjQKKyNkZWZpbmUJWEtfUG9pbnRlcl9EcmFnMQkJCQkweEZFRjUKKyNkZWZpbmUJWEtfUG9pbnRlcl9EcmFnMgkJCQkweEZFRjYKKyNkZWZpbmUJWEtfUG9pbnRlcl9EcmFnMwkJCQkweEZFRjcKKyNkZWZpbmUJWEtfUG9pbnRlcl9EcmFnNAkJCQkweEZFRjgKKyNkZWZpbmUJWEtfUG9pbnRlcl9EcmFnNQkJCQkweEZFRkQKKworI2RlZmluZQlYS19Qb2ludGVyX0VuYWJsZUtleXMJCQkJMHhGRUY5CisjZGVmaW5lCVhLX1BvaW50ZXJfQWNjZWxlcmF0ZQkJCQkweEZFRkEKKyNkZWZpbmUJWEtfUG9pbnRlcl9EZmx0QnRuTmV4dAkJCQkweEZFRkIKKyNkZWZpbmUJWEtfUG9pbnRlcl9EZmx0QnRuUHJldgkJCQkweEZFRkMKKworI2VuZGlmCisKKy8qCisgKiAzMjcwIFRlcm1pbmFsIEtleXMKKyAqIEJ5dGUgMyA9IDB4RkQKKyAqLworCisjaWZkZWYgWEtfMzI3MAorI2RlZmluZSBYS18zMjcwX0R1cGxpY2F0ZSAgICAgIDB4RkQwMQorI2RlZmluZSBYS18zMjcwX0ZpZWxkTWFyayAgICAgIDB4RkQwMgorI2RlZmluZSBYS18zMjcwX1JpZ2h0MiAgICAgICAgIDB4RkQwMworI2RlZmluZSBYS18zMjcwX0xlZnQyICAgICAgICAgIDB4RkQwNAorI2RlZmluZSBYS18zMjcwX0JhY2tUYWIgICAgICAgIDB4RkQwNQorI2RlZmluZSBYS18zMjcwX0VyYXNlRU9GICAgICAgIDB4RkQwNgorI2RlZmluZSBYS18zMjcwX0VyYXNlSW5wdXQgICAgIDB4RkQwNworI2RlZmluZSBYS18zMjcwX1Jlc2V0ICAgICAgICAgIDB4RkQwOAorI2RlZmluZSBYS18zMjcwX1F1aXQgICAgICAgICAgIDB4RkQwOQorI2RlZmluZSBYS18zMjcwX1BBMSAgICAgICAgICAgIDB4RkQwQQorI2RlZmluZSBYS18zMjcwX1BBMiAgICAgICAgICAgIDB4RkQwQgorI2RlZmluZSBYS18zMjcwX1BBMyAgICAgICAgICAgIDB4RkQwQworI2RlZmluZSBYS18zMjcwX1Rlc3QgICAgICAgICAgIDB4RkQwRAorI2RlZmluZSBYS18zMjcwX0F0dG4gICAgICAgICAgIDB4RkQwRQorI2RlZmluZSBYS18zMjcwX0N1cnNvckJsaW5rICAgIDB4RkQwRgorI2RlZmluZSBYS18zMjcwX0FsdEN1cnNvciAgICAgIDB4RkQxMAorI2RlZmluZSBYS18zMjcwX0tleUNsaWNrICAgICAgIDB4RkQxMQorI2RlZmluZSBYS18zMjcwX0p1bXAgICAgICAgICAgIDB4RkQxMgorI2RlZmluZSBYS18zMjcwX0lkZW50ICAgICAgICAgIDB4RkQxMworI2RlZmluZSBYS18zMjcwX1J1bGUgICAgICAgICAgIDB4RkQxNAorI2RlZmluZSBYS18zMjcwX0NvcHkgICAgICAgICAgIDB4RkQxNQorI2RlZmluZSBYS18zMjcwX1BsYXkgICAgICAgICAgIDB4RkQxNgorI2RlZmluZSBYS18zMjcwX1NldHVwICAgICAgICAgIDB4RkQxNworI2RlZmluZSBYS18zMjcwX1JlY29yZCAgICAgICAgIDB4RkQxOAorI2RlZmluZSBYS18zMjcwX0NoYW5nZVNjcmVlbiAgIDB4RkQxOQorI2RlZmluZSBYS18zMjcwX0RlbGV0ZVdvcmQgICAgIDB4RkQxQQorI2RlZmluZSBYS18zMjcwX0V4U2VsZWN0ICAgICAgIDB4RkQxQgorI2RlZmluZSBYS18zMjcwX0N1cnNvclNlbGVjdCAgIDB4RkQxQworI2RlZmluZSBYS18zMjcwX1ByaW50U2NyZWVuICAgIDB4RkQxRAorI2RlZmluZSBYS18zMjcwX0VudGVyICAgICAgICAgIDB4RkQxRQorI2VuZGlmCisKKy8qCisgKiAgTGF0aW4gMQorICogIEJ5dGUgMyA9IDAKKyAqLworI2lmZGVmIFhLX0xBVElOMQorI2RlZmluZSBYS19zcGFjZSAgICAgICAgICAgICAgIDB4MDIwCisjZGVmaW5lIFhLX2V4Y2xhbSAgICAgICAgICAgICAgMHgwMjEKKyNkZWZpbmUgWEtfcXVvdGVkYmwgICAgICAgICAgICAweDAyMgorI2RlZmluZSBYS19udW1iZXJzaWduICAgICAgICAgIDB4MDIzCisjZGVmaW5lIFhLX2RvbGxhciAgICAgICAgICAgICAgMHgwMjQKKyNkZWZpbmUgWEtfcGVyY2VudCAgICAgICAgICAgICAweDAyNQorI2RlZmluZSBYS19hbXBlcnNhbmQgICAgICAgICAgIDB4MDI2CisjZGVmaW5lIFhLX2Fwb3N0cm9waGUgICAgICAgICAgMHgwMjcKKyNkZWZpbmUgWEtfcXVvdGVyaWdodCAgICAgICAgICAweDAyNwkvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX3BhcmVubGVmdCAgICAgICAgICAgMHgwMjgKKyNkZWZpbmUgWEtfcGFyZW5yaWdodCAgICAgICAgICAweDAyOQorI2RlZmluZSBYS19hc3RlcmlzayAgICAgICAgICAgIDB4MDJhCisjZGVmaW5lIFhLX3BsdXMgICAgICAgICAgICAgICAgMHgwMmIKKyNkZWZpbmUgWEtfY29tbWEgICAgICAgICAgICAgICAweDAyYworI2RlZmluZSBYS19taW51cyAgICAgICAgICAgICAgIDB4MDJkCisjZGVmaW5lIFhLX3BlcmlvZCAgICAgICAgICAgICAgMHgwMmUKKyNkZWZpbmUgWEtfc2xhc2ggICAgICAgICAgICAgICAweDAyZgorI2RlZmluZSBYS18wICAgICAgICAgICAgICAgICAgIDB4MDMwCisjZGVmaW5lIFhLXzEgICAgICAgICAgICAgICAgICAgMHgwMzEKKyNkZWZpbmUgWEtfMiAgICAgICAgICAgICAgICAgICAweDAzMgorI2RlZmluZSBYS18zICAgICAgICAgICAgICAgICAgIDB4MDMzCisjZGVmaW5lIFhLXzQgICAgICAgICAgICAgICAgICAgMHgwMzQKKyNkZWZpbmUgWEtfNSAgICAgICAgICAgICAgICAgICAweDAzNQorI2RlZmluZSBYS182ICAgICAgICAgICAgICAgICAgIDB4MDM2CisjZGVmaW5lIFhLXzcgICAgICAgICAgICAgICAgICAgMHgwMzcKKyNkZWZpbmUgWEtfOCAgICAgICAgICAgICAgICAgICAweDAzOAorI2RlZmluZSBYS185ICAgICAgICAgICAgICAgICAgIDB4MDM5CisjZGVmaW5lIFhLX2NvbG9uICAgICAgICAgICAgICAgMHgwM2EKKyNkZWZpbmUgWEtfc2VtaWNvbG9uICAgICAgICAgICAweDAzYgorI2RlZmluZSBYS19sZXNzICAgICAgICAgICAgICAgIDB4MDNjCisjZGVmaW5lIFhLX2VxdWFsICAgICAgICAgICAgICAgMHgwM2QKKyNkZWZpbmUgWEtfZ3JlYXRlciAgICAgICAgICAgICAweDAzZQorI2RlZmluZSBYS19xdWVzdGlvbiAgICAgICAgICAgIDB4MDNmCisjZGVmaW5lIFhLX2F0ICAgICAgICAgICAgICAgICAgMHgwNDAKKyNkZWZpbmUgWEtfQSAgICAgICAgICAgICAgICAgICAweDA0MQorI2RlZmluZSBYS19CICAgICAgICAgICAgICAgICAgIDB4MDQyCisjZGVmaW5lIFhLX0MgICAgICAgICAgICAgICAgICAgMHgwNDMKKyNkZWZpbmUgWEtfRCAgICAgICAgICAgICAgICAgICAweDA0NAorI2RlZmluZSBYS19FICAgICAgICAgICAgICAgICAgIDB4MDQ1CisjZGVmaW5lIFhLX0YgICAgICAgICAgICAgICAgICAgMHgwNDYKKyNkZWZpbmUgWEtfRyAgICAgICAgICAgICAgICAgICAweDA0NworI2RlZmluZSBYS19IICAgICAgICAgICAgICAgICAgIDB4MDQ4CisjZGVmaW5lIFhLX0kgICAgICAgICAgICAgICAgICAgMHgwNDkKKyNkZWZpbmUgWEtfSiAgICAgICAgICAgICAgICAgICAweDA0YQorI2RlZmluZSBYS19LICAgICAgICAgICAgICAgICAgIDB4MDRiCisjZGVmaW5lIFhLX0wgICAgICAgICAgICAgICAgICAgMHgwNGMKKyNkZWZpbmUgWEtfTSAgICAgICAgICAgICAgICAgICAweDA0ZAorI2RlZmluZSBYS19OICAgICAgICAgICAgICAgICAgIDB4MDRlCisjZGVmaW5lIFhLX08gICAgICAgICAgICAgICAgICAgMHgwNGYKKyNkZWZpbmUgWEtfUCAgICAgICAgICAgICAgICAgICAweDA1MAorI2RlZmluZSBYS19RICAgICAgICAgICAgICAgICAgIDB4MDUxCisjZGVmaW5lIFhLX1IgICAgICAgICAgICAgICAgICAgMHgwNTIKKyNkZWZpbmUgWEtfUyAgICAgICAgICAgICAgICAgICAweDA1MworI2RlZmluZSBYS19UICAgICAgICAgICAgICAgICAgIDB4MDU0CisjZGVmaW5lIFhLX1UgICAgICAgICAgICAgICAgICAgMHgwNTUKKyNkZWZpbmUgWEtfViAgICAgICAgICAgICAgICAgICAweDA1NgorI2RlZmluZSBYS19XICAgICAgICAgICAgICAgICAgIDB4MDU3CisjZGVmaW5lIFhLX1ggICAgICAgICAgICAgICAgICAgMHgwNTgKKyNkZWZpbmUgWEtfWSAgICAgICAgICAgICAgICAgICAweDA1OQorI2RlZmluZSBYS19aICAgICAgICAgICAgICAgICAgIDB4MDVhCisjZGVmaW5lIFhLX2JyYWNrZXRsZWZ0ICAgICAgICAgMHgwNWIKKyNkZWZpbmUgWEtfYmFja3NsYXNoICAgICAgICAgICAweDA1YworI2RlZmluZSBYS19icmFja2V0cmlnaHQgICAgICAgIDB4MDVkCisjZGVmaW5lIFhLX2FzY2lpY2lyY3VtICAgICAgICAgMHgwNWUKKyNkZWZpbmUgWEtfdW5kZXJzY29yZSAgICAgICAgICAweDA1ZgorI2RlZmluZSBYS19ncmF2ZSAgICAgICAgICAgICAgIDB4MDYwCisjZGVmaW5lIFhLX3F1b3RlbGVmdCAgICAgICAgICAgMHgwNjAJLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19hICAgICAgICAgICAgICAgICAgIDB4MDYxCisjZGVmaW5lIFhLX2IgICAgICAgICAgICAgICAgICAgMHgwNjIKKyNkZWZpbmUgWEtfYyAgICAgICAgICAgICAgICAgICAweDA2MworI2RlZmluZSBYS19kICAgICAgICAgICAgICAgICAgIDB4MDY0CisjZGVmaW5lIFhLX2UgICAgICAgICAgICAgICAgICAgMHgwNjUKKyNkZWZpbmUgWEtfZiAgICAgICAgICAgICAgICAgICAweDA2NgorI2RlZmluZSBYS19nICAgICAgICAgICAgICAgICAgIDB4MDY3CisjZGVmaW5lIFhLX2ggICAgICAgICAgICAgICAgICAgMHgwNjgKKyNkZWZpbmUgWEtfaSAgICAgICAgICAgICAgICAgICAweDA2OQorI2RlZmluZSBYS19qICAgICAgICAgICAgICAgICAgIDB4MDZhCisjZGVmaW5lIFhLX2sgICAgICAgICAgICAgICAgICAgMHgwNmIKKyNkZWZpbmUgWEtfbCAgICAgICAgICAgICAgICAgICAweDA2YworI2RlZmluZSBYS19tICAgICAgICAgICAgICAgICAgIDB4MDZkCisjZGVmaW5lIFhLX24gICAgICAgICAgICAgICAgICAgMHgwNmUKKyNkZWZpbmUgWEtfbyAgICAgICAgICAgICAgICAgICAweDA2ZgorI2RlZmluZSBYS19wICAgICAgICAgICAgICAgICAgIDB4MDcwCisjZGVmaW5lIFhLX3EgICAgICAgICAgICAgICAgICAgMHgwNzEKKyNkZWZpbmUgWEtfciAgICAgICAgICAgICAgICAgICAweDA3MgorI2RlZmluZSBYS19zICAgICAgICAgICAgICAgICAgIDB4MDczCisjZGVmaW5lIFhLX3QgICAgICAgICAgICAgICAgICAgMHgwNzQKKyNkZWZpbmUgWEtfdSAgICAgICAgICAgICAgICAgICAweDA3NQorI2RlZmluZSBYS192ICAgICAgICAgICAgICAgICAgIDB4MDc2CisjZGVmaW5lIFhLX3cgICAgICAgICAgICAgICAgICAgMHgwNzcKKyNkZWZpbmUgWEtfeCAgICAgICAgICAgICAgICAgICAweDA3OAorI2RlZmluZSBYS195ICAgICAgICAgICAgICAgICAgIDB4MDc5CisjZGVmaW5lIFhLX3ogICAgICAgICAgICAgICAgICAgMHgwN2EKKyNkZWZpbmUgWEtfYnJhY2VsZWZ0ICAgICAgICAgICAweDA3YgorI2RlZmluZSBYS19iYXIgICAgICAgICAgICAgICAgIDB4MDdjCisjZGVmaW5lIFhLX2JyYWNlcmlnaHQgICAgICAgICAgMHgwN2QKKyNkZWZpbmUgWEtfYXNjaWl0aWxkZSAgICAgICAgICAweDA3ZQorCisjZGVmaW5lIFhLX25vYnJlYWtzcGFjZSAgICAgICAgMHgwYTAKKyNkZWZpbmUgWEtfZXhjbGFtZG93biAgICAgICAgICAweDBhMQorI2RlZmluZSBYS19jZW50ICAgICAgICAJICAgICAgIDB4MGEyCisjZGVmaW5lIFhLX3N0ZXJsaW5nICAgICAgICAgICAgMHgwYTMKKyNkZWZpbmUgWEtfY3VycmVuY3kgICAgICAgICAgICAweDBhNAorI2RlZmluZSBYS195ZW4gICAgICAgICAgICAgICAgIDB4MGE1CisjZGVmaW5lIFhLX2Jyb2tlbmJhciAgICAgICAgICAgMHgwYTYKKyNkZWZpbmUgWEtfc2VjdGlvbiAgICAgICAgICAgICAweDBhNworI2RlZmluZSBYS19kaWFlcmVzaXMgICAgICAgICAgIDB4MGE4CisjZGVmaW5lIFhLX2NvcHlyaWdodCAgICAgICAgICAgMHgwYTkKKyNkZWZpbmUgWEtfb3JkZmVtaW5pbmUgICAgICAgICAweDBhYQorI2RlZmluZSBYS19ndWlsbGVtb3RsZWZ0ICAgICAgIDB4MGFiCS8qIGxlZnQgYW5nbGUgcXVvdGF0aW9uIG1hcmsgKi8KKyNkZWZpbmUgWEtfbm90c2lnbiAgICAgICAgICAgICAweDBhYworI2RlZmluZSBYS19oeXBoZW4gICAgICAgICAgICAgIDB4MGFkCisjZGVmaW5lIFhLX3JlZ2lzdGVyZWQgICAgICAgICAgMHgwYWUKKyNkZWZpbmUgWEtfbWFjcm9uICAgICAgICAgICAgICAweDBhZgorI2RlZmluZSBYS19kZWdyZWUgICAgICAgICAgICAgIDB4MGIwCisjZGVmaW5lIFhLX3BsdXNtaW51cyAgICAgICAgICAgMHgwYjEKKyNkZWZpbmUgWEtfdHdvc3VwZXJpb3IgICAgICAgICAweDBiMgorI2RlZmluZSBYS190aHJlZXN1cGVyaW9yICAgICAgIDB4MGIzCisjZGVmaW5lIFhLX2FjdXRlICAgICAgICAgICAgICAgMHgwYjQKKyNkZWZpbmUgWEtfbXUgICAgICAgICAgICAgICAgICAweDBiNQorI2RlZmluZSBYS19wYXJhZ3JhcGggICAgICAgICAgIDB4MGI2CisjZGVmaW5lIFhLX3BlcmlvZGNlbnRlcmVkICAgICAgMHgwYjcKKyNkZWZpbmUgWEtfY2VkaWxsYSAgICAgICAgICAgICAweDBiOAorI2RlZmluZSBYS19vbmVzdXBlcmlvciAgICAgICAgIDB4MGI5CisjZGVmaW5lIFhLX21hc2N1bGluZSAgICAgICAgICAgMHgwYmEKKyNkZWZpbmUgWEtfZ3VpbGxlbW90cmlnaHQgICAgICAweDBiYgkvKiByaWdodCBhbmdsZSBxdW90YXRpb24gbWFyayAqLworI2RlZmluZSBYS19vbmVxdWFydGVyICAgICAgICAgIDB4MGJjCisjZGVmaW5lIFhLX29uZWhhbGYgICAgICAgICAgICAgMHgwYmQKKyNkZWZpbmUgWEtfdGhyZWVxdWFydGVycyAgICAgICAweDBiZQorI2RlZmluZSBYS19xdWVzdGlvbmRvd24gICAgICAgIDB4MGJmCisjZGVmaW5lIFhLX0FncmF2ZSAgICAgICAgICAgICAgMHgwYzAKKyNkZWZpbmUgWEtfQWFjdXRlICAgICAgICAgICAgICAweDBjMQorI2RlZmluZSBYS19BY2lyY3VtZmxleCAgICAgICAgIDB4MGMyCisjZGVmaW5lIFhLX0F0aWxkZSAgICAgICAgICAgICAgMHgwYzMKKyNkZWZpbmUgWEtfQWRpYWVyZXNpcyAgICAgICAgICAweDBjNAorI2RlZmluZSBYS19BcmluZyAgICAgICAgICAgICAgIDB4MGM1CisjZGVmaW5lIFhLX0FFICAgICAgICAgICAgICAgICAgMHgwYzYKKyNkZWZpbmUgWEtfQ2NlZGlsbGEgICAgICAgICAgICAweDBjNworI2RlZmluZSBYS19FZ3JhdmUgICAgICAgICAgICAgIDB4MGM4CisjZGVmaW5lIFhLX0VhY3V0ZSAgICAgICAgICAgICAgMHgwYzkKKyNkZWZpbmUgWEtfRWNpcmN1bWZsZXggICAgICAgICAweDBjYQorI2RlZmluZSBYS19FZGlhZXJlc2lzICAgICAgICAgIDB4MGNiCisjZGVmaW5lIFhLX0lncmF2ZSAgICAgICAgICAgICAgMHgwY2MKKyNkZWZpbmUgWEtfSWFjdXRlICAgICAgICAgICAgICAweDBjZAorI2RlZmluZSBYS19JY2lyY3VtZmxleCAgICAgICAgIDB4MGNlCisjZGVmaW5lIFhLX0lkaWFlcmVzaXMgICAgICAgICAgMHgwY2YKKyNkZWZpbmUgWEtfRVRIICAgICAgICAgICAgICAgICAweDBkMAorI2RlZmluZSBYS19FdGggICAgICAgICAgICAgICAgIDB4MGQwCS8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfTnRpbGRlICAgICAgICAgICAgICAweDBkMQorI2RlZmluZSBYS19PZ3JhdmUgICAgICAgICAgICAgIDB4MGQyCisjZGVmaW5lIFhLX09hY3V0ZSAgICAgICAgICAgICAgMHgwZDMKKyNkZWZpbmUgWEtfT2NpcmN1bWZsZXggICAgICAgICAweDBkNAorI2RlZmluZSBYS19PdGlsZGUgICAgICAgICAgICAgIDB4MGQ1CisjZGVmaW5lIFhLX09kaWFlcmVzaXMgICAgICAgICAgMHgwZDYKKyNkZWZpbmUgWEtfbXVsdGlwbHkgICAgICAgICAgICAweDBkNworI2RlZmluZSBYS19Pb2JsaXF1ZSAgICAgICAgICAgIDB4MGQ4CisjZGVmaW5lIFhLX1VncmF2ZSAgICAgICAgICAgICAgMHgwZDkKKyNkZWZpbmUgWEtfVWFjdXRlICAgICAgICAgICAgICAweDBkYQorI2RlZmluZSBYS19VY2lyY3VtZmxleCAgICAgICAgIDB4MGRiCisjZGVmaW5lIFhLX1VkaWFlcmVzaXMgICAgICAgICAgMHgwZGMKKyNkZWZpbmUgWEtfWWFjdXRlICAgICAgICAgICAgICAweDBkZAorI2RlZmluZSBYS19USE9STiAgICAgICAgICAgICAgIDB4MGRlCisjZGVmaW5lIFhLX1Rob3JuICAgICAgICAgICAgICAgMHgwZGUJLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19zc2hhcnAgICAgICAgICAgICAgIDB4MGRmCisjZGVmaW5lIFhLX2FncmF2ZSAgICAgICAgICAgICAgMHgwZTAKKyNkZWZpbmUgWEtfYWFjdXRlICAgICAgICAgICAgICAweDBlMQorI2RlZmluZSBYS19hY2lyY3VtZmxleCAgICAgICAgIDB4MGUyCisjZGVmaW5lIFhLX2F0aWxkZSAgICAgICAgICAgICAgMHgwZTMKKyNkZWZpbmUgWEtfYWRpYWVyZXNpcyAgICAgICAgICAweDBlNAorI2RlZmluZSBYS19hcmluZyAgICAgICAgICAgICAgIDB4MGU1CisjZGVmaW5lIFhLX2FlICAgICAgICAgICAgICAgICAgMHgwZTYKKyNkZWZpbmUgWEtfY2NlZGlsbGEgICAgICAgICAgICAweDBlNworI2RlZmluZSBYS19lZ3JhdmUgICAgICAgICAgICAgIDB4MGU4CisjZGVmaW5lIFhLX2VhY3V0ZSAgICAgICAgICAgICAgMHgwZTkKKyNkZWZpbmUgWEtfZWNpcmN1bWZsZXggICAgICAgICAweDBlYQorI2RlZmluZSBYS19lZGlhZXJlc2lzICAgICAgICAgIDB4MGViCisjZGVmaW5lIFhLX2lncmF2ZSAgICAgICAgICAgICAgMHgwZWMKKyNkZWZpbmUgWEtfaWFjdXRlICAgICAgICAgICAgICAweDBlZAorI2RlZmluZSBYS19pY2lyY3VtZmxleCAgICAgICAgIDB4MGVlCisjZGVmaW5lIFhLX2lkaWFlcmVzaXMgICAgICAgICAgMHgwZWYKKyNkZWZpbmUgWEtfZXRoICAgICAgICAgICAgICAgICAweDBmMAorI2RlZmluZSBYS19udGlsZGUgICAgICAgICAgICAgIDB4MGYxCisjZGVmaW5lIFhLX29ncmF2ZSAgICAgICAgICAgICAgMHgwZjIKKyNkZWZpbmUgWEtfb2FjdXRlICAgICAgICAgICAgICAweDBmMworI2RlZmluZSBYS19vY2lyY3VtZmxleCAgICAgICAgIDB4MGY0CisjZGVmaW5lIFhLX290aWxkZSAgICAgICAgICAgICAgMHgwZjUKKyNkZWZpbmUgWEtfb2RpYWVyZXNpcyAgICAgICAgICAweDBmNgorI2RlZmluZSBYS19kaXZpc2lvbiAgICAgICAgICAgIDB4MGY3CisjZGVmaW5lIFhLX29zbGFzaCAgICAgICAgICAgICAgMHgwZjgKKyNkZWZpbmUgWEtfdWdyYXZlICAgICAgICAgICAgICAweDBmOQorI2RlZmluZSBYS191YWN1dGUgICAgICAgICAgICAgIDB4MGZhCisjZGVmaW5lIFhLX3VjaXJjdW1mbGV4ICAgICAgICAgMHgwZmIKKyNkZWZpbmUgWEtfdWRpYWVyZXNpcyAgICAgICAgICAweDBmYworI2RlZmluZSBYS195YWN1dGUgICAgICAgICAgICAgIDB4MGZkCisjZGVmaW5lIFhLX3Rob3JuICAgICAgICAgICAgICAgMHgwZmUKKyNkZWZpbmUgWEtfeWRpYWVyZXNpcyAgICAgICAgICAweDBmZgorI2VuZGlmIC8qIFhLX0xBVElOMSAqLworCisvKgorICogICBMYXRpbiAyCisgKiAgIEJ5dGUgMyA9IDEKKyAqLworCisjaWZkZWYgWEtfTEFUSU4yCisjZGVmaW5lIFhLX0FvZ29uZWsgICAgICAgICAgICAgMHgxYTEKKyNkZWZpbmUgWEtfYnJldmUgICAgICAgICAgICAgICAweDFhMgorI2RlZmluZSBYS19Mc3Ryb2tlICAgICAgICAgICAgIDB4MWEzCisjZGVmaW5lIFhLX0xjYXJvbiAgICAgICAgICAgICAgMHgxYTUKKyNkZWZpbmUgWEtfU2FjdXRlICAgICAgICAgICAgICAweDFhNgorI2RlZmluZSBYS19TY2Fyb24gICAgICAgICAgICAgIDB4MWE5CisjZGVmaW5lIFhLX1NjZWRpbGxhICAgICAgICAgICAgMHgxYWEKKyNkZWZpbmUgWEtfVGNhcm9uICAgICAgICAgICAgICAweDFhYgorI2RlZmluZSBYS19aYWN1dGUgICAgICAgICAgICAgIDB4MWFjCisjZGVmaW5lIFhLX1pjYXJvbiAgICAgICAgICAgICAgMHgxYWUKKyNkZWZpbmUgWEtfWmFib3ZlZG90ICAgICAgICAgICAweDFhZgorI2RlZmluZSBYS19hb2dvbmVrICAgICAgICAgICAgIDB4MWIxCisjZGVmaW5lIFhLX29nb25layAgICAgICAgICAgICAgMHgxYjIKKyNkZWZpbmUgWEtfbHN0cm9rZSAgICAgICAgICAgICAweDFiMworI2RlZmluZSBYS19sY2Fyb24gICAgICAgICAgICAgIDB4MWI1CisjZGVmaW5lIFhLX3NhY3V0ZSAgICAgICAgICAgICAgMHgxYjYKKyNkZWZpbmUgWEtfY2Fyb24gICAgICAgICAgICAgICAweDFiNworI2RlZmluZSBYS19zY2Fyb24gICAgICAgICAgICAgIDB4MWI5CisjZGVmaW5lIFhLX3NjZWRpbGxhICAgICAgICAgICAgMHgxYmEKKyNkZWZpbmUgWEtfdGNhcm9uICAgICAgICAgICAgICAweDFiYgorI2RlZmluZSBYS196YWN1dGUgICAgICAgICAgICAgIDB4MWJjCisjZGVmaW5lIFhLX2RvdWJsZWFjdXRlICAgICAgICAgMHgxYmQKKyNkZWZpbmUgWEtfemNhcm9uICAgICAgICAgICAgICAweDFiZQorI2RlZmluZSBYS196YWJvdmVkb3QgICAgICAgICAgIDB4MWJmCisjZGVmaW5lIFhLX1JhY3V0ZSAgICAgICAgICAgICAgMHgxYzAKKyNkZWZpbmUgWEtfQWJyZXZlICAgICAgICAgICAgICAweDFjMworI2RlZmluZSBYS19MYWN1dGUgICAgICAgICAgICAgIDB4MWM1CisjZGVmaW5lIFhLX0NhY3V0ZSAgICAgICAgICAgICAgMHgxYzYKKyNkZWZpbmUgWEtfQ2Nhcm9uICAgICAgICAgICAgICAweDFjOAorI2RlZmluZSBYS19Fb2dvbmVrICAgICAgICAgICAgIDB4MWNhCisjZGVmaW5lIFhLX0VjYXJvbiAgICAgICAgICAgICAgMHgxY2MKKyNkZWZpbmUgWEtfRGNhcm9uICAgICAgICAgICAgICAweDFjZgorI2RlZmluZSBYS19Ec3Ryb2tlICAgICAgICAgICAgIDB4MWQwCisjZGVmaW5lIFhLX05hY3V0ZSAgICAgICAgICAgICAgMHgxZDEKKyNkZWZpbmUgWEtfTmNhcm9uICAgICAgICAgICAgICAweDFkMgorI2RlZmluZSBYS19PZG91YmxlYWN1dGUgICAgICAgIDB4MWQ1CisjZGVmaW5lIFhLX1JjYXJvbiAgICAgICAgICAgICAgMHgxZDgKKyNkZWZpbmUgWEtfVXJpbmcgICAgICAgICAgICAgICAweDFkOQorI2RlZmluZSBYS19VZG91YmxlYWN1dGUgICAgICAgIDB4MWRiCisjZGVmaW5lIFhLX1RjZWRpbGxhICAgICAgICAgICAgMHgxZGUKKyNkZWZpbmUgWEtfcmFjdXRlICAgICAgICAgICAgICAweDFlMAorI2RlZmluZSBYS19hYnJldmUgICAgICAgICAgICAgIDB4MWUzCisjZGVmaW5lIFhLX2xhY3V0ZSAgICAgICAgICAgICAgMHgxZTUKKyNkZWZpbmUgWEtfY2FjdXRlICAgICAgICAgICAgICAweDFlNgorI2RlZmluZSBYS19jY2Fyb24gICAgICAgICAgICAgIDB4MWU4CisjZGVmaW5lIFhLX2VvZ29uZWsgICAgICAgICAgICAgMHgxZWEKKyNkZWZpbmUgWEtfZWNhcm9uICAgICAgICAgICAgICAweDFlYworI2RlZmluZSBYS19kY2Fyb24gICAgICAgICAgICAgIDB4MWVmCisjZGVmaW5lIFhLX2RzdHJva2UgICAgICAgICAgICAgMHgxZjAKKyNkZWZpbmUgWEtfbmFjdXRlICAgICAgICAgICAgICAweDFmMQorI2RlZmluZSBYS19uY2Fyb24gICAgICAgICAgICAgIDB4MWYyCisjZGVmaW5lIFhLX29kb3VibGVhY3V0ZSAgICAgICAgMHgxZjUKKyNkZWZpbmUgWEtfdWRvdWJsZWFjdXRlICAgICAgICAweDFmYgorI2RlZmluZSBYS19yY2Fyb24gICAgICAgICAgICAgIDB4MWY4CisjZGVmaW5lIFhLX3VyaW5nICAgICAgICAgICAgICAgMHgxZjkKKyNkZWZpbmUgWEtfdGNlZGlsbGEgICAgICAgICAgICAweDFmZQorI2RlZmluZSBYS19hYm92ZWRvdCAgICAgICAgICAgIDB4MWZmCisjZW5kaWYgLyogWEtfTEFUSU4yICovCisKKy8qCisgKiAgIExhdGluIDMKKyAqICAgQnl0ZSAzID0gMgorICovCisKKyNpZmRlZiBYS19MQVRJTjMKKyNkZWZpbmUgWEtfSHN0cm9rZSAgICAgICAgICAgICAweDJhMQorI2RlZmluZSBYS19IY2lyY3VtZmxleCAgICAgICAgIDB4MmE2CisjZGVmaW5lIFhLX0lhYm92ZWRvdCAgICAgICAgICAgMHgyYTkKKyNkZWZpbmUgWEtfR2JyZXZlICAgICAgICAgICAgICAweDJhYgorI2RlZmluZSBYS19KY2lyY3VtZmxleCAgICAgICAgIDB4MmFjCisjZGVmaW5lIFhLX2hzdHJva2UgICAgICAgICAgICAgMHgyYjEKKyNkZWZpbmUgWEtfaGNpcmN1bWZsZXggICAgICAgICAweDJiNgorI2RlZmluZSBYS19pZG90bGVzcyAgICAgICAgICAgIDB4MmI5CisjZGVmaW5lIFhLX2dicmV2ZSAgICAgICAgICAgICAgMHgyYmIKKyNkZWZpbmUgWEtfamNpcmN1bWZsZXggICAgICAgICAweDJiYworI2RlZmluZSBYS19DYWJvdmVkb3QgICAgICAgICAgIDB4MmM1CisjZGVmaW5lIFhLX0NjaXJjdW1mbGV4ICAgICAgICAgMHgyYzYKKyNkZWZpbmUgWEtfR2Fib3ZlZG90ICAgICAgICAgICAweDJkNQorI2RlZmluZSBYS19HY2lyY3VtZmxleCAgICAgICAgIDB4MmQ4CisjZGVmaW5lIFhLX1VicmV2ZSAgICAgICAgICAgICAgMHgyZGQKKyNkZWZpbmUgWEtfU2NpcmN1bWZsZXggICAgICAgICAweDJkZQorI2RlZmluZSBYS19jYWJvdmVkb3QgICAgICAgICAgIDB4MmU1CisjZGVmaW5lIFhLX2NjaXJjdW1mbGV4ICAgICAgICAgMHgyZTYKKyNkZWZpbmUgWEtfZ2Fib3ZlZG90ICAgICAgICAgICAweDJmNQorI2RlZmluZSBYS19nY2lyY3VtZmxleCAgICAgICAgIDB4MmY4CisjZGVmaW5lIFhLX3VicmV2ZSAgICAgICAgICAgICAgMHgyZmQKKyNkZWZpbmUgWEtfc2NpcmN1bWZsZXggICAgICAgICAweDJmZQorI2VuZGlmIC8qIFhLX0xBVElOMyAqLworCisKKy8qCisgKiAgIExhdGluIDQKKyAqICAgQnl0ZSAzID0gMworICovCisKKyNpZmRlZiBYS19MQVRJTjQKKyNkZWZpbmUgWEtfa3JhICAgICAgICAgICAgICAgICAweDNhMgorI2RlZmluZSBYS19rYXBwYSAgICAgICAgICAgICAgIDB4M2EyCS8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfUmNlZGlsbGEgICAgICAgICAgICAweDNhMworI2RlZmluZSBYS19JdGlsZGUgICAgICAgICAgICAgIDB4M2E1CisjZGVmaW5lIFhLX0xjZWRpbGxhICAgICAgICAgICAgMHgzYTYKKyNkZWZpbmUgWEtfRW1hY3JvbiAgICAgICAgICAgICAweDNhYQorI2RlZmluZSBYS19HY2VkaWxsYSAgICAgICAgICAgIDB4M2FiCisjZGVmaW5lIFhLX1RzbGFzaCAgICAgICAgICAgICAgMHgzYWMKKyNkZWZpbmUgWEtfcmNlZGlsbGEgICAgICAgICAgICAweDNiMworI2RlZmluZSBYS19pdGlsZGUgICAgICAgICAgICAgIDB4M2I1CisjZGVmaW5lIFhLX2xjZWRpbGxhICAgICAgICAgICAgMHgzYjYKKyNkZWZpbmUgWEtfZW1hY3JvbiAgICAgICAgICAgICAweDNiYQorI2RlZmluZSBYS19nY2VkaWxsYSAgICAgICAgICAgIDB4M2JiCisjZGVmaW5lIFhLX3RzbGFzaCAgICAgICAgICAgICAgMHgzYmMKKyNkZWZpbmUgWEtfRU5HICAgICAgICAgICAgICAgICAweDNiZAorI2RlZmluZSBYS19lbmcgICAgICAgICAgICAgICAgIDB4M2JmCisjZGVmaW5lIFhLX0FtYWNyb24gICAgICAgICAgICAgMHgzYzAKKyNkZWZpbmUgWEtfSW9nb25layAgICAgICAgICAgICAweDNjNworI2RlZmluZSBYS19FYWJvdmVkb3QgICAgICAgICAgIDB4M2NjCisjZGVmaW5lIFhLX0ltYWNyb24gICAgICAgICAgICAgMHgzY2YKKyNkZWZpbmUgWEtfTmNlZGlsbGEgICAgICAgICAgICAweDNkMQorI2RlZmluZSBYS19PbWFjcm9uICAgICAgICAgICAgIDB4M2QyCisjZGVmaW5lIFhLX0tjZWRpbGxhICAgICAgICAgICAgMHgzZDMKKyNkZWZpbmUgWEtfVW9nb25layAgICAgICAgICAgICAweDNkOQorI2RlZmluZSBYS19VdGlsZGUgICAgICAgICAgICAgIDB4M2RkCisjZGVmaW5lIFhLX1VtYWNyb24gICAgICAgICAgICAgMHgzZGUKKyNkZWZpbmUgWEtfYW1hY3JvbiAgICAgICAgICAgICAweDNlMAorI2RlZmluZSBYS19pb2dvbmVrICAgICAgICAgICAgIDB4M2U3CisjZGVmaW5lIFhLX2VhYm92ZWRvdCAgICAgICAgICAgMHgzZWMKKyNkZWZpbmUgWEtfaW1hY3JvbiAgICAgICAgICAgICAweDNlZgorI2RlZmluZSBYS19uY2VkaWxsYSAgICAgICAgICAgIDB4M2YxCisjZGVmaW5lIFhLX29tYWNyb24gICAgICAgICAgICAgMHgzZjIKKyNkZWZpbmUgWEtfa2NlZGlsbGEgICAgICAgICAgICAweDNmMworI2RlZmluZSBYS191b2dvbmVrICAgICAgICAgICAgIDB4M2Y5CisjZGVmaW5lIFhLX3V0aWxkZSAgICAgICAgICAgICAgMHgzZmQKKyNkZWZpbmUgWEtfdW1hY3JvbiAgICAgICAgICAgICAweDNmZQorI2VuZGlmIC8qIFhLX0xBVElONCAqLworCisvKgorICogTGF0aW4tOSAoYS5rLmEuIExhdGluLTApCisgKiBCeXRlIDMgPSAxOQorICovCisKKyNpZmRlZiBYS19MQVRJTjkKKyNkZWZpbmUgWEtfT0UgICAgICAgICAgICAgICAgICAweDEzYmMKKyNkZWZpbmUgWEtfb2UgICAgICAgICAgICAgICAgICAweDEzYmQKKyNkZWZpbmUgWEtfWWRpYWVyZXNpcyAgICAgICAgICAweDEzYmUKKyNlbmRpZiAvKiBYS19MQVRJTjkgKi8KKworLyoKKyAqIEthdGFrYW5hCisgKiBCeXRlIDMgPSA0CisgKi8KKworI2lmZGVmIFhLX0tBVEFLQU5BCisjZGVmaW5lIFhLX292ZXJsaW5lCQkJCSAgICAgICAweDQ3ZQorI2RlZmluZSBYS19rYW5hX2Z1bGxzdG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGExCisjZGVmaW5lIFhLX2thbmFfb3BlbmluZ2JyYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YTIKKyNkZWZpbmUgWEtfa2FuYV9jbG9zaW5nYnJhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAweDRhMworI2RlZmluZSBYS19rYW5hX2NvbW1hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGE0CisjZGVmaW5lIFhLX2thbmFfY29uanVuY3RpdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YTUKKyNkZWZpbmUgWEtfa2FuYV9taWRkbGVkb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRhNSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19rYW5hX1dPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGE2CisjZGVmaW5lIFhLX2thbmFfYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YTcKKyNkZWZpbmUgWEtfa2FuYV9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRhOAorI2RlZmluZSBYS19rYW5hX3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGE5CisjZGVmaW5lIFhLX2thbmFfZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YWEKKyNkZWZpbmUgWEtfa2FuYV9vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRhYgorI2RlZmluZSBYS19rYW5hX3lhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGFjCisjZGVmaW5lIFhLX2thbmFfeXUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YWQKKyNkZWZpbmUgWEtfa2FuYV95byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRhZQorI2RlZmluZSBYS19rYW5hX3RzdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGFmCisjZGVmaW5lIFhLX2thbmFfdHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YWYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfcHJvbG9uZ2Vkc291bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiMAorI2RlZmluZSBYS19rYW5hX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGIxCisjZGVmaW5lIFhLX2thbmFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YjIKKyNkZWZpbmUgWEtfa2FuYV9VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiMworI2RlZmluZSBYS19rYW5hX0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGI0CisjZGVmaW5lIFhLX2thbmFfTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YjUKKyNkZWZpbmUgWEtfa2FuYV9LQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiNgorI2RlZmluZSBYS19rYW5hX0tJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGI3CisjZGVmaW5lIFhLX2thbmFfS1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YjgKKyNkZWZpbmUgWEtfa2FuYV9LRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiOQorI2RlZmluZSBYS19rYW5hX0tPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGJhCisjZGVmaW5lIFhLX2thbmFfU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YmIKKyNkZWZpbmUgWEtfa2FuYV9TSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiYworI2RlZmluZSBYS19rYW5hX1NVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGJkCisjZGVmaW5lIFhLX2thbmFfU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YmUKKyNkZWZpbmUgWEtfa2FuYV9TTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiZgorI2RlZmluZSBYS19rYW5hX1RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGMwCisjZGVmaW5lIFhLX2thbmFfQ0hJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YzEKKyNkZWZpbmUgWEtfa2FuYV9USSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRjMSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19rYW5hX1RTVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGMyCisjZGVmaW5lIFhLX2thbmFfVFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YzIgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfa2FuYV9URSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRjMworI2RlZmluZSBYS19rYW5hX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGM0CisjZGVmaW5lIFhLX2thbmFfTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YzUKKyNkZWZpbmUgWEtfa2FuYV9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRjNgorI2RlZmluZSBYS19rYW5hX05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGM3CisjZGVmaW5lIFhLX2thbmFfTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YzgKKyNkZWZpbmUgWEtfa2FuYV9OTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRjOQorI2RlZmluZSBYS19rYW5hX0hBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGNhCisjZGVmaW5lIFhLX2thbmFfSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Y2IKKyNkZWZpbmUgWEtfa2FuYV9GVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRjYworI2RlZmluZSBYS19rYW5hX0hVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGNjICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2thbmFfSEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Y2QKKyNkZWZpbmUgWEtfa2FuYV9ITyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRjZQorI2RlZmluZSBYS19rYW5hX01BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGNmCisjZGVmaW5lIFhLX2thbmFfTUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZDAKKyNkZWZpbmUgWEtfa2FuYV9NVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRkMQorI2RlZmluZSBYS19rYW5hX01FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGQyCisjZGVmaW5lIFhLX2thbmFfTU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZDMKKyNkZWZpbmUgWEtfa2FuYV9ZQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRkNAorI2RlZmluZSBYS19rYW5hX1lVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGQ1CisjZGVmaW5lIFhLX2thbmFfWU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZDYKKyNkZWZpbmUgWEtfa2FuYV9SQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRkNworI2RlZmluZSBYS19rYW5hX1JJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGQ4CisjZGVmaW5lIFhLX2thbmFfUlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZDkKKyNkZWZpbmUgWEtfa2FuYV9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRkYQorI2RlZmluZSBYS19rYW5hX1JPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGRiCisjZGVmaW5lIFhLX2thbmFfV0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZGMKKyNkZWZpbmUgWEtfa2FuYV9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRkZAorI2RlZmluZSBYS192b2ljZWRzb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGRlCisjZGVmaW5lIFhLX3NlbWl2b2ljZWRzb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZGYKKyNkZWZpbmUgWEtfa2FuYV9zd2l0Y2ggICAgICAgICAgMHhGRjdFICAvKiBBbGlhcyBmb3IgbW9kZV9zd2l0Y2ggKi8KKyNlbmRpZiAvKiBYS19LQVRBS0FOQSAqLworCisvKgorICogIEFyYWJpYworICogIEJ5dGUgMyA9IDUKKyAqLworCisjaWZkZWYgWEtfQVJBQklDCisjZGVmaW5lIFhLX0FyYWJpY19jb21tYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1YWMKKyNkZWZpbmUgWEtfQXJhYmljX3NlbWljb2xvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDViYgorI2RlZmluZSBYS19BcmFiaWNfcXVlc3Rpb25fbWFyayAgICAgICAgICAgICAgICAgICAgICAgIDB4NWJmCisjZGVmaW5lIFhLX0FyYWJpY19oYW16YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1YzEKKyNkZWZpbmUgWEtfQXJhYmljX21hZGRhb25hbGVmICAgICAgICAgICAgICAgICAgICAgICAgICAweDVjMgorI2RlZmluZSBYS19BcmFiaWNfaGFtemFvbmFsZWYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWMzCisjZGVmaW5lIFhLX0FyYWJpY19oYW16YW9ud2F3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1YzQKKyNkZWZpbmUgWEtfQXJhYmljX2hhbXphdW5kZXJhbGVmICAgICAgICAgICAgICAgICAgICAgICAweDVjNQorI2RlZmluZSBYS19BcmFiaWNfaGFtemFvbnllaCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWM2CisjZGVmaW5lIFhLX0FyYWJpY19hbGVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1YzcKKyNkZWZpbmUgWEtfQXJhYmljX2JlaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVjOAorI2RlZmluZSBYS19BcmFiaWNfdGVobWFyYnV0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWM5CisjZGVmaW5lIFhLX0FyYWJpY190ZWggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1Y2EKKyNkZWZpbmUgWEtfQXJhYmljX3RoZWggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVjYgorI2RlZmluZSBYS19BcmFiaWNfamVlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWNjCisjZGVmaW5lIFhLX0FyYWJpY19oYWggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1Y2QKKyNkZWZpbmUgWEtfQXJhYmljX2toYWggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVjZQorI2RlZmluZSBYS19BcmFiaWNfZGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWNmCisjZGVmaW5lIFhLX0FyYWJpY190aGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZDAKKyNkZWZpbmUgWEtfQXJhYmljX3JhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVkMQorI2RlZmluZSBYS19BcmFiaWNfemFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWQyCisjZGVmaW5lIFhLX0FyYWJpY19zZWVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZDMKKyNkZWZpbmUgWEtfQXJhYmljX3NoZWVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVkNAorI2RlZmluZSBYS19BcmFiaWNfc2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWQ1CisjZGVmaW5lIFhLX0FyYWJpY19kYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZDYKKyNkZWZpbmUgWEtfQXJhYmljX3RhaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVkNworI2RlZmluZSBYS19BcmFiaWNfemFoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWQ4CisjZGVmaW5lIFhLX0FyYWJpY19haW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZDkKKyNkZWZpbmUgWEtfQXJhYmljX2doYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVkYQorI2RlZmluZSBYS19BcmFiaWNfdGF0d2VlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWUwCisjZGVmaW5lIFhLX0FyYWJpY19mZWggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZTEKKyNkZWZpbmUgWEtfQXJhYmljX3FhZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVlMgorI2RlZmluZSBYS19BcmFiaWNfa2FmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWUzCisjZGVmaW5lIFhLX0FyYWJpY19sYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZTQKKyNkZWZpbmUgWEtfQXJhYmljX21lZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVlNQorI2RlZmluZSBYS19BcmFiaWNfbm9vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWU2CisjZGVmaW5lIFhLX0FyYWJpY19oYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZTcKKyNkZWZpbmUgWEtfQXJhYmljX2hlaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVlNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19BcmFiaWNfd2F3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWU4CisjZGVmaW5lIFhLX0FyYWJpY19hbGVmbWFrc3VyYSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZTkKKyNkZWZpbmUgWEtfQXJhYmljX3llaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVlYQorI2RlZmluZSBYS19BcmFiaWNfZmF0aGF0YW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWViCisjZGVmaW5lIFhLX0FyYWJpY19kYW1tYXRhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZWMKKyNkZWZpbmUgWEtfQXJhYmljX2thc3JhdGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVlZAorI2RlZmluZSBYS19BcmFiaWNfZmF0aGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWVlCisjZGVmaW5lIFhLX0FyYWJpY19kYW1tYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZWYKKyNkZWZpbmUgWEtfQXJhYmljX2thc3JhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVmMAorI2RlZmluZSBYS19BcmFiaWNfc2hhZGRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWYxCisjZGVmaW5lIFhLX0FyYWJpY19zdWt1biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZjIKKyNkZWZpbmUgWEtfQXJhYmljX3N3aXRjaCAgICAgICAgMHhGRjdFICAvKiBBbGlhcyBmb3IgbW9kZV9zd2l0Y2ggKi8KKyNlbmRpZiAvKiBYS19BUkFCSUMgKi8KKworLyoKKyAqIEN5cmlsbGljCisgKiBCeXRlIDMgPSA2CisgKi8KKyNpZmRlZiBYS19DWVJJTExJQworI2RlZmluZSBYS19TZXJiaWFuX2RqZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmExCisjZGVmaW5lIFhLX01hY2Vkb25pYV9namUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YTIKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZhMworI2RlZmluZSBYS19Va3JhaW5pYW5faWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmE0CisjZGVmaW5lIFhLX1VrcmFuaWFuX2plICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YTQgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfTWFjZWRvbmlhX2RzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZhNQorI2RlZmluZSBYS19Va3JhaW5pYW5faSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmE2CisjZGVmaW5lIFhLX1VrcmFuaWFuX2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YTYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfVWtyYWluaWFuX3lpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZhNworI2RlZmluZSBYS19Va3Jhbmlhbl95aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmE3ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2plICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YTgKKyNkZWZpbmUgWEtfU2VyYmlhbl9qZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZhOCAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY19samUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmE5CisjZGVmaW5lIFhLX1NlcmJpYW5fbGplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YTkgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfbmplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZhYQorI2RlZmluZSBYS19TZXJiaWFuX25qZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmFhICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX1NlcmJpYW5fdHNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YWIKKyNkZWZpbmUgWEtfTWFjZWRvbmlhX2tqZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZhYworI2RlZmluZSBYS19CeWVsb3J1c3NpYW5fc2hvcnR1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmFlCisjZGVmaW5lIFhLX0N5cmlsbGljX2R6aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YWYKKyNkZWZpbmUgWEtfU2VyYmlhbl9kemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZhZiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19udW1lcm9zaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmIwCisjZGVmaW5lIFhLX1NlcmJpYW5fREpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YjEKKyNkZWZpbmUgWEtfTWFjZWRvbmlhX0dKRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZiMgorI2RlZmluZSBYS19DeXJpbGxpY19JTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmIzCisjZGVmaW5lIFhLX1VrcmFpbmlhbl9JRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YjQKKyNkZWZpbmUgWEtfVWtyYW5pYW5fSkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZiNCAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19NYWNlZG9uaWFfRFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmI1CisjZGVmaW5lIFhLX1VrcmFpbmlhbl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YjYKKyNkZWZpbmUgWEtfVWtyYW5pYW5fSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZiNiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19Va3JhaW5pYW5fWUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmI3CisjZGVmaW5lIFhLX1VrcmFuaWFuX1lJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YjcgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfSkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZiOAorI2RlZmluZSBYS19TZXJiaWFuX0pFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmI4ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0xKRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YjkKKyNkZWZpbmUgWEtfU2VyYmlhbl9MSkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZiOSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY19OSkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmJhCisjZGVmaW5lIFhLX1NlcmJpYW5fTkpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YmEgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9UU0hFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZiYgorI2RlZmluZSBYS19NYWNlZG9uaWFfS0pFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmJjCisjZGVmaW5lIFhLX0J5ZWxvcnVzc2lhbl9TSE9SVFUgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YmUKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfRFpIRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZiZgorI2RlZmluZSBYS19TZXJiaWFuX0RaRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmJmICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3l1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YzAKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZjMQorI2RlZmluZSBYS19DeXJpbGxpY19iZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmMyCisjZGVmaW5lIFhLX0N5cmlsbGljX3RzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YzMKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZjNAorI2RlZmluZSBYS19DeXJpbGxpY19pZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmM1CisjZGVmaW5lIFhLX0N5cmlsbGljX2VmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YzYKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZ2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZjNworI2RlZmluZSBYS19DeXJpbGxpY19oYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmM4CisjZGVmaW5lIFhLX0N5cmlsbGljX2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YzkKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfc2hvcnRpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZjYQorI2RlZmluZSBYS19DeXJpbGxpY19rYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmNiCisjZGVmaW5lIFhLX0N5cmlsbGljX2VsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2Y2MKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZjZAorI2RlZmluZSBYS19DeXJpbGxpY19lbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmNlCisjZGVmaW5lIFhLX0N5cmlsbGljX28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2Y2YKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfcGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZkMAorI2RlZmluZSBYS19DeXJpbGxpY195YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmQxCisjZGVmaW5lIFhLX0N5cmlsbGljX2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZDIKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZkMworI2RlZmluZSBYS19DeXJpbGxpY190ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmQ0CisjZGVmaW5lIFhLX0N5cmlsbGljX3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZDUKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfemhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZkNgorI2RlZmluZSBYS19DeXJpbGxpY192ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmQ3CisjZGVmaW5lIFhLX0N5cmlsbGljX3NvZnRzaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZDgKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfeWVydSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZkOQorI2RlZmluZSBYS19DeXJpbGxpY196ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmRhCisjZGVmaW5lIFhLX0N5cmlsbGljX3NoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZGIKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZkYworI2RlZmluZSBYS19DeXJpbGxpY19zaGNoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmRkCisjZGVmaW5lIFhLX0N5cmlsbGljX2NoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZGUKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfaGFyZHNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAweDZkZgorI2RlZmluZSBYS19DeXJpbGxpY19ZVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmUwCisjZGVmaW5lIFhLX0N5cmlsbGljX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZTEKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfQkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZlMgorI2RlZmluZSBYS19DeXJpbGxpY19UU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmUzCisjZGVmaW5lIFhLX0N5cmlsbGljX0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZTQKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZlNQorI2RlZmluZSBYS19DeXJpbGxpY19FRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmU2CisjZGVmaW5lIFhLX0N5cmlsbGljX0dIRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZTcKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZlOAorI2RlZmluZSBYS19DeXJpbGxpY19JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmU5CisjZGVmaW5lIFhLX0N5cmlsbGljX1NIT1JUSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZWEKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfS0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZlYgorI2RlZmluZSBYS19DeXJpbGxpY19FTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmVjCisjZGVmaW5lIFhLX0N5cmlsbGljX0VNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZWQKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZlZQorI2RlZmluZSBYS19DeXJpbGxpY19PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmVmCisjZGVmaW5lIFhLX0N5cmlsbGljX1BFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZjAKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfWUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZmMQorI2RlZmluZSBYS19DeXJpbGxpY19FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmYyCisjZGVmaW5lIFhLX0N5cmlsbGljX0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZjMKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZmNAorI2RlZmluZSBYS19DeXJpbGxpY19VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmY1CisjZGVmaW5lIFhLX0N5cmlsbGljX1pIRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZjYKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZmNworI2RlZmluZSBYS19DeXJpbGxpY19TT0ZUU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmY4CisjZGVmaW5lIFhLX0N5cmlsbGljX1lFUlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZjkKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZmYQorI2RlZmluZSBYS19DeXJpbGxpY19TSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmZiCisjZGVmaW5lIFhLX0N5cmlsbGljX0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZmMKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfU0hDSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZmZAorI2RlZmluZSBYS19DeXJpbGxpY19DSEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmZlCisjZGVmaW5lIFhLX0N5cmlsbGljX0hBUkRTSUdOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZmYKKyNlbmRpZiAvKiBYS19DWVJJTExJQyAqLworCisvKgorICogR3JlZWsKKyAqIEJ5dGUgMyA9IDcKKyAqLworCisjaWZkZWYgWEtfR1JFRUsKKyNkZWZpbmUgWEtfR3JlZWtfQUxQSEFhY2NlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdhMQorI2RlZmluZSBYS19HcmVla19FUFNJTE9OYWNjZW50ICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2EyCisjZGVmaW5lIFhLX0dyZWVrX0VUQWFjY2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YTMKKyNkZWZpbmUgWEtfR3JlZWtfSU9UQWFjY2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdhNAorI2RlZmluZSBYS19HcmVla19JT1RBZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2E1CisjZGVmaW5lIFhLX0dyZWVrX09NSUNST05hY2NlbnQgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YTcKKyNkZWZpbmUgWEtfR3JlZWtfVVBTSUxPTmFjY2VudCAgICAgICAgICAgICAgICAgICAgICAgICAweDdhOAorI2RlZmluZSBYS19HcmVla19VUFNJTE9OZGllcmVzaXMgICAgICAgICAgICAgICAgICAgICAgIDB4N2E5CisjZGVmaW5lIFhLX0dyZWVrX09NRUdBYWNjZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YWIKKyNkZWZpbmUgWEtfR3JlZWtfYWNjZW50ZGllcmVzaXMgICAgICAgICAgICAgICAgICAgICAgICAweDdhZQorI2RlZmluZSBYS19HcmVla19ob3JpemJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2FmCisjZGVmaW5lIFhLX0dyZWVrX2FscGhhYWNjZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YjEKKyNkZWZpbmUgWEtfR3JlZWtfZXBzaWxvbmFjY2VudCAgICAgICAgICAgICAgICAgICAgICAgICAweDdiMgorI2RlZmluZSBYS19HcmVla19ldGFhY2NlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2IzCisjZGVmaW5lIFhLX0dyZWVrX2lvdGFhY2NlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YjQKKyNkZWZpbmUgWEtfR3JlZWtfaW90YWRpZXJlc2lzICAgICAgICAgICAgICAgICAgICAgICAgICAweDdiNQorI2RlZmluZSBYS19HcmVla19pb3RhYWNjZW50ZGllcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4N2I2CisjZGVmaW5lIFhLX0dyZWVrX29taWNyb25hY2NlbnQgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YjcKKyNkZWZpbmUgWEtfR3JlZWtfdXBzaWxvbmFjY2VudCAgICAgICAgICAgICAgICAgICAgICAgICAweDdiOAorI2RlZmluZSBYS19HcmVla191cHNpbG9uZGllcmVzaXMgICAgICAgICAgICAgICAgICAgICAgIDB4N2I5CisjZGVmaW5lIFhLX0dyZWVrX3Vwc2lsb25hY2NlbnRkaWVyZXNpcyAgICAgICAgICAgICAgICAgMHg3YmEKKyNkZWZpbmUgWEtfR3JlZWtfb21lZ2FhY2NlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdiYgorI2RlZmluZSBYS19HcmVla19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2MxCisjZGVmaW5lIFhLX0dyZWVrX0JFVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YzIKKyNkZWZpbmUgWEtfR3JlZWtfR0FNTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdjMworI2RlZmluZSBYS19HcmVla19ERUxUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2M0CisjZGVmaW5lIFhLX0dyZWVrX0VQU0lMT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YzUKKyNkZWZpbmUgWEtfR3JlZWtfWkVUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdjNgorI2RlZmluZSBYS19HcmVla19FVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2M3CisjZGVmaW5lIFhLX0dyZWVrX1RIRVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YzgKKyNkZWZpbmUgWEtfR3JlZWtfSU9UQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdjOQorI2RlZmluZSBYS19HcmVla19LQVBQQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2NhCisjZGVmaW5lIFhLX0dyZWVrX0xBTURBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3Y2IKKyNkZWZpbmUgWEtfR3JlZWtfTEFNQkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdjYgorI2RlZmluZSBYS19HcmVla19NVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2NjCisjZGVmaW5lIFhLX0dyZWVrX05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3Y2QKKyNkZWZpbmUgWEtfR3JlZWtfWEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdjZQorI2RlZmluZSBYS19HcmVla19PTUlDUk9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2NmCisjZGVmaW5lIFhLX0dyZWVrX1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDAKKyNkZWZpbmUgWEtfR3JlZWtfUkhPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdkMQorI2RlZmluZSBYS19HcmVla19TSUdNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2QyCisjZGVmaW5lIFhLX0dyZWVrX1RBVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDQKKyNkZWZpbmUgWEtfR3JlZWtfVVBTSUxPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdkNQorI2RlZmluZSBYS19HcmVla19QSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2Q2CisjZGVmaW5lIFhLX0dyZWVrX0NISSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDcKKyNkZWZpbmUgWEtfR3JlZWtfUFNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdkOAorI2RlZmluZSBYS19HcmVla19PTUVHQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2Q5CisjZGVmaW5lIFhLX0dyZWVrX2FscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZTEKKyNkZWZpbmUgWEtfR3JlZWtfYmV0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdlMgorI2RlZmluZSBYS19HcmVla19nYW1tYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2UzCisjZGVmaW5lIFhLX0dyZWVrX2RlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZTQKKyNkZWZpbmUgWEtfR3JlZWtfZXBzaWxvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdlNQorI2RlZmluZSBYS19HcmVla196ZXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2U2CisjZGVmaW5lIFhLX0dyZWVrX2V0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZTcKKyNkZWZpbmUgWEtfR3JlZWtfdGhldGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdlOAorI2RlZmluZSBYS19HcmVla19pb3RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2U5CisjZGVmaW5lIFhLX0dyZWVrX2thcHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZWEKKyNkZWZpbmUgWEtfR3JlZWtfbGFtZGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdlYgorI2RlZmluZSBYS19HcmVla19sYW1iZGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2ViCisjZGVmaW5lIFhLX0dyZWVrX211ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZWMKKyNkZWZpbmUgWEtfR3JlZWtfbnUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdlZAorI2RlZmluZSBYS19HcmVla194aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2VlCisjZGVmaW5lIFhLX0dyZWVrX29taWNyb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZWYKKyNkZWZpbmUgWEtfR3JlZWtfcGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdmMAorI2RlZmluZSBYS19HcmVla19yaG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2YxCisjZGVmaW5lIFhLX0dyZWVrX3NpZ21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZjIKKyNkZWZpbmUgWEtfR3JlZWtfZmluYWxzbWFsbHNpZ21hICAgICAgICAgICAgICAgICAgICAgICAweDdmMworI2RlZmluZSBYS19HcmVla190YXUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2Y0CisjZGVmaW5lIFhLX0dyZWVrX3Vwc2lsb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZjUKKyNkZWZpbmUgWEtfR3JlZWtfcGhpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdmNgorI2RlZmluZSBYS19HcmVla19jaGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2Y3CisjZGVmaW5lIFhLX0dyZWVrX3BzaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZjgKKyNkZWZpbmUgWEtfR3JlZWtfb21lZ2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdmOQorI2RlZmluZSBYS19HcmVla19zd2l0Y2ggICAgICAgICAweEZGN0UgIC8qIEFsaWFzIGZvciBtb2RlX3N3aXRjaCAqLworI2VuZGlmIC8qIFhLX0dSRUVLICovCisKKy8qCisgKiBUZWNobmljYWwKKyAqIEJ5dGUgMyA9IDgKKyAqLworCisjaWZkZWYgWEtfVEVDSE5JQ0FMCisjZGVmaW5lIFhLX2xlZnRyYWRpY2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4YTEKKyNkZWZpbmUgWEtfdG9wbGVmdHJhZGljYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhhMgorI2RlZmluZSBYS19ob3JpemNvbm5lY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGEzCisjZGVmaW5lIFhLX3RvcGludGVncmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4YTQKKyNkZWZpbmUgWEtfYm90aW50ZWdyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhhNQorI2RlZmluZSBYS192ZXJ0Y29ubmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGE2CisjZGVmaW5lIFhLX3RvcGxlZnRzcWJyYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4YTcKKyNkZWZpbmUgWEtfYm90bGVmdHNxYnJhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhhOAorI2RlZmluZSBYS190b3ByaWdodHNxYnJhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGE5CisjZGVmaW5lIFhLX2JvdHJpZ2h0c3FicmFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4YWEKKyNkZWZpbmUgWEtfdG9wbGVmdHBhcmVucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhhYgorI2RlZmluZSBYS19ib3RsZWZ0cGFyZW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGFjCisjZGVmaW5lIFhLX3RvcHJpZ2h0cGFyZW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4YWQKKyNkZWZpbmUgWEtfYm90cmlnaHRwYXJlbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhhZQorI2RlZmluZSBYS19sZWZ0bWlkZGxlY3VybHlicmFjZSAgICAgICAgICAgICAgICAgICAgICAgIDB4OGFmCisjZGVmaW5lIFhLX3JpZ2h0bWlkZGxlY3VybHlicmFjZSAgICAgICAgICAgICAgICAgICAgICAgMHg4YjAKKyNkZWZpbmUgWEtfdG9wbGVmdHN1bW1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhiMQorI2RlZmluZSBYS19ib3RsZWZ0c3VtbWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGIyCisjZGVmaW5lIFhLX3RvcHZlcnRzdW1tYXRpb25jb25uZWN0b3IgICAgICAgICAgICAgICAgICAgMHg4YjMKKyNkZWZpbmUgWEtfYm90dmVydHN1bW1hdGlvbmNvbm5lY3RvciAgICAgICAgICAgICAgICAgICAweDhiNAorI2RlZmluZSBYS190b3ByaWdodHN1bW1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGI1CisjZGVmaW5lIFhLX2JvdHJpZ2h0c3VtbWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4YjYKKyNkZWZpbmUgWEtfcmlnaHRtaWRkbGVzdW1tYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAweDhiNworI2RlZmluZSBYS19sZXNzdGhhbmVxdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGJjCisjZGVmaW5lIFhLX25vdGVxdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4YmQKKyNkZWZpbmUgWEtfZ3JlYXRlcnRoYW5lcXVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhiZQorI2RlZmluZSBYS19pbnRlZ3JhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGJmCisjZGVmaW5lIFhLX3RoZXJlZm9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4YzAKKyNkZWZpbmUgWEtfdmFyaWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhjMQorI2RlZmluZSBYS19pbmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGMyCisjZGVmaW5lIFhLX25hYmxhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4YzUKKyNkZWZpbmUgWEtfYXBwcm94aW1hdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhjOAorI2RlZmluZSBYS19zaW1pbGFyZXF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGM5CisjZGVmaW5lIFhLX2lmb25seWlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Y2QKKyNkZWZpbmUgWEtfaW1wbGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhjZQorI2RlZmluZSBYS19pZGVudGljYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGNmCisjZGVmaW5lIFhLX3JhZGljYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZDYKKyNkZWZpbmUgWEtfaW5jbHVkZWRpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhkYQorI2RlZmluZSBYS19pbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGRiCisjZGVmaW5lIFhLX2ludGVyc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZGMKKyNkZWZpbmUgWEtfdW5pb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhkZAorI2RlZmluZSBYS19sb2dpY2FsYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGRlCisjZGVmaW5lIFhLX2xvZ2ljYWxvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZGYKKyNkZWZpbmUgWEtfcGFydGlhbGRlcml2YXRpdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhlZgorI2RlZmluZSBYS19mdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGY2CisjZGVmaW5lIFhLX2xlZnRhcnJvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZmIKKyNkZWZpbmUgWEtfdXBhcnJvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhmYworI2RlZmluZSBYS19yaWdodGFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGZkCisjZGVmaW5lIFhLX2Rvd25hcnJvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZmUKKyNlbmRpZiAvKiBYS19URUNITklDQUwgKi8KKworLyoKKyAqICBTcGVjaWFsCisgKiAgQnl0ZSAzID0gOQorICovCisKKyNpZmRlZiBYS19TUEVDSUFMCisjZGVmaW5lIFhLX2JsYW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ZGYKKyNkZWZpbmUgWEtfc29saWRkaWFtb25kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDllMAorI2RlZmluZSBYS19jaGVja2VyYm9hcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OWUxCisjZGVmaW5lIFhLX2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ZTIKKyNkZWZpbmUgWEtfZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDllMworI2RlZmluZSBYS19jciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OWU0CisjZGVmaW5lIFhLX2xmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ZTUKKyNkZWZpbmUgWEtfbmwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDllOAorI2RlZmluZSBYS192dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OWU5CisjZGVmaW5lIFhLX2xvd3JpZ2h0Y29ybmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ZWEKKyNkZWZpbmUgWEtfdXByaWdodGNvcm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDllYgorI2RlZmluZSBYS191cGxlZnRjb3JuZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OWVjCisjZGVmaW5lIFhLX2xvd2xlZnRjb3JuZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ZWQKKyNkZWZpbmUgWEtfY3Jvc3NpbmdsaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDllZQorI2RlZmluZSBYS19ob3JpemxpbmVzY2FuMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OWVmCisjZGVmaW5lIFhLX2hvcml6bGluZXNjYW4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ZjAKKyNkZWZpbmUgWEtfaG9yaXpsaW5lc2NhbjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDlmMQorI2RlZmluZSBYS19ob3JpemxpbmVzY2FuNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OWYyCisjZGVmaW5lIFhLX2hvcml6bGluZXNjYW45ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ZjMKKyNkZWZpbmUgWEtfbGVmdHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDlmNAorI2RlZmluZSBYS19yaWdodHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OWY1CisjZGVmaW5lIFhLX2JvdHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ZjYKKyNkZWZpbmUgWEtfdG9wdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDlmNworI2RlZmluZSBYS192ZXJ0YmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OWY4CisjZW5kaWYgLyogWEtfU1BFQ0lBTCAqLworCisvKgorICogIFB1Ymxpc2hpbmcKKyAqICBCeXRlIDMgPSBhCisgKi8KKworI2lmZGVmIFhLX1BVQkxJU0hJTkcKKyNkZWZpbmUgWEtfZW1zcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFhMQorI2RlZmluZSBYS19lbnNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWEyCisjZGVmaW5lIFhLX2VtM3NwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYTMKKyNkZWZpbmUgWEtfZW00c3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFhNAorI2RlZmluZSBYS19kaWdpdHNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWE1CisjZGVmaW5lIFhLX3B1bmN0c3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYTYKKyNkZWZpbmUgWEtfdGhpbnNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFhNworI2RlZmluZSBYS19oYWlyc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWE4CisjZGVmaW5lIFhLX2VtZGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYTkKKyNkZWZpbmUgWEtfZW5kYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFhYQorI2RlZmluZSBYS19zaWduaWZibGFuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWFjCisjZGVmaW5lIFhLX2VsbGlwc2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYWUKKyNkZWZpbmUgWEtfZG91YmJhc2VsaW5lZG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFhZgorI2RlZmluZSBYS19vbmV0aGlyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWIwCisjZGVmaW5lIFhLX3R3b3RoaXJkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYjEKKyNkZWZpbmUgWEtfb25lZmlmdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFiMgorI2RlZmluZSBYS190d29maWZ0aHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWIzCisjZGVmaW5lIFhLX3RocmVlZmlmdGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYjQKKyNkZWZpbmUgWEtfZm91cmZpZnRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFiNQorI2RlZmluZSBYS19vbmVzaXh0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWI2CisjZGVmaW5lIFhLX2ZpdmVzaXh0aHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYjcKKyNkZWZpbmUgWEtfY2FyZW9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFiOAorI2RlZmluZSBYS19maWdkYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWJiCisjZGVmaW5lIFhLX2xlZnRhbmdsZWJyYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYmMKKyNkZWZpbmUgWEtfZGVjaW1hbHBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFiZAorI2RlZmluZSBYS19yaWdodGFuZ2xlYnJhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWJlCisjZGVmaW5lIFhLX21hcmtlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYmYKKyNkZWZpbmUgWEtfb25lZWlnaHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFjMworI2RlZmluZSBYS190aHJlZWVpZ2h0aHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWM0CisjZGVmaW5lIFhLX2ZpdmVlaWdodGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYzUKKyNkZWZpbmUgWEtfc2V2ZW5laWdodGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFjNgorI2RlZmluZSBYS190cmFkZW1hcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWM5CisjZGVmaW5lIFhLX3NpZ25hdHVyZW1hcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhY2EKKyNkZWZpbmUgWEtfdHJhZGVtYXJraW5jaXJjbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFjYgorI2RlZmluZSBYS19sZWZ0b3BlbnRyaWFuZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWNjCisjZGVmaW5lIFhLX3JpZ2h0b3BlbnRyaWFuZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhY2QKKyNkZWZpbmUgWEtfZW1vcGVuY2lyY2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFjZQorI2RlZmluZSBYS19lbW9wZW5yZWN0YW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWNmCisjZGVmaW5lIFhLX2xlZnRzaW5nbGVxdW90ZW1hcmsgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZDAKKyNkZWZpbmUgWEtfcmlnaHRzaW5nbGVxdW90ZW1hcmsgICAgICAgICAgICAgICAgICAgICAgICAweGFkMQorI2RlZmluZSBYS19sZWZ0ZG91YmxlcXVvdGVtYXJrICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWQyCisjZGVmaW5lIFhLX3JpZ2h0ZG91YmxlcXVvdGVtYXJrICAgICAgICAgICAgICAgICAgICAgICAgMHhhZDMKKyNkZWZpbmUgWEtfcHJlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFkNAorI2RlZmluZSBYS19taW51dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWQ2CisjZGVmaW5lIFhLX3NlY29uZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZDcKKyNkZWZpbmUgWEtfbGF0aW5jcm9zcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFkOQorI2RlZmluZSBYS19oZXhhZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWRhCisjZGVmaW5lIFhLX2ZpbGxlZHJlY3RidWxsZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZGIKKyNkZWZpbmUgWEtfZmlsbGVkbGVmdHRyaWJ1bGxldCAgICAgICAgICAgICAgICAgICAgICAgICAweGFkYworI2RlZmluZSBYS19maWxsZWRyaWdodHRyaWJ1bGxldCAgICAgICAgICAgICAgICAgICAgICAgIDB4YWRkCisjZGVmaW5lIFhLX2VtZmlsbGVkY2lyY2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZGUKKyNkZWZpbmUgWEtfZW1maWxsZWRyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFkZgorI2RlZmluZSBYS19lbm9wZW5jaXJjYnVsbGV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWUwCisjZGVmaW5lIFhLX2Vub3BlbnNxdWFyZWJ1bGxldCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZTEKKyNkZWZpbmUgWEtfb3BlbnJlY3RidWxsZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFlMgorI2RlZmluZSBYS19vcGVudHJpYnVsbGV0dXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWUzCisjZGVmaW5lIFhLX29wZW50cmlidWxsZXRkb3duICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZTQKKyNkZWZpbmUgWEtfb3BlbnN0YXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFlNQorI2RlZmluZSBYS19lbmZpbGxlZGNpcmNidWxsZXQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWU2CisjZGVmaW5lIFhLX2VuZmlsbGVkc3FidWxsZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZTcKKyNkZWZpbmUgWEtfZmlsbGVkdHJpYnVsbGV0dXAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFlOAorI2RlZmluZSBYS19maWxsZWR0cmlidWxsZXRkb3duICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWU5CisjZGVmaW5lIFhLX2xlZnRwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZWEKKyNkZWZpbmUgWEtfcmlnaHRwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFlYgorI2RlZmluZSBYS19jbHViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWVjCisjZGVmaW5lIFhLX2RpYW1vbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZWQKKyNkZWZpbmUgWEtfaGVhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFlZQorI2RlZmluZSBYS19tYWx0ZXNlY3Jvc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWYwCisjZGVmaW5lIFhLX2RhZ2dlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZjEKKyNkZWZpbmUgWEtfZG91YmxlZGFnZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFmMgorI2RlZmluZSBYS19jaGVja21hcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWYzCisjZGVmaW5lIFhLX2JhbGxvdGNyb3NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZjQKKyNkZWZpbmUgWEtfbXVzaWNhbHNoYXJwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFmNQorI2RlZmluZSBYS19tdXNpY2FsZmxhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWY2CisjZGVmaW5lIFhLX21hbGVzeW1ib2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZjcKKyNkZWZpbmUgWEtfZmVtYWxlc3ltYm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFmOAorI2RlZmluZSBYS190ZWxlcGhvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWY5CisjZGVmaW5lIFhLX3RlbGVwaG9uZXJlY29yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZmEKKyNkZWZpbmUgWEtfcGhvbm9ncmFwaGNvcHlyaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAweGFmYgorI2RlZmluZSBYS19jYXJldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWZjCisjZGVmaW5lIFhLX3NpbmdsZWxvd3F1b3RlbWFyayAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhZmQKKyNkZWZpbmUgWEtfZG91YmxlbG93cXVvdGVtYXJrICAgICAgICAgICAgICAgICAgICAgICAgICAweGFmZQorI2RlZmluZSBYS19jdXJzb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWZmCisjZW5kaWYgLyogWEtfUFVCTElTSElORyAqLworCisvKgorICogIEFQTAorICogIEJ5dGUgMyA9IGIKKyAqLworCisjaWZkZWYgWEtfQVBMCisjZGVmaW5lIFhLX2xlZnRjYXJldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiYTMKKyNkZWZpbmUgWEtfcmlnaHRjYXJldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGJhNgorI2RlZmluZSBYS19kb3duY2FyZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YmE4CisjZGVmaW5lIFhLX3VwY2FyZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiYTkKKyNkZWZpbmUgWEtfb3ZlcmJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGJjMAorI2RlZmluZSBYS19kb3dudGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YmMyCisjZGVmaW5lIFhLX3Vwc2hvZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiYzMKKyNkZWZpbmUgWEtfZG93bnN0aWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGJjNAorI2RlZmluZSBYS191bmRlcmJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YmM2CisjZGVmaW5lIFhLX2pvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiY2EKKyNkZWZpbmUgWEtfcXVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGJjYworI2RlZmluZSBYS191cHRhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YmNlCisjZGVmaW5lIFhLX2NpcmNsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiY2YKKyNkZWZpbmUgWEtfdXBzdGlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGJkMworI2RlZmluZSBYS19kb3duc2hvZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YmQ2CisjZGVmaW5lIFhLX3JpZ2h0c2hvZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiZDgKKyNkZWZpbmUgWEtfbGVmdHNob2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGJkYQorI2RlZmluZSBYS19sZWZ0dGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YmRjCisjZGVmaW5lIFhLX3JpZ2h0dGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiZmMKKyNlbmRpZiAvKiBYS19BUEwgKi8KKworLyoKKyAqIEhlYnJldworICogQnl0ZSAzID0gYworICovCisKKyNpZmRlZiBYS19IRUJSRVcKKyNkZWZpbmUgWEtfaGVicmV3X2RvdWJsZWxvd2xpbmUgICAgICAgICAgICAgICAgICAgICAgICAweGNkZgorI2RlZmluZSBYS19oZWJyZXdfYWxlcGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2UwCisjZGVmaW5lIFhLX2hlYnJld19iZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZTEKKyNkZWZpbmUgWEtfaGVicmV3X2JldGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNlMSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfZ2ltZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2UyCisjZGVmaW5lIFhLX2hlYnJld19naW1tZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZTIgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2RhbGV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNlMworI2RlZmluZSBYS19oZWJyZXdfZGFsZXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2UzICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19oZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZTQKKyNkZWZpbmUgWEtfaGVicmV3X3dhdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNlNQorI2RlZmluZSBYS19oZWJyZXdfemFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2U2CisjZGVmaW5lIFhLX2hlYnJld196YXlpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZTYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2NoZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNlNworI2RlZmluZSBYS19oZWJyZXdfaGV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2U3ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld190ZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZTgKKyNkZWZpbmUgWEtfaGVicmV3X3RldGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNlOCAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfeW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2U5CisjZGVmaW5lIFhLX2hlYnJld19maW5hbGthcGggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZWEKKyNkZWZpbmUgWEtfaGVicmV3X2thcGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNlYgorI2RlZmluZSBYS19oZWJyZXdfbGFtZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2VjCisjZGVmaW5lIFhLX2hlYnJld19maW5hbG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZWQKKyNkZWZpbmUgWEtfaGVicmV3X21lbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNlZQorI2RlZmluZSBYS19oZWJyZXdfZmluYWxudW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2VmCisjZGVmaW5lIFhLX2hlYnJld19udW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZjAKKyNkZWZpbmUgWEtfaGVicmV3X3NhbWVjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNmMQorI2RlZmluZSBYS19oZWJyZXdfc2FtZWtoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2YxICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19heWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZjIKKyNkZWZpbmUgWEtfaGVicmV3X2ZpbmFscGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNmMworI2RlZmluZSBYS19oZWJyZXdfcGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2Y0CisjZGVmaW5lIFhLX2hlYnJld19maW5hbHphZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZjUKKyNkZWZpbmUgWEtfaGVicmV3X2ZpbmFsemFkaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNmNSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfemFkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2Y2CisjZGVmaW5lIFhLX2hlYnJld196YWRpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZjYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X3FvcGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNmNworI2RlZmluZSBYS19oZWJyZXdfa3VmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2Y3ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19yZXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZjgKKyNkZWZpbmUgWEtfaGVicmV3X3NoaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNmOQorI2RlZmluZSBYS19oZWJyZXdfdGF3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2ZhCisjZGVmaW5lIFhLX2hlYnJld190YWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZmEgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfSGVicmV3X3N3aXRjaCAgICAgICAgMHhGRjdFICAvKiBBbGlhcyBmb3IgbW9kZV9zd2l0Y2ggKi8KKyNlbmRpZiAvKiBYS19IRUJSRVcgKi8KKworLyoKKyAqIFRoYWkKKyAqIEJ5dGUgMyA9IGQKKyAqLworCisjaWZkZWYgWEtfVEhBSQorI2RlZmluZSBYS19UaGFpX2tva2FpCQkJCQkweGRhMQorI2RlZmluZSBYS19UaGFpX2tob2toYWkJCQkJCTB4ZGEyCisjZGVmaW5lIFhLX1RoYWlfa2hva2h1YXQJCQkJMHhkYTMKKyNkZWZpbmUgWEtfVGhhaV9raG9raHdhaQkJCQkweGRhNAorI2RlZmluZSBYS19UaGFpX2tob2tob24JCQkJCTB4ZGE1CisjZGVmaW5lIFhLX1RoYWlfa2hvcmFraGFuZwkJCSAgICAgICAgMHhkYTYgIAorI2RlZmluZSBYS19UaGFpX25nb25ndQkJCQkJMHhkYTcgIAorI2RlZmluZSBYS19UaGFpX2Nob2NoYW4JCQkJCTB4ZGE4ICAKKyNkZWZpbmUgWEtfVGhhaV9jaG9jaGluZwkJCQkweGRhOSAgIAorI2RlZmluZSBYS19UaGFpX2Nob2NoYW5nCQkJCTB4ZGFhICAKKyNkZWZpbmUgWEtfVGhhaV9zb3NvCQkJCQkweGRhYgorI2RlZmluZSBYS19UaGFpX2Nob2Nob2UJCQkJCTB4ZGFjCisjZGVmaW5lIFhLX1RoYWlfeW95aW5nCQkJCQkweGRhZAorI2RlZmluZSBYS19UaGFpX2RvY2hhZGEJCQkJCTB4ZGFlCisjZGVmaW5lIFhLX1RoYWlfdG9wYXRhawkJCQkJMHhkYWYKKyNkZWZpbmUgWEtfVGhhaV90aG90aGFuCQkJCQkweGRiMAorI2RlZmluZSBYS19UaGFpX3Rob25hbmdtb250aG8JCQkgICAgICAgIDB4ZGIxCisjZGVmaW5lIFhLX1RoYWlfdGhvcGh1dGhhbwkJCSAgICAgICAgMHhkYjIKKyNkZWZpbmUgWEtfVGhhaV9ub25lbgkJCQkJMHhkYjMKKyNkZWZpbmUgWEtfVGhhaV9kb2RlawkJCQkJMHhkYjQKKyNkZWZpbmUgWEtfVGhhaV90b3RhbwkJCQkJMHhkYjUKKyNkZWZpbmUgWEtfVGhhaV90aG90aHVuZwkJCQkweGRiNgorI2RlZmluZSBYS19UaGFpX3Rob3RoYWhhbgkJCQkweGRiNworI2RlZmluZSBYS19UaGFpX3Rob3Rob25nCSAJCQkweGRiOAorI2RlZmluZSBYS19UaGFpX25vbnUJCQkJCTB4ZGI5CisjZGVmaW5lIFhLX1RoYWlfYm9iYWltYWkJCQkJMHhkYmEKKyNkZWZpbmUgWEtfVGhhaV9wb3BsYQkJCQkJMHhkYmIKKyNkZWZpbmUgWEtfVGhhaV9waG9waHVuZwkJCQkweGRiYworI2RlZmluZSBYS19UaGFpX2ZvZmEJCQkJCTB4ZGJkCisjZGVmaW5lIFhLX1RoYWlfcGhvcGhhbgkJCQkJMHhkYmUKKyNkZWZpbmUgWEtfVGhhaV9mb2ZhbgkJCQkJMHhkYmYKKyNkZWZpbmUgWEtfVGhhaV9waG9zYW1waGFvCQkJICAgICAgICAweGRjMAorI2RlZmluZSBYS19UaGFpX21vbWEJCQkJCTB4ZGMxCisjZGVmaW5lIFhLX1RoYWlfeW95YWsJCQkJCTB4ZGMyCisjZGVmaW5lIFhLX1RoYWlfcm9ydWEJCQkJCTB4ZGMzCisjZGVmaW5lIFhLX1RoYWlfcnUJCQkJCTB4ZGM0CisjZGVmaW5lIFhLX1RoYWlfbG9saW5nCQkJCQkweGRjNQorI2RlZmluZSBYS19UaGFpX2x1CQkJCQkweGRjNgorI2RlZmluZSBYS19UaGFpX3dvd2FlbgkJCQkJMHhkYzcKKyNkZWZpbmUgWEtfVGhhaV9zb3NhbGEJCQkJCTB4ZGM4CisjZGVmaW5lIFhLX1RoYWlfc29ydXNpCQkJCQkweGRjOQorI2RlZmluZSBYS19UaGFpX3Nvc3VhCQkJCQkweGRjYQorI2RlZmluZSBYS19UaGFpX2hvaGlwCQkJCQkweGRjYgorI2RlZmluZSBYS19UaGFpX2xvY2h1bGEJCQkJCTB4ZGNjCisjZGVmaW5lIFhLX1RoYWlfb2FuZwkJCQkJMHhkY2QKKyNkZWZpbmUgWEtfVGhhaV9ob25va2h1awkJCQkweGRjZQorI2RlZmluZSBYS19UaGFpX3BhaXlhbm5vaQkJCQkweGRjZgorI2RlZmluZSBYS19UaGFpX3NhcmFhCQkJCQkweGRkMAorI2RlZmluZSBYS19UaGFpX21haWhhbmFrYXQJCQkJMHhkZDEKKyNkZWZpbmUgWEtfVGhhaV9zYXJhYWEJCQkJCTB4ZGQyCisjZGVmaW5lIFhLX1RoYWlfc2FyYWFtCQkJCQkweGRkMworI2RlZmluZSBYS19UaGFpX3NhcmFpCQkJCQkweGRkNCAgIAorI2RlZmluZSBYS19UaGFpX3NhcmFpaQkJCQkJMHhkZDUgICAKKyNkZWZpbmUgWEtfVGhhaV9zYXJhdWUJCQkJCTB4ZGQ2ICAgIAorI2RlZmluZSBYS19UaGFpX3NhcmF1ZWUJCQkJCTB4ZGQ3ICAgIAorI2RlZmluZSBYS19UaGFpX3NhcmF1CQkJCQkweGRkOCAgICAKKyNkZWZpbmUgWEtfVGhhaV9zYXJhdXUJCQkJCTB4ZGQ5ICAgCisjZGVmaW5lIFhLX1RoYWlfcGhpbnRodQkJCQkJMHhkZGEKKyNkZWZpbmUgWEtfVGhhaV9tYWloYW5ha2F0X21haXRobyAgIAkJCTB4ZGRlCisjZGVmaW5lIFhLX1RoYWlfYmFodAkJCQkJMHhkZGYKKyNkZWZpbmUgWEtfVGhhaV9zYXJhZQkJCQkJMHhkZTAgICAgCisjZGVmaW5lIFhLX1RoYWlfc2FyYWFlCQkJCQkweGRlMQorI2RlZmluZSBYS19UaGFpX3NhcmFvCQkJCQkweGRlMgorI2RlZmluZSBYS19UaGFpX3NhcmFhaW1haW11YW4JCQkJMHhkZTMgICAKKyNkZWZpbmUgWEtfVGhhaV9zYXJhYWltYWltYWxhaQkJCQkweGRlNCAgCisjZGVmaW5lIFhLX1RoYWlfbGFra2hhbmd5YW8JCQkJMHhkZTUKKyNkZWZpbmUgWEtfVGhhaV9tYWl5YW1vawkJCQkweGRlNgorI2RlZmluZSBYS19UaGFpX21haXRhaWtodQkJCQkweGRlNworI2RlZmluZSBYS19UaGFpX21haWVrCQkJCQkweGRlOCAgIAorI2RlZmluZSBYS19UaGFpX21haXRobwkJCQkJMHhkZTkKKyNkZWZpbmUgWEtfVGhhaV9tYWl0cmkJCQkJCTB4ZGVhCisjZGVmaW5lIFhLX1RoYWlfbWFpY2hhdHRhd2EJCQkJMHhkZWIKKyNkZWZpbmUgWEtfVGhhaV90aGFudGhha2hhdAkJCQkweGRlYworI2RlZmluZSBYS19UaGFpX25pa2hhaGl0CQkJCTB4ZGVkCisjZGVmaW5lIFhLX1RoYWlfbGVrc3VuCQkJCQkweGRmMCAKKyNkZWZpbmUgWEtfVGhhaV9sZWtudW5nCQkJCQkweGRmMSAgCisjZGVmaW5lIFhLX1RoYWlfbGVrc29uZwkJCQkJMHhkZjIgCisjZGVmaW5lIFhLX1RoYWlfbGVrc2FtCQkJCQkweGRmMworI2RlZmluZSBYS19UaGFpX2xla3NpCQkJCQkweGRmNCAgCisjZGVmaW5lIFhLX1RoYWlfbGVraGEJCQkJCTB4ZGY1ICAKKyNkZWZpbmUgWEtfVGhhaV9sZWtob2sJCQkJCTB4ZGY2ICAKKyNkZWZpbmUgWEtfVGhhaV9sZWtjaGV0CQkJCQkweGRmNyAgCisjZGVmaW5lIFhLX1RoYWlfbGVrcGFldAkJCQkJMHhkZjggIAorI2RlZmluZSBYS19UaGFpX2xla2thbwkJCQkJMHhkZjkgCisjZW5kaWYgLyogWEtfVEhBSSAqLworCisvKgorICogICBLb3JlYW4KKyAqICAgQnl0ZSAzID0gZQorICovCisKKyNpZmRlZiBYS19LT1JFQU4KKworI2RlZmluZSBYS19IYW5ndWwJCTB4ZmYzMSAgICAvKiBIYW5ndWwgc3RhcnQvc3RvcCh0b2dnbGUpICovCisjZGVmaW5lIFhLX0hhbmd1bF9TdGFydAkJMHhmZjMyICAgIC8qIEhhbmd1bCBzdGFydCAqLworI2RlZmluZSBYS19IYW5ndWxfRW5kCQkweGZmMzMgICAgLyogSGFuZ3VsIGVuZCwgRW5nbGlzaCBzdGFydCAqLworI2RlZmluZSBYS19IYW5ndWxfSGFuamEJCTB4ZmYzNCAgICAvKiBTdGFydCBIYW5ndWwtPkhhbmphIENvbnZlcnNpb24gKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0phbW8JCTB4ZmYzNSAgICAvKiBIYW5ndWwgSmFtbyBtb2RlICovCisjZGVmaW5lIFhLX0hhbmd1bF9Sb21hamEJMHhmZjM2ICAgIC8qIEhhbmd1bCBSb21hamEgbW9kZSAqLworI2RlZmluZSBYS19IYW5ndWxfQ29kZWlucHV0CTB4ZmYzNyAgICAvKiBIYW5ndWwgY29kZSBpbnB1dCBtb2RlICovCisjZGVmaW5lIFhLX0hhbmd1bF9KZW9uamEJMHhmZjM4ICAgIC8qIEplb25qYSBtb2RlICovCisjZGVmaW5lIFhLX0hhbmd1bF9CYW5qYQkJMHhmZjM5ICAgIC8qIEJhbmphIG1vZGUgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX1ByZUhhbmphCTB4ZmYzYSAgICAvKiBQcmUgSGFuamEgY29udmVyc2lvbiAqLworI2RlZmluZSBYS19IYW5ndWxfUG9zdEhhbmphCTB4ZmYzYiAgICAvKiBQb3N0IEhhbmphIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX1NpbmdsZUNhbmRpZGF0ZQkweGZmM2MgICAgLyogU2luZ2xlIGNhbmRpZGF0ZSAqLworI2RlZmluZSBYS19IYW5ndWxfTXVsdGlwbGVDYW5kaWRhdGUJMHhmZjNkICAgIC8qIE11bHRpcGxlIGNhbmRpZGF0ZSAqLworI2RlZmluZSBYS19IYW5ndWxfUHJldmlvdXNDYW5kaWRhdGUJMHhmZjNlICAgIC8qIFByZXZpb3VzIGNhbmRpZGF0ZSAqLworI2RlZmluZSBYS19IYW5ndWxfU3BlY2lhbAkweGZmM2YgICAgLyogU3BlY2lhbCBzeW1ib2xzICovCisjZGVmaW5lIFhLX0hhbmd1bF9zd2l0Y2gJMHhGRjdFICAgIC8qIEFsaWFzIGZvciBtb2RlX3N3aXRjaCAqLworCisvKiBIYW5ndWwgQ29uc29uYW50IENoYXJhY3RlcnMgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0tpeWVvZwkJCQkweGVhMQorI2RlZmluZSBYS19IYW5ndWxfU3NhbmdLaXllb2cJCQkJMHhlYTIKKyNkZWZpbmUgWEtfSGFuZ3VsX0tpeWVvZ1Npb3MJCQkJMHhlYTMKKyNkZWZpbmUgWEtfSGFuZ3VsX05pZXVuCQkJCQkweGVhNAorI2RlZmluZSBYS19IYW5ndWxfTmlldW5KaWV1agkJCQkweGVhNQorI2RlZmluZSBYS19IYW5ndWxfTmlldW5IaWV1aAkJCQkweGVhNgorI2RlZmluZSBYS19IYW5ndWxfRGlrZXVkCQkJCTB4ZWE3CisjZGVmaW5lIFhLX0hhbmd1bF9Tc2FuZ0Rpa2V1ZAkJCQkweGVhOAorI2RlZmluZSBYS19IYW5ndWxfUmlldWwJCQkJCTB4ZWE5CisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bEtpeWVvZwkJCQkweGVhYQorI2RlZmluZSBYS19IYW5ndWxfUmlldWxNaWV1bQkJCQkweGVhYgorI2RlZmluZSBYS19IYW5ndWxfUmlldWxQaWV1YgkJCQkweGVhYworI2RlZmluZSBYS19IYW5ndWxfUmlldWxTaW9zCQkJCTB4ZWFkCisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bFRpZXV0CQkJCTB4ZWFlCisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bFBoaWV1ZgkJCQkweGVhZgorI2RlZmluZSBYS19IYW5ndWxfUmlldWxIaWV1aAkJCQkweGViMAorI2RlZmluZSBYS19IYW5ndWxfTWlldW0JCQkJCTB4ZWIxCisjZGVmaW5lIFhLX0hhbmd1bF9QaWV1YgkJCQkJMHhlYjIKKyNkZWZpbmUgWEtfSGFuZ3VsX1NzYW5nUGlldWIJCQkJMHhlYjMKKyNkZWZpbmUgWEtfSGFuZ3VsX1BpZXViU2lvcwkJCQkweGViNAorI2RlZmluZSBYS19IYW5ndWxfU2lvcwkJCQkJMHhlYjUKKyNkZWZpbmUgWEtfSGFuZ3VsX1NzYW5nU2lvcwkJCQkweGViNgorI2RlZmluZSBYS19IYW5ndWxfSWV1bmcJCQkJCTB4ZWI3CisjZGVmaW5lIFhLX0hhbmd1bF9KaWV1agkJCQkJMHhlYjgKKyNkZWZpbmUgWEtfSGFuZ3VsX1NzYW5nSmlldWoJCQkJMHhlYjkKKyNkZWZpbmUgWEtfSGFuZ3VsX0NpZXVjCQkJCQkweGViYQorI2RlZmluZSBYS19IYW5ndWxfS2hpZXVxCQkJCTB4ZWJiCisjZGVmaW5lIFhLX0hhbmd1bF9UaWV1dAkJCQkJMHhlYmMKKyNkZWZpbmUgWEtfSGFuZ3VsX1BoaWV1ZgkJCQkweGViZAorI2RlZmluZSBYS19IYW5ndWxfSGlldWgJCQkJCTB4ZWJlCisKKy8qIEhhbmd1bCBWb3dlbCBDaGFyYWN0ZXJzICovCisjZGVmaW5lIFhLX0hhbmd1bF9BCQkJCQkweGViZgorI2RlZmluZSBYS19IYW5ndWxfQUUJCQkJCTB4ZWMwCisjZGVmaW5lIFhLX0hhbmd1bF9ZQQkJCQkJMHhlYzEKKyNkZWZpbmUgWEtfSGFuZ3VsX1lBRQkJCQkJMHhlYzIKKyNkZWZpbmUgWEtfSGFuZ3VsX0VPCQkJCQkweGVjMworI2RlZmluZSBYS19IYW5ndWxfRQkJCQkJMHhlYzQKKyNkZWZpbmUgWEtfSGFuZ3VsX1lFTwkJCQkJMHhlYzUKKyNkZWZpbmUgWEtfSGFuZ3VsX1lFCQkJCQkweGVjNgorI2RlZmluZSBYS19IYW5ndWxfTwkJCQkJMHhlYzcKKyNkZWZpbmUgWEtfSGFuZ3VsX1dBCQkJCQkweGVjOAorI2RlZmluZSBYS19IYW5ndWxfV0FFCQkJCQkweGVjOQorI2RlZmluZSBYS19IYW5ndWxfT0UJCQkJCTB4ZWNhCisjZGVmaW5lIFhLX0hhbmd1bF9ZTwkJCQkJMHhlY2IKKyNkZWZpbmUgWEtfSGFuZ3VsX1UJCQkJCTB4ZWNjCisjZGVmaW5lIFhLX0hhbmd1bF9XRU8JCQkJCTB4ZWNkCisjZGVmaW5lIFhLX0hhbmd1bF9XRQkJCQkJMHhlY2UKKyNkZWZpbmUgWEtfSGFuZ3VsX1dJCQkJCQkweGVjZgorI2RlZmluZSBYS19IYW5ndWxfWVUJCQkJCTB4ZWQwCisjZGVmaW5lIFhLX0hhbmd1bF9FVQkJCQkJMHhlZDEKKyNkZWZpbmUgWEtfSGFuZ3VsX1lJCQkJCQkweGVkMgorI2RlZmluZSBYS19IYW5ndWxfSQkJCQkJMHhlZDMKKworLyogSGFuZ3VsIHN5bGxhYmxlLWZpbmFsIChKb25nU2VvbmcpIENoYXJhY3RlcnMgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0pfS2l5ZW9nCQkJCTB4ZWQ0CisjZGVmaW5lIFhLX0hhbmd1bF9KX1NzYW5nS2l5ZW9nCQkJCTB4ZWQ1CisjZGVmaW5lIFhLX0hhbmd1bF9KX0tpeWVvZ1Npb3MJCQkJMHhlZDYKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfTmlldW4JCQkJMHhlZDcKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfTmlldW5KaWV1agkJCQkweGVkOAorI2RlZmluZSBYS19IYW5ndWxfSl9OaWV1bkhpZXVoCQkJCTB4ZWQ5CisjZGVmaW5lIFhLX0hhbmd1bF9KX0Rpa2V1ZAkJCQkweGVkYQorI2RlZmluZSBYS19IYW5ndWxfSl9SaWV1bAkJCQkweGVkYgorI2RlZmluZSBYS19IYW5ndWxfSl9SaWV1bEtpeWVvZwkJCQkweGVkYworI2RlZmluZSBYS19IYW5ndWxfSl9SaWV1bE1pZXVtCQkJCTB4ZWRkCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsUGlldWIJCQkJMHhlZGUKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWxTaW9zCQkJCTB4ZWRmCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsVGlldXQJCQkJMHhlZTAKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWxQaGlldWYJCQkJMHhlZTEKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWxIaWV1aAkJCQkweGVlMgorI2RlZmluZSBYS19IYW5ndWxfSl9NaWV1bQkJCQkweGVlMworI2RlZmluZSBYS19IYW5ndWxfSl9QaWV1YgkJCQkweGVlNAorI2RlZmluZSBYS19IYW5ndWxfSl9QaWV1YlNpb3MJCQkJMHhlZTUKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfU2lvcwkJCQkweGVlNgorI2RlZmluZSBYS19IYW5ndWxfSl9Tc2FuZ1Npb3MJCQkJMHhlZTcKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfSWV1bmcJCQkJMHhlZTgKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfSmlldWoJCQkJMHhlZTkKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfQ2lldWMJCQkJMHhlZWEKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfS2hpZXVxCQkJCTB4ZWViCisjZGVmaW5lIFhLX0hhbmd1bF9KX1RpZXV0CQkJCTB4ZWVjCisjZGVmaW5lIFhLX0hhbmd1bF9KX1BoaWV1ZgkJCQkweGVlZAorI2RlZmluZSBYS19IYW5ndWxfSl9IaWV1aAkJCQkweGVlZQorCisvKiBBbmNpZW50IEhhbmd1bCBDb25zb25hbnQgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfUmlldWxZZW9yaW5IaWV1aAkJCTB4ZWVmCisjZGVmaW5lIFhLX0hhbmd1bF9TdW5reWVvbmdldW1NaWV1bQkJCTB4ZWYwCisjZGVmaW5lIFhLX0hhbmd1bF9TdW5reWVvbmdldW1QaWV1YgkJCTB4ZWYxCisjZGVmaW5lIFhLX0hhbmd1bF9QYW5TaW9zCQkJCTB4ZWYyCisjZGVmaW5lIFhLX0hhbmd1bF9La29namlEYWxyaW5JZXVuZwkJCTB4ZWYzCisjZGVmaW5lIFhLX0hhbmd1bF9TdW5reWVvbmdldW1QaGlldWYJCQkweGVmNAorI2RlZmluZSBYS19IYW5ndWxfWWVvcmluSGlldWgJCQkJMHhlZjUKKworLyogQW5jaWVudCBIYW5ndWwgVm93ZWwgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfQXJhZUEJCQkJCTB4ZWY2CisjZGVmaW5lIFhLX0hhbmd1bF9BcmFlQUUJCQkJMHhlZjcKKworLyogQW5jaWVudCBIYW5ndWwgc3lsbGFibGUtZmluYWwgKEpvbmdTZW9uZykgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfSl9QYW5TaW9zCQkJCTB4ZWY4CisjZGVmaW5lIFhLX0hhbmd1bF9KX0trb2dqaURhbHJpbklldW5nCQkJMHhlZjkKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfWWVvcmluSGlldWgJCQkJMHhlZmEKKworLyogS29yZWFuIGN1cnJlbmN5IHN5bWJvbCAqLworI2RlZmluZSBYS19Lb3JlYW5fV29uCQkJCQkweGVmZgorCisjZW5kaWYgLyogWEtfS09SRUFOICovCisKKyNpZmRlZiBYS19DVVJSRU5DWQorI2RlZmluZSBYS19FY3VTaWduCQkJCQkweDIwYTAKKyNkZWZpbmUgWEtfQ29sb25TaWduCQkJCQkweDIwYTEKKyNkZWZpbmUgWEtfQ3J1emVpcm9TaWduCQkJCQkweDIwYTIKKyNkZWZpbmUgWEtfRkZyYW5jU2lnbgkJCQkJMHgyMGEzCisjZGVmaW5lIFhLX0xpcmFTaWduCQkJCQkweDIwYTQKKyNkZWZpbmUgWEtfTWlsbFNpZ24JCQkJCTB4MjBhNQorI2RlZmluZSBYS19OYWlyYVNpZ24JCQkJCTB4MjBhNgorI2RlZmluZSBYS19QZXNldGFTaWduCQkJCQkweDIwYTcKKyNkZWZpbmUgWEtfUnVwZWVTaWduCQkJCQkweDIwYTgKKyNkZWZpbmUgWEtfV29uU2lnbgkJCQkJMHgyMGE5CisjZGVmaW5lIFhLX05ld1NoZXFlbFNpZ24JCQkJMHgyMGFhCisjZGVmaW5lIFhLX0RvbmdTaWduCQkJCQkweDIwYWIKKyNkZWZpbmUgWEtfRXVyb1NpZ24JCQkJCTB4MjBhYworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vcmZiL21zZ1R5cGVzLmggYi9jb21tb24vcmZiL21zZ1R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmOGQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvbXNnVHlwZXMuaApAQCAtMCwwICsxLDU3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fUkZCX01TR1RZUEVTX0hfXworI2RlZmluZSBfX1JGQl9NU0dUWVBFU19IX18KKworbmFtZXNwYWNlIHJmYiB7CisgIC8vIHNlcnZlciB0byBjbGllbnQKKworICBjb25zdCBpbnQgbXNnVHlwZUZyYW1lYnVmZmVyVXBkYXRlID0gMDsKKyAgY29uc3QgaW50IG1zZ1R5cGVTZXRDb2xvdXJNYXBFbnRyaWVzID0gMTsKKyAgY29uc3QgaW50IG1zZ1R5cGVCZWxsID0gMjsKKyAgY29uc3QgaW50IG1zZ1R5cGVTZXJ2ZXJDdXRUZXh0ID0gMzsKKworICBjb25zdCBpbnQgbXNnVHlwZUZpbGVMaXN0RGF0YSA9IDEzMDsKKyAgY29uc3QgaW50IG1zZ1R5cGVGaWxlRG93bmxvYWREYXRhID0gMTMxOworICBjb25zdCBpbnQgbXNnVHlwZUZpbGVVcGxvYWRDYW5jZWwgPSAxMzI7CisgIGNvbnN0IGludCBtc2dUeXBlRmlsZURvd25sb2FkRmFpbGVkID0gMTMzOworICBjb25zdCBpbnQgbXNnVHlwZUZpbGVEaXJTaXplRGF0YSA9IDEzNDsKKyAgY29uc3QgaW50IG1zZ1R5cGVGaWxlTGFzdFJlcXVlc3RGYWlsZWQgPSAxMzU7CisKKyAgLy8gY2xpZW50IHRvIHNlcnZlcgorCisgIGNvbnN0IGludCBtc2dUeXBlU2V0UGl4ZWxGb3JtYXQgPSAwOworICBjb25zdCBpbnQgbXNnVHlwZUZpeENvbG91ck1hcEVudHJpZXMgPSAxOworICBjb25zdCBpbnQgbXNnVHlwZVNldEVuY29kaW5ncyA9IDI7CisgIGNvbnN0IGludCBtc2dUeXBlRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0ID0gMzsKKyAgY29uc3QgaW50IG1zZ1R5cGVLZXlFdmVudCA9IDQ7CisgIGNvbnN0IGludCBtc2dUeXBlUG9pbnRlckV2ZW50ID0gNTsKKyAgY29uc3QgaW50IG1zZ1R5cGVDbGllbnRDdXRUZXh0ID0gNjsKKworICBjb25zdCBpbnQgbXNnVHlwZUZpbGVMaXN0UmVxdWVzdCA9IDEzMDsKKyAgY29uc3QgaW50IG1zZ1R5cGVGaWxlRG93bmxvYWRSZXF1ZXN0ID0gMTMxOworICBjb25zdCBpbnQgbXNnVHlwZUZpbGVVcGxvYWRSZXF1ZXN0ID0gMTMyOworICBjb25zdCBpbnQgbXNnVHlwZUZpbGVVcGxvYWREYXRhID0gMTMzOworICBjb25zdCBpbnQgbXNnVHlwZUZpbGVEb3dubG9hZENhbmNlbCA9IDEzNDsKKyAgY29uc3QgaW50IG1zZ1R5cGVGaWxlVXBsb2FkRmFpbGVkID0gMTM1OworICBjb25zdCBpbnQgbXNnVHlwZUZpbGVDcmVhdGVEaXJSZXF1ZXN0ID0gMTM2OworICBjb25zdCBpbnQgbXNnVHlwZUZpbGVEaXJTaXplUmVxdWVzdCA9IDEzNzsKKyAgY29uc3QgaW50CW1zZ1R5cGVGaWxlUmVuYW1lUmVxdWVzdCA9IDEzODsKKyAgY29uc3QgaW50IG1zZ1R5cGVGaWxlRGVsZXRlUmVxdWVzdCA9IDEzOTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9yZmIuZHNwIGIvY29tbW9uL3JmYi9yZmIuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjVlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL3JmYi5kc3AKQEAgLTAsMCArMSw3NjcgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0icmZiIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0DQorDQorQ0ZHPXJmYiAtIFdpbjMyIERlYnVnIFVuaWNvZGUNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInJmYi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAicmZiLm1hayIgQ0ZHPSJyZmIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJyZmIgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSAicmZiIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJyZmIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAicmZiIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXFJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXFJlbGVhc2VccmZiIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzEgL0kgIi4uIiAvSSAiLi4vLi4vd2luIiAvRkkicmRyL21zdmN3YXJuaW5nLmgiIC9EICJOREVCVUciIC9EICJfTElCIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAicmZiIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXERlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxEZWJ1Z1xyZmIiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi4iIC9JICIuLi8uLi93aW4iIC9GSSJyZHIvbXN2Y3dhcm5pbmcuaCIgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAicmZiIC0gV2luMzIgRGVidWcgVW5pY29kZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJyZmJfX19XaW4zMl9EZWJ1Z19Vbmljb2RlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInJmYl9fX1dpbjMyX0RlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXERlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXERlYnVnX1VuaWNvZGVccmZiIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uIiAvRkkibXN2Y3dhcm5pbmcuaCIgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi4iIC9JICIuLi8uLi93aW4iIC9GSSJyZHIvbXN2Y3dhcm5pbmcuaCIgL0QgIl9MSUIiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9VTklDT0RFIiAvRCAiVU5JQ09ERSIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvDQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJyZmIgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAicmZiIC0gV2luMzIgRGVidWciDQorIyBOYW1lICJyZmIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEJsYWNrbGlzdC5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxDQ29ubmVjdGlvbi5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxDRlRNc2dSZWFkZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ0ZUTXNnV3JpdGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENNc2dIYW5kbGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENNc2dSZWFkZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ01zZ1JlYWRlclYzLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENNc2dXcml0ZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ01zZ1dyaXRlclYzLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENvbXBhcmluZ1VwZGF0ZVRyYWNrZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ29uZmlndXJhdGlvbi5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxDb25uUGFyYW1zLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENTZWN1cml0eVZuY0F1dGguY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ3Vyc29yLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGQzZGVzLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxEZWNvZGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEVuY29kZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZW5jb2RpbmdzLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEZpbGVJbmZvLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEZpbGVNYW5hZ2VyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEZpbGVSZWFkZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRmlsZVdyaXRlci5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxIZXh0aWxlRGVjb2Rlci5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxIZXh0aWxlRW5jb2Rlci5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxIVFRQU2VydmVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEtleVJlbWFwcGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXExvZ2dlci5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxMb2dnZXJfZmlsZS5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxMb2dnZXJfc3RkaW8uY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cTG9nV3JpdGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFBhc3N3b3JkLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFBpeGVsQnVmZmVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFBpeGVsRm9ybWF0LmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFJhd0RlY29kZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUmF3RW5jb2Rlci5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxSZWdpb24uY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUlJFRGVjb2Rlci5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxSUkVFbmNvZGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNjYWxlZFBpeGVsQnVmZmVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNDb25uZWN0aW9uLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNlY1R5cGVzLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNlcnZlckNvcmUuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU0ZpbGVUcmFuc2Zlci5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxTRmlsZVRyYW5zZmVyTWFuYWdlci5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxTRlRNc2dSZWFkZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU0ZUTXNnV3JpdGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNNc2dIYW5kbGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNNc2dSZWFkZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU01zZ1JlYWRlclYzLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNNc2dXcml0ZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU01zZ1dyaXRlclYzLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNTZWN1cml0eUZhY3RvcnlTdGFuZGFyZC5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxTU2VjdXJpdHlWbmNBdXRoLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFRpZ2h0RGVjb2Rlci5jeHgNCisjIEFERCBDUFAgL0kgIi4uL2pwZWciDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cVGlnaHRFbmNvZGVyLmN4eA0KKyMgQUREIENQUCAvSSAiLi4vanBlZyINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxUaWdodFBhbGV0dGUuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cVHJhbnNmZXJRdWV1ZS5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxUcmFuc0ltYWdlR2V0dGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFVwZGF0ZVRyYWNrZXIuY3h4DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdXRpbC5jeHgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxWTkNTQ29ubmVjdGlvblNULmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFZOQ1NlcnZlclNULmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFpSTEVEZWNvZGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFpSTEVFbmNvZGVyLmN4eA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxCbGFja2xpc3QuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENDb25uZWN0aW9uLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxDRlRNc2dSZWFkZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENGVE1zZ1dyaXRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ01zZ0hhbmRsZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENNc2dSZWFkZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENNc2dSZWFkZXJWMy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ01zZ1dyaXRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ01zZ1dyaXRlclYzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxDb2xvdXJDdWJlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxDb2xvdXJNYXAuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENvbXBhcmluZ1VwZGF0ZVRyYWNrZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENvbmZpZ3VyYXRpb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENvbm5QYXJhbXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENTZWN1cml0eS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ1NlY3VyaXR5Tm9uZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ1NlY3VyaXR5Vm5jQXV0aC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ3Vyc29yLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxkM2Rlcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRGVjb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRGlyTWFuYWdlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRW5jb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZW5jb2RpbmdzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxFeGNlcHRpb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEZpbGVJbmZvLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxGaWxlTWFuYWdlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRmlsZVJlYWRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRmlsZVdyaXRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caGV4dGlsZUNvbnN0YW50cy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caGV4dGlsZURlY29kZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cSGV4dGlsZURlY29kZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGhleHRpbGVFbmNvZGUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGhleHRpbGVFbmNvZGVCZXR0ZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEhleHRpbGVFbmNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxIb3N0bmFtZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cSFRUUFNlcnZlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cSW1hZ2VHZXR0ZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXElucHV0SGFuZGxlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cS2V5UmVtYXBwZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGtleXN5bWRlZi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cTGlzdENvbm5JbmZvLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxMb2dnZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXExvZ2dlcl9maWxlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxMb2dnZXJfc3RkaW8uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXExvZ1dyaXRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbXNnVHlwZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXG1zdmN3YXJuaW5nLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxQYXNzd29yZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUGl4ZWwuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFBpeGVsQnVmZmVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxQaXhlbEZvcm1hdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUmF3RGVjb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUmF3RW5jb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUmVjdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUmVnaW9uLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxycmVEZWNvZGUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFJSRURlY29kZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJyZUVuY29kZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUlJFRW5jb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU2NhbGVkUGl4ZWxCdWZmZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNDb25uZWN0aW9uLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxTRGVza3RvcC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc2VjVHlwZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNlcnZlckNvcmUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNGaWxlVHJhbnNmZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNGaWxlVHJhbnNmZXJNYW5hZ2VyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxTRlRNc2dSZWFkZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNGVE1zZ1dyaXRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU01zZ0hhbmRsZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNNc2dSZWFkZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNNc2dSZWFkZXJWMy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU01zZ1dyaXRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU01zZ1dyaXRlclYzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxTU2VjdXJpdHkuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNTZWN1cml0eUZhY3RvcnlTdGFuZGFyZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU1NlY3VyaXR5Tm9uZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU1NlY3VyaXR5Vm5jQXV0aC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cVGhyZWFkaW5nLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx0aWdodERlY29kZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cVGlnaHREZWNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx0aWdodEVuY29kZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cVGlnaHRFbmNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxUaWdodFBhbGV0dGUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFRyYW5zZmVyUXVldWUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFRyYW5zSW1hZ2VHZXR0ZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHRyYW5zSW5pdFRlbXBsLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx0cmFuc1RlbXBsLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxUcnVlQ29sb3VyTWFwLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxVcGRhdGVUcmFja2VyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxVc2VyUGFzc3dkR2V0dGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx1dGlsLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxWTkNTQ29ubmVjdGlvblNULmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxWTkNTZXJ2ZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFZOQ1NlcnZlclNULmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx6cmxlRGVjb2RlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxaUkxFRGVjb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cenJsZUVuY29kZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cWlJMRUVuY29kZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9ycmVEZWNvZGUuaCBiL2NvbW1vbi9yZmIvcnJlRGVjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1YmRmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvcnJlRGVjb2RlLmgKQEAgLTAsMCArMSw2NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIFJSRSBkZWNvZGluZyBmdW5jdGlvbi4KKy8vCisvLyBUaGlzIGZpbGUgaXMgI2luY2x1ZGVkIGFmdGVyIGhhdmluZyBzZXQgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisvLyBCUFAgICAgICAgICAgICAgICAgLSA4LCAxNiBvciAzMgorLy8gRVhUUkFfQVJHUyAgICAgICAgIC0gb3B0aW9uYWwgZXh0cmEgYXJndW1lbnRzCisvLyBGSUxMX1JFQ1QgICAgICAgICAgLSBmaWxsIGEgcmVjdGFuZ2xlIHdpdGggYSBzaW5nbGUgY29sb3VyCisKKyNpbmNsdWRlIDxyZHIvSW5TdHJlYW0uaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKy8vIENPTkNBVDJFIGNvbmNhdGVuYXRlcyBpdHMgYXJndW1lbnRzLCBleHBhbmRpbmcgdGhlbSBpZiB0aGV5IGFyZSBtYWNyb3MKKworI2lmbmRlZiBDT05DQVQyRQorI2RlZmluZSBDT05DQVQyKGEsYikgYSMjYgorI2RlZmluZSBDT05DQVQyRShhLGIpIENPTkNBVDIoYSxiKQorI2VuZGlmCisKKyNkZWZpbmUgUElYRUxfVCByZHI6OkNPTkNBVDJFKFUsQlBQKQorI2RlZmluZSBSRUFEX1BJWEVMIENPTkNBVDJFKHJlYWRPcGFxdWUsQlBQKQorI2RlZmluZSBSUkVfREVDT0RFIENPTkNBVDJFKHJyZURlY29kZSxCUFApCisKK3ZvaWQgUlJFX0RFQ09ERSAoY29uc3QgUmVjdCYgciwgcmRyOjpJblN0cmVhbSogaXMKKyNpZmRlZiBFWFRSQV9BUkdTCisgICAgICAgICAgICAgICAgICwgRVhUUkFfQVJHUworI2VuZGlmCisgICAgICAgICAgICAgICAgICkKK3sKKyAgaW50IG5TdWJyZWN0cyA9IGlzLT5yZWFkVTMyKCk7CisgIFBJWEVMX1QgYmcgPSBpcy0+UkVBRF9QSVhFTCgpOworICBGSUxMX1JFQ1QociwgYmcpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgblN1YnJlY3RzOyBpKyspIHsKKyAgICBQSVhFTF9UIHBpeCA9IGlzLT5SRUFEX1BJWEVMKCk7CisgICAgaW50IHggPSBpcy0+cmVhZFUxNigpOworICAgIGludCB5ID0gaXMtPnJlYWRVMTYoKTsKKyAgICBpbnQgdyA9IGlzLT5yZWFkVTE2KCk7CisgICAgaW50IGggPSBpcy0+cmVhZFUxNigpOworICAgIEZJTExfUkVDVChSZWN0KHIudGwueCt4LCByLnRsLnkreSwgci50bC54K3grdywgci50bC55K3kraCksIHBpeCk7CisgIH0KK30KKworI3VuZGVmIFBJWEVMX1QKKyN1bmRlZiBSRUFEX1BJWEVMCisjdW5kZWYgUlJFX0RFQ09ERQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi9ycmVFbmNvZGUuaCBiL2NvbW1vbi9yZmIvcnJlRW5jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4MzQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvcnJlRW5jb2RlLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBSUkUgZW5jb2RpbmcgZnVuY3Rpb24uCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBhZnRlciBoYXZpbmcgc2V0IHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorLy8gQlBQICAgICAgICAgICAgICAgIC0gOCwgMTYgb3IgMzIKKy8vCisvLyBUaGUgZGF0YSBhcmd1bWVudCB0byBSUkVfRU5DT0RFIGNvbnRhaW5zIHRoZSBwaXhlbCBkYXRhLCBhbmQgaXQgd3JpdGVzIHRoZQorLy8gZW5jb2RlZCB2ZXJzaW9uIHRvIHRoZSBnaXZlbiBPdXRTdHJlYW0uICBJZiB0aGUgZW5jb2RlZCB2ZXJzaW9uIGV4Y2VlZHMgdypoCisvLyBpdCBhYm9ydHMgYW5kIHJldHVybnMgLTEsIG90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VicmVjdGFuZ2xlcy4KKy8vCisKKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisKK25hbWVzcGFjZSByZmIgeworCisvLyBDT05DQVQyRSBjb25jYXRlbmF0ZXMgaXRzIGFyZ3VtZW50cywgZXhwYW5kaW5nIHRoZW0gaWYgdGhleSBhcmUgbWFjcm9zCisKKyNpZm5kZWYgQ09OQ0FUMkUKKyNkZWZpbmUgQ09OQ0FUMihhLGIpIGEjI2IKKyNkZWZpbmUgQ09OQ0FUMkUoYSxiKSBDT05DQVQyKGEsYikKKyNlbmRpZgorCisjZGVmaW5lIFBJWEVMX1QgcmRyOjpDT05DQVQyRShVLEJQUCkKKyNkZWZpbmUgV1JJVEVfUElYRUwgQ09OQ0FUMkUod3JpdGVPcGFxdWUsQlBQKQorI2RlZmluZSBSUkVfRU5DT0RFIENPTkNBVDJFKHJyZUVuY29kZSxCUFApCisKK2ludCBSUkVfRU5DT0RFIChQSVhFTF9UKiBkYXRhLCBpbnQgdywgaW50IGgsIHJkcjo6T3V0U3RyZWFtKiBvcywgUElYRUxfVCBiZyk7CisKK2ludCBSUkVfRU5DT0RFICh2b2lkKiBkYXRhLCBpbnQgdywgaW50IGgsIHJkcjo6T3V0U3RyZWFtKiBvcykKK3sKKyAgLy8gRmluZCB0aGUgYmFja2dyb3VuZCBjb2xvdXIgLSBjb3VudCBvY2N1cnJlbmNlcyBvZiB1cCB0byA0IGRpZmZlcmVudCBwaXhlbAorICAvLyB2YWx1ZXMsIGFuZCBjaG9vc2UgdGhlIG9uZSB3aGljaCBvY2N1cnMgbW9zdCBvZnRlbi4KKworICBjb25zdCBpbnQgbkNvbHMgPSA0OworICBQSVhFTF9UIHBpeFtuQ29sc107CisgIGludCBjb3VudFtuQ29sc10gPSB7IDAsIH07CisgIFBJWEVMX1QqIHB0ciA9IChQSVhFTF9UKilkYXRhOworICBQSVhFTF9UKiBlbmQgPSBwdHIgKyB3Kmg7CisKKyAgd2hpbGUgKHB0ciA8IGVuZCkgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuQ29sczsgaSsrKSB7CisgICAgICBpZiAoY291bnRbaV0gPT0gMCkKKyAgICAgICAgcGl4W2ldID0gKnB0cjsKKworICAgICAgaWYgKHBpeFtpXSA9PSAqcHRyKSB7CisgICAgICAgIGNvdW50W2ldKys7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChpID09IG5Db2xzKSBicmVhazsKKyAgICBwdHIrKzsKKyAgfQorICAKKyAgaW50IGJnID0gMDsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBuQ29sczsgaSsrKQorICAgIGlmIChjb3VudFtpXSA+IGNvdW50W2JnXSkgYmcgPSBpOworCisgIC8vIE5vdyBjYWxsIHRoZSBmdW5jdGlvbiB0byBkbyB0aGUgZW5jb2RpbmcuCisKKyAgcmV0dXJuIFJSRV9FTkNPREUgKChQSVhFTF9UKilkYXRhLCB3LCBoLCBvcywgcGl4W2JnXSk7Cit9CisKK2ludCBSUkVfRU5DT0RFIChQSVhFTF9UKiBkYXRhLCBpbnQgdywgaW50IGgsIHJkcjo6T3V0U3RyZWFtKiBvcywgUElYRUxfVCBiZykKK3sKKyAgaW50IG9sZExlbiA9IG9zLT5sZW5ndGgoKTsKKyAgb3MtPldSSVRFX1BJWEVMKGJnKTsKKworICBpbnQgblN1YnJlY3RzID0gMDsKKworICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykKKyAgeworICAgIGludCB4ID0gMDsKKyAgICB3aGlsZSAoeCA8IHcpIHsKKyAgICAgIGlmICgqZGF0YSA9PSBiZykgeworICAgICAgICB4Kys7CisgICAgICAgIGRhdGErKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIEZpbmQgaG9yaXpvbnRhbCBzdWJyZWN0IGZpcnN0CisgICAgICBQSVhFTF9UKiBwdHIgPSBkYXRhKzE7CisgICAgICBQSVhFTF9UKiBlb2wgPSBkYXRhK3cteDsKKyAgICAgIHdoaWxlIChwdHIgPCBlb2wgJiYgKnB0ciA9PSAqZGF0YSkgcHRyKys7CisgICAgICBpbnQgc3cgPSBwdHIgLSBkYXRhOworCisgICAgICBwdHIgPSBkYXRhICsgdzsKKyAgICAgIGludCBzaCA9IDE7CisgICAgICB3aGlsZSAoc2ggPCBoLXkpIHsKKyAgICAgICAgZW9sID0gcHRyICsgc3c7CisgICAgICAgIHdoaWxlIChwdHIgPCBlb2wpCisgICAgICAgICAgaWYgKCpwdHIrKyAhPSAqZGF0YSkgZ290byBlbmRPZkhvcml6U3VicmVjdDsKKyAgICAgICAgcHRyICs9IHcgLSBzdzsKKyAgICAgICAgc2grKzsKKyAgICAgIH0KKyAgICBlbmRPZkhvcml6U3VicmVjdDoKKworICAgICAgLy8gRmluZCB2ZXJ0aWNhbCBzdWJyZWN0CisgICAgICBpbnQgdmg7CisgICAgICBmb3IgKHZoID0gc2g7IHZoIDwgaC15OyB2aCsrKQorICAgICAgICBpZiAoZGF0YVt2aCp3XSAhPSAqZGF0YSkgYnJlYWs7CisKKyAgICAgIGlmICh2aCAhPSBzaCkgeworICAgICAgICBwdHIgPSBkYXRhKzE7CisgICAgICAgIGludCB2dzsKKyAgICAgICAgZm9yICh2dyA9IDE7IHZ3IDwgc3c7IHZ3KyspIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZoOyBpKyspCisgICAgICAgICAgICBpZiAocHRyW2kqd10gIT0gKmRhdGEpIGdvdG8gZW5kT2ZWZXJ0U3VicmVjdDsKKyAgICAgICAgICBwdHIrKzsKKyAgICAgICAgfQorICAgICAgZW5kT2ZWZXJ0U3VicmVjdDoKKworICAgICAgICAvLyBJZiB2ZXJ0aWNhbCBzdWJyZWN0IGJpZ2dlciB0aGFuIGhvcml6b250YWwgdGhlbiB1c2UgdGhhdC4KKyAgICAgICAgaWYgKHN3KnNoIDwgdncqdmgpIHsKKyAgICAgICAgICBzdyA9IHZ3OworICAgICAgICAgIHNoID0gdmg7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgblN1YnJlY3RzKys7CisgICAgICBvcy0+V1JJVEVfUElYRUwoKmRhdGEpOworICAgICAgb3MtPndyaXRlVTE2KHgpOworICAgICAgb3MtPndyaXRlVTE2KHkpOworICAgICAgb3MtPndyaXRlVTE2KHN3KTsKKyAgICAgIG9zLT53cml0ZVUxNihzaCk7CisgICAgICBpZiAob3MtPmxlbmd0aCgpID4gb2xkTGVuICsgdypoKSByZXR1cm4gLTE7CisKKyAgICAgIHB0ciA9IGRhdGErdzsKKyAgICAgIFBJWEVMX1QqIGVvciA9IGRhdGErdypzaDsKKyAgICAgIHdoaWxlIChwdHIgPCBlb3IpIHsKKyAgICAgICAgZW9sID0gcHRyICsgc3c7CisgICAgICAgIHdoaWxlIChwdHIgPCBlb2wpICpwdHIrKyA9IGJnOworICAgICAgICBwdHIgKz0gdyAtIHN3OworICAgICAgfQorICAgICAgeCArPSBzdzsKKyAgICAgIGRhdGEgKz0gc3c7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG5TdWJyZWN0czsKK30KKworI3VuZGVmIFBJWEVMX1QKKyN1bmRlZiBXUklURV9QSVhFTAorI3VuZGVmIFJSRV9FTkNPREUKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvc2VjVHlwZXMuY3h4IGIvY29tbW9uL3JmYi9zZWNUeXBlcy5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwZDg0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvc2VjVHlwZXMuY3h4CkBAIC0wLDAgKzEsNzMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgc3RyY2FzZWNtcCBfc3RyaWNtcAorI2VuZGlmCisjaW5jbHVkZSA8cmZiL3NlY1R5cGVzLmg+CisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKworaW50IHJmYjo6c2VjVHlwZU51bShjb25zdCBjaGFyKiBuYW1lKQoreworICBpZiAoc3RyY2FzZWNtcChuYW1lLCAiTm9uZSIpID09IDApICAgICAgIHJldHVybiBzZWNUeXBlTm9uZTsKKyAgaWYgKHN0cmNhc2VjbXAobmFtZSwgIlZuY0F1dGgiKSA9PSAwKSAgICByZXR1cm4gc2VjVHlwZVZuY0F1dGg7CisgIGlmIChzdHJjYXNlY21wKG5hbWUsICJUaWdodCIpID09IDApICAgICAgcmV0dXJuIHNlY1R5cGVUaWdodDsKKyAgaWYgKHN0cmNhc2VjbXAobmFtZSwgIlJBMiIpID09IDApICAgICAgICByZXR1cm4gc2VjVHlwZVJBMjsKKyAgaWYgKHN0cmNhc2VjbXAobmFtZSwgIlJBMm5lIikgPT0gMCkgICAgICByZXR1cm4gc2VjVHlwZVJBMm5lOworICBpZiAoc3RyY2FzZWNtcChuYW1lLCAiU1NQSSIpID09IDApICAgICAgIHJldHVybiBzZWNUeXBlU1NQSTsKKyAgaWYgKHN0cmNhc2VjbXAobmFtZSwgIlNTUEluZSIpID09IDApICAgICAgIHJldHVybiBzZWNUeXBlU1NQSW5lOworICByZXR1cm4gc2VjVHlwZUludmFsaWQ7Cit9CisKK2NvbnN0IGNoYXIqIHJmYjo6c2VjVHlwZU5hbWUoaW50IG51bSkKK3sKKyAgc3dpdGNoIChudW0pIHsKKyAgY2FzZSBzZWNUeXBlTm9uZTogICAgICAgcmV0dXJuICJOb25lIjsKKyAgY2FzZSBzZWNUeXBlVm5jQXV0aDogICAgcmV0dXJuICJWbmNBdXRoIjsKKyAgY2FzZSBzZWNUeXBlVGlnaHQ6ICAgICAgcmV0dXJuICJUaWdodCI7CisgIGNhc2Ugc2VjVHlwZVJBMjogICAgICAgIHJldHVybiAiUkEyIjsKKyAgY2FzZSBzZWNUeXBlUkEybmU6ICAgICAgcmV0dXJuICJSQTJuZSI7CisgIGNhc2Ugc2VjVHlwZVNTUEk6ICAgICAgIHJldHVybiAiU1NQSSI7CisgIGNhc2Ugc2VjVHlwZVNTUEluZTogICAgIHJldHVybiAiU1NQSW5lIjsKKyAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuICJbdW5rbm93biBzZWNUeXBlXSI7CisgIH0KK30KKworYm9vbCByZmI6OnNlY1R5cGVFbmNyeXB0cyhpbnQgbnVtKQoreworICBzd2l0Y2ggKG51bSkgeworICBjYXNlIHNlY1R5cGVSQTI6CisgIGNhc2Ugc2VjVHlwZVNTUEk6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3N0ZDo6bGlzdDxpbnQ+IHJmYjo6cGFyc2VTZWNUeXBlcyhjb25zdCBjaGFyKiB0eXBlc18pCit7CisgIHN0ZDo6bGlzdDxpbnQ+IHJlc3VsdDsKKyAgQ2hhckFycmF5IHR5cGVzKHN0ckR1cCh0eXBlc18pKSwgdHlwZTsKKyAgd2hpbGUgKHR5cGVzLmJ1ZikgeworICAgIHN0clNwbGl0KHR5cGVzLmJ1ZiwgJywnLCAmdHlwZS5idWYsICZ0eXBlcy5idWYpOworICAgIGludCB0eXBlTnVtID0gc2VjVHlwZU51bSh0eXBlLmJ1Zik7CisgICAgaWYgKHR5cGVOdW0gIT0gc2VjVHlwZUludmFsaWQpCisgICAgICByZXN1bHQucHVzaF9iYWNrKHR5cGVOdW0pOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL3NlY1R5cGVzLmggYi9jb21tb24vcmZiL3NlY1R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmNzgzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvc2VjVHlwZXMuaApAQCAtMCwwICsxLDU0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gc2VjVHlwZXMuaCAtIGNvbnN0YW50cyBmb3IgdGhlIHZhcmlvdXMgc2VjdXJpdHkgdHlwZXMuCisvLworCisjaWZuZGVmIF9fUkZCX1NFQ1RZUEVTX0hfXworI2RlZmluZSBfX1JGQl9TRUNUWVBFU19IX18KKworI2luY2x1ZGUgPGxpc3Q+CisKK25hbWVzcGFjZSByZmIgeworICBjb25zdCBpbnQgc2VjVHlwZUludmFsaWQgPSAwOworICBjb25zdCBpbnQgc2VjVHlwZU5vbmUgICAgPSAxOworICBjb25zdCBpbnQgc2VjVHlwZVZuY0F1dGggPSAyOworCisgIGNvbnN0IGludCBzZWNUeXBlUkEyICAgICA9IDU7CisgIGNvbnN0IGludCBzZWNUeXBlUkEybmUgICA9IDY7CisKKyAgY29uc3QgaW50IHNlY1R5cGVTU1BJICAgID0gNzsKKyAgY29uc3QgaW50IHNlY1R5cGVTU1BJbmUgICAgPSA4OworCisgIGNvbnN0IGludCBzZWNUeXBlVGlnaHQgICA9IDE2OworICBjb25zdCBpbnQgc2VjVHlwZVVsdHJhICAgPSAxNzsKKyAgY29uc3QgaW50IHNlY1R5cGVUTFMgICAgID0gMTg7CisKKyAgLy8gcmVzdWx0IHR5cGVzCisKKyAgY29uc3QgaW50IHNlY1Jlc3VsdE9LID0gMDsKKyAgY29uc3QgaW50IHNlY1Jlc3VsdEZhaWxlZCA9IDE7CisgIGNvbnN0IGludCBzZWNSZXN1bHRUb29NYW55ID0gMjsgLy8gZGVwcmVjYXRlZAorCisgIGNvbnN0IGNoYXIqIHNlY1R5cGVOYW1lKGludCBudW0pOworICBpbnQgc2VjVHlwZU51bShjb25zdCBjaGFyKiBuYW1lKTsKKyAgYm9vbCBzZWNUeXBlRW5jcnlwdHMoaW50IG51bSk7CisgIHN0ZDo6bGlzdDxpbnQ+IHBhcnNlU2VjVHlwZXMoY29uc3QgY2hhciogdHlwZXMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvdGlnaHREZWNvZGUuaCBiL2NvbW1vbi9yZmIvdGlnaHREZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDBjNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi90aWdodERlY29kZS5oCkBAIC0wLDAgKzEsNDEyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBDb25zdGFudGluIEthcGxpbnNreS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBDZW5kaW8gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vCisvLyBUaWdodCBkZWNvZGluZyBmdW5jdGlvbnMuCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBhZnRlciBoYXZpbmcgc2V0IHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorLy8gQlBQICAgICAgICAgICAgICAgIC0gOCwgMTYgb3IgMzIKKy8vIEVYVFJBX0FSR1MgICAgICAgICAtIG9wdGlvbmFsIGV4dHJhIGFyZ3VtZW50cworLy8gRklMTF9SRUNUICAgICAgICAgIC0gZmlsbCBhIHJlY3RhbmdsZSB3aXRoIGEgc2luZ2xlIGNvbG9yCisvLyBJTUFHRV9SRUNUICAgICAgICAgLSBkcmF3IGEgcmVjdGFuZ2xlIG9mIHBpeGVsIGRhdGEgZnJvbSBhIGJ1ZmZlcgorCisjaW5jbHVkZSA8cmRyL0luU3RyZWFtLmg+CisjaW5jbHVkZSA8cmRyL1psaWJJblN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKy8vIENPTkNBVDJFIGNvbmNhdGVuYXRlcyBpdHMgYXJndW1lbnRzLCBleHBhbmRpbmcgdGhlbSBpZiB0aGV5IGFyZSBtYWNyb3MKKworI2lmbmRlZiBDT05DQVQyRQorI2RlZmluZSBDT05DQVQyKGEsYikgYSMjYgorI2RlZmluZSBDT05DQVQyRShhLGIpIENPTkNBVDIoYSxiKQorI2VuZGlmCisKKyNkZWZpbmUgUElYRUxfVCByZHI6OkNPTkNBVDJFKFUsQlBQKQorI2RlZmluZSBSRUFEX1BJWEVMIENPTkNBVDJFKHJlYWRPcGFxdWUsQlBQKQorI2RlZmluZSBUSUdIVF9ERUNPREUgQ09OQ0FUMkUodGlnaHREZWNvZGUsQlBQKQorCisjZGVmaW5lIFRJR0hUX01JTl9UT19DT01QUkVTUyAxMgorc3RhdGljIGJvb2wgRGVjb21wcmVzc0pwZWdSZWN0KGNvbnN0IFJlY3QmIHIsIHJkcjo6SW5TdHJlYW0qIGlzLAorCQkJICAgICAgIFBJWEVMX1QqIGJ1ZiwgQ01zZ0hhbmRsZXIqIGhhbmRsZXIpOworc3RhdGljIHZvaWQgRmlsdGVyR3JhZGllbnQoY29uc3QgUmVjdCYgciwgcmRyOjpJblN0cmVhbSogaXMsIGludCBkYXRhU2l6ZSwKKwkJCSAgIFBJWEVMX1QqIGJ1ZiwgQ01zZ0hhbmRsZXIqIGhhbmRsZXIpOworI2lmIEJQUCA9PSAzMgorc3RhdGljIHZvaWQgRmlsdGVyR3JhZGllbnQyNChjb25zdCBSZWN0JiByLCByZHI6OkluU3RyZWFtKiBpcywgaW50IGRhdGFTaXplLAorCQkJICAgICBQSVhFTF9UKiBidWYsIENNc2dIYW5kbGVyKiBoYW5kbGVyKTsKKyNlbmRpZgorCisvLyBNYWluIGZ1bmN0aW9uIGltcGxlbWVudGluZyBUaWdodCBkZWNvZGVyCisKK3ZvaWQgVElHSFRfREVDT0RFIChjb25zdCBSZWN0JiByLCByZHI6OkluU3RyZWFtKiBpcywKKyAgICAgICAgICAgICAgICAgICByZHI6OlpsaWJJblN0cmVhbSB6aXNbXSwgUElYRUxfVCogYnVmCisjaWZkZWYgRVhUUkFfQVJHUworICAgICAgICAgICAgICAgICAgICAgICwgRVhUUkFfQVJHUworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgKQoreworICByZHI6OlU4ICpieXRlYnVmID0gKHJkcjo6VTgqKSBidWY7CisgIGJvb2wgY3V0WmVyb3MgPSBmYWxzZTsKKyAgY29uc3QgcmZiOjpQaXhlbEZvcm1hdCYgbXlGb3JtYXQgPSBoYW5kbGVyLT5jcC5wZigpOworI2lmIEJQUCA9PSAzMgorICBpZiAobXlGb3JtYXQuZGVwdGggPT0gMjQgJiYgbXlGb3JtYXQucmVkTWF4ID09IDB4RkYgJiYKKyAgICAgIG15Rm9ybWF0LmdyZWVuTWF4ID09IDB4RkYgJiYgbXlGb3JtYXQuYmx1ZU1heCA9PSAweEZGKSB7CisgICAgY3V0WmVyb3MgPSB0cnVlOworICB9IAorI2VuZGlmCisKKyAgcmRyOjpVOCBjb21wX2N0bCA9IGlzLT5yZWFkVTgoKTsKKworICAvLyBGbHVzaCB6bGliIHN0cmVhbXMgaWYgd2UgYXJlIHRvbGQgYnkgdGhlIHNlcnZlciB0byBkbyBzby4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBpZiAoY29tcF9jdGwgJiAxKSB7CisgICAgICB6aXNbaV0ucmVzZXQoKTsKKyAgICB9CisgICAgY29tcF9jdGwgPj49IDE7CisgIH0KKworICAvLyAiRmlsbCIgY29tcHJlc3Npb24gdHlwZS4KKyAgaWYgKGNvbXBfY3RsID09IHJmYlRpZ2h0RmlsbCkgeworICAgIFBJWEVMX1QgcGl4OworICAgIGlmIChjdXRaZXJvcykgeworICAgICAgaXMtPnJlYWRCeXRlcyhieXRlYnVmLCAzKTsKKyAgICAgIHBpeCA9IFJHQjI0X1RPX1BJWEVMMzIoYnl0ZWJ1ZlswXSwgYnl0ZWJ1ZlsxXSwgYnl0ZWJ1ZlsyXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBpeCA9IGlzLT5SRUFEX1BJWEVMKCk7CisgICAgfQorICAgIEZJTExfUkVDVChyLCBwaXgpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vICJKUEVHIiBjb21wcmVzc2lvbiB0eXBlLgorICBpZiAoY29tcF9jdGwgPT0gcmZiVGlnaHRKcGVnKSB7CisgICAgRGVjb21wcmVzc0pwZWdSZWN0KHIsIGlzLCBidWYsIGhhbmRsZXIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFF1aXQgb24gdW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZS4KKyAgaWYgKGNvbXBfY3RsID4gcmZiVGlnaHRNYXhTdWJlbmNvZGluZykgeworICAgIHRocm93IEV4Y2VwdGlvbigiVGlnaHREZWNvZGVyOiBiYWQgc3ViZW5jb2RpbmcgdmFsdWUgcmVjZWl2ZWQiKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyAiQmFzaWMiIGNvbXByZXNzaW9uIHR5cGUuCisgIGludCBwYWxTaXplID0gMDsKKyAgc3RhdGljIFBJWEVMX1QgcGFsZXR0ZVsyNTZdOworICBib29sIHVzZUdyYWRpZW50ID0gZmFsc2U7CisKKyAgaWYgKChjb21wX2N0bCAmIHJmYlRpZ2h0RXhwbGljaXRGaWx0ZXIpICE9IDApIHsKKyAgICByZHI6OlU4IGZpbHRlcklkID0gaXMtPnJlYWRVOCgpOworCisgICAgc3dpdGNoIChmaWx0ZXJJZCkgeworICAgIGNhc2UgcmZiVGlnaHRGaWx0ZXJQYWxldHRlOiAKKyAgICAgIHBhbFNpemUgPSBpcy0+cmVhZFU4KCkgKyAxOworICAgICAgaWYgKGN1dFplcm9zKSB7CisJcmRyOjpVOCAqdGlnaHRQYWxldHRlID0gKHJkcjo6VTgqKSBwYWxldHRlOworCWlzLT5yZWFkQnl0ZXModGlnaHRQYWxldHRlLCBwYWxTaXplKjMpOworCWZvciAoaW50IGkgPSBwYWxTaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkgIHBhbGV0dGVbaV0gPSBSR0IyNF9UT19QSVhFTDMyKHRpZ2h0UGFsZXR0ZVtpKjNdLAorCQkJCQl0aWdodFBhbGV0dGVbaSozKzFdLAorCQkJCQl0aWdodFBhbGV0dGVbaSozKzJdKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKwlmb3IgKGludCBpID0gMDsgaSA8IHBhbFNpemU7IGkrKykKKwkgIHBhbGV0dGVbaV0gPSBpcy0+UkVBRF9QSVhFTCgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSByZmJUaWdodEZpbHRlckdyYWRpZW50OiAKKyAgICAgIHVzZUdyYWRpZW50ID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcmZiVGlnaHRGaWx0ZXJDb3B5OgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IEV4Y2VwdGlvbigiVGlnaHREZWNvZGVyOiB1bmtub3duIGZpbHRlciBjb2RlIHJlY2VpdmVkIik7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgaW50IGJwcHAgPSBCUFA7CisgIGlmIChwYWxTaXplICE9IDApIHsKKyAgICBicHBwID0gKHBhbFNpemUgPD0gMikgPyAxIDogODsKKyAgfSBlbHNlIGlmIChjdXRaZXJvcykgeworICAgIGJwcHAgPSAyNDsKKyAgfQorCisgIC8vIERldGVybWluZSBpZiB0aGUgZGF0YSBzaG91bGQgYmUgZGVjb21wcmVzc2VkIG9yIGp1c3QgY29waWVkLgorICBpbnQgcm93U2l6ZSA9IChyLndpZHRoKCkgKiBicHBwICsgNykgLyA4OworICBpbnQgZGF0YVNpemUgPSByLmhlaWdodCgpICogcm93U2l6ZTsKKyAgaW50IHN0cmVhbUlkID0gLTE7CisgIHJkcjo6SW5TdHJlYW0gKmlucHV0OworICBpZiAoZGF0YVNpemUgPCBUSUdIVF9NSU5fVE9fQ09NUFJFU1MpIHsKKyAgICBpbnB1dCA9IGlzOworICB9IGVsc2UgeworICAgIGludCBsZW5ndGggPSBpcy0+cmVhZENvbXBhY3RMZW5ndGgoKTsKKyAgICBzdHJlYW1JZCA9IGNvbXBfY3RsICYgMHgwMzsKKyAgICB6aXNbc3RyZWFtSWRdLnNldFVuZGVybHlpbmcoaXMsIGxlbmd0aCk7CisgICAgaW5wdXQgPSAmemlzW3N0cmVhbUlkXTsKKyAgfQorCisgIGlmIChwYWxTaXplID09IDApIHsKKyAgICAvLyBUcnVlY29sb3IgZGF0YQorICAgIGlmICh1c2VHcmFkaWVudCkgeworI2lmIEJQUCA9PSAzMgorICAgICAgaWYgKGN1dFplcm9zKSB7CisJRmlsdGVyR3JhZGllbnQyNChyLCBpbnB1dCwgZGF0YVNpemUsIGJ1ZiwgaGFuZGxlcik7CisgICAgICB9IGVsc2UgCisjZW5kaWYKKwl7CisJICBGaWx0ZXJHcmFkaWVudChyLCBpbnB1dCwgZGF0YVNpemUsIGJ1ZiwgaGFuZGxlcik7CisJfQorICAgIH0gZWxzZSB7CisgICAgICBpbnB1dC0+cmVhZEJ5dGVzKGJ1ZiwgZGF0YVNpemUpOyAKKyAgICAgIGlmIChjdXRaZXJvcykgeworCWZvciAoaW50IHAgPSByLmhlaWdodCgpICogci53aWR0aCgpIC0gMTsgcCA+PSAwOyBwLS0pIHsKKwkgIGJ1ZltwXSA9IFJHQjI0X1RPX1BJWEVMMzIoYnl0ZWJ1ZltwKjNdLAorCQkJCSAgICBieXRlYnVmW3AqMysxXSwKKwkJCQkgICAgYnl0ZWJ1ZltwKjMrMl0pOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IHgsIHksIGIsIHc7CisgICAgUElYRUxfVCAqcHRyID0gYnVmOworICAgIHJkcjo6VTggYml0czsKKyAgICBpZiAocGFsU2l6ZSA8PSAyKSB7CisgICAgICAvLyAyLWNvbG9yIHBhbGV0dGUKKyAgICAgIHcgPSAoci53aWR0aCgpICsgNykgLyA4OworICAgICAgZm9yICh5ID0gMDsgeSA8IHIuaGVpZ2h0KCk7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgci53aWR0aCgpIC8gODsgeCsrKSB7CisgICAgICAgICAgYml0cyA9IGlucHV0LT5yZWFkVTgoKTsKKyAgICAgICAgICBmb3IgKGIgPSA3OyBiID49IDA7IGItLSkgeworICAgICAgICAgICAgKnB0cisrID0gcGFsZXR0ZVtiaXRzID4+IGIgJiAxXTsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoci53aWR0aCgpICUgOCAhPSAwKSB7CisgICAgICAgICAgYml0cyA9IGlucHV0LT5yZWFkVTgoKTsKKyAgICAgICAgICBmb3IgKGIgPSA3OyBiID49IDggLSByLndpZHRoKCkgJSA4OyBiLS0pIHsKKyAgICAgICAgICAgICpwdHIrKyA9IHBhbGV0dGVbYml0cyA+PiBiICYgMV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIDI1Ni1jb2xvciBwYWxldHRlCisgICAgICBmb3IgKHkgPSAwOyB5IDwgci5oZWlnaHQoKTsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCByLndpZHRoKCk7IHgrKykgeworICAgICAgICAgICpwdHIrKyA9IHBhbGV0dGVbaW5wdXQtPnJlYWRVOCgpXTsKKwl9CisgICAgICB9CisgICAgfQorICB9CisKKyAgSU1BR0VfUkVDVChyLCBidWYpOworCisgIGlmIChzdHJlYW1JZCAhPSAtMSkgeworICAgIHppc1tzdHJlYW1JZF0ucmVzZXQoKTsKKyAgfQorfQorCitzdGF0aWMgYm9vbAorRGVjb21wcmVzc0pwZWdSZWN0KGNvbnN0IFJlY3QmIHIsIHJkcjo6SW5TdHJlYW0qIGlzLAorCQkgICBQSVhFTF9UKiBidWYsIENNc2dIYW5kbGVyKiBoYW5kbGVyKQoreworICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisgIFBJWEVMX1QgKnBpeGVsUHRyID0gYnVmOworICBzdGF0aWMgcmRyOjpVOCBzY2FubGluZV9idWZmZXJbVElHSFRfTUFYX1dJRFRIKjNdOworICBKU0FNUFJPVyBzY2FubGluZSA9IHNjYW5saW5lX2J1ZmZlcjsKKworICAvLyBSZWFkIGxlbmd0aAorICBpbnQgY29tcHJlc3NlZExlbiA9IGlzLT5yZWFkQ29tcGFjdExlbmd0aCgpOworICBpZiAoY29tcHJlc3NlZExlbiA8PSAwKSB7CisgICAgICB0aHJvdyBFeGNlcHRpb24oIkluY29ycmVjdCBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci5cbiIpOworICB9CisKKyAgLy8gQWxsb2NhdGUgbmV0YnVmIGFuZCByZWFkIGluIGRhdGEKKyAgcmRyOjpVOCogbmV0YnVmID0gbmV3IHJkcjo6VThbY29tcHJlc3NlZExlbl07CisgIGlmICghbmV0YnVmKSB7CisgICAgdGhyb3cgRXhjZXB0aW9uKCJyZmI6OnRpZ2h0RGVjb2RlIHVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIiKTsKKyAgfQorICBpcy0+cmVhZEJ5dGVzKG5ldGJ1ZiwgY29tcHJlc3NlZExlbik7CisKKyAgLy8gU2V0IHVwIEpQRUcgZGVjb21wcmVzc2lvbgorICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7CisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgSnBlZ1NldFNyY01hbmFnZXIoJmNpbmZvLCAoY2hhciopbmV0YnVmLCBjb21wcmVzc2VkTGVuKTsKKyAganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworICBjaW5mby5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworCisgIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOworICBpZiAoY2luZm8ub3V0cHV0X3dpZHRoICE9ICh1bnNpZ25lZClyLndpZHRoKCkgfHwgY2luZm8ub3V0cHV0X2hlaWdodCAhPSAodW5zaWduZWQpci5oZWlnaHQoKSB8fAorICAgICAgY2luZm8ub3V0cHV0X2NvbXBvbmVudHMgIT0gMykgeworICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbigiVGlnaHQgRW5jb2Rpbmc6IFdyb25nIEpQRUcgZGF0YSByZWNlaXZlZC5cbiIpOworICB9CisKKyAgLy8gRGVjb21wcmVzcworICBjb25zdCByZmI6OlBpeGVsRm9ybWF0JiBteUZvcm1hdCA9IGhhbmRsZXItPmNwLnBmKCk7CisgIHdoaWxlIChjaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby5vdXRwdXRfaGVpZ2h0KSB7CisgICAganBlZ19yZWFkX3NjYW5saW5lcygmY2luZm8sICZzY2FubGluZSwgMSk7CisgICAgaWYgKGpwZWdFcnJvcikgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZm9yIChpbnQgZHggPSAwOyBkeCA8IHIud2lkdGgoKTsgZHgrKykgeworICAgICAgKnBpeGVsUHRyKysgPSAKKwlSR0IyNF9UT19QSVhFTChzY2FubGluZVtkeCozXSwgc2NhbmxpbmVbZHgqMysxXSwgc2NhbmxpbmVbZHgqMysyXSk7CisgICAgfQorICB9CisKKyAgSU1BR0VfUkVDVChyLCBidWYpOworCisgIGlmICghanBlZ0Vycm9yKSB7CisgICAganBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOworICB9CisKKyAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKworICBkZWxldGUgW10gbmV0YnVmOworCisgIHJldHVybiAhanBlZ0Vycm9yOworfQorCisjaWYgQlBQID09IDMyCisKK3N0YXRpYyB2b2lkCitGaWx0ZXJHcmFkaWVudDI0KGNvbnN0IFJlY3QmIHIsIHJkcjo6SW5TdHJlYW0qIGlzLCBpbnQgZGF0YVNpemUsCisJCSBQSVhFTF9UKiBidWYsIENNc2dIYW5kbGVyKiBoYW5kbGVyKQoreworICBpbnQgeCwgeSwgYzsKKyAgc3RhdGljIHJkcjo6VTggcHJldlJvd1tUSUdIVF9NQVhfV0lEVEgqM107CisgIHN0YXRpYyByZHI6OlU4IHRoaXNSb3dbVElHSFRfTUFYX1dJRFRIKjNdOworICByZHI6OlU4IHBpeFszXTsgCisgIGludCBlc3RbM107IAorCisgIG1lbXNldChwcmV2Um93LCAwLCBzaXplb2YocHJldlJvdykpOworCisgIC8vIEFsbG9jYXRlIG5ldGJ1ZiBhbmQgcmVhZCBpbiBkYXRhCisgIHJkcjo6VTggKm5ldGJ1ZiA9IG5ldyByZHI6OlU4W2RhdGFTaXplXTsKKyAgaWYgKCFuZXRidWYpIHsKKyAgICB0aHJvdyBFeGNlcHRpb24oInJmYjo6dGlnaHREZWNvZGUgdW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciIpOworICB9CisgIGlzLT5yZWFkQnl0ZXMobmV0YnVmLCBkYXRhU2l6ZSk7CisKKyAgLy8gU2V0IHVwIHNob3J0Y3V0IHZhcmlhYmxlcworICBjb25zdCByZmI6OlBpeGVsRm9ybWF0JiBteUZvcm1hdCA9IGhhbmRsZXItPmNwLnBmKCk7CisgIGludCByZWN0SGVpZ2h0ID0gci5oZWlnaHQoKTsKKyAgaW50IHJlY3RXaWR0aCA9IHIud2lkdGgoKTsKKworICBmb3IgKHkgPSAwOyB5IDwgcmVjdEhlaWdodDsgeSsrKSB7CisgICAgLyogRmlyc3QgcGl4ZWwgaW4gYSByb3cgKi8KKyAgICBmb3IgKGMgPSAwOyBjIDwgMzsgYysrKSB7CisgICAgICBwaXhbY10gPSBuZXRidWZbeSpyZWN0V2lkdGgqMytjXSArIHByZXZSb3dbY107CisgICAgICB0aGlzUm93W2NdID0gcGl4W2NdOworICAgIH0KKyAgICBidWZbeSpyZWN0V2lkdGhdID0gUkdCMjRfVE9fUElYRUwzMihwaXhbMF0sIHBpeFsxXSwgcGl4WzJdKTsKKworICAgIC8qIFJlbWFpbmluZyBwaXhlbHMgb2YgYSByb3cgKi8KKyAgICBmb3IgKHggPSAxOyB4IDwgcmVjdFdpZHRoOyB4KyspIHsKKyAgICAgIGZvciAoYyA9IDA7IGMgPCAzOyBjKyspIHsKKwllc3RbY10gPSBwcmV2Um93W3gqMytjXSArIHBpeFtjXSAtIHByZXZSb3dbKHgtMSkqMytjXTsKKwlpZiAoZXN0W2NdID4gMHhmZikgeworCSAgZXN0W2NdID0gMHhmZjsKKwl9IGVsc2UgaWYgKGVzdFtjXSA8IDApIHsKKwkgIGVzdFtjXSA9IDA7CisJfQorCXBpeFtjXSA9IG5ldGJ1ZlsoeSpyZWN0V2lkdGgreCkqMytjXSArIGVzdFtjXTsKKwl0aGlzUm93W3gqMytjXSA9IHBpeFtjXTsKKyAgICAgIH0KKyAgICAgIGJ1Zlt5KnJlY3RXaWR0aCt4XSA9IFJHQjI0X1RPX1BJWEVMMzIocGl4WzBdLCBwaXhbMV0sIHBpeFsyXSk7CisgICAgfQorCisgICAgbWVtY3B5KHByZXZSb3csIHRoaXNSb3csIHNpemVvZihwcmV2Um93KSk7CisgIH0KKworICBkZWxldGUgW10gbmV0YnVmOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQKK0ZpbHRlckdyYWRpZW50KGNvbnN0IFJlY3QmIHIsIHJkcjo6SW5TdHJlYW0qIGlzLCBpbnQgZGF0YVNpemUsCisJICAgICAgIFBJWEVMX1QqIGJ1ZiwgQ01zZ0hhbmRsZXIqIGhhbmRsZXIpCit7CisgIGludCB4LCB5LCBjOworICBzdGF0aWMgcmRyOjpVOCBwcmV2Um93W1RJR0hUX01BWF9XSURUSCpzaXplb2YoUElYRUxfVCldOworICBzdGF0aWMgcmRyOjpVOCB0aGlzUm93W1RJR0hUX01BWF9XSURUSCpzaXplb2YoUElYRUxfVCldOworICBpbnQgcGl4WzNdOyAKKyAgaW50IG1heFszXTsgCisgIGludCBzaGlmdFszXTsgCisgIGludCBlc3RbM107IAorCisgIG1lbXNldChwcmV2Um93LCAwLCBzaXplb2YocHJldlJvdykpOworCisgIC8vIEFsbG9jYXRlIG5ldGJ1ZiBhbmQgcmVhZCBpbiBkYXRhCisgIFBJWEVMX1QgKm5ldGJ1ZiA9IChQSVhFTF9UKiluZXcgcmRyOjpVOFtkYXRhU2l6ZV07CisgIGlmICghbmV0YnVmKSB7CisgICAgdGhyb3cgRXhjZXB0aW9uKCJyZmI6OnRpZ2h0RGVjb2RlIHVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIiKTsKKyAgfQorICBpcy0+cmVhZEJ5dGVzKG5ldGJ1ZiwgZGF0YVNpemUpOworCisgIC8vIFNldCB1cCBzaG9ydGN1dCB2YXJpYWJsZXMKKyAgY29uc3QgcmZiOjpQaXhlbEZvcm1hdCYgbXlGb3JtYXQgPSBoYW5kbGVyLT5jcC5wZigpOworICBtYXhbMF0gPSBteUZvcm1hdC5yZWRNYXg7IAorICBtYXhbMV0gPSBteUZvcm1hdC5ncmVlbk1heDsgCisgIG1heFsyXSA9IG15Rm9ybWF0LmJsdWVNYXg7IAorICBzaGlmdFswXSA9IG15Rm9ybWF0LnJlZFNoaWZ0OyAKKyAgc2hpZnRbMV0gPSBteUZvcm1hdC5ncmVlblNoaWZ0OyAKKyAgc2hpZnRbMl0gPSBteUZvcm1hdC5ibHVlU2hpZnQ7IAorICBpbnQgcmVjdEhlaWdodCA9IHIuaGVpZ2h0KCk7CisgIGludCByZWN0V2lkdGggPSByLndpZHRoKCk7CisKKyAgZm9yICh5ID0gMDsgeSA8IHJlY3RIZWlnaHQ7IHkrKykgeworICAgIC8qIEZpcnN0IHBpeGVsIGluIGEgcm93ICovCisgICAgZm9yIChjID0gMDsgYyA8IDM7IGMrKykgeworICAgICAgcGl4W2NdID0gKG5ldGJ1Zlt5KnJlY3RXaWR0aF0gPj4gc2hpZnRbY10pICsgcHJldlJvd1tjXSAmIG1heFtjXTsKKyAgICAgIHRoaXNSb3dbY10gPSBwaXhbY107CisgICAgfQorICAgIGJ1Zlt5KnJlY3RXaWR0aF0gPSBSR0JfVE9fUElYRUwocGl4WzBdLCBwaXhbMV0sIHBpeFsyXSk7CisKKyAgICAvKiBSZW1haW5pbmcgcGl4ZWxzIG9mIGEgcm93ICovCisgICAgZm9yICh4ID0gMTsgeCA8IHJlY3RXaWR0aDsgeCsrKSB7CisgICAgICBmb3IgKGMgPSAwOyBjIDwgMzsgYysrKSB7CisJZXN0W2NdID0gcHJldlJvd1t4KjMrY10gKyBwaXhbY10gLSBwcmV2Um93Wyh4LTEpKjMrY107CisJaWYgKGVzdFtjXSA+IG1heFtjXSkgeworCSAgZXN0W2NdID0gbWF4W2NdOworCX0gZWxzZSBpZiAoZXN0W2NdIDwgMCkgeworCSAgZXN0W2NdID0gMDsKKwl9CisJcGl4W2NdID0gKG5ldGJ1Zlt5KnJlY3RXaWR0aCt4XSA+PiBzaGlmdFtjXSkgKyBlc3RbY10gJiBtYXhbY107CisJdGhpc1Jvd1t4KjMrY10gPSBwaXhbY107CisgICAgICB9CisgICAgICBidWZbeSpyZWN0V2lkdGgreF0gPSBSR0JfVE9fUElYRUwocGl4WzBdLCBwaXhbMV0sIHBpeFsyXSk7CisgICAgfQorCisgICAgbWVtY3B5KHByZXZSb3csIHRoaXNSb3csIHNpemVvZihwcmV2Um93KSk7CisgIH0KKworICBkZWxldGUgW10gbmV0YnVmOworfQorCisjdW5kZWYgVElHSFRfTUlOX1RPX0NPTVBSRVNTCisjdW5kZWYgVElHSFRfREVDT0RFCisjdW5kZWYgUkVBRF9QSVhFTAorI3VuZGVmIFBJWEVMX1QKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvdGlnaHRFbmNvZGUuaCBiL2NvbW1vbi9yZmIvdGlnaHRFbmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWYwNzZlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi90aWdodEVuY29kZS5oCkBAIC0wLDAgKzEsNzIwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBDb25zdGFudGluIEthcGxpbnNreS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vCisvLyB0aWdodEVuY29kZS5oIC0gVGlnaHQgZW5jb2RpbmcgZnVuY3Rpb24uCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBhZnRlciBoYXZpbmcgc2V0IHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorLy8gQlBQICAgICAgICAgICAgICAgIC0gOCwgMTYgb3IgMzIKKy8vIEVYVFJBX0FSR1MgICAgICAgICAtIG9wdGlvbmFsIGV4dHJhIGFyZ3VtZW50cworLy8gR0VUX0lNQUdFX0lOVE9fQlVGIC0gZ2V0cyBhIHJlY3RhbmdsZSBvZiBwaXhlbCBkYXRhIGludG8gYSBidWZmZXIKKy8vCisKKyNpbmNsdWRlIDxyZHIvT3V0U3RyZWFtLmg+CisjaW5jbHVkZSA8cmRyL1psaWJPdXRTdHJlYW0uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIHJmYiB7CisKKy8vIENPTkNBVDJFIGNvbmNhdGVuYXRlcyBpdHMgYXJndW1lbnRzLCBleHBhbmRpbmcgdGhlbSBpZiB0aGV5IGFyZSBtYWNyb3MKKworI2lmbmRlZiBDT05DQVQyRQorI2RlZmluZSBDT05DQVQyKGEsYikgYSMjYgorI2RlZmluZSBDT05DQVQyRShhLGIpIENPTkNBVDIoYSxiKQorI2VuZGlmCisKKyNkZWZpbmUgUElYRUxfVCByZHI6OkNPTkNBVDJFKFUsQlBQKQorI2RlZmluZSBXUklURV9QSVhFTCBDT05DQVQyRSh3cml0ZU9wYXF1ZSxCUFApCisjZGVmaW5lIFRJR0hUX0VOQ09ERSBDT05DQVQyRSh0aWdodEVuY29kZSxCUFApCisjZGVmaW5lIFNXQVBfUElYRUwgQ09OQ0FUMkUoU1dBUCxCUFApCisjZGVmaW5lIEhBU0hfRlVOQ1RJT04gQ09OQ0FUMkUoSEFTSF9GVU5DLEJQUCkKKyNkZWZpbmUgUEFDS19QSVhFTFMgQ09OQ0FUMkUocGFja1BpeGVscyxCUFApCisjZGVmaW5lIERFVEVDVF9TTU9PVEhfSU1BR0UgQ09OQ0FUMkUoZGV0ZWN0U21vb3RoSW1hZ2UsQlBQKQorI2RlZmluZSBFTkNPREVfU09MSURfUkVDVCBDT05DQVQyRShlbmNvZGVTb2xpZFJlY3QsQlBQKQorI2RlZmluZSBFTkNPREVfRlVMTENPTE9SX1JFQ1QgQ09OQ0FUMkUoZW5jb2RlRnVsbENvbG9yUmVjdCxCUFApCisjZGVmaW5lIEVOQ09ERV9NT05PX1JFQ1QgQ09OQ0FUMkUoZW5jb2RlTW9ub1JlY3QsQlBQKQorI2RlZmluZSBFTkNPREVfSU5ERVhFRF9SRUNUIENPTkNBVDJFKGVuY29kZUluZGV4ZWRSZWN0LEJQUCkKKyNkZWZpbmUgUFJFUEFSRV9KUEVHX1JPVyBDT05DQVQyRShwcmVwYXJlSnBlZ1JvdyxCUFApCisjZGVmaW5lIEVOQ09ERV9KUEVHX1JFQ1QgQ09OQ0FUMkUoZW5jb2RlSnBlZ1JlY3QsQlBQKQorI2RlZmluZSBGSUxMX1BBTEVUVEUgQ09OQ0FUMkUoZmlsbFBhbGV0dGUsQlBQKQorCisjaWZuZGVmIFRJR0hUX09OQ0UKKyNkZWZpbmUgVElHSFRfT05DRQorCisvLworLy8gQy1zdHlsZSBzdHJ1Y3R1cmVzIHRvIHN0b3JlIHBhbGV0dGUgZW50cmllcyBhbmQgY29tcHJlc3Npb24gcGFyYW1lbnRlcy4KKy8vIFN1Y2ggY29kZSBwcm9iYWJseSBzaG91bGQgYmUgY29udmVydGVkIGludG8gQysrIGNsYXNzZXMuCisvLworCitzdHJ1Y3QgVElHSFRfQ09MT1JfTElTVCB7CisgIFRJR0hUX0NPTE9SX0xJU1QgKm5leHQ7CisgIGludCBpZHg7CisgIHJkcjo6VTMyIHJnYjsKK307CisKK3N0cnVjdCBUSUdIVF9QQUxFVFRFX0VOVFJZIHsKKyAgVElHSFRfQ09MT1JfTElTVCAqbGlzdE5vZGU7CisgIGludCBudW1QaXhlbHM7Cit9OworCitzdHJ1Y3QgVElHSFRfUEFMRVRURSB7CisgIFRJR0hUX1BBTEVUVEVfRU5UUlkgZW50cnlbMjU2XTsKKyAgVElHSFRfQ09MT1JfTElTVCAqaGFzaFsyNTZdOworICBUSUdIVF9DT0xPUl9MSVNUIGxpc3RbMjU2XTsKK307CisKKy8vIEZJWE1FOiBJcyBpdCByZWFsbHkgYSBnb29kIGlkZWEgdG8gdXNlIHN0YXRpYyB2YXJpYWJsZXMgZm9yIHRoaXM/CitzdGF0aWMgaW50IHNfZW5kaWFuTWlzbWF0Y2g7ICAgICAgLy8gbG9jYWwvcmVtb3RlIGZvcm1hdHMgZGlmZmVyIGluIGJ5dGUgb3JkZXIKK3N0YXRpYyBib29sIHNfcGFjazI0OyAgICAgICAgICAgICAvLyB1c2UgMjQtYml0IHBhY2tpbmcgZm9yIDMyLWJpdCBwaXhlbHMKK3N0YXRpYyBpbnQgc19ycywgc19ncywgc19iczsgICAgICAvLyBzaGlmdHMgZm9yIDI0LWJpdCBwaXhlbCBjb252ZXJzaW9uCisKKy8vIEZJWE1FOiBNYWtlIGEgc2VwYXJhdGUgY2xhc3MgZm9yIHBhbGV0dGUgb3BlcmF0aW9ucy4KK3N0YXRpYyBpbnQgc19wYWxNYXhDb2xvcnMsIHNfcGFsTnVtQ29sb3JzOworc3RhdGljIHJkcjo6VTMyIHNfbW9ub0JhY2tncm91bmQsIHNfbW9ub0ZvcmVncm91bmQ7CitzdGF0aWMgVElHSFRfUEFMRVRURSBzX3BhbGV0dGU7CisKKy8vCisvLyBTd2FwcGluZyBieXRlcyBpbiBwaXhlbHMuCisvLyBGSVhNRTogVXNlIGEgc29ydCBvZiBJbWFnZUdldHRlciB0aGF0IGRvZXMgbm90IGNvbnZlcnQgcGl4ZWwgZm9ybWF0PworLy8KKworI2lmbmRlZiBTV0FQMTYKKyNkZWZpbmUgU1dBUDE2KG4pICgoKChuKSAmIDB4ZmYpIDw8IDgpIHwgKCgobikgPj4gOCkgJiAweGZmKSkKKyNlbmRpZgorI2lmbmRlZiBTV0FQMzIKKyNkZWZpbmUgU1dBUDMyKG4pICgoKG4pID4+IDI0KSB8ICgoKG4pICYgMHgwMGZmMDAwMCkgPj4gOCkgfCBcCisgICAgICAgICAgICAgICAgICAgKCgobikgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgobikgPDwgMjQpKQorI2VuZGlmCisKKy8vCisvLyBGdW5jdGlvbnMgdG8gb3BlcmF0ZSBvbiBwYWxldHRlIHN0cnVjdHVyZXMuCisvLworCisjZGVmaW5lIEhBU0hfRlVOQzE2KHJnYikgKChpbnQpKCgocmdiID4+IDgpICsgcmdiKSAmIDB4RkYpKQorI2RlZmluZSBIQVNIX0ZVTkMzMihyZ2IpICgoaW50KSgoKHJnYiA+PiAxNikgKyAocmdiID4+IDgpKSAmIDB4RkYpKQorCitzdGF0aWMgdm9pZCBwYWxldHRlUmVzZXQodm9pZCkKK3sKKyAgc19wYWxOdW1Db2xvcnMgPSAwOworICBtZW1zZXQoc19wYWxldHRlLmhhc2gsIDAsIDI1NiAqIHNpemVvZihUSUdIVF9DT0xPUl9MSVNUICopKTsKK30KKworc3RhdGljIGludCBwYWxldHRlSW5zZXJ0KHJkcjo6VTMyIHJnYiwgaW50IG51bVBpeGVscywgaW50IGJwcCkKK3sKKyAgVElHSFRfQ09MT1JfTElTVCAqcG5vZGU7CisgIFRJR0hUX0NPTE9SX0xJU1QgKnByZXZfcG5vZGUgPSBOVUxMOworICBpbnQgaGFzaF9rZXksIGlkeCwgbmV3X2lkeCwgY291bnQ7CisKKyAgaGFzaF9rZXkgPSAoYnBwID09IDE2KSA/IEhBU0hfRlVOQzE2KHJnYikgOiBIQVNIX0ZVTkMzMihyZ2IpOworCisgIHBub2RlID0gc19wYWxldHRlLmhhc2hbaGFzaF9rZXldOworCisgIHdoaWxlIChwbm9kZSAhPSBOVUxMKSB7CisgICAgaWYgKHBub2RlLT5yZ2IgPT0gcmdiKSB7CisgICAgICAvLyBTdWNoIHBhbGV0dGUgZW50cnkgYWxyZWFkeSBleGlzdHMuCisgICAgICBuZXdfaWR4ID0gaWR4ID0gcG5vZGUtPmlkeDsKKyAgICAgIGNvdW50ID0gc19wYWxldHRlLmVudHJ5W2lkeF0ubnVtUGl4ZWxzICsgbnVtUGl4ZWxzOworICAgICAgaWYgKG5ld19pZHggJiYgc19wYWxldHRlLmVudHJ5W25ld19pZHgtMV0ubnVtUGl4ZWxzIDwgY291bnQpIHsKKyAgICAgICAgZG8geworICAgICAgICAgIHNfcGFsZXR0ZS5lbnRyeVtuZXdfaWR4XSA9IHNfcGFsZXR0ZS5lbnRyeVtuZXdfaWR4LTFdOworICAgICAgICAgIHNfcGFsZXR0ZS5lbnRyeVtuZXdfaWR4XS5saXN0Tm9kZS0+aWR4ID0gbmV3X2lkeDsKKyAgICAgICAgICBuZXdfaWR4LS07CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKG5ld19pZHggJiYKKyAgICAgICAgICBzX3BhbGV0dGUuZW50cnlbbmV3X2lkeC0xXS5udW1QaXhlbHMgPCBjb3VudCk7CisgICAgICAgIHNfcGFsZXR0ZS5lbnRyeVtuZXdfaWR4XS5saXN0Tm9kZSA9IHBub2RlOworICAgICAgICBwbm9kZS0+aWR4ID0gbmV3X2lkeDsKKyAgICAgIH0KKyAgICAgIHNfcGFsZXR0ZS5lbnRyeVtuZXdfaWR4XS5udW1QaXhlbHMgPSBjb3VudDsKKyAgICAgIHJldHVybiBzX3BhbE51bUNvbG9yczsKKyAgICB9CisgICAgcHJldl9wbm9kZSA9IHBub2RlOworICAgIHBub2RlID0gcG5vZGUtPm5leHQ7CisgIH0KKworICAvLyBDaGVjayBpZiBwYWxldHRlIGlzIGZ1bGwuCisgIGlmICggc19wYWxOdW1Db2xvcnMgPT0gMjU2IHx8IHNfcGFsTnVtQ29sb3JzID09IHNfcGFsTWF4Q29sb3JzICkgeworICAgIHNfcGFsTnVtQ29sb3JzID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIE1vdmUgcGFsZXR0ZSBlbnRyaWVzIHdpdGggbGVzc2VyIHBpeGVsIGNvdW50cy4KKyAgZm9yICggaWR4ID0gc19wYWxOdW1Db2xvcnM7CisgIGlkeCA+IDAgJiYgc19wYWxldHRlLmVudHJ5W2lkeC0xXS5udW1QaXhlbHMgPCBudW1QaXhlbHM7CisgIGlkeC0tICkgeworICAgIHNfcGFsZXR0ZS5lbnRyeVtpZHhdID0gc19wYWxldHRlLmVudHJ5W2lkeC0xXTsKKyAgICBzX3BhbGV0dGUuZW50cnlbaWR4XS5saXN0Tm9kZS0+aWR4ID0gaWR4OworICB9CisKKyAgLy8gQWRkIG5ldyBwYWxldHRlIGVudHJ5IGludG8gdGhlIGZyZWVkIHNsb3QuCisgIHBub2RlID0gJnNfcGFsZXR0ZS5saXN0W3NfcGFsTnVtQ29sb3JzXTsKKyAgaWYgKHByZXZfcG5vZGUgIT0gTlVMTCkgeworICAgIHByZXZfcG5vZGUtPm5leHQgPSBwbm9kZTsKKyAgfSBlbHNlIHsKKyAgICBzX3BhbGV0dGUuaGFzaFtoYXNoX2tleV0gPSBwbm9kZTsKKyAgfQorICBwbm9kZS0+bmV4dCA9IE5VTEw7CisgIHBub2RlLT5pZHggPSBpZHg7CisgIHBub2RlLT5yZ2IgPSByZ2I7CisgIHNfcGFsZXR0ZS5lbnRyeVtpZHhdLmxpc3ROb2RlID0gcG5vZGU7CisgIHNfcGFsZXR0ZS5lbnRyeVtpZHhdLm51bVBpeGVscyA9IG51bVBpeGVsczsKKworICByZXR1cm4gKCsrc19wYWxOdW1Db2xvcnMpOworfQorCisvLworLy8gQ29tcHJlc3MgdGhlIGRhdGEgKGJ1dCBkbyBub3QgcGVyZm9ybSBhY3R1YWwgY29tcHJlc3Npb24gaWYgdGhlIGRhdGEKKy8vIHNpemUgaXMgbGVzcyB0aGFuIFRJR0hUX01JTl9UT19DT01QUkVTUyBieXRlcy4KKy8vCisKK3N0YXRpYyB2b2lkIGNvbXByZXNzRGF0YShyZHI6Ok91dFN0cmVhbSAqb3MsIHJkcjo6WmxpYk91dFN0cmVhbSAqem9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbmd0aCwgaW50IHpsaWJMZXZlbCkKK3sKKyAgaWYgKGxlbmd0aCA8IFRJR0hUX01JTl9UT19DT01QUkVTUykgeworICAgIG9zLT53cml0ZUJ5dGVzKGJ1ZiwgbGVuZ3RoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBGSVhNRTogVXNpbmcgYSB0ZW1wb3JhcnkgTWVtT3V0U3RyZWFtIG1heSBiZSBub3QgZWZmaWNpZW50LgorICAgIC8vICAgICAgICBNYXliZSB1c2UgdGhlIHNhbWUgc3RhdGljIG9iamVjdCB1c2VkIGluIHRoZSBKUEVHIGNvZGVyPworICAgIHJkcjo6TWVtT3V0U3RyZWFtIG1lbV9vczsKKyAgICB6b3MtPnNldFVuZGVybHlpbmcoJm1lbV9vcyk7CisgICAgem9zLT5zZXRDb21wcmVzc2lvbkxldmVsKHpsaWJMZXZlbCk7CisgICAgem9zLT53cml0ZUJ5dGVzKGJ1ZiwgbGVuZ3RoKTsKKyAgICB6b3MtPmZsdXNoKCk7CisgICAgb3MtPndyaXRlQ29tcGFjdExlbmd0aChtZW1fb3MubGVuZ3RoKCkpOworICAgIG9zLT53cml0ZUJ5dGVzKG1lbV9vcy5kYXRhKCksIG1lbV9vcy5sZW5ndGgoKSk7CisgIH0KK30KKworLy8KKy8vIERlc3RpbmF0aW9uIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBKUEVHIGxpYnJhcnkuCisvLyBGSVhNRTogSW1wbGVtZW50IEpQRUcgY29tcHJlc3Npb24gaW4gbmV3IHJkcjo6SnBlZ091dFN0cmVhbSBjbGFzcy4KKy8vCisKKy8vIEZJWE1FOiBLZWVwaW5nIGEgTWVtT3V0U3RyZWFtIGluc3RhbmNlIG1heSBjb25zdW1lIHRvbyBtdWNoIHNwYWNlLgorcmRyOjpNZW1PdXRTdHJlYW0gc19qcGVnX29zOworCitzdGF0aWMgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHNfanBlZ0RzdE1hbmFnZXI7CitzdGF0aWMgSk9DVEVUICpzX2pwZWdEc3RCdWZmZXI7CitzdGF0aWMgc2l6ZV90IHNfanBlZ0RzdEJ1ZmZlckxlbjsKKworc3RhdGljIHZvaWQKK0pwZWdJbml0RGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHNfanBlZ19vcy5jbGVhcigpOworICBzX2pwZWdEc3RNYW5hZ2VyLm5leHRfb3V0cHV0X2J5dGUgPSBzX2pwZWdEc3RCdWZmZXI7CisgIHNfanBlZ0RzdE1hbmFnZXIuZnJlZV9pbl9idWZmZXIgPSBzX2pwZWdEc3RCdWZmZXJMZW47Cit9CisKK3N0YXRpYyBib29sZWFuCitKcGVnRW1wdHlPdXRwdXRCdWZmZXIoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHNfanBlZ19vcy53cml0ZUJ5dGVzKHNfanBlZ0RzdEJ1ZmZlciwgc19qcGVnRHN0QnVmZmVyTGVuKTsKKyAgc19qcGVnRHN0TWFuYWdlci5uZXh0X291dHB1dF9ieXRlID0gc19qcGVnRHN0QnVmZmVyOworICBzX2pwZWdEc3RNYW5hZ2VyLmZyZWVfaW5fYnVmZmVyID0gc19qcGVnRHN0QnVmZmVyTGVuOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorSnBlZ1Rlcm1EZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaW50IGRhdGFMZW4gPSBzX2pwZWdEc3RCdWZmZXJMZW4gLSBzX2pwZWdEc3RNYW5hZ2VyLmZyZWVfaW5fYnVmZmVyOworICBzX2pwZWdfb3Mud3JpdGVCeXRlcyhzX2pwZWdEc3RCdWZmZXIsIGRhdGFMZW4pOworfQorCitzdGF0aWMgdm9pZAorSnBlZ1NldERzdE1hbmFnZXIoal9jb21wcmVzc19wdHIgY2luZm8sIEpPQ1RFVCAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworICBzX2pwZWdEc3RCdWZmZXIgPSBidWY7CisgIHNfanBlZ0RzdEJ1ZmZlckxlbiA9IGJ1ZmxlbjsKKyAgc19qcGVnRHN0TWFuYWdlci5pbml0X2Rlc3RpbmF0aW9uID0gSnBlZ0luaXREZXN0aW5hdGlvbjsKKyAgc19qcGVnRHN0TWFuYWdlci5lbXB0eV9vdXRwdXRfYnVmZmVyID0gSnBlZ0VtcHR5T3V0cHV0QnVmZmVyOworICBzX2pwZWdEc3RNYW5hZ2VyLnRlcm1fZGVzdGluYXRpb24gPSBKcGVnVGVybURlc3RpbmF0aW9uOworICBjaW5mby0+ZGVzdCA9ICZzX2pwZWdEc3RNYW5hZ2VyOworfQorCisjZW5kaWYgIC8vICNpZm5kZWYgVElHSFRfT05DRQorCitzdGF0aWMgdm9pZCBFTkNPREVfU09MSURfUkVDVCAgICAgKHJkcjo6T3V0U3RyZWFtICpvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElYRUxfVCAqYnVmKTsKK3N0YXRpYyB2b2lkIEVOQ09ERV9GVUxMQ09MT1JfUkVDVCAocmRyOjpPdXRTdHJlYW0gKm9zLCByZHI6OlpsaWJPdXRTdHJlYW0gem9zWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVhFTF9UICpidWYsIGNvbnN0IFJlY3QmIHIpOworc3RhdGljIHZvaWQgRU5DT0RFX01PTk9fUkVDVCAgICAgIChyZHI6Ok91dFN0cmVhbSAqb3MsIHJkcjo6WmxpYk91dFN0cmVhbSB6b3NbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJWEVMX1QgKmJ1ZiwgY29uc3QgUmVjdCYgcik7CisjaWYgKEJQUCAhPSA4KQorc3RhdGljIHZvaWQgRU5DT0RFX0lOREVYRURfUkVDVCAgIChyZHI6Ok91dFN0cmVhbSAqb3MsIHJkcjo6WmxpYk91dFN0cmVhbSB6b3NbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJWEVMX1QgKmJ1ZiwgY29uc3QgUmVjdCYgcik7CitzdGF0aWMgdm9pZCBFTkNPREVfSlBFR19SRUNUICAgICAgKHJkcjo6T3V0U3RyZWFtICpvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElYRUxfVCAqYnVmLCBjb25zdCBQaXhlbEZvcm1hdCYgcGYsIGNvbnN0IFJlY3QmIHIpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIEZJTExfUEFMRVRURSAoUElYRUxfVCAqZGF0YSwgaW50IGNvdW50KTsKKworLy8KKy8vIENvbnZlcnQgMzItYml0IGNvbG9yIHNhbXBsZXMgaW50byAyNC1iaXQgY29sb3JzLCBpbiBwbGFjZS4KKy8vIFBlcmZvcm1zIHBhY2tpbmcgb25seSB3aGVuIHJlZE1heCwgZ3JlZW5NYXggYW5kIGJsdWVNYXggYXJlIGFsbCAyNTUuCisvLyBDb2xvciBjb21wb25lbnRzIGFyZSBhc3N1bWVkIHRvIGJlIGJ5dGUtYWxpZ25lZC4KKy8vCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFBBQ0tfUElYRUxTIChQSVhFTF9UICpidWYsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKyNpZiAoQlBQICE9IDMyKQorICByZXR1cm4gY291bnQgKiBzaXplb2YoUElYRUxfVCk7CisjZWxzZQorICBpZiAoIXNfcGFjazI0KQorICAgIHJldHVybiBjb3VudCAqIHNpemVvZihQSVhFTF9UKTsKKworICByZHI6OlUzMiBwaXg7CisgIHJkcjo6VTggKmRzdCA9IChyZHI6OlU4ICopYnVmOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBwaXggPSAqYnVmKys7CisgICAgKmRzdCsrID0gKHJkcjo6VTgpKHBpeCA+PiBzX3JzKTsKKyAgICAqZHN0KysgPSAocmRyOjpVOCkocGl4ID4+IHNfZ3MpOworICAgICpkc3QrKyA9IChyZHI6OlU4KShwaXggPj4gc19icyk7CisgIH0KKyAgcmV0dXJuIGNvdW50ICogMzsKKyNlbmRpZgorfQorCisvLworLy8gRnVuY3Rpb24gdG8gZ3Vlc3MgaWYgYSBnaXZlbiByZWN0YW5nbGUgaXMgc3VpdGFibGUgZm9yIEpQRUcgY29tcHJlc3Npb24uCisvLyBSZXR1cm5zIHRydWUgaXMgaXQgbG9va3MgbGlrZSBhIGdvb2QgZGF0YSBmb3IgSlBFRywgZmFsc2Ugb3RoZXJ3aXNlLgorLy8KKy8vIEZJWE1FOiBTY2FuIHRoZSBpbWFnZSBhbmQgZGV0ZXJtaW5lIGlzIGl0IHJlYWxseSBnb29kIGZvciBKUEVHLgorLy8KKworI2lmIChCUFAgIT0gOCkKK3N0YXRpYyBib29sIERFVEVDVF9TTU9PVEhfSU1BR0UgKFBJWEVMX1QgKmJ1ZiwgY29uc3QgUmVjdCYgcikKK3sKKyAgaWYgKHIud2lkdGgoKSA8IFRJR0hUX0RFVEVDVF9NSU5fV0lEVEggfHwKKyAgICAgIHIuaGVpZ2h0KCkgPCBUSUdIVF9ERVRFQ1RfTUlOX0hFSUdIVCB8fAorICAgICAgci5hcmVhKCkgPCBUSUdIVF9KUEVHX01JTl9SRUNUX1NJWkUgfHwKKyAgICAgIHNfcGpjb25mID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLy8gRklYTUU6IFNwbGl0IHJlY3RhbmdsZXMgaW50byBzbWFsbGVyIG9uZXMhCisvLyBGSVhNRTogQ29tcGFyZSBlbmNvZGVyIGNvZGUgd2l0aCAxLjMgYmVmb3JlIHRoZSBmaW5hbCB2ZXJzaW9uLgorCisvLworLy8gTWFpbiBmdW5jdGlvbiBvZiB0aGUgVGlnaHQgZW5jb2RlcgorLy8KKwordm9pZCBUSUdIVF9FTkNPREUgKGNvbnN0IFJlY3QmIHIsIHJkcjo6T3V0U3RyZWFtICpvcywKKyAgICAgICAgICAgICAgICAgIHJkcjo6WmxpYk91dFN0cmVhbSB6b3NbNF0sIHZvaWQqIGJ1ZiwgQ29ublBhcmFtcyogY3AKKyNpZmRlZiBFWFRSQV9BUkdTCisgICAgICAgICAgICAgICAgICAsIEVYVFJBX0FSR1MKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgKQoreworICBjb25zdCBQaXhlbEZvcm1hdCYgcGYgPSBjcC0+cGYoKTsKKyAgR0VUX0lNQUdFX0lOVE9fQlVGKHIsIGJ1Zik7CisgIFBJWEVMX1QqIHBpeGVscyA9IChQSVhFTF9UKilidWY7CisKKyNpZiAoQlBQICE9IDgpCisgIHVuaW9uIHsKKyAgICByZHI6OlUzMiB2YWx1ZTMyOworICAgIHJkcjo6VTggdGVzdDsKKyAgfSBsaXR0bGVFbmRpYW47CisgIGxpdHRsZUVuZGlhbi52YWx1ZTMyID0gMTsKKyAgc19lbmRpYW5NaXNtYXRjaCA9IChsaXR0bGVFbmRpYW4udGVzdCAhPSAhcGYuYmlnRW5kaWFuKTsKKyNlbmRpZgorCisjaWYgKEJQUCA9PSAzMikKKyAgLy8gQ2hlY2sgaWYgaXQncyBuZWNlc3NhcnkgdG8gcGFjayAyNC1iaXQgcGl4ZWxzLCBhbmQKKyAgLy8gY29tcHV0ZSBhcHByb3ByaWF0ZSBzaGlmdCB2YWx1ZXMgaWYgbmVjZXNzYXJ5LgorICBzX3BhY2syNCA9IChwZi5kZXB0aCA9PSAyNCAmJiBwZi5yZWRNYXggPT0gMHhGRiAmJgorICAgICAgICAgICAgICBwZi5ncmVlbk1heCA9PSAweEZGICYmIHBmLmJsdWVNYXggPT0gMHhGRik7CisgIGlmIChzX3BhY2syNCkgeworICAgIGlmICghc19lbmRpYW5NaXNtYXRjaCkgeworICAgICAgc19ycyA9IHBmLnJlZFNoaWZ0OworICAgICAgc19ncyA9IHBmLmdyZWVuU2hpZnQ7CisgICAgICBzX2JzID0gcGYuYmx1ZVNoaWZ0OworICAgIH0gZWxzZSB7CisgICAgICBzX3JzID0gMjQgLSBwZi5yZWRTaGlmdDsKKyAgICAgIHNfZ3MgPSAyNCAtIHBmLmdyZWVuU2hpZnQ7CisgICAgICBzX2JzID0gMjQgLSBwZi5ibHVlU2hpZnQ7CisgICAgfQorICB9CisjZW5kaWYKKworICBzX3BhbE1heENvbG9ycyA9IHIuYXJlYSgpIC8gc19wY29uZi0+aWR4TWF4Q29sb3JzRGl2aXNvcjsKKyAgaWYgKHNfcGFsTWF4Q29sb3JzIDwgMiAmJiByLmFyZWEoKSA+PSBzX3Bjb25mLT5tb25vTWluUmVjdFNpemUpIHsKKyAgICBzX3BhbE1heENvbG9ycyA9IDI7CisgIH0KKyAgLy8gRklYTUU6IFRlbXBvcmFyeSBsaW1pdGF0aW9uIGZvciBzd2l0Y2hpbmcgdG8gSlBFRyBlYXJsaWVyLgorICBpZiAoc19wYWxNYXhDb2xvcnMgPiA5NiAmJiBzX3BqY29uZiAhPSBOVUxMKSB7CisgICAgc19wYWxNYXhDb2xvcnMgPSA5NjsKKyAgfQorCisgIEZJTExfUEFMRVRURShwaXhlbHMsIHIuYXJlYSgpKTsKKworICBzd2l0Y2ggKHNfcGFsTnVtQ29sb3JzKSB7CisgIGNhc2UgMDoKKyAgICAvLyBUcnVlY29sb3IgaW1hZ2UKKyNpZiAoQlBQICE9IDgpCisgICAgaWYgKHNfcGpjb25mICE9IE5VTEwgJiYgREVURUNUX1NNT09USF9JTUFHRShwaXhlbHMsIHIpKSB7CisgICAgICBFTkNPREVfSlBFR19SRUNUKG9zLCBwaXhlbHMsIHBmLCByKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIEVOQ09ERV9GVUxMQ09MT1JfUkVDVChvcywgem9zLCBwaXhlbHMsIHIpOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgLy8gU29saWQgcmVjdGFuZ2xlCisgICAgRU5DT0RFX1NPTElEX1JFQ1Qob3MsIHBpeGVscyk7CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICAvLyBUd28tY29sb3IgcmVjdGFuZ2xlCisgICAgRU5DT0RFX01PTk9fUkVDVChvcywgem9zLCBwaXhlbHMsIHIpOworICAgIGJyZWFrOworI2lmIChCUFAgIT0gOCkKKyAgZGVmYXVsdDoKKyAgICAvLyBVcCB0byAyNTYgZGlmZmVyZW50IGNvbG9ycworICAgIEVOQ09ERV9JTkRFWEVEX1JFQ1Qob3MsIHpvcywgcGl4ZWxzLCByKTsKKyNlbmRpZgorICB9Cit9CisKKy8vCisvLyBTdWJlbmNvZGluZyBpbXBsZW1lbnRhdGlvbnMuCisvLworCitzdGF0aWMgdm9pZCBFTkNPREVfU09MSURfUkVDVCAocmRyOjpPdXRTdHJlYW0gKm9zLCBQSVhFTF9UICpidWYpCit7CisgIG9zLT53cml0ZVU4KDB4MDggPDwgNCk7CisKKyAgaW50IGxlbmd0aCA9IFBBQ0tfUElYRUxTKGJ1ZiwgMSk7CisgIG9zLT53cml0ZUJ5dGVzKGJ1ZiwgbGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgRU5DT0RFX0ZVTExDT0xPUl9SRUNUIChyZHI6Ok91dFN0cmVhbSAqb3MsIHJkcjo6WmxpYk91dFN0cmVhbSB6b3NbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJWEVMX1QgKmJ1ZiwgY29uc3QgUmVjdCYgcikKK3sKKyAgY29uc3QgaW50IHN0cmVhbUlkID0gMDsKKyAgb3MtPndyaXRlVTgoc3RyZWFtSWQgPDwgNCk7CisKKyAgaW50IGxlbmd0aCA9IFBBQ0tfUElYRUxTKGJ1Ziwgci5hcmVhKCkpOworICBjb21wcmVzc0RhdGEob3MsICZ6b3Nbc3RyZWFtSWRdLCBidWYsIGxlbmd0aCwgc19wY29uZi0+cmF3WmxpYkxldmVsKTsKK30KKworc3RhdGljIHZvaWQgRU5DT0RFX01PTk9fUkVDVCAocmRyOjpPdXRTdHJlYW0gKm9zLCByZHI6OlpsaWJPdXRTdHJlYW0gem9zWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElYRUxfVCAqYnVmLCBjb25zdCBSZWN0JiByKQoreworICBjb25zdCBpbnQgc3RyZWFtSWQgPSAxOworICBvcy0+d3JpdGVVOCgoc3RyZWFtSWQgfCAweDA0KSA8PCA0KTsKKyAgb3MtPndyaXRlVTgoMHgwMSk7CisKKyAgLy8gV3JpdGUgdGhlIHBhbGV0dGUKKyAgUElYRUxfVCBwYWxbMl0gPSB7IChQSVhFTF9UKXNfbW9ub0JhY2tncm91bmQsIChQSVhFTF9UKXNfbW9ub0ZvcmVncm91bmQgfTsKKyAgb3MtPndyaXRlVTgoMSk7CisgIG9zLT53cml0ZUJ5dGVzKHBhbCwgUEFDS19QSVhFTFMocGFsLCAyKSk7CisKKyAgLy8gRW5jb2RlIHRoZSBkYXRhIGluLXBsYWNlCisgIFBJWEVMX1QgKnNyYyA9IGJ1ZjsKKyAgcmRyOjpVOCAqZHN0ID0gKHJkcjo6VTggKilidWY7CisgIGludCB3ID0gci53aWR0aCgpOworICBpbnQgaCA9IHIuaGVpZ2h0KCk7CisgIFBJWEVMX1QgYmc7CisgIHVuc2lnbmVkIGludCB2YWx1ZSwgbWFzazsKKyAgaW50IGFsaWduZWRfd2lkdGg7CisgIGludCB4LCB5LCBiZ19iaXRzOworCisgIGJnID0gKFBJWEVMX1QpIHNfbW9ub0JhY2tncm91bmQ7CisgIGFsaWduZWRfd2lkdGggPSB3IC0gdyAlIDg7CisKKyAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgIGZvciAoeCA9IDA7IHggPCBhbGlnbmVkX3dpZHRoOyB4ICs9IDgpIHsKKyAgICAgIGZvciAoYmdfYml0cyA9IDA7IGJnX2JpdHMgPCA4OyBiZ19iaXRzKyspIHsKKyAgICAgICAgaWYgKCpzcmMrKyAhPSBiZykKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChiZ19iaXRzID09IDgpIHsKKyAgICAgICAgKmRzdCsrID0gMDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBtYXNrID0gMHg4MCA+PiBiZ19iaXRzOworICAgICAgdmFsdWUgPSBtYXNrOworICAgICAgZm9yIChiZ19iaXRzKys7IGJnX2JpdHMgPCA4OyBiZ19iaXRzKyspIHsKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgaWYgKCpzcmMrKyAhPSBiZykgeworICAgICAgICAgIHZhbHVlIHw9IG1hc2s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICpkc3QrKyA9IChyZHI6OlU4KXZhbHVlOworICAgIH0KKworICAgIG1hc2sgPSAweDgwOworICAgIHZhbHVlID0gMDsKKyAgICBpZiAoeCA+PSB3KQorICAgICAgY29udGludWU7CisKKyAgICBmb3IgKDsgeCA8IHc7IHgrKykgeworICAgICAgaWYgKCpzcmMrKyAhPSBiZykgeworICAgICAgICB2YWx1ZSB8PSBtYXNrOworICAgICAgfQorICAgICAgbWFzayA+Pj0gMTsKKyAgICB9CisgICAgKmRzdCsrID0gKHJkcjo6VTgpdmFsdWU7CisgIH0KKworICAvLyBXcml0ZSB0aGUgZGF0YQorICBpbnQgbGVuZ3RoID0gKHcgKyA3KSAvIDg7CisgIGxlbmd0aCAqPSBoOworICBjb21wcmVzc0RhdGEob3MsICZ6b3Nbc3RyZWFtSWRdLCBidWYsIGxlbmd0aCwgc19wY29uZi0+bW9ub1psaWJMZXZlbCk7Cit9CisKKyNpZiAoQlBQICE9IDgpCitzdGF0aWMgdm9pZCBFTkNPREVfSU5ERVhFRF9SRUNUIChyZHI6Ok91dFN0cmVhbSAqb3MsIHJkcjo6WmxpYk91dFN0cmVhbSB6b3NbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVhFTF9UICpidWYsIGNvbnN0IFJlY3QmIHIpCit7CisgIGNvbnN0IGludCBzdHJlYW1JZCA9IDI7CisgIG9zLT53cml0ZVU4KChzdHJlYW1JZCB8IDB4MDQpIDw8IDQpOworICBvcy0+d3JpdGVVOCgweDAxKTsKKworICAvLyBXcml0ZSB0aGUgcGFsZXR0ZQorICB7CisgICAgUElYRUxfVCBwYWxbMjU2XTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNfcGFsTnVtQ29sb3JzOyBpKyspCisgICAgICBwYWxbaV0gPSAoUElYRUxfVClzX3BhbGV0dGUuZW50cnlbaV0ubGlzdE5vZGUtPnJnYjsKKyAgICBvcy0+d3JpdGVVOCgocmRyOjpVOCkoc19wYWxOdW1Db2xvcnMgLSAxKSk7CisgICAgb3MtPndyaXRlQnl0ZXMocGFsLCBQQUNLX1BJWEVMUyhwYWwsIHNfcGFsTnVtQ29sb3JzKSk7CisgIH0KKworICAvLyBFbmNvZGUgZGF0YSBpbi1wbGFjZQorICBQSVhFTF9UICpzcmMgPSBidWY7CisgIHJkcjo6VTggKmRzdCA9IChyZHI6OlU4ICopYnVmOworICBpbnQgY291bnQgPSByLmFyZWEoKTsKKyAgUElYRUxfVCByZ2I7CisgIFRJR0hUX0NPTE9SX0xJU1QgKnBub2RlOworICBpbnQgcmVwID0gMDsKKworICB3aGlsZSAoY291bnQtLSkgeworICAgIHJnYiA9ICpzcmMrKzsKKyAgICB3aGlsZSAoY291bnQgJiYgKnNyYyA9PSByZ2IpIHsKKyAgICAgIHJlcCsrLCBzcmMrKywgY291bnQtLTsKKyAgICB9CisgICAgcG5vZGUgPSBzX3BhbGV0dGUuaGFzaFtIQVNIX0ZVTkNUSU9OKHJnYildOworICAgIHdoaWxlIChwbm9kZSAhPSBOVUxMKSB7CisgICAgICBpZiAoKFBJWEVMX1QpcG5vZGUtPnJnYiA9PSByZ2IpIHsKKyAgICAgICAgKmRzdCsrID0gKHJkcjo6VTgpcG5vZGUtPmlkeDsKKyAgICAgICAgd2hpbGUgKHJlcCkgeworICAgICAgICAgICpkc3QrKyA9IChyZHI6OlU4KXBub2RlLT5pZHg7CisgICAgICAgICAgcmVwLS07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwbm9kZSA9IHBub2RlLT5uZXh0OworICAgIH0KKyAgfQorCisgIC8vIFdyaXRlIHRoZSBkYXRhCisgIGNvbXByZXNzRGF0YShvcywgJnpvc1tzdHJlYW1JZF0sIGJ1Ziwgci5hcmVhKCksIHNfcGNvbmYtPmlkeFpsaWJMZXZlbCk7Cit9CisjZW5kaWYgIC8vICNpZiAoQlBQICE9IDgpCisKKy8vCisvLyBKUEVHIGNvbXByZXNzaW9uLgorLy8KKworI2lmIChCUFAgIT0gOCkKK3N0YXRpYyB2b2lkIFBSRVBBUkVfSlBFR19ST1cgKFBJWEVMX1QgKnNyYywgY29uc3QgUGl4ZWxGb3JtYXQmIHBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmRyOjpVOCAqZHN0LCBpbnQgY291bnQpCit7CisgIC8vIEZJWE1FOiBBZGQgYSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gb3B0aW1pemVkIGZvciAyNC1iaXQgY29sb3JzPworICBQSVhFTF9UIHBpeDsKKyAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICBwaXggPSAqc3JjKys7CisgICAgaWYgKHNfZW5kaWFuTWlzbWF0Y2gpCisgICAgICBwaXggPSBTV0FQX1BJWEVMKHBpeCk7CisgICAgKmRzdCsrID0gKHJkcjo6VTgpKChwaXggPj4gcGYucmVkU2hpZnQgICAmIHBmLnJlZE1heCkgICAqIDI1NSAvIHBmLnJlZE1heCk7CisgICAgKmRzdCsrID0gKHJkcjo6VTgpKChwaXggPj4gcGYuZ3JlZW5TaGlmdCAmIHBmLmdyZWVuTWF4KSAqIDI1NSAvIHBmLmdyZWVuTWF4KTsKKyAgICAqZHN0KysgPSAocmRyOjpVOCkoKHBpeCA+PiBwZi5ibHVlU2hpZnQgICYgcGYuYmx1ZU1heCkgICogMjU1IC8gcGYuYmx1ZU1heCk7CisgIH0KK30KKyNlbmRpZiAgLy8gI2lmIChCUFAgIT0gOCkKKworI2lmIChCUFAgIT0gOCkKK3N0YXRpYyB2b2lkIEVOQ09ERV9KUEVHX1JFQ1QgKHJkcjo6T3V0U3RyZWFtICpvcywgUElYRUxfVCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4ZWxGb3JtYXQmIHBmLCBjb25zdCBSZWN0JiByKQoreworICBpbnQgdyA9IHIud2lkdGgoKTsKKyAgaW50IGggPSByLmhlaWdodCgpOworCisgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisKKyAgLy8gRklYTUU6IE1ha2Ugc3JjQnVmW10gYW5kL29yIGRzdEJ1ZltdIHN0YXRpYz8KKyAgcmRyOjpVOCAqc3JjQnVmID0gbmV3IHJkcjo6VThbdyAqIDNdOworICBKU0FNUFJPVyByb3dQb2ludGVyWzFdOworICByb3dQb2ludGVyWzBdID0gKEpTQU1QUk9XKXNyY0J1ZjsKKworICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7CisgIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7CisKKyAgY2luZm8uaW1hZ2Vfd2lkdGggPSB3OworICBjaW5mby5pbWFnZV9oZWlnaHQgPSBoOworICBjaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsKKyAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworCisgIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CisgIGpwZWdfc2V0X3F1YWxpdHkoJmNpbmZvLCBzX3BqY29uZi0+anBlZ1F1YWxpdHksIFRSVUUpOworCisgIHJkcjo6VTggKmRzdEJ1ZiA9IG5ldyByZHI6OlU4WzIwNDhdOworICBKcGVnU2V0RHN0TWFuYWdlcigmY2luZm8sIGRzdEJ1ZiwgMjA0OCk7CisKKyAganBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIFRSVUUpOworICBmb3IgKGludCBkeSA9IDA7IGR5IDwgaDsgZHkrKykgeworICAgIFBSRVBBUkVfSlBFR19ST1coJmJ1ZltkeSAqIHddLCBwZiwgc3JjQnVmLCB3KTsKKyAgICBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHJvd1BvaW50ZXIsIDEpOworICB9CisgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7CisgIGpwZWdfZGVzdHJveV9jb21wcmVzcygmY2luZm8pOworCisgIGRlbGV0ZVtdIHNyY0J1ZjsKKyAgZGVsZXRlW10gZHN0QnVmOworCisgIG9zLT53cml0ZVU4KDB4MDkgPDwgNCk7CisgIG9zLT53cml0ZUNvbXBhY3RMZW5ndGgoc19qcGVnX29zLmxlbmd0aCgpKTsKKyAgb3MtPndyaXRlQnl0ZXMoc19qcGVnX29zLmRhdGEoKSwgc19qcGVnX29zLmxlbmd0aCgpKTsKK30KKyNlbmRpZiAgLy8gI2lmIChCUFAgIT0gOCkKKworLy8KKy8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcmVjdGFuZ2xlLCBhbmQgZmlsbCBpbiB0aGUgcGFsZXR0ZS4KKy8vCisKKyNpZiAoQlBQID09IDgpCitzdGF0aWMgdm9pZCBGSUxMX1BBTEVUVEUgKFBJWEVMX1QgKmRhdGEsIGludCBjb3VudCkKK3sKKyAgUElYRUxfVCBjMCwgYzE7CisgIGludCBpLCBuMCwgbjE7CisKKyAgc19wYWxOdW1Db2xvcnMgPSAwOworCisgIGMwID0gZGF0YVswXTsKKyAgZm9yIChpID0gMTsgaSA8IGNvdW50ICYmIGRhdGFbaV0gPT0gYzA7IGkrKyk7CisgIGlmIChpID09IGNvdW50KSB7CisgICAgc19wYWxOdW1Db2xvcnMgPSAxOworICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbGlkIHJlY3RhbmdsZQorICB9CisKKyAgaWYgKHNfcGFsTWF4Q29sb3JzIDwgMikKKyAgICByZXR1cm47CisKKyAgbjAgPSBpOworICBjMSA9IGRhdGFbaV07CisgIG4xID0gMDsKKyAgZm9yIChpKys7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKGRhdGFbaV0gPT0gYzApIHsKKyAgICAgIG4wKys7CisgICAgfSBlbHNlIGlmIChkYXRhW2ldID09IGMxKSB7CisgICAgICBuMSsrOworICAgIH0gZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGkgPT0gY291bnQpIHsKKyAgICBpZiAobjAgPiBuMSkgeworICAgICAgc19tb25vQmFja2dyb3VuZCA9IChyZHI6OlUzMiljMDsKKyAgICAgIHNfbW9ub0ZvcmVncm91bmQgPSAocmRyOjpVMzIpYzE7CisgICAgfSBlbHNlIHsKKyAgICAgIHNfbW9ub0JhY2tncm91bmQgPSAocmRyOjpVMzIpYzE7CisgICAgICBzX21vbm9Gb3JlZ3JvdW5kID0gKHJkcjo6VTMyKWMwOworICAgIH0KKyAgICBzX3BhbE51bUNvbG9ycyA9IDI7ICAgICAgICAgICAvLyBUd28gY29sb3JzCisgIH0KK30KKyNlbHNlICAgLy8gKEJQUCAhPSA4KQorc3RhdGljIHZvaWQgRklMTF9QQUxFVFRFIChQSVhFTF9UICpkYXRhLCBpbnQgY291bnQpCit7CisgIFBJWEVMX1QgYzAsIGMxLCBjaSA9IDA7CisgIGludCBpLCBuMCwgbjEsIG5pOworCisgIGMwID0gZGF0YVswXTsKKyAgZm9yIChpID0gMTsgaSA8IGNvdW50ICYmIGRhdGFbaV0gPT0gYzA7IGkrKyk7CisgIGlmIChpID49IGNvdW50KSB7CisgICAgc19wYWxOdW1Db2xvcnMgPSAxOyAgICAgICAgICAgLy8gU29saWQgcmVjdGFuZ2xlCisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNfcGFsTWF4Q29sb3JzIDwgMikgeworICAgIHNfcGFsTnVtQ29sb3JzID0gMDsgICAgICAgICAgIC8vIEZ1bGwtY29sb3IgZm9ybWF0IHByZWZlcnJlZAorICAgIHJldHVybjsKKyAgfQorCisgIG4wID0gaTsKKyAgYzEgPSBkYXRhW2ldOworICBuMSA9IDA7CisgIGZvciAoaSsrOyBpIDwgY291bnQ7IGkrKykgeworICAgIGNpID0gZGF0YVtpXTsKKyAgICBpZiAoY2kgPT0gYzApIHsKKyAgICAgIG4wKys7CisgICAgfSBlbHNlIGlmIChjaSA9PSBjMSkgeworICAgICAgbjErKzsKKyAgICB9IGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChpID49IGNvdW50KSB7CisgICAgaWYgKG4wID4gbjEpIHsKKyAgICAgIHNfbW9ub0JhY2tncm91bmQgPSAocmRyOjpVMzIpYzA7CisgICAgICBzX21vbm9Gb3JlZ3JvdW5kID0gKHJkcjo6VTMyKWMxOworICAgIH0gZWxzZSB7CisgICAgICBzX21vbm9CYWNrZ3JvdW5kID0gKHJkcjo6VTMyKWMxOworICAgICAgc19tb25vRm9yZWdyb3VuZCA9IChyZHI6OlUzMiljMDsKKyAgICB9CisgICAgc19wYWxOdW1Db2xvcnMgPSAyOyAgICAgICAgICAgLy8gVHdvIGNvbG9ycworICAgIHJldHVybjsKKyAgfQorCisgIHBhbGV0dGVSZXNldCgpOworICBwYWxldHRlSW5zZXJ0IChjMCwgKHJkcjo6VTMyKW4wLCBCUFApOworICBwYWxldHRlSW5zZXJ0IChjMSwgKHJkcjo6VTMyKW4xLCBCUFApOworCisgIG5pID0gMTsKKyAgZm9yIChpKys7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKGRhdGFbaV0gPT0gY2kpIHsKKyAgICAgIG5pKys7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghcGFsZXR0ZUluc2VydCAoY2ksIChyZHI6OlUzMiluaSwgQlBQKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgY2kgPSBkYXRhW2ldOworICAgICAgbmkgPSAxOworICAgIH0KKyAgfQorICBwYWxldHRlSW5zZXJ0IChjaSwgKHJkcjo6VTMyKW5pLCBCUFApOworfQorI2VuZGlmICAvLyAjaWYgKEJQUCA9PSA4KQorCisjdW5kZWYgUElYRUxfVAorI3VuZGVmIFdSSVRFX1BJWEVMCisjdW5kZWYgVElHSFRfRU5DT0RFCisjdW5kZWYgU1dBUF9QSVhFTAorI3VuZGVmIEhBU0hfRlVOQ1RJT04KKyN1bmRlZiBQQUNLX1BJWEVMUworI3VuZGVmIERFVEVDVF9TTU9PVEhfSU1BR0UKKyN1bmRlZiBFTkNPREVfU09MSURfUkVDVAorI3VuZGVmIEVOQ09ERV9GVUxMQ09MT1JfUkVDVAorI3VuZGVmIEVOQ09ERV9NT05PX1JFQ1QKKyN1bmRlZiBFTkNPREVfSU5ERVhFRF9SRUNUCisjdW5kZWYgUFJFUEFSRV9KUEVHX1JPVworI3VuZGVmIEVOQ09ERV9KUEVHX1JFQ1QKKyN1bmRlZiBGSUxMX1BBTEVUVEUKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvdHJhbnNJbml0VGVtcGwuaCBiL2NvbW1vbi9yZmIvdHJhbnNJbml0VGVtcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRjZmRmCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi90cmFuc0luaXRUZW1wbC5oCkBAIC0wLDAgKzEsMjU0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gdHJhbnNJbml0VGVtcGwuaCAtIHRlbXBsYXRlcyBmb3IgZnVuY3Rpb25zIHRvIGluaXRpYWxpc2UgbG9va3VwIHRhYmxlcyBmb3IKKy8vIHRoZSB0cmFuc2xhdGlvbiBmdW5jdGlvbnMuCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBhZnRlciBoYXZpbmcgc2V0IHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorLy8gQlBQT1VUIC0gOCwgMTYgb3IgMzIKKworI2lmICFkZWZpbmVkKEJQUE9VVCkKKyNlcnJvciAidHJhbnNJbml0VGVtcGwuaDogQlBQT1VUIG5vdCBkZWZpbmVkIgorI2VuZGlmCisKK25hbWVzcGFjZSByZmIgeworCisvLyBDT05DQVQyRSBjb25jYXRlbmF0ZXMgaXRzIGFyZ3VtZW50cywgZXhwYW5kaW5nIHRoZW0gaWYgdGhleSBhcmUgbWFjcm9zCisKKyNpZm5kZWYgQ09OQ0FUMkUKKyNkZWZpbmUgQ09OQ0FUMihhLGIpIGEjI2IKKyNkZWZpbmUgQ09OQ0FUMkUoYSxiKSBDT05DQVQyKGEsYikKKyNlbmRpZgorCisjaWZuZGVmIFNXQVAxNgorI2RlZmluZSBTV0FQMTYobikgKCgoKG4pICYgMHhmZikgPDwgOCkgfCAoKChuKSA+PiA4KSAmIDB4ZmYpKQorI2VuZGlmCisKKyNpZm5kZWYgU1dBUDMyCisjZGVmaW5lIFNXQVAzMihuKSAoKChuKSA+PiAyNCkgfCAoKChuKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgXAorICAgICAgICAgICAgICAgICAgICgoKG4pICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKG4pIDw8IDI0KSkKKyNlbmRpZgorCisjZGVmaW5lIE9VVFBJWEVMIHJkcjo6Q09OQ0FUMkUoVSxCUFBPVVQpCisjZGVmaW5lIFNXQVBPVVQgQ09OQ0FUMkUoU1dBUCxCUFBPVVQpCisjZGVmaW5lIGluaXRTaW1wbGVDTXRvVENPVVQgICAgQ09OQ0FUMkUoaW5pdFNpbXBsZUNNdG9UQyxCUFBPVVQpCisjZGVmaW5lIGluaXRTaW1wbGVUQ3RvVENPVVQgICAgQ09OQ0FUMkUoaW5pdFNpbXBsZVRDdG9UQyxCUFBPVVQpCisjZGVmaW5lIGluaXRTaW1wbGVDTXRvQ3ViZU9VVCAgQ09OQ0FUMkUoaW5pdFNpbXBsZUNNdG9DdWJlLEJQUE9VVCkKKyNkZWZpbmUgaW5pdFNpbXBsZVRDdG9DdWJlT1VUICBDT05DQVQyRShpbml0U2ltcGxlVEN0b0N1YmUsQlBQT1VUKQorI2RlZmluZSBpbml0UkdCVEN0b1RDT1VUICAgICAgIENPTkNBVDJFKGluaXRSR0JUQ3RvVEMsQlBQT1VUKQorI2RlZmluZSBpbml0UkdCVEN0b0N1YmVPVVQgICAgIENPTkNBVDJFKGluaXRSR0JUQ3RvQ3ViZSxCUFBPVVQpCisjZGVmaW5lIGluaXRPbmVSR0JUYWJsZU9VVCAgICAgQ09OQ0FUMkUoaW5pdE9uZVJHQlRhYmxlLEJQUE9VVCkKKyNkZWZpbmUgaW5pdE9uZVJHQkN1YmVUYWJsZU9VVCBDT05DQVQyRShpbml0T25lUkdCQ3ViZVRhYmxlLEJQUE9VVCkKKworI2lmbmRlZiBUUkFOU19JTklUX1RFTVBMX0VORElBTl9URVNUCisjZGVmaW5lIFRSQU5TX0lOSVRfVEVNUExfRU5ESUFOX1RFU1QKKyAgc3RhdGljIHJkcjo6VTMyIGVuZGlhblRlc3QgPSAxOworICBzdGF0aWMgYm9vbCBuYXRpdmVCaWdFbmRpYW4gPSAqKHJkcjo6VTgqKSgmZW5kaWFuVGVzdCkgIT0gMTsKKyNlbmRpZgorCit2b2lkIGluaXRTaW1wbGVDTXRvVENPVVQgKHJkcjo6VTgqKiB0YWJsZXAsIGNvbnN0IFBpeGVsRm9ybWF0JiBpblBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXJNYXAqIGNtLCBjb25zdCBQaXhlbEZvcm1hdCYgb3V0UEYpCit7CisgIGlmIChpblBGLmJwcCAhPSA4ICYmIGluUEYuYmlnRW5kaWFuICE9IG5hdGl2ZUJpZ0VuZGlhbikKKyAgICB0aHJvdyBFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBpblBGIGlzIG5vdCBuYXRpdmUgZW5kaWFuIik7CisKKyAgaW50IHNpemUgPSAxIDw8IGluUEYuYnBwOworCisgIGRlbGV0ZSBbXSAqdGFibGVwOworICAqdGFibGVwID0gbmV3IHJkcjo6VThbc2l6ZSAqIHNpemVvZihPVVRQSVhFTCldOworICBPVVRQSVhFTCogdGFibGUgPSAoT1VUUElYRUwqKSp0YWJsZXA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpbnQgcixnLGI7CisgICAgY20tPmxvb2t1cChpLCZyLCZnLCZiKTsKKworICAgIHRhYmxlW2ldID0gKCgoKHIgKiBvdXRQRi5yZWRNYXggICArIDMyNzY3KSAvIDY1NTM1KSA8PCBvdXRQRi5yZWRTaGlmdCkgfAorICAgICAgICAgICAgICAgICgoKGcgKiBvdXRQRi5ncmVlbk1heCArIDMyNzY3KSAvIDY1NTM1KSA8PCBvdXRQRi5ncmVlblNoaWZ0KSB8CisgICAgICAgICAgICAgICAgKCgoYiAqIG91dFBGLmJsdWVNYXggICsgMzI3NjcpIC8gNjU1MzUpIDw8IG91dFBGLmJsdWVTaGlmdCkpOworI2lmIChCUFBPVVQgIT0gOCkKKyAgICBpZiAob3V0UEYuYmlnRW5kaWFuICE9IG5hdGl2ZUJpZ0VuZGlhbikKKyAgICAgIHRhYmxlW2ldID0gU1dBUE9VVCAodGFibGVbaV0pOworI2VuZGlmCisgIH0KK30KKwordm9pZCBpbml0U2ltcGxlVEN0b1RDT1VUIChyZHI6OlU4KiogdGFibGVwLCBjb25zdCBQaXhlbEZvcm1hdCYgaW5QRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4ZWxGb3JtYXQmIG91dFBGKQoreworICBpZiAoaW5QRi5icHAgIT0gOCAmJiBpblBGLmJpZ0VuZGlhbiAhPSBuYXRpdmVCaWdFbmRpYW4pCisgICAgdGhyb3cgRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogaW5QRiBpcyBub3QgbmF0aXZlIGVuZGlhbiIpOworCisgIGludCBzaXplID0gMSA8PCBpblBGLmJwcDsKKworICBkZWxldGUgW10gKnRhYmxlcDsKKyAgKnRhYmxlcCA9IG5ldyByZHI6OlU4W3NpemUgKiBzaXplb2YoT1VUUElYRUwpXTsKKyAgT1VUUElYRUwqIHRhYmxlID0gKE9VVFBJWEVMKikqdGFibGVwOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaW50IHIgPSAoaSA+PiBpblBGLnJlZFNoaWZ0KSAgICYgaW5QRi5yZWRNYXg7CisgICAgaW50IGcgPSAoaSA+PiBpblBGLmdyZWVuU2hpZnQpICYgaW5QRi5ncmVlbk1heDsKKyAgICBpbnQgYiA9IChpID4+IGluUEYuYmx1ZVNoaWZ0KSAgJiBpblBGLmJsdWVNYXg7CisgICAgICAKKyAgICByID0gKHIgKiBvdXRQRi5yZWRNYXggICArIGluUEYucmVkTWF4LzIpICAgLyBpblBGLnJlZE1heDsKKyAgICBnID0gKGcgKiBvdXRQRi5ncmVlbk1heCArIGluUEYuZ3JlZW5NYXgvMikgLyBpblBGLmdyZWVuTWF4OworICAgIGIgPSAoYiAqIG91dFBGLmJsdWVNYXggICsgaW5QRi5ibHVlTWF4LzIpICAvIGluUEYuYmx1ZU1heDsKKyAgICAgIAorICAgIHRhYmxlW2ldID0gKChyIDw8IG91dFBGLnJlZFNoaWZ0KSAgIHwKKyAgICAgICAgICAgICAgICAoZyA8PCBvdXRQRi5ncmVlblNoaWZ0KSB8CisgICAgICAgICAgICAgICAgKGIgPDwgb3V0UEYuYmx1ZVNoaWZ0KSk7CisjaWYgKEJQUE9VVCAhPSA4KQorICAgIGlmIChvdXRQRi5iaWdFbmRpYW4gIT0gbmF0aXZlQmlnRW5kaWFuKQorICAgICAgdGFibGVbaV0gPSBTV0FQT1VUICh0YWJsZVtpXSk7CisjZW5kaWYKKyAgfQorfQorCit2b2lkIGluaXRTaW1wbGVDTXRvQ3ViZU9VVCAocmRyOjpVOCoqIHRhYmxlcCwgY29uc3QgUGl4ZWxGb3JtYXQmIGluUEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyTWFwKiBjbSwgQ29sb3VyQ3ViZSogY3ViZSkKK3sKKyAgaWYgKGluUEYuYnBwICE9IDggJiYgaW5QRi5iaWdFbmRpYW4gIT0gbmF0aXZlQmlnRW5kaWFuKQorICAgIHRocm93IEV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IGluUEYgaXMgbm90IG5hdGl2ZSBlbmRpYW4iKTsKKworICBpbnQgc2l6ZSA9IDEgPDwgaW5QRi5icHA7CisKKyAgZGVsZXRlIFtdICp0YWJsZXA7CisgICp0YWJsZXAgPSBuZXcgcmRyOjpVOFtzaXplICogc2l6ZW9mKE9VVFBJWEVMKV07CisgIE9VVFBJWEVMKiB0YWJsZSA9IChPVVRQSVhFTCopKnRhYmxlcDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGludCByLGcsYjsKKyAgICBjbS0+bG9va3VwKGksJnIsJmcsJmIpOworICAgIHIgPSAociAqIChjdWJlLT5uUmVkLTEpICAgKyAzMjc2NykgLyA2NTUzNTsKKyAgICBnID0gKGcgKiAoY3ViZS0+bkdyZWVuLTEpICsgMzI3NjcpIC8gNjU1MzU7CisgICAgYiA9IChiICogKGN1YmUtPm5CbHVlLTEpICArIDMyNzY3KSAvIDY1NTM1OworICAgIHRhYmxlW2ldID0gY3ViZS0+bG9va3VwKHIsIGcsIGIpOworICB9Cit9CisKK3ZvaWQgaW5pdFNpbXBsZVRDdG9DdWJlT1VUIChyZHI6OlU4KiogdGFibGVwLCBjb25zdCBQaXhlbEZvcm1hdCYgaW5QRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXJDdWJlKiBjdWJlKQoreworICBpZiAoaW5QRi5icHAgIT0gOCAmJiBpblBGLmJpZ0VuZGlhbiAhPSBuYXRpdmVCaWdFbmRpYW4pCisgICAgdGhyb3cgRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogaW5QRiBpcyBub3QgbmF0aXZlIGVuZGlhbiIpOworCisgIGludCBzaXplID0gMSA8PCBpblBGLmJwcDsKKworICBkZWxldGUgW10gKnRhYmxlcDsKKyAgKnRhYmxlcCA9IG5ldyByZHI6OlU4W3NpemUgKiBzaXplb2YoT1VUUElYRUwpXTsKKyAgT1VUUElYRUwqIHRhYmxlID0gKE9VVFBJWEVMKikqdGFibGVwOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaW50IHIgPSAoaSA+PiBpblBGLnJlZFNoaWZ0KSAgICYgaW5QRi5yZWRNYXg7CisgICAgaW50IGcgPSAoaSA+PiBpblBGLmdyZWVuU2hpZnQpICYgaW5QRi5ncmVlbk1heDsKKyAgICBpbnQgYiA9IChpID4+IGluUEYuYmx1ZVNoaWZ0KSAgJiBpblBGLmJsdWVNYXg7CisKKyAgICByID0gKHIgKiAoY3ViZS0+blJlZC0xKSAgICsgaW5QRi5yZWRNYXgvMikgICAvIGluUEYucmVkTWF4OworICAgIGcgPSAoZyAqIChjdWJlLT5uR3JlZW4tMSkgKyBpblBGLmdyZWVuTWF4LzIpIC8gaW5QRi5ncmVlbk1heDsKKyAgICBiID0gKGIgKiAoY3ViZS0+bkJsdWUtMSkgICsgaW5QRi5ibHVlTWF4LzIpICAvIGluUEYuYmx1ZU1heDsKKworICAgIHRhYmxlW2ldID0gY3ViZS0+bG9va3VwKHIsIGcsIGIpOworICB9Cit9CisKK3ZvaWQgaW5pdE9uZVJHQlRhYmxlT1VUIChPVVRQSVhFTCogdGFibGUsIGludCBpbk1heCwgaW50IG91dE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0U2hpZnQsIGJvb2wgc3dhcCkKK3sKKyAgaW50IHNpemUgPSBpbk1heCArIDE7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICB0YWJsZVtpXSA9ICgoaSAqIG91dE1heCArIGluTWF4IC8gMikgLyBpbk1heCkgPDwgb3V0U2hpZnQ7CisjaWYgKEJQUE9VVCAhPSA4KQorICAgIGlmIChzd2FwKQorICAgICAgdGFibGVbaV0gPSBTV0FQT1VUICh0YWJsZVtpXSk7CisjZW5kaWYKKyAgfQorfQorCit2b2lkIGluaXRSR0JUQ3RvVENPVVQgKHJkcjo6VTgqKiB0YWJsZXAsIGNvbnN0IFBpeGVsRm9ybWF0JiBpblBGLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhlbEZvcm1hdCYgb3V0UEYpCit7CisgIGlmIChpblBGLmJwcCAhPSA4ICYmIGluUEYuYmlnRW5kaWFuICE9IG5hdGl2ZUJpZ0VuZGlhbikKKyAgICB0aHJvdyBFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBpblBGIGlzIG5vdCBuYXRpdmUgZW5kaWFuIik7CisKKyAgaW50IHNpemUgPSBpblBGLnJlZE1heCArIGluUEYuZ3JlZW5NYXggKyBpblBGLmJsdWVNYXggKyAzOworCisgIGRlbGV0ZSBbXSAqdGFibGVwOworICAqdGFibGVwID0gbmV3IHJkcjo6VThbc2l6ZSAqIHNpemVvZihPVVRQSVhFTCldOworCisgIE9VVFBJWEVMKiByZWRUYWJsZSA9IChPVVRQSVhFTCopKnRhYmxlcDsKKyAgT1VUUElYRUwqIGdyZWVuVGFibGUgPSByZWRUYWJsZSArIGluUEYucmVkTWF4ICsgMTsKKyAgT1VUUElYRUwqIGJsdWVUYWJsZSA9IGdyZWVuVGFibGUgKyBpblBGLmdyZWVuTWF4ICsgMTsKKworICBib29sIHN3YXAgPSAob3V0UEYuYmlnRW5kaWFuICE9IG5hdGl2ZUJpZ0VuZGlhbik7CisKKyAgaW5pdE9uZVJHQlRhYmxlT1VUIChyZWRUYWJsZSwgaW5QRi5yZWRNYXgsIG91dFBGLnJlZE1heCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQRi5yZWRTaGlmdCwgc3dhcCk7CisgIGluaXRPbmVSR0JUYWJsZU9VVCAoZ3JlZW5UYWJsZSwgaW5QRi5ncmVlbk1heCwgb3V0UEYuZ3JlZW5NYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQRi5ncmVlblNoaWZ0LCBzd2FwKTsKKyAgaW5pdE9uZVJHQlRhYmxlT1VUIChibHVlVGFibGUsIGluUEYuYmx1ZU1heCwgb3V0UEYuYmx1ZU1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBGLmJsdWVTaGlmdCwgc3dhcCk7Cit9CisKKwordm9pZCBpbml0T25lUkdCQ3ViZVRhYmxlT1VUIChPVVRQSVhFTCogdGFibGUsIGludCBpbk1heCwgaW50IG91dE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dE11bHQpCit7CisgIGludCBzaXplID0gaW5NYXggKyAxOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgdGFibGVbaV0gPSAoKGkgKiBvdXRNYXggKyBpbk1heCAvIDIpIC8gaW5NYXgpICogb3V0TXVsdDsKKyAgfQorfQorCit2b2lkIGluaXRSR0JUQ3RvQ3ViZU9VVCAocmRyOjpVOCoqIHRhYmxlcCwgY29uc3QgUGl4ZWxGb3JtYXQmIGluUEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyQ3ViZSogY3ViZSkKK3sKKyAgaWYgKGluUEYuYnBwICE9IDggJiYgaW5QRi5iaWdFbmRpYW4gIT0gbmF0aXZlQmlnRW5kaWFuKQorICAgIHRocm93IEV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IGluUEYgaXMgbm90IG5hdGl2ZSBlbmRpYW4iKTsKKworICBpbnQgc2l6ZSA9IGluUEYucmVkTWF4ICsgaW5QRi5ncmVlbk1heCArIGluUEYuYmx1ZU1heCArIDMgKyBjdWJlLT5zaXplKCk7CisKKyAgZGVsZXRlIFtdICp0YWJsZXA7CisgICp0YWJsZXAgPSBuZXcgcmRyOjpVOFtzaXplICogc2l6ZW9mKE9VVFBJWEVMKV07CisKKyAgT1VUUElYRUwqIHJlZFRhYmxlID0gKE9VVFBJWEVMKikqdGFibGVwOworICBPVVRQSVhFTCogZ3JlZW5UYWJsZSA9IHJlZFRhYmxlICsgaW5QRi5yZWRNYXggKyAxOworICBPVVRQSVhFTCogYmx1ZVRhYmxlID0gZ3JlZW5UYWJsZSArIGluUEYuZ3JlZW5NYXggKyAxOworICBPVVRQSVhFTCogY3ViZVRhYmxlID0gYmx1ZVRhYmxlICsgaW5QRi5ibHVlTWF4ICsgMTsKKworICBpbml0T25lUkdCQ3ViZVRhYmxlT1VUIChyZWRUYWJsZSwgICBpblBGLnJlZE1heCwgICBjdWJlLT5uUmVkLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ViZS0+cmVkTXVsdCgpKTsKKyAgaW5pdE9uZVJHQkN1YmVUYWJsZU9VVCAoZ3JlZW5UYWJsZSwgaW5QRi5ncmVlbk1heCwgY3ViZS0+bkdyZWVuLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ViZS0+Z3JlZW5NdWx0KCkpOworICBpbml0T25lUkdCQ3ViZVRhYmxlT1VUIChibHVlVGFibGUsICBpblBGLmJsdWVNYXgsICBjdWJlLT5uQmx1ZS0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1YmUtPmJsdWVNdWx0KCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IGN1YmUtPnNpemUoKTsgaSsrKSB7CisgICAgY3ViZVRhYmxlW2ldID0gY3ViZS0+dGFibGVbaV07CisgIH0KK30KKworI3VuZGVmIE9VVFBJWEVMCisjdW5kZWYgaW5pdFNpbXBsZUNNdG9UQ09VVAorI3VuZGVmIGluaXRTaW1wbGVUQ3RvVENPVVQKKyN1bmRlZiBpbml0U2ltcGxlQ010b0N1YmVPVVQKKyN1bmRlZiBpbml0U2ltcGxlVEN0b0N1YmVPVVQKKyN1bmRlZiBpbml0UkdCVEN0b1RDT1VUCisjdW5kZWYgaW5pdFJHQlRDdG9DdWJlT1VUCisjdW5kZWYgaW5pdE9uZVJHQlRhYmxlT1VUCisjdW5kZWYgaW5pdE9uZVJHQkN1YmVUYWJsZU9VVAorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3JmYi90cmFuc1RlbXBsLmggYi9jb21tb24vcmZiL3RyYW5zVGVtcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWRjN2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3JmYi90cmFuc1RlbXBsLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyB0cmFuc1RlbXBsLmggLSB0ZW1wbGF0ZXMgZm9yIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgI2luY2x1ZGVkIGFmdGVyIGhhdmluZyBzZXQgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisvLyBCUFBJTiAgLSA4LCAxNiBvciAzMgorLy8gQlBQT1VUIC0gOCwgMTYgb3IgMzIKKworI2lmICFkZWZpbmVkKEJQUElOKSB8fCAhZGVmaW5lZChCUFBPVVQpCisjZXJyb3IgInRyYW5zVGVtcGwuaDogQlBQSU4gb3IgQlBQT1VUIG5vdCBkZWZpbmVkIgorI2VuZGlmCisKKy8vIENPTkNBVDJFIGNvbmNhdGVuYXRlcyBpdHMgYXJndW1lbnRzLCBleHBhbmRpbmcgdGhlbSBpZiB0aGV5IGFyZSBtYWNyb3MKKworI2lmbmRlZiBDT05DQVQyRQorI2RlZmluZSBDT05DQVQyKGEsYikgYSMjYgorI2RlZmluZSBDT05DQVQyRShhLGIpIENPTkNBVDIoYSxiKQorI2VuZGlmCisKKyNpZm5kZWYgQ09OQ0FUNEUKKyNkZWZpbmUgQ09OQ0FUNChhLGIsYyxkKSBhIyNiIyNjIyNkCisjZGVmaW5lIENPTkNBVDRFKGEsYixjLGQpIENPTkNBVDQoYSxiLGMsZCkKKyNlbmRpZgorCisjZGVmaW5lIElOUElYRUwgcmRyOjpDT05DQVQyRShVLEJQUElOKQorI2RlZmluZSBPVVRQSVhFTCByZHI6OkNPTkNBVDJFKFUsQlBQT1VUKQorI2RlZmluZSB0cmFuc1NpbXBsZUlOdG9PVVQgQ09OQ0FUNEUodHJhbnNTaW1wbGUsQlBQSU4sdG8sQlBQT1VUKQorI2RlZmluZSB0cmFuc1JHQklOdG9PVVQgQ09OQ0FUNEUodHJhbnNSR0IsQlBQSU4sdG8sQlBQT1VUKQorI2RlZmluZSB0cmFuc1JHQkN1YmVJTnRvT1VUIENPTkNBVDRFKHRyYW5zUkdCQ3ViZSxCUFBJTix0byxCUFBPVVQpCisKKyNpZiAoQlBQSU4gPD0gMTYpCisKKy8vIHRyYW5zU2ltcGxlSU50b09VVCB1c2VzIGEgc2luZ2xlIHRhYmxlLiAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgYW55IGluY29taW5nCisvLyBhbmQgb3V0Z29pbmcgcGl4ZWwgZm9ybWF0cywgYXMgbG9uZyBhcyB0aGUgaW5jb21pbmcgcGl4ZWwgZm9ybWF0IGlzIG5vdCB0b28KKy8vIGxhcmdlIChmb3IgMTZicHAsIHRoZSB0YWJsZSBuZWVkcyA2NEsgZW50cmllcykuCisKK3ZvaWQgdHJhbnNTaW1wbGVJTnRvT1VUICh2b2lkKiB0YWJsZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4ZWxGb3JtYXQmIGluUEYsIHZvaWQqIGluUHRyLCBpbnQgaW5TdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4ZWxGb3JtYXQmIG91dFBGLCB2b2lkKiBvdXRQdHIsIGludCBvdXRTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICBPVVRQSVhFTCogdGFibGUgPSAoT1VUUElYRUwqKXRhYmxlXzsKKyAgSU5QSVhFTCogaXAgPSAoSU5QSVhFTCopaW5QdHI7CisgIE9VVFBJWEVMKiBvcCA9IChPVVRQSVhFTCopb3V0UHRyOworICBpbnQgaW5FeHRyYSA9IGluU3RyaWRlIC0gd2lkdGg7CisgIGludCBvdXRFeHRyYSA9IG91dFN0cmlkZSAtIHdpZHRoOworCisgIHdoaWxlIChoZWlnaHQgPiAwKSB7CisgICAgT1VUUElYRUwqIG9wRW5kT2ZSb3cgPSBvcCArIHdpZHRoOworICAgIHdoaWxlIChvcCA8IG9wRW5kT2ZSb3cpCisgICAgICAqb3ArKyA9IHRhYmxlWyppcCsrXTsKKyAgICBpcCArPSBpbkV4dHJhOworICAgIG9wICs9IG91dEV4dHJhOworICAgIGhlaWdodC0tOworICB9Cit9CisKKyNlbmRpZgorCisjaWYgKEJQUElOID49IDE2KQorCisvLyB0cmFuc1JHQklOdG9PVVQgdXNlcyB0aHJlZSB0YWJsZXMsIG9uZSBlYWNoIGZvciByZWQsIGdyZWVuIGFuZCBibHVlCisvLyBjb21wb25lbnRzIGFuZCBhZGRzIHRoZSB2YWx1ZXMgdG8gcHJvZHVjZSB0aGUgcmVzdWx0LiAgVGhpcyBjYW4gYmUgdXNlZAorLy8gd2hlcmUgYSBzaW5nbGUgdGFibGUgd291bGQgYmUgdG9vIGxhcmdlIChlLmcuIDMyYnBwKS4gIEl0IG9ubHkgd29ya3MgZm9yIGEKKy8vIHRydWVDb2xvdXIgaW5jb21pbmcgcGl4ZWwgZm9ybWF0LiAgVXN1YWxseSB0aGUgb3V0Z29pbmcgcGl4ZWwgZm9ybWF0IGlzCisvLyB0cnVlQ29sb3VyLCBidXQgd2UgYWRkIHJhdGhlciB0aGFuIE9SaW5nIHRoZSB0aHJlZSB2YWx1ZXMgc28gdGhhdCBpdCBpcyBhbHNvCisvLyBwb3NzaWJsZSB0byBnZW5lcmF0ZSBhbiBpbmRleCBpbnRvIGEgY29sb3VyIGN1YmUuICBJIGJlbGlldmUgdGhhdCBpbiBtb3N0CisvLyBjYXNlcyBhZGRpbmcgaXMganVzdCBhcyBmYXN0IGFzIE9SaW5nIC0gaWYgbm90IHRoZW4gd2Ugc2hvdWxkIHNwbGl0IHRoaXMKKy8vIGludG8gdHdvIGRpZmZlcmVudCBmdW5jdGlvbnMgZm9yIGVmZmljaWVuY3kuCisKK3ZvaWQgdHJhbnNSR0JJTnRvT1VUICh2b2lkKiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhlbEZvcm1hdCYgaW5QRiwgdm9pZCogaW5QdHIsIGludCBpblN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhlbEZvcm1hdCYgb3V0UEYsIHZvaWQqIG91dFB0ciwgaW50IG91dFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgIE9VVFBJWEVMKiByZWRUYWJsZSA9IChPVVRQSVhFTCopdGFibGU7CisgIE9VVFBJWEVMKiBncmVlblRhYmxlID0gcmVkVGFibGUgKyBpblBGLnJlZE1heCArIDE7CisgIE9VVFBJWEVMKiBibHVlVGFibGUgPSBncmVlblRhYmxlICsgaW5QRi5ncmVlbk1heCArIDE7CisgIElOUElYRUwqIGlwID0gKElOUElYRUwqKWluUHRyOworICBPVVRQSVhFTCogb3AgPSAoT1VUUElYRUwqKW91dFB0cjsKKyAgaW50IGluRXh0cmEgPSBpblN0cmlkZSAtIHdpZHRoOworICBpbnQgb3V0RXh0cmEgPSBvdXRTdHJpZGUgLSB3aWR0aDsKKworICB3aGlsZSAoaGVpZ2h0ID4gMCkgeworICAgIE9VVFBJWEVMKiBvcEVuZE9mUm93ID0gb3AgKyB3aWR0aDsKKyAgICB3aGlsZSAob3AgPCBvcEVuZE9mUm93KSB7CisgICAgICAqb3ArKyA9IChyZWRUYWJsZSAgWygqaXAgPj4gaW5QRi5yZWRTaGlmdCkgICAmIGluUEYucmVkTWF4XSArCisgICAgICAgICAgICAgICBncmVlblRhYmxlWygqaXAgPj4gaW5QRi5ncmVlblNoaWZ0KSAmIGluUEYuZ3JlZW5NYXhdICsKKyAgICAgICAgICAgICAgIGJsdWVUYWJsZSBbKCppcCA+PiBpblBGLmJsdWVTaGlmdCkgICYgaW5QRi5ibHVlTWF4XSk7CisgICAgICBpcCsrOworICAgIH0KKyAgICBpcCArPSBpbkV4dHJhOworICAgIG9wICs9IG91dEV4dHJhOworICAgIGhlaWdodC0tOworICB9Cit9CisKKy8vIHRyYW5zUkdCQ3ViZUlOdG9PVVQgaXMgc2ltaWxhciB0byB0cmFuc1JHQklOdG9PVVQgYnV0IGFsc28gbG9va3MgdXAgdGhlCisvLyBjb2xvdXIgY3ViZSBpbmRleCBpbiBhIGZvdXJ0aCB0YWJsZSB0byB5aWVsZCBhIHBpeGVsIHZhbHVlLgorCit2b2lkIHRyYW5zUkdCQ3ViZUlOdG9PVVQgKHZvaWQqIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhlbEZvcm1hdCYgaW5QRiwgdm9pZCogaW5QdHIsIGludCBpblN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4ZWxGb3JtYXQmIG91dFBGLCB2b2lkKiBvdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRTdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgT1VUUElYRUwqIHJlZFRhYmxlID0gKE9VVFBJWEVMKil0YWJsZTsKKyAgT1VUUElYRUwqIGdyZWVuVGFibGUgPSByZWRUYWJsZSArIGluUEYucmVkTWF4ICsgMTsKKyAgT1VUUElYRUwqIGJsdWVUYWJsZSA9IGdyZWVuVGFibGUgKyBpblBGLmdyZWVuTWF4ICsgMTsKKyAgT1VUUElYRUwqIGN1YmVUYWJsZSA9IGJsdWVUYWJsZSArIGluUEYuYmx1ZU1heCArIDE7CisgIElOUElYRUwqIGlwID0gKElOUElYRUwqKWluUHRyOworICBPVVRQSVhFTCogb3AgPSAoT1VUUElYRUwqKW91dFB0cjsKKyAgaW50IGluRXh0cmEgPSBpblN0cmlkZSAtIHdpZHRoOworICBpbnQgb3V0RXh0cmEgPSBvdXRTdHJpZGUgLSB3aWR0aDsKKworICB3aGlsZSAoaGVpZ2h0ID4gMCkgeworICAgIE9VVFBJWEVMKiBvcEVuZE9mUm93ID0gb3AgKyB3aWR0aDsKKyAgICB3aGlsZSAob3AgPCBvcEVuZE9mUm93KSB7CisgICAgICAqb3ArKyA9IGN1YmVUYWJsZVsocmVkVGFibGUgIFsoKmlwID4+IGluUEYucmVkU2hpZnQpICAgJiBpblBGLnJlZE1heF0gKworICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuVGFibGVbKCppcCA+PiBpblBGLmdyZWVuU2hpZnQpICYgaW5QRi5ncmVlbk1heF0gKworICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWVUYWJsZSBbKCppcCA+PiBpblBGLmJsdWVTaGlmdCkgICYgaW5QRi5ibHVlTWF4XSldOworICAgICAgaXArKzsKKyAgICB9CisgICAgaXAgKz0gaW5FeHRyYTsKKyAgICBvcCArPSBvdXRFeHRyYTsKKyAgICBoZWlnaHQtLTsKKyAgfQorfQorCisjZW5kaWYKKworI3VuZGVmIElOUElYRUwKKyN1bmRlZiBPVVRQSVhFTAorI3VuZGVmIHRyYW5zU2ltcGxlSU50b09VVAorI3VuZGVmIHRyYW5zUkdCSU50b09VVAorI3VuZGVmIHRyYW5zUkdCQ3ViZUlOdG9PVVQKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvdXRpbC5jeHggYi9jb21tb24vcmZiL3V0aWwuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NDU0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL3V0aWwuY3h4CkBAIC0wLDAgKzEsMTg0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFwcGxpZXMgdG8gc3RjYXNlY21wIGFuZCBzdHJuY2FzZWNtcCBpbXBsZW1lbnRhdGlvbnM6CisgKgorICogQ29weXJpZ2h0IChjKSAxOTg3IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZCBhbmQgdGhhdCBkdWUgY3JlZGl0IGlzIGdpdmVuCisgKiB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5LiBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eQorICogbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRoaXMgc29mdHdhcmUKKyAqIGlzIHByb3ZpZGVkIGBgYXMgaXMnJyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaW5jbHVkZSA8cmZiL3V0aWwuaD4KKworLy8gUHJvdmlkZSBzdHJjYXNlY21wKCkgYW5kL29yIHN0cm5jYXNlY21wKCkgaWYgYWJzZW50IG9uIHRoaXMgc3lzdGVtLgorCisjaWZuZGVmIFdJTjMyCisjaWYgIWRlZmluZWQoSEFWRV9TVFJDQVNFQ01QKSB8fCAhZGVmaW5lZChIQVZFX1NUUk5DQVNFQ01QKQorCitleHRlcm4gIkMiIHsKKworLyoKKyAqIFRoaXMgYXJyYXkgaXMgZGVzaWduZWQgZm9yIG1hcHBpbmcgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVyCisgKiB0b2dldGhlciBmb3IgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24uICBUaGUgbWFwcGluZ3MgYXJlCisgKiBiYXNlZCB1cG9uIGFzY2lpIGNoYXJhY3RlciBzZXF1ZW5jZXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNfY2hhcm1hcFtdID0geworCSdcMDAwJywgJ1wwMDEnLCAnXDAwMicsICdcMDAzJywgJ1wwMDQnLCAnXDAwNScsICdcMDA2JywgJ1wwMDcnLAorCSdcMDEwJywgJ1wwMTEnLCAnXDAxMicsICdcMDEzJywgJ1wwMTQnLCAnXDAxNScsICdcMDE2JywgJ1wwMTcnLAorCSdcMDIwJywgJ1wwMjEnLCAnXDAyMicsICdcMDIzJywgJ1wwMjQnLCAnXDAyNScsICdcMDI2JywgJ1wwMjcnLAorCSdcMDMwJywgJ1wwMzEnLCAnXDAzMicsICdcMDMzJywgJ1wwMzQnLCAnXDAzNScsICdcMDM2JywgJ1wwMzcnLAorCSdcMDQwJywgJ1wwNDEnLCAnXDA0MicsICdcMDQzJywgJ1wwNDQnLCAnXDA0NScsICdcMDQ2JywgJ1wwNDcnLAorCSdcMDUwJywgJ1wwNTEnLCAnXDA1MicsICdcMDUzJywgJ1wwNTQnLCAnXDA1NScsICdcMDU2JywgJ1wwNTcnLAorCSdcMDYwJywgJ1wwNjEnLCAnXDA2MicsICdcMDYzJywgJ1wwNjQnLCAnXDA2NScsICdcMDY2JywgJ1wwNjcnLAorCSdcMDcwJywgJ1wwNzEnLCAnXDA3MicsICdcMDczJywgJ1wwNzQnLCAnXDA3NScsICdcMDc2JywgJ1wwNzcnLAorCSdcMTAwJywgJ1wxNDEnLCAnXDE0MicsICdcMTQzJywgJ1wxNDQnLCAnXDE0NScsICdcMTQ2JywgJ1wxNDcnLAorCSdcMTUwJywgJ1wxNTEnLCAnXDE1MicsICdcMTUzJywgJ1wxNTQnLCAnXDE1NScsICdcMTU2JywgJ1wxNTcnLAorCSdcMTYwJywgJ1wxNjEnLCAnXDE2MicsICdcMTYzJywgJ1wxNjQnLCAnXDE2NScsICdcMTY2JywgJ1wxNjcnLAorCSdcMTcwJywgJ1wxNzEnLCAnXDE3MicsICdcMTMzJywgJ1wxMzQnLCAnXDEzNScsICdcMTM2JywgJ1wxMzcnLAorCSdcMTQwJywgJ1wxNDEnLCAnXDE0MicsICdcMTQzJywgJ1wxNDQnLCAnXDE0NScsICdcMTQ2JywgJ1wxNDcnLAorCSdcMTUwJywgJ1wxNTEnLCAnXDE1MicsICdcMTUzJywgJ1wxNTQnLCAnXDE1NScsICdcMTU2JywgJ1wxNTcnLAorCSdcMTYwJywgJ1wxNjEnLCAnXDE2MicsICdcMTYzJywgJ1wxNjQnLCAnXDE2NScsICdcMTY2JywgJ1wxNjcnLAorCSdcMTcwJywgJ1wxNzEnLCAnXDE3MicsICdcMTczJywgJ1wxNzQnLCAnXDE3NScsICdcMTc2JywgJ1wxNzcnLAorCSdcMjAwJywgJ1wyMDEnLCAnXDIwMicsICdcMjAzJywgJ1wyMDQnLCAnXDIwNScsICdcMjA2JywgJ1wyMDcnLAorCSdcMjEwJywgJ1wyMTEnLCAnXDIxMicsICdcMjEzJywgJ1wyMTQnLCAnXDIxNScsICdcMjE2JywgJ1wyMTcnLAorCSdcMjIwJywgJ1wyMjEnLCAnXDIyMicsICdcMjIzJywgJ1wyMjQnLCAnXDIyNScsICdcMjI2JywgJ1wyMjcnLAorCSdcMjMwJywgJ1wyMzEnLCAnXDIzMicsICdcMjMzJywgJ1wyMzQnLCAnXDIzNScsICdcMjM2JywgJ1wyMzcnLAorCSdcMjQwJywgJ1wyNDEnLCAnXDI0MicsICdcMjQzJywgJ1wyNDQnLCAnXDI0NScsICdcMjQ2JywgJ1wyNDcnLAorCSdcMjUwJywgJ1wyNTEnLCAnXDI1MicsICdcMjUzJywgJ1wyNTQnLCAnXDI1NScsICdcMjU2JywgJ1wyNTcnLAorCSdcMjYwJywgJ1wyNjEnLCAnXDI2MicsICdcMjYzJywgJ1wyNjQnLCAnXDI2NScsICdcMjY2JywgJ1wyNjcnLAorCSdcMjcwJywgJ1wyNzEnLCAnXDI3MicsICdcMjczJywgJ1wyNzQnLCAnXDI3NScsICdcMjc2JywgJ1wyNzcnLAorCSdcMzAwJywgJ1wzNDEnLCAnXDM0MicsICdcMzQzJywgJ1wzNDQnLCAnXDM0NScsICdcMzQ2JywgJ1wzNDcnLAorCSdcMzUwJywgJ1wzNTEnLCAnXDM1MicsICdcMzUzJywgJ1wzNTQnLCAnXDM1NScsICdcMzU2JywgJ1wzNTcnLAorCSdcMzYwJywgJ1wzNjEnLCAnXDM2MicsICdcMzYzJywgJ1wzNjQnLCAnXDM2NScsICdcMzY2JywgJ1wzNjcnLAorCSdcMzcwJywgJ1wzNzEnLCAnXDM3MicsICdcMzMzJywgJ1wzMzQnLCAnXDMzNScsICdcMzM2JywgJ1wzMzcnLAorCSdcMzQwJywgJ1wzNDEnLCAnXDM0MicsICdcMzQzJywgJ1wzNDQnLCAnXDM0NScsICdcMzQ2JywgJ1wzNDcnLAorCSdcMzUwJywgJ1wzNTEnLCAnXDM1MicsICdcMzUzJywgJ1wzNTQnLCAnXDM1NScsICdcMzU2JywgJ1wzNTcnLAorCSdcMzYwJywgJ1wzNjEnLCAnXDM2MicsICdcMzYzJywgJ1wzNjQnLCAnXDM2NScsICdcMzY2JywgJ1wzNjcnLAorCSdcMzcwJywgJ1wzNzEnLCAnXDM3MicsICdcMzczJywgJ1wzNzQnLCAnXDM3NScsICdcMzc2JywgJ1wzNzcnLAorfTsKKworI2lmbmRlZiBIQVZFX1NUUkNBU0VDTVAKK2ludAorc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisgICAgdW5zaWduZWQgY2hhciB1MSwgdTI7CisKKyAgICBmb3IgKDs7KSB7CisJdTEgPSAodW5zaWduZWQgY2hhcikgKnMxKys7CisJdTIgPSAodW5zaWduZWQgY2hhcikgKnMyKys7CisJaWYgKHNfY2hhcm1hcFt1MV0gIT0gc19jaGFybWFwW3UyXSkgeworCSAgICByZXR1cm4gc19jaGFybWFwW3UxXSAtIHNfY2hhcm1hcFt1Ml07CisJfQorCWlmICh1MSA9PSAnXDAnKSB7CisJICAgIHJldHVybiAwOworCX0KKyAgICB9Cit9CisjZW5kaWYgLy8gIWRlZmluZWQoSEFWRV9TVFJDQVNFQ01QKQorCisjaWZuZGVmIEhBVkVfU1RSTkNBU0VDTVAKK2ludAorc3RybmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHUxLCB1MjsKKworICAgIGZvciAoOyBuICE9IDA7IC0tbikgeworCXUxID0gKHVuc2lnbmVkIGNoYXIpICpzMSsrOworCXUyID0gKHVuc2lnbmVkIGNoYXIpICpzMisrOworCWlmIChzX2NoYXJtYXBbdTFdICE9IHNfY2hhcm1hcFt1Ml0pIHsKKwkgICAgcmV0dXJuIHNfY2hhcm1hcFt1MV0gLSBzX2NoYXJtYXBbdTJdOworCX0KKwlpZiAodTEgPT0gJ1wwJykgeworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlmIC8vICFkZWZpbmVkKEhBVkVfU1RSTkNBU0VDTVApCisKK30gLy8gZXh0ZXJuICJDIgorCisjZW5kaWYgLy8gIWRlZmluZWQoSEFWRV9TVFJDQVNFQ01QKSB8fCAhZGVmaW5lZChIQVZFX1NUUk5DQVNFQ01QKQorI2VuZGlmIC8vIGRlZmluZWQoV0lOMzIpCisKK25hbWVzcGFjZSByZmIgeworCisgIGNoYXIqIHN0ckR1cChjb25zdCBjaGFyKiBzKSB7CisgICAgaWYgKCFzKSByZXR1cm4gMDsKKyAgICBpbnQgbCA9IHN0cmxlbihzKTsKKyAgICBjaGFyKiByID0gbmV3IGNoYXJbbCsxXTsKKyAgICBtZW1jcHkociwgcywgbCsxKTsKKyAgICByZXR1cm4gcjsKKyAgfTsKKworICB2b2lkIHN0ckZyZWUoY2hhciogcykgeworICAgIGRlbGV0ZSBbXSBzOworICB9CisKKworICBib29sIHN0clNwbGl0KGNvbnN0IGNoYXIqIHNyYywgY29uc3QgY2hhciBsaW1pdGVyLCBjaGFyKiogb3V0MSwgY2hhcioqIG91dDIsIGJvb2wgZnJvbUVuZCkgeworICAgIENoYXJBcnJheSBvdXQxb2xkLCBvdXQyb2xkOworICAgIGlmIChvdXQxKSBvdXQxb2xkLmJ1ZiA9ICpvdXQxOworICAgIGlmIChvdXQyKSBvdXQyb2xkLmJ1ZiA9ICpvdXQyOworICAgIGludCBsZW4gPSBzdHJsZW4oc3JjKTsKKyAgICBpbnQgaT0wLCBpbmNyZW1lbnQ9MSwgbGltaXQ9bGVuOworICAgIGlmIChmcm9tRW5kKSB7CisgICAgICBpPWxlbi0xOyBpbmNyZW1lbnQgPSAtMTsgbGltaXQgPSAtMTsKKyAgICB9CisgICAgd2hpbGUgKGkhPWxpbWl0KSB7CisgICAgICBpZiAoc3JjW2ldID09IGxpbWl0ZXIpIHsKKyAgICAgICAgaWYgKG91dDEpIHsKKyAgICAgICAgICAqb3V0MSA9IG5ldyBjaGFyW2krMV07CisgICAgICAgICAgaWYgKGkpIG1lbWNweSgqb3V0MSwgc3JjLCBpKTsKKyAgICAgICAgICAoKm91dDEpW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0MikgeworICAgICAgICAgICpvdXQyID0gbmV3IGNoYXJbbGVuLWldOworICAgICAgICAgIGlmIChsZW4taS0xKSBtZW1jcHkoKm91dDIsICZzcmNbaSsxXSwgbGVuLWktMSk7CisgICAgICAgICAgKCpvdXQyKVtsZW4taS0xXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpKz1pbmNyZW1lbnQ7CisgICAgfQorICAgIGlmIChvdXQxKSAqb3V0MSA9IHN0ckR1cChzcmMpOworICAgIGlmIChvdXQyKSAqb3V0MiA9IDA7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBzdHJDb250YWlucyhjb25zdCBjaGFyKiBzcmMsIGNoYXIgYykgeworICAgIGludCBsPXN0cmxlbihzcmMpOworICAgIGZvciAoaW50IGk9MDsgaTxsOyBpKyspCisgICAgICBpZiAoc3JjW2ldID09IGMpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgc3RyQ29weShjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBzcmMsIGludCBkZXN0bGVuKSB7CisgICAgaWYgKHNyYykKKyAgICAgIHN0cm5jcHkoZGVzdCwgc3JjLCBkZXN0bGVuLTEpOworICAgIGRlc3Rbc3JjID8gZGVzdGxlbi0xIDogMF0gPSAwOworICB9CisKK307CmRpZmYgLS1naXQgYS9jb21tb24vcmZiL3V0aWwuaCBiL2NvbW1vbi9yZmIvdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMjA1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vcmZiL3V0aWwuaApAQCAtMCwwICsxLDExMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLworLy8gdXRpbC5oIC0gbWlzY2VsbGFuZW91cyB1c2VmdWwgYml0cworLy8KKworI2lmbmRlZiBfX1JGQl9VVElMX0hfXworI2RlZmluZSBfX1JGQl9VVElMX0hfXworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSByZmIgeworCisgIC8vIC09LSBDbGFzcyB0byBoYW5kbGUgY2xlYW51cCBvZiBhcnJheXMgb2YgY2hhcmFjdGVycworICBjbGFzcyBDaGFyQXJyYXkgeworICBwdWJsaWM6CisgICAgQ2hhckFycmF5KCkgOiBidWYoMCkge30KKyAgICBDaGFyQXJyYXkoY2hhciogc3RyKSA6IGJ1ZihzdHIpIHt9IC8vIG5vdGU6IGFzc3VtZXMgb3duZXJzaGlwCisgICAgQ2hhckFycmF5KGludCBsZW4pIHsKKyAgICAgIGJ1ZiA9IG5ldyBjaGFyW2xlbl07CisgICAgfQorICAgIH5DaGFyQXJyYXkoKSB7CisgICAgICBkZWxldGUgW10gYnVmOworICAgIH0KKyAgICAvLyBHZXQgdGhlIGJ1ZmZlciBwb2ludGVyICYgY2xlYXIgaXQgKGkuZS4gY2FsbGVyIHRha2VzIG93bmVyc2hpcCkKKyAgICBjaGFyKiB0YWtlQnVmKCkge2NoYXIqIHRtcCA9IGJ1ZjsgYnVmID0gMDsgcmV0dXJuIHRtcDt9CisgICAgdm9pZCByZXBsYWNlQnVmKGNoYXIqIGIpIHtkZWxldGUgW10gYnVmOyBidWYgPSBiO30KKyAgICBjaGFyKiBidWY7CisgIHByaXZhdGU6CisgICAgQ2hhckFycmF5KGNvbnN0IENoYXJBcnJheSYpOworICAgIENoYXJBcnJheSYgb3BlcmF0b3I9KGNvbnN0IENoYXJBcnJheSYpOworICB9OworCisgIGNoYXIqIHN0ckR1cChjb25zdCBjaGFyKiBzKTsKKyAgdm9pZCBzdHJGcmVlKGNoYXIqIHMpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBzcGxpdCBzdWNjZXNzZnVsLiAgUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisgIC8vIEFMV0FZUyAqY29waWVzKiBmaXJzdCBwYXJ0IG9mIHN0cmluZyB0byBvdXQxIGJ1ZmZlci4KKyAgLy8gSWYgbGltaXRlciBub3QgZm91bmQsIGxlYXZlcyBvdXQyIGFsb25lIChudWxsKSBhbmQganVzdCBjb3BpZXMgdG8gb3V0MS4KKyAgLy8gSWYgb3V0MSBvciBvdXQyIG5vbi16ZXJvLCBjYWxscyBzdHJGcmVlIGFuZCB6ZXJvZXMgdGhlbS4KKyAgLy8gSWYgZnJvbUVuZCBpcyB0cnVlLCBzcGxpdHMgYXQgZW5kIG9mIHN0cmluZyByYXRoZXIgdGhhbiBiZWdpbm5pbmcuCisgIC8vIEVpdGhlciBvdXQxIG9yIG91dDIgbWF5IGJlIG51bGwsIGluIHdoaWNoIGNhc2UgdGhlIHNwbGl0IHdpbGwgbm90IHJldHVybgorICAvLyB0aGF0IHBhcnQgb2YgdGhlIHN0cmluZy4gIE9idmlvdXNseSwgc2V0dGluZyBib3RoIHRvIDAgaXMgbm90IHVzZWZ1bC4uLgorICBib29sIHN0clNwbGl0KGNvbnN0IGNoYXIqIHNyYywgY29uc3QgY2hhciBsaW1pdGVyLCBjaGFyKiogb3V0MSwgY2hhcioqIG91dDIsIGJvb2wgZnJvbUVuZD1mYWxzZSk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHNyYyBjb250YWlucyBjCisgIGJvb2wgc3RyQ29udGFpbnMoY29uc3QgY2hhciogc3JjLCBjaGFyIGMpOworCisgIC8vIENvcGllcyBzcmMgdG8gZGVzdCwgdXAgdG8gc3BlY2lmaWVkIGxlbmd0aC0xLCBhbmQgZ3VhcmFudGVlcyB0ZXJtaW5hdGlvbgorICB2b2lkIHN0ckNvcHkoY2hhciogZGVzdCwgY29uc3QgY2hhciogc3JjLCBpbnQgZGVzdGxlbik7CisKKworICAvLyBIRUxQRVIgZnVuY3Rpb25zIGZvciB0aW1lb3V0IGhhbmRsaW5nCisKKyAgLy8gc29vbmVzdFRpbWVvdXQoKSBpcyBhIGZ1bmN0aW9uIHRvIGhlbHAgd29yayBvdXQgdGhlIHNvb25lc3Qgb2Ygc2V2ZXJhbAorICAvLyAgIHRpbWVvdXRzLgorICBpbmxpbmUgdm9pZCBzb29uZXN0VGltZW91dChpbnQqIHRpbWVvdXQsIGludCBuZXdUaW1lb3V0KSB7CisgICAgaWYgKG5ld1RpbWVvdXQgJiYgKCEqdGltZW91dCB8fCBuZXdUaW1lb3V0IDwgKnRpbWVvdXQpKQorICAgICAgKnRpbWVvdXQgPSBuZXdUaW1lb3V0OworICB9CisKKyAgLy8gc2Vjc1RvTWlsbGlzKCkgdHVybnMgc2Vjb25kcyBpbnRvIG1pbGxpc2Vjb25kcywgY2FwcGluZyB0aGUgdmFsdWUgc28gaXQKKyAgLy8gICBjYW4ndCB3cmFwIHJvdW5kIGFuZCBiZWNvbWUgLXZlCisgIGlubGluZSBpbnQgc2Vjc1RvTWlsbGlzKGludCBzZWNzKSB7CisgICAgcmV0dXJuIChzZWNzIDwgMCB8fCBzZWNzID4gKElOVF9NQVgvMTAwMCkgPyBJTlRfTUFYIDogc2VjcyAqIDEwMDApOworICB9Cit9CisKKy8vIFNvbWUgcGxhdGZvcm1zIChlLmcuIFdpbmRvd3MpIGluY2x1ZGUgbWF4KCkgYW5kIG1pbigpIG1hY3JvcyBpbiB0aGVpcgorLy8gc3RhbmRhcmQgaGVhZGVycywgYnV0IHRoZXkgYXJlIGFsc28gc3RhbmRhcmQgQysrIHRlbXBsYXRlIGZ1bmN0aW9ucywgc28gc29tZQorLy8gQysrIGhlYWRlcnMgd2lsbCB1bmRlZmluZSB0aGVtLiAgU28gd2Ugc3RlZXIgY2xlYXIgb2YgdGhlIG5hbWVzIG1pbiBhbmQgbWF4CisvLyBhbmQgZGVmaW5lIF9fcmZibWluIGFuZCBfX3JmYm1heCBpbnN0ZWFkLgorCisjaWZuZGVmIF9fcmZibWF4CisjZGVmaW5lIF9fcmZibWF4KGEsYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIF9fcmZibWluCisjZGVmaW5lIF9fcmZibWluKGEsYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKy8vIERlY2xhcmUgc3RyY2FzZWNtcCgpIGFuZC9vciBzdHJuY2FzZWNtcCgpIGlmIGFic2VudCBvbiB0aGlzIHN5c3RlbS4KKworI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChIQVZFX1NUUkNBU0VDTVApCitleHRlcm4gIkMiIHsKKyAgaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK30KKyNlbmRpZgorI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChIQVZFX1NUUk5DQVNFQ01QKQorZXh0ZXJuICJDIiB7CisgIGludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKTsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvenJsZURlY29kZS5oIGIvY29tbW9uL3JmYi96cmxlRGVjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkMjc5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvenJsZURlY29kZS5oCkBAIC0wLDAgKzEsMjUxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vCisvLyBaUkxFIGRlY29kaW5nIGZ1bmN0aW9uLgorLy8KKy8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgYWZ0ZXIgaGF2aW5nIHNldCB0aGUgZm9sbG93aW5nIG1hY3JvczoKKy8vIEJQUCAgICAgICAgICAgICAgICAtIDgsIDE2IG9yIDMyCisvLyBFWFRSQV9BUkdTICAgICAgICAgLSBvcHRpb25hbCBleHRyYSBhcmd1bWVudHMKKy8vIEZJTExfUkVDVCAgICAgICAgICAtIGZpbGwgYSByZWN0YW5nbGUgd2l0aCBhIHNpbmdsZSBjb2xvdXIKKy8vIElNQUdFX1JFQ1QgICAgICAgICAtIGRyYXcgYSByZWN0YW5nbGUgb2YgcGl4ZWwgZGF0YSBmcm9tIGEgYnVmZmVyCisKKyNpbmNsdWRlIDxyZHIvSW5TdHJlYW0uaD4KKyNpbmNsdWRlIDxyZHIvWmxpYkluU3RyZWFtLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSByZmIgeworCisvLyBDT05DQVQyRSBjb25jYXRlbmF0ZXMgaXRzIGFyZ3VtZW50cywgZXhwYW5kaW5nIHRoZW0gaWYgdGhleSBhcmUgbWFjcm9zCisKKyNpZm5kZWYgQ09OQ0FUMkUKKyNkZWZpbmUgQ09OQ0FUMihhLGIpIGEjI2IKKyNkZWZpbmUgQ09OQ0FUMkUoYSxiKSBDT05DQVQyKGEsYikKKyNlbmRpZgorCisjaWZkZWYgQ1BJWEVMCisjZGVmaW5lIFBJWEVMX1QgcmRyOjpDT05DQVQyRShVLEJQUCkKKyNkZWZpbmUgUkVBRF9QSVhFTCBDT05DQVQyRShyZWFkT3BhcXVlLENQSVhFTCkKKyNkZWZpbmUgWlJMRV9ERUNPREUgQ09OQ0FUMkUoenJsZURlY29kZSxDUElYRUwpCisjZWxzZQorI2RlZmluZSBQSVhFTF9UIHJkcjo6Q09OQ0FUMkUoVSxCUFApCisjZGVmaW5lIFJFQURfUElYRUwgQ09OQ0FUMkUocmVhZE9wYXF1ZSxCUFApCisjZGVmaW5lIFpSTEVfREVDT0RFIENPTkNBVDJFKHpybGVEZWNvZGUsQlBQKQorI2VuZGlmCisKK3ZvaWQgWlJMRV9ERUNPREUgKGNvbnN0IFJlY3QmIHIsIHJkcjo6SW5TdHJlYW0qIGlzLAorICAgICAgICAgICAgICAgICAgICAgIHJkcjo6WmxpYkluU3RyZWFtKiB6aXMsIFBJWEVMX1QqIGJ1ZgorI2lmZGVmIEVYVFJBX0FSR1MKKyAgICAgICAgICAgICAgICAgICAgICAsIEVYVFJBX0FSR1MKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgaW50IGxlbmd0aCA9IGlzLT5yZWFkVTMyKCk7CisgIHppcy0+c2V0VW5kZXJseWluZyhpcywgbGVuZ3RoKTsKKyAgUmVjdCB0OworCisgIGZvciAodC50bC55ID0gci50bC55OyB0LnRsLnkgPCByLmJyLnk7IHQudGwueSArPSA2NCkgeworCisgICAgdC5ici55ID0gX19yZmJtaW4oci5ici55LCB0LnRsLnkgKyA2NCk7CisKKyAgICBmb3IgKHQudGwueCA9IHIudGwueDsgdC50bC54IDwgci5ici54OyB0LnRsLnggKz0gNjQpIHsKKworICAgICAgdC5ici54ID0gX19yZmJtaW4oci5ici54LCB0LnRsLnggKyA2NCk7CisKKyAgICAgIGludCBtb2RlID0gemlzLT5yZWFkVTgoKTsKKyAgICAgIGJvb2wgcmxlID0gbW9kZSAmIDEyODsKKyAgICAgIGludCBwYWxTaXplID0gbW9kZSAmIDEyNzsKKyAgICAgIFBJWEVMX1QgcGFsZXR0ZVsxMjhdOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbFNpemU7IGkrKykgeworICAgICAgICBwYWxldHRlW2ldID0gemlzLT5SRUFEX1BJWEVMKCk7CisgICAgICB9CisKKyAgICAgIGlmIChwYWxTaXplID09IDEpIHsKKyAgICAgICAgUElYRUxfVCBwaXggPSBwYWxldHRlWzBdOworICAgICAgICBGSUxMX1JFQ1QodCxwaXgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFybGUpIHsKKyAgICAgICAgaWYgKHBhbFNpemUgPT0gMCkgeworCisgICAgICAgICAgLy8gcmF3CisKKyNpZmRlZiBDUElYRUwKKyAgICAgICAgICBmb3IgKFBJWEVMX1QqIHB0ciA9IGJ1ZjsgcHRyIDwgYnVmK3QuYXJlYSgpOyBwdHIrKykgeworICAgICAgICAgICAgKnB0ciA9IHppcy0+UkVBRF9QSVhFTCgpOworICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgemlzLT5yZWFkQnl0ZXMoYnVmLCB0LmFyZWEoKSAqIChCUFAgLyA4KSk7CisjZW5kaWYKKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgLy8gcGFja2VkIHBpeGVscworICAgICAgICAgIGludCBicHBwID0gKChwYWxTaXplID4gMTYpID8gOCA6CisgICAgICAgICAgICAgICAgICAgICAgKChwYWxTaXplID4gNCkgPyA0IDogKChwYWxTaXplID4gMikgPyAyIDogMSkpKTsKKworICAgICAgICAgIFBJWEVMX1QqIHB0ciA9IGJ1ZjsKKworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdC5oZWlnaHQoKTsgaSsrKSB7CisgICAgICAgICAgICBQSVhFTF9UKiBlb2wgPSBwdHIgKyB0LndpZHRoKCk7CisgICAgICAgICAgICByZHI6OlU4IGJ5dGUgPSAwOworICAgICAgICAgICAgcmRyOjpVOCBuYml0cyA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChwdHIgPCBlb2wpIHsKKyAgICAgICAgICAgICAgaWYgKG5iaXRzID09IDApIHsKKyAgICAgICAgICAgICAgICBieXRlID0gemlzLT5yZWFkVTgoKTsKKyAgICAgICAgICAgICAgICBuYml0cyA9IDg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbmJpdHMgLT0gYnBwcDsKKyAgICAgICAgICAgICAgcmRyOjpVOCBpbmRleCA9IChieXRlID4+IG5iaXRzKSAmICgoMSA8PCBicHBwKSAtIDEpICYgMTI3OworICAgICAgICAgICAgICAqcHRyKysgPSBwYWxldHRlW2luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmZGVmIEZBVk9VUl9GSUxMX1JFQ1QKKyAgICAgICAvL2ZwcmludGYoc3RkZXJyLCJjb3B5aW5nIGRhdGEgdG8gc2NyZWVuICVkeCVkIGF0ICVkLCVkXG4iLAorICAgICAgICAvL3Qud2lkdGgoKSx0LmhlaWdodCgpLHQudGwueCx0LnRsLnkpOworICAgICAgICBJTUFHRV9SRUNUKHQsYnVmKTsKKyNlbmRpZgorCisgICAgICB9IGVsc2UgeworCisgICAgICAgIGlmIChwYWxTaXplID09IDApIHsKKworICAgICAgICAgIC8vIHBsYWluIFJMRQorCisgICAgICAgICAgUElYRUxfVCogcHRyID0gYnVmOworICAgICAgICAgIFBJWEVMX1QqIGVuZCA9IHB0ciArIHQuYXJlYSgpOworICAgICAgICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKKyAgICAgICAgICAgIFBJWEVMX1QgcGl4ID0gemlzLT5SRUFEX1BJWEVMKCk7CisgICAgICAgICAgICBpbnQgbGVuID0gMTsKKyAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICBiID0gemlzLT5yZWFkVTgoKTsKKyAgICAgICAgICAgICAgbGVuICs9IGI7CisgICAgICAgICAgICB9IHdoaWxlIChiID09IDI1NSk7CisKKyAgICAgICAgICAgIGFzc2VydChsZW4gPD0gZW5kIC0gcHRyKTsKKworI2lmZGVmIEZBVk9VUl9GSUxMX1JFQ1QKKyAgICAgICAgICAgIGludCBpID0gcHRyIC0gYnVmOworICAgICAgICAgICAgcHRyICs9IGxlbjsKKworICAgICAgICAgICAgaW50IHJ1blggPSBpICUgdC53aWR0aCgpOworICAgICAgICAgICAgaW50IHJ1blkgPSBpIC8gdC53aWR0aCgpOworCisgICAgICAgICAgICBpZiAocnVuWCArIGxlbiA+IHQud2lkdGgoKSkgeworICAgICAgICAgICAgICBpZiAocnVuWCAhPSAwKSB7CisgICAgICAgICAgICAgICAgRklMTF9SRUNUKFJlY3QodC50bC54K3J1blgsIHQudGwueStydW5ZLCB0LndpZHRoKCktcnVuWCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeCk7CisgICAgICAgICAgICAgICAgbGVuIC09IHQud2lkdGgoKS1ydW5YOworICAgICAgICAgICAgICAgIHJ1blggPSAwOworICAgICAgICAgICAgICAgIHJ1blkrKzsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChsZW4gPiB0LndpZHRoKCkpIHsKKyAgICAgICAgICAgICAgICBGSUxMX1JFQ1QoUmVjdCh0LnRsLngsIHQudGwueStydW5ZLCB0LndpZHRoKCksIGxlbi90LndpZHRoKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaXgpOworICAgICAgICAgICAgICAgIHJ1blkgKz0gbGVuIC8gdC53aWR0aCgpOworICAgICAgICAgICAgICAgIGxlbiA9IGxlbiAlIHQud2lkdGgoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGVuICE9IDApIHsKKyAgICAgICAgICAgICAgRklMTF9SRUNUKFJlY3QodC50bC54K3J1blgsIHQudGwueStydW5ZLCBsZW4sIDEpLCBwaXgpOworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIHdoaWxlIChsZW4tLSA+IDApICpwdHIrKyA9IHBpeDsKKyNlbmRpZgorCisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgLy8gcGFsZXR0ZSBSTEUKKworICAgICAgICAgIFBJWEVMX1QqIHB0ciA9IGJ1ZjsKKyAgICAgICAgICBQSVhFTF9UKiBlbmQgPSBwdHIgKyB0LmFyZWEoKTsKKyAgICAgICAgICB3aGlsZSAocHRyIDwgZW5kKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSB6aXMtPnJlYWRVOCgpOworICAgICAgICAgICAgaW50IGxlbiA9IDE7CisgICAgICAgICAgICBpZiAoaW5kZXggJiAxMjgpIHsKKyAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBiID0gemlzLT5yZWFkVTgoKTsKKyAgICAgICAgICAgICAgICBsZW4gKz0gYjsKKyAgICAgICAgICAgICAgfSB3aGlsZSAoYiA9PSAyNTUpOworCisgICAgICAgICAgICAgIGFzc2VydChsZW4gPD0gZW5kIC0gcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5kZXggJj0gMTI3OworCisgICAgICAgICAgICBQSVhFTF9UIHBpeCA9IHBhbGV0dGVbaW5kZXhdOworCisjaWZkZWYgRkFWT1VSX0ZJTExfUkVDVAorICAgICAgICAgICAgaW50IGkgPSBwdHIgLSBidWY7CisgICAgICAgICAgICBwdHIgKz0gbGVuOworCisgICAgICAgICAgICBpbnQgcnVuWCA9IGkgJSB0LndpZHRoKCk7CisgICAgICAgICAgICBpbnQgcnVuWSA9IGkgLyB0LndpZHRoKCk7CisKKyAgICAgICAgICAgIGlmIChydW5YICsgbGVuID4gdC53aWR0aCgpKSB7CisgICAgICAgICAgICAgIGlmIChydW5YICE9IDApIHsKKyAgICAgICAgICAgICAgICBGSUxMX1JFQ1QoUmVjdCh0LnRsLngrcnVuWCwgdC50bC55K3J1blksIHQud2lkdGgoKS1ydW5YLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4KTsKKyAgICAgICAgICAgICAgICBsZW4gLT0gdC53aWR0aCgpLXJ1blg7CisgICAgICAgICAgICAgICAgcnVuWCA9IDA7CisgICAgICAgICAgICAgICAgcnVuWSsrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGxlbiA+IHQud2lkdGgoKSkgeworICAgICAgICAgICAgICAgIEZJTExfUkVDVChSZWN0KHQudGwueCwgdC50bC55K3J1blksIHQud2lkdGgoKSwgbGVuL3Qud2lkdGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeCk7CisgICAgICAgICAgICAgICAgcnVuWSArPSBsZW4gLyB0LndpZHRoKCk7CisgICAgICAgICAgICAgICAgbGVuID0gbGVuICUgdC53aWR0aCgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZW4gIT0gMCkgeworICAgICAgICAgICAgICBGSUxMX1JFQ1QoUmVjdCh0LnRsLngrcnVuWCwgdC50bC55K3J1blksIGxlbiwgMSksIHBpeCk7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgd2hpbGUgKGxlbi0tID4gMCkgKnB0cisrID0gcGl4OworI2VuZGlmCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyNpZm5kZWYgRkFWT1VSX0ZJTExfUkVDVAorICAgICAgLy9mcHJpbnRmKHN0ZGVyciwiY29weWluZyBkYXRhIHRvIHNjcmVlbiAlZHglZCBhdCAlZCwlZFxuIiwKKyAgICAgIC8vdC53aWR0aCgpLHQuaGVpZ2h0KCksdC50bC54LHQudGwueSk7CisgICAgICBJTUFHRV9SRUNUKHQsYnVmKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIHppcy0+cmVzZXQoKTsKK30KKworI3VuZGVmIFpSTEVfREVDT0RFCisjdW5kZWYgUkVBRF9QSVhFTAorI3VuZGVmIFBJWEVMX1QKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9yZmIvenJsZUVuY29kZS5oIGIvY29tbW9uL3JmYi96cmxlRW5jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3MjYzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9yZmIvenJsZUVuY29kZS5oCkBAIC0wLDAgKzEsMzI4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vCisvLyB6cmxlRW5jb2RlLmggLSB6cmxlIGVuY29kaW5nIGZ1bmN0aW9uLgorLy8KKy8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgYWZ0ZXIgaGF2aW5nIHNldCB0aGUgZm9sbG93aW5nIG1hY3JvczoKKy8vIEJQUCAgICAgICAgICAgICAgICAtIDgsIDE2IG9yIDMyCisvLyBFWFRSQV9BUkdTICAgICAgICAgLSBvcHRpb25hbCBleHRyYSBhcmd1bWVudHMKKy8vIEdFVF9JTUFHRV9JTlRPX0JVRiAtIGdldHMgYSByZWN0YW5nbGUgb2YgcGl4ZWwgZGF0YSBpbnRvIGEgYnVmZmVyCisvLworLy8gTm90ZSB0aGF0IHRoZSBidWYgYXJndW1lbnQgdG8gWlJMRV9FTkNPREUgbmVlZHMgdG8gYmUgYXQgbGVhc3Qgb25lIHBpeGVsCisvLyBiaWdnZXIgdGhhbiB0aGUgbGFyZ2VzdCB0aWxlIG9mIHBpeGVsIGRhdGEsIHNpbmNlIHRoZSBaUkxFIGVuY29kaW5nCisvLyBhbGdvcml0aG0gd3JpdGVzIHRvIHRoZSBwb3NpdGlvbiBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBwaXhlbCBkYXRhLgorLy8KKworI2luY2x1ZGUgPHJkci9PdXRTdHJlYW0uaD4KKyNpbmNsdWRlIDxyZHIvWmxpYk91dFN0cmVhbS5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgcmZiIHsKKworLy8gQ09OQ0FUMkUgY29uY2F0ZW5hdGVzIGl0cyBhcmd1bWVudHMsIGV4cGFuZGluZyB0aGVtIGlmIHRoZXkgYXJlIG1hY3JvcworCisjaWZuZGVmIENPTkNBVDJFCisjZGVmaW5lIENPTkNBVDIoYSxiKSBhIyNiCisjZGVmaW5lIENPTkNBVDJFKGEsYikgQ09OQ0FUMihhLGIpCisjZW5kaWYKKworI2lmZGVmIENQSVhFTAorI2RlZmluZSBQSVhFTF9UIHJkcjo6Q09OQ0FUMkUoVSxCUFApCisjZGVmaW5lIFdSSVRFX1BJWEVMIENPTkNBVDJFKHdyaXRlT3BhcXVlLENQSVhFTCkKKyNkZWZpbmUgWlJMRV9FTkNPREUgQ09OQ0FUMkUoenJsZUVuY29kZSxDUElYRUwpCisjZGVmaW5lIFpSTEVfRU5DT0RFX1RJTEUgQ09OQ0FUMkUoenJsZUVuY29kZVRpbGUsQ1BJWEVMKQorI2RlZmluZSBCUFBPVVQgMjQKKyNlbHNlCisjZGVmaW5lIFBJWEVMX1QgcmRyOjpDT05DQVQyRShVLEJQUCkKKyNkZWZpbmUgV1JJVEVfUElYRUwgQ09OQ0FUMkUod3JpdGVPcGFxdWUsQlBQKQorI2RlZmluZSBaUkxFX0VOQ09ERSBDT05DQVQyRSh6cmxlRW5jb2RlLEJQUCkKKyNkZWZpbmUgWlJMRV9FTkNPREVfVElMRSBDT05DQVQyRSh6cmxlRW5jb2RlVGlsZSxCUFApCisjZGVmaW5lIEJQUE9VVCBCUFAKKyNlbmRpZgorCisjaWZuZGVmIFpSTEVfT05DRQorI2RlZmluZSBaUkxFX09OQ0UKK3N0YXRpYyBjb25zdCBpbnQgYml0c1BlclBhY2tlZFBpeGVsW10gPSB7CisgIDAsIDEsIDIsIDIsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQKK307CisKKy8vIFRoZSBQYWxldHRlSGVscGVyIGNsYXNzIGhlbHBzIHVzIGJ1aWxkIHVwIHRoZSBwYWxldHRlIGZyb20gcGl4ZWwgZGF0YSBieQorLy8gc3RvcmluZyBhIHJldmVyc2UgaW5kZXggdXNpbmcgYSBzaW1wbGUgaGFzaC10YWJsZQorCitjbGFzcyBQYWxldHRlSGVscGVyIHsKK3B1YmxpYzoKKyAgZW51bSB7IE1BWF9TSVpFID0gMTI3IH07CisKKyAgUGFsZXR0ZUhlbHBlcigpCisgIHsKKyAgICBtZW1zZXQoaW5kZXgsIDI1NSwgc2l6ZW9mKGluZGV4KSk7CisgICAgc2l6ZSA9IDA7CisgIH0KKworICBpbmxpbmUgaW50IGhhc2gocmRyOjpVMzIgcGl4KQorICB7CisgICAgcmV0dXJuIChwaXggXiAocGl4ID4+IDE3KSkgJiA0MDk1OworICB9CisKKyAgaW5saW5lIHZvaWQgaW5zZXJ0KHJkcjo6VTMyIHBpeCkKKyAgeworICAgIGlmIChzaXplIDwgTUFYX1NJWkUpIHsKKyAgICAgIGludCBpID0gaGFzaChwaXgpOworICAgICAgd2hpbGUgKGluZGV4W2ldICE9IDI1NSAmJiBrZXlbaV0gIT0gcGl4KQorICAgICAgICBpKys7CisgICAgICBpZiAoaW5kZXhbaV0gIT0gMjU1KSByZXR1cm47CisKKyAgICAgIGluZGV4W2ldID0gc2l6ZTsKKyAgICAgIGtleVtpXSA9IHBpeDsKKyAgICAgIHBhbGV0dGVbc2l6ZV0gPSBwaXg7CisgICAgfQorICAgIHNpemUrKzsKKyAgfQorCisgIGlubGluZSBpbnQgbG9va3VwKHJkcjo6VTMyIHBpeCkKKyAgeworICAgIGFzc2VydChzaXplIDw9IE1BWF9TSVpFKTsKKyAgICBpbnQgaSA9IGhhc2gocGl4KTsKKyAgICB3aGlsZSAoaW5kZXhbaV0gIT0gMjU1ICYmIGtleVtpXSAhPSBwaXgpCisgICAgICBpKys7CisgICAgaWYgKGluZGV4W2ldICE9IDI1NSkgcmV0dXJuIGluZGV4W2ldOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJkcjo6VTMyIHBhbGV0dGVbTUFYX1NJWkVdOworICByZHI6OlU4IGluZGV4WzQwOTYrTUFYX1NJWkVdOworICByZHI6OlUzMiBrZXlbNDA5NitNQVhfU0laRV07CisgIGludCBzaXplOworfTsKKyNlbmRpZgorCit2b2lkIFpSTEVfRU5DT0RFX1RJTEUgKFBJWEVMX1QqIGRhdGEsIGludCB3LCBpbnQgaCwgcmRyOjpPdXRTdHJlYW0qIG9zKTsKKworYm9vbCBaUkxFX0VOQ09ERSAoY29uc3QgUmVjdCYgciwgcmRyOjpPdXRTdHJlYW0qIG9zLAorICAgICAgICAgICAgICAgICAgcmRyOjpabGliT3V0U3RyZWFtKiB6b3MsIHZvaWQqIGJ1ZiwgaW50IG1heExlbiwgUmVjdCogYWN0dWFsCisjaWZkZWYgRVhUUkFfQVJHUworICAgICAgICAgICAgICAgICAgLCBFWFRSQV9BUkdTCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICkKK3sKKyAgem9zLT5zZXRVbmRlcmx5aW5nKG9zKTsKKyAgLy8gUkxFIG92ZXJoZWFkIGlzIGF0IHdvcnN0IDEgYnl0ZSBwZXIgNjR4NjQgKDRLcGl4ZWwpIGJsb2NrCisgIGludCB3b3JzdENhc2VMaW5lID0gci53aWR0aCgpICogNjQgKiAoQlBQT1VULzgpICsgMSArIHIud2lkdGgoKSAvIDY0OworICAvLyBabGliIG92ZXJoZWFkIGlzIGF0IHdvcnN0IDYgYnl0ZXMgcGx1cyA1IGJ5dGVzIHBlciAzMktieXRlIGJsb2NrLgorICB3b3JzdENhc2VMaW5lICs9IDExICsgNSAqICh3b3JzdENhc2VMaW5lID4+IDE1KTsKKyAgUmVjdCB0OworCisgIGZvciAodC50bC55ID0gci50bC55OyB0LnRsLnkgPCByLmJyLnk7IHQudGwueSArPSA2NCkgeworCisgICAgdC5ici55ID0gX19yZmJtaW4oci5ici55LCB0LnRsLnkgKyA2NCk7CisKKyAgICBpZiAob3MtPmxlbmd0aCgpICsgd29yc3RDYXNlTGluZSA+IG1heExlbikgeworICAgICAgaWYgKHQudGwueSA9PSByLnRsLnkpCisgICAgICAgIHRocm93IEV4Y2VwdGlvbigiWlJMRTogbm90IGVub3VnaCBzcGFjZSBmb3IgZmlyc3QgbGluZT8iKTsKKyAgICAgIGFjdHVhbC0+dGwgPSByLnRsOworICAgICAgYWN0dWFsLT5ici54ID0gci5ici54OworICAgICAgYWN0dWFsLT5ici55ID0gdC50bC55OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAodC50bC54ID0gci50bC54OyB0LnRsLnggPCByLmJyLng7IHQudGwueCArPSA2NCkgeworCisgICAgICB0LmJyLnggPSBfX3JmYm1pbihyLmJyLngsIHQudGwueCArIDY0KTsKKworICAgICAgR0VUX0lNQUdFX0lOVE9fQlVGKHQsYnVmKTsKKworICAgICAgWlJMRV9FTkNPREVfVElMRSgoUElYRUxfVCopYnVmLCB0LndpZHRoKCksIHQuaGVpZ2h0KCksIHpvcyk7CisgICAgfQorCisgICAgem9zLT5mbHVzaCgpOworICB9CisgIHJldHVybiB0cnVlOworfQorCisKK3ZvaWQgWlJMRV9FTkNPREVfVElMRSAoUElYRUxfVCogZGF0YSwgaW50IHcsIGludCBoLCByZHI6Ok91dFN0cmVhbSogb3MpCit7CisgIC8vIEZpcnN0IGZpbmQgdGhlIHBhbGV0dGUgYW5kIHRoZSBudW1iZXIgb2YgcnVucworCisgIFBhbGV0dGVIZWxwZXIgcGg7CisKKyAgaW50IHJ1bnMgPSAwOworICBpbnQgc2luZ2xlUGl4ZWxzID0gMDsKKworICBQSVhFTF9UKiBwdHIgPSBkYXRhOworICBQSVhFTF9UKiBlbmQgPSBwdHIgKyBoICogdzsKKyAgKmVuZCA9IH4qKGVuZC0xKTsgLy8gb25lIHBhc3QgdGhlIGVuZCBpcyBkaWZmZXJlbnQgc28gdGhlIHdoaWxlIGxvb3AgZW5kcworCisgIHdoaWxlIChwdHIgPCBlbmQpIHsKKyAgICBQSVhFTF9UIHBpeCA9ICpwdHI7CisgICAgaWYgKCorK3B0ciAhPSBwaXgpIHsKKyAgICAgIHNpbmdsZVBpeGVscysrOworICAgIH0gZWxzZSB7CisgICAgICB3aGlsZSAoKisrcHRyID09IHBpeCkgOworICAgICAgcnVucysrOworICAgIH0KKyAgICBwaC5pbnNlcnQocGl4KTsKKyAgfQorCisgIC8vZnByaW50ZihzdGRlcnIsInJ1bnMgJWQsIHNpbmdsZSBwaXhlbHMgJWQsIHBhbGV0dGVTaXplICVkXG4iLAorICAvLyAgICAgICAgcnVucywgc2luZ2xlUGl4ZWxzLCBwaC5zaXplKTsKKworICAvLyBTb2xpZCB0aWxlIGlzIGEgc3BlY2lhbCBjYXNlCisKKyAgaWYgKHBoLnNpemUgPT0gMSkgeworICAgIG9zLT53cml0ZVU4KDEpOworICAgIG9zLT5XUklURV9QSVhFTChwaC5wYWxldHRlWzBdKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUcnkgdG8gd29yayBvdXQgd2hldGhlciB0byB1c2UgUkxFIGFuZC9vciBhIHBhbGV0dGUuICBXZSBkbyB0aGlzIGJ5CisgIC8vIGVzdGltYXRpbmcgdGhlIG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgcGlja2luZyB0aGUKKyAgLy8gbWV0aG9kIHdoaWNoIHJlc3VsdHMgaW4gdGhlIGZld2VzdCBieXRlcy4gIE9mIGNvdXJzZSB0aGlzIG1heSBub3QgcmVzdWx0CisgIC8vIGluIHRoZSBmZXdlc3QgYnl0ZXMgYWZ0ZXIgY29tcHJlc3Npb24uLi4KKworICBib29sIHVzZVJsZSA9IGZhbHNlOworICBib29sIHVzZVBhbGV0dGUgPSBmYWxzZTsKKworICBpbnQgZXN0aW1hdGVkQnl0ZXMgPSB3ICogaCAqIChCUFBPVVQvOCk7IC8vIHN0YXJ0IGFzc3VtaW5nIHJhdworCisgIGludCBwbGFpblJsZUJ5dGVzID0gKChCUFBPVVQvOCkrMSkgKiAocnVucyArIHNpbmdsZVBpeGVscyk7CisKKyAgaWYgKHBsYWluUmxlQnl0ZXMgPCBlc3RpbWF0ZWRCeXRlcykgeworICAgIHVzZVJsZSA9IHRydWU7CisgICAgZXN0aW1hdGVkQnl0ZXMgPSBwbGFpblJsZUJ5dGVzOworICB9CisKKyAgaWYgKHBoLnNpemUgPCAxMjgpIHsKKyAgICBpbnQgcGFsZXR0ZVJsZUJ5dGVzID0gKEJQUE9VVC84KSAqIHBoLnNpemUgKyAyICogcnVucyArIHNpbmdsZVBpeGVsczsKKworICAgIGlmIChwYWxldHRlUmxlQnl0ZXMgPCBlc3RpbWF0ZWRCeXRlcykgeworICAgICAgdXNlUmxlID0gdHJ1ZTsKKyAgICAgIHVzZVBhbGV0dGUgPSB0cnVlOworICAgICAgZXN0aW1hdGVkQnl0ZXMgPSBwYWxldHRlUmxlQnl0ZXM7CisgICAgfQorCisgICAgaWYgKHBoLnNpemUgPCAxNykgeworICAgICAgaW50IHBhY2tlZEJ5dGVzID0gKChCUFBPVVQvOCkgKiBwaC5zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICB3ICogaCAqIGJpdHNQZXJQYWNrZWRQaXhlbFtwaC5zaXplLTFdIC8gOCk7CisKKyAgICAgIGlmIChwYWNrZWRCeXRlcyA8IGVzdGltYXRlZEJ5dGVzKSB7CisgICAgICAgIHVzZVJsZSA9IGZhbHNlOworICAgICAgICB1c2VQYWxldHRlID0gdHJ1ZTsKKyAgICAgICAgZXN0aW1hdGVkQnl0ZXMgPSBwYWNrZWRCeXRlczsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIXVzZVBhbGV0dGUpIHBoLnNpemUgPSAwOworCisgIG9zLT53cml0ZVU4KCh1c2VSbGUgPyAxMjggOiAwKSB8IHBoLnNpemUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGguc2l6ZTsgaSsrKSB7CisgICAgb3MtPldSSVRFX1BJWEVMKHBoLnBhbGV0dGVbaV0pOworICB9CisKKyAgaWYgKHVzZVJsZSkgeworCisgICAgUElYRUxfVCogcHRyID0gZGF0YTsKKyAgICBQSVhFTF9UKiBlbmQgPSBwdHIgKyB3ICogaDsKKyAgICBQSVhFTF9UKiBydW5TdGFydDsKKyAgICBQSVhFTF9UIHBpeDsKKyAgICB3aGlsZSAocHRyIDwgZW5kKSB7CisgICAgICBydW5TdGFydCA9IHB0cjsKKyAgICAgIHBpeCA9ICpwdHIrKzsKKyAgICAgIHdoaWxlICgqcHRyID09IHBpeCAmJiBwdHIgPCBlbmQpCisgICAgICAgIHB0cisrOworICAgICAgaW50IGxlbiA9IHB0ciAtIHJ1blN0YXJ0OworICAgICAgaWYgKGxlbiA8PSAyICYmIHVzZVBhbGV0dGUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gcGgubG9va3VwKHBpeCk7CisgICAgICAgIGlmIChsZW4gPT0gMikKKyAgICAgICAgICBvcy0+d3JpdGVVOChpbmRleCk7CisgICAgICAgIG9zLT53cml0ZVU4KGluZGV4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAodXNlUGFsZXR0ZSkgeworICAgICAgICBpbnQgaW5kZXggPSBwaC5sb29rdXAocGl4KTsKKyAgICAgICAgb3MtPndyaXRlVTgoaW5kZXggfCAxMjgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3MtPldSSVRFX1BJWEVMKHBpeCk7CisgICAgICB9CisgICAgICBsZW4gLT0gMTsKKyAgICAgIHdoaWxlIChsZW4gPj0gMjU1KSB7CisgICAgICAgIG9zLT53cml0ZVU4KDI1NSk7CisgICAgICAgIGxlbiAtPSAyNTU7CisgICAgICB9CisgICAgICBvcy0+d3JpdGVVOChsZW4pOworICAgIH0KKworICB9IGVsc2UgeworCisgICAgLy8gbm8gUkxFCisKKyAgICBpZiAodXNlUGFsZXR0ZSkgeworCisgICAgICAvLyBwYWNrZWQgcGl4ZWxzCisKKyAgICAgIGFzc2VydCAocGguc2l6ZSA8IDE3KTsKKworICAgICAgaW50IGJwcHAgPSBiaXRzUGVyUGFja2VkUGl4ZWxbcGguc2l6ZS0xXTsKKworICAgICAgUElYRUxfVCogcHRyID0gZGF0YTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgcmRyOjpVOCBuYml0cyA9IDA7CisgICAgICAgIHJkcjo6VTggYnl0ZSA9IDA7CisKKyAgICAgICAgUElYRUxfVCogZW9sID0gcHRyICsgdzsKKworICAgICAgICB3aGlsZSAocHRyIDwgZW9sKSB7CisgICAgICAgICAgUElYRUxfVCBwaXggPSAqcHRyKys7CisgICAgICAgICAgcmRyOjpVOCBpbmRleCA9IHBoLmxvb2t1cChwaXgpOworICAgICAgICAgIGJ5dGUgPSAoYnl0ZSA8PCBicHBwKSB8IGluZGV4OworICAgICAgICAgIG5iaXRzICs9IGJwcHA7CisgICAgICAgICAgaWYgKG5iaXRzID49IDgpIHsKKyAgICAgICAgICAgIG9zLT53cml0ZVU4KGJ5dGUpOworICAgICAgICAgICAgbmJpdHMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobmJpdHMgPiAwKSB7CisgICAgICAgICAgYnl0ZSA8PD0gOCAtIG5iaXRzOworICAgICAgICAgIG9zLT53cml0ZVU4KGJ5dGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKworICAgICAgLy8gcmF3CisKKyNpZmRlZiBDUElYRUwKKyAgICAgIGZvciAoUElYRUxfVCogcHRyID0gZGF0YTsgcHRyIDwgZGF0YSt3Kmg7IHB0cisrKSB7CisgICAgICAgIG9zLT5XUklURV9QSVhFTCgqcHRyKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICBvcy0+d3JpdGVCeXRlcyhkYXRhLCB3KmgqKEJQUC84KSk7CisjZW5kaWYKKyAgICB9CisgIH0KK30KKworI3VuZGVmIFBJWEVMX1QKKyN1bmRlZiBXUklURV9QSVhFTAorI3VuZGVmIFpSTEVfRU5DT0RFCisjdW5kZWYgWlJMRV9FTkNPREVfVElMRQorI3VuZGVmIEJQUE9VVAorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvQ2hhbmdlTG9nIGIvY29tbW9uL3psaWIvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZWQzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9DaGFuZ2VMb2cKQEAgLTAsMCArMSw0ODEgQEAKKworCQlDaGFuZ2VMb2cgZmlsZSBmb3IgemxpYgorCitDaGFuZ2VzIGluIDEuMS40ICgxMSBNYXJjaCAyMDAyKQorLSBaRlJFRSB3YXMgcmVwZWF0ZWQgb24gc2FtZSBhbGxvY2F0aW9uIG9uIHNvbWUgZXJyb3IgY29uZGl0aW9ucy4KKyAgVGhpcyBjcmVhdGVzIGEgc2VjdXJpdHkgcHJvYmxlbSBkZXNjcmliZWQgaW4KKyAgaHR0cDovL3d3dy56bGliLm9yZy9hZHZpc29yeS0yMDAyLTAzLTExLnR4dAorLSBSZXR1cm5lZCBpbmNvcnJlY3QgZXJyb3IgKFpfTUVNX0VSUk9SKSBvbiBzb21lIGludmFsaWQgZGF0YQorLSBBdm9pZCBhY2Nlc3NlcyBiZWZvcmUgd2luZG93IGZvciBpbnZhbGlkIGRpc3RhbmNlcyB3aXRoIGluZmxhdGUgd2luZG93CisgIGxlc3MgdGhhbiAzMksuCistIGZvcmNlIHdpbmRvd0JpdHMgPiA4IHRvIGF2b2lkIGEgYnVnIGluIHRoZSBlbmNvZGVyIGZvciBhIHdpbmRvdyBzaXplCisgIG9mIDI1NiBieXRlcy4gKEEgY29tcGxldGUgZml4IHdpbGwgYmUgYXZhaWxhYmxlIGluIDEuMS41KS4KKwkKK0NoYW5nZXMgaW4gMS4xLjMgKDkgSnVseSAxOTk4KQorLSBmaXggImFuIGluZmxhdGUgaW5wdXQgYnVmZmVyIGJ1ZyB0aGF0IHNob3dzIHVwIG9uIHJhcmUgYnV0IHBlcnNpc3RlbnQKKyAgb2NjYXNpb25zIiAoTWFyaykKKy0gZml4IGd6cmVhZCBhbmQgZ3p0ZWxsIGZvciBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzIChEaWRpZXIgTGUgQm90bGFuKQorLSBmaXggZ3pzZWVrKC4uLiwgU0VFS19TRVQpIGluIHdyaXRlIG1vZGUKKy0gZml4IGNyYyBjaGVjayBhZnRlciBhIGd6ZWVrIChGcmFuayBGYXViZXJ0KQorLSBmaXggbWluaXVuemlwIHdoZW4gdGhlIGxhc3QgZW50cnkgaW4gYSB6aXAgZmlsZSBpcyBpdHNlbGYgYSB6aXAgZmlsZQorICAoSiBMaWxsZ2UpCistIGFkZCBjb250cmliL2FzbTU4NiBhbmQgY29udHJpYi9hc202ODYgKEJyaWFuIFJhaXRlcikKKyAgU2VlIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwKKy0gYWRkIHN1cHBvcnQgZm9yIERlbHBoaSAzIGluIGNvbnRyaWIvZGVscGhpIChCb2IgRGVsbGFjYSkKKy0gYWRkIHN1cHBvcnQgZm9yIEMrK0J1aWxkZXIgMyBhbmQgRGVscGhpIDMgaW4gY29udHJpYi9kZWxwaGkyIChEYXZpZGUgTW9yZXR0aSkKKy0gZG8gbm90IGV4aXQgcHJlbWF0dXJlbHkgaW4gdW50Z3ogaWYgMCBhdCBzdGFydCBvZiBibG9jayAoTWFnbnVzIEhvbG1ncmVuKQorLSB1c2UgbWFjcm8gRVhURVJOIGluc3RlYWQgb2YgZXh0ZXJuIHRvIHN1cHBvcnQgRExMIGZvciBCZU9TIChTYW5kZXIgU3Rva3MpCistIGFkZGVkIGEgRkFRIGZpbGUKKworLSBTdXBwb3J0IGd6ZG9wZW4gb24gTWFjIHdpdGggTWV0cm93ZXJrcyAoSmFzb24gTGluaGFydCkKKy0gRG8gbm90IHJlZGVmaW5lIEJ5dGUgb24gTWFjIChCcmFkIFBldHRpdCAmIEphc29uIExpbmhhcnQpCistIGRlZmluZSBTRUVLX0VORCB0b28gaWYgU0VFS19TRVQgaXMgbm90IGRlZmluZWQgKEFsYmVydCBDaGluLUEtWW91bmcpCistIGF2b2lkIHNvbWUgd2FybmluZ3Mgd2l0aCBCb3JsYW5kIEMgKFRvbSBUYW5uZXIpCistIGZpeCBhIHByb2JsZW0gaW4gY29udHJpYi9taW5pemlwL3ppcC5jIGZvciAxNi1iaXQgTVNET1MgKEdpbGxlcyBWb2xsYW50KQorLSBlbXVsYXRlIHV0aW1lKCkgZm9yIFdJTjMyIGluIGNvbnRyaWIvdW50Z3ogIChHaWxsZXMgVm9sbGFudCkKKy0gYWxsb3cgc2V2ZXJhbCBhcmd1bWVudHMgdG8gY29uZmlndXJlIChUaW0gTW9vbmV5LCBGcm9kbyBMb29pamFhcmQpCistIHVzZSBsaWJkaXIgYW5kIGluY2x1ZGVkaXIgaW4gTWFrZWZpbGUuaW4gKFRpbSBNb29uZXkpCistIHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBvbiBPU0YxIFY0IChUaW0gTW9vbmV5KQorLSByZW1vdmUgc29fbG9jYXRpb25zIGluICJtYWtlIGNsZWFuIiAgKFRpbSBNb29uZXkpCistIGZpeCBtYWtldHJlZS5jIGNvbXBpbGF0aW9uIGVycm9yIChHbGVubiwgTWFyaykKKy0gUHl0aG9uIGludGVyZmFjZSB0byB6bGliIG5vdyBpbiBQeXRob24gMS41IChKZXJlbXkgSHlsdG9uKQorLSBuZXcgTWFrZWZpbGUucmlzY29zIChSaWNoIFdhbGtlcikKKy0gaW5pdGlhbGl6ZSBzdGF0aWMgZGVzY3JpcHRvcnMgaW4gdHJlZXMuYyBmb3IgZW1iZWRkZWQgdGFyZ2V0cyAoTmljayBTbWl0aCkKKy0gdXNlICJmb28tZ3oiIGluIGV4YW1wbGUuYyBmb3IgUklTQ09TIGFuZCBWTVMgKE5pY2sgU21pdGgpCistIGFkZCB0aGUgT1MvMiBmaWxlcyBpbiBNYWtlZmlsZS5pbiB0b28gKEFuZHJldyBaYWJvbG90bnkpCistIGZpeCBmZG9wZW4gYW5kIGhhbGxvYyBtYWNyb3MgZm9yIE1pY3Jvc29mdCBDIDYuMCAoVG9tIExhbmUpCistIGZpeCBtYWtldHJlZS5jIHRvIGFsbG93IGNsZWFuIGNvbXBpbGF0aW9uIG9mIGluZmZpeGVkLmggKE1hcmspCistIGZpeCBwYXJhbWV0ZXIgY2hlY2sgaW4gZGVmbGF0ZUNvcHkgKEd1bnRoZXIgTmlrbCkKKy0gY2xlYW51cCB0cmVlcy5jLCB1c2UgY29tcHJlc3NlZF9sZW4gb25seSBpbiBkZWJ1ZyBtb2RlIChDaHJpc3RpYW4gU3BpZWxlcikKKy0gTWFueSBwb3J0YWJpbGl0eSBwYXRjaGVzIGJ5IENocmlzdGlhbiBTcGllbGVyOgorICAuIHp1dGlsLmMsIHp1dGlsLmg6IGFkZGVkICJjb25zdCIgZm9yIHptZW0qCisgIC4gTWFrZV92bXMuY29tOiBmaXhlZCBzb21lIHR5cG9zCisgIC4gTWFrZV92bXMuY29tOiBtc2Rvcy9NYWtlZmlsZS4qOiByZW1vdmVkIHp1dGlsLmggZnJvbSBzb21lIGRlcGVuZGVuY3kgbGlzdHMKKyAgLiBtc2Rvcy9NYWtlZmlsZS5tc2M6IHJlbW92ZSAiZGVmYXVsdCBydGwgbGluayBsaWJyYXJ5IiBpbmZvIGZyb20gb2JqIGZpbGVzCisgIC4gbXNkb3MvTWFrZWZpbGUuKjogdXNlIG1vZGVsLWRlcGVuZGVudCBuYW1lIGZvciB0aGUgYnVpbHQgemxpYiBsaWJyYXJ5CisgIC4gbXNkb3MvTWFrZWZpbGUuZW14LCBudC9NYWtlZmlsZS5lbXgsIG50L01ha2VmaWxlLmdjYzoKKyAgICAgbmV3IG1ha2VmaWxlcywgZm9yIGVteCAoRE9TL09TMiksIGVteCZyc3hudCBhbmQgbWluZ3czMiAoV2luZG93cyA5eCAvIE5UKQorLSB1c2UgZGVmaW5lIGluc3RlYWQgb2YgdHlwZWRlZiBmb3IgQnl0ZWYgYWxzbyBmb3IgTVNDIHNtYWxsL21lZGl1bSAoVG9tIExhbmUpCistIHJlcGxhY2UgX19mYXIgd2l0aCBfZmFyIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkgKENocmlzdGlhbiBTcGllbGVyLCBUb20gTGFuZSkKKy0gZml4IHRlc3QgZm9yIGVycm5vLmggaW4gY29uZmlndXJlIChUaW0gTmV3c2hhbSkKKworQ2hhbmdlcyBpbiAxLjEuMiAoMTkgTWFyY2ggOTgpCistIGFkZGVkIGNvbnRyaWIvbWluemlwLCBtaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYiAoR2lsbGVzIFZvbGxhbnQpCisgIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKKy0gcHJlaW5pdGlhbGl6ZSB0aGUgaW5mbGF0ZSB0YWJsZXMgZm9yIGZpeGVkIGNvZGVzLCB0byBtYWtlIHRoZSBjb2RlCisgIGNvbXBsZXRlbHkgdGhyZWFkIHNhZmUgKE1hcmspCistIHNvbWUgc2ltcGxpZmljYXRpb25zIGFuZCBzbGlnaHQgc3BlZWQtdXAgdG8gdGhlIGluZmxhdGUgY29kZSAoTWFyaykKKy0gZml4IGd6ZW9mIG9uIG5vbi1jb21wcmVzc2VkIGZpbGVzIChBbGxhbiBTY2hydW0pCistIGFkZCAtc3RkMSBvcHRpb24gaW4gY29uZmlndXJlIGZvciBPU0YxIHRvIGZpeCBnenByaW50ZiAoTWFydGluIE1va3JlanMpCistIHVzZSBkZWZhdWx0IHZhbHVlIG9mIDRLIGZvciBaX0JVRlNJWkUgZm9yIDE2LWJpdCBNU0RPUyAoVGltIFdlZ25lciArIEdsZW5uKQorLSBhZGRlZCBvczIvTWFrZWZpbGUuZGVmIGFuZCBvczIvemxpYi5kZWYgKEFuZHJldyBaYWJvbG90bnkpCistIGFkZCBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIFVOSVhfU1Y0LjJNUCAoTUFUU1VVUkEgVGFrYW5vcmkpCistIGRvIG5vdCB3cmFwIGV4dGVybiAiQyIgYXJvdW5kIHN5c3RlbSBpbmNsdWRlcyAoVG9tIExhbmUpCistIG1lbnRpb24gemxpYiBiaW5kaW5nIGZvciBUQ0wgaW4gUkVBRE1FIChBbmRyZWFzIEt1cHJpZXMpCistIGFkZGVkIGFtaWdhL01ha2VmaWxlLnB1cCBmb3IgQW1pZ2EgcG93ZXJVUCBTQVMvQyBQUEMgKEFuZHJlYXMgS2xlaW5lcnQpCistIGFsbG93ICJtYWtlIGluc3RhbGwgcHJlZml4PS4uLiIgZXZlbiBhZnRlciBjb25maWd1cmUgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKKy0gYWxsb3cgImNvbmZpZ3VyZSAtLXByZWZpeCAkSE9NRSIgKFRpbSBNb29uZXkpCistIHJlbW92ZSB3YXJuaW5ncyBpbiBleGFtcGxlLmMgYW5kIGd6aW8uYyAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQorLSBtb3ZlIE1ha2VmaWxlLnNhcyB0byBhbWlnYS9NYWtlZmlsZS5zYXMKKworQ2hhbmdlcyBpbiAxLjEuMSAoMjcgRmViIDk4KQorLSBmaXggbWFjcm9zIF90cl90YWxseV8qIGluIGRlZmxhdGUuaCBmb3IgZGVidWcgbW9kZSAgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKKy0gcmVtb3ZlIGJsb2NrIHRydW5jYXRpb24gaGV1cmlzdGljIHdoaWNoIGhhZCB2ZXJ5IG1hcmdpbmFsIGVmZmVjdCBmb3IgemxpYgorICAoc21hbGxlciBsaXRfYnVmc2l6ZSB0aGFuIGluIGd6aXAgMS4yLjQpIGFuZCBkZWdyYWRlZCBhIGxpdHRsZSB0aGUKKyAgY29tcHJlc3Npb24gcmF0aW8gb24gc29tZSBmaWxlcy4gVGhpcyBhbHNvIGFsbG93cyBpbmxpbmluZyBfdHJfdGFsbHkgZm9yCisgIG1hdGNoZXMgaW4gZGVmbGF0ZV9zbG93LgorLSBhZGRlZCBtc2Rvcy9NYWtlZmlsZS53MzIgZm9yIFdJTjMyIE1pY3Jvc29mdCBWaXN1YWwgQysrIChCb2IgRnJhemllcikKKworQ2hhbmdlcyBpbiAxLjEuMCAoMjQgRmViIDk4KQorLSBkbyBub3QgcmV0dXJuIFNUUkVBTV9FTkQgcHJlbWF0dXJlbHkgaW4gaW5mbGF0ZSAoSm9obiBCb3dsZXIpCistIHJldmVydCB0byB0aGUgemxpYiAxLjAuOCBpbmZsYXRlIHRvIGF2b2lkIHRoZSBnY2MgMi44LjAgYnVnIChKZXJlbXkgQnVobGVyKQorLSBjb21waWxlIHdpdGggLURGQVNURVNUIHRvIGdldCBjb21wcmVzc2lvbiBjb2RlIG9wdGltaXplZCBmb3Igc3BlZWQgb25seQorLSBpbiBtaW5pZ3ppcCwgdHJ5IG1tYXAnaW5nIHRoZSBpbnB1dCBmaWxlIGZpcnN0IChNaWd1ZWwgQWxicmVjaHQpCistIGluY3JlYXNlIHNpemUgb2YgSS9PIGJ1ZmZlcnMgaW4gbWluaWd6aXAuYyBhbmQgZ3ppby5jIChub3QgYSBiaWcgZ2FpbgorICBvbiBTdW4gYnV0IHNpZ25pZmljYW50IG9uIEhQKQorCistIGFkZCBhIHBvaW50ZXIgdG8gZXhwZXJpbWVudGFsIHVuemlwIGxpYnJhcnkgaW4gUkVBRE1FIChHaWxsZXMgVm9sbGFudCkKKy0gaW5pdGlhbGl6ZSB2YXJpYWJsZSBnY2MgaW4gY29uZmlndXJlIChDaHJpcyBIZXJib3J0aCkKKworQ2hhbmdlcyBpbiAxLjAuOSAoMTcgRmViIDE5OTgpCistIGFkZGVkIGd6cHV0cyBhbmQgZ3pnZXRzIGZ1bmN0aW9ucworLSBkbyBub3QgY2xlYXIgZW9mIGZsYWcgaW4gZ3pzZWVrIChNYXJrIERpZWtoYW5zKQorLSBmaXggZ3pzZWVrIGZvciBmaWxlcyBpbiB0cmFuc3BhcmVudCBtb2RlIChNYXJrIERpZWtoYW5zKQorLSBkbyBub3QgYXNzdW1lIHRoYXQgdnNwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gKEplbnMgS3JpbmtlKQorLSByZXBsYWNlIEVYUE9SVCB3aXRoIFpFWFBPUlQgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlciBwcm9ncmFtcworLSBhZGRlZCBjb21wcmVzczIgaW4gemNvbmYuaCwgemxpYi5kZWYsIHpsaWIuZG50CistIG5ldyBhc20gY29kZSBmcm9tIEdpbGxlcyBWb2xsYW50IGluIGNvbnRyaWIvYXNtMzg2CistIHNpbXBsaWZ5IHRoZSBpbmZsYXRlIGNvZGUgKE1hcmspOgorIC4gUmVwbGFjZSBaQUxMT0MncyBpbiBodWZ0X2J1aWxkKCkgd2l0aCBzaW5nbGUgWkFMTE9DIGluIGluZmxhdGVfYmxvY2tzX25ldygpCisgLiBaQUxMT0MgdGhlIGxlbmd0aCBsaXN0IGluIGluZmxhdGVfdHJlZXNfZml4ZWQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrCisgLiBaQUxMT0MgdGhlIHZhbHVlIGFyZWEgZm9yIGh1ZnRfYnVpbGQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrCisgLiBTaW1wbGlmeSBaX0ZJTklTSCBjaGVjayBpbiBpbmZsYXRlKCkKKworLSBBdm9pZCBnY2MgMi44LjAgY29tcGFyaXNvbiBidWcgYSBsaXR0bGUgZGlmZmVyZW50bHkgdGhhbiB6bGliIDEuMC44CistIGluIGluZnRyZWVzLmMsIGF2b2lkIGNjIC1PIGJ1ZyBvbiBIUCAoRmFyc2hpZCBFbGFoaSkKKy0gaW4gemNvbmYuaCBtb3ZlIHRoZSBaTElCX0RMTCBzdHVmZiBlYXJsaWVyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKKyAgdGhlIGRlY2xhcmF0aW9uIG9mIEZBUiAoR2lsbGVzIFZPbGxhbnQpCistIGluc3RhbGwgbGliei5zbyogd2l0aCBtb2RlIDc1NSAoZXhlY3V0YWJsZSkgaW5zdGVhZCBvZiA2NDQgKE1hcmMgTGVobWFubikKKy0gcmVhZF9idWYgYnVmIHBhcmFtZXRlciBvZiB0eXBlIEJ5dGVmKiBpbnN0ZWFkIG9mIGNoYXJmKgorLSB6bWVtY3B5IHBhcmFtZXRlcnMgYXJlIG9mIHR5cGUgQnl0ZWYqLCBub3QgY2hhcmYqIChKb3NlcGggU3Ryb3V0KQorLSBkbyBub3QgcmVkZWNsYXJlIHVubGluayBpbiBtaW5pZ3ppcC5jIGZvciBXSU4zMiAoSm9obiBCb3dsZXIpCistIGZpeCBjaGVjayBmb3IgcHJlc2VuY2Ugb2YgZGlyZWN0b3JpZXMgaW4gIm1ha2UgaW5zdGFsbCIgKElhbiBXaWxsaXMpCisKK0NoYW5nZXMgaW4gMS4wLjggKDI3IEphbiAxOTk4KQorLSBmaXhlZCBvZmZzZXRzIGluIGNvbnRyaWIvYXNtMzg2L2d2bWF0MzIuYXNtIChHaWxsZXMgVm9sbGFudCkKKy0gZml4IGd6Z2V0YyBhbmQgZ3pwdXRjIGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKE1hcmt1cyBPYmVyaHVtZXIpCistIGFkZGVkIGNvbXByZXNzMigpIHRvIGFsbG93IHNldHRpbmcgdGhlIGNvbXByZXNzaW9uIGxldmVsCistIGluY2x1ZGUgc3lzL3R5cGVzLmggdG8gZ2V0IG9mZl90IG9uIHNvbWUgc3lzdGVtcyAoTWFyYyBMZWhtYW5uICYgUWluZ0xvbmcpCistIHVzZSBjb25zdGFudCBhcnJheXMgZm9yIHRoZSBzdGF0aWMgdHJlZXMgaW4gdHJlZXMuYyBpbnN0ZWFkIG9mIGNvbXB1dGluZworICB0aGVtIGF0IHJ1biB0aW1lICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4gZm9yIHRoaXMgc3VnZ2VzdGlvbikuIFRvIGNyZWF0ZQorICB0cmVlcy5oLCBjb21waWxlIHdpdGggR0VOX1RSRUVTX0ggYW5kIHJ1biAibWFrZSB0ZXN0Ii4KKy0gY2hlY2sgcmV0dXJuIGNvZGUgb2YgZXhhbXBsZSBpbiAibWFrZSB0ZXN0IiBhbmQgZGlzcGxheSByZXN1bHQKKy0gcGFzcyBtaW5pZ3ppcCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBmaWxlX2NvbXByZXNzCistIHNpbXBsaWZ5aW5nIGNvZGUgb2YgaW5mbGF0ZVN5bmMgdG8gYXZvaWQgZ2NjIDIuOCBidWcKKworLSBzdXBwb3J0IENDPSJnY2MgLVdhbGwiIGluIGNvbmZpZ3VyZSAtcyAoUWluZ0xvbmcpCistIGF2b2lkIGEgZmx1c2ggY2F1c2VkIGJ5IGZ0ZWxsIGluIGd6b3BlbiBmb3Igd3JpdGUgbW9kZSAoS2VuIFJhZWJ1cm4pCistIGZpeCB0ZXN0IGZvciBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCistIHpsaWIubGliIC0+IHpsaWIuZGxsIGluIG1zZG9zL3psaWIucmMgKEdpbGxlcyBWb2xsYW50KQorLSBjaGVjayBmb3IgVEFSR0VUX09TX01BQyBpbiBhZGRpdGlvbiB0byBNQUNPUyAoQnJhZCBQZXR0aXQpCistIGRvIG5vdCB1c2UgZmRvcGVuIGZvciBNZXRyb3dlcmtzIG9uIE1hYyAoQnJhZCBQZXR0aXQpKQorLSBhZGQgY2hlY2tzIGZvciBnenB1dGMgYW5kIGd6cHV0YyBpbiBleGFtcGxlLmMKKy0gYXZvaWQgd2FybmluZ3MgaW4gZ3ppby5jIGFuZCBkZWZsYXRlLmMgKEFuZHJlYXMgS2xlaW5lcnQpCistIHVzZSBjb25zdCBmb3IgdGhlIENSQyB0YWJsZSAoS2VuIFJhZWJ1cm4pCistIGZpeGVkICJtYWtlIHVuaW5zdGFsbCIgZm9yIHNoYXJlZCBsaWJyYXJpZXMKKy0gdXNlIFRyYWNldiBpbnN0ZWFkIG9mIFRyYWNlIGluIGluZmJsb2NrLmMKKy0gaW4gZXhhbXBsZS5jIHVzZSBjb3JyZWN0IGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0ZXN0X3N5bmMKKy0gc3VwcHJlc3MgK3Zub2NvbXBhdHdhcm5pbmdzIGluIGNvbmZpZ3VyZSBmb3IgSFBVWCAobm90IGFsd2F5cyBzdXBwb3J0ZWQpCisKK0NoYW5nZXMgaW4gMS4wLjcgKDIwIEphbiAxOTk4KQorLSBmaXggZ3pzZWVrIHdoaWNoIHdhcyBicm9rZW4gaW4gd3JpdGUgbW9kZQorLSByZXR1cm4gZXJyb3IgZm9yIGd6c2VlayB0byBuZWdhdGl2ZSBhYnNvbHV0ZSBwb3NpdGlvbgorLSBmaXggY29uZmlndXJlIGZvciBMaW51eCAoQ2h1bi1DaHVuZyBDaGVuKQorLSBpbmNyZWFzZSBzdGFjayBzcGFjZSBmb3IgTVNDIChUaW0gV2VnbmVyKQorLSBnZXRfY3JjX3RhYmxlIGFuZCBpbmZsYXRlU3luY1BvaW50IGFyZSBFWFBPUlRlZCAoR2lsbGVzIFZvbGxhbnQpCistIGRlZmluZSBFWFBPUlRWQSBmb3IgZ3pwcmludGYgKEdpbGxlcyBWb2xsYW50KQorLSBhZGRlZCBtYW4gcGFnZSB6bGliLjMgKFJpY2sgUm9kZ2VycykKKy0gZm9yIGNvbnRyaWIvdW50Z3osIGZpeCBtYWtlZGlyKCkgYW5kIGltcHJvdmUgTWFrZWZpbGUKKworLSBjaGVjayBnenNlZWsgaW4gd3JpdGUgbW9kZSBpbiBleGFtcGxlLmMKKy0gYWxsb2NhdGUgZXh0cmEgYnVmZmVyIGZvciBzZWVrcyBvbmx5IGlmIGd6c2VlayBpcyBhY3R1YWxseSBjYWxsZWQKKy0gYXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb25zIChUaW0gV2VnbmVyLCBHaWxsZXMgVm9sbGFudCkKKy0gYWRkIGluZmxhdGVTeW5jUG9pbnQgaW4gemNvbmYuaAorLSBmaXggbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgaW4gbnQvemxpYi5kbnQgYW5kIG1kc29zL3psaWIuZGVmCisKK0NoYW5nZXMgaW4gMS4wLjYgKDE5IEphbiAxOTk4KQorLSBhZGQgZnVuY3Rpb25zIGd6cHJpbnRmLCBnenB1dGMsIGd6Z2V0YywgZ3p0ZWxsLCBnemVvZiwgZ3pzZWVrLCBnenJld2luZCBhbmQKKyAgZ3pzZXRwYXJhbXMgKHRoYW5rcyB0byBSb2xhbmQgR2llcnNpZyBhbmQgS2V2aW4gUnVsYW5kIGZvciBzb21lIG9mIHRoaXMgY29kZSkKKy0gRml4IGEgZGVmbGF0ZSBidWcgb2NjdXJpbmcgb25seSB3aXRoIGNvbXByZXNzaW9uIGxldmVsIDAgKHRoYW5rcyB0bworICBBbmR5IEJ1Y2tsZXIgZm9yIGZpbmRpbmcgdGhpcyBvbmUpLgorLSBJbiBtaW5pZ3ppcCwgcGFzcyB0cmFuc3BhcmVudGx5IGFsc28gdGhlIGZpcnN0IGJ5dGUgZm9yIC5aIGZpbGVzLgorLSByZXR1cm4gWl9CVUZfRVJST1IgaW5zdGVhZCBvZiBaX09LIGlmIG91dHB1dCBidWZmZXIgZnVsbCBpbiB1bmNvbXByZXNzKCkKKy0gY2hlY2sgWl9GSU5JU0ggaW4gaW5mbGF0ZSAodGhhbmtzIHRvIE1hcmMgU2NobHVwZXIpCistIEltcGxlbWVudCBkZWZsYXRlQ29weSAodGhhbmtzIHRvIEFkYW0gQ29zdGVsbG8pCistIG1ha2Ugc3RhdGljIGxpYnJhcmllcyBieSBkZWZhdWx0IGluIGNvbmZpZ3VyZSwgYWRkIC0tc2hhcmVkIG9wdGlvbi4KKy0gbW92ZSBNU0RPUyBvciBXaW5kb3dzIHNwZWNpZmljIGZpbGVzIHRvIGRpcmVjdG9yeSBtc2RvcworLSBzdXBwcmVzcyB0aGUgbm90aW9uIG9mIHBhcnRpYWwgZmx1c2ggdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQorICAoYnV0IHRoZSBzeW1ib2wgWl9QQVJUSUFMX0ZMVVNIIGlzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjAuNCkKKy0gc3VwcHJlc3MgaGlzdG9yeSBidWZmZXIgcHJvdmlkZWQgYnkgYXBwbGljYXRpb24gdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQorICAodGhpcyBmZWF0dXJlIHdhcyBub3QgaW1wbGVtZW50ZWQgYW55d2F5IGluIDEuMC40KQorLSBuZXh0X2luIGFuZCBhdmFpbF9pbiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIGluZmxhdGVJbml0IG9yCisgIGluZmxhdGVJbml0MgorLSBhZGQgRVhQT1JUIGluIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgKGZvciBXaW5kb3dzIERMTCkKKy0gYWRkZWQgTWFrZWZpbGUubnQgKHRoYW5rcyB0byBTdGVwaGVuIFdpbGxpYW1zKQorLSBhZGRlZCB0aGUgdW5zdXBwb3J0ZWQgImNvbnRyaWIiIGRpcmVjdG9yeToKKyAgIGNvbnRyaWIvYXNtMzg2LyBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CisJMzg2IGFzbSBjb2RlIHJlcGxhY2luZyBsb25nZXN0X21hdGNoKCkuCisgICBjb250cmliL2lvc3RyZWFtLyBieSBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KKyAgICAgICAgQSBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGd6KiBmdW5jdGlvbnMKKyAgIGNvbnRyaWIvaW9zdHJlYW0yLyAgYnkgVHlnZSBM+HZzZXQgPFR5Z2UuTG92c2V0QGNtci5ubz4KKwlBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKKyAgIGNvbnRyaWIvdW50Z3ovICBieSAiUGVkcm8gQS4gQXJhbmRhIEd1dGlcaXJyZXoiIDxwYWFnQHRpZC5lcz4KKwlBIHZlcnkgc2ltcGxlIHRhci5neiBmaWxlIGV4dHJhY3RvciB1c2luZyB6bGliCisgICBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgYnkgQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4KKyAgICAgICAgSG93IHRvIHVzZSBjb21wcmVzcygpLCB1bmNvbXByZXNzKCkgYW5kIHRoZSBneiogZnVuY3Rpb25zIGZyb20gVkIuCistIHBhc3MgcGFyYW1zIC1mIChmaWx0ZXJlZCBkYXRhKSwgLWggKGh1ZmZtYW4gb25seSksIC0xIHRvIC05IChjb21wcmVzc2lvbgorICBsZXZlbCkgaW4gbWluaWd6aXAgKHRoYW5rcyB0byBUb20gTGFuZSkKKworLSB1c2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBkZWZsYXRlCistIGFkZGVkIHRlc3QgZm9yIGd6c2VlayBhbmQgZ3p0ZWxsIGluIGV4YW1wbGUuYworLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIGluZmxhdGVTeW5jUG9pbnQoKSAoaGFjayBmb3IgUGF1bCBNYWNrZXJyYXMpCistIGFkZCB1bmRvY3VtZW50ZWQgZnVuY3Rpb24gekVycm9yIHRvIGNvbnZlcnQgZXJyb3IgY29kZSB0byBzdHJpbmcKKyAgKGZvciBUaW0gU21pdGhlcnMpCistIEFsbG93IGNvbXBpbGF0aW9uIG9mIGd6aW8gd2l0aCAtRE5PX0RFRkxBVEUgdG8gYXZvaWQgdGhlIGNvbXByZXNzaW9uIGNvZGUuCistIFVzZSBkZWZhdWx0IG1lbWNweSBmb3IgU3ltYW50ZWMgTVNET1MgY29tcGlsZXIuCistIEFkZCBFWFBPUlQga2V5d29yZCBmb3IgY2hlY2tfZnVuYyAobmVlZGVkIGZvciBXaW5kb3dzIERMTCkKKy0gYWRkIGN1cnJlbnQgZGlyZWN0b3J5IHRvIExEX0xJQlJBUllfUEFUSCBmb3IgIm1ha2UgdGVzdCIKKy0gY3JlYXRlIGFsc28gYSBsaW5rIGZvciBsaWJ6LnNvLjEKKy0gYWRkZWQgc3VwcG9ydCBmb3IgRlVKSVRTVSBVWFAvRFMgKHRoYW5rcyB0byBUb3NoaWFraSBOb211cmEpCistIHVzZSAkKFNIQVJFRExJQikgaW5zdGVhZCBvZiBsaWJ6LnNvIGluIE1ha2VmaWxlLmluIChmb3IgSFBVWCkKKy0gYWRkZWQgLXNvbmFtZSBmb3IgTGludXggaW4gY29uZmlndXJlIChDaHVuLUNodW5nIENoZW4sCistIGFzc2lnbiBudW1iZXJzIHRvIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgaW4gemxpYi5kZWYgKGZvciBXaW5kb3dzIERMTCkKKy0gYWRkIGFkdmljZSBpbiB6bGliLmggZm9yIGJlc3QgdXNhZ2Ugb2YgZGVmbGF0ZVNldERpY3Rpb25hcnkKKy0gd29yayBhcm91bmQgY29tcGlsZXIgYnVnIG9uIEF0YXJpIChjYXN0IFpfTlVMTCBpbiBjYWxsIG9mIHMtPmNoZWNrZm4pCistIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQU5TSSBrZXl3b3JkcyBvbmx5IGVuYWJsZWQgZm9yIFR1cmJvQyBpbiBsYXJnZSBtb2RlbAorLSBhdm9pZCAidmVyc2lvblN0cmluZyJbMF0gKEJvcmxhbmQgYnVnKQorLSBhZGQgTkVFRF9EVU1NWV9SRVRVUk4gZm9yIEJvcmxhbmQKKy0gdXNlIHZhcmlhYmxlIHpfdmVyYm9zZSBmb3IgdHJhY2luZyBpbiBkZWJ1ZyBtb2RlIChMLiBQZXRlciBEZXV0c2NoKS4KKy0gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDQworLSBkZWZpbmVkIFNUREMgZm9yIE9TLzIgKERhdmlkIENoYXJsYXApCQorLSBsaW1pdCBleHRlcm5hbCBuYW1lcyB0byA4IGNoYXJzIGZvciBNVlMgKFRob21hcyBMdW5kKQorLSBpbiBtaW5pZ3ppcC5jLCB1c2Ugc3RhdGljIGJ1ZmZlcnMgb25seSBmb3IgMTYtYml0IHN5c3RlbXMKKy0gZml4IHN1ZmZpeCBjaGVjayBmb3IgIm1pbmlnemlwIC1kIGZvby5neiIKKy0gZG8gbm90IHJldHVybiBhbiBlcnJvciBmb3IgdGhlIDJuZCBvZiB0d28gY29uc2VjdXRpdmUgZ3pmbHVzaCgpIChGZWxpeCBMZWUpCistIHVzZSBfZmRvcGVuIGluc3RlYWQgb2YgZmRvcGVuIGZvciBNU0MgPj0gNi4wIChUaG9tYXMgRmFuc2xhdSkKKy0gYWRkZWQgbWFrZWxjYy5iYXQgZm9yIGxjYy13aW4zMiAoVG9tIFN0IERlbmlzKQorLSBpbiBNYWtlZmlsZS5kajIsIHVzZSBjb3B5IGFuZCBkZWwgaW5zdGVhZCBvZiBpbnN0YWxsIGFuZCBybSAoRnJhbmsgRG9uYWhvZSkKKy0gQXZvaWQgZXhwYW5kZWQgJElkOiBDaGFuZ2VMb2csdiAxLjEgMjAwNC8xMC8wOCAwOTo0NDoyMCBjb25zdF9rIEV4cCAkLiBVc2UgInJjcyAta2IiIG9yICJjdnMgYWRtaW4gLWtiIiB0byBhdm9pZCBJZCBleHBhbnNpb24uCistIGNoZWNrIGZvciB1bmlzdGQuaCBpbiBjb25maWd1cmUgKGZvciBvZmZfdCkKKy0gcmVtb3ZlIHVzZWxlc3MgY2hlY2sgcGFyYW1ldGVyIGluIGluZmxhdGVfYmxvY2tzX2ZyZWUKKy0gYXZvaWQgdXNlbGVzcyBhc3NpZ25tZW50IG9mIHMtPmNoZWNrIHRvIGl0c2VsZiBpbiBpbmZsYXRlX2Jsb2Nrc19uZXcKKy0gZG8gbm90IGZsdXNoIHR3aWNlIGluIGd6Y2xvc2UgKHRoYW5rcyB0byBLZW4gUmFlYnVybikKKy0gcmVuYW1lIEZPUEVOIGFzIEZfT1BFTiB0byBhdm9pZCBjbGFzaCB3aXRoIC91c3IvaW5jbHVkZS9zeXMvZmlsZS5oCistIHVzZSBOT19FUlJOT19IIGluc3RlYWQgb2YgZW51bWVyYXRpb24gb2Ygb3BlcmF0aW5nIHN5c3RlbXMgd2l0aCBlcnJuby5oCistIHdvcmsgYXJvdW5kIGJ1Z2d5IGZjbG9zZSBvbiBwaXBlcyBmb3IgSFAvVVgKKy0gc3VwcG9ydCB6bGliIERMTCB3aXRoIEJPUkxBTkQgQysrIDUuMCAodGhhbmtzIHRvIEdsZW5uIFJhbmRlcnMtUGVocnNvbikKKy0gZml4IGNvbmZpZ3VyZSBpZiBDQyBpcyBhbHJlYWR5IGVxdWFsIHRvIGdjYworCitDaGFuZ2VzIGluIDEuMC41ICgzIEphbiA5OCkKKy0gRml4IGluZmxhdGUgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgd2hlbiBmZWQgY29ycnVwdGVkIG9yIGludmFsaWQgZGF0YQorLSBVc2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBpbmZsYXRlCistIEVsaW1pbmF0ZSBtZW1vcnkgbGVha3Mgb24gZXJyb3IgY29uZGl0aW9ucyBpbiBpbmZsYXRlCistIFJlbW92ZWQgc29tZSB2ZXN0aWdpYWwgY29kZSBpbiBpbmZsYXRlCistIFVwZGF0ZSB3ZWIgYWRkcmVzcyBpbiBSRUFETUUKKyAgCitDaGFuZ2VzIGluIDEuMC40ICgyNCBKdWwgOTYpCistIEluIHZlcnkgcmFyZSBjb25kaXRpb25zLCBkZWZsYXRlKHMsIFpfRklOSVNIKSBjb3VsZCBmYWlsIHRvIHByb2R1Y2UgYW4gRU9GCisgIGJpdCwgc28gdGhlIGRlY29tcHJlc3NvciBjb3VsZCBkZWNvbXByZXNzIGFsbCB0aGUgY29ycmVjdCBkYXRhIGJ1dCB3ZW50CisgIG9uIHRvIGF0dGVtcHQgZGVjb21wcmVzc2luZyBleHRyYSBnYXJiYWdlIGRhdGEuIFRoaXMgYWZmZWN0ZWQgbWluaWd6aXAgdG9vLgorLSB6bGliVmVyc2lvbiBhbmQgZ3plcnJvciByZXR1cm4gY29uc3QgY2hhciogKG5lZWRlZCBmb3IgRExMKQorLSBwb3J0IHRvIFJJU0NPUyAobm8gZmRvcGVuLCBubyBtdWx0aXBsZSBkb3RzLCBubyB1bmxpbmssIG5vIGZpbGVubykKKy0gdXNlIHpfZXJyb3Igb25seSBmb3IgREVCVUcgKGF2b2lkIHByb2JsZW0gd2l0aCBETExzKQorCitDaGFuZ2VzIGluIDEuMC4zICgyIEp1bCA5NikKKy0gdXNlIHpfc3RyZWFtcCBpbnN0ZWFkIG9mIHpfc3RyZWFtICosIHdoaWNoIGlzIG5vdyBhIGZhciBwb2ludGVyIGluIE1TRE9TCisgIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWxzOyB0aGlzIG1ha2VzIHRoZSBsaWJyYXJ5IGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzCisgIHZlcnNpb25zIGZvciB0aGVzZSBtb2RlbHMuIChObyBlZmZlY3QgaW4gbGFyZ2UgbW9kZWwgb3Igb24gb3RoZXIgc3lzdGVtcy4pCistIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBpZiBwcmV2aW91cyBkZWZsYXRlIGNhbGwgcmV0dXJuZWQgd2l0aAorICBhdmFpbF9vdXQgYXMgemVybyBidXQgdGhlcmUgaXMgbm90aGluZyB0byBkbworLSBhZGRlZCBtZW1jbXAgZm9yIG5vbiBTVERDIGNvbXBpbGVycworLSBkZWZpbmUgTk9fRFVNTVlfREVDTCBmb3IgbW9yZSBNYWMgY29tcGlsZXJzICguaCBmaWxlcyBtZXJnZWQgaW5jb3JyZWN0bHkpCistIGRlZmluZSBfXzMyQklUX18gaWYgX18zODZfXyBvciBpMzg2IGlzIGRlZmluZWQgKHBiLiB3aXRoIFdhdGNvbSBhbmQgU0NPKQorLSBiZXR0ZXIgY2hlY2sgZm9yIDE2LWJpdCBtb2RlIE1TQyAoYXZvaWRzIHByb2JsZW0gd2l0aCBTeW1hbnRlYykKKworQ2hhbmdlcyBpbiAxLjAuMiAoMjMgTWF5IDk2KQorLSBhZGRlZCBXaW5kb3dzIERMTCBzdXBwb3J0CistIGFkZGVkIGEgZnVuY3Rpb24gemxpYlZlcnNpb24gKGZvciB0aGUgRExMIHN1cHBvcnQpCistIGZpeGVkIGRlY2xhcmF0aW9ucyB1c2luZyBCeXRlZiBpbiBpbmZ1dGlsLmMgKHBiIHdpdGggTVNET1MgbWVkaXVtIG1vZGVsKQorLSBCeXRlZiBpcyBkZWZpbmUncyBpbnN0ZWFkIG9mIHR5cGVkZWYnZCBvbmx5IGZvciBCb3JsYW5kIEMKKy0gYXZvaWQgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSBpbiBleGFtcGxlLmMKKy0gbWVudGlvbiBpbiBSRUFETUUgdGhhdCB0aGUgemxpYiBmb3JtYXQgaXMgbm93IFJGQzE5NTAKKy0gdXBkYXRlZCBNYWtlZmlsZS5kajIKKy0gYWRkZWQgYWxnb3JpdGhtLmRvYworCitDaGFuZ2VzIGluIDEuMC4xICgyMCBNYXkgOTYpIFsxLjAgc2tpcHBlZCB0byBhdm9pZCBjb25mdXNpb25dCistIGZpeCBhcnJheSBvdmVybGF5IGluIGRlZmxhdGUuYyB3aGljaCBzb21ldGltZXMgY2F1c2VkIGJhZCBjb21wcmVzc2VkIGRhdGEKKy0gZml4IGluZmxhdGUgYnVnIHdpdGggZW1wdHkgc3RvcmVkIGJsb2NrCistIGZpeCBNU0RPUyBtZWRpdW0gbW9kZWwgd2hpY2ggd2FzIGJyb2tlbiBpbiAwLjk5CistIGZpeCBkZWZsYXRlUGFyYW1zKCkgd2hpY2ggY291bGQgZ2VuZXJhdGVkIGJhZCBjb21wcmVzc2VkIGRhdGEuCistIEJ5dGVmIGlzIGRlZmluZSdkIGluc3RlYWQgb2YgdHlwZWRlZidlZCAod29yayBhcm91bmQgQm9ybGFuZCBidWcpCistIGFkZGVkIGFuIElOREVYIGZpbGUKKy0gbmV3IG1ha2VmaWxlcyBmb3IgREpHUFAgKE1ha2VmaWxlLmRqMiksIDMyLWJpdCBCb3JsYW5kIChNYWtlZmlsZS5iMzIpLAorICBXYXRjb20gKE1ha2VmaWxlLndhdCksIEFtaWdhIFNBUy9DIChNYWtlZmlsZS5zYXMpCistIHNwZWVkIHVwIGFkbGVyMzIgZm9yIG1vZGVybiBtYWNoaW5lcyB3aXRob3V0IGF1dG8taW5jcmVtZW50CistIGFkZGVkIC1hbnNpIGZvciBJUklYIGluIGNvbmZpZ3VyZQorLSBzdGF0aWNfaW5pdF9kb25lIGluIHRyZWVzLmMgaXMgYW4gaW50CistIGRlZmluZSB1bmxpbmsgYXMgZGVsZXRlIGZvciBWTVMKKy0gZml4IGNvbmZpZ3VyZSBmb3IgUU5YCistIGFkZCBjb25maWd1cmUgYnJhbmNoIGZvciBTQ08gYW5kIEhQVVgKKy0gYXZvaWQgbWFueSB3YXJuaW5ncyAodW51c2VkIHZhcmlhYmxlcywgZGVhZCBhc3NpZ25tZW50cywgZXRjLi4uKQorLSBubyBmZG9wZW4gZm9yIEJlT1MKKy0gZml4IHRoZSBXYXRjb20gZml4IGZvciAzMiBiaXQgbW9kZSAoZGVmaW5lIEZBUiBhcyBlbXB0eSkKKy0gcmVtb3ZlZCByZWRlZmluaXRpb24gb2YgQnl0ZSBmb3IgTUtXRVJLUworLSB3b3JrIGFyb3VuZCBhbiBNV0tFUktTIGJ1ZyAoaW5jb3JyZWN0IG1lcmdlIG9mIGFsbCAuaCBmaWxlcykKKworQ2hhbmdlcyBpbiAwLjk5ICgyNyBKYW4gOTYpCistIGFsbG93IHByZXNldCBkaWN0aW9uYXJ5IHNoYXJlZCBiZXR3ZWVuIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvcgorLSBhbGxvdyBjb21wcmVzc2lvbiBsZXZlbCAwIChubyBjb21wcmVzc2lvbikKKy0gYWRkIGRlZmxhdGVQYXJhbXMgaW4gemxpYi5oOiBhbGxvdyBkeW5hbWljIGNoYW5nZSBvZiBjb21wcmVzc2lvbiBsZXZlbAorICBhbmQgY29tcHJlc3Npb24gc3RyYXRlZ3kuCistIHRlc3QgbGFyZ2UgYnVmZmVycyBhbmQgZGVmbGF0ZVBhcmFtcyBpbiBleGFtcGxlLmMKKy0gYWRkIG9wdGlvbmFsICJjb25maWd1cmUiIHRvIGJ1aWxkIHpsaWIgYXMgYSBzaGFyZWQgbGlicmFyeQorLSBzdXBwcmVzcyBNYWtlZmlsZS5xbngsIHVzZSBjb25maWd1cmUgaW5zdGVhZAorLSBmaXhlZCBkZWZsYXRlIGZvciA2NC1iaXQgc3lzdGVtcyAoZGV0ZWN0ZWQgb24gQ3JheSkKKy0gZml4ZWQgaW5mbGF0ZV9ibG9ja3MgZm9yIDY0LWJpdCBzeXN0ZW1zIChkZXRlY3RlZCBvbiBBbHBoYSkKKy0gZGVjbGFyZSBaX0RFRkxBVEVEIGluIHpsaWIuaCAocG9zc2libGUgcGFyYW1ldGVyIGZvciBkZWZsYXRlSW5pdDIpCistIGFsd2F5cyByZXR1cm4gWl9CVUZfRVJST1Igd2hlbiBkZWZsYXRlKCkgaGFzIG5vdGhpbmcgdG8gZG8KKy0gZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBub3cgbWFjcm9zIHRvIGFsbG93IHZlcnNpb24gY2hlY2tpbmcKKy0gcHJlZml4IGFsbCBnbG9iYWwgZnVuY3Rpb25zIGFuZCB0eXBlcyB3aXRoIHpfIHdpdGggLURaX1BSRUZJWAorLSBtYWtlIGZhbGxvYyBjb21wbGV0ZWx5IHJlZW50cmFudCAoaW5mdHJlZXMuYykKKy0gZml4ZWQgdmVyeSB1bmxpa2VseSByYWNlIGNvbmRpdGlvbiBpbiBjdF9zdGF0aWNfaW5pdAorLSBmcmVlIGluIHJldmVyc2Ugb3JkZXIgb2YgYWxsb2NhdGlvbiB0byBoZWxwIG1lbW9yeSBtYW5hZ2VyCistIHVzZSB6bGliLTEuMC8qIGluc3RlYWQgb2YgemxpYi8qIGluc2lkZSB0aGUgdGFyLmd6CistIG1ha2UgemxpYiB3YXJuaW5nLWZyZWUgd2l0aCAiZ2NjIC1PMyAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoCisgIC1XY29udmVyc2lvbiAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzIgorLSBhbGxvdyBnenJlYWQgb24gY29uY2F0ZW5hdGVkIC5neiBmaWxlcworLSBkZWZsYXRlRW5kIG5vdyByZXR1cm5zIFpfREFUQV9FUlJPUiBpZiBpdCB3YXMgcHJlbWF0dXJlCistIGRlZmxhdGUgaXMgZmluYWxseSAoPykgZnVsbHkgZGV0ZXJtaW5pc3RpYyAobm8gbWF0Y2hlcyBiZXlvbmQgZW5kIG9mIGlucHV0KQorLSBEb2N1bWVudCBaX1NZTkNfRkxVU0gKKy0gYWRkIHVuaW5zdGFsbCBpbiBNYWtlZmlsZQorLSBDaGVjayBmb3IgX19jcGx1cGx1cyBpbiB6bGliLmgKKy0gQmV0dGVyIHRlc3QgaW4gY3RfYWxpZ24gZm9yIHBhcnRpYWwgZmx1c2gKKy0gYXZvaWQgaGFybWxlc3Mgd2FybmluZ3MgZm9yIEJvcmxhbmQgQysrCistIGluaXRpYWxpemUgaGFzaF9oZWFkIGluIGRlZmxhdGUuYworLSBhdm9pZCB3YXJuaW5nIG9uIGZkb3BlbiAoZ3ppby5jKSBmb3IgSFAgY2MgLUFhCistIGluY2x1ZGUgc3RkbGliLmggZm9yIFNUREMgY29tcGlsZXJzCistIGluY2x1ZGUgZXJybm8uaCBmb3IgQ3JheQorLSBpZ25vcmUgZXJyb3IgaWYgcmFubGliIGRvZXNuJ3QgZXhpc3QKKy0gY2FsbCByYW5saWIgdHdpY2UgZm9yIE5lWFRTVEVQCistIHVzZSBleGVjX3ByZWZpeCBpbnN0ZWFkIG9mIHByZWZpeCBmb3IgbGliei5hCistIHJlbmFtZWQgY3RfKiBhcyBfdHJfKiB0byBhdm9pZCBjb25mbGljdCB3aXRoIGFwcGxpY2F0aW9ucworLSBjbGVhciB6LT5tc2cgaW4gaW5mbGF0ZUluaXQyIGJlZm9yZSBhbnkgZXJyb3IgcmV0dXJuCistIGluaXRpYWxpemUgb3BhcXVlIGluIGV4YW1wbGUuYywgZ3ppby5jLCBkZWZsYXRlLmMgYW5kIGluZmxhdGUuYworLSBmaXhlZCB0eXBvIGluIHpjb25mLmggKF9HTlVDX18gPT4gX19HTlVDX18pCistIGNoZWNrIGZvciBXSU4zMiBpbiB6Y29uZi5oIGFuZCB6dXRpbC5jIChhdm9pZCBmYXJtYWxsb2MgaW4gMzItYml0IG1vZGUpCistIGZpeCB0eXBvIGluIE1ha2Vfdm1zLmNvbSAoZiR0cm5sbm0gLT4gZiRnZXRzeWkpCistIGluIGZjYWxsb2MsIG5vcm1hbGl6ZSBwb2ludGVyIGlmIHNpemUgPiA2NTUyMCBieXRlcworLSBkb24ndCB1c2Ugc3BlY2lhbCBmY2FsbG9jIGZvciAzMiBiaXQgQm9ybGFuZCBDKysKKy0gdXNlIFNUREMgaW5zdGVhZCBvZiBfX0dPMzJfXyB0byBhdm9pZCByZWRlY2xhcmluZyBleGl0LCBjYWxsb2MsIGV0Yy4uLgorLSB1c2UgWl9CSU5BUlkgaW5zdGVhZCBvZiBCSU5BUlkKKy0gZG9jdW1lbnQgdGhhdCBnemNsb3NlIGFmdGVyIGd6ZG9wZW4gd2lsbCBjbG9zZSB0aGUgZmlsZQorLSBhbGxvdyAiYSIgYXMgbW9kZSBpbiBnem9wZW4uCistIGZpeCBlcnJvciBjaGVja2luZyBpbiBnenJlYWQKKy0gYWxsb3cgc2tpcHBpbmcgLmd6IGV4dHJhLWZpZWxkIG9uIHBpcGVzCistIGFkZGVkIHJlZmVyZW5jZSB0byBQZXJsIGludGVyZmFjZSBpbiBSRUFETUUKKy0gcHV0IHRoZSBjcmMgdGFibGUgaW4gRkFSIGRhdGEgKEkgZGlzbGlrZSBtb3JlIGFuZCBtb3JlIHRoZSBtZWRpdW0gbW9kZWwgOikKKy0gYWRkZWQgZ2V0X2NyY190YWJsZQorLSBhZGRlZCBhIGRpbWVuc2lvbiB0byBhbGwgYXJyYXlzIChCb3JsYW5kIEMgY2FuJ3QgY291bnQpLgorLSB3b3JrYXJvdW5kIEJvcmxhbmQgQyBidWcgaW4gZGVjbGFyYXRpb24gb2YgaW5mbGF0ZV9jb2Rlc19uZXcgJiBpbmZsYXRlX2Zhc3QKKy0gZ3VhcmQgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24gb2YgKi5oIChmb3IgcHJlY29tcGlsZWQgaGVhZGVyIG9uIE1hYykKKy0gV2F0Y29tIEMgcHJldGVuZHMgdG8gYmUgTWljcm9zb2Z0IEMgc21hbGwgbW9kZWwgZXZlbiBpbiAzMiBiaXQgbW9kZS4KKy0gZG9uJ3QgdXNlIHVuc2l6ZWQgYXJyYXlzIHRvIGF2b2lkIHNpbGx5IHdhcm5pbmdzIGJ5IFZpc3VhbCBDKys6CisgICAgIHdhcm5pbmcgQzQ3NDY6ICdpbmZsYXRlX21hc2snIDogdW5zaXplZCBhcnJheSB0cmVhdGVkIGFzICAnX19mYXInCisgICAgICh3aGF0J3Mgd3Jvbmcgd2l0aCBmYXIgZGF0YSBpbiBmYXIgbW9kZWw/KS4KKy0gZGVmaW5lIGVudW0gb3V0IG9mIGluZmxhdGVfYmxvY2tzX3N0YXRlIHRvIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQysrCisKK0NoYW5nZXMgaW4gMC45NSAoMTYgQXVnIDk1KQorLSBmaXggTVNET1Mgc21hbGwgYW5kIG1lZGl1bSBtb2RlbCAobm93IGVhc2llciB0byBhZGFwdCB0byBhbnkgY29tcGlsZXIpCistIGlubGluZWQgc2VuZF9iaXRzCistIGZpeCB0aGUgZmluYWwgKDotKSBidWcgZm9yIGRlZmxhdGUgd2l0aCBmbHVzaCAob3V0cHV0IHdhcyBjb3JyZWN0IGJ1dAorICBub3QgY29tcGxldGVseSBmbHVzaGVkIGluIHJhcmUgb2NjYXNpb25zKS4KKy0gZGVmYXVsdCB3aW5kb3cgc2l6ZSBpcyBzYW1lIGZvciBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorICAoaXQncyBub3cgc3VmZmljaWVudCB0byBzZXQgTUFYX1dCSVRTIGluIHpjb25mLmgpLgorLSB2b2lkcCAtPiB2b2lkcGYgYW5kIHZvaWRucCAtPiB2b2lkcCAoZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIKKyAgdHlwZWRlZnMgYW5kIGJlY2F1c2Ugdm9pZG5wIHdhcyBub3QgbmVhciBpbiBsYXJnZSBtb2RlbCkuCisKK0NoYW5nZXMgaW4gMC45NCAoMTMgQXVnIDk1KQorLSBzdXBwb3J0IE1TRE9TIG1lZGl1bSBtb2RlbAorLSBmaXggZGVmbGF0ZSB3aXRoIGZsdXNoIChjb3VsZCBzb21ldGltZXMgZ2VuZXJhdGUgYmFkIG91dHB1dCkKKy0gZml4IGRlZmxhdGVSZXNldCAoemxpYiBoZWFkZXIgd2FzIGluY29ycmVjdGx5IHN1cHByZXNzZWQpCistIGFkZGVkIHN1cHBvcnQgZm9yIFZNUworLSBhbGxvdyBhIGNvbXByZXNzaW9uIGxldmVsIGluIGd6b3BlbigpCistIGd6Zmx1c2ggbm93IGNhbGxzIGZmbHVzaAorLSBGb3IgZGVmbGF0ZSB3aXRoIGZsdXNoLCBmbHVzaCBldmVuIGlmIG5vIG1vcmUgaW5wdXQgaXMgcHJvdmlkZWQuCistIHJlbmFtZSBsaWJnei5hIGFzIGxpYnouYQorLSBhdm9pZCBjb21wbGV4IGV4cHJlc3Npb24gaW4gaW5mY29kZXMuYyB0cmlnZ2VyaW5nIFR1cmJvIEMgYnVnCistIHdvcmsgYXJvdW5kIGEgcHJvYmxlbSB3aXRoIGdjYyBvbiBBbHBoYSAoaW4gSU5TRVJUX1NUUklORykKKy0gZG9uJ3QgdXNlIGlubGluZSBmdW5jdGlvbnMgKHByb2JsZW0gd2l0aCBzb21lIGdjYyB2ZXJzaW9ucykKKy0gYWxsb3cgcmVuYW1pbmcgb2YgQnl0ZSwgdUludCwgZXRjLi4uIHdpdGggI2RlZmluZS4KKy0gYXZvaWQgd2FybmluZyBhYm91dCAodW51c2VkKSBwb2ludGVyIGJlZm9yZSBzdGFydCBvZiBhcnJheSBpbiBkZWZsYXRlLmMKKy0gYXZvaWQgdmFyaW91cyB3YXJuaW5ncyBpbiBnemlvLmMsIGV4YW1wbGUuYywgaW5mYmxvY2suYywgYWRsZXIzMi5jLCB6dXRpbC5jCistIGF2b2lkIHJlc2VydmVkIHdvcmQgJ25ldycgaW4gdHJlZXMuYworCitDaGFuZ2VzIGluIDAuOTMgKDI1IEp1bmUgOTUpCistIHRlbXBvcmFyaWx5IGRpc2FibGUgaW5saW5lIGZ1bmN0aW9ucworLSBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYworLSBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIFBBUlRJQUxfRkxVU0gKKy0gU2V0IGJpbmFyeSBtb2RlIGZvciBzdGRpbi9zdGRvdXQgaW4gbWluaWd6aXAuYyBmb3IgT1MvMgorLSBkb24ndCBldmVuIHVzZSBzaWduZWQgY2hhciBpbiBpbmZsYXRlIChub3QgcG9ydGFibGUgZW5vdWdoKQorLSBmaXggaW5mbGF0ZSBtZW1vcnkgbGVhayBmb3Igc2VnbWVudGVkIGFyY2hpdGVjdHVyZXMKKworQ2hhbmdlcyBpbiAwLjkyICgzIE1heSA5NSkKKy0gZG9uJ3QgYXNzdW1lIHRoYXQgY2hhciBpcyBzaWduZWQgKHByb2JsZW0gb24gU0dJKQorLSBDbGVhciBiaXQgYnVmZmVyIHdoZW4gc3RhcnRpbmcgYSBzdG9yZWQgYmxvY2sKKy0gbm8gbWVtY3B5IG9uIFB5cmFtaWQKKy0gc3VwcHJlc3NlZCBpbmZ0ZXN0LmMKKy0gb3B0aW1pemVkIGZpbGxfd2luZG93LCBwdXQgbG9uZ2VzdF9tYXRjaCBpbmxpbmUgZm9yIGdjYworLSBvcHRpbWl6ZWQgaW5mbGF0ZSBvbiBzdG9yZWQgYmxvY2tzLgorLSB1bnRhYmlmeSBhbGwgc291cmNlcyB0byBzaW1wbGlmeSBwYXRjaGVzCisKK0NoYW5nZXMgaW4gMC45MSAoMiBNYXkgOTUpCistIERlZmF1bHQgTUVNX0xFVkVMIGlzIDggKG5vdCA5IGZvciBVbml4KSBhcyBkb2N1bWVudGVkIGluIHpsaWIuaAorLSBEb2N1bWVudCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBpbiB6Y29uZi5oCistIGFkZGVkICJtYWtlIGluc3RhbGwiCistIGZpeCBzeW5jIHNlYXJjaCBsb2dpYyBpbiBpbmZsYXRlU3luYworLSBkZWZsYXRlKFpfRlVMTF9GTFVTSCkgbm93IHdvcmtzIGV2ZW4gaWYgb3V0cHV0IGJ1ZmZlciB0b28gc2hvcnQKKy0gYWZ0ZXIgaW5mbGF0ZVN5bmMsIGRvbid0IHNjYXJlIHBlb3BsZSB3aXRoIGp1c3QgImxvIHdvcmxkIgorLSBhZGRlZCBzdXBwb3J0IGZvciBESkdQUAorCitDaGFuZ2VzIGluIDAuOSAoMSBNYXkgOTUpCistIGRvbid0IGFzc3VtZSB0aGF0IHphbGxvYyBjbGVhcnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKHRoZSBUdXJib0MgYnVnCisgIHdhcyBNYXJrJ3MgYnVnIGFmdGVyIGFsbCA6KQorLSBsZXQgYWdhaW4gZ3pyZWFkIGNvcHkgdW5jb21wcmVzc2VkIGRhdGEgdW5jaGFuZ2VkICh3YXMgd29ya2luZyBpbiAwLjcxKQorLSBkZWZsYXRlKFpfRlVMTF9GTFVTSCksIGluZmxhdGVSZXNldCBhbmQgaW5mbGF0ZVN5bmMgYXJlIG5vdyBmdWxseSBpbXBsZW1lbnRlZAorLSBhZGRlZCBhIHRlc3Qgb2YgaW5mbGF0ZVN5bmMgaW4gZXhhbXBsZS5jCistIG1vdmVkIE1BWF9XQklUUyB0byB6Y29uZi5oIGJlY2F1c2UgdXNlcnMgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhhdC4KKy0gZG9jdW1lbnQgZXhwbGljaXRseSB0aGF0IHphbGxvYyg2NEspIG9uIE1TRE9TIG11c3QgcmV0dXJuIGEgbm9ybWFsaXplZAorICBwb2ludGVyICh6ZXJvIG9mZnNldCkKKy0gYWRkZWQgTWFrZWZpbGVzIGZvciBNaWNyb3NvZnQgQywgVHVyYm8gQywgQm9ybGFuZCBDKysKKy0gZmFzdGVyIGNyYzMyKCkKKworQ2hhbmdlcyBpbiAwLjggKDI5IEFwcmlsIDk1KQorLSBhZGRlZCBmYXN0IGluZmxhdGUgKGluZmZhc3QuYykKKy0gZGVmbGF0ZShaX0ZJTklTSCkgbm93IHJldHVybnMgWl9TVFJFQU1fRU5EIHdoZW4gZG9uZS4gV2FybmluZzogdGhpcworICBpcyBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB6bGliIHdoaWNoIHJldHVybmVkIFpfT0suCistIHdvcmsgYXJvdW5kIGEgVHVyYm9DIGNvbXBpbGVyIGJ1ZyAoYmFkIGNvZGUgZm9yIGIgPDwgMCwgc2VlIGluZnV0aWwuaCkKKyAgKGFjdHVhbGx5IHRoYXQgd2FzIG5vdCBhIGNvbXBpbGVyIGJ1Zywgc2VlIDAuODEgYWJvdmUpCistIGd6cmVhZCBubyBsb25nZXIgcmVhZHMgb25lIGV4dHJhIGJ5dGUgaW4gY2VydGFpbiBjYXNlcworLSBJbiBnemlvIGRlc3Ryb3koKSwgZG9uJ3QgcmVmZXJlbmNlIGEgZnJlZWQgc3RydWN0dXJlCistIGF2b2lkIG1hbnkgd2FybmluZ3MgZm9yIE1TRE9TCistIGF2b2lkIHRoZSBFUlJPUiBzeW1ib2wgd2hpY2ggaXMgdXNlZCBieSBNUyBXaW5kb3dzCisKK0NoYW5nZXMgaW4gMC43MSAoMTQgQXByaWwgOTUpCistIEZpeGVkIG1vcmUgTVNET1MgY29tcGlsYXRpb24gcHJvYmxlbXMgOiggVGhlcmUgaXMgc3RpbGwgYSBidWcgd2l0aAorICBUdXJib0MgbGFyZ2UgbW9kZWwuCisKK0NoYW5nZXMgaW4gMC43ICgxNCBBcHJpbCA5NSkKKy0gQWRkZWQgZnVsbCBpbmZsYXRlIHN1cHBvcnQuCistIFNpbXBsaWZpZWQgdGhlIGNyYzMyKCkgaW50ZXJmYWNlLiBUaGUgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcKKyAgKG9uZSdzIGNvbXBsZW1lbnQpIGlzIG5vdyBkb25lIGluc2lkZSBjcmMzMigpLiBXQVJOSU5HOiB0aGlzIGlzCisgIGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zOyBzZWUgemxpYi5oIGZvciB0aGUgbmV3IHVzYWdlLgorCitDaGFuZ2VzIGluIDAuNjEgKDEyIEFwcmlsIDk1KQorLSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBUdXJib0MuIGV4YW1wbGUgYW5kIG1pbmlnemlwIG5vdyB3b3JrIG9uIE1TRE9TLgorCitDaGFuZ2VzIGluIDAuNiAoMTEgQXByaWwgOTUpCistIGFkZGVkIG1pbmlnemlwLmMKKy0gYWRkZWQgZ3pkb3BlbiB0byByZW9wZW4gYSBmaWxlIGRlc2NyaXB0b3IgYXMgZ3pGaWxlCistIGFkZGVkIHRyYW5zcGFyZW50IHJlYWRpbmcgb2Ygbm9uLWd6aXBlZCBmaWxlcyBpbiBnenJlYWQuCistIGZpeGVkIGJ1ZyBpbiBnenJlYWQgKGRvbid0IHJlYWQgY3JjIGFzIGRhdGEpCistIGZpeGVkIGJ1ZyBpbiBkZXN0cm95IChnemlvLmMpIChkb24ndCByZXR1cm4gWl9TVFJFQU1fRU5EIGZvciBnemNsb3NlKS4KKy0gZG9uJ3QgYWxsb2NhdGUgYmlnIGFycmF5cyBpbiB0aGUgc3RhY2sgKGZvciBNU0RPUykKKy0gZml4IHNvbWUgTVNET1MgY29tcGlsYXRpb24gcHJvYmxlbXMKKworQ2hhbmdlcyBpbiAwLjU6CistIGRvIHJlYWwgY29tcHJlc3Npb24gaW4gZGVmbGF0ZS5jLiBaX1BBUlRJQUxfRkxVU0ggaXMgc3VwcG9ydGVkIGJ1dAorICBub3QgeWV0IFpfRlVMTF9GTFVTSC4KKy0gc3VwcG9ydCBkZWNvbXByZXNzaW9uIGJ1dCBvbmx5IGluIGEgc2luZ2xlIHN0ZXAgKGZvcmNlZCBaX0ZJTklTSCkKKy0gYWRkZWQgb3BhcXVlIG9iamVjdCBmb3IgemFsbG9jIGFuZCB6ZnJlZS4KKy0gYWRkZWQgZGVmbGF0ZVJlc2V0IGFuZCBpbmZsYXRlUmVzZXQKKy0gYWRkZWQgYSB2YXJpYWJsZSB6bGliX3ZlcnNpb24gZm9yIGNvbnNpc3RlbmN5IGNoZWNraW5nLgorLSByZW5hbWVkIHRoZSAnZmlsdGVyJyBwYXJhbWV0ZXIgb2YgZGVmbGF0ZUluaXQyIGFzICdzdHJhdGVneScuCisgIEFkZGVkIFpfRklMVEVSRUQgYW5kIFpfSFVGRk1BTl9PTkxZIGNvbnN0YW50cy4KKworQ2hhbmdlcyBpbiAwLjQ6CistIGF2b2lkICJ6aXAiIGV2ZXJ5d2hlcmUsIHVzZSB6bGliIGluc3RlYWQgb2YgemlwbGliLgorLSBzdXBwcmVzcyBaX0JMT0NLX0ZMVVNILCBpbnRlcnByZXQgWl9QQVJUSUFMX0ZMVVNIIGFzIGJsb2NrIGZsdXNoCisgIGlmIGNvbXByZXNzaW9uIG1ldGhvZCA9PSA4LgorLSBhZGRlZCBhZGxlcjMyIGFuZCBjcmMzMgorLSByZW5hbWVkIGRlZmxhdGVPcHRpb25zIGFzIGRlZmxhdGVJbml0MiwgY2FsbCBvbmUgb3IgdGhlIG90aGVyIGJ1dCBub3QgYm90aAorLSBhZGRlZCB0aGUgbWV0aG9kIHBhcmFtZXRlciBmb3IgZGVmbGF0ZUluaXQyLgorLSBhZGRlZCBpbmZsYXRlSW5pdDIKKy0gc2ltcGxpZWQgY29uc2lkZXJhYmx5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBieSBub3Qgc3VwcG9ydGluZworICB1c2VyLXByb3ZpZGVkIGhpc3RvcnkgYnVmZmVyLiBUaGlzIGlzIHN1cHBvcnRlZCBvbmx5IGluIGRlZmxhdGVJbml0MgorICBhbmQgaW5mbGF0ZUluaXQyLgorCitDaGFuZ2VzIGluIDAuMzoKKy0gcHJlZml4IGFsbCBtYWNybyBuYW1lcyB3aXRoIFpfCistIHVzZSBaX0ZJTklTSCBpbnN0ZWFkIG9mIGRlZmxhdGVFbmQgdG8gZmluaXNoIGNvbXByZXNzaW9uLgorLSBhZGRlZCBaX0hVRkZNQU5fT05MWQorLSBhZGRlZCBnemVycm9yKCkKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL0ZBUSBiL2NvbW1vbi96bGliL0ZBUQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2E3ZDYwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvRkFRCkBAIC0wLDAgKzEsMTAwIEBACisKKwkJRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgemxpYgorCisKK0lmIHlvdXIgcXVlc3Rpb24gaXMgbm90IHRoZXJlLCBwbGVhc2UgY2hlY2sgdGhlIHpsaWIgaG9tZSBwYWdlIAoraHR0cDovL3d3dy56bGliLm9yZyB3aGljaCBtYXkgaGF2ZSBtb3JlIHJlY2VudCBpbmZvcm1hdGlvbi4KK1RoZSBsYXN0ZXN0IHpsaWIgRkFRIGlzIGF0IGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCisKKworIDEuIElzIHpsaWIgWTJLLWNvbXBsaWFudD8KKworICAgIFllcy4gemxpYiBkb2Vzbid0IGhhbmRsZSBkYXRlcy4KKworIDIuIFdoZXJlIGNhbiBJIGdldCBhIFdpbmRvd3MgRExMIHZlcnNpb24/CisKKyAgICBUaGUgemxpYiBzb3VyY2VzIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IGNoYW5nZSB0byBwcm9kdWNlIGEgRExMLiBJZiB5b3UKKyAgICB3YW50IGEgcHJlY29tcGlsZWQgRExMLCBzZWUgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC8gLiBRdWVzdGlvbnMKKyAgICBhYm91dCB0aGUgemxpYiBETEwgc2hvdWxkIGJlIHNlbnQgdG8gR2lsbGVzIFZvbGxhbnQgKGluZm9Ad2luaW1hZ2UuY29tKS4KKworIDMuIFdoZXJlIGNhbiBJIGdldCBhIFZpc3VhbCBCYXNpYyBpbnRlcmZhY2UgdG8gemxpYj8KKworICAgIFNlZQorICAgICAgICAqIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvY21wLXotaXQuemlwCisgICAgICAgICogaHR0cDovL3d3dy5kb2dtYS5uZXQvbWFya24vYXJ0aWNsZXMvemxpYnRvb2wvemxpYnRvb2wuaHRtCisgICAgICAgICogY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGluIHRoZSB6bGliIGRpc3RyaWJ1dGlvbgorCisgNC4gY29tcHJlc3MoKSByZXR1cm5zIFpfQlVGX0VSUk9SCisKKyAgICBNYWtlIHN1cmUgdGhhdCBiZWZvcmUgdGhlIGNhbGwgb2YgY29tcHJlc3MsIHRoZSBsZW5ndGggb2YgdGhlIGNvbXByZXNzZWQKKyAgICBidWZmZXIgaXMgZXF1YWwgdG8gdGhlIHRvdGFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyIGFuZCBub3QKKyAgICB6ZXJvLiBGb3IgVmlzdWFsIEJhc2ljLCBjaGVjayB0aGF0IHRoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBieSByZWZlcmVuY2UKKyAgICAoImFzIGFueSIpLCBub3QgYnkgdmFsdWUgKCJhcyBsb25nIikuCisKKyA1LiBkZWZsYXRlKCkgb3IgaW5mbGF0ZSgpIHJldHVybnMgWl9CVUZfRVJST1IKKworICAgIEJlZm9yZSBtYWtpbmcgdGhlIGNhbGwsIG1ha2Ugc3VyZSB0aGF0IGF2YWlsX2luIGFuZCBhdmFpbF9vdXQgYXJlIG5vdAorICAgIHplcm8uIFdoZW4gc2V0dGluZyB0aGUgcGFyYW1ldGVyIGZsdXNoIGVxdWFsIHRvIFpfRklOSVNILCBhbHNvIG1ha2Ugc3VyZQorICAgIHRoYXQgYXZhaWxfb3V0IGlzIGJpZyBlbm91Z2ggdG8gYWxsb3cgcHJvY2Vzc2luZyBhbGwgcGVuZGluZyBpbnB1dC4KKworIDYuIFdoZXJlJ3MgdGhlIHpsaWIgZG9jdW1lbnRhdGlvbiAobWFuIHBhZ2VzLCBldGMuKT8KKworICAgIEl0J3MgaW4gemxpYi5oIGZvciB0aGUgbW9tZW50LCBhbmQgRnJhbmNpcyBTLiBMaW4gaGFzIGNvbnZlcnRlZCBpdCB0byBhCisgICAgd2ViIHBhZ2UgemxpYi5odG1sLiBWb2x1bnRlZXJzIHRvIHRyYW5zZm9ybSB0aGlzIHRvIFVuaXgtc3R5bGUgbWFuIHBhZ2VzLAorICAgIHBsZWFzZSBjb250YWN0IEplYW4tbG91cCBHYWlsbHkgKGpsb3VwQGd6aXAub3JnKS4gRXhhbXBsZXMgb2YgemxpYiB1c2FnZQorICAgIGFyZSBpbiB0aGUgZmlsZXMgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jLgorCisgNy4gV2h5IGRvbid0IHlvdSB1c2UgR05VIGF1dG9jb25mIG9yIGxpYnRvb2wgb3IgLi4uPworCisgICAgQmVjYXVzZSB3ZSB3b3VsZCBsaWtlIHRvIGtlZXAgemxpYiBhcyBhIHZlcnkgc21hbGwgYW5kIHNpbXBsZQorICAgIHBhY2thZ2UuIHpsaWIgaXMgcmF0aGVyIHBvcnRhYmxlIGFuZCBkb2Vzbid0IG5lZWQgbXVjaCBjb25maWd1cmF0aW9uLgorCisgOC4gSSBmb3VuZCBhIGJ1ZyBpbiB6bGliLgorCisgICAgTW9zdCBvZiB0aGUgdGltZSwgc3VjaCBwcm9ibGVtcyBhcmUgZHVlIHRvIGFuIGluY29ycmVjdCB1c2FnZSBvZgorICAgIHpsaWIuIFBsZWFzZSB0cnkgdG8gcmVwcm9kdWNlIHRoZSBwcm9ibGVtIHdpdGggYSBzbWFsbCBwcm9ncmFtIGFuZCBzZW5kCisgICAgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIHRvIHVzIGF0IHpsaWJAZ3ppcC5vcmcgLiBEbyBub3Qgc2VuZAorICAgIG11bHRpLW1lZ2FieXRlIGRhdGEgZmlsZXMgd2l0aG91dCBwcmlvciBhZ3JlZW1lbnQuCisKKyA5LiBXaHkgZG8gSSBnZXQgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gZ3pwdXRjIj8KKworICAgIElmICJtYWtlIHRlc3QiIHByb2R1Y2VzIHNvbWV0aGluZyBsaWtlCisKKyAgICAgICBleGFtcGxlLm8oLnRleHQrMHgxNTQpOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGBnenB1dGMnCisgICAgICAKKyAgICBjaGVjayB0aGF0IHlvdSBkb24ndCBoYXZlIG9sZCBmaWxlcyBsaWJ6LiogaW4gL3Vzci9saWIsIC91c3IvbG9jYWwvbGliIG9yCisgICAgL3Vzci9YMTFSNi9saWIuIFJlbW92ZSBhbnkgb2xkIHZlcnNpb25zLCB0aGVuIGRvICJtYWtlIGluc3RhbGwiLgorCisxMC4gSSBuZWVkIGEgRGVscGhpIGludGVyZmFjZSB0byB6bGliLgorCisgICAgU2VlIHRoZSBkaXJlY3RvcmllcyBjb250cmliL2RlbHBoaSBhbmQgY29udHJpYi9kZWxwaGkyIGluIHRoZSB6bGliCisgICAgZGlzdHJpYnV0aW9uLgorCisxMS4gQ2FuIHpsaWIgaGFuZGxlIC56aXAgYXJjaGl2ZXM/CisKKyAgICBTZWUgdGhlIGRpcmVjdG9yeSBjb250cmliL21pbml6aXAgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgorCisxMi4gQ2FuIHpsaWIgaGFuZGxlIC5aIGZpbGVzPworCisgICAgTm8sIHNvcnJ5LiBZb3UgaGF2ZSB0byBzcGF3biBhbiB1bmNvbXByZXNzIG9yIGd1bnppcCBzdWJwcm9jZXNzLCBvciBhZGFwdAorICAgIHRoZSBjb2RlIG9mIHVuY29tcHJlc3Mgb24geW91ciBvd24uCisKKzEzLiBIb3cgY2FuIEkgbWFrZSBhIFVuaXggc2hhcmVkIGxpYnJhcnk/CisKKyAgICBtYWtlIGNsZWFuCisgICAgLi9jb25maWd1cmUgLXMKKyAgICBtYWtlCisKKzE0LiBXaHkgZG9lcyAibWFrZSB0ZXN0IiBmYWlsIG9uIE1hYyBPUyBYPworCisgICAgTWFjIE9TIFggYWxyZWFkeSBpbmNsdWRlcyB6bGliIGFzIGEgc2hhcmVkIGxpYnJhcnksIGFuZCBzbyAtbHogbGlua3MgdGhlCisgICAgc2hhcmVkIGxpYnJhcnkgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgdGhlICJtYWtlIiBjb21waWxlZC4gRm9yIHpsaWIKKyAgICAxLjEuMywgdGhlIHR3byBhcmUgaW5jb21wYXRpYmxlIGR1ZSB0byBkaWZmZXJlbnQgY29tcGlsZS10aW1lCisgICAgb3B0aW9ucy4gU2ltcGx5IGNoYW5nZSB0aGUgLWx6IGluIHRoZSBNYWtlZmlsZSB0byBsaWJ6LmEsIGFuZCBpdCB3aWxsIHVzZQorICAgIHRoZSBjb21waWxlZCBsaWJyYXJ5IGluc3RlYWQgb2YgdGhlIHNoYXJlZCBvbmUgYW5kIHRoZSAibWFrZSB0ZXN0IiB3aWxsCisgICAgc3VjY2VlZC4KKworMTUuIEkgaGF2ZSBhIHF1ZXN0aW9uIGFib3V0IE90dG9QREYKKworICAgIFdlIGFyZSBub3QgdGhlIGF1dGhvcnMgb2YgT3R0b1BERi4gVGhlIHJlYWwgYXV0aG9yIGlzIG9uIHRoZSBPdHRvUERGIHdlYgorICAgIHNpdGUgSm9lbCBIYWlubGV5IGpoYWlubGV5QG15bmRrcnltZS5jb20uCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9JTkRFWCBiL2NvbW1vbi96bGliL0lOREVYCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjQ1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9JTkRFWApAQCAtMCwwICsxLDg2IEBACitDaGFuZ2VMb2cJCWhpc3Rvcnkgb2YgY2hhbmdlcworSU5ERVgJCQl0aGlzIGZpbGUKK0ZBUQkJCUZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IHpsaWIKK01ha2Vfdm1zLmNvbQkJc2NyaXB0IGZvciBWYXgvVk1TCitNYWtlZmlsZQkJbWFrZWZpbGUgZm9yIFVuaXggKGdlbmVyYXRlZCBieSBjb25maWd1cmUpCitNYWtlZmlsZS5pbgkJbWFrZWZpbGUgZm9yIFVuaXggKHRlbXBsYXRlIGZvciBjb25maWd1cmUpCitNYWtlZmlsZS5yaXNjb3MgCW1ha2VmaWxlIGZvciBSSVNDT1MKK1JFQURNRQkJCWd1ZXNzIHdoYXQKK2FsZ29yaXRobS50eHQJCWRlc2NyaXB0aW9uIG9mIHRoZSAoZGUpY29tcHJlc3Npb24gYWxnb3JpdGhtCitjb25maWd1cmUJCWNvbmZpZ3VyZSBzY3JpcHQgZm9yIFVuaXgKK2Rlc2NyaXAubW1zCQltYWtlZmlsZSBmb3IgVmF4L1ZNUworemxpYi4zCQkJbWluaSBtYW4gcGFnZSBmb3IgemxpYiAodm9sdW50ZWVycyB0byB3cml0ZSBmdWxsCisJCQltYW4gcGFnZXMgZnJvbSB6bGliLmggd2VsY29tZS4gd3JpdGUgdG8gamxvdXBAZ3ppcC5vcmcpCisKK2FtaWdhL01ha2VmaWxlLnNhcwltYWtlZmlsZSBmb3IgQW1pZ2EgU0FTL0MKK2FtaWdhL01ha2VmaWxlLnB1cCAgICAgIG1ha2VmaWxlIGZvciBBbWlnYSBwb3dlclVQIFNBUy9DIFBQQworCittc2Rvcy9NYWtlZmlsZS53MzIgICAgICBtYWtlZmlsZSBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgMzItYml0Cittc2Rvcy9NYWtlZmlsZS5iMzIJbWFrZWZpbGUgZm9yIEJvcmxhbmQgQysrICAgMzItYml0Cittc2Rvcy9NYWtlZmlsZS5ib3IJbWFrZWZpbGUgZm9yIEJvcmxhbmQgQy9DKysgMTYtYml0Cittc2Rvcy9NYWtlZmlsZS5kajIJbWFrZWZpbGUgZm9yIERKR1BQIDIueAorbXNkb3MvTWFrZWZpbGUuZW14CW1ha2VmaWxlIGZvciBFTVggMC45YyAoMzItYml0IERPUy9PUzIpCittc2Rvcy9NYWtlZmlsZS5tc2MJbWFrZWZpbGUgZm9yIE1pY3Jvc29mdCBDIDE2LWJpdAorbXNkb3MvTWFrZWZpbGUudGMJbWFrZWZpbGUgZm9yIFR1cmJvIEMKK21zZG9zL01ha2VmaWxlLndhdAltYWtlZmlsZSBmb3IgV2F0Y29tIEMKK21zZG9zL3psaWIuZGVmICAgICAgICAJZGVmaW5pdGlvbiBmaWxlIGZvciBXaW5kb3dzIERMTAorbXNkb3MvemxpYi5yYyAgICAgICAgIAlkZWZpbml0aW9uIGZpbGUgZm9yIFdpbmRvd3MgRExMCisKK250L01ha2VmaWxlLm50CQltYWtlZmlsZSBmb3IgV2luZG93cyBOVAorbnQvemxpYi5kbnQJCWRlZmluaXRpb24gZmlsZSBmb3IgV2luZG93cyBOVCBETEwKK250L01ha2VmaWxlLmVteAkJbWFrZWZpbGUgZm9yIEVNWCAwLjljL1JTWE5UIDEuNDEgKFdpbjMyIEludGVsKQorbnQvTWFrZWZpbGUuZ2NjCQltYWtlZmlsZSBmb3IgV2luZG93cyBOVCB1c2luZyBHQ0MgKG1pbmd3MzIpCisKKworCQl6bGliIHB1YmxpYyBoZWFkZXIgZmlsZXMgKG11c3QgYmUga2VwdCk6Cit6Y29uZi5oCit6bGliLmgKKworCQlwcml2YXRlIHNvdXJjZSBmaWxlcyB1c2VkIHRvIGJ1aWxkIHRoZSB6bGliIGxpYnJhcnk6CithZGxlcjMyLmMKK2NvbXByZXNzLmMKK2NyYzMyLmMKK2RlZmxhdGUuYworZGVmbGF0ZS5oCitnemlvLmMKK2luZmJsb2NrLmMKK2luZmJsb2NrLmgKK2luZmNvZGVzLmMKK2luZmNvZGVzLmgKK2luZmZhc3QuYworaW5mZmFzdC5oCitpbmZsYXRlLmMKK2luZnRyZWVzLmMKK2luZnRyZWVzLmgKK2luZnV0aWwuYworaW5mdXRpbC5oCittYWtldHJlZS5jCit0cmVlcy5jCit1bmNvbXByLmMKK3p1dGlsLmMKK3p1dGlsLmgKKworCQlzb3VyY2UgZmlsZXMgZm9yIHNhbXBsZSBwcm9ncmFtczoKK2V4YW1wbGUuYworbWluaWd6aXAuYworCisJCXVuc3VwcG9ydGVkIGNvbnRyaWJ1dGlvbiBieSB0aGlyZCBwYXJ0aWVzCisKK2NvbnRyaWIvYXNtMzg2LyBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CisJMzg2IGFzbSBjb2RlIHJlcGxhY2luZyBsb25nZXN0X21hdGNoKCkuCisKK2NvbnRyaWIvbWluaXppcC8gYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorCU1pbmkgemlwIGFuZCB1bnppcCBiYXNlZCBvbiB6bGliCisgICAgICAgIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKKworY29udHJpYi9pb3N0cmVhbS8gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+CisgICAgICAgIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCisKK2NvbnRyaWIvaW9zdHJlYW0yLyAgYnkgVHlnZSBM+HZzZXQgPFR5Z2UuTG92c2V0QGNtci5ubz4KKwlBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKKworY29udHJpYi91bnRnei8gIGJ5ICJQZWRybyBBLiBBcmFuZGEgR3V0aVxpcnJleiIgPHBhYWdAdGlkLmVzPgorCUEgdmVyeSBzaW1wbGUgdGFyLmd6IGV4dHJhY3RvciB1c2luZyB6bGliCisKK2NvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBieSBDYXJsb3MgUmlvcyA8Y19yaW9zQHNvbmRhLmNsPgorICAgICAgICBIb3cgdG8gdXNlIGNvbXByZXNzKCksIHVuY29tcHJlc3MoKSBhbmQgdGhlIGd6KiBmdW5jdGlvbnMgZnJvbSBWQi4KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL01ha2Vfdm1zLmNvbSBiL2NvbW1vbi96bGliL01ha2Vfdm1zLmNvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzU3ZThmCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvTWFrZV92bXMuY29tCkBAIC0wLDAgKzEsMTE1IEBACiskISBtYWtlIGxpYnogdW5kZXIgVk1TCiskISB3cml0dGVuIGJ5IE1hcnRpbiBQLkouIFppbnNlciA8bS56aW5zZXJAZ3NpLmRlPgorJCEKKyQhIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkCiskIQorJCBjY29wdCA9ICIiCiskIGlmIGYkZ2V0c3lpKCJIV19NT0RFTCIpLmdlLjEwMjQKKyQgdGhlbgorJCAgY2NvcHQgPSAiL3ByZWZpeD1hbGwiK2Njb3B0CiskICBjb21wICA9ICJfX2RlY2NfXz0xIgorJCAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6CiskIGVsc2UKKyQgIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOkRFQ0MkQ09NUElMRVIuRVhFIikuZXFzLiIiCiskICAgdGhlbgorJCAgICBjb21wICA9ICJfX3ZheGNfXz0xIgorJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKKyQgICBlbHNlCiskICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIGRlY2MkbGlicmFyeV9pbmNsdWRlOgorJCAgICBjY29wdCA9ICIvZGVjYy9wcmVmaXg9YWxsIitjY29wdAorJCAgICBjb21wICA9ICJfX2RlY2NfXz0xIgorJCAgZW5kaWYKKyQgZW5kaWYKKyQhCiskISBCdWlsZCB0aGUgdGhpbmcgcGxhaW4gb3Igd2l0aCBtbXMKKyQhCiskIHdyaXRlIHN5cyRvdXRwdXQgIkNvbXBpbGluZyBabGliIHNvdXJjZXMgLi4uIgorJCBpZiBmJHNlYXJjaCgiU1lTJFNZU1RFTTpNTVMuRVhFIikuZXFzLiIiCiskICB0aGVuCiskICAgZGVsZSBleGFtcGxlLm9iajsqLG1pbmlnemlwLm9iajsqCiskICAgQ0FMTCBNQUtFIGFkbGVyMzIuT0JKICJDQyAnJ0NDT1BUJyBhZGxlcjMyIiAtCisgICAgICAgICAgICAgICAgYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGNvbXByZXNzLk9CSiAiQ0MgJydDQ09QVCcgY29tcHJlc3MiIC0KKyAgICAgICAgICAgICAgICBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGNyYzMyLk9CSiAiQ0MgJydDQ09QVCcgY3JjMzIiIC0KKyAgICAgICAgICAgICAgICBjcmMzMi5jIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGRlZmxhdGUuT0JKICJDQyAnJ0NDT1BUJyBkZWZsYXRlIiAtCisgICAgICAgICAgICAgICAgZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGd6aW8uT0JKICJDQyAnJ0NDT1BUJyBnemlvIiAtCisgICAgICAgICAgICAgICAgZ3ppby5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgaW5mYmxvY2suT0JKICJDQyAnJ0NDT1BUJyBpbmZibG9jayIgLQorICAgICAgICAgICAgICAgIGluZmJsb2NrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCiskICAgQ0FMTCBNQUtFIGluZmNvZGVzLk9CSiAiQ0MgJydDQ09QVCcgaW5mY29kZXMiIC0KKyAgICAgICAgICAgICAgICBpbmZjb2Rlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAorJCAgIENBTEwgTUFLRSBpbmZmYXN0Lk9CSiAiQ0MgJydDQ09QVCcgaW5mZmFzdCIgLQorICAgICAgICAgICAgICAgIGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmZhc3QuaAorJCAgIENBTEwgTUFLRSBpbmZsYXRlLk9CSiAiQ0MgJydDQ09QVCcgaW5mbGF0ZSIgLQorICAgICAgICAgICAgICAgIGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmgKKyQgICBDQUxMIE1BS0UgaW5mdHJlZXMuT0JKICJDQyAnJ0NDT1BUJyBpbmZ0cmVlcyIgLQorICAgICAgICAgICAgICAgIGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCiskICAgQ0FMTCBNQUtFIGluZnV0aWwuT0JKICJDQyAnJ0NDT1BUJyBpbmZ1dGlsIiAtCisgICAgICAgICAgICAgICAgaW5mdXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmgKKyQgICBDQUxMIE1BS0UgdHJlZXMuT0JKICJDQyAnJ0NDT1BUJyB0cmVlcyIgLQorICAgICAgICAgICAgICAgIHRyZWVzLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgdW5jb21wci5PQkogIkNDICcnQ0NPUFQnIHVuY29tcHIiIC0KKyAgICAgICAgICAgICAgICB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgenV0aWwuT0JKICJDQyAnJ0NDT1BUJyB6dXRpbCIgLQorICAgICAgICAgICAgICAgIHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIFpsaWIgLi4uIgorJCAgIENBTEwgTUFLRSBsaWJ6Lk9MQiAibGliL2NyZWEgbGliei5vbGIgKi5vYmoiICouT0JKCiskICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgZXhhbXBsZS4uLiIKKyQgICBDQUxMIE1BS0UgZXhhbXBsZS5PQkogIkNDICcnQ0NPUFQnIGV4YW1wbGUiIC0KKyAgICAgICAgICAgICAgICBleGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKyQgICBjYWxsIG1ha2UgZXhhbXBsZS5leGUgIkxJTksgZXhhbXBsZSxsaWJ6Lm9sYi9saWIiIGV4YW1wbGUub2JqIGxpYnoub2xiCiskICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgbWluaWd6aXAuLi4iCiskICAgQ0FMTCBNQUtFIG1pbmlnemlwLk9CSiAiQ0MgJydDQ09QVCcgbWluaWd6aXAiIC0KKyAgICAgICAgICAgICAgICBtaW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCiskICAgY2FsbCBtYWtlIG1pbmlnemlwLmV4ZSAtIAorICAgICAgICAgICAgICAgICJMSU5LIG1pbmlnemlwLGxpYnoub2xiL2xpYix4MTF2bXM6eHZtc3V0aWxzLm9sYi9saWIiIC0gCisgICAgICAgICAgICAgICAgbWluaWd6aXAub2JqIGxpYnoub2xiCiskICBlbHNlCiskICAgbW1zL21hY3JvPSgnY29tcCcpCiskICBlbmRpZgorJCB3cml0ZSBzeXMkb3V0cHV0ICJabGliIGJ1aWxkIGNvbXBsZXRlZCIKKyQgZXhpdAorJCEKKyQhCiskTUFLRTogU1VCUk9VVElORSAgICFTVUJST1VUSU5FIFRPIENIRUNLIERFUEVOREVOQ0lFUworJCBWID0gJ0YkVmVyaWZ5KDApCiskISBQMSA9IFdoYXQgd2UgYXJlIHRyeWluZyB0byBtYWtlCiskISBQMiA9IENvbW1hbmQgdG8gbWFrZSBpdAorJCEgUDMgLSBQOCAgV2hhdCBpdCBkZXBlbmRzIG9uCiskCiskIElmIEYkU2VhcmNoKFAxKSAuRXFzLiAiIiBUaGVuIEdvdG8gTWFrZWl0CiskIFRpbWUgPSBGJEN2VGltZShGJEZpbGUoUDEsIlJEVCIpKQorJGFyZz0zCiskTG9vcDoKKyQgICAgICAgQXJndW1lbnQgPSBQJ2FyZworJCAgICAgICBJZiBBcmd1bWVudCAuRXFzLiAiIiBUaGVuIEdvdG8gRXhpdAorJCAgICAgICBFbD0wCiskTG9vcDI6CiskICAgICAgIEZpbGUgPSBGJEVsZW1lbnQoRWwsIiAiLEFyZ3VtZW50KQorJCAgICAgICBJZiBGaWxlIC5FcXMuICIgIiBUaGVuIEdvdG8gRW5kbAorJCAgICAgICBBRmlsZSA9ICIiCiskTG9vcDM6CiskICAgICAgIE9GaWxlID0gQUZpbGUKKyQgICAgICAgQUZpbGUgPSBGJFNlYXJjaChGaWxlKQorJCAgICAgICBJZiBBRmlsZSAuRXFzLiAiIiAuT3IuIEFGaWxlIC5FcXMuIE9GaWxlIFRoZW4gR290byBOZXh0RWwKKyQgICAgICAgSWYgRiRDdlRpbWUoRiRGaWxlKEFGaWxlLCJSRFQiKSkgLkdlcy4gVGltZSBUaGVuIEdvdG8gTWFrZWl0CiskICAgICAgIEdvdG8gTG9vcDMKKyROZXh0RUw6CiskICAgICAgIEVsID0gRWwgKyAxCiskICAgICAgIEdvdG8gTG9vcDIKKyRFbmRMOgorJCBhcmc9YXJnKzEKKyQgSWYgYXJnIC5MZS4gOCBUaGVuIEdvdG8gTG9vcAorJCBHb3RvIEV4aXQKKyQKKyRNYWtlaXQ6CiskIFZWPUYkVkVSSUZZKDApCiskIHdyaXRlIHN5cyRvdXRwdXQgUDIKKyQgJ1AyCiskIFZWPSdGJFZlcmlmeShWVikKKyRFeGl0OgorJCBJZiBWIFRoZW4gU2V0IFZlcmlmeQorJEVORFNVQlJPVVRJTkUKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL01ha2VmaWxlLmluIGIvY29tbW9uL3psaWIvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxNTYyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTc1IEBACisjIE1ha2VmaWxlIGZvciB6bGliCisjIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisKKyMgVG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZToKKyMgICAuL2NvbmZpZ3VyZTsgbWFrZSB0ZXN0CisjIFRoZSBjYWxsIG9mIGNvbmZpZ3VyZSBpcyBvcHRpb25hbCBpZiB5b3UgZG9uJ3QgaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cworIyBJZiB5b3Ugd2lzaCB0byBidWlsZCB6bGliIGFzIGEgc2hhcmVkIGxpYnJhcnksIHVzZTogLi9jb25maWd1cmUgLXMKKworIyBUbyBpbnN0YWxsIC91c3IvbG9jYWwvbGliL2xpYnouKiBhbmQgL3Vzci9sb2NhbC9pbmNsdWRlL3psaWIuaCwgdHlwZToKKyMgICAgbWFrZSBpbnN0YWxsCisjIFRvIGluc3RhbGwgaW4gJEhPTUUgaW5zdGVhZCBvZiAvdXNyL2xvY2FsLCB1c2U6CisjICAgIG1ha2UgaW5zdGFsbCBwcmVmaXg9JEhPTUUKKworQ0M9Y2MKKworQ0ZMQUdTPS1PCisjQ0ZMQUdTPS1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03CisjQ0ZMQUdTPS1nIC1EREVCVUcKKyNDRkxBR1M9LU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKKyMgICAgICAgICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMKKworTERGTEFHUz0tTC4gLWx6CitMRFNIQVJFRD0kKENDKQorQ1BQPSQoQ0MpIC1FCisKK1ZFUj0xLjEuNAorTElCUz1saWJ6LmEKK1NIQVJFRExJQj1saWJ6LnNvCisKK0FSPWFyIHJjCitSQU5MSUI9cmFubGliCitUQVI9dGFyCitTSEVMTD0vYmluL3NoCisKK3ByZWZpeCA9IC91c3IvbG9jYWwKK2V4ZWNfcHJlZml4ID0gJHtwcmVmaXh9CitsaWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKK2luY2x1ZGVkaXIgPSAke3ByZWZpeH0vaW5jbHVkZQorCitPQkpTID0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemlvLm8gdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIFwKKyAgICAgICB6dXRpbC5vIGluZmxhdGUubyBpbmZibG9jay5vIGluZnRyZWVzLm8gaW5mY29kZXMubyBpbmZ1dGlsLm8gaW5mZmFzdC5vCisKK09CSkEgPQorIyB0byB1c2UgdGhlIGFzbSBjb2RlOiBtYWtlIE9CSkE9bWF0Y2gubworCitURVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubworCitESVNURklMRVMgPSBSRUFETUUgRkFRIElOREVYIENoYW5nZUxvZyBjb25maWd1cmUgTWFrZSpbYS16MC05XSAqLltjaF0gKi5tbXMgXAorICBhbGdvcml0aG0udHh0IHpsaWIuMyB6bGliLmh0bWwgXAorICBtc2Rvcy9NYWtlKlthLXowLTldIG1zZG9zL3psaWIuZGVmIG1zZG9zL3psaWIucmMgXAorICBudC9NYWtlKlthLXowLTldIG50L3psaWIuZG50IGFtaWdhL01ha2UqLj8/PyBvczIvTSoub3MyIG9zMi96bGliLmRlZiBcCisgIGNvbnRyaWIvUkUqLmNvbnRyaWIgY29udHJpYi8qLnR4dCBjb250cmliL2FzbTM4Ni8qLmFzbSBjb250cmliL2FzbTM4Ni8qLmMgXAorICBjb250cmliL2FzbTM4Ni8qLmJhdCBjb250cmliL2FzbTM4Ni96bGlidmMuZD8/IGNvbnRyaWIvYXNtWzU2XTg2LyouPzg2IFwKKyAgY29udHJpYi9hc21bNTZdODYvKi5TIGNvbnRyaWIvaW9zdHJlYW0vKi5jcHAgXAorICBjb250cmliL2lvc3RyZWFtLyouaCAgY29udHJpYi9pb3N0cmVhbTIvKi5oIGNvbnRyaWIvaW9zdHJlYW0yLyouY3BwIFwKKyAgY29udHJpYi91bnRnei9NYWtlZmlsZSBjb250cmliL3VudGd6LyouYyBjb250cmliL3VudGd6LyoudzMyIFwKKyAgY29udHJpYi9taW5pemlwL1tDTV0qW3BlXSBjb250cmliL21pbml6aXAvKi5bY2hdIGNvbnRyaWIvbWluaXppcC8qLlt0ZF0/PyBcCisgIGNvbnRyaWIvZGVscGhpKi8qLj8/PworCithbGw6IGV4YW1wbGUgbWluaWd6aXAKKwordGVzdDogYWxsCisJQExEX0xJQlJBUllfUEFUSD0uOiQoTERfTElCUkFSWV9QQVRIKSA7IGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg7IFwKKwllY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcCB8IC4vbWluaWd6aXAgLWQgfHwgXAorCSAgZWNobyAnCQkqKiogbWluaWd6aXAgdGVzdCBGQUlMRUQgKioqJyA7IFwKKwlpZiAuL2V4YW1wbGU7IHRoZW4gXAorCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IE9LICoqKic7IFwKKwllbHNlIFwKKwkgIGVjaG8gJwkJKioqIHpsaWIgdGVzdCBGQUlMRUQgKioqJzsgXAorCWZpCisKK2xpYnouYTogJChPQkpTKSAkKE9CSkEpCisJJChBUikgJEAgJChPQkpTKSAkKE9CSkEpCisJLUAgKCQoUkFOTElCKSAkQCB8fCB0cnVlKSA+L2Rldi9udWxsIDI+JjEKKworbWF0Y2gubzogbWF0Y2guUworCSQoQ1BQKSBtYXRjaC5TID4gX21hdGNoLnMKKwkkKENDKSAtYyBfbWF0Y2gucworCW12IF9tYXRjaC5vIG1hdGNoLm8KKwlybSAtZiBfbWF0Y2gucworCiskKFNIQVJFRExJQikuJChWRVIpOiAkKE9CSlMpCisJJChMRFNIQVJFRCkgLW8gJEAgJChPQkpTKQorCXJtIC1mICQoU0hBUkVETElCKSAkKFNIQVJFRExJQikuMQorCWxuIC1zICRAICQoU0hBUkVETElCKQorCWxuIC1zICRAICQoU0hBUkVETElCKS4xCisKK2V4YW1wbGU6IGV4YW1wbGUubyAkKExJQlMpCisJJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKExERkxBR1MpCisKK21pbmlnemlwOiBtaW5pZ3ppcC5vICQoTElCUykKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgbWluaWd6aXAubyAkKExERkxBR1MpCisKK2luc3RhbGw6ICQoTElCUykKKwktQGlmIFsgISAtZCAkKGluY2x1ZGVkaXIpICBdOyB0aGVuIG1rZGlyICQoaW5jbHVkZWRpcik7IGZpCisJLUBpZiBbICEgLWQgJChsaWJkaXIpIF07IHRoZW4gbWtkaXIgJChsaWJkaXIpOyBmaQorCWNwIHpsaWIuaCB6Y29uZi5oICQoaW5jbHVkZWRpcikKKwljaG1vZCA2NDQgJChpbmNsdWRlZGlyKS96bGliLmggJChpbmNsdWRlZGlyKS96Y29uZi5oCisJY3AgJChMSUJTKSAkKGxpYmRpcikKKwljZCAkKGxpYmRpcik7IGNobW9kIDc1NSAkKExJQlMpCisJLUAoY2QgJChsaWJkaXIpOyAkKFJBTkxJQikgbGliei5hIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQorCWNkICQobGliZGlyKTsgaWYgdGVzdCAtZiAkKFNIQVJFRExJQikuJChWRVIpOyB0aGVuIFwKKwkgIHJtIC1mICQoU0hBUkVETElCKSAkKFNIQVJFRExJQikuMTsgXAorCSAgbG4gLXMgJChTSEFSRURMSUIpLiQoVkVSKSAkKFNIQVJFRExJQik7IFwKKwkgIGxuIC1zICQoU0hBUkVETElCKS4kKFZFUikgJChTSEFSRURMSUIpLjE7IFwKKwkgIChsZGNvbmZpZyB8fCB0cnVlKSAgPi9kZXYvbnVsbCAyPiYxOyBcCisJZmkKKyMgVGhlIHJhbmxpYiBpbiBpbnN0YWxsIGlzIG5lZWRlZCBvbiBOZVhUU1RFUCB3aGljaCBjaGVja3MgZmlsZSB0aW1lcworIyBsZGNvbmZpZyBpcyBmb3IgTGludXgKKwordW5pbnN0YWxsOgorCWNkICQoaW5jbHVkZWRpcik7IFwKKwl2PSQoVkVSKTsgXAorCWlmIHRlc3QgLWYgemxpYi5oOyB0aGVuIFwKKwkgIHY9YHNlZCAtbiAnL1ZFUlNJT04gIi9zLy4qIlwoLipcKSIuKi9cMS9wJyA8IHpsaWIuaGA7IFwKKyAgICAgICAgICBybSAtZiB6bGliLmggemNvbmYuaDsgXAorCWZpOyBcCisJY2QgJChsaWJkaXIpOyBybSAtZiBsaWJ6LmE7IFwKKwlpZiB0ZXN0IC1mICQoU0hBUkVETElCKS4kJHY7IHRoZW4gXAorCSAgcm0gLWYgJChTSEFSRURMSUIpLiQkdiAkKFNIQVJFRExJQikgJChTSEFSRURMSUIpLjE7IFwKKwlmaQorCitjbGVhbjoKKwlybSAtZiAqLm8gKn4gZXhhbXBsZSBtaW5pZ3ppcCBsaWJ6LmEgbGliei5zbyogZm9vLmd6IHNvX2xvY2F0aW9ucyBcCisJICAgX21hdGNoLnMgbWFrZXRyZWUKKworZGlzdGNsZWFuOgljbGVhbgorCit6aXA6CisJbXYgTWFrZWZpbGUgTWFrZWZpbGV+OyBjcCAtcCBNYWtlZmlsZS5pbiBNYWtlZmlsZQorCXJtIC1mIHRlc3QuYyB6dGVzdCouYyBjb250cmliL21pbml6aXAvdGVzdC56aXAKKwl2PWBzZWQgLW4gLWUgJ3MvXC4vL2cnIC1lICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIDwgemxpYi5oYDtcCisJemlwIC11bDkgemxpYiQkdiAkKERJU1RGSUxFUykKKwltdiBNYWtlZmlsZX4gTWFrZWZpbGUKKworZGlzdDoKKwltdiBNYWtlZmlsZSBNYWtlZmlsZX47IGNwIC1wIE1ha2VmaWxlLmluIE1ha2VmaWxlCisJcm0gLWYgdGVzdC5jIHp0ZXN0Ki5jIGNvbnRyaWIvbWluaXppcC90ZXN0LnppcAorCWQ9emxpYi1gc2VkIC1uICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIDwgemxpYi5oYDtcCisJcm0gLWYgJCRkLnRhci5nejsgXAorCWlmIHRlc3QgISAtZCAuLi8kJGQ7IHRoZW4gcm0gLWYgLi4vJCRkOyBsbiAtcyBgcHdkYCAuLi8kJGQ7IGZpOyBcCisJZmlsZXM9IiI7IFwKKwlmb3IgZiBpbiAkKERJU1RGSUxFUyk7IGRvIGZpbGVzPSIkJGZpbGVzICQkZC8kJGYiOyBkb25lOyBcCisJY2QgLi47IFwKKwlHWklQPS05ICQoVEFSKSBjaG9meiAkJGQvJCRkLnRhci5neiAkJGZpbGVzOyBcCisJaWYgdGVzdCAhIC1kICQkZDsgdGhlbiBybSAtZiAkJGQ7IGZpCisJbXYgTWFrZWZpbGV+IE1ha2VmaWxlCisKK3RhZ3M6CQorCWV0YWdzICouW2NoXQorCitkZXBlbmQ6CisJbWFrZWRlcGVuZCAtLSAkKENGTEFHUykgLS0gKi5bY2hdCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KKworYWRsZXIzMi5vOiB6bGliLmggemNvbmYuaAorY29tcHJlc3MubzogemxpYi5oIHpjb25mLmgKK2NyYzMyLm86IHpsaWIuaCB6Y29uZi5oCitkZWZsYXRlLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitleGFtcGxlLm86IHpsaWIuaCB6Y29uZi5oCitnemlvLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2luZmJsb2NrLm86IGluZmJsb2NrLmggaW5mdHJlZXMuaCBpbmZjb2Rlcy5oIGluZnV0aWwuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitpbmZjb2Rlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitpbmZjb2Rlcy5vOiBpbmZ0cmVlcy5oIGluZmJsb2NrLmggaW5mY29kZXMuaCBpbmZ1dGlsLmggaW5mZmFzdC5oCitpbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAoraW5mZmFzdC5vOiBpbmZibG9jay5oIGluZmNvZGVzLmggaW5mdXRpbC5oIGluZmZhc3QuaAoraW5mbGF0ZS5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmgKK2luZnRyZWVzLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAoraW5mdXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmggaW5mdHJlZXMuaCBpbmZjb2Rlcy5oIGluZnV0aWwuaAorbWluaWd6aXAubzogIHpsaWIuaCB6Y29uZi5oIAordHJlZXMubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmggdHJlZXMuaAordW5jb21wci5vOiB6bGliLmggemNvbmYuaAorenV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaCAgCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9NYWtlZmlsZS5yaXNjb3MgYi9jb21tb24vemxpYi9NYWtlZmlsZS5yaXNjb3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3ZjQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL01ha2VmaWxlLnJpc2NvcwpAQCAtMCwwICsxLDE1MSBAQAorIyBQcm9qZWN0OiAgIHpsaWJfMV8wMworIyBQYXRjaGVkIGZvciB6bGliIDEuMS4yIHJ3QHNoYWRvdy5vcmcudWsgMTk5ODA0MzAKKyMgdGVzdCB3b3JrcyBvdXQtb2YtdGhlLWJveCwgaW5zdGFsbHMgYHNvbWV3aGVyZScgb24gZGVtYW5kCisKKyMgVG9vbGZsYWdzOgorQ0NmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC1nIC10aHJvd2JhY2sgIC1EUklTQ09TICAtZmFoIAorQysrZmxhZ3MgPSAtYyAtZGVwZW5kICFEZXBlbmQgLUlDOiAtdGhyb3diYWNrCitMaW5rZmxhZ3MgPSAtYWlmIC1jKysgLW8gJEAgCitPYmpBc21mbGFncyA9IC10aHJvd2JhY2sgLU5vQ2FjaGUgLWRlcGVuZCAhRGVwZW5kCitDTUhHZmxhZ3MgPSAKK0xpYkZpbGVmbGFncyA9IC1jIC1sIC1vICRAIAorU3F1ZWV6ZWZsYWdzID0gLW8gJEAKKworIyBjaGFuZ2UgdGhlIGxpbmUgYmVsb3cgdG8gd2hlcmUgX3lvdV8gd2FudCB0aGUgbGlicmFyeSBpbnN0YWxsZWQuCitsaWJkZXN0ID0gbGliOnpsaWIKKworIyBGaW5hbCB0YXJnZXRzOgorQC5saWI6ICAgQC5vLmFkbGVyMzIgQC5vLmNvbXByZXNzIEAuby5jcmMzMiBALm8uZGVmbGF0ZSBALm8uZ3ppbyBcCisgICAgICAgIEAuby5pbmZibG9jayBALm8uaW5mY29kZXMgQC5vLmluZmZhc3QgQC5vLmluZmxhdGUgQC5vLmluZnRyZWVzIEAuby5pbmZ1dGlsIEAuby50cmVlcyBcCisgICAgICAgIEAuby51bmNvbXByIEAuby56dXRpbCAKKyAgICAgICAgTGliRmlsZSAkKExpYkZpbGVmbGFncykgQC5vLmFkbGVyMzIgQC5vLmNvbXByZXNzIEAuby5jcmMzMiBALm8uZGVmbGF0ZSBcCisgICAgICAgIEAuby5nemlvIEAuby5pbmZibG9jayBALm8uaW5mY29kZXMgQC5vLmluZmZhc3QgQC5vLmluZmxhdGUgQC5vLmluZnRyZWVzIEAuby5pbmZ1dGlsIFwKKyAgICAgICAgQC5vLnRyZWVzIEAuby51bmNvbXByIEAuby56dXRpbCAKK3Rlc3Q6ICAgQC5taW5pZ3ppcCBALmV4YW1wbGUgQC5saWIKKwlAY29weSBALmxpYiBALmxpYmMgIEF+Q35ERn5Mfk5+UH5RflJTflRWCisJQGVjaG8gcnVubmluZyB0ZXN0czogaGFuZyBvbi4KKwlAL0AubWluaWd6aXAgLWYgLTkgbGliYworCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6CisJQC9ALm1pbmlnemlwIC1mIC0xIGxpYmMKKwlAL0AubWluaWd6aXAgLWQgbGliYy1negorCUAvQC5taW5pZ3ppcCAtaCAtOSBsaWJjCisJQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKKwlAL0AubWluaWd6aXAgLWggLTEgbGliYworCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6CisJQC9ALm1pbmlnemlwIC05IGxpYmMKKwlAL0AubWluaWd6aXAgLWQgbGliYy1negorCUAvQC5taW5pZ3ppcCAtMSBsaWJjCisJQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKKwlAZGlmZiBALmxpYiBALmxpYmMKKwlAZWNobyB0aGF0IHNob3VsZCBoYXZlIHJlcG9ydGVkICdALmxpYiBhbmQgQC5saWJjIGlkZW50aWNhbCcgaWYgeW91IGhhdmUgZGlmZi4KKwlAL0AuZXhhbXBsZSBALmZyZWQgQC5mcmVkCisJQGVjaG8gdGhhdCB3aWxsIGhhdmUgZ2l2ZW4gbG90cyBvZiBoZWxsbyEncy4KKworQC5taW5pZ3ppcDogICBALm8ubWluaWd6aXAgQC5saWIgQzpvLlN0dWJzIAorICAgICAgICBMaW5rICQoTGlua2ZsYWdzKSBALm8ubWluaWd6aXAgQC5saWIgQzpvLlN0dWJzIAorQC5leGFtcGxlOiAgIEAuby5leGFtcGxlIEAubGliIEM6by5TdHVicyAKKyAgICAgICAgTGluayAkKExpbmtmbGFncykgQC5vLmV4YW1wbGUgQC5saWIgQzpvLlN0dWJzCisKK2luc3RhbGw6IEAubGliCisJY2RpciAkKGxpYmRlc3QpCisJY2RpciAkKGxpYmRlc3QpLmgKKwlAY29weSBALmguemxpYiAkKGxpYmRlc3QpLmguemxpYiBBfkN+REZ+TH5OflB+UX5SU35UVgorCUBjb3B5IEAuaC56Y29uZiAkKGxpYmRlc3QpLmguemNvbmYgQX5DfkRGfkx+Tn5QflF+UlN+VFYKKwlAY29weSBALmxpYiAkKGxpYmRlc3QpLmxpYiAgQX5DfkRGfkx+Tn5QflF+UlN+VFYKKwlAZWNobyBva2F5LCBpbnN0YWxsZWQgemxpYiBpbiAkKGxpYmRlc3QpCisKK2NsZWFuOjsgcmVtb3ZlIEAubWluaWd6aXAKKwlyZW1vdmUgQC5leGFtcGxlCisJcmVtb3ZlIEAubGliYworCS13aXBlIEAuby4qIEZ+cn5jVgorCXJlbW92ZSBALmZyZWQKKworIyBVc2VyLWVkaXRhYmxlIGRlcGVuZGVuY2llczoKKy5jLm86CisgICAgICAgIGNjICQoY2NmbGFncykgLW8gJEAgJDwKKworIyBTdGF0aWMgZGVwZW5kZW5jaWVzOgorCisjIER5bmFtaWMgZGVwZW5kZW5jaWVzOgorby5leGFtcGxlOgljLmV4YW1wbGUKK28uZXhhbXBsZToJaC56bGliCitvLmV4YW1wbGU6CWguemNvbmYKK28ubWluaWd6aXA6CWMubWluaWd6aXAKK28ubWluaWd6aXA6CWguemxpYgorby5taW5pZ3ppcDoJaC56Y29uZgorby5hZGxlcjMyOgljLmFkbGVyMzIKK28uYWRsZXIzMjoJaC56bGliCitvLmFkbGVyMzI6CWguemNvbmYKK28uY29tcHJlc3M6CWMuY29tcHJlc3MKK28uY29tcHJlc3M6CWguemxpYgorby5jb21wcmVzczoJaC56Y29uZgorby5jcmMzMjoJYy5jcmMzMgorby5jcmMzMjoJaC56bGliCitvLmNyYzMyOgloLnpjb25mCitvLmRlZmxhdGU6CWMuZGVmbGF0ZQorby5kZWZsYXRlOgloLmRlZmxhdGUKK28uZGVmbGF0ZToJaC56dXRpbAorby5kZWZsYXRlOgloLnpsaWIKK28uZGVmbGF0ZToJaC56Y29uZgorby5nemlvOgljLmd6aW8KK28uZ3ppbzoJaC56dXRpbAorby5nemlvOgloLnpsaWIKK28uZ3ppbzoJaC56Y29uZgorby5pbmZibG9jazoJYy5pbmZibG9jaworby5pbmZibG9jazoJaC56dXRpbAorby5pbmZibG9jazoJaC56bGliCitvLmluZmJsb2NrOgloLnpjb25mCitvLmluZmJsb2NrOgloLmluZmJsb2NrCitvLmluZmJsb2NrOgloLmluZnRyZWVzCitvLmluZmJsb2NrOgloLmluZmNvZGVzCitvLmluZmJsb2NrOgloLmluZnV0aWwKK28uaW5mY29kZXM6CWMuaW5mY29kZXMKK28uaW5mY29kZXM6CWguenV0aWwKK28uaW5mY29kZXM6CWguemxpYgorby5pbmZjb2RlczoJaC56Y29uZgorby5pbmZjb2RlczoJaC5pbmZ0cmVlcworby5pbmZjb2RlczoJaC5pbmZibG9jaworby5pbmZjb2RlczoJaC5pbmZjb2Rlcworby5pbmZjb2RlczoJaC5pbmZ1dGlsCitvLmluZmNvZGVzOgloLmluZmZhc3QKK28uaW5mZmFzdDoJYy5pbmZmYXN0CitvLmluZmZhc3Q6CWguenV0aWwKK28uaW5mZmFzdDoJaC56bGliCitvLmluZmZhc3Q6CWguemNvbmYKK28uaW5mZmFzdDoJaC5pbmZ0cmVlcworby5pbmZmYXN0OgloLmluZmJsb2NrCitvLmluZmZhc3Q6CWguaW5mY29kZXMKK28uaW5mZmFzdDoJaC5pbmZ1dGlsCitvLmluZmZhc3Q6CWguaW5mZmFzdAorby5pbmZsYXRlOgljLmluZmxhdGUKK28uaW5mbGF0ZToJaC56dXRpbAorby5pbmZsYXRlOgloLnpsaWIKK28uaW5mbGF0ZToJaC56Y29uZgorby5pbmZsYXRlOgloLmluZmJsb2NrCitvLmluZnRyZWVzOgljLmluZnRyZWVzCitvLmluZnRyZWVzOgloLnp1dGlsCitvLmluZnRyZWVzOgloLnpsaWIKK28uaW5mdHJlZXM6CWguemNvbmYKK28uaW5mdHJlZXM6CWguaW5mdHJlZXMKK28uaW5mdHJlZXM6CWguaW5mZml4ZWQKK28uaW5mdXRpbDoJYy5pbmZ1dGlsCitvLmluZnV0aWw6CWguenV0aWwKK28uaW5mdXRpbDoJaC56bGliCitvLmluZnV0aWw6CWguemNvbmYKK28uaW5mdXRpbDoJaC5pbmZibG9jaworby5pbmZ1dGlsOgloLmluZnRyZWVzCitvLmluZnV0aWw6CWguaW5mY29kZXMKK28uaW5mdXRpbDoJaC5pbmZ1dGlsCitvLnRyZWVzOgljLnRyZWVzCitvLnRyZWVzOgloLmRlZmxhdGUKK28udHJlZXM6CWguenV0aWwKK28udHJlZXM6CWguemxpYgorby50cmVlczoJaC56Y29uZgorby50cmVlczoJaC50cmVlcworby51bmNvbXByOgljLnVuY29tcHIKK28udW5jb21wcjoJaC56bGliCitvLnVuY29tcHI6CWguemNvbmYKK28uenV0aWw6CWMuenV0aWwKK28uenV0aWw6CWguenV0aWwKK28uenV0aWw6CWguemxpYgorby56dXRpbDoJaC56Y29uZgpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvUkVBRE1FIGIvY29tbW9uL3psaWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDY3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9SRUFETUUKQEAgLTAsMCArMSwxNDcgQEAKK3psaWIgMS4xLjQgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgQWxsIHRoZSBjb2RlCitpcyB0aHJlYWQgc2FmZS4gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkKK2lzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyAKK2h0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0ICh6bGliIGZvcm1hdCksIHJmYzE5NTEudHh0IChkZWZsYXRlCitmb3JtYXQpIGFuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLiBUaGVzZSBkb2N1bWVudHMgYXJlIGFsc28gYXZhaWxhYmxlIGluCitvdGhlciBmb3JtYXRzIGZyb20gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sCisKK0FsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgemxpYi5oCisodm9sdW50ZWVyIHRvIHdyaXRlIG1hbiBwYWdlcyB3ZWxjb21lLCBjb250YWN0IGpsb3VwQGd6aXAub3JnKS4gQSB1c2FnZQorZXhhbXBsZSBvZiB0aGUgbGlicmFyeSBpcyBnaXZlbiBpbiB0aGUgZmlsZSBleGFtcGxlLmMgd2hpY2ggYWxzbyB0ZXN0cyB0aGF0Cit0aGUgbGlicmFyeSBpcyB3b3JraW5nIGNvcnJlY3RseS4gQW5vdGhlciBleGFtcGxlIGlzIGdpdmVuIGluIHRoZSBmaWxlCittaW5pZ3ppcC5jLiBUaGUgY29tcHJlc3Npb24gbGlicmFyeSBpdHNlbGYgaXMgY29tcG9zZWQgb2YgYWxsIHNvdXJjZSBmaWxlcworZXhjZXB0IGV4YW1wbGUuYyBhbmQgbWluaWd6aXAuYy4KKworVG8gY29tcGlsZSBhbGwgZmlsZXMgYW5kIHJ1biB0aGUgdGVzdCBwcm9ncmFtLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucworZ2l2ZW4gYXQgdGhlIHRvcCBvZiBNYWtlZmlsZS4gSW4gc2hvcnQgIm1ha2UgdGVzdDsgbWFrZSBpbnN0YWxsIgorc2hvdWxkIHdvcmsgZm9yIG1vc3QgbWFjaGluZXMuIEZvciBVbml4OiAiLi9jb25maWd1cmU7IG1ha2UgdGVzdDsgbWFrZSBpbnN0YWxsIgorRm9yIE1TRE9TLCB1c2Ugb25lIG9mIHRoZSBzcGVjaWFsIG1ha2VmaWxlcyBzdWNoIGFzIE1ha2VmaWxlLm1zYy4KK0ZvciBWTVMsIHVzZSBNYWtlX3Ztcy5jb20gb3IgZGVzY3JpcC5tbXMuCisKK1F1ZXN0aW9ucyBhYm91dCB6bGliIHNob3VsZCBiZSBzZW50IHRvIDx6bGliQGd6aXAub3JnPiwgb3IgdG8KK0dpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4gZm9yIHRoZSBXaW5kb3dzIERMTCB2ZXJzaW9uLgorVGhlIHpsaWIgaG9tZSBwYWdlIGlzIGh0dHA6Ly93d3cuemxpYi5vcmcgb3IgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLworQmVmb3JlIHJlcG9ydGluZyBhIHByb2JsZW0sIHBsZWFzZSBjaGVjayB0aGlzIHNpdGUgdG8gdmVyaWZ5IHRoYXQKK3lvdSBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliOyBvdGhlcndpc2UgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQKK2NoZWNrIHdoZXRoZXIgdGhlIHByb2JsZW0gc3RpbGwgZXhpc3RzIG9yIG5vdC4KKworUExFQVNFIHJlYWQgdGhlIHpsaWIgRkFRIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCitiZWZvcmUgYXNraW5nIGZvciBoZWxwLgorCitNYXJrIE5lbHNvbiA8bWFya25AaWVlZS5vcmc+IHdyb3RlIGFuIGFydGljbGUgYWJvdXQgemxpYiBmb3IgdGhlIEphbi4gMTk5NworaXNzdWUgb2YgIERyLiBEb2JiJ3MgSm91cm5hbDsgYSBjb3B5IG9mIHRoZSBhcnRpY2xlIGlzIGF2YWlsYWJsZSBpbgoraHR0cDovL2RvZ21hLm5ldC9tYXJrbi9hcnRpY2xlcy96bGlidG9vbC96bGlidG9vbC5odG0KKworVGhlIGNoYW5nZXMgbWFkZSBpbiB2ZXJzaW9uIDEuMS40IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIENoYW5nZUxvZy4KK1RoZSBvbmx5IGNoYW5nZXMgbWFkZSBzaW5jZSAxLjEuMyBhcmUgYnVnIGNvcnJlY3Rpb25zOgorCistIFpGUkVFIHdhcyByZXBlYXRlZCBvbiBzYW1lIGFsbG9jYXRpb24gb24gc29tZSBlcnJvciBjb25kaXRpb25zLgorICBUaGlzIGNyZWF0ZXMgYSBzZWN1cml0eSBwcm9ibGVtIGRlc2NyaWJlZCBpbgorICBodHRwOi8vd3d3LnpsaWIub3JnL2Fkdmlzb3J5LTIwMDItMDMtMTEudHh0CistIFJldHVybmVkIGluY29ycmVjdCBlcnJvciAoWl9NRU1fRVJST1IpIG9uIHNvbWUgaW52YWxpZCBkYXRhCistIEF2b2lkIGFjY2Vzc2VzIGJlZm9yZSB3aW5kb3cgZm9yIGludmFsaWQgZGlzdGFuY2VzIHdpdGggaW5mbGF0ZSB3aW5kb3cKKyAgbGVzcyB0aGFuIDMySy4KKy0gZm9yY2Ugd2luZG93Qml0cyA+IDggdG8gYXZvaWQgYSBidWcgaW4gdGhlIGVuY29kZXIgZm9yIGEgd2luZG93IHNpemUKKyAgb2YgMjU2IGJ5dGVzLiAoQSBjb21wbGV0ZSBmaXggd2lsbCBiZSBhdmFpbGFibGUgaW4gMS4xLjUpLgorCitUaGUgYmV0YSB2ZXJzaW9uIDEuMS41YmV0YSBpbmNsdWRlcyBtYW55IG1vcmUgY2hhbmdlcy4gQSBuZXcgb2ZmaWNpYWwKK3ZlcnNpb24gMS4xLjUgd2lsbCBiZSByZWxlYXNlZCBhcyBzb29uIGFzIGV4dGVuc2l2ZSB0ZXN0aW5nIGhhcyBiZWVuCitjb21wbGV0ZWQgb24gaXQuCisKKworVW5zdXBwb3J0ZWQgdGhpcmQgcGFydHkgY29udHJpYnV0aW9ucyBhcmUgcHJvdmlkZWQgaW4gZGlyZWN0b3J5ICJjb250cmliIi4KKworQSBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHpsaWIgaXMgYXZhaWxhYmxlIGluIHRoZSBKYXZhIERldmVsb3BtZW50IEtpdAoraHR0cDovL3d3dy5qYXZhc29mdC5jb20vcHJvZHVjdHMvSkRLLzEuMS9kb2NzL2FwaS9QYWNrYWdlLWphdmEudXRpbC56aXAuaHRtbAorU2VlIHRoZSB6bGliIGhvbWUgcGFnZSBodHRwOi8vd3d3LnpsaWIub3JnIGZvciBkZXRhaWxzLgorCitBIFBlcmwgaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBQYXVsIE1hcnF1ZXNzIDxwbWFycXVlc3NAYmZzZWMuYnQuY28udWs+CitpcyBpbiB0aGUgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMKK2h0dHA6Ly93d3cuY3Bhbi5vcmcvbW9kdWxlcy9ieS1tb2R1bGUvQ29tcHJlc3MvCisKK0EgUHl0aG9uIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgQS5NLiBLdWNobGluZyA8YW1rQG1hZ25ldC5jb20+CitpcyBhdmFpbGFibGUgaW4gUHl0aG9uIDEuNSBhbmQgbGF0ZXIgdmVyc2lvbnMsIHNlZQoraHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9saWIvbW9kdWxlLXpsaWIuaHRtbAorCitBIHpsaWIgYmluZGluZyBmb3IgVENMIHdyaXR0ZW4gYnkgQW5kcmVhcyBLdXByaWVzIDxhLmt1cHJpZXNAd2VzdGVuZC5jb20+CitpcyBhdmFpbGxhYmxlIGF0IGh0dHA6Ly93d3cud2VzdGVuZC5jb20vfmt1cHJpZXMvZG9jL3RyZi9tYW4vbWFuLmh0bWwKKworQW4gZXhwZXJpbWVudGFsIHBhY2thZ2UgdG8gcmVhZCBhbmQgd3JpdGUgZmlsZXMgaW4gLnppcCBmb3JtYXQsCit3cml0dGVuIG9uIHRvcCBvZiB6bGliIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4sIGlzCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC91bnppcC5odG1sCithbmQgYWxzbyBpbiB0aGUgY29udHJpYi9taW5pemlwIGRpcmVjdG9yeSBvZiB6bGliLgorCisKK05vdGVzIGZvciBzb21lIHRhcmdldHM6CisKKy0gVG8gYnVpbGQgYSBXaW5kb3dzIERMTCB2ZXJzaW9uLCBpbmNsdWRlIGluIGEgRExMIHByb2plY3QgemxpYi5kZWYsIHpsaWIucmMKKyAgYW5kIGFsbCAuYyBmaWxlcyBleGNlcHQgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jOyBjb21waWxlIHdpdGggLURaTElCX0RMTAorICBUaGUgemxpYiBETEwgc3VwcG9ydCB3YXMgaW5pdGlhbGx5IGRvbmUgYnkgQWxlc3NhbmRybyBJYWNvcGV0dGkgYW5kIGlzCisgIG5vdyBtYWludGFpbmVkIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4uIENoZWNrIHRoZSB6bGliIERMTAorICBob21lIHBhZ2UgYXQgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbAorCisgIEZyb20gVmlzdWFsIEJhc2ljLCB5b3UgY2FuIGNhbGwgdGhlIERMTCBmdW5jdGlvbnMgd2hpY2ggZG8gbm90IHRha2UKKyAgYSBzdHJ1Y3R1cmUgYXMgYXJndW1lbnQ6IGNvbXByZXNzLCB1bmNvbXByZXNzIGFuZCBhbGwgZ3oqIGZ1bmN0aW9ucy4KKyAgU2VlIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgb3IgZ2V0CisgIGh0dHA6Ly93d3cudGNmYi5jb20vZG93c2V3YXJlL2NtcC16LWl0LnppcAorCistIEZvciA2NC1iaXQgSXJpeCwgZGVmbGF0ZS5jIG11c3QgYmUgY29tcGlsZWQgd2l0aG91dCBhbnkgb3B0aW1pemF0aW9uLgorICBXaXRoIC1PLCBvbmUgbGlicG5nIHRlc3QgZmFpbHMuIFRoZSB0ZXN0IHdvcmtzIGluIDMyIGJpdCBtb2RlICh3aXRoCisgIHRoZSAtbjMyIGNvbXBpbGVyIGZsYWcpLiBUaGUgY29tcGlsZXIgYnVnIGhhcyBiZWVuIHJlcG9ydGVkIHRvIFNHSS4KKworLSB6bGliIGRvZXNuJ3Qgd29yayB3aXRoIGdjYyAyLjYuMyBvbiBhIERFQyAzMDAwLzMwMExYIHVuZGVyIE9TRi8xIDIuMSAgIAorICBpdCB3b3JrcyB3aGVuIGNvbXBpbGVkIHdpdGggY2MuCisKKy0gb24gRGlnaXRhbCBVbml4IDQuMEQgKGZvcm1lbHkgT1NGLzEpIG9uIEFscGhhU2VydmVyLCB0aGUgY2Mgb3B0aW9uIC1zdGQxCisgIGlzIG5lY2Vzc2FyeSB0byBnZXQgZ3pwcmludGYgd29ya2luZyBjb3JyZWN0bHkuIFRoaXMgaXMgZG9uZSBieSBjb25maWd1cmUuCisKKy0gemxpYiBkb2Vzbid0IHdvcmsgb24gSFAtVVggOS4wNSB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgL2Jpbi9jYy4gSXQgd29ya3MKKyAgd2l0aCBvdGhlciBjb21waWxlcnMuIFVzZSAibWFrZSB0ZXN0IiB0byBjaGVjayB5b3VyIGNvbXBpbGVyLgorCistIGd6ZG9wZW4gaXMgbm90IHN1cHBvcnRlZCBvbiBSSVNDT1MsIEJFT1MgYW5kIGJ5IHNvbWUgTWFjIGNvbXBpbGVycy4KKworLSBGb3IgVHVyYm8gQyB0aGUgc21hbGwgbW9kZWwgaXMgc3VwcG9ydGVkIG9ubHkgd2l0aCByZWR1Y2VkIHBlcmZvcm1hbmNlIHRvCisgIGF2b2lkIGFueSBmYXIgYWxsb2NhdGlvbjsgaXQgd2FzIHRlc3RlZCB3aXRoIC1ETUFYX1dCSVRTPTExIC1ETUFYX01FTV9MRVZFTD0zCisKKy0gRm9yIFBhbG1Pcywgc2VlIGh0dHA6Ly93d3cuY3MudWl0Lm5vL35wZXJtL1BBU1RBL3BpbG90L3NvZnR3YXJlLmh0bWwKKyAgUGVyIEhhcmFsZCBNeXJ2YW5nIDxwZXJtQHN0dWQuY3MudWl0Lm5vPgorCisKK0Fja25vd2xlZGdtZW50czoKKworICBUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieSB6bGliIHdhcyBkZWZpbmVkIGJ5IFBoaWwgS2F0ei4gVGhlIGRlZmxhdGUKKyAgYW5kIHpsaWIgc3BlY2lmaWNhdGlvbnMgd2VyZSB3cml0dGVuIGJ5IEwuIFBldGVyIERldXRzY2guIFRoYW5rcyB0byBhbGwgdGhlCisgIHBlb3BsZSB3aG8gcmVwb3J0ZWQgcHJvYmxlbXMgYW5kIHN1Z2dlc3RlZCB2YXJpb3VzIGltcHJvdmVtZW50cyBpbiB6bGliOworICB0aGV5IGFyZSB0b28gbnVtZXJvdXMgdG8gY2l0ZSBoZXJlLgorCitDb3B5cmlnaHQgbm90aWNlOgorCisgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKKyAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCitJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCB3ZSB3b3VsZCBhcHByZWNpYXRlICpub3QqCityZWNlaXZpbmcgbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgdG8gc2lnbi4gVGhlIHNvdXJjZXMgYXJlIHByb3ZpZGVkCitmb3IgZnJlZSBidXQgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZC4gIFRoZSBsaWJyYXJ5IGhhcyBiZWVuCitlbnRpcmVseSB3cml0dGVuIGJ5IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXI7IGl0IGRvZXMgbm90CitpbmNsdWRlIHRoaXJkLXBhcnR5IGNvZGUuCisKK0lmIHlvdSByZWRpc3RyaWJ1dGUgbW9kaWZpZWQgc291cmNlcywgd2Ugd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBpbmNsdWRlCitpbiB0aGUgZmlsZSBDaGFuZ2VMb2cgaGlzdG9yeSBpbmZvcm1hdGlvbiBkb2N1bWVudGluZyB5b3VyIGNoYW5nZXMuCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9hZGxlcjMyLmMgYi9jb21tb24vemxpYi9hZGxlcjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4YTNmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2FkbGVyMzIuYwpAQCAtMCwwICsxLDQ4IEBACisvKiBhZGxlcjMyLmMgLS0gY29tcHV0ZSB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YgYSBkYXRhIHN0cmVhbQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBAKCMpICRJZDogYWRsZXIzMi5jLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjEgY29uc3RfayBFeHAgJCAqLworCisjaW5jbHVkZSAiemxpYi5oIgorCisjZGVmaW5lIEJBU0UgNjU1MjFMIC8qIGxhcmdlc3QgcHJpbWUgc21hbGxlciB0aGFuIDY1NTM2ICovCisjZGVmaW5lIE5NQVggNTU1MgorLyogTk1BWCBpcyB0aGUgbGFyZ2VzdCBuIHN1Y2ggdGhhdCAyNTVuKG4rMSkvMiArIChuKzEpKEJBU0UtMSkgPD0gMl4zMi0xICovCisKKyNkZWZpbmUgRE8xKGJ1ZixpKSAge3MxICs9IGJ1ZltpXTsgczIgKz0gczE7fQorI2RlZmluZSBETzIoYnVmLGkpICBETzEoYnVmLGkpOyBETzEoYnVmLGkrMSk7CisjZGVmaW5lIERPNChidWYsaSkgIERPMihidWYsaSk7IERPMihidWYsaSsyKTsKKyNkZWZpbmUgRE84KGJ1ZixpKSAgRE80KGJ1ZixpKTsgRE80KGJ1ZixpKzQpOworI2RlZmluZSBETzE2KGJ1ZikgICBETzgoYnVmLDApOyBETzgoYnVmLDgpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1TG9uZyBaRVhQT1JUIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuKQorICAgIHVMb25nIGFkbGVyOworICAgIGNvbnN0IEJ5dGVmICpidWY7CisgICAgdUludCBsZW47Cit7CisgICAgdW5zaWduZWQgbG9uZyBzMSA9IGFkbGVyICYgMHhmZmZmOworICAgIHVuc2lnbmVkIGxvbmcgczIgPSAoYWRsZXIgPj4gMTYpICYgMHhmZmZmOworICAgIGludCBrOworCisgICAgaWYgKGJ1ZiA9PSBaX05VTEwpIHJldHVybiAxTDsKKworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIGsgPSBsZW4gPCBOTUFYID8gbGVuIDogTk1BWDsKKyAgICAgICAgbGVuIC09IGs7CisgICAgICAgIHdoaWxlIChrID49IDE2KSB7CisgICAgICAgICAgICBETzE2KGJ1Zik7CisJICAgIGJ1ZiArPSAxNjsKKyAgICAgICAgICAgIGsgLT0gMTY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGsgIT0gMCkgZG8geworICAgICAgICAgICAgczEgKz0gKmJ1ZisrOworCSAgICBzMiArPSBzMTsKKyAgICAgICAgfSB3aGlsZSAoLS1rKTsKKyAgICAgICAgczEgJT0gQkFTRTsKKyAgICAgICAgczIgJT0gQkFTRTsKKyAgICB9CisgICAgcmV0dXJuIChzMiA8PCAxNikgfCBzMTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2FsZ29yaXRobS50eHQgYi9jb21tb24vemxpYi9hbGdvcml0aG0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzgzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9hbGdvcml0aG0udHh0CkBAIC0wLDAgKzEsMjEzIEBACisxLiBDb21wcmVzc2lvbiBhbGdvcml0aG0gKGRlZmxhdGUpCisKK1RoZSBkZWZsYXRpb24gYWxnb3JpdGhtIHVzZWQgYnkgZ3ppcCAoYWxzbyB6aXAgYW5kIHpsaWIpIGlzIGEgdmFyaWF0aW9uIG9mCitMWjc3IChMZW1wZWwtWml2IDE5NzcsIHNlZSByZWZlcmVuY2UgYmVsb3cpLiBJdCBmaW5kcyBkdXBsaWNhdGVkIHN0cmluZ3MgaW4KK3RoZSBpbnB1dCBkYXRhLiAgVGhlIHNlY29uZCBvY2N1cnJlbmNlIG9mIGEgc3RyaW5nIGlzIHJlcGxhY2VkIGJ5IGEKK3BvaW50ZXIgdG8gdGhlIHByZXZpb3VzIHN0cmluZywgaW4gdGhlIGZvcm0gb2YgYSBwYWlyIChkaXN0YW5jZSwKK2xlbmd0aCkuICBEaXN0YW5jZXMgYXJlIGxpbWl0ZWQgdG8gMzJLIGJ5dGVzLCBhbmQgbGVuZ3RocyBhcmUgbGltaXRlZAordG8gMjU4IGJ5dGVzLiBXaGVuIGEgc3RyaW5nIGRvZXMgbm90IG9jY3VyIGFueXdoZXJlIGluIHRoZSBwcmV2aW91cworMzJLIGJ5dGVzLCBpdCBpcyBlbWl0dGVkIGFzIGEgc2VxdWVuY2Ugb2YgbGl0ZXJhbCBieXRlcy4gIChJbiB0aGlzCitkZXNjcmlwdGlvbiwgYHN0cmluZycgbXVzdCBiZSB0YWtlbiBhcyBhbiBhcmJpdHJhcnkgc2VxdWVuY2Ugb2YgYnl0ZXMsCithbmQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gcHJpbnRhYmxlIGNoYXJhY3RlcnMuKQorCitMaXRlcmFscyBvciBtYXRjaCBsZW5ndGhzIGFyZSBjb21wcmVzc2VkIHdpdGggb25lIEh1ZmZtYW4gdHJlZSwgYW5kCittYXRjaCBkaXN0YW5jZXMgYXJlIGNvbXByZXNzZWQgd2l0aCBhbm90aGVyIHRyZWUuIFRoZSB0cmVlcyBhcmUgc3RvcmVkCitpbiBhIGNvbXBhY3QgZm9ybSBhdCB0aGUgc3RhcnQgb2YgZWFjaCBibG9jay4gVGhlIGJsb2NrcyBjYW4gaGF2ZSBhbnkKK3NpemUgKGV4Y2VwdCB0aGF0IHRoZSBjb21wcmVzc2VkIGRhdGEgZm9yIG9uZSBibG9jayBtdXN0IGZpdCBpbgorYXZhaWxhYmxlIG1lbW9yeSkuIEEgYmxvY2sgaXMgdGVybWluYXRlZCB3aGVuIGRlZmxhdGUoKSBkZXRlcm1pbmVzIHRoYXQKK2l0IHdvdWxkIGJlIHVzZWZ1bCB0byBzdGFydCBhbm90aGVyIGJsb2NrIHdpdGggZnJlc2ggdHJlZXMuIChUaGlzIGlzCitzb21ld2hhdCBzaW1pbGFyIHRvIHRoZSBiZWhhdmlvciBvZiBMWlctYmFzZWQgX2NvbXByZXNzXy4pCisKK0R1cGxpY2F0ZWQgc3RyaW5ncyBhcmUgZm91bmQgdXNpbmcgYSBoYXNoIHRhYmxlLiBBbGwgaW5wdXQgc3RyaW5ncyBvZgorbGVuZ3RoIDMgYXJlIGluc2VydGVkIGluIHRoZSBoYXNoIHRhYmxlLiBBIGhhc2ggaW5kZXggaXMgY29tcHV0ZWQgZm9yCit0aGUgbmV4dCAzIGJ5dGVzLiBJZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhpcyBpbmRleCBpcyBub3QgZW1wdHksIGFsbAorc3RyaW5ncyBpbiB0aGUgY2hhaW4gYXJlIGNvbXBhcmVkIHdpdGggdGhlIGN1cnJlbnQgaW5wdXQgc3RyaW5nLCBhbmQKK3RoZSBsb25nZXN0IG1hdGNoIGlzIHNlbGVjdGVkLgorCitUaGUgaGFzaCBjaGFpbnMgYXJlIHNlYXJjaGVkIHN0YXJ0aW5nIHdpdGggdGhlIG1vc3QgcmVjZW50IHN0cmluZ3MsIHRvCitmYXZvciBzbWFsbCBkaXN0YW5jZXMgYW5kIHRodXMgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIEh1ZmZtYW4gZW5jb2RpbmcuCitUaGUgaGFzaCBjaGFpbnMgYXJlIHNpbmdseSBsaW5rZWQuIFRoZXJlIGFyZSBubyBkZWxldGlvbnMgZnJvbSB0aGUKK2hhc2ggY2hhaW5zLCB0aGUgYWxnb3JpdGhtIHNpbXBseSBkaXNjYXJkcyBtYXRjaGVzIHRoYXQgYXJlIHRvbyBvbGQuCisKK1RvIGF2b2lkIGEgd29yc3QtY2FzZSBzaXR1YXRpb24sIHZlcnkgbG9uZyBoYXNoIGNoYWlucyBhcmUgYXJiaXRyYXJpbHkKK3RydW5jYXRlZCBhdCBhIGNlcnRhaW4gbGVuZ3RoLCBkZXRlcm1pbmVkIGJ5IGEgcnVudGltZSBvcHRpb24gKGxldmVsCitwYXJhbWV0ZXIgb2YgZGVmbGF0ZUluaXQpLiBTbyBkZWZsYXRlKCkgZG9lcyBub3QgYWx3YXlzIGZpbmQgdGhlIGxvbmdlc3QKK3Bvc3NpYmxlIG1hdGNoIGJ1dCBnZW5lcmFsbHkgZmluZHMgYSBtYXRjaCB3aGljaCBpcyBsb25nIGVub3VnaC4KKworZGVmbGF0ZSgpIGFsc28gZGVmZXJzIHRoZSBzZWxlY3Rpb24gb2YgbWF0Y2hlcyB3aXRoIGEgbGF6eSBldmFsdWF0aW9uCittZWNoYW5pc20uIEFmdGVyIGEgbWF0Y2ggb2YgbGVuZ3RoIE4gaGFzIGJlZW4gZm91bmQsIGRlZmxhdGUoKSBzZWFyY2hlcyBmb3IKK2EgbG9uZ2VyIG1hdGNoIGF0IHRoZSBuZXh0IGlucHV0IGJ5dGUuIElmIGEgbG9uZ2VyIG1hdGNoIGlzIGZvdW5kLCB0aGUKK3ByZXZpb3VzIG1hdGNoIGlzIHRydW5jYXRlZCB0byBhIGxlbmd0aCBvZiBvbmUgKHRodXMgcHJvZHVjaW5nIGEgc2luZ2xlCitsaXRlcmFsIGJ5dGUpIGFuZCB0aGUgcHJvY2VzcyBvZiBsYXp5IGV2YWx1YXRpb24gYmVnaW5zIGFnYWluLiBPdGhlcndpc2UsCit0aGUgb3JpZ2luYWwgbWF0Y2ggaXMga2VwdCwgYW5kIHRoZSBuZXh0IG1hdGNoIHNlYXJjaCBpcyBhdHRlbXB0ZWQgb25seSBOCitzdGVwcyBsYXRlci4KKworVGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbiBpcyBhbHNvIHN1YmplY3QgdG8gYSBydW50aW1lIHBhcmFtZXRlci4gSWYKK3RoZSBjdXJyZW50IG1hdGNoIGlzIGxvbmcgZW5vdWdoLCBkZWZsYXRlKCkgcmVkdWNlcyB0aGUgc2VhcmNoIGZvciBhIGxvbmdlcgorbWF0Y2gsIHRodXMgc3BlZWRpbmcgdXAgdGhlIHdob2xlIHByb2Nlc3MuIElmIGNvbXByZXNzaW9uIHJhdGlvIGlzIG1vcmUKK2ltcG9ydGFudCB0aGFuIHNwZWVkLCBkZWZsYXRlKCkgYXR0ZW1wdHMgYSBjb21wbGV0ZSBzZWNvbmQgc2VhcmNoIGV2ZW4gaWYKK3RoZSBmaXJzdCBtYXRjaCBpcyBhbHJlYWR5IGxvbmcgZW5vdWdoLgorCitUaGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgZm9yIHRoZSBmYXN0ZXN0IGNvbXByZXNzaW9uCittb2RlcyAobGV2ZWwgcGFyYW1ldGVyIDEgdG8gMykuIEZvciB0aGVzZSBmYXN0IG1vZGVzLCBuZXcgc3RyaW5ncworYXJlIGluc2VydGVkIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgd2hlbiBubyBtYXRjaCB3YXMgZm91bmQsIG9yCit3aGVuIHRoZSBtYXRjaCBpcyBub3QgdG9vIGxvbmcuIFRoaXMgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvCitidXQgc2F2ZXMgdGltZSBzaW5jZSB0aGVyZSBhcmUgYm90aCBmZXdlciBpbnNlcnRpb25zIGFuZCBmZXdlciBzZWFyY2hlcy4KKworCisyLiBEZWNvbXByZXNzaW9uIGFsZ29yaXRobSAoaW5mbGF0ZSkKKworMi4xIEludHJvZHVjdGlvbgorCitUaGUgcmVhbCBxdWVzdGlvbiBpcywgZ2l2ZW4gYSBIdWZmbWFuIHRyZWUsIGhvdyB0byBkZWNvZGUgZmFzdC4gIFRoZSBtb3N0CitpbXBvcnRhbnQgcmVhbGl6YXRpb24gaXMgdGhhdCBzaG9ydGVyIGNvZGVzIGFyZSBtdWNoIG1vcmUgY29tbW9uIHRoYW4KK2xvbmdlciBjb2Rlcywgc28gcGF5IGF0dGVudGlvbiB0byBkZWNvZGluZyB0aGUgc2hvcnQgY29kZXMgZmFzdCwgYW5kIGxldAordGhlIGxvbmcgY29kZXMgdGFrZSBsb25nZXIgdG8gZGVjb2RlLgorCitpbmZsYXRlKCkgc2V0cyB1cCBhIGZpcnN0IGxldmVsIHRhYmxlIHRoYXQgY292ZXJzIHNvbWUgbnVtYmVyIG9mIGJpdHMgb2YKK2lucHV0IGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIGxvbmdlc3QgY29kZS4gIEl0IGdldHMgdGhhdCBtYW55IGJpdHMgZnJvbSB0aGUKK3N0cmVhbSwgYW5kIGxvb2tzIGl0IHVwIGluIHRoZSB0YWJsZS4gIFRoZSB0YWJsZSB3aWxsIHRlbGwgaWYgdGhlIG5leHQKK2NvZGUgaXMgdGhhdCBtYW55IGJpdHMgb3IgbGVzcyBhbmQgaG93IG1hbnksIGFuZCBpZiBpdCBpcywgaXQgd2lsbCB0ZWxsCit0aGUgdmFsdWUsIGVsc2UgaXQgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBsZXZlbCB0YWJsZSBmb3Igd2hpY2ggaW5mbGF0ZSgpCitncmFicyBtb3JlIGJpdHMgYW5kIHRyaWVzIHRvIGRlY29kZSBhIGxvbmdlciBjb2RlLgorCitIb3cgbWFueSBiaXRzIHRvIG1ha2UgdGhlIGZpcnN0IGxvb2t1cCBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gdGhlIHRpbWUgaXQKK3Rha2VzIHRvIGRlY29kZSBhbmQgdGhlIHRpbWUgaXQgdGFrZXMgdG8gYnVpbGQgdGhlIHRhYmxlLiAgSWYgYnVpbGRpbmcgdGhlCit0YWJsZSB0b29rIG5vIHRpbWUgKGFuZCBpZiB5b3UgaGFkIGluZmluaXRlIG1lbW9yeSksIHRoZW4gdGhlcmUgd291bGQgb25seQorYmUgYSBmaXJzdCBsZXZlbCB0YWJsZSB0byBjb3ZlciBhbGwgdGhlIHdheSB0byB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwKK2J1aWxkaW5nIHRoZSB0YWJsZSBlbmRzIHVwIHRha2luZyBhIGxvdCBsb25nZXIgZm9yIG1vcmUgYml0cyBzaW5jZSBzaG9ydAorY29kZXMgYXJlIHJlcGxpY2F0ZWQgbWFueSB0aW1lcyBpbiBzdWNoIGEgdGFibGUuICBXaGF0IGluZmxhdGUoKSBkb2VzIGlzCitzaW1wbHkgdG8gbWFrZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGZpcnN0IHRhYmxlIGEgdmFyaWFibGUsIGFuZCBzZXQgaXQKK2ZvciB0aGUgbWF4aW11bSBzcGVlZC4KKworaW5mbGF0ZSgpIHNlbmRzIG5ldyB0cmVlcyByZWxhdGl2ZWx5IG9mdGVuLCBzbyBpdCBpcyBwb3NzaWJseSBzZXQgZm9yIGEKK3NtYWxsZXIgZmlyc3QgbGV2ZWwgdGFibGUgdGhhbiBhbiBhcHBsaWNhdGlvbiB0aGF0IGhhcyBvbmx5IG9uZSB0cmVlIGZvcgorYWxsIHRoZSBkYXRhLiAgRm9yIGluZmxhdGUsIHdoaWNoIGhhcyAyODYgcG9zc2libGUgY29kZXMgZm9yIHRoZQorbGl0ZXJhbC9sZW5ndGggdHJlZSwgdGhlIHNpemUgb2YgdGhlIGZpcnN0IHRhYmxlIGlzIG5pbmUgYml0cy4gIEFsc28gdGhlCitkaXN0YW5jZSB0cmVlcyBoYXZlIDMwIHBvc3NpYmxlIHZhbHVlcywgYW5kIHRoZSBzaXplIG9mIHRoZSBmaXJzdCB0YWJsZSBpcworc2l4IGJpdHMuICBOb3RlIHRoYXQgZm9yIGVhY2ggb2YgdGhvc2UgY2FzZXMsIHRoZSB0YWJsZSBlbmRlZCB1cCBvbmUgYml0Citsb25nZXIgdGhhbiB0aGUgYGBhdmVyYWdlJycgY29kZSBsZW5ndGgsIGkuZS4gdGhlIGNvZGUgbGVuZ3RoIG9mIGFuCithcHByb3hpbWF0ZWx5IGZsYXQgY29kZSB3aGljaCB3b3VsZCBiZSBhIGxpdHRsZSBtb3JlIHRoYW4gZWlnaHQgYml0cyBmb3IKKzI4NiBzeW1ib2xzIGFuZCBhIGxpdHRsZSBsZXNzIHRoYW4gZml2ZSBiaXRzIGZvciAzMCBzeW1ib2xzLiAgSXQgd291bGQgYmUKK2ludGVyZXN0aW5nIHRvIHNlZSBpZiBvcHRpbWl6aW5nIHRoZSBmaXJzdCBsZXZlbCB0YWJsZSBmb3Igb3RoZXIKK2FwcGxpY2F0aW9ucyBnYXZlIHZhbHVlcyB3aXRoaW4gYSBiaXQgb3IgdHdvIG9mIHRoZSBmbGF0IGNvZGUgc2l6ZS4KKworCisyLjIgTW9yZSBkZXRhaWxzIG9uIHRoZSBpbmZsYXRlIHRhYmxlIGxvb2t1cAorCitPaywgeW91IHdhbnQgdG8ga25vdyB3aGF0IHRoaXMgY2xldmVybHkgb2JmdXNjYXRlZCBpbmZsYXRlIHRyZWUgYWN0dWFsbHkgIAorbG9va3MgbGlrZS4gIFlvdSBhcmUgY29ycmVjdCB0aGF0IGl0J3Mgbm90IGEgSHVmZm1hbiB0cmVlLiAgSXQgaXMgc2ltcGx5IGEgIAorbG9va3VwIHRhYmxlIGZvciB0aGUgZmlyc3QsIGxldCdzIHNheSwgbmluZSBiaXRzIG9mIGEgSHVmZm1hbiBzeW1ib2wuICBUaGUgIAorc3ltYm9sIGNvdWxkIGJlIGFzIHNob3J0IGFzIG9uZSBiaXQgb3IgYXMgbG9uZyBhcyAxNSBiaXRzLiAgSWYgYSBwYXJ0aWN1bGFyICAKK3N5bWJvbCBpcyBzaG9ydGVyIHRoYW4gbmluZSBiaXRzLCB0aGVuIHRoYXQgc3ltYm9sJ3MgdHJhbnNsYXRpb24gaXMgZHVwbGljYXRlZAoraW4gYWxsIHRob3NlIGVudHJpZXMgdGhhdCBzdGFydCB3aXRoIHRoYXQgc3ltYm9sJ3MgYml0cy4gIEZvciBleGFtcGxlLCBpZiB0aGUgIAorc3ltYm9sIGlzIGZvdXIgYml0cywgdGhlbiBpdCdzIGR1cGxpY2F0ZWQgMzIgdGltZXMgaW4gYSBuaW5lLWJpdCB0YWJsZS4gIElmIGEgIAorc3ltYm9sIGlzIG5pbmUgYml0cyBsb25nLCBpdCBhcHBlYXJzIGluIHRoZSB0YWJsZSBvbmNlLgorCitJZiB0aGUgc3ltYm9sIGlzIGxvbmdlciB0aGFuIG5pbmUgYml0cywgdGhlbiB0aGF0IGVudHJ5IGluIHRoZSB0YWJsZSBwb2ludHMgIAordG8gYW5vdGhlciBzaW1pbGFyIHRhYmxlIGZvciB0aGUgcmVtYWluaW5nIGJpdHMuICBBZ2FpbiwgdGhlcmUgYXJlIGR1cGxpY2F0ZWQgIAorZW50cmllcyBhcyBuZWVkZWQuICBUaGUgaWRlYSBpcyB0aGF0IG1vc3Qgb2YgdGhlIHRpbWUgdGhlIHN5bWJvbCB3aWxsIGJlIHNob3J0CithbmQgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSB0YWJsZSBsb29rIHVwLiAgKFRoYXQncyB3aG9sZSBpZGVhIGJlaGluZCBkYXRhICAKK2NvbXByZXNzaW9uIGluIHRoZSBmaXJzdCBwbGFjZS4pICBGb3IgdGhlIGxlc3MgZnJlcXVlbnQgbG9uZyBzeW1ib2xzLCB0aGVyZSAgCit3aWxsIGJlIHR3byBsb29rdXBzLiAgSWYgeW91IGhhZCBhIGNvbXByZXNzaW9uIG1ldGhvZCB3aXRoIHJlYWxseSBsb25nICAKK3N5bWJvbHMsIHlvdSBjb3VsZCBoYXZlIGFzIG1hbnkgbGV2ZWxzIG9mIGxvb2t1cHMgYXMgaXMgZWZmaWNpZW50LiAgRm9yICAKK2luZmxhdGUsIHR3byBpcyBlbm91Z2guCisKK1NvIGEgdGFibGUgZW50cnkgZWl0aGVyIHBvaW50cyB0byBhbm90aGVyIHRhYmxlIChpbiB3aGljaCBjYXNlIG5pbmUgYml0cyBpbiAgCit0aGUgYWJvdmUgZXhhbXBsZSBhcmUgZ29iYmxlZCksIG9yIGl0IGNvbnRhaW5zIHRoZSB0cmFuc2xhdGlvbiBmb3IgdGhlIHN5bWJvbCAgCithbmQgdGhlIG51bWJlciBvZiBiaXRzIHRvIGdvYmJsZS4gIFRoZW4geW91IHN0YXJ0IGFnYWluIHdpdGggdGhlIG5leHQgIAordW5nb2JibGVkIGJpdC4KKworWW91IG1heSB3b25kZXI6IHdoeSBub3QganVzdCBoYXZlIG9uZSBsb29rdXAgdGFibGUgZm9yIGhvdyBldmVyIG1hbnkgYml0cyB0aGUgIAorbG9uZ2VzdCBzeW1ib2wgaXM/ICBUaGUgcmVhc29uIGlzIHRoYXQgaWYgeW91IGRvIHRoYXQsIHlvdSBlbmQgdXAgc3BlbmRpbmcgIAorbW9yZSB0aW1lIGZpbGxpbmcgaW4gZHVwbGljYXRlIHN5bWJvbCBlbnRyaWVzIHRoYW4geW91IGRvIGFjdHVhbGx5IGRlY29kaW5nLiAgIAorQXQgbGVhc3QgZm9yIGRlZmxhdGUncyBvdXRwdXQgdGhhdCBnZW5lcmF0ZXMgbmV3IHRyZWVzIGV2ZXJ5IHNldmVyYWwgMTAncyBvZiAgCitrYnl0ZXMuICBZb3UgY2FuIGltYWdpbmUgdGhhdCBmaWxsaW5nIGluIGEgMl4xNSBlbnRyeSB0YWJsZSBmb3IgYSAxNS1iaXQgY29kZSAgCit3b3VsZCB0YWtlIHRvbyBsb25nIGlmIHlvdSdyZSBvbmx5IGRlY29kaW5nIHNldmVyYWwgdGhvdXNhbmQgc3ltYm9scy4gIEF0IHRoZSAgCitvdGhlciBleHRyZW1lLCB5b3UgY291bGQgbWFrZSBhIG5ldyB0YWJsZSBmb3IgZXZlcnkgYml0IGluIHRoZSBjb2RlLiAgSW4gZmFjdCwKK3RoYXQncyBlc3NlbnRpYWxseSBhIEh1ZmZtYW4gdHJlZS4gIEJ1dCB0aGVuIHlvdSBzcGVuZCB0d28gbXVjaCB0aW1lICAKK3RyYXZlcnNpbmcgdGhlIHRyZWUgd2hpbGUgZGVjb2RpbmcsIGV2ZW4gZm9yIHNob3J0IHN5bWJvbHMuCisKK1NvIHRoZSBudW1iZXIgb2YgYml0cyBmb3IgdGhlIGZpcnN0IGxvb2t1cCB0YWJsZSBpcyBhIHRyYWRlIG9mIHRoZSB0aW1lIHRvICAKK2ZpbGwgb3V0IHRoZSB0YWJsZSB2cy4gdGhlIHRpbWUgc3BlbnQgbG9va2luZyBhdCB0aGUgc2Vjb25kIGxldmVsIGFuZCBhYm92ZSBvZgordGhlIHRhYmxlLgorCitIZXJlIGlzIGFuIGV4YW1wbGUsIHNjYWxlZCBkb3duOgorCitUaGUgY29kZSBiZWluZyBkZWNvZGVkLCB3aXRoIDEwIHN5bWJvbHMsIGZyb20gMSB0byA2IGJpdHMgbG9uZzoKKworQTogMAorQjogMTAKK0M6IDExMDAKK0Q6IDExMDEwCitFOiAxMTAxMQorRjogMTExMDAKK0c6IDExMTAxCitIOiAxMTExMAorSTogMTExMTEwCitKOiAxMTExMTEKKworTGV0J3MgbWFrZSB0aGUgZmlyc3QgdGFibGUgdGhyZWUgYml0cyBsb25nIChlaWdodCBlbnRyaWVzKToKKworMDAwOiBBLDEKKzAwMTogQSwxCiswMTA6IEEsMQorMDExOiBBLDEKKzEwMDogQiwyCisxMDE6IEIsMgorMTEwOiAtPiB0YWJsZSBYIChnb2JibGUgMyBiaXRzKQorMTExOiAtPiB0YWJsZSBZIChnb2JibGUgMyBiaXRzKQorCitFYWNoIGVudHJ5IGlzIHdoYXQgdGhlIGJpdHMgZGVjb2RlIHRvIGFuZCBob3cgbWFueSBiaXRzIHRoYXQgaXMsIGkuZS4gaG93ICAKK21hbnkgYml0cyB0byBnb2JibGUuICBPciB0aGUgZW50cnkgcG9pbnRzIHRvIGFub3RoZXIgdGFibGUsIHdpdGggdGhlIG51bWJlciBvZgorYml0cyB0byBnb2JibGUgaW1wbGljaXQgaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlLgorCitUYWJsZSBYIGlzIHR3byBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMCBpcyBmaXZlIGJpdHMKK2xvbmc6CisKKzAwOiBDLDEKKzAxOiBDLDEKKzEwOiBELDIKKzExOiBFLDIKKworVGFibGUgWSBpcyB0aHJlZSBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMSBpcyBzaXggIAorYml0cyBsb25nOgorCiswMDA6IEYsMgorMDAxOiBGLDIKKzAxMDogRywyCiswMTE6IEcsMgorMTAwOiBILDIKKzEwMTogSCwyCisxMTA6IEksMworMTExOiBKLDMKKworU28gd2hhdCB3ZSBoYXZlIGhlcmUgYXJlIHRocmVlIHRhYmxlcyB3aXRoIGEgdG90YWwgb2YgMjAgZW50cmllcyB0aGF0IGhhZCB0byAgCitiZSBjb25zdHJ1Y3RlZC4gIFRoYXQncyBjb21wYXJlZCB0byA2NCBlbnRyaWVzIGZvciBhIHNpbmdsZSB0YWJsZS4gIE9yICAKK2NvbXBhcmVkIHRvIDE2IGVudHJpZXMgZm9yIGEgSHVmZm1hbiB0cmVlIChzaXggdHdvIGVudHJ5IHRhYmxlcyBhbmQgb25lIGZvdXIgIAorZW50cnkgdGFibGUpLiAgQXNzdW1pbmcgdGhhdCB0aGUgY29kZSBpZGVhbGx5IHJlcHJlc2VudHMgdGhlIHByb2JhYmlsaXR5IG9mICAKK3RoZSBzeW1ib2xzLCBpdCB0YWtlcyBvbiB0aGUgYXZlcmFnZSAxLjI1IGxvb2t1cHMgcGVyIHN5bWJvbC4gIFRoYXQncyBjb21wYXJlZAordG8gb25lIGxvb2t1cCBmb3IgdGhlIHNpbmdsZSB0YWJsZSwgb3IgMS42NiBsb29rdXBzIHBlciBzeW1ib2wgZm9yIHRoZSAgCitIdWZmbWFuIHRyZWUuCisKK1RoZXJlLCBJIHRoaW5rIHRoYXQgZ2l2ZXMgeW91IGEgcGljdHVyZSBvZiB3aGF0J3MgZ29pbmcgb24uICBGb3IgaW5mbGF0ZSwgdGhlICAKK21lYW5pbmcgb2YgYSBwYXJ0aWN1bGFyIHN5bWJvbCBpcyBvZnRlbiBtb3JlIHRoYW4ganVzdCBhIGxldHRlci4gIEl0IGNhbiBiZSBhICAKK2J5dGUgKGEgImxpdGVyYWwiKSwgb3IgaXQgY2FuIGJlIGVpdGhlciBhIGxlbmd0aCBvciBhIGRpc3RhbmNlIHdoaWNoICAKK2luZGljYXRlcyBhIGJhc2UgdmFsdWUgYW5kIGEgbnVtYmVyIG9mIGJpdHMgdG8gZmV0Y2ggYWZ0ZXIgdGhlIGNvZGUgdGhhdCBpcyAgCithZGRlZCB0byB0aGUgYmFzZSB2YWx1ZS4gIE9yIGl0IG1pZ2h0IGJlIHRoZSBzcGVjaWFsIGVuZC1vZi1ibG9jayBjb2RlLiAgVGhlICAKK2RhdGEgc3RydWN0dXJlcyBjcmVhdGVkIGluIGluZnRyZWVzLmMgdHJ5IHRvIGVuY29kZSBhbGwgdGhhdCBpbmZvcm1hdGlvbiAgCitjb21wYWN0bHkgaW4gdGhlIHRhYmxlcy4KKworCitKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCitqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKKworUmVmZXJlbmNlczoKKworW0xaNzddIFppdiBKLiwgTGVtcGVsIEEuLCBgYEEgVW5pdmVyc2FsIEFsZ29yaXRobSBmb3IgU2VxdWVudGlhbCBEYXRhCitDb21wcmVzc2lvbiwnJyBJRUVFIFRyYW5zYWN0aW9ucyBvbiBJbmZvcm1hdGlvbiBUaGVvcnksIFZvbC4gMjMsIE5vLiAzLAorcHAuIDMzNy0zNDMuCisKK2BgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24nJyBhdmFpbGFibGUgaW4KK2Z0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MS50eHQKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2NvbXByZXNzLmMgYi9jb21tb24vemxpYi9jb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTc3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9jb21wcmVzcy5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIGNvbXByZXNzLmMgLS0gY29tcHJlc3MgYSBtZW1vcnkgYnVmZmVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBAKCMpICRJZDogY29tcHJlc3MuYyx2IDEuMSAyMDA0LzEwLzA4IDA5OjQ0OjIyIGNvbnN0X2sgRXhwICQgKi8KKworI2luY2x1ZGUgInpsaWIuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKKyAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQorICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4gc291cmNlTGVuIHBsdXMKKyAgIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKworICAgICBjb21wcmVzczIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsCisgICBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCisqLworaW50IFpFWFBPUlQgY29tcHJlc3MyIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbiwgbGV2ZWwpCisgICAgQnl0ZWYgKmRlc3Q7CisgICAgdUxvbmdmICpkZXN0TGVuOworICAgIGNvbnN0IEJ5dGVmICpzb3VyY2U7CisgICAgdUxvbmcgc291cmNlTGVuOworICAgIGludCBsZXZlbDsKK3sKKyAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgaW50IGVycjsKKworICAgIHN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilzb3VyY2U7CisgICAgc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpc291cmNlTGVuOworI2lmZGVmIE1BWFNFR182NEsKKyAgICAvKiBDaGVjayBmb3Igc291cmNlID4gNjRLIG9uIDE2LWJpdCBtYWNoaW5lOiAqLworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX2luICE9IHNvdXJjZUxlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworI2VuZGlmCisgICAgc3RyZWFtLm5leHRfb3V0ID0gZGVzdDsKKyAgICBzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmRlc3RMZW47CisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfb3V0ICE9ICpkZXN0TGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGVyciA9IGRlZmxhdGVJbml0KCZzdHJlYW0sIGxldmVsKTsKKyAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBkZWZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgICByZXR1cm4gZXJyID09IFpfT0sgPyBaX0JVRl9FUlJPUiA6IGVycjsKKyAgICB9CisgICAgKmRlc3RMZW4gPSBzdHJlYW0udG90YWxfb3V0OworCisgICAgZXJyID0gZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworaW50IFpFWFBPUlQgY29tcHJlc3MgKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuKQorICAgIEJ5dGVmICpkZXN0OworICAgIHVMb25nZiAqZGVzdExlbjsKKyAgICBjb25zdCBCeXRlZiAqc291cmNlOworICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICByZXR1cm4gY29tcHJlc3MyKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvY29uZmlndXJlIGIvY29tbW9uL3psaWIvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4OTQyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9jb25maWd1cmUKQEAgLTAsMCArMSwyMTIgQEAKKyMhL2Jpbi9zaAorIyBjb25maWd1cmUgc2NyaXB0IGZvciB6bGliLiBUaGlzIHNjcmlwdCBpcyBuZWVkZWQgb25seSBpZgorIyB5b3Ugd2lzaCB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IGFuZCB5b3VyIHN5c3RlbSBzdXBwb3J0cyB0aGVtLAorIyBvZiBpZiB5b3UgbmVlZCBzcGVjaWFsIGNvbXBpbGVyLCBmbGFncyBvciBpbnN0YWxsIGRpcmVjdG9yeS4KKyMgT3RoZXJ3aXNlLCB5b3UgY2FuIGp1c3QgdXNlIGRpcmVjdGx5ICJtYWtlIHRlc3Q7IG1ha2UgaW5zdGFsbCIKKyMKKyMgVG8gY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnksIHVzZSAiY29uZmlndXJlIC0tc2hhcmVkIjsgYnkgZGVmYXVsdCBhIHN0YXRpYworIyBsaWJyYXJ5IGlzIGNyZWF0ZWQuIElmIHRoZSBwcmltaXRpdmUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBwcm92aWRlZCBoZXJlCisjIGRvZXMgbm90IHdvcmssIHVzZSBmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9saWJ0b29sLSoudGFyLmd6CisjCisjIFRvIGltcG9zZSBzcGVjaWZpYyBjb21waWxlciBvciBmbGFncyBvciBpbnN0YWxsIGRpcmVjdG9yeSwgdXNlIGZvciBleGFtcGxlOgorIyAgICBwcmVmaXg9JEhPTUUgQ0M9Y2MgQ0ZMQUdTPSItTzQiIC4vY29uZmlndXJlCisjIG9yIGZvciBjc2gvdGNzaCB1c2VyczoKKyMgICAgKHNldGVudiBwcmVmaXggJEhPTUU7IHNldGVudiBDQyBjYzsgc2V0ZW52IENGTEFHUyAiLU80IjsgLi9jb25maWd1cmUpCisjIExEU0hBUkVEIGlzIHRoZSBjb21tYW5kIHRvIGJlIHVzZWQgdG8gY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkKKworIyBJbmNvcnJlY3Qgc2V0dGluZ3Mgb2YgQ0Mgb3IgQ0ZMQUdTIG1heSBwcmV2ZW50IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCisjIElmIHlvdSBoYXZlIHByb2JsZW1zLCB0cnkgd2l0aG91dCBkZWZpbmluZyBDQyBhbmQgQ0ZMQUdTIGJlZm9yZSByZXBvcnRpbmcKKyMgYW4gZXJyb3IuCisKK0xJQlM9bGliei5hCitTSEFSRURMSUI9bGliei5zbworVkVSPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgCitBUj0ke0FSLSJhciByYyJ9CitSQU5MSUI9JHtSQU5MSUItInJhbmxpYiJ9CitwcmVmaXg9JHtwcmVmaXgtL3Vzci9sb2NhbH0KK2V4ZWNfcHJlZml4PSR7ZXhlY19wcmVmaXgtJyR7cHJlZml4fSd9CitsaWJkaXI9JHtsaWJkaXItJyR7ZXhlY19wcmVmaXh9L2xpYid9CitpbmNsdWRlZGlyPSR7aW5jbHVkZWRpci0nJHtwcmVmaXh9L2luY2x1ZGUnfQorc2hhcmVkX2V4dD0nLnNvJworc2hhcmVkPTAKK2djYz0wCitvbGRfY2M9IiRDQyIKK29sZF9jZmxhZ3M9IiRDRkxBR1MiCisKK3doaWxlIHRlc3QgJCMgLWdlIDEKK2RvCitjYXNlICIkMSIgaW4KKyAgICAtaCogfCAtLWgqKQorICAgICAgZWNobyAndXNhZ2U6JworICAgICAgZWNobyAnICBjb25maWd1cmUgWy0tc2hhcmVkXSBbLS1wcmVmaXg9UFJFRklYXSAgWy0tZXhlY19wcmVmaXg9RVhQUkVGSVhdJworICAgICAgZWNobyAnICAgICBbLS1saWJkaXI9TElCRElSXSBbLS1pbmNsdWRlZGlyPUlOQ0xVREVESVJdJworICAgICAgICBleGl0IDA7OworICAgIC1wKj0qIHwgLS1wKj0qKSBwcmVmaXg9YGVjaG8gJDEgfCBzZWQgJ3MvWy1hLXpfXSo9Ly8nYDsgc2hpZnQ7OworICAgIC1lKj0qIHwgLS1lKj0qKSBleGVjX3ByZWZpeD1gZWNobyAkMSB8IHNlZCAncy9bLWEtel9dKj0vLydgOyBzaGlmdDs7CisgICAgLWwqPSogfCAtLWxpYmRpcj0qKSBsaWJkaXI9YGVjaG8gJDEgfCBzZWQgJ3MvWy1hLXpfXSo9Ly8nYDsgc2hpZnQ7OworICAgIC1pKj0qIHwgLS1pbmNsdWRlZGlyPSopIGluY2x1ZGVkaXI9YGVjaG8gJDEgfCBzZWQgJ3MvWy1hLXpfXSo9Ly8nYDtzaGlmdDs7CisgICAgLXAqIHwgLS1wKikgcHJlZml4PSIkMiI7IHNoaWZ0OyBzaGlmdDs7CisgICAgLWUqIHwgLS1lKikgZXhlY19wcmVmaXg9IiQyIjsgc2hpZnQ7IHNoaWZ0OzsKKyAgICAtbCogfCAtLWwqKSBsaWJkaXI9IiQyIjsgc2hpZnQ7IHNoaWZ0OzsKKyAgICAtaSogfCAtLWkqKSBpbmNsdWRlZGlyPSIkMiI7IHNoaWZ0OyBzaGlmdDs7CisgICAgLXMqIHwgLS1zKikgc2hhcmVkPTE7IHNoaWZ0OzsKKyAgICBlc2FjCitkb25lCisKK3Rlc3Q9enRlc3QkJAorY2F0ID4gJHRlc3QuYyA8PEVPRgorZXh0ZXJuIGludCBnZXRjaGFyKCk7CitpbnQgaGVsbG8oKSB7cmV0dXJuIGdldGNoYXIoKTt9CitFT0YKKwordGVzdCAteiAiJENDIiAmJiBlY2hvIENoZWNraW5nIGZvciBnY2MuLi4KK2NjPSR7Q0MtZ2NjfQorY2ZsYWdzPSR7Q0ZMQUdTLSItTzMifQorIyB0byBmb3JjZSB0aGUgYXNtIHZlcnNpb24gdXNlOiBDRkxBR1M9Ii1PMyAtREFTTVYiIC4vY29uZmlndXJlCitjYXNlICIkY2MiIGluCisgICpnY2MqKSBnY2M9MTs7Citlc2FjCisKK2lmIHRlc3QgIiRnY2MiIC1lcSAxICYmICgkY2MgLWMgJGNmbGFncyAkdGVzdC5jKSAyPi9kZXYvbnVsbDsgdGhlbgorICBDQz0iJGNjIgorICBTRkxBR1M9JHtDRkxBR1MtIi1mUElDIC1PMyJ9CisgIENGTEFHUz0iJGNmbGFncyIKKyAgY2FzZSBgKHVuYW1lIC1zIHx8IGVjaG8gdW5rbm93bikgMj4vZGV2L251bGxgIGluCisgIExpbnV4IHwgbGludXgpIExEU0hBUkVEPSR7TERTSEFSRUQtImdjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYnouc28uMSJ9OzsKKyAgKikgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iZ2NjIC1zaGFyZWQifTs7CisgIGVzYWMKK2Vsc2UKKyAgIyBmaW5kIHN5c3RlbSBuYW1lIGFuZCBjb3JyZXNwb25kaW5nIGNjIG9wdGlvbnMKKyAgQ0M9JHtDQy1jY30KKyAgY2FzZSBgKHVuYW1lIC1zciB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgorICBIUC1VWCopICAgIFNGTEFHUz0ke0NGTEFHUy0iLU8gK3oifQorCSAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CisjCSAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0ibGQgLWIgK3Zub2NvbXBhdHdhcm5pbmdzIn0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImxkIC1iIn0KKwkgICAgIHNoYXJlZF9leHQ9Jy5zbCcKKwkgICAgIFNIQVJFRExJQj0nbGliei5zbCc7OworICBJUklYKikgICAgIFNGTEFHUz0ke0NGTEFHUy0iLWFuc2kgLU8yIC1ycGF0aCAuIn0KKwkgICAgIENGTEFHUz0ke0NGTEFHUy0iLWFuc2kgLU8yIn0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQifTs7CisgIE9TRjFcIFY0KikgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9CisJICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIC1zdGQxIn0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQgIC1XbCwtc29uYW1lLCRTSEFSRURMSUIgLVdsLC1tc3ltIC1XbCwtcnBhdGgsJChsaWJkaXIpIC1XbCwtc2V0X3ZlcnNpb24sJHtWRVJ9OjEuMCJ9OzsKKyAgT1NGMSopICAgICBTRkxBR1M9JHtDRkxBR1MtIi1PIC1zdGQxIn0KKwkgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8gLXN0ZDEifQorCSAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCJ9OzsKKyAgUU5YKikgICAgICBTRkxBR1M9JHtDRkxBR1MtIi00IC1PIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi00IC1PIn0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIn0KKyAgICAgICAgICAgICBSQU5MSUI9JHtSQU5MSUItInRydWUifQorICAgICAgICAgICAgIEFSPSJjYyAtQSI7OworICBTQ09fU1ZcIDMuMiopIFNGTEFHUz0ke0NGTEFHUy0iLU8zIC1keSAtS1BJQyAifQorCSAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTzMifQorCSAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLWR5IC1LUElDIC1HIn07OworICBTdW5PU1wgNSopIFNGTEFHUz0ke0NGTEFHUy0iLWZhc3QgLXhjZzg5IC1LUElDIC1SLiJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZmFzdCAteGNnODkifQorCSAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLUcifTs7CisgIFN1bk9TXCA0KikgU0ZMQUdTPSR7Q0ZMQUdTLSItTzIgLVBJQyJ9CisJICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PMiJ9CisJICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJsZCJ9OzsKKyAgVU5JWF9TeXN0ZW1fVlwgNC4yLjApIAorCSAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItS1BJQyAtTyJ9CisJICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn07OworICBVTklYX1NWXCA0LjJNUCkKKwkgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtjb25mb3JtX3BpYyAtTyJ9CisJICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn07OworICAjIHNlbmQgd29ya2luZyBvcHRpb25zIGZvciBvdGhlciBzeXN0ZW1zIHRvIHN1cHBvcnRAZ3ppcC5vcmcKKyAgKikgICAgICAgICBTRkxBR1M9JHtDRkxBR1MtIi1PIn0KKwkgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQorCSAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCJ9OzsKKyAgZXNhYworZmkKKworaWYgdGVzdCAkc2hhcmVkIC1lcSAxOyB0aGVuCisgIGVjaG8gQ2hlY2tpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuLi4KKyAgIyB3ZSBtdXN0IHRlc3QgaW4gdHdvIHN0ZXBzIChjYyB0aGVuIGxkKSwgcmVxdWlyZWQgYXQgbGVhc3Qgb24gU3VuT1MgNC54CisgIGlmIHRlc3QgImAoJENDIC1jICRTRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiIgJiYKKyAgICAgdGVzdCAiYCgkTERTSEFSRUQgLW8gJHRlc3Qkc2hhcmVkX2V4dCAkdGVzdC5vKSAyPiYxYCIgPSAiIjsgdGhlbgorICAgIENGTEFHUz0iJFNGTEFHUyIKKyAgICBMSUJTPSIkU0hBUkVETElCLiRWRVIiCisgICAgZWNobyBCdWlsZGluZyBzaGFyZWQgbGlicmFyeSAkU0hBUkVETElCLiRWRVIgd2l0aCAkQ0MuCisgIGVsaWYgdGVzdCAteiAiJG9sZF9jYyIgLWEgLXogIiRvbGRfY2ZsYWdzIjsgdGhlbgorICAgIGVjaG8gTm8gc2hhcmVkIGxpYnJhcnkgc3VwcHBvcnQuCisgICAgc2hhcmVkPTA7CisgIGVsc2UKKyAgICBlY2hvICdObyBzaGFyZWQgbGlicmFyeSBzdXBwcG9ydDsgdHJ5IHdpdGhvdXQgZGVmaW5pbmcgQ0MgYW5kIENGTEFHUycKKyAgICBzaGFyZWQ9MDsKKyAgZmkKK2ZpCitpZiB0ZXN0ICRzaGFyZWQgLWVxIDA7IHRoZW4KKyAgTERTSEFSRUQ9IiRDQyIKKyAgZWNobyBCdWlsZGluZyBzdGF0aWMgbGlicmFyeSAkTElCUyB2ZXJzaW9uICRWRVIgd2l0aCAkQ0MuCitmaQorCitjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8dW5pc3RkLmg+CitpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KK0VPRgoraWYgdGVzdCAiYCgkQ0MgLWMgJENGTEFHUyAkdGVzdC5jKSAyPiYxYCIgPSAiIjsgdGhlbgorICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX1VOSVNURF9IIgorICBlY2hvICJDaGVja2luZyBmb3IgdW5pc3RkLmguLi4gWWVzLiIKK2Vsc2UKKyAgZWNobyAiQ2hlY2tpbmcgZm9yIHVuaXN0ZC5oLi4uIE5vLiIKK2ZpCisKK2NhdCA+ICR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxlcnJuby5oPgoraW50IG1haW4oKSB7IHJldHVybiAwOyB9CitFT0YKK2lmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KKyAgZWNobyAiQ2hlY2tpbmcgZm9yIGVycm5vLmguLi4JIFllcy4iCitlbHNlCisgIGVjaG8gIkNoZWNraW5nIGZvciBlcnJuby5oLi4uCSBOby4iCisgIENGTEFHUz0iJENGTEFHUyAtRE5PX0VSUk5PX0giCitmaQorCitjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorY2FkZHJfdCBoZWxsbygpIHsKKyAgcmV0dXJuIG1tYXAoKGNhZGRyX3QpMCwgKG9mZl90KTAsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgMCwgKG9mZl90KTApOyAKK30KK0VPRgoraWYgdGVzdCAiYCgkQ0MgLWMgJENGTEFHUyAkdGVzdC5jKSAyPiYxYCIgPSAiIjsgdGhlbgorICBDRkxBR1M9IiRDRkxBR1MgLURVU0VfTU1BUCIKKyAgZWNobyBDaGVja2luZyBmb3IgbW1hcCBzdXBwb3J0Li4uIFllcy4KK2Vsc2UKKyAgZWNobyBDaGVja2luZyBmb3IgbW1hcCBzdXBwb3J0Li4uIE5vLgorZmkKKworQ1BQPSR7Q1BQLSIkQ0MgLUUifQorY2FzZSAkQ0ZMQUdTIGluCisgICpBU01WKikKKyAgICBpZiB0ZXN0ICJgbm0gJHRlc3QubyB8IGdyZXAgX2hlbGxvYCIgPSAiIjsgdGhlbgorICAgICAgQ1BQPSIkQ1BQIC1ETk9fVU5ERVJMSU5FIgorICAgICAgZWNobyBDaGVja2luZyBmb3IgdW5kZXJsaW5lIGluIGV4dGVybmFsIG5hbWVzLi4uIE5vLgorICAgIGVsc2UKKyAgICAgIGVjaG8gQ2hlY2tpbmcgZm9yIHVuZGVybGluZSBpbiBleHRlcm5hbCBuYW1lcy4uLiBZZXMuCisgICAgZmk7OworZXNhYworCitybSAtZiAkdGVzdC5bY29dICR0ZXN0JHNoYXJlZF9leHQKKworIyB1ZHBhdGUgTWFrZWZpbGUKK3NlZCA8IE1ha2VmaWxlLmluICIKKy9eQ0MgKj0vcyU9LiolPSRDQyUKKy9eQ0ZMQUdTICo9L3MlPS4qJT0kQ0ZMQUdTJQorL15DUFAgKj0vcyU9LiolPSRDUFAlCisvXkxEU0hBUkVEICo9L3MlPS4qJT0kTERTSEFSRUQlCisvXkxJQlMgKj0vcyU9LiolPSRMSUJTJQorL15TSEFSRURMSUIgKj0vcyU9LiolPSRTSEFSRURMSUIlCisvXkFSICo9L3MlPS4qJT0kQVIlCisvXlJBTkxJQiAqPS9zJT0uKiU9JFJBTkxJQiUKKy9eVkVSICo9L3MlPS4qJT0kVkVSJQorL15wcmVmaXggKj0vcyU9LiolPSRwcmVmaXglCisvXmV4ZWNfcHJlZml4ICo9L3MlPS4qJT0kZXhlY19wcmVmaXglCisvXmxpYmRpciAqPS9zJT0uKiU9JGxpYmRpciUKKy9eaW5jbHVkZWRpciAqPS9zJT0uKiU9JGluY2x1ZGVkaXIlCisiID4gTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2NyYzMyLmMgYi9jb21tb24vemxpYi9jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YThhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9jcmMzMi5jCkBAIC0wLDAgKzEsMTYyIEBACisvKiBjcmMzMi5jIC0tIGNvbXB1dGUgdGhlIENSQy0zMiBvZiBhIGRhdGEgc3RyZWFtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKy8qIEAoIykgJElkOiBjcmMzMi5jLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjMgY29uc3RfayBFeHAgJCAqLworCisjaW5jbHVkZSAiemxpYi5oIgorCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKworbG9jYWwgaW50IGNyY190YWJsZV9lbXB0eSA9IDE7Citsb2NhbCB1TG9uZ2YgY3JjX3RhYmxlWzI1Nl07Citsb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlIE9GKCh2b2lkKSk7CisKKy8qCisgIEdlbmVyYXRlIGEgdGFibGUgZm9yIGEgYnl0ZS13aXNlIDMyLWJpdCBDUkMgY2FsY3VsYXRpb24gb24gdGhlIHBvbHlub21pYWw6CisgIHheMzIreF4yNit4XjIzK3heMjIreF4xNit4XjEyK3heMTEreF4xMCt4XjgreF43K3heNSt4XjQreF4yK3grMS4KKworICBQb2x5bm9taWFscyBvdmVyIEdGKDIpIGFyZSByZXByZXNlbnRlZCBpbiBiaW5hcnksIG9uZSBiaXQgcGVyIGNvZWZmaWNpZW50LAorICB3aXRoIHRoZSBsb3dlc3QgcG93ZXJzIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIFRoZW4gYWRkaW5nIHBvbHlub21pYWxzCisgIGlzIGp1c3QgZXhjbHVzaXZlLW9yLCBhbmQgbXVsdGlwbHlpbmcgYSBwb2x5bm9taWFsIGJ5IHggaXMgYSByaWdodCBzaGlmdCBieQorICBvbmUuICBJZiB3ZSBjYWxsIHRoZSBhYm92ZSBwb2x5bm9taWFsIHAsIGFuZCByZXByZXNlbnQgYSBieXRlIGFzIHRoZQorICBwb2x5bm9taWFsIHEsIGFsc28gd2l0aCB0aGUgbG93ZXN0IHBvd2VyIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCAoc28gdGhlCisgIGJ5dGUgMHhiMSBpcyB0aGUgcG9seW5vbWlhbCB4XjcreF4zK3grMSksIHRoZW4gdGhlIENSQyBpcyAocSp4XjMyKSBtb2QgcCwKKyAgd2hlcmUgYSBtb2QgYiBtZWFucyB0aGUgcmVtYWluZGVyIGFmdGVyIGRpdmlkaW5nIGEgYnkgYi4KKworICBUaGlzIGNhbGN1bGF0aW9uIGlzIGRvbmUgdXNpbmcgdGhlIHNoaWZ0LXJlZ2lzdGVyIG1ldGhvZCBvZiBtdWx0aXBseWluZyBhbmQKKyAgdGFraW5nIHRoZSByZW1haW5kZXIuICBUaGUgcmVnaXN0ZXIgaXMgaW5pdGlhbGl6ZWQgdG8gemVybywgYW5kIGZvciBlYWNoCisgIGluY29taW5nIGJpdCwgeF4zMiBpcyBhZGRlZCBtb2QgcCB0byB0aGUgcmVnaXN0ZXIgaWYgdGhlIGJpdCBpcyBhIG9uZSAod2hlcmUKKyAgeF4zMiBtb2QgcCBpcyBwK3heMzIgPSB4XjI2Ky4uLisxKSwgYW5kIHRoZSByZWdpc3RlciBpcyBtdWx0aXBsaWVkIG1vZCBwIGJ5CisgIHggKHdoaWNoIGlzIHNoaWZ0aW5nIHJpZ2h0IGJ5IG9uZSBhbmQgYWRkaW5nIHheMzIgbW9kIHAgaWYgdGhlIGJpdCBzaGlmdGVkCisgIG91dCBpcyBhIG9uZSkuICBXZSBzdGFydCB3aXRoIHRoZSBoaWdoZXN0IHBvd2VyIChsZWFzdCBzaWduaWZpY2FudCBiaXQpIG9mCisgIHEgYW5kIHJlcGVhdCBmb3IgYWxsIGVpZ2h0IGJpdHMgb2YgcS4KKworICBUaGUgdGFibGUgaXMgc2ltcGx5IHRoZSBDUkMgb2YgYWxsIHBvc3NpYmxlIGVpZ2h0IGJpdCB2YWx1ZXMuICBUaGlzIGlzIGFsbAorICB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGdlbmVyYXRlIENSQydzIG9uIGRhdGEgYSBieXRlIGF0IGEgdGltZSBmb3IgYWxsCisgIGNvbWJpbmF0aW9ucyBvZiBDUkMgcmVnaXN0ZXIgdmFsdWVzIGFuZCBpbmNvbWluZyBieXRlcy4KKyovCitsb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlKCkKK3sKKyAgdUxvbmcgYzsKKyAgaW50IG4sIGs7CisgIHVMb25nIHBvbHk7ICAgICAgICAgICAgLyogcG9seW5vbWlhbCBleGNsdXNpdmUtb3IgcGF0dGVybiAqLworICAvKiB0ZXJtcyBvZiBwb2x5bm9taWFsIGRlZmluaW5nIHRoaXMgY3JjIChleGNlcHQgeF4zMik6ICovCisgIHN0YXRpYyBjb25zdCBCeXRlIHBbXSA9IHswLDEsMiw0LDUsNyw4LDEwLDExLDEyLDE2LDIyLDIzLDI2fTsKKworICAvKiBtYWtlIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuIGZyb20gcG9seW5vbWlhbCAoMHhlZGI4ODMyMEwpICovCisgIHBvbHkgPSAwTDsKKyAgZm9yIChuID0gMDsgbiA8IHNpemVvZihwKS9zaXplb2YoQnl0ZSk7IG4rKykKKyAgICBwb2x5IHw9IDFMIDw8ICgzMSAtIHBbbl0pOworIAorICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspCisgIHsKKyAgICBjID0gKHVMb25nKW47CisgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykKKyAgICAgIGMgPSBjICYgMSA/IHBvbHkgXiAoYyA+PiAxKSA6IGMgPj4gMTsKKyAgICBjcmNfdGFibGVbbl0gPSBjOworICB9CisgIGNyY190YWJsZV9lbXB0eSA9IDA7Cit9CisjZWxzZQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUYWJsZSBvZiBDUkMtMzIncyBvZiBhbGwgc2luZ2xlLWJ5dGUgdmFsdWVzIChtYWRlIGJ5IG1ha2VfY3JjX3RhYmxlKQorICovCitsb2NhbCBjb25zdCB1TG9uZ2YgY3JjX3RhYmxlWzI1Nl0gPSB7CisgIDB4MDAwMDAwMDBMLCAweDc3MDczMDk2TCwgMHhlZTBlNjEyY0wsIDB4OTkwOTUxYmFMLCAweDA3NmRjNDE5TCwKKyAgMHg3MDZhZjQ4ZkwsIDB4ZTk2M2E1MzVMLCAweDllNjQ5NWEzTCwgMHgwZWRiODgzMkwsIDB4NzlkY2I4YTRMLAorICAweGUwZDVlOTFlTCwgMHg5N2QyZDk4OEwsIDB4MDliNjRjMmJMLCAweDdlYjE3Y2JkTCwgMHhlN2I4MmQwN0wsCisgIDB4OTBiZjFkOTFMLCAweDFkYjcxMDY0TCwgMHg2YWIwMjBmMkwsIDB4ZjNiOTcxNDhMLCAweDg0YmU0MWRlTCwKKyAgMHgxYWRhZDQ3ZEwsIDB4NmRkZGU0ZWJMLCAweGY0ZDRiNTUxTCwgMHg4M2QzODVjN0wsIDB4MTM2Yzk4NTZMLAorICAweDY0NmJhOGMwTCwgMHhmZDYyZjk3YUwsIDB4OGE2NWM5ZWNMLCAweDE0MDE1YzRmTCwgMHg2MzA2NmNkOUwsCisgIDB4ZmEwZjNkNjNMLCAweDhkMDgwZGY1TCwgMHgzYjZlMjBjOEwsIDB4NGM2OTEwNWVMLCAweGQ1NjA0MWU0TCwKKyAgMHhhMjY3NzE3MkwsIDB4M2MwM2U0ZDFMLCAweDRiMDRkNDQ3TCwgMHhkMjBkODVmZEwsIDB4YTUwYWI1NmJMLAorICAweDM1YjVhOGZhTCwgMHg0MmIyOTg2Y0wsIDB4ZGJiYmM5ZDZMLCAweGFjYmNmOTQwTCwgMHgzMmQ4NmNlM0wsCisgIDB4NDVkZjVjNzVMLCAweGRjZDYwZGNmTCwgMHhhYmQxM2Q1OUwsIDB4MjZkOTMwYWNMLCAweDUxZGUwMDNhTCwKKyAgMHhjOGQ3NTE4MEwsIDB4YmZkMDYxMTZMLCAweDIxYjRmNGI1TCwgMHg1NmIzYzQyM0wsIDB4Y2ZiYTk1OTlMLAorICAweGI4YmRhNTBmTCwgMHgyODAyYjg5ZUwsIDB4NWYwNTg4MDhMLCAweGM2MGNkOWIyTCwgMHhiMTBiZTkyNEwsCisgIDB4MmY2ZjdjODdMLCAweDU4Njg0YzExTCwgMHhjMTYxMWRhYkwsIDB4YjY2NjJkM2RMLCAweDc2ZGM0MTkwTCwKKyAgMHgwMWRiNzEwNkwsIDB4OThkMjIwYmNMLCAweGVmZDUxMDJhTCwgMHg3MWIxODU4OUwsIDB4MDZiNmI1MWZMLAorICAweDlmYmZlNGE1TCwgMHhlOGI4ZDQzM0wsIDB4NzgwN2M5YTJMLCAweDBmMDBmOTM0TCwgMHg5NjA5YTg4ZUwsCisgIDB4ZTEwZTk4MThMLCAweDdmNmEwZGJiTCwgMHgwODZkM2QyZEwsIDB4OTE2NDZjOTdMLCAweGU2NjM1YzAxTCwKKyAgMHg2YjZiNTFmNEwsIDB4MWM2YzYxNjJMLCAweDg1NjUzMGQ4TCwgMHhmMjYyMDA0ZUwsIDB4NmMwNjk1ZWRMLAorICAweDFiMDFhNTdiTCwgMHg4MjA4ZjRjMUwsIDB4ZjUwZmM0NTdMLCAweDY1YjBkOWM2TCwgMHgxMmI3ZTk1MEwsCisgIDB4OGJiZWI4ZWFMLCAweGZjYjk4ODdjTCwgMHg2MmRkMWRkZkwsIDB4MTVkYTJkNDlMLCAweDhjZDM3Y2YzTCwKKyAgMHhmYmQ0NGM2NUwsIDB4NGRiMjYxNThMLCAweDNhYjU1MWNlTCwgMHhhM2JjMDA3NEwsIDB4ZDRiYjMwZTJMLAorICAweDRhZGZhNTQxTCwgMHgzZGQ4OTVkN0wsIDB4YTRkMWM0NmRMLCAweGQzZDZmNGZiTCwgMHg0MzY5ZTk2YUwsCisgIDB4MzQ2ZWQ5ZmNMLCAweGFkNjc4ODQ2TCwgMHhkYTYwYjhkMEwsIDB4NDQwNDJkNzNMLCAweDMzMDMxZGU1TCwKKyAgMHhhYTBhNGM1ZkwsIDB4ZGQwZDdjYzlMLCAweDUwMDU3MTNjTCwgMHgyNzAyNDFhYUwsIDB4YmUwYjEwMTBMLAorICAweGM5MGMyMDg2TCwgMHg1NzY4YjUyNUwsIDB4MjA2Zjg1YjNMLCAweGI5NjZkNDA5TCwgMHhjZTYxZTQ5ZkwsCisgIDB4NWVkZWY5MGVMLCAweDI5ZDljOTk4TCwgMHhiMGQwOTgyMkwsIDB4YzdkN2E4YjRMLCAweDU5YjMzZDE3TCwKKyAgMHgyZWI0MGQ4MUwsIDB4YjdiZDVjM2JMLCAweGMwYmE2Y2FkTCwgMHhlZGI4ODMyMEwsIDB4OWFiZmIzYjZMLAorICAweDAzYjZlMjBjTCwgMHg3NGIxZDI5YUwsIDB4ZWFkNTQ3MzlMLCAweDlkZDI3N2FmTCwgMHgwNGRiMjYxNUwsCisgIDB4NzNkYzE2ODNMLCAweGUzNjMwYjEyTCwgMHg5NDY0M2I4NEwsIDB4MGQ2ZDZhM2VMLCAweDdhNmE1YWE4TCwKKyAgMHhlNDBlY2YwYkwsIDB4OTMwOWZmOWRMLCAweDBhMDBhZTI3TCwgMHg3ZDA3OWViMUwsIDB4ZjAwZjkzNDRMLAorICAweDg3MDhhM2QyTCwgMHgxZTAxZjI2OEwsIDB4NjkwNmMyZmVMLCAweGY3NjI1NzVkTCwgMHg4MDY1NjdjYkwsCisgIDB4MTk2YzM2NzFMLCAweDZlNmIwNmU3TCwgMHhmZWQ0MWI3NkwsIDB4ODlkMzJiZTBMLCAweDEwZGE3YTVhTCwKKyAgMHg2N2RkNGFjY0wsIDB4ZjliOWRmNmZMLCAweDhlYmVlZmY5TCwgMHgxN2I3YmU0M0wsIDB4NjBiMDhlZDVMLAorICAweGQ2ZDZhM2U4TCwgMHhhMWQxOTM3ZUwsIDB4MzhkOGMyYzRMLCAweDRmZGZmMjUyTCwgMHhkMWJiNjdmMUwsCisgIDB4YTZiYzU3NjdMLCAweDNmYjUwNmRkTCwgMHg0OGIyMzY0YkwsIDB4ZDgwZDJiZGFMLCAweGFmMGExYjRjTCwKKyAgMHgzNjAzNGFmNkwsIDB4NDEwNDdhNjBMLCAweGRmNjBlZmMzTCwgMHhhODY3ZGY1NUwsIDB4MzE2ZThlZWZMLAorICAweDQ2NjliZTc5TCwgMHhjYjYxYjM4Y0wsIDB4YmM2NjgzMWFMLCAweDI1NmZkMmEwTCwgMHg1MjY4ZTIzNkwsCisgIDB4Y2MwYzc3OTVMLCAweGJiMGI0NzAzTCwgMHgyMjAyMTZiOUwsIDB4NTUwNTI2MmZMLCAweGM1YmEzYmJlTCwKKyAgMHhiMmJkMGIyOEwsIDB4MmJiNDVhOTJMLCAweDVjYjM2YTA0TCwgMHhjMmQ3ZmZhN0wsIDB4YjVkMGNmMzFMLAorICAweDJjZDk5ZThiTCwgMHg1YmRlYWUxZEwsIDB4OWI2NGMyYjBMLCAweGVjNjNmMjI2TCwgMHg3NTZhYTM5Y0wsCisgIDB4MDI2ZDkzMGFMLCAweDljMDkwNmE5TCwgMHhlYjBlMzYzZkwsIDB4NzIwNzY3ODVMLCAweDA1MDA1NzEzTCwKKyAgMHg5NWJmNGE4MkwsIDB4ZTJiODdhMTRMLCAweDdiYjEyYmFlTCwgMHgwY2I2MWIzOEwsIDB4OTJkMjhlOWJMLAorICAweGU1ZDViZTBkTCwgMHg3Y2RjZWZiN0wsIDB4MGJkYmRmMjFMLCAweDg2ZDNkMmQ0TCwgMHhmMWQ0ZTI0MkwsCisgIDB4NjhkZGIzZjhMLCAweDFmZGE4MzZlTCwgMHg4MWJlMTZjZEwsIDB4ZjZiOTI2NWJMLCAweDZmYjA3N2UxTCwKKyAgMHgxOGI3NDc3N0wsIDB4ODgwODVhZTZMLCAweGZmMGY2YTcwTCwgMHg2NjA2M2JjYUwsIDB4MTEwMTBiNWNMLAorICAweDhmNjU5ZWZmTCwgMHhmODYyYWU2OUwsIDB4NjE2YmZmZDNMLCAweDE2NmNjZjQ1TCwgMHhhMDBhZTI3OEwsCisgIDB4ZDcwZGQyZWVMLCAweDRlMDQ4MzU0TCwgMHgzOTAzYjNjMkwsIDB4YTc2NzI2NjFMLCAweGQwNjAxNmY3TCwKKyAgMHg0OTY5NDc0ZEwsIDB4M2U2ZTc3ZGJMLCAweGFlZDE2YTRhTCwgMHhkOWQ2NWFkY0wsIDB4NDBkZjBiNjZMLAorICAweDM3ZDgzYmYwTCwgMHhhOWJjYWU1M0wsIDB4ZGViYjllYzVMLCAweDQ3YjJjZjdmTCwgMHgzMGI1ZmZlOUwsCisgIDB4YmRiZGYyMWNMLCAweGNhYmFjMjhhTCwgMHg1M2IzOTMzMEwsIDB4MjRiNGEzYTZMLCAweGJhZDAzNjA1TCwKKyAgMHhjZGQ3MDY5M0wsIDB4NTRkZTU3MjlMLCAweDIzZDk2N2JmTCwgMHhiMzY2N2EyZUwsIDB4YzQ2MTRhYjhMLAorICAweDVkNjgxYjAyTCwgMHgyYTZmMmI5NEwsIDB4YjQwYmJlMzdMLCAweGMzMGM4ZWExTCwgMHg1YTA1ZGYxYkwsCisgIDB4MmQwMmVmOGRMCit9OworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgYXNtIHZlcnNpb25zIG9mIGNyYzMyKCkKKyAqLworY29uc3QgdUxvbmdmICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlKCkKK3sKKyNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorICBpZiAoY3JjX3RhYmxlX2VtcHR5KSBtYWtlX2NyY190YWJsZSgpOworI2VuZGlmCisgIHJldHVybiAoY29uc3QgdUxvbmdmICopY3JjX3RhYmxlOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIERPMShidWYpIGNyYyA9IGNyY190YWJsZVsoKGludCljcmMgXiAoKmJ1ZisrKSkgJiAweGZmXSBeIChjcmMgPj4gOCk7CisjZGVmaW5lIERPMihidWYpICBETzEoYnVmKTsgRE8xKGJ1Zik7CisjZGVmaW5lIERPNChidWYpICBETzIoYnVmKTsgRE8yKGJ1Zik7CisjZGVmaW5lIERPOChidWYpICBETzQoYnVmKTsgRE80KGJ1Zik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VMb25nIFpFWFBPUlQgY3JjMzIoY3JjLCBidWYsIGxlbikKKyAgICB1TG9uZyBjcmM7CisgICAgY29uc3QgQnl0ZWYgKmJ1ZjsKKyAgICB1SW50IGxlbjsKK3sKKyAgICBpZiAoYnVmID09IFpfTlVMTCkgcmV0dXJuIDBMOworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisgICAgaWYgKGNyY190YWJsZV9lbXB0eSkKKyAgICAgIG1ha2VfY3JjX3RhYmxlKCk7CisjZW5kaWYKKyAgICBjcmMgPSBjcmMgXiAweGZmZmZmZmZmTDsKKyAgICB3aGlsZSAobGVuID49IDgpCisgICAgeworICAgICAgRE84KGJ1Zik7CisgICAgICBsZW4gLT0gODsKKyAgICB9CisgICAgaWYgKGxlbikgZG8geworICAgICAgRE8xKGJ1Zik7CisgICAgfSB3aGlsZSAoLS1sZW4pOworICAgIHJldHVybiBjcmMgXiAweGZmZmZmZmZmTDsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2RlZmxhdGUuYyBiL2NvbW1vbi96bGliL2RlZmxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E1OTBjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvZGVmbGF0ZS5jCkBAIC0wLDAgKzEsMTM1MCBAQAorLyogZGVmbGF0ZS5jIC0tIGNvbXByZXNzIGRhdGEgdXNpbmcgdGhlIGRlZmxhdGlvbiBhbGdvcml0aG0KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKy8qCisgKiAgQUxHT1JJVEhNCisgKgorICogICAgICBUaGUgImRlZmxhdGlvbiIgcHJvY2VzcyBkZXBlbmRzIG9uIGJlaW5nIGFibGUgdG8gaWRlbnRpZnkgcG9ydGlvbnMKKyAqICAgICAgb2YgdGhlIGlucHV0IHRleHQgd2hpY2ggYXJlIGlkZW50aWNhbCB0byBlYXJsaWVyIGlucHV0ICh3aXRoaW4gYQorICogICAgICBzbGlkaW5nIHdpbmRvdyB0cmFpbGluZyBiZWhpbmQgdGhlIGlucHV0IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQpLgorICoKKyAqICAgICAgVGhlIG1vc3Qgc3RyYWlnaHRmb3J3YXJkIHRlY2huaXF1ZSB0dXJucyBvdXQgdG8gYmUgdGhlIGZhc3Rlc3QgZm9yCisgKiAgICAgIG1vc3QgaW5wdXQgZmlsZXM6IHRyeSBhbGwgcG9zc2libGUgbWF0Y2hlcyBhbmQgc2VsZWN0IHRoZSBsb25nZXN0LgorICogICAgICBUaGUga2V5IGZlYXR1cmUgb2YgdGhpcyBhbGdvcml0aG0gaXMgdGhhdCBpbnNlcnRpb25zIGludG8gdGhlIHN0cmluZworICogICAgICBkaWN0aW9uYXJ5IGFyZSB2ZXJ5IHNpbXBsZSBhbmQgdGh1cyBmYXN0LCBhbmQgZGVsZXRpb25zIGFyZSBhdm9pZGVkCisgKiAgICAgIGNvbXBsZXRlbHkuIEluc2VydGlvbnMgYXJlIHBlcmZvcm1lZCBhdCBlYWNoIGlucHV0IGNoYXJhY3Rlciwgd2hlcmVhcworICogICAgICBzdHJpbmcgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkIG9ubHkgd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggZW5kcy4gU28gaXQKKyAqICAgICAgaXMgcHJlZmVyYWJsZSB0byBzcGVuZCBtb3JlIHRpbWUgaW4gbWF0Y2hlcyB0byBhbGxvdyB2ZXJ5IGZhc3Qgc3RyaW5nCisgKiAgICAgIGluc2VydGlvbnMgYW5kIGF2b2lkIGRlbGV0aW9ucy4gVGhlIG1hdGNoaW5nIGFsZ29yaXRobSBmb3Igc21hbGwKKyAqICAgICAgc3RyaW5ncyBpcyBpbnNwaXJlZCBmcm9tIHRoYXQgb2YgUmFiaW4gJiBLYXJwLiBBIGJydXRlIGZvcmNlIGFwcHJvYWNoCisgKiAgICAgIGlzIHVzZWQgdG8gZmluZCBsb25nZXIgc3RyaW5ncyB3aGVuIGEgc21hbGwgbWF0Y2ggaGFzIGJlZW4gZm91bmQuCisgKiAgICAgIEEgc2ltaWxhciBhbGdvcml0aG0gaXMgdXNlZCBpbiBjb21pYyAoYnkgSmFuLU1hcmsgV2FtcykgYW5kIGZyZWV6ZQorICogICAgICAoYnkgTGVvbmlkIEJyb3VraGlzKS4KKyAqICAgICAgICAgQSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1c2VkIGEgbW9yZSBzb3BoaXN0aWNhdGVkIGFsZ29yaXRobQorICogICAgICAoYnkgRmlhbGEgYW5kIEdyZWVuZSkgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW4gaW4gbGluZWFyIGFtb3J0aXplZAorICogICAgICB0aW1lLCBidXQgaGFzIGEgbGFyZ2VyIGF2ZXJhZ2UgY29zdCwgdXNlcyBtb3JlIG1lbW9yeSBhbmQgaXMgcGF0ZW50ZWQuCisgKiAgICAgIEhvd2V2ZXIgdGhlIEYmRyBhbGdvcml0aG0gbWF5IGJlIGZhc3RlciBmb3Igc29tZSBoaWdobHkgcmVkdW5kYW50CisgKiAgICAgIGZpbGVzIGlmIHRoZSBwYXJhbWV0ZXIgbWF4X2NoYWluX2xlbmd0aCAoZGVzY3JpYmVkIGJlbG93KSBpcyB0b28gbGFyZ2UuCisgKgorICogIEFDS05PV0xFREdFTUVOVFMKKyAqCisgKiAgICAgIFRoZSBpZGVhIG9mIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGlzIGR1ZSB0byBKYW4tTWFyayBXYW1zLCBhbmQKKyAqICAgICAgSSBmb3VuZCBpdCBpbiAnZnJlZXplJyB3cml0dGVuIGJ5IExlb25pZCBCcm91a2hpcy4KKyAqICAgICAgVGhhbmtzIHRvIG1hbnkgcGVvcGxlIGZvciBidWcgcmVwb3J0cyBhbmQgdGVzdGluZy4KKyAqCisgKiAgUkVGRVJFTkNFUworICoKKyAqICAgICAgRGV1dHNjaCwgTC5QLiwiREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24iLgorICogICAgICBBdmFpbGFibGUgaW4gZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMxOTUxLnR4dAorICoKKyAqICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGUgUmFiaW4gYW5kIEthcnAgYWxnb3JpdGhtIGlzIGdpdmVuIGluIHRoZSBib29rCisgKiAgICAgICAgICJBbGdvcml0aG1zIiBieSBSLiBTZWRnZXdpY2ssIEFkZGlzb24tV2VzbGV5LCBwMjUyLgorICoKKyAqICAgICAgRmlhbGEsRS5SLiwgYW5kIEdyZWVuZSxELkguCisgKiAgICAgICAgIERhdGEgQ29tcHJlc3Npb24gd2l0aCBGaW5pdGUgV2luZG93cywgQ29tbS5BQ00sIDMyLDQgKDE5ODkpIDQ5MC01OTUKKyAqCisgKi8KKworLyogQCgjKSAkSWQ6IGRlZmxhdGUuYyx2IDEuMSAyMDA0LzEwLzA4IDA5OjQ0OjI0IGNvbnN0X2sgRXhwICQgKi8KKworI2luY2x1ZGUgImRlZmxhdGUuaCIKKworY29uc3QgY2hhciBkZWZsYXRlX2NvcHlyaWdodFtdID0KKyAgICIgZGVmbGF0ZSAxLjEuNCBDb3B5cmlnaHQgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkgIjsKKy8qCisgIElmIHlvdSB1c2UgdGhlIHpsaWIgbGlicmFyeSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGlzIHdlbGNvbWUKKyAgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBwcm9kdWN0LiBJZiBmb3Igc29tZSByZWFzb24geW91IGNhbm5vdAorICBpbmNsdWRlIHN1Y2ggYW4gYWNrbm93bGVkZ21lbnQsIEkgd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBrZWVwIHRoaXMKKyAgY29weXJpZ2h0IHN0cmluZyBpbiB0aGUgZXhlY3V0YWJsZSBvZiB5b3VyIHByb2R1Y3QuCisgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgRnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBuZWVkX21vcmUsICAgICAgLyogYmxvY2sgbm90IGNvbXBsZXRlZCwgbmVlZCBtb3JlIGlucHV0IG9yIG1vcmUgb3V0cHV0ICovCisgICAgYmxvY2tfZG9uZSwgICAgIC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqLworICAgIGZpbmlzaF9zdGFydGVkLCAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqLworICAgIGZpbmlzaF9kb25lICAgICAvKiBmaW5pc2ggZG9uZSwgYWNjZXB0IG5vIG1vcmUgaW5wdXQgb3Igb3V0cHV0ICovCit9IGJsb2NrX3N0YXRlOworCit0eXBlZGVmIGJsb2NrX3N0YXRlICgqY29tcHJlc3NfZnVuYykgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworLyogQ29tcHJlc3Npb24gZnVuY3Rpb24uIFJldHVybnMgdGhlIGJsb2NrIHN0YXRlIGFmdGVyIHRoZSBjYWxsLiAqLworCitsb2NhbCB2b2lkIGZpbGxfd2luZG93ICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3N0b3JlZCBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Citsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2Zhc3QgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Citsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3cgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Citsb2NhbCB2b2lkIGxtX2luaXQgICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCB2b2lkIHB1dFNob3J0TVNCICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB1SW50IGIpKTsKK2xvY2FsIHZvaWQgZmx1c2hfcGVuZGluZyAgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Citsb2NhbCBpbnQgcmVhZF9idWYgICAgICAgIE9GKCh6X3N0cmVhbXAgc3RybSwgQnl0ZWYgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkpOworI2lmZGVmIEFTTVYKKyAgICAgIHZvaWQgbWF0Y2hfaW5pdCBPRigodm9pZCkpOyAvKiBhc20gY29kZSBpbml0aWFsaXphdGlvbiAqLworICAgICAgdUludCBsb25nZXN0X21hdGNoICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBjdXJfbWF0Y2gpKTsKKyNlbHNlCitsb2NhbCB1SW50IGxvbmdlc3RfbWF0Y2ggIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIGN1cl9tYXRjaCkpOworI2VuZGlmCisKKyNpZmRlZiBERUJVRworbG9jYWwgIHZvaWQgY2hlY2tfbWF0Y2ggT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkpOworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgZGF0YQorICovCisKKyNkZWZpbmUgTklMIDAKKy8qIFRhaWwgb2YgaGFzaCBjaGFpbnMgKi8KKworI2lmbmRlZiBUT09fRkFSCisjICBkZWZpbmUgVE9PX0ZBUiA0MDk2CisjZW5kaWYKKy8qIE1hdGNoZXMgb2YgbGVuZ3RoIDMgYXJlIGRpc2NhcmRlZCBpZiB0aGVpciBkaXN0YW5jZSBleGNlZWRzIFRPT19GQVIgKi8KKworI2RlZmluZSBNSU5fTE9PS0FIRUFEIChNQVhfTUFUQ0grTUlOX01BVENIKzEpCisvKiBNaW5pbXVtIGFtb3VudCBvZiBsb29rYWhlYWQsIGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgorICogU2VlIGRlZmxhdGUuYyBmb3IgY29tbWVudHMgYWJvdXQgdGhlIE1JTl9NQVRDSCsxLgorICovCisKKy8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvbgorICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvCisgKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmUKKyAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY29uZmlnX3MgeworICAgdXNoIGdvb2RfbGVuZ3RoOyAvKiByZWR1Y2UgbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBtYXhfbGF6eTsgICAgLyogZG8gbm90IHBlcmZvcm0gbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBuaWNlX2xlbmd0aDsgLyogcXVpdCBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBtYXhfY2hhaW47CisgICBjb21wcmVzc19mdW5jIGZ1bmM7Cit9IGNvbmZpZzsKKworbG9jYWwgY29uc3QgY29uZmlnIGNvbmZpZ3VyYXRpb25fdGFibGVbMTBdID0geworLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqLworLyogMCAqLyB7MCwgICAgMCwgIDAsICAgIDAsIGRlZmxhdGVfc3RvcmVkfSwgIC8qIHN0b3JlIG9ubHkgKi8KKy8qIDEgKi8gezQsICAgIDQsICA4LCAgICA0LCBkZWZsYXRlX2Zhc3R9LCAvKiBtYXhpbXVtIHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KKy8qIDIgKi8gezQsICAgIDUsIDE2LCAgICA4LCBkZWZsYXRlX2Zhc3R9LAorLyogMyAqLyB7NCwgICAgNiwgMzIsICAgMzIsIGRlZmxhdGVfZmFzdH0sCisKKy8qIDQgKi8gezQsICAgIDQsIDE2LCAgIDE2LCBkZWZsYXRlX3Nsb3d9LCAgLyogbGF6eSBtYXRjaGVzICovCisvKiA1ICovIHs4LCAgIDE2LCAzMiwgICAzMiwgZGVmbGF0ZV9zbG93fSwKKy8qIDYgKi8gezgsICAgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3d9LAorLyogNyAqLyB7OCwgICAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvd30sCisvKiA4ICovIHszMiwgMTI4LCAyNTgsIDEwMjQsIGRlZmxhdGVfc2xvd30sCisvKiA5ICovIHszMiwgMjU4LCAyNTgsIDQwOTYsIGRlZmxhdGVfc2xvd319OyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uICovCisKKy8qIE5vdGU6IHRoZSBkZWZsYXRlKCkgY29kZSByZXF1aXJlcyBtYXhfbGF6eSA+PSBNSU5fTUFUQ0ggYW5kIG1heF9jaGFpbiA+PSA0CisgKiBGb3IgZGVmbGF0ZV9mYXN0KCkgKGxldmVscyA8PSAzKSBnb29kIGlzIGlnbm9yZWQgYW5kIGxhenkgaGFzIGEgZGlmZmVyZW50CisgKiBtZWFuaW5nLgorICovCisKKyNkZWZpbmUgRVFVQUwgMAorLyogcmVzdWx0IG9mIG1lbWNtcCBmb3IgZXF1YWwgc3RyaW5ncyAqLworCitzdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBhIGhhc2ggdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgYnl0ZQorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIHRvIFVQREFURV9IQVNIIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMsIHNvIHRoYXQgYSBydW5uaW5nIGhhc2gga2V5IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZQorICogICAgcHJldmlvdXMga2V5IGluc3RlYWQgb2YgY29tcGxldGUgcmVjYWxjdWxhdGlvbiBlYWNoIHRpbWUuCisgKi8KKyNkZWZpbmUgVVBEQVRFX0hBU0gocyxoLGMpIChoID0gKCgoaCk8PHMtPmhhc2hfc2hpZnQpIF4gKGMpKSAmIHMtPmhhc2hfbWFzaykKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluc2VydCBzdHJpbmcgc3RyIGluIHRoZSBkaWN0aW9uYXJ5IGFuZCBzZXQgbWF0Y2hfaGVhZCB0byB0aGUgcHJldmlvdXMgaGVhZAorICogb2YgdGhlIGhhc2ggY2hhaW4gKHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgd2l0aCBzYW1lIGhhc2gga2V5KS4gUmV0dXJuCisgKiB0aGUgcHJldmlvdXMgbGVuZ3RoIG9mIHRoZSBoYXNoIGNoYWluLgorICogSWYgdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggLURGQVNURVNULCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgZm9yY2VkCisgKiB0byAxLCBhbmQgbm8gaGFzaCBjaGFpbnMgYXJlIG1haW50YWluZWQuCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCisgKiAgICBpbnB1dCBjaGFyYWN0ZXJzIGFuZCB0aGUgZmlyc3QgTUlOX01BVENIIGJ5dGVzIG9mIHN0ciBhcmUgdmFsaWQKKyAqICAgIChleGNlcHQgZm9yIHRoZSBsYXN0IE1JTl9NQVRDSC0xIGJ5dGVzIG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAqLworI2lmZGVmIEZBU1RFU1QKKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKKyAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCisgICAgbWF0Y2hfaGVhZCA9IHMtPmhlYWRbcy0+aW5zX2hdLCBcCisgICAgcy0+aGVhZFtzLT5pbnNfaF0gPSAoUG9zKShzdHIpKQorI2Vsc2UKKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKKyAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCisgICAgcy0+cHJldlsoc3RyKSAmIHMtPndfbWFza10gPSBtYXRjaF9oZWFkID0gcy0+aGVhZFtzLT5pbnNfaF0sIFwKKyAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3MpKHN0cikpCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIChhdm9pZGluZyA2NEsgb3ZlcmZsb3cgZm9yIDE2IGJpdCBzeXN0ZW1zKS4KKyAqIHByZXZbXSB3aWxsIGJlIGluaXRpYWxpemVkIG9uIHRoZSBmbHkuCisgKi8KKyNkZWZpbmUgQ0xFQVJfSEFTSChzKSBcCisgICAgcy0+aGVhZFtzLT5oYXNoX3NpemUtMV0gPSBOSUw7IFwKKyAgICB6bWVtemVybygoQnl0ZWYgKilzLT5oZWFkLCAodW5zaWduZWQpKHMtPmhhc2hfc2l6ZS0xKSpzaXplb2YoKnMtPmhlYWQpKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfKHN0cm0sIGxldmVsLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgbGV2ZWw7CisgICAgY29uc3QgY2hhciAqdmVyc2lvbjsKKyAgICBpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgcmV0dXJuIGRlZmxhdGVJbml0Ml8oc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIE1BWF9XQklUUywgREVGX01FTV9MRVZFTCwKKwkJCSBaX0RFRkFVTFRfU1RSQVRFR1ksIHZlcnNpb24sIHN0cmVhbV9zaXplKTsKKyAgICAvKiBUbyBkbzogaWdub3JlIHN0cm0tPm5leHRfaW4gaWYgd2UgdXNlIGl0IGFzIHdpbmRvdyAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwKKwkJICB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgIGxldmVsOworICAgIGludCAgbWV0aG9kOworICAgIGludCAgd2luZG93Qml0czsKKyAgICBpbnQgIG1lbUxldmVsOworICAgIGludCAgc3RyYXRlZ3k7CisgICAgY29uc3QgY2hhciAqdmVyc2lvbjsKKyAgICBpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgbm9oZWFkZXIgPSAwOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBteV92ZXJzaW9uID0gWkxJQl9WRVJTSU9OOworCisgICAgdXNoZiAqb3ZlcmxheTsKKyAgICAvKiBXZSBvdmVybGF5IHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1Zi4gVGhpcyB3b3JrcyBzaW5jZSB0aGUgYXZlcmFnZQorICAgICAqIG91dHB1dCBzaXplIGZvciAobGVuZ3RoLGRpc3RhbmNlKSBjb2RlcyBpcyA8PSAyNCBiaXRzLgorICAgICAqLworCisgICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gbXlfdmVyc2lvblswXSB8fAorICAgICAgICBzdHJlYW1fc2l6ZSAhPSBzaXplb2Yoel9zdHJlYW0pKSB7CisJcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7CisgICAgaWYgKHN0cm0tPnphbGxvYyA9PSBaX05VTEwpIHsKKwlzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOworCXN0cm0tPm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICB9CisgICAgaWYgKHN0cm0tPnpmcmVlID09IFpfTlVMTCkgc3RybS0+emZyZWUgPSB6Y2ZyZWU7CisKKyAgICBpZiAobGV2ZWwgPT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSBsZXZlbCA9IDY7CisjaWZkZWYgRkFTVEVTVAorICAgIGxldmVsID0gMTsKKyNlbmRpZgorCisgICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7IC8qIHVuZG9jdW1lbnRlZCBmZWF0dXJlOiBzdXBwcmVzcyB6bGliIGhlYWRlciAqLworICAgICAgICBub2hlYWRlciA9IDE7CisgICAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsKKyAgICB9CisgICAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9IFpfREVGTEFURUQgfHwKKyAgICAgICAgd2luZG93Qml0cyA8IDkgfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHwKKwlzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0hVRkZNQU5fT05MWSkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0Moc3RybSwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAocyA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopczsKKyAgICBzLT5zdHJtID0gc3RybTsKKworICAgIHMtPm5vaGVhZGVyID0gbm9oZWFkZXI7CisgICAgcy0+d19iaXRzID0gd2luZG93Qml0czsKKyAgICBzLT53X3NpemUgPSAxIDw8IHMtPndfYml0czsKKyAgICBzLT53X21hc2sgPSBzLT53X3NpemUgLSAxOworCisgICAgcy0+aGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3OworICAgIHMtPmhhc2hfc2l6ZSA9IDEgPDwgcy0+aGFzaF9iaXRzOworICAgIHMtPmhhc2hfbWFzayA9IHMtPmhhc2hfc2l6ZSAtIDE7CisgICAgcy0+aGFzaF9zaGlmdCA9ICAoKHMtPmhhc2hfYml0cytNSU5fTUFUQ0gtMSkvTUlOX01BVENIKTsKKworICAgIHMtPndpbmRvdyA9IChCeXRlZiAqKSBaQUxMT0Moc3RybSwgcy0+d19zaXplLCAyKnNpemVvZihCeXRlKSk7CisgICAgcy0+cHJldiAgID0gKFBvc2YgKikgIFpBTExPQyhzdHJtLCBzLT53X3NpemUsIHNpemVvZihQb3MpKTsKKyAgICBzLT5oZWFkICAgPSAoUG9zZiAqKSAgWkFMTE9DKHN0cm0sIHMtPmhhc2hfc2l6ZSwgc2l6ZW9mKFBvcykpOworCisgICAgcy0+bGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqLworCisgICAgb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7CisgICAgcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5OworICAgIHMtPnBlbmRpbmdfYnVmX3NpemUgPSAodWxnKXMtPmxpdF9idWZzaXplICogKHNpemVvZih1c2gpKzJMKTsKKworICAgIGlmIChzLT53aW5kb3cgPT0gWl9OVUxMIHx8IHMtPnByZXYgPT0gWl9OVUxMIHx8IHMtPmhlYWQgPT0gWl9OVUxMIHx8CisgICAgICAgIHMtPnBlbmRpbmdfYnVmID09IFpfTlVMTCkgeworICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciopRVJSX01TRyhaX01FTV9FUlJPUik7CisgICAgICAgIGRlZmxhdGVFbmQgKHN0cm0pOworICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgfQorICAgIHMtPmRfYnVmID0gb3ZlcmxheSArIHMtPmxpdF9idWZzaXplL3NpemVvZih1c2gpOworICAgIHMtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7CisKKyAgICBzLT5sZXZlbCA9IGxldmVsOworICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgcy0+bWV0aG9kID0gKEJ5dGUpbWV0aG9kOworCisgICAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVNldERpY3Rpb25hcnkgKHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnk7CisgICAgdUludCAgZGljdExlbmd0aDsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVJbnQgbGVuZ3RoID0gZGljdExlbmd0aDsKKyAgICB1SW50IG47CisgICAgSVBvcyBoYXNoX2hlYWQgPSAwOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBkaWN0aW9uYXJ5ID09IFpfTlVMTCB8fAorICAgICAgICBzdHJtLT5zdGF0ZS0+c3RhdHVzICE9IElOSVRfU1RBVEUpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKyAgICBzdHJtLT5hZGxlciA9IGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOworCisgICAgaWYgKGxlbmd0aCA8IE1JTl9NQVRDSCkgcmV0dXJuIFpfT0s7CisgICAgaWYgKGxlbmd0aCA+IE1BWF9ESVNUKHMpKSB7CisJbGVuZ3RoID0gTUFYX0RJU1Qocyk7CisjaWZuZGVmIFVTRV9ESUNUX0hFQUQKKwlkaWN0aW9uYXJ5ICs9IGRpY3RMZW5ndGggLSBsZW5ndGg7IC8qIHVzZSB0aGUgdGFpbCBvZiB0aGUgZGljdGlvbmFyeSAqLworI2VuZGlmCisgICAgfQorICAgIHptZW1jcHkocy0+d2luZG93LCBkaWN0aW9uYXJ5LCBsZW5ndGgpOworICAgIHMtPnN0cnN0YXJ0ID0gbGVuZ3RoOworICAgIHMtPmJsb2NrX3N0YXJ0ID0gKGxvbmcpbGVuZ3RoOworCisgICAgLyogSW5zZXJ0IGFsbCBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIChleGNlcHQgZm9yIHRoZSBsYXN0IHR3byBieXRlcykuCisgICAgICogcy0+bG9va2FoZWFkIHN0YXlzIG51bGwsIHNvIHMtPmluc19oIHdpbGwgYmUgcmVjb21wdXRlZCBhdCB0aGUgbmV4dAorICAgICAqIGNhbGwgb2YgZmlsbF93aW5kb3cuCisgICAgICovCisgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbMF07CisgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1sxXSk7CisgICAgZm9yIChuID0gMDsgbiA8PSBsZW5ndGggLSBNSU5fTUFUQ0g7IG4rKykgeworCUlOU0VSVF9TVFJJTkcocywgbiwgaGFzaF9oZWFkKTsKKyAgICB9CisgICAgaWYgKGhhc2hfaGVhZCkgaGFzaF9oZWFkID0gMDsgIC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IChzdHJtKQorICAgIHpfc3RyZWFtcCBzdHJtOworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAorICAgICAgICBzdHJtLT56YWxsb2MgPT0gWl9OVUxMIHx8IHN0cm0tPnpmcmVlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgc3RybS0+dG90YWxfaW4gPSBzdHJtLT50b3RhbF9vdXQgPSAwOworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsgLyogdXNlIHpmcmVlIGlmIHdlIGV2ZXIgYWxsb2NhdGUgbXNnIGR5bmFtaWNhbGx5ICovCisgICAgc3RybS0+ZGF0YV90eXBlID0gWl9VTktOT1dOOworCisgICAgcyA9IChkZWZsYXRlX3N0YXRlICopc3RybS0+c3RhdGU7CisgICAgcy0+cGVuZGluZyA9IDA7CisgICAgcy0+cGVuZGluZ19vdXQgPSBzLT5wZW5kaW5nX2J1ZjsKKworICAgIGlmIChzLT5ub2hlYWRlciA8IDApIHsKKyAgICAgICAgcy0+bm9oZWFkZXIgPSAwOyAvKiB3YXMgc2V0IHRvIC0xIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovCisgICAgfQorICAgIHMtPnN0YXR1cyA9IHMtPm5vaGVhZGVyID8gQlVTWV9TVEFURSA6IElOSVRfU1RBVEU7CisgICAgc3RybS0+YWRsZXIgPSAxOworICAgIHMtPmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIOworCisgICAgX3RyX2luaXQocyk7CisgICAgbG1faW5pdChzKTsKKworICAgIHJldHVybiBaX09LOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlUGFyYW1zKHN0cm0sIGxldmVsLCBzdHJhdGVneSkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgbGV2ZWw7CisgICAgaW50IHN0cmF0ZWd5OworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY29tcHJlc3NfZnVuYyBmdW5jOworICAgIGludCBlcnIgPSBaX09LOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKworICAgIGlmIChsZXZlbCA9PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHsKKwlsZXZlbCA9IDY7CisgICAgfQorICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8IHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfSFVGRk1BTl9PTkxZKSB7CisJcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBmdW5jID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYzsKKworICAgIGlmIChmdW5jICE9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmZ1bmMgJiYgc3RybS0+dG90YWxfaW4gIT0gMCkgeworCS8qIEZsdXNoIHRoZSBsYXN0IGJ1ZmZlcjogKi8KKwllcnIgPSBkZWZsYXRlKHN0cm0sIFpfUEFSVElBTF9GTFVTSCk7CisgICAgfQorICAgIGlmIChzLT5sZXZlbCAhPSBsZXZlbCkgeworCXMtPmxldmVsID0gbGV2ZWw7CisJcy0+bWF4X2xhenlfbWF0Y2ggICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLm1heF9sYXp5OworCXMtPmdvb2RfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5nb29kX2xlbmd0aDsKKwlzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0ubmljZV9sZW5ndGg7CisJcy0+bWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLm1heF9jaGFpbjsKKyAgICB9CisgICAgcy0+c3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci4KKyAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbgorICogcGVuZGluZ19idWYuCisgKi8KK2xvY2FsIHZvaWQgcHV0U2hvcnRNU0IgKHMsIGIpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB1SW50IGI7Cit7CisgICAgcHV0X2J5dGUocywgKEJ5dGUpKGIgPj4gOCkpOworICAgIHB1dF9ieXRlKHMsIChCeXRlKShiICYgMHhmZikpOworfSAgIAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzCisgKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0CisgKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9vdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuCisgKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuCisgKi8KK2xvY2FsIHZvaWQgZmx1c2hfcGVuZGluZyhzdHJtKQorICAgIHpfc3RyZWFtcCBzdHJtOworeworICAgIHVuc2lnbmVkIGxlbiA9IHN0cm0tPnN0YXRlLT5wZW5kaW5nOworCisgICAgaWYgKGxlbiA+IHN0cm0tPmF2YWlsX291dCkgbGVuID0gc3RybS0+YXZhaWxfb3V0OworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOworCisgICAgem1lbWNweShzdHJtLT5uZXh0X291dCwgc3RybS0+c3RhdGUtPnBlbmRpbmdfb3V0LCBsZW4pOworICAgIHN0cm0tPm5leHRfb3V0ICArPSBsZW47CisgICAgc3RybS0+c3RhdGUtPnBlbmRpbmdfb3V0ICArPSBsZW47CisgICAgc3RybS0+dG90YWxfb3V0ICs9IGxlbjsKKyAgICBzdHJtLT5hdmFpbF9vdXQgIC09IGxlbjsKKyAgICBzdHJtLT5zdGF0ZS0+cGVuZGluZyAtPSBsZW47CisgICAgaWYgKHN0cm0tPnN0YXRlLT5wZW5kaW5nID09IDApIHsKKyAgICAgICAgc3RybS0+c3RhdGUtPnBlbmRpbmdfb3V0ID0gc3RybS0+c3RhdGUtPnBlbmRpbmdfYnVmOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZSAoc3RybSwgZmx1c2gpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGZsdXNoOworeworICAgIGludCBvbGRfZmx1c2g7IC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi8KKyAgICBkZWZsYXRlX3N0YXRlICpzOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAorCWZsdXNoID4gWl9GSU5JU0ggfHwgZmx1c2ggPCAwKSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgcyA9IHN0cm0tPnN0YXRlOworCisgICAgaWYgKHN0cm0tPm5leHRfb3V0ID09IFpfTlVMTCB8fAorICAgICAgICAoc3RybS0+bmV4dF9pbiA9PSBaX05VTEwgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgfHwKKwkocy0+c3RhdHVzID09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPSBaX0ZJTklTSCkpIHsKKyAgICAgICAgRVJSX1JFVFVSTihzdHJtLCBaX1NUUkVBTV9FUlJPUik7CisgICAgfQorICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgRVJSX1JFVFVSTihzdHJtLCBaX0JVRl9FUlJPUik7CisKKyAgICBzLT5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovCisgICAgb2xkX2ZsdXNoID0gcy0+bGFzdF9mbHVzaDsKKyAgICBzLT5sYXN0X2ZsdXNoID0gZmx1c2g7CisKKyAgICAvKiBXcml0ZSB0aGUgemxpYiBoZWFkZXIgKi8KKyAgICBpZiAocy0+c3RhdHVzID09IElOSVRfU1RBVEUpIHsKKworICAgICAgICB1SW50IGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLT53X2JpdHMtOCk8PDQpKSA8PCA4OworICAgICAgICB1SW50IGxldmVsX2ZsYWdzID0gKHMtPmxldmVsLTEpID4+IDE7CisKKyAgICAgICAgaWYgKGxldmVsX2ZsYWdzID4gMykgbGV2ZWxfZmxhZ3MgPSAzOworICAgICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpOworCWlmIChzLT5zdHJzdGFydCAhPSAwKSBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7CisgICAgICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7CisKKyAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKKyAgICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTsKKworCS8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqLworCWlmIChzLT5zdHJzdGFydCAhPSAwKSB7CisJICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciA+PiAxNikpOworCSAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgJiAweGZmZmYpKTsKKwl9CisJc3RybS0+YWRsZXIgPSAxTDsKKyAgICB9CisKKyAgICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovCisgICAgaWYgKHMtPnBlbmRpbmcgIT0gMCkgeworICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKKwkgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aAorCSAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZAorCSAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbywKKwkgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2UKKwkgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOgorICAgICAgICAgICAgICovCisJICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsKKwkgICAgcmV0dXJuIFpfT0s7CisJfQorCisgICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWV0aGluZyB0byBkbyBhbmQgYXZvaWQgZHVwbGljYXRlIGNvbnNlY3V0aXZlCisgICAgICogZmx1c2hlcy4gRm9yIHJlcGVhdGVkIGFuZCB1c2VsZXNzIGNhbGxzIHdpdGggWl9GSU5JU0gsIHdlIGtlZXAKKyAgICAgKiByZXR1cm5pbmcgWl9TVFJFQU1fRU5EIGluc3RlYWQgb2YgWl9CVUZGX0VSUk9SLgorICAgICAqLworICAgIH0gZWxzZSBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBmbHVzaCA8PSBvbGRfZmx1c2ggJiYKKwkgICAgICAgZmx1c2ggIT0gWl9GSU5JU0gpIHsKKyAgICAgICAgRVJSX1JFVFVSTihzdHJtLCBaX0JVRl9FUlJPUik7CisgICAgfQorCisgICAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi8KKyAgICBpZiAocy0+c3RhdHVzID09IEZJTklTSF9TVEFURSAmJiBzdHJtLT5hdmFpbF9pbiAhPSAwKSB7CisgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOworICAgIH0KKworICAgIC8qIFN0YXJ0IGEgbmV3IGJsb2NrIG9yIGNvbnRpbnVlIHRoZSBjdXJyZW50IG9uZS4KKyAgICAgKi8KKyAgICBpZiAoc3RybS0+YXZhaWxfaW4gIT0gMCB8fCBzLT5sb29rYWhlYWQgIT0gMCB8fAorICAgICAgICAoZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBzLT5zdGF0dXMgIT0gRklOSVNIX1NUQVRFKSkgeworICAgICAgICBibG9ja19zdGF0ZSBic3RhdGU7CisKKwlic3RhdGUgPSAoKihjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5mdW5jKSkocywgZmx1c2gpOworCisgICAgICAgIGlmIChic3RhdGUgPT0gZmluaXNoX3N0YXJ0ZWQgfHwgYnN0YXRlID09IGZpbmlzaF9kb25lKSB7CisgICAgICAgICAgICBzLT5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJzdGF0ZSA9PSBuZWVkX21vcmUgfHwgYnN0YXRlID09IGZpbmlzaF9zdGFydGVkKSB7CisJICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgeworCSAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi8KKwkgICAgfQorCSAgICByZXR1cm4gWl9PSzsKKwkgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbAorCSAgICAgKiBvZiBkZWZsYXRlIHNob3VsZCB1c2UgdGhlIHNhbWUgZmx1c2ggcGFyYW1ldGVyIHRvIG1ha2Ugc3VyZQorCSAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW4KKwkgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc28KKwkgICAgICogZW5zdXJlcyB0aGF0IGZvciBhIHZlcnkgc21hbGwgb3V0cHV0IGJ1ZmZlciwgd2UgZW1pdCBhdCBtb3N0CisJICAgICAqIG9uZSBlbXB0eSBibG9jay4KKwkgICAgICovCisJfQorICAgICAgICBpZiAoYnN0YXRlID09IGJsb2NrX2RvbmUpIHsKKyAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX1BBUlRJQUxfRkxVU0gpIHsKKyAgICAgICAgICAgICAgICBfdHJfYWxpZ24ocyk7CisgICAgICAgICAgICB9IGVsc2UgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi8KKyAgICAgICAgICAgICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIChjaGFyKikwLCAwTCwgMCk7CisgICAgICAgICAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWQKKyAgICAgICAgICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX0ZVTExfRkxVU0gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ0xFQVJfSEFTSChzKTsgICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworCSAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKKwkgICAgICBzLT5sYXN0X2ZsdXNoID0gLTE7IC8qIGF2b2lkIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqLworCSAgICAgIHJldHVybiBaX09LOworCSAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsICJidWcyIik7CisKKyAgICBpZiAoZmx1c2ggIT0gWl9GSU5JU0gpIHJldHVybiBaX09LOworICAgIGlmIChzLT5ub2hlYWRlcikgcmV0dXJuIFpfU1RSRUFNX0VORDsKKworICAgIC8qIFdyaXRlIHRoZSB6bGliIHRyYWlsZXIgKGFkbGVyMzIpICovCisgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyID4+IDE2KSk7CisgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyICYgMHhmZmZmKSk7CisgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluCisgICAgICogdG8gZmx1c2ggdGhlIHJlc3QuCisgICAgICovCisgICAgcy0+bm9oZWFkZXIgPSAtMTsgLyogd3JpdGUgdGhlIHRyYWlsZXIgb25seSBvbmNlISAqLworICAgIHJldHVybiBzLT5wZW5kaW5nICE9IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlRW5kIChzdHJtKQorICAgIHpfc3RyZWFtcCBzdHJtOworeworICAgIGludCBzdGF0dXM7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdGF0dXMgPSBzdHJtLT5zdGF0ZS0+c3RhdHVzOworICAgIGlmIChzdGF0dXMgIT0gSU5JVF9TVEFURSAmJiBzdGF0dXMgIT0gQlVTWV9TVEFURSAmJgorCXN0YXR1cyAhPSBGSU5JU0hfU1RBVEUpIHsKKyAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBEZWFsbG9jYXRlIGluIHJldmVyc2Ugb3JkZXIgb2YgYWxsb2NhdGlvbnM6ICovCisgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPnBlbmRpbmdfYnVmKTsKKyAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+aGVhZCk7CisgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPnByZXYpOworICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT53aW5kb3cpOworCisgICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOworICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworCisgICAgcmV0dXJuIHN0YXR1cyA9PSBCVVNZX1NUQVRFID8gWl9EQVRBX0VSUk9SIDogWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSB0aGUgc291cmNlIHN0YXRlIHRvIHRoZSBkZXN0aW5hdGlvbiBzdGF0ZS4KKyAqIFRvIHNpbXBsaWZ5IHRoZSBzb3VyY2UsIHRoaXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgMTYtYml0IE1TRE9TICh3aGljaAorICogZG9lc24ndCBoYXZlIGVub3VnaCBtZW1vcnkgYW55d2F5IHRvIGR1cGxpY2F0ZSBjb21wcmVzc2lvbiBzdGF0ZXMpLgorICovCitpbnQgWkVYUE9SVCBkZWZsYXRlQ29weSAoZGVzdCwgc291cmNlKQorICAgIHpfc3RyZWFtcCBkZXN0OworICAgIHpfc3RyZWFtcCBzb3VyY2U7Cit7CisjaWZkZWYgTUFYU0VHXzY0SworICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgZGVmbGF0ZV9zdGF0ZSAqZHM7CisgICAgZGVmbGF0ZV9zdGF0ZSAqc3M7CisgICAgdXNoZiAqb3ZlcmxheTsKKworCisgICAgaWYgKHNvdXJjZSA9PSBaX05VTEwgfHwgZGVzdCA9PSBaX05VTEwgfHwgc291cmNlLT5zdGF0ZSA9PSBaX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKworICAgIHNzID0gc291cmNlLT5zdGF0ZTsKKworICAgICpkZXN0ID0gKnNvdXJjZTsKKworICAgIGRzID0gKGRlZmxhdGVfc3RhdGUgKikgWkFMTE9DKGRlc3QsIDEsIHNpemVvZihkZWZsYXRlX3N0YXRlKSk7CisgICAgaWYgKGRzID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIGRlc3QtPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKikgZHM7CisgICAgKmRzID0gKnNzOworICAgIGRzLT5zdHJtID0gZGVzdDsKKworICAgIGRzLT53aW5kb3cgPSAoQnl0ZWYgKikgWkFMTE9DKGRlc3QsIGRzLT53X3NpemUsIDIqc2l6ZW9mKEJ5dGUpKTsKKyAgICBkcy0+cHJldiAgID0gKFBvc2YgKikgIFpBTExPQyhkZXN0LCBkcy0+d19zaXplLCBzaXplb2YoUG9zKSk7CisgICAgZHMtPmhlYWQgICA9IChQb3NmICopICBaQUxMT0MoZGVzdCwgZHMtPmhhc2hfc2l6ZSwgc2l6ZW9mKFBvcykpOworICAgIG92ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0MoZGVzdCwgZHMtPmxpdF9idWZzaXplLCBzaXplb2YodXNoKSsyKTsKKyAgICBkcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5OworCisgICAgaWYgKGRzLT53aW5kb3cgPT0gWl9OVUxMIHx8IGRzLT5wcmV2ID09IFpfTlVMTCB8fCBkcy0+aGVhZCA9PSBaX05VTEwgfHwKKyAgICAgICAgZHMtPnBlbmRpbmdfYnVmID09IFpfTlVMTCkgeworICAgICAgICBkZWZsYXRlRW5kIChkZXN0KTsKKyAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIH0KKyAgICAvKiBmb2xsb3dpbmcgem1lbWNweSBkbyBub3Qgd29yayBmb3IgMTYtYml0IE1TRE9TICovCisgICAgem1lbWNweShkcy0+d2luZG93LCBzcy0+d2luZG93LCBkcy0+d19zaXplICogMiAqIHNpemVvZihCeXRlKSk7CisgICAgem1lbWNweShkcy0+cHJldiwgc3MtPnByZXYsIGRzLT53X3NpemUgKiBzaXplb2YoUG9zKSk7CisgICAgem1lbWNweShkcy0+aGVhZCwgc3MtPmhlYWQsIGRzLT5oYXNoX3NpemUgKiBzaXplb2YoUG9zKSk7CisgICAgem1lbWNweShkcy0+cGVuZGluZ19idWYsIHNzLT5wZW5kaW5nX2J1ZiwgKHVJbnQpZHMtPnBlbmRpbmdfYnVmX3NpemUpOworCisgICAgZHMtPnBlbmRpbmdfb3V0ID0gZHMtPnBlbmRpbmdfYnVmICsgKHNzLT5wZW5kaW5nX291dCAtIHNzLT5wZW5kaW5nX2J1Zik7CisgICAgZHMtPmRfYnVmID0gb3ZlcmxheSArIGRzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTsKKyAgICBkcy0+bF9idWYgPSBkcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqZHMtPmxpdF9idWZzaXplOworCisgICAgZHMtPmxfZGVzYy5keW5fdHJlZSA9IGRzLT5keW5fbHRyZWU7CisgICAgZHMtPmRfZGVzYy5keW5fdHJlZSA9IGRzLT5keW5fZHRyZWU7CisgICAgZHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBkcy0+YmxfdHJlZTsKKworICAgIHJldHVybiBaX09LOworI2VuZGlmCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMgorICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2gKKyAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkCisgKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9pbiBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC4KKyAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLgorICovCitsb2NhbCBpbnQgcmVhZF9idWYoc3RybSwgYnVmLCBzaXplKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIEJ5dGVmICpidWY7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICB1bnNpZ25lZCBsZW4gPSBzdHJtLT5hdmFpbF9pbjsKKworICAgIGlmIChsZW4gPiBzaXplKSBsZW4gPSBzaXplOworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIDA7CisKKyAgICBzdHJtLT5hdmFpbF9pbiAgLT0gbGVuOworCisgICAgaWYgKCFzdHJtLT5zdGF0ZS0+bm9oZWFkZXIpIHsKKyAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBzdHJtLT5uZXh0X2luLCBsZW4pOworICAgIH0KKyAgICB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTsKKyAgICBzdHJtLT5uZXh0X2luICArPSBsZW47CisgICAgc3RybS0+dG90YWxfaW4gKz0gbGVuOworCisgICAgcmV0dXJuIChpbnQpbGVuOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlICJsb25nZXN0IG1hdGNoIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0KKyAqLworbG9jYWwgdm9pZCBsbV9pbml0IChzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgcy0+d2luZG93X3NpemUgPSAodWxnKTJMKnMtPndfc2l6ZTsKKworICAgIENMRUFSX0hBU0gocyk7CisKKyAgICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOgorICAgICAqLworICAgIHMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5tYXhfbGF6eTsKKyAgICBzLT5nb29kX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZ29vZF9sZW5ndGg7CisgICAgcy0+bmljZV9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm5pY2VfbGVuZ3RoOworICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5tYXhfY2hhaW47CisKKyAgICBzLT5zdHJzdGFydCA9IDA7CisgICAgcy0+YmxvY2tfc3RhcnQgPSAwTDsKKyAgICBzLT5sb29rYWhlYWQgPSAwOworICAgIHMtPm1hdGNoX2xlbmd0aCA9IHMtPnByZXZfbGVuZ3RoID0gTUlOX01BVENILTE7CisgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICBzLT5pbnNfaCA9IDA7CisjaWZkZWYgQVNNVgorICAgIG1hdGNoX2luaXQoKTsgLyogaW5pdGlhbGl6ZSB0aGUgYXNtIGNvZGUgKi8KKyNlbmRpZgorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZAorICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLAorICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpcworICogZ2FyYmFnZS4KKyAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnQKKyAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDEKKyAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuCisgKi8KKyNpZm5kZWYgQVNNVgorLyogRm9yIDgweDg2IGFuZCA2ODB4MCwgYW4gb3B0aW1pemVkIHZlcnNpb24gd2lsbCBiZSBwcm92aWRlZCBpbiBtYXRjaC5hc20gb3IKKyAqIG1hdGNoLlMuIFRoZSBjb2RlIHdpbGwgYmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQuCisgKi8KKyNpZm5kZWYgRkFTVEVTVAorbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLworeworICAgIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7LyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi8KKyAgICByZWdpc3RlciBCeXRlZiAqbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLworICAgIHJlZ2lzdGVyIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KKyAgICBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLworICAgIGludCBuaWNlX21hdGNoID0gcy0+bmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqLworICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KKyAgICAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsKKyAgICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAorICAgICAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuCisgICAgICovCisgICAgUG9zZiAqcHJldiA9IHMtPnByZXY7CisgICAgdUludCB3bWFzayA9IHMtPndfbWFzazsKKworI2lmZGVmIFVOQUxJR05FRF9PSworICAgIC8qIENvbXBhcmUgdHdvIGJ5dGVzIGF0IGEgdGltZS4gTm90ZTogdGhpcyBpcyBub3QgYWx3YXlzIGJlbmVmaWNpYWwuCisgICAgICogVHJ5IHdpdGggYW5kIHdpdGhvdXQgLURVTkFMSUdORURfT0sgdG8gY2hlY2suCisgICAgICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIIC0gMTsKKyAgICByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsKKyAgICByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CisjZWxzZQorICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKKyAgICByZWdpc3RlciBCeXRlIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOworICAgIHJlZ2lzdGVyIEJ5dGUgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOworI2VuZGlmCisKKyAgICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KKyAgICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCAiQ29kZSB0b28gY2xldmVyIik7CisKKyAgICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqLworICAgIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7CisgICAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKKyAgICB9CisgICAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeQorICAgICAqIHRvIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljLgorICAgICAqLworICAgIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOworCisgICAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgIm5lZWQgbG9va2FoZWFkIik7CisKKyAgICBkbyB7CisgICAgICAgIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgIm5vIGZ1dHVyZSIpOworICAgICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKKworICAgICAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2UKKyAgICAgICAgICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMjoKKyAgICAgICAgICovCisjaWYgKGRlZmluZWQoVU5BTElHTkVEX09LKSAmJiBNQVhfTUFUQ0ggPT0gMjU4KQorICAgICAgICAvKiBUaGlzIGNvZGUgYXNzdW1lcyBzaXplb2YodW5zaWduZWQgc2hvcnQpID09IDIuIERvIG5vdCB1c2UKKyAgICAgICAgICogVU5BTElHTkVEX09LIGlmIHlvdXIgY29tcGlsZXIgdXNlcyBhIGRpZmZlcmVudCBzaXplLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8CisgICAgICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOworCisgICAgICAgIC8qIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5IGFyZQorICAgICAgICAgKiBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQgdGhlIGhhc2gga2V5cworICAgICAgICAgKiBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguIENvbXBhcmUgMiBieXRlcyBhdCBhIHRpbWUgYXQKKyAgICAgICAgICogc3Ryc3RhcnQrMywgKzUsIC4uLiB1cCB0byBzdHJzdGFydCsyNTcuIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQKKyAgICAgICAgICogbG9va2FoZWFkIG9ubHkgZXZlcnkgNHRoIGNvbXBhcmlzb247IHRoZSAxMjh0aCBjaGVjayB3aWxsIGJlIG1hZGUKKyAgICAgICAgICogYXQgc3Ryc3RhcnQrMjU3LiBJZiBNQVhfTUFUQ0gtMiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LCBpdCBpcworICAgICAgICAgKiBuZWNlc3NhcnkgdG8gcHV0IG1vcmUgZ3VhcmQgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93LCBvcgorICAgICAgICAgKiB0byBjaGVjayBtb3JlIG9mdGVuIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQXNzZXJ0KHNjYW5bMl0gPT0gbWF0Y2hbMl0sICJzY2FuWzJdPyIpOworICAgICAgICBzY2FuKyssIG1hdGNoKys7CisgICAgICAgIGRvIHsKKyAgICAgICAgfSB3aGlsZSAoKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworICAgICAgICAvKiBUaGUgZnVubnkgImRvIHt9IiBnZW5lcmF0ZXMgYmV0dGVyIGNvZGUgb24gbW9zdCBjb21waWxlcnMgKi8KKworICAgICAgICAvKiBIZXJlLCBzY2FuIDw9IHdpbmRvdytzdHJzdGFydCsyNTcgKi8KKyAgICAgICAgQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksICJ3aWxkIHNjYW4iKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICptYXRjaCkgc2NhbisrOworCisgICAgICAgIGxlbiA9IChNQVhfTUFUQ0ggLSAxKSAtIChpbnQpKHN0cmVuZC1zY2FuKTsKKyAgICAgICAgc2NhbiA9IHN0cmVuZCAtIChNQVhfTUFUQ0gtMSk7CisKKyNlbHNlIC8qIFVOQUxJR05FRF9PSyAqLworCisgICAgICAgIGlmIChtYXRjaFtiZXN0X2xlbl0gICAhPSBzY2FuX2VuZCAgfHwKKyAgICAgICAgICAgIG1hdGNoW2Jlc3RfbGVuLTFdICE9IHNjYW5fZW5kMSB8fAorICAgICAgICAgICAgKm1hdGNoICAgICAgICAgICAgIT0gKnNjYW4gICAgIHx8CisgICAgICAgICAgICAqKyttYXRjaCAgICAgICAgICAhPSBzY2FuWzFdKSAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pCisgICAgICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5CisgICAgICAgICAqIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQKKyAgICAgICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguCisgICAgICAgICAqLworICAgICAgICBzY2FuICs9IDIsIG1hdGNoKys7CisgICAgICAgIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsICJtYXRjaFsyXT8iKTsKKworICAgICAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworICAgICAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC4KKyAgICAgICAgICovCisgICAgICAgIGRvIHsKKyAgICAgICAgfSB3aGlsZSAoKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisKKyAgICAgICAgbGVuID0gTUFYX01BVENIIC0gKGludCkoc3RyZW5kIC0gc2Nhbik7CisgICAgICAgIHNjYW4gPSBzdHJlbmQgLSBNQVhfTUFUQ0g7CisKKyNlbmRpZiAvKiBVTkFMSUdORURfT0sgKi8KKworICAgICAgICBpZiAobGVuID4gYmVzdF9sZW4pIHsKKyAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOworICAgICAgICAgICAgYmVzdF9sZW4gPSBsZW47CisgICAgICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOworI2lmZGVmIFVOQUxJR05FRF9PSworICAgICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOworI2Vsc2UKKyAgICAgICAgICAgIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOworICAgICAgICAgICAgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQKKyAgICAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsKKworICAgIGlmICgodUludCliZXN0X2xlbiA8PSBzLT5sb29rYWhlYWQpIHJldHVybiAodUludCliZXN0X2xlbjsKKyAgICByZXR1cm4gcy0+bG9va2FoZWFkOworfQorCisjZWxzZSAvKiBGQVNURVNUICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9wdGltaXplZCB2ZXJzaW9uIGZvciBsZXZlbCA9PSAxIG9ubHkKKyAqLworbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLworeworICAgIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKm1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi8KKyAgICByZWdpc3RlciBpbnQgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIOworCisgICAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuCisgICAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgIkNvZGUgdG9vIGNsZXZlciIpOworCisgICAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgIm5lZWQgbG9va2FoZWFkIik7CisKKyAgICBBc3NlcnQoY3VyX21hdGNoIDwgcy0+c3Ryc3RhcnQsICJubyBmdXR1cmUiKTsKKworICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOworCisgICAgLyogUmV0dXJuIGZhaWx1cmUgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMjoKKyAgICAgKi8KKyAgICBpZiAobWF0Y2hbMF0gIT0gc2NhblswXSB8fCBtYXRjaFsxXSAhPSBzY2FuWzFdKSByZXR1cm4gTUlOX01BVENILTE7CisKKyAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQorICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pCisgICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXkKKyAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0CisgICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguCisgICAgICovCisgICAgc2NhbiArPSAyLCBtYXRjaCArPSAyOworICAgIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsICJtYXRjaFsyXT8iKTsKKworICAgIC8qIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgZXZlcnkgOHRoIGNvbXBhcmlzb247CisgICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCisgICAgICovCisgICAgZG8geworICAgIH0gd2hpbGUgKCorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorCSAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisJICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKwkgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorCSAgICAgc2NhbiA8IHN0cmVuZCk7CisKKyAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOworCisgICAgbGVuID0gTUFYX01BVENIIC0gKGludCkoc3RyZW5kIC0gc2Nhbik7CisKKyAgICBpZiAobGVuIDwgTUlOX01BVENIKSByZXR1cm4gTUlOX01BVENIIC0gMTsKKworICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOworICAgIHJldHVybiBsZW4gPD0gcy0+bG9va2FoZWFkID8gbGVuIDogcy0+bG9va2FoZWFkOworfQorI2VuZGlmIC8qIEZBU1RFU1QgKi8KKyNlbmRpZiAvKiBBU01WICovCisKKyNpZmRlZiBERUJVRworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0aGF0IHRoZSBtYXRjaCBhdCBtYXRjaF9zdGFydCBpcyBpbmRlZWQgYSBtYXRjaC4KKyAqLworbG9jYWwgdm9pZCBjaGVja19tYXRjaChzLCBzdGFydCwgbWF0Y2gsIGxlbmd0aCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIElQb3Mgc3RhcnQsIG1hdGNoOworICAgIGludCBsZW5ndGg7Cit7CisgICAgLyogY2hlY2sgdGhhdCB0aGUgbWF0Y2ggaXMgaW5kZWVkIGEgbWF0Y2ggKi8KKyAgICBpZiAoem1lbWNtcChzLT53aW5kb3cgKyBtYXRjaCwKKyAgICAgICAgICAgICAgICBzLT53aW5kb3cgKyBzdGFydCwgbGVuZ3RoKSAhPSBFUVVBTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBzdGFydCAldSwgbWF0Y2ggJXUsIGxlbmd0aCAlZFxuIiwKKwkJc3RhcnQsIG1hdGNoLCBsZW5ndGgpOworICAgICAgICBkbyB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiJWMlYyIsIHMtPndpbmRvd1ttYXRjaCsrXSwgcy0+d2luZG93W3N0YXJ0KytdKTsKKwl9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKKyAgICAgICAgel9lcnJvcigiaW52YWxpZCBtYXRjaCIpOworICAgIH0KKyAgICBpZiAoel92ZXJib3NlID4gMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXFxbJWQsJWRdIiwgc3RhcnQtbWF0Y2gsIGxlbmd0aCk7CisgICAgICAgIGRvIHsgcHV0YyhzLT53aW5kb3dbc3RhcnQrK10sIHN0ZGVycik7IH0gd2hpbGUgKC0tbGVuZ3RoICE9IDApOworICAgIH0KK30KKyNlbHNlCisjICBkZWZpbmUgY2hlY2tfbWF0Y2gocywgc3RhcnQsIG1hdGNoLCBsZW5ndGgpCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LgorICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLgorICoKKyAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRAorICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQUQKKyAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZQorICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2wKKyAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLgorICovCitsb2NhbCB2b2lkIGZpbGxfd2luZG93KHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBuLCBtOworICAgIHJlZ2lzdGVyIFBvc2YgKnA7CisgICAgdW5zaWduZWQgbW9yZTsgICAgLyogQW1vdW50IG9mIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93LiAqLworICAgIHVJbnQgd3NpemUgPSBzLT53X3NpemU7CisKKyAgICBkbyB7CisgICAgICAgIG1vcmUgPSAodW5zaWduZWQpKHMtPndpbmRvd19zaXplIC0odWxnKXMtPmxvb2thaGVhZCAtKHVsZylzLT5zdHJzdGFydCk7CisKKyAgICAgICAgLyogRGVhbCB3aXRoICFAIyQlIDY0SyBsaW1pdDogKi8KKyAgICAgICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICBtb3JlID0gd3NpemU7CisKKyAgICAgICAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7CisgICAgICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYgc3Ryc3RhcnQgPT0gMAorICAgICAgICAgICAgICogYW5kIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIG9uZSBieXRlIGF0IHRpbWUpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1vcmUtLTsKKworICAgICAgICAvKiBJZiB0aGUgd2luZG93IGlzIGFsbW9zdCBmdWxsIGFuZCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLAorICAgICAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLgorICAgICAgICAgKi8KKyAgICAgICAgfSBlbHNlIGlmIChzLT5zdHJzdGFydCA+PSB3c2l6ZStNQVhfRElTVChzKSkgeworCisgICAgICAgICAgICB6bWVtY3B5KHMtPndpbmRvdywgcy0+d2luZG93K3dzaXplLCAodW5zaWduZWQpd3NpemUpOworICAgICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgLT0gd3NpemU7CisgICAgICAgICAgICBzLT5zdHJzdGFydCAgICAtPSB3c2l6ZTsgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi8KKyAgICAgICAgICAgIHMtPmJsb2NrX3N0YXJ0IC09IChsb25nKSB3c2l6ZTsKKworICAgICAgICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzCisgICAgICAgICAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMAorICAgICAgICAgICAgICAgdG8ga2VlcCB0aGUgaGFzaCB0YWJsZSBjb25zaXN0ZW50IGlmIHdlIHN3aXRjaCBiYWNrIHRvIGxldmVsID4gMAorICAgICAgICAgICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mCisgICAgICAgICAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKQorICAgICAgICAgICAgICovCisJICAgIG4gPSBzLT5oYXNoX3NpemU7CisJICAgIHAgPSAmcy0+aGVhZFtuXTsKKwkgICAgZG8geworCQltID0gKi0tcDsKKwkJKnAgPSAoUG9zKShtID49IHdzaXplID8gbS13c2l6ZSA6IE5JTCk7CisJICAgIH0gd2hpbGUgKC0tbik7CisKKwkgICAgbiA9IHdzaXplOworI2lmbmRlZiBGQVNURVNUCisJICAgIHAgPSAmcy0+cHJldltuXTsKKwkgICAgZG8geworCQltID0gKi0tcDsKKwkJKnAgPSAoUG9zKShtID49IHdzaXplID8gbS13c2l6ZSA6IE5JTCk7CisJCS8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0CisJCSAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuCisJCSAqLworCSAgICB9IHdoaWxlICgtLW4pOworI2VuZGlmCisgICAgICAgICAgICBtb3JlICs9IHdzaXplOworICAgICAgICB9CisgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9pbiA9PSAwKSByZXR1cm47CisKKyAgICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIHNsaWRpbmc6CisgICAgICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmCisgICAgICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydAorICAgICAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gKE1JTl9MT09LQUhFQUQtMSArIFdTSVpFICsgTUFYX0RJU1QtMSkKKyAgICAgICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyCisgICAgICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLAorICAgICAgICAgKiAgIHdpbmRvd19zaXplID09IGlucHV0X3NpemUgKyBNSU5fTE9PS0FIRUFEICAmJgorICAgICAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELgorICAgICAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLgorICAgICAgICAgKiBJZiB0aGVyZSB3YXMgc2xpZGluZywgbW9yZSA+PSBXU0laRS4gU28gaW4gYWxsIGNhc2VzLCBtb3JlID49IDIuCisgICAgICAgICAqLworICAgICAgICBBc3NlcnQobW9yZSA+PSAyLCAibW9yZSA8IDIiKTsKKworICAgICAgICBuID0gcmVhZF9idWYocy0+c3RybSwgcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQsIG1vcmUpOworICAgICAgICBzLT5sb29rYWhlYWQgKz0gbjsKKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBoYXNoIHZhbHVlIG5vdyB0aGF0IHdlIGhhdmUgc29tZSBpbnB1dDogKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIHMtPmluc19oID0gcy0+d2luZG93W3MtPnN0cnN0YXJ0XTsKKyAgICAgICAgICAgIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQrMV0pOworI2lmIE1JTl9NQVRDSCAhPSAzCisgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lcworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgLyogSWYgdGhlIHdob2xlIGlucHV0IGhhcyBsZXNzIHRoYW4gTUlOX01BVENIIGJ5dGVzLCBpbnNfaCBpcyBnYXJiYWdlLAorICAgICAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuCisgICAgICAgICAqLworCisgICAgfSB3aGlsZSAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLT5zdHJtLT5hdmFpbF9pbiAhPSAwKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCB0aGUgY3VycmVudCBibG9jaywgd2l0aCBnaXZlbiBlbmQtb2YtZmlsZSBmbGFnLgorICogSU4gYXNzZXJ0aW9uOiBzdHJzdGFydCBpcyBzZXQgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBtYXRjaC4KKyAqLworI2RlZmluZSBGTFVTSF9CTE9DS19PTkxZKHMsIGVvZikgeyBcCisgICBfdHJfZmx1c2hfYmxvY2socywgKHMtPmJsb2NrX3N0YXJ0ID49IDBMID8gXAorICAgICAgICAgICAgICAgICAgIChjaGFyZiAqKSZzLT53aW5kb3dbKHVuc2lnbmVkKXMtPmJsb2NrX3N0YXJ0XSA6IFwKKyAgICAgICAgICAgICAgICAgICAoY2hhcmYgKilaX05VTEwpLCBcCisJCSh1bGcpKChsb25nKXMtPnN0cnN0YXJ0IC0gcy0+YmxvY2tfc3RhcnQpLCBcCisJCShlb2YpKTsgXAorICAgcy0+YmxvY2tfc3RhcnQgPSBzLT5zdHJzdGFydDsgXAorICAgZmx1c2hfcGVuZGluZyhzLT5zdHJtKTsgXAorICAgVHJhY2V2KChzdGRlcnIsIltGTFVTSF0iKSk7IFwKK30KKworLyogU2FtZSBidXQgZm9yY2UgcHJlbWF0dXJlIGV4aXQgaWYgbmVjZXNzYXJ5LiAqLworI2RlZmluZSBGTFVTSF9CTE9DSyhzLCBlb2YpIHsgXAorICAgRkxVU0hfQkxPQ0tfT05MWShzLCBlb2YpOyBcCisgICBpZiAocy0+c3RybS0+YXZhaWxfb3V0ID09IDApIHJldHVybiAoZW9mKSA/IGZpbmlzaF9zdGFydGVkIDogbmVlZF9tb3JlOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4KKyAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2UKKyAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkCisgKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uCisgKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tCisgKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuCisgKi8KK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IGZsdXNoOworeworICAgIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkCisgICAgICogdG8gcGVuZGluZ19idWZfc2l6ZSwgYW5kIGVhY2ggc3RvcmVkIGJsb2NrIGhhcyBhIDUgYnl0ZSBoZWFkZXI6CisgICAgICovCisgICAgdWxnIG1heF9ibG9ja19zaXplID0gMHhmZmZmOworICAgIHVsZyBtYXhfc3RhcnQ7CisKKyAgICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLT5wZW5kaW5nX2J1Zl9zaXplIC0gNSkgeworICAgICAgICBtYXhfYmxvY2tfc2l6ZSA9IHMtPnBlbmRpbmdfYnVmX3NpemUgLSA1OworICAgIH0KKworICAgIC8qIENvcHkgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIGlucHV0IHRvIG91dHB1dDogKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIEZpbGwgdGhlIHdpbmRvdyBhcyBtdWNoIGFzIHBvc3NpYmxlOiAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkIDw9IDEpIHsKKworICAgICAgICAgICAgQXNzZXJ0KHMtPnN0cnN0YXJ0IDwgcy0+d19zaXplK01BWF9ESVNUKHMpIHx8CisJCSAgIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgInNsaWRlIHRvbyBsYXRlIik7CisKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHJldHVybiBuZWVkX21vcmU7CisKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKwlBc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsICJibG9jayBnb25lIik7CisKKwlzLT5zdHJzdGFydCArPSBzLT5sb29rYWhlYWQ7CisJcy0+bG9va2FoZWFkID0gMDsKKworCS8qIEVtaXQgYSBzdG9yZWQgYmxvY2sgaWYgcGVuZGluZ19idWYgd2lsbCBiZSBmdWxsOiAqLworIAltYXhfc3RhcnQgPSBzLT5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplOworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPT0gMCB8fCAodWxnKXMtPnN0cnN0YXJ0ID49IG1heF9zdGFydCkgeworCSAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqLworCSAgICBzLT5sb29rYWhlYWQgPSAodUludCkocy0+c3Ryc3RhcnQgLSBtYXhfc3RhcnQpOworCSAgICBzLT5zdHJzdGFydCA9ICh1SW50KW1heF9zdGFydDsKKyAgICAgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOworCX0KKwkvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWUKKyAgICAgICAgICogbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZToKKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5zdHJzdGFydCAtICh1SW50KXMtPmJsb2NrX3N0YXJ0ID49IE1BWF9ESVNUKHMpKSB7CisgICAgICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKKwl9CisgICAgfQorICAgIEZMVVNIX0JMT0NLKHMsIGZsdXNoID09IFpfRklOSVNIKTsKKyAgICByZXR1cm4gZmx1c2ggPT0gWl9GSU5JU0ggPyBmaW5pc2hfZG9uZSA6IGJsb2NrX2RvbmU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHJlc3MgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybiB0aGUgY3VycmVudAorICogYmxvY2sgc3RhdGUuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgYW5kIGluc2VydHMKKyAqIG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IG9ubHkgZm9yIHVubWF0Y2hlZCBzdHJpbmdzIG9yIGZvciBzaG9ydAorICogbWF0Y2hlcy4gSXQgaXMgdXNlZCBvbmx5IGZvciB0aGUgZmFzdCBjb21wcmVzc2lvbiBvcHRpb25zLgorICovCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2Zhc3QocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgSVBvcyBoYXNoX2hlYWQgPSBOSUw7IC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi8KKyAgICBpbnQgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGUKKyAgICAgICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHsKKwkgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisJICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKworICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisgICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorICAgICAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QocykpIHsKKyAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LCBzLT5tYXRjaF9zdGFydCwgcy0+bWF0Y2hfbGVuZ3RoKTsKKworICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3Qocywgcy0+c3Ryc3RhcnQgLSBzLT5tYXRjaF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsKKworICAgICAgICAgICAgcy0+bG9va2FoZWFkIC09IHMtPm1hdGNoX2xlbmd0aDsKKworICAgICAgICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aAorICAgICAgICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi4KKyAgICAgICAgICAgICAqLworI2lmbmRlZiBGQVNURVNUCisgICAgICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoIDw9IHMtPm1heF9pbnNlcnRfbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgcy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aC0tOyAvKiBzdHJpbmcgYXQgc3Ryc3RhcnQgYWxyZWFkeSBpbiBoYXNoIHRhYmxlICovCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworICAgICAgICAgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworICAgICAgICAgICAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tcy0+bWF0Y2hfbGVuZ3RoICE9IDApOworICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7IAorICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKwkgICAgeworICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHMtPm1hdGNoX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHMtPmluc19oID0gcy0+d2luZG93W3MtPnN0cnN0YXJ0XTsKKyAgICAgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0KzFdKTsKKyNpZiBNSU5fTUFUQ0ggIT0gMworICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCisjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOworICAgICAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsgCisgICAgICAgIH0KKyAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7CisgICAgfQorICAgIEZMVVNIX0JMT0NLKHMsIGZsdXNoID09IFpfRklOSVNIKTsKKyAgICByZXR1cm4gZmx1c2ggPT0gWl9GSU5JU0ggPyBmaW5pc2hfZG9uZSA6IGJsb2NrX2RvbmU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eQorICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpcworICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi4KKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zbG93KHMsIGZsdXNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IGZsdXNoOworeworICAgIElQb3MgaGFzaF9oZWFkID0gTklMOyAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi8KKyAgICBpbnQgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisKKyAgICAvKiBQcm9jZXNzIHRoZSBpbnB1dCBibG9jay4gKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGUKKyAgICAgICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHsKKwkgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisJICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKworICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisgICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorICAgICAgICAgKi8KKyAgICAgICAgcy0+cHJldl9sZW5ndGggPSBzLT5tYXRjaF9sZW5ndGgsIHMtPnByZXZfbWF0Y2ggPSBzLT5tYXRjaF9zdGFydDsKKyAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7CisKKyAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcy0+cHJldl9sZW5ndGggPCBzLT5tYXhfbGF6eV9tYXRjaCAmJgorICAgICAgICAgICAgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QocykpIHsKKyAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisKKyAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gNSAmJiAocy0+c3RyYXRlZ3kgPT0gWl9GSUxURVJFRCB8fAorICAgICAgICAgICAgICAgICAocy0+bWF0Y2hfbGVuZ3RoID09IE1JTl9NQVRDSCAmJgorICAgICAgICAgICAgICAgICAgcy0+c3Ryc3RhcnQgLSBzLT5tYXRjaF9zdGFydCA+IFRPT19GQVIpKSkgeworCisgICAgICAgICAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZQorICAgICAgICAgICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHN0ZXAgYW5kIHRoZSBjdXJyZW50CisgICAgICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6CisgICAgICAgICAqLworICAgICAgICBpZiAocy0+cHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMtPm1hdGNoX2xlbmd0aCA8PSBzLT5wcmV2X2xlbmd0aCkgeworICAgICAgICAgICAgdUludCBtYXhfaW5zZXJ0ID0gcy0+c3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7CisgICAgICAgICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi8KKworICAgICAgICAgICAgY2hlY2tfbWF0Y2gocywgcy0+c3Ryc3RhcnQtMSwgcy0+cHJldl9tYXRjaCwgcy0+cHJldl9sZW5ndGgpOworCisgICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCBzLT5zdHJzdGFydCAtMSAtIHMtPnByZXZfbWF0Y2gsCisJCQkgICBzLT5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsKKworICAgICAgICAgICAgLyogSW5zZXJ0IGluIGhhc2ggdGFibGUgYWxsIHN0cmluZ3MgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2guCisgICAgICAgICAgICAgKiBzdHJzdGFydC0xIGFuZCBzdHJzdGFydCBhcmUgYWxyZWFkeSBpbnNlcnRlZC4gSWYgdGhlcmUgaXMgbm90CisgICAgICAgICAgICAgKiBlbm91Z2ggbG9va2FoZWFkLCB0aGUgbGFzdCB0d28gc3RyaW5ncyBhcmUgbm90IGluc2VydGVkIGluCisgICAgICAgICAgICAgKiB0aGUgaGFzaCB0YWJsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcy0+bG9va2FoZWFkIC09IHMtPnByZXZfbGVuZ3RoLTE7CisgICAgICAgICAgICBzLT5wcmV2X2xlbmd0aCAtPSAyOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmICgrK3MtPnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICgtLXMtPnByZXZfbGVuZ3RoICE9IDApOworICAgICAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKworICAgICAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7CisKKyAgICAgICAgfSBlbHNlIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKKyAgICAgICAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBtYXRjaCBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb24sIG91dHB1dCBhCisgICAgICAgICAgICAgKiBzaW5nbGUgbGl0ZXJhbC4gSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYnV0IHRoZSBjdXJyZW50IG1hdGNoCisgICAgICAgICAgICAgKiBpcyBsb25nZXIsIHRydW5jYXRlIHRoZSBwcmV2aW91cyBtYXRjaCB0byBhIHNpbmdsZSBsaXRlcmFsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7CisJICAgIF90cl90YWxseV9saXQocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdLCBiZmx1c2gpOworCSAgICBpZiAoYmZsdXNoKSB7CisgICAgICAgICAgICAgICAgRkxVU0hfQkxPQ0tfT05MWShzLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3IKKyAgICAgICAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAxOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgIm5vIGZsdXNoPyIpOworICAgIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKKyAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOworICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKKyAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICB9CisgICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOworICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2RlZmxhdGUuaCBiL2NvbW1vbi96bGliL2RlZmxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWNmYWViCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvZGVmbGF0ZS5oCkBAIC0wLDAgKzEsMzE4IEBACisvKiBkZWZsYXRlLmggLS0gaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIEAoIykgJElkOiBkZWZsYXRlLmgsdiAxLjEgMjAwNC8xMC8wOCAwOTo0NDoyNCBjb25zdF9rIEV4cCAkICovCisKKyNpZm5kZWYgX0RFRkxBVEVfSAorI2RlZmluZSBfREVGTEFURV9ICisKKyNpbmNsdWRlICJ6dXRpbC5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLgorICovCisKKyNkZWZpbmUgTEVOR1RIX0NPREVTIDI5CisvKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi8KKworI2RlZmluZSBMSVRFUkFMUyAgMjU2CisvKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi8KKworI2RlZmluZSBMX0NPREVTIChMSVRFUkFMUysxK0xFTkdUSF9DT0RFUykKKy8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqLworCisjZGVmaW5lIERfQ09ERVMgICAzMAorLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCisKKyNkZWZpbmUgQkxfQ09ERVMgIDE5CisvKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi8KKworI2RlZmluZSBIRUFQX1NJWkUgKDIqTF9DT0RFUysxKQorLyogbWF4aW11bSBoZWFwIHNpemUgKi8KKworI2RlZmluZSBNQVhfQklUUyAxNQorLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovCisKKyNkZWZpbmUgSU5JVF9TVEFURSAgICA0MgorI2RlZmluZSBCVVNZX1NUQVRFICAgMTEzCisjZGVmaW5lIEZJTklTSF9TVEFURSA2NjYKKy8qIFN0cmVhbSBzdGF0dXMgKi8KKworCisvKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2luZ2xlIHZhbHVlIGFuZCBpdHMgY29kZSBzdHJpbmcuICovCit0eXBlZGVmIHN0cnVjdCBjdF9kYXRhX3MgeworICAgIHVuaW9uIHsKKyAgICAgICAgdXNoICBmcmVxOyAgICAgICAvKiBmcmVxdWVuY3kgY291bnQgKi8KKyAgICAgICAgdXNoICBjb2RlOyAgICAgICAvKiBiaXQgc3RyaW5nICovCisgICAgfSBmYzsKKyAgICB1bmlvbiB7CisgICAgICAgIHVzaCAgZGFkOyAgICAgICAgLyogZmF0aGVyIG5vZGUgaW4gSHVmZm1hbiB0cmVlICovCisgICAgICAgIHVzaCAgbGVuOyAgICAgICAgLyogbGVuZ3RoIG9mIGJpdCBzdHJpbmcgKi8KKyAgICB9IGRsOworfSBGQVIgY3RfZGF0YTsKKworI2RlZmluZSBGcmVxIGZjLmZyZXEKKyNkZWZpbmUgQ29kZSBmYy5jb2RlCisjZGVmaW5lIERhZCAgZGwuZGFkCisjZGVmaW5lIExlbiAgZGwubGVuCisKK3R5cGVkZWYgc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyAgc3RhdGljX3RyZWVfZGVzYzsKKwordHlwZWRlZiBzdHJ1Y3QgdHJlZV9kZXNjX3MgeworICAgIGN0X2RhdGEgKmR5bl90cmVlOyAgICAgICAgICAgLyogdGhlIGR5bmFtaWMgdHJlZSAqLworICAgIGludCAgICAgbWF4X2NvZGU7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisgICAgc3RhdGljX3RyZWVfZGVzYyAqc3RhdF9kZXNjOyAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqLworfSBGQVIgdHJlZV9kZXNjOworCit0eXBlZGVmIHVzaCBQb3M7Cit0eXBlZGVmIFBvcyBGQVIgUG9zZjsKK3R5cGVkZWYgdW5zaWduZWQgSVBvczsKKworLyogQSBQb3MgaXMgYW4gaW5kZXggaW4gdGhlIGNoYXJhY3RlciB3aW5kb3cuIFdlIHVzZSBzaG9ydCBpbnN0ZWFkIG9mIGludCB0bworICogc2F2ZSBzcGFjZSBpbiB0aGUgdmFyaW91cyB0YWJsZXMuIElQb3MgaXMgdXNlZCBvbmx5IGZvciBwYXJhbWV0ZXIgcGFzc2luZy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7CisgICAgel9zdHJlYW1wIHN0cm07ICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi8KKyAgICBpbnQgICBzdGF0dXM7ICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovCisgICAgQnl0ZWYgKnBlbmRpbmdfYnVmOyAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi8KKyAgICB1bGcgICBwZW5kaW5nX2J1Zl9zaXplOyAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovCisgICAgQnl0ZWYgKnBlbmRpbmdfb3V0OyAgLyogbmV4dCBwZW5kaW5nIGJ5dGUgdG8gb3V0cHV0IHRvIHRoZSBzdHJlYW0gKi8KKyAgICBpbnQgICBwZW5kaW5nOyAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi8KKyAgICBpbnQgICBub2hlYWRlcjsgICAgICAvKiBzdXBwcmVzcyB6bGliIGhlYWRlciBhbmQgYWRsZXIzMiAqLworICAgIEJ5dGUgIGRhdGFfdHlwZTsgICAgIC8qIFVOS05PV04sIEJJTkFSWSBvciBBU0NJSSAqLworICAgIEJ5dGUgIG1ldGhvZDsgICAgICAgIC8qIFNUT1JFRCAoZm9yIHppcCBvbmx5KSBvciBERUZMQVRFRCAqLworICAgIGludCAgIGxhc3RfZmx1c2g7ICAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi8KKworICAgICAgICAgICAgICAgIC8qIHVzZWQgYnkgZGVmbGF0ZS5jOiAqLworCisgICAgdUludCAgd19zaXplOyAgICAgICAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovCisgICAgdUludCAgd19iaXRzOyAgICAgICAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovCisgICAgdUludCAgd19tYXNrOyAgICAgICAgLyogd19zaXplIC0gMSAqLworCisgICAgQnl0ZWYgKndpbmRvdzsKKyAgICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdywKKyAgICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZQorICAgICAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2YKKyAgICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXMKKyAgICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4gQWxzbywgaXQgbGltaXRzCisgICAgICogdGhlIHdpbmRvdyBzaXplIHRvIDY0Sywgd2hpY2ggaXMgcXVpdGUgdXNlZnVsIG9uIE1TRE9TLgorICAgICAqIFRvIGRvOiB1c2UgdGhlIHVzZXIgaW5wdXQgYnVmZmVyIGFzIHNsaWRpbmcgd2luZG93LgorICAgICAqLworCisgICAgdWxnIHdpbmRvd19zaXplOworICAgIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyCisgICAgICogaXMgZGlyZWN0bHkgdXNlZCBhcyBzbGlkaW5nIHdpbmRvdy4KKyAgICAgKi8KKworICAgIFBvc2YgKnByZXY7CisgICAgLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXMKKyAgICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLgorICAgICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLgorICAgICAqLworCisgICAgUG9zZiAqaGVhZDsgLyogSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIE5JTC4gKi8KKworICAgIHVJbnQgIGluc19oOyAgICAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqLworICAgIHVJbnQgIGhhc2hfc2l6ZTsgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqLworICAgIHVJbnQgIGhhc2hfYml0czsgICAgICAvKiBsb2cyKGhhc2hfc2l6ZSkgKi8KKyAgICB1SW50ICBoYXNoX21hc2s7ICAgICAgLyogaGFzaF9zaXplLTEgKi8KKworICAgIHVJbnQgIGhhc2hfc2hpZnQ7CisgICAgLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggbXVzdCBiZSBzaGlmdGVkIGF0IGVhY2ggaW5wdXQKKyAgICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3QKKyAgICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczoKKyAgICAgKiAgIGhhc2hfc2hpZnQgKiBNSU5fTUFUQ0ggPj0gaGFzaF9iaXRzCisgICAgICovCisKKyAgICBsb25nIGJsb2NrX3N0YXJ0OworICAgIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0cworICAgICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuCisgICAgICovCisKKyAgICB1SW50IG1hdGNoX2xlbmd0aDsgICAgICAgICAgIC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovCisgICAgSVBvcyBwcmV2X21hdGNoOyAgICAgICAgICAgICAvKiBwcmV2aW91cyBtYXRjaCAqLworICAgIGludCBtYXRjaF9hdmFpbGFibGU7ICAgICAgICAgLyogc2V0IGlmIHByZXZpb3VzIG1hdGNoIGV4aXN0cyAqLworICAgIHVJbnQgc3Ryc3RhcnQ7ICAgICAgICAgICAgICAgLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqLworICAgIHVJbnQgbWF0Y2hfc3RhcnQ7ICAgICAgICAgICAgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovCisgICAgdUludCBsb29rYWhlYWQ7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWhlYWQgaW4gd2luZG93ICovCisKKyAgICB1SW50IHByZXZfbGVuZ3RoOworICAgIC8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpcworICAgICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLgorICAgICAqLworCisgICAgdUludCBtYXhfY2hhaW5fbGVuZ3RoOworICAgIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzCisgICAgICogbGVuZ3RoLiAgQSBoaWdoZXIgbGltaXQgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8gYnV0IGRlZ3JhZGVzIHRoZQorICAgICAqIHNwZWVkLgorICAgICAqLworCisgICAgdUludCBtYXhfbGF6eV9tYXRjaDsKKyAgICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5CisgICAgICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24KKyAgICAgKiBsZXZlbHMgPj0gNC4KKyAgICAgKi8KKyMgICBkZWZpbmUgbWF4X2luc2VydF9sZW5ndGggIG1heF9sYXp5X21hdGNoCisgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QKKyAgICAgKiBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCisgICAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy4KKyAgICAgKi8KKworICAgIGludCBsZXZlbDsgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKDEuLjkpICovCisgICAgaW50IHN0cmF0ZWd5OyAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovCisKKyAgICB1SW50IGdvb2RfbWF0Y2g7CisgICAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovCisKKyAgICBpbnQgbmljZV9tYXRjaDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqLworCisgICAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqLworICAgIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHJlc3MgY29tcGlsZXIgd2FybmluZyAqLworICAgIHN0cnVjdCBjdF9kYXRhX3MgZHluX2x0cmVlW0hFQVBfU0laRV07ICAgLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi8KKworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBsX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqLworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBkX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgYmxfZGVzYzsgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBiaXQgbGVuZ3RoIHRyZWUgKi8KKworICAgIHVzaCBibF9jb3VudFtNQVhfQklUUysxXTsKKyAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KKworICAgIGludCBoZWFwWzIqTF9DT0RFUysxXTsgICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi8KKyAgICBpbnQgaGVhcF9sZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovCisgICAgaW50IGhlYXBfbWF4OyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KKyAgICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICAgICAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuCisgICAgICovCisKKyAgICB1Y2ggZGVwdGhbMipMX0NPREVTKzFdOworICAgIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kKKyAgICAgKi8KKworICAgIHVjaGYgKmxfYnVmOyAgICAgICAgICAvKiBidWZmZXIgZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMgKi8KKworICAgIHVJbnQgIGxpdF9idWZzaXplOworICAgIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3IKKyAgICAgKiBsaW1pdGluZyBsaXRfYnVmc2l6ZSB0byA2NEs6CisgICAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVycworICAgICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXQKKyAgICAgKiAgICAgZGF0YSBpcyBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW4KKyAgICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3IKKyAgICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pCisgICAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuCisgICAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS4KKyAgICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuCisgICAgICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdAorICAgICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yCisgICAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieQorICAgICAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZQorICAgICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmcKKyAgICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LgorICAgICAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDQKKyAgICAgKi8KKworICAgIHVJbnQgbGFzdF9saXQ7ICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworCisgICAgdXNoZiAqZF9idWY7CisgICAgLyogQnVmZmVyIGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZQorICAgICAqIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy4gVG8gdXNlIGRpZmZlcmVudCBsZW5ndGhzLCBhbiBleHRyYSBmbGFnCisgICAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LgorICAgICAqLworCisgICAgdWxnIG9wdF9sZW47ICAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovCisgICAgdWxnIHN0YXRpY19sZW47ICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi8KKyAgICB1SW50IG1hdGNoZXM7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovCisgICAgaW50IGxhc3RfZW9iX2xlbjsgICAvKiBiaXQgbGVuZ3RoIG9mIEVPQiBjb2RlIGZvciBsYXN0IGJsb2NrICovCisKKyNpZmRlZiBERUJVRworICAgIHVsZyBjb21wcmVzc2VkX2xlbjsgLyogdG90YWwgYml0IGxlbmd0aCBvZiBjb21wcmVzc2VkIGZpbGUgbW9kIDJeMzIgKi8KKyAgICB1bGcgYml0c19zZW50OyAgICAgIC8qIGJpdCBsZW5ndGggb2YgY29tcHJlc3NlZCBkYXRhIHNlbnQgbW9kIDJeMzIgKi8KKyNlbmRpZgorCisgICAgdXNoIGJpX2J1ZjsKKyAgICAvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdAorICAgICAqIHNpZ25pZmljYW50IGJpdHMpLgorICAgICAqLworICAgIGludCBiaV92YWxpZDsKKyAgICAvKiBOdW1iZXIgb2YgdmFsaWQgYml0cyBpbiBiaV9idWYuICBBbGwgYml0cyBhYm92ZSB0aGUgbGFzdCB2YWxpZCBiaXQKKyAgICAgKiBhcmUgYWx3YXlzIHplcm8uCisgICAgICovCisKK30gRkFSIGRlZmxhdGVfc3RhdGU7CisKKy8qIE91dHB1dCBhIGJ5dGUgb24gdGhlIHN0cmVhbS4KKyAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ19idWYuCisgKi8KKyNkZWZpbmUgcHV0X2J5dGUocywgYykge3MtPnBlbmRpbmdfYnVmW3MtPnBlbmRpbmcrK10gPSAoYyk7fQorCisKKyNkZWZpbmUgTUlOX0xPT0tBSEVBRCAoTUFYX01BVENIK01JTl9NQVRDSCsxKQorLyogTWluaW11bSBhbW91bnQgb2YgbG9va2FoZWFkLCBleGNlcHQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4KKyAqIFNlZSBkZWZsYXRlLmMgZm9yIGNvbW1lbnRzIGFib3V0IHRoZSBNSU5fTUFUQ0grMS4KKyAqLworCisjZGVmaW5lIE1BWF9ESVNUKHMpICAoKHMpLT53X3NpemUtTUlOX0xPT0tBSEVBRCkKKy8qIEluIG9yZGVyIHRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBwYXJ0aWN1bGFybHkgb24gMTYgYml0IG1hY2hpbmVzLCBtYXRjaAorICogZGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIE1BWF9ESVNUIGluc3RlYWQgb2YgV1NJWkUuCisgKi8KKworICAgICAgICAvKiBpbiB0cmVlcy5jICovCit2b2lkIF90cl9pbml0ICAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2ludCAgX3RyX3RhbGx5ICAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdW5zaWduZWQgZGlzdCwgdW5zaWduZWQgbGMpKTsKK3ZvaWQgX3RyX2ZsdXNoX2Jsb2NrICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sCisJCQkgIGludCBlb2YpKTsKK3ZvaWQgX3RyX2FsaWduICAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwordm9pZCBfdHJfc3RvcmVkX2Jsb2NrIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjaGFyZiAqYnVmLCB1bGcgc3RvcmVkX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVvZikpOworCisjZGVmaW5lIGRfY29kZShkaXN0KSBcCisgICAoKGRpc3QpIDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2KygoZGlzdCk+PjcpXSkKKy8qIE1hcHBpbmcgZnJvbSBhIGRpc3RhbmNlIHRvIGEgZGlzdGFuY2UgY29kZS4gZGlzdCBpcyB0aGUgZGlzdGFuY2UgLSAxIGFuZAorICogbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuIF9kaXN0X2NvZGVbMjU2XSBhbmQgX2Rpc3RfY29kZVsyNTddIGFyZSBuZXZlcgorICogdXNlZC4KKyAqLworCisjaWZuZGVmIERFQlVHCisvKiBJbmxpbmUgdmVyc2lvbnMgb2YgX3RyX3RhbGx5IGZvciBzcGVlZDogKi8KKworI2lmIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpCisgIGV4dGVybiB1Y2ggX2xlbmd0aF9jb2RlW107CisgIGV4dGVybiB1Y2ggX2Rpc3RfY29kZVtdOworI2Vsc2UKKyAgZXh0ZXJuIGNvbnN0IHVjaCBfbGVuZ3RoX2NvZGVbXTsKKyAgZXh0ZXJuIGNvbnN0IHVjaCBfZGlzdF9jb2RlW107CisjZW5kaWYKKworIyBkZWZpbmUgX3RyX3RhbGx5X2xpdChzLCBjLCBmbHVzaCkgXAorICB7IHVjaCBjYyA9IChjKTsgXAorICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9IDA7IFwKKyAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9IGNjOyBcCisgICAgcy0+ZHluX2x0cmVlW2NjXS5GcmVxKys7IFwKKyAgICBmbHVzaCA9IChzLT5sYXN0X2xpdCA9PSBzLT5saXRfYnVmc2l6ZS0xKTsgXAorICAgfQorIyBkZWZpbmUgX3RyX3RhbGx5X2Rpc3QocywgZGlzdGFuY2UsIGxlbmd0aCwgZmx1c2gpIFwKKyAgeyB1Y2ggbGVuID0gKGxlbmd0aCk7IFwKKyAgICB1c2ggZGlzdCA9IChkaXN0YW5jZSk7IFwKKyAgICBzLT5kX2J1ZltzLT5sYXN0X2xpdF0gPSBkaXN0OyBcCisgICAgcy0+bF9idWZbcy0+bGFzdF9saXQrK10gPSBsZW47IFwKKyAgICBkaXN0LS07IFwKKyAgICBzLT5keW5fbHRyZWVbX2xlbmd0aF9jb2RlW2xlbl0rTElURVJBTFMrMV0uRnJlcSsrOyBcCisgICAgcy0+ZHluX2R0cmVlW2RfY29kZShkaXN0KV0uRnJlcSsrOyBcCisgICAgZmx1c2ggPSAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7IFwKKyAgfQorI2Vsc2UKKyMgZGVmaW5lIF90cl90YWxseV9saXQocywgYywgZmx1c2gpIGZsdXNoID0gX3RyX3RhbGx5KHMsIDAsIGMpCisjIGRlZmluZSBfdHJfdGFsbHlfZGlzdChzLCBkaXN0YW5jZSwgbGVuZ3RoLCBmbHVzaCkgXAorICAgICAgICAgICAgICBmbHVzaCA9IF90cl90YWxseShzLCBkaXN0YW5jZSwgbGVuZ3RoKSAKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2Rlc2NyaXAubW1zIGIvY29tbW9uL3psaWIvZGVzY3JpcC5tbXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzNjQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2Rlc2NyaXAubW1zCkBAIC0wLDAgKzEsNDggQEAKKyMgZGVzY3JpcC5tbXM6IE1NUyBkZXNjcmlwdGlvbiBmaWxlIGZvciBidWlsZGluZyB6bGliIG9uIFZNUworIyB3cml0dGVuIGJ5IE1hcnRpbiBQLkouIFppbnNlciA8bS56aW5zZXJAZ3NpLmRlPgorCitjY19kZWZzID0gCitjX2RlYiA9IAorCisuaWZkZWYgX19ERUNDX18KK3ByZWYgPSAvcHJlZml4PWFsbAorLmVuZGlmCisKK09CSlMgPSBhZGxlcjMyLm9iaiwgY29tcHJlc3Mub2JqLCBjcmMzMi5vYmosIGd6aW8ub2JqLCB1bmNvbXByLm9iaixcCisgICAgICAgZGVmbGF0ZS5vYmosIHRyZWVzLm9iaiwgenV0aWwub2JqLCBpbmZsYXRlLm9iaiwgaW5mYmxvY2sub2JqLFwKKyAgICAgICBpbmZ0cmVlcy5vYmosIGluZmNvZGVzLm9iaiwgaW5mdXRpbC5vYmosIGluZmZhc3Qub2JqCisKK0NGTEFHUz0gJChDX0RFQikgJChDQ19ERUZTKSAkKFBSRUYpCisKK2FsbCA6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorICAgICAgICBAIHdyaXRlIHN5cyRvdXRwdXQgIiBFeGFtcGxlIGFwcGxpY2F0aW9ucyBhdmFpbGFibGUiCitsaWJ6Lm9sYiA6IGxpYnoub2xiKCQoT0JKUykpCisJQCB3cml0ZSBzeXMkb3V0cHV0ICIgbGlieiBhdmFpbGFibGUiCisKK2V4YW1wbGUuZXhlIDogZXhhbXBsZS5vYmogbGliei5vbGIKKyAgICAgICAgICAgICAgbGluayBleGFtcGxlLGxpYnoub2xiL2xpYgorCittaW5pZ3ppcC5leGUgOiBtaW5pZ3ppcC5vYmogbGliei5vbGIKKyAgICAgICAgICAgICAgbGluayBtaW5pZ3ppcCxsaWJ6Lm9sYi9saWIseDExdm1zOnh2bXN1dGlscy5vbGIvbGliCisKK2NsZWFuIDogCisJZGVsZXRlICoub2JqOyosbGliei5vbGI7KgorCisKKyMgT3RoZXIgZGVwZW5kZW5jaWVzLgorYWRsZXIzMi5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitjb21wcmVzcy5vYmogOiB6bGliLmggemNvbmYuaAorY3JjMzIub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaAorZGVmbGF0ZS5vYmogOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorZXhhbXBsZS5vYmogOiB6bGliLmggemNvbmYuaAorZ3ppby5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitpbmZibG9jay5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmggaW5mdHJlZXMuaCBpbmZjb2Rlcy5oIGluZnV0aWwuaAoraW5mY29kZXMub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaCBpbmZjb2Rlcy5oIGluZmZhc3QuaAoraW5mZmFzdC5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mdXRpbC5oIGluZmZhc3QuaAoraW5mbGF0ZS5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmgKK2luZnRyZWVzLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAoraW5mdXRpbC5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mdXRpbC5oCittaW5pZ3ppcC5vYmogOiB6bGliLmggemNvbmYuaAordHJlZXMub2JqIDogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK3VuY29tcHIub2JqIDogemxpYi5oIHpjb25mLmgKK3p1dGlsLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmgKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2V4YW1wbGUuYyBiL2NvbW1vbi96bGliL2V4YW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTU2NjJmCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvZXhhbXBsZS5jCkBAIC0wLDAgKzEsNTU2IEBACisvKiBleGFtcGxlLmMgLS0gdXNhZ2UgZXhhbXBsZSBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBAKCMpICRJZDogZXhhbXBsZS5jLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjUgY29uc3RfayBFeHAgJCAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ6bGliLmgiCisKKyNpZmRlZiBTVERDCisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2Vsc2UKKyAgIGV4dGVybiB2b2lkIGV4aXQgIE9GKChpbnQpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoUklTQ09TKQorIyAgZGVmaW5lIFRFU1RGSUxFICJmb28tZ3oiCisjZWxzZQorIyAgZGVmaW5lIFRFU1RGSUxFICJmb28uZ3oiCisjZW5kaWYKKworI2RlZmluZSBDSEVDS19FUlIoZXJyLCBtc2cpIHsgXAorICAgIGlmIChlcnIgIT0gWl9PSykgeyBcCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgZXJyb3I6ICVkXG4iLCBtc2csIGVycik7IFwKKyAgICAgICAgZXhpdCgxKTsgXAorICAgIH0gXAorfQorCitjb25zdCBjaGFyIGhlbGxvW10gPSAiaGVsbG8sIGhlbGxvISI7CisvKiAiaGVsbG8gd29ybGQiIHdvdWxkIGJlIG1vcmUgc3RhbmRhcmQsIGJ1dCB0aGUgcmVwZWF0ZWQgImhlbGxvIgorICogc3RyZXNzZXMgdGhlIGNvbXByZXNzaW9uIGNvZGUgYmV0dGVyLCBzb3JyeS4uLgorICovCisKK2NvbnN0IGNoYXIgZGljdGlvbmFyeVtdID0gImhlbGxvIjsKK3VMb25nIGRpY3RJZDsgLyogQWRsZXIzMiB2YWx1ZSBvZiB0aGUgZGljdGlvbmFyeSAqLworCit2b2lkIHRlc3RfY29tcHJlc3MgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAorCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Cit2b2lkIHRlc3RfZ3ppbyAgICAgICAgICBPRigoY29uc3QgY2hhciAqb3V0LCBjb25zdCBjaGFyICppbiwgCisJCSAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIGludCB1bmNvbXByTGVuKSk7Cit2b2lkIHRlc3RfZGVmbGF0ZSAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuKSk7Cit2b2lkIHRlc3RfaW5mbGF0ZSAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAorCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Cit2b2lkIHRlc3RfbGFyZ2VfZGVmbGF0ZSBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAorCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Cit2b2lkIHRlc3RfbGFyZ2VfaW5mbGF0ZSBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAorCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Cit2b2lkIHRlc3RfZmx1c2ggICAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nICpjb21wckxlbikpOwordm9pZCB0ZXN0X3N5bmMgICAgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKKwkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2RpY3RfZGVmbGF0ZSAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbikpOwordm9pZCB0ZXN0X2RpY3RfaW5mbGF0ZSAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKKwkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOworaW50ICBtYWluICAgICAgICAgICAgICAgT0YoKGludCBhcmdjLCBjaGFyICphcmd2W10pKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGNvbXByZXNzKCkgYW5kIHVuY29tcHJlc3MoKQorICovCit2b2lkIHRlc3RfY29tcHJlc3MoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKK3sKKyAgICBpbnQgZXJyOworICAgIHVMb25nIGxlbiA9IHN0cmxlbihoZWxsbykrMTsKKworICAgIGVyciA9IGNvbXByZXNzKGNvbXByLCAmY29tcHJMZW4sIChjb25zdCBCeXRlZiopaGVsbG8sIGxlbik7CisgICAgQ0hFQ0tfRVJSKGVyciwgImNvbXByZXNzIik7CisKKyAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7CisKKyAgICBlcnIgPSB1bmNvbXByZXNzKHVuY29tcHIsICZ1bmNvbXByTGVuLCBjb21wciwgY29tcHJMZW4pOworICAgIENIRUNLX0VSUihlcnIsICJ1bmNvbXByZXNzIik7CisKKyAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgdW5jb21wcmVzc1xuIik7CisJZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoInVuY29tcHJlc3MoKTogJXNcbiIsIChjaGFyICopdW5jb21wcik7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgcmVhZC93cml0ZSBvZiAuZ3ogZmlsZXMKKyAqLwordm9pZCB0ZXN0X2d6aW8ob3V0LCBpbiwgdW5jb21wciwgdW5jb21wckxlbikKKyAgICBjb25zdCBjaGFyICpvdXQ7IC8qIGNvbXByZXNzZWQgb3V0cHV0IGZpbGUgKi8KKyAgICBjb25zdCBjaGFyICppbjsgIC8qIGNvbXByZXNzZWQgaW5wdXQgZmlsZSAqLworICAgIEJ5dGUgKnVuY29tcHI7CisgICAgaW50ICB1bmNvbXByTGVuOworeworICAgIGludCBlcnI7CisgICAgaW50IGxlbiA9IHN0cmxlbihoZWxsbykrMTsKKyAgICBnekZpbGUgZmlsZTsKKyAgICB6X29mZl90IHBvczsKKworICAgIGZpbGUgPSBnem9wZW4ob3V0LCAid2IiKTsKKyAgICBpZiAoZmlsZSA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pvcGVuIGVycm9yXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZ3pwdXRjKGZpbGUsICdoJyk7CisgICAgaWYgKGd6cHV0cyhmaWxlLCAiZWxsbyIpICE9IDQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenB1dHMgZXJyOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKGd6cHJpbnRmKGZpbGUsICIsICVzISIsICJoZWxsbyIpICE9IDgpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenByaW50ZiBlcnI6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKKwlleGl0KDEpOworICAgIH0KKyAgICBnenNlZWsoZmlsZSwgMUwsIFNFRUtfQ1VSKTsgLyogYWRkIG9uZSB6ZXJvIGJ5dGUgKi8KKyAgICBnemNsb3NlKGZpbGUpOworCisgICAgZmlsZSA9IGd6b3BlbihpbiwgInJiIik7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6b3BlbiBlcnJvclxuIik7CisgICAgfQorICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKKworICAgIHVuY29tcHJMZW4gPSBnenJlYWQoZmlsZSwgdW5jb21wciwgKHVuc2lnbmVkKXVuY29tcHJMZW4pOworICAgIGlmICh1bmNvbXByTGVuICE9IGxlbikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6cmVhZCBlcnI6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKKwlleGl0KDEpOworICAgIH0KKyAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgZ3pyZWFkOiAlc1xuIiwgKGNoYXIqKXVuY29tcHIpOworCWV4aXQoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJnenJlYWQoKTogJXNcbiIsIChjaGFyICopdW5jb21wcik7CisgICAgfQorCisgICAgcG9zID0gZ3pzZWVrKGZpbGUsIC04TCwgU0VFS19DVVIpOworICAgIGlmIChwb3MgIT0gNiB8fCBnenRlbGwoZmlsZSkgIT0gcG9zKSB7CisJZnByaW50ZihzdGRlcnIsICJnenNlZWsgZXJyb3IsIHBvcz0lbGQsIGd6dGVsbD0lbGRcbiIsCisJCShsb25nKXBvcywgKGxvbmcpZ3p0ZWxsKGZpbGUpKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIGlmIChnemdldGMoZmlsZSkgIT0gJyAnKSB7CisJZnByaW50ZihzdGRlcnIsICJnemdldGMgZXJyb3JcbiIpOworCWV4aXQoMSk7CisgICAgfQorCisgICAgZ3pnZXRzKGZpbGUsIChjaGFyKil1bmNvbXByLCB1bmNvbXByTGVuKTsKKyAgICB1bmNvbXByTGVuID0gc3RybGVuKChjaGFyKil1bmNvbXByKTsKKyAgICBpZiAodW5jb21wckxlbiAhPSA2KSB7IC8qICJoZWxsbyEiICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pnZXRzIGVyciBhZnRlciBnenNlZWs6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKKwlleGl0KDEpOworICAgIH0KKyAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbys3KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBnemdldHMgYWZ0ZXIgZ3pzZWVrXG4iKTsKKwlleGl0KDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiZ3pnZXRzKCkgYWZ0ZXIgZ3pzZWVrOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKKyAgICB9CisKKyAgICBnemNsb3NlKGZpbGUpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgZGVmbGF0ZSgpIHdpdGggc21hbGwgYnVmZmVycworICovCit2b2lkIHRlc3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW47Cit7CisgICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLworICAgIGludCBlcnI7CisgICAgaW50IGxlbiA9IHN0cmxlbihoZWxsbykrMTsKKworICAgIGNfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgY19zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOworCisgICAgY19zdHJlYW0ubmV4dF9pbiAgPSAoQnl0ZWYqKWhlbGxvOworICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7CisKKyAgICB3aGlsZSAoY19zdHJlYW0udG90YWxfaW4gIT0gKHVMb25nKWxlbiAmJiBjX3N0cmVhbS50b3RhbF9vdXQgPCBjb21wckxlbikgeworICAgICAgICBjX3N0cmVhbS5hdmFpbF9pbiA9IGNfc3RyZWFtLmF2YWlsX291dCA9IDE7IC8qIGZvcmNlIHNtYWxsIGJ1ZmZlcnMgKi8KKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIH0KKyAgICAvKiBGaW5pc2ggdGhlIHN0cmVhbSwgc3RpbGwgZm9yY2luZyBzbWFsbCBidWZmZXJzOiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gMTsKKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOworICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIH0KKworICAgIGVyciA9IGRlZmxhdGVFbmQoJmNfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUVuZCIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgaW5mbGF0ZSgpIHdpdGggc21hbGwgYnVmZmVycworICovCit2b2lkIHRlc3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOworICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOworeworICAgIGludCBlcnI7CisgICAgel9zdHJlYW0gZF9zdHJlYW07IC8qIGRlY29tcHJlc3Npb24gc3RyZWFtICovCisKKyAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7CisKKyAgICBkX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIGRfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7CisgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAwOworICAgIGRfc3RyZWFtLm5leHRfb3V0ID0gdW5jb21wcjsKKworICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7CisKKyAgICB3aGlsZSAoZF9zdHJlYW0udG90YWxfb3V0IDwgdW5jb21wckxlbiAmJiBkX3N0cmVhbS50b3RhbF9pbiA8IGNvbXByTGVuKSB7CisgICAgICAgIGRfc3RyZWFtLmF2YWlsX2luID0gZF9zdHJlYW0uYXZhaWxfb3V0ID0gMTsgLyogZm9yY2Ugc21hbGwgYnVmZmVycyAqLworICAgICAgICBlcnIgPSBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSBicmVhazsKKyAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGUiKTsKKyAgICB9CisKKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKKworICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBpbmZsYXRlXG4iKTsKKwlleGl0KDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiaW5mbGF0ZSgpOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlKCkgd2l0aCBsYXJnZSBidWZmZXJzIGFuZCBkeW5hbWljIGNoYW5nZSBvZiBjb21wcmVzc2lvbiBsZXZlbAorICovCit2b2lkIHRlc3RfbGFyZ2VfZGVmbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOworICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOworeworICAgIHpfc3RyZWFtIGNfc3RyZWFtOyAvKiBjb21wcmVzc2lvbiBzdHJlYW0gKi8KKyAgICBpbnQgZXJyOworCisgICAgY19zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBjX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfQkVTVF9TUEVFRCk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7CisKKyAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOworICAgIGNfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KWNvbXByTGVuOworCisgICAgLyogQXQgdGhpcyBwb2ludCwgdW5jb21wciBpcyBzdGlsbCBtb3N0bHkgemVyb2VzLCBzbyBpdCBzaG91bGQgY29tcHJlc3MKKyAgICAgKiB2ZXJ5IHdlbGw6CisgICAgICovCisgICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIGlmIChjX3N0cmVhbS5hdmFpbF9pbiAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBub3QgZ3JlZWR5XG4iKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIC8qIEZlZWQgaW4gYWxyZWFkeSBjb21wcmVzc2VkIGRhdGEgYW5kIHN3aXRjaCB0byBubyBjb21wcmVzc2lvbjogKi8KKyAgICBkZWZsYXRlUGFyYW1zKCZjX3N0cmVhbSwgWl9OT19DT01QUkVTU0lPTiwgWl9ERUZBVUxUX1NUUkFURUdZKTsKKyAgICBjX3N0cmVhbS5uZXh0X2luID0gY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCljb21wckxlbi8yOworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworCisgICAgLyogU3dpdGNoIGJhY2sgdG8gY29tcHJlc3NpbmcgbW9kZTogKi8KKyAgICBkZWZsYXRlUGFyYW1zKCZjX3N0cmVhbSwgWl9CRVNUX0NPTVBSRVNTSU9OLCBaX0ZJTFRFUkVEKTsKKyAgICBjX3N0cmVhbS5uZXh0X2luID0gdW5jb21wcjsKKyAgICBjX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXVuY29tcHJMZW47CisgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlIik7CisKKyAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBzaG91bGQgcmVwb3J0IFpfU1RSRUFNX0VORFxuIik7CisJZXhpdCgxKTsKKyAgICB9CisgICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlKCkgd2l0aCBsYXJnZSBidWZmZXJzCisgKi8KK3ZvaWQgdGVzdF9sYXJnZV9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKKyAgICBCeXRlICpjb21wciwgKnVuY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Cit7CisgICAgaW50IGVycjsKKyAgICB6X3N0cmVhbSBkX3N0cmVhbTsgLyogZGVjb21wcmVzc2lvbiBzdHJlYW0gKi8KKworICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKKworICAgIGRfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgZF9zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZF9zdHJlYW0ubmV4dF9pbiAgPSBjb21wcjsKKyAgICBkX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWNvbXByTGVuOworCisgICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOyAgICAgICAgICAgIC8qIGRpc2NhcmQgdGhlIG91dHB1dCAqLworCWRfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXVuY29tcHJMZW47CisgICAgICAgIGVyciA9IGluZmxhdGUoJmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOworICAgICAgICBDSEVDS19FUlIoZXJyLCAibGFyZ2UgaW5mbGF0ZSIpOworICAgIH0KKworICAgIGVyciA9IGluZmxhdGVFbmQoJmRfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUVuZCIpOworCisgICAgaWYgKGRfc3RyZWFtLnRvdGFsX291dCAhPSAyKnVuY29tcHJMZW4gKyBjb21wckxlbi8yKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGxhcmdlIGluZmxhdGU6ICVsZFxuIiwgZF9zdHJlYW0udG90YWxfb3V0KTsKKwlleGl0KDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigibGFyZ2VfaW5mbGF0ZSgpOiBPS1xuIik7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgZGVmbGF0ZSgpIHdpdGggZnVsbCBmbHVzaAorICovCit2b2lkIHRlc3RfZmx1c2goY29tcHIsIGNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByOworICAgIHVMb25nICpjb21wckxlbjsKK3sKKyAgICB6X3N0cmVhbSBjX3N0cmVhbTsgLyogY29tcHJlc3Npb24gc3RyZWFtICovCisgICAgaW50IGVycjsKKyAgICBpbnQgbGVuID0gc3RybGVuKGhlbGxvKSsxOworCisgICAgY19zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBjX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7CisKKyAgICBjX3N0cmVhbS5uZXh0X2luICA9IChCeXRlZiopaGVsbG87CisgICAgY19zdHJlYW0ubmV4dF9vdXQgPSBjb21wcjsKKyAgICBjX3N0cmVhbS5hdmFpbF9pbiA9IDM7CisgICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmNvbXByTGVuOworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZVTExfRkxVU0gpOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlIik7CisKKyAgICBjb21wclszXSsrOyAvKiBmb3JjZSBhbiBlcnJvciBpbiBmaXJzdCBjb21wcmVzc2VkIGJsb2NrICovCisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSBsZW4gLSAzOworCisgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIH0KKyAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKKworICAgICpjb21wckxlbiA9IGNfc3RyZWFtLnRvdGFsX291dDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGluZmxhdGVTeW5jKCkKKyAqLwordm9pZCB0ZXN0X3N5bmMoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKK3sKKyAgICBpbnQgZXJyOworICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworCisgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOworCisgICAgZF9zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBkX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOworICAgIGRfc3RyZWFtLmF2YWlsX2luID0gMjsgLyoganVzdCByZWFkIHRoZSB6bGliIGhlYWRlciAqLworCisgICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKKworICAgIGRfc3RyZWFtLm5leHRfb3V0ID0gdW5jb21wcjsKKyAgICBkX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCl1bmNvbXByTGVuOworCisgICAgaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIik7CisKKyAgICBkX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWNvbXByTGVuLTI7ICAgLyogcmVhZCBhbGwgY29tcHJlc3NlZCBkYXRhICovCisgICAgZXJyID0gaW5mbGF0ZVN5bmMoJmRfc3RyZWFtKTsgICAgICAgICAgIC8qIGJ1dCBza2lwIHRoZSBkYW1hZ2VkIHBhcnQgKi8KKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZVN5bmMiKTsKKworICAgIGVyciA9IGluZmxhdGUoJmRfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgaWYgKGVyciAhPSBaX0RBVEFfRVJST1IpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmZsYXRlIHNob3VsZCByZXBvcnQgREFUQV9FUlJPUlxuIik7CisgICAgICAgIC8qIEJlY2F1c2Ugb2YgaW5jb3JyZWN0IGFkbGVyMzIgKi8KKwlleGl0KDEpOworICAgIH0KKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKKworICAgIHByaW50ZigiYWZ0ZXIgaW5mbGF0ZVN5bmMoKTogaGVsJXNcbiIsIChjaGFyICopdW5jb21wcik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlKCkgd2l0aCBwcmVzZXQgZGljdGlvbmFyeQorICovCit2b2lkIHRlc3RfZGljdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbikKKyAgICBCeXRlICpjb21wcjsKKyAgICB1TG9uZyBjb21wckxlbjsKK3sKKyAgICB6X3N0cmVhbSBjX3N0cmVhbTsgLyogY29tcHJlc3Npb24gc3RyZWFtICovCisgICAgaW50IGVycjsKKworICAgIGNfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgY19zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0JFU1RfQ09NUFJFU1NJT04pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOworCisgICAgZXJyID0gZGVmbGF0ZVNldERpY3Rpb25hcnkoJmNfc3RyZWFtLAorCQkJICAgICAgIChjb25zdCBCeXRlZiopZGljdGlvbmFyeSwgc2l6ZW9mKGRpY3Rpb25hcnkpKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZVNldERpY3Rpb25hcnkiKTsKKworICAgIGRpY3RJZCA9IGNfc3RyZWFtLmFkbGVyOworICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpY29tcHJMZW47CisKKyAgICBjX3N0cmVhbS5uZXh0X2luID0gKEJ5dGVmKiloZWxsbzsKKyAgICBjX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXN0cmxlbihoZWxsbykrMTsKKworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWZsYXRlIHNob3VsZCByZXBvcnQgWl9TVFJFQU1fRU5EXG4iKTsKKwlleGl0KDEpOworICAgIH0KKyAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGluZmxhdGUoKSB3aXRoIGEgcHJlc2V0IGRpY3Rpb25hcnkKKyAqLwordm9pZCB0ZXN0X2RpY3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOworICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOworeworICAgIGludCBlcnI7CisgICAgel9zdHJlYW0gZF9zdHJlYW07IC8qIGRlY29tcHJlc3Npb24gc3RyZWFtICovCisKKyAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7CisKKyAgICBkX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIGRfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7CisgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAodUludCljb21wckxlbjsKKworICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7CisKKyAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7CisgICAgZF9zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpdW5jb21wckxlbjsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgYnJlYWs7CisJaWYgKGVyciA9PSBaX05FRURfRElDVCkgeworCSAgICBpZiAoZF9zdHJlYW0uYWRsZXIgIT0gZGljdElkKSB7CisJCWZwcmludGYoc3RkZXJyLCAidW5leHBlY3RlZCBkaWN0aW9uYXJ5Iik7CisJCWV4aXQoMSk7CisJICAgIH0KKwkgICAgZXJyID0gaW5mbGF0ZVNldERpY3Rpb25hcnkoJmRfc3RyZWFtLCAoY29uc3QgQnl0ZWYqKWRpY3Rpb25hcnksCisJCQkJICAgICAgIHNpemVvZihkaWN0aW9uYXJ5KSk7CisJfQorICAgICAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZSB3aXRoIGRpY3QiKTsKKyAgICB9CisKKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKKworICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBpbmZsYXRlIHdpdGggZGljdFxuIik7CisJZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoImluZmxhdGUgd2l0aCBkaWN0aW9uYXJ5OiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXNhZ2U6ICBleGFtcGxlIFtvdXRwdXQuZ3ogIFtpbnB1dC5nel1dCisgKi8KKworaW50IG1haW4oYXJnYywgYXJndikKKyAgICBpbnQgYXJnYzsKKyAgICBjaGFyICphcmd2W107Cit7CisgICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOworICAgIHVMb25nIGNvbXByTGVuID0gMTAwMDAqc2l6ZW9mKGludCk7IC8qIGRvbid0IG92ZXJmbG93IG9uIE1TRE9TICovCisgICAgdUxvbmcgdW5jb21wckxlbiA9IGNvbXByTGVuOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBteVZlcnNpb24gPSBaTElCX1ZFUlNJT047CisKKyAgICBpZiAoemxpYlZlcnNpb24oKVswXSAhPSBteVZlcnNpb25bMF0pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvbXBhdGlibGUgemxpYiB2ZXJzaW9uXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKworICAgIH0gZWxzZSBpZiAoc3RyY21wKHpsaWJWZXJzaW9uKCksIFpMSUJfVkVSU0lPTikgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGRpZmZlcmVudCB6bGliIHZlcnNpb25cbiIpOworICAgIH0KKworICAgIGNvbXByICAgID0gKEJ5dGUqKWNhbGxvYygodUludCljb21wckxlbiwgMSk7CisgICAgdW5jb21wciAgPSAoQnl0ZSopY2FsbG9jKCh1SW50KXVuY29tcHJMZW4sIDEpOworICAgIC8qIGNvbXByIGFuZCB1bmNvbXByIGFyZSBjbGVhcmVkIHRvIGF2b2lkIHJlYWRpbmcgdW5pbml0aWFsaXplZAorICAgICAqIGRhdGEgYW5kIHRvIGVuc3VyZSB0aGF0IHVuY29tcHIgY29tcHJlc3NlcyB3ZWxsLgorICAgICAqLworICAgIGlmIChjb21wciA9PSBaX05VTEwgfHwgdW5jb21wciA9PSBaX05VTEwpIHsKKyAgICAgICAgcHJpbnRmKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwlleGl0KDEpOworICAgIH0KKyAgICB0ZXN0X2NvbXByZXNzKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisKKyAgICB0ZXN0X2d6aW8oKGFyZ2MgPiAxID8gYXJndlsxXSA6IFRFU1RGSUxFKSwKKyAgICAgICAgICAgICAgKGFyZ2MgPiAyID8gYXJndlsyXSA6IFRFU1RGSUxFKSwKKwkgICAgICB1bmNvbXByLCAoaW50KXVuY29tcHJMZW4pOworCisgICAgdGVzdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbik7CisgICAgdGVzdF9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisKKyAgICB0ZXN0X2xhcmdlX2RlZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKyAgICB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKworICAgIHRlc3RfZmx1c2goY29tcHIsICZjb21wckxlbik7CisgICAgdGVzdF9zeW5jKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisgICAgY29tcHJMZW4gPSB1bmNvbXByTGVuOworCisgICAgdGVzdF9kaWN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKTsKKyAgICB0ZXN0X2RpY3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOworCisgICAgZXhpdCgwKTsKKyAgICByZXR1cm4gMDsgLyogdG8gYXZvaWQgd2FybmluZyAqLworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvZ3ppby5jIGIvY29tbW9uL3psaWIvZ3ppby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOGI1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9nemlvLmMKQEAgLTAsMCArMSw4NzUgQEAKKy8qIGd6aW8uYyAtLSBJTyBvbiAuZ3ogZmlsZXMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogQ29tcGlsZSB0aGlzIGZpbGUgd2l0aCAtRE5PX0RFRkxBVEUgdG8gYXZvaWQgdGhlIGNvbXByZXNzaW9uIGNvZGUuCisgKi8KKworLyogQCgjKSAkSWQ6IGd6aW8uYyx2IDEuMSAyMDA0LzEwLzA4IDA5OjQ0OjI1IGNvbnN0X2sgRXhwICQgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ6dXRpbC5oIgorCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisKKyNpZm5kZWYgWl9CVUZTSVpFCisjICBpZmRlZiBNQVhTRUdfNjRLCisjICAgIGRlZmluZSBaX0JVRlNJWkUgNDA5NiAvKiBtaW5pbWl6ZSBtZW1vcnkgdXNhZ2UgZm9yIDE2LWJpdCBET1MgKi8KKyMgIGVsc2UKKyMgICAgZGVmaW5lIFpfQlVGU0laRSAxNjM4NAorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBaX1BSSU5URl9CVUZTSVpFCisjICBkZWZpbmUgWl9QUklOVEZfQlVGU0laRSA0MDk2CisjZW5kaWYKKworI2RlZmluZSBBTExPQyhzaXplKSBtYWxsb2Moc2l6ZSkKKyNkZWZpbmUgVFJZRlJFRShwKSB7aWYgKHApIGZyZWUocCk7fQorCitzdGF0aWMgaW50IGd6X21hZ2ljWzJdID0gezB4MWYsIDB4OGJ9OyAvKiBnemlwIG1hZ2ljIGhlYWRlciAqLworCisvKiBnemlwIGZsYWcgYnl0ZSAqLworI2RlZmluZSBBU0NJSV9GTEFHICAgMHgwMSAvKiBiaXQgMCBzZXQ6IGZpbGUgcHJvYmFibHkgYXNjaWkgdGV4dCAqLworI2RlZmluZSBIRUFEX0NSQyAgICAgMHgwMiAvKiBiaXQgMSBzZXQ6IGhlYWRlciBDUkMgcHJlc2VudCAqLworI2RlZmluZSBFWFRSQV9GSUVMRCAgMHgwNCAvKiBiaXQgMiBzZXQ6IGV4dHJhIGZpZWxkIHByZXNlbnQgKi8KKyNkZWZpbmUgT1JJR19OQU1FICAgIDB4MDggLyogYml0IDMgc2V0OiBvcmlnaW5hbCBmaWxlIG5hbWUgcHJlc2VudCAqLworI2RlZmluZSBDT01NRU5UICAgICAgMHgxMCAvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCisjZGVmaW5lIFJFU0VSVkVEICAgICAweEUwIC8qIGJpdHMgNS4uNzogcmVzZXJ2ZWQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZ3pfc3RyZWFtIHsKKyAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgaW50ICAgICAgel9lcnI7ICAgLyogZXJyb3IgY29kZSBmb3IgbGFzdCBzdHJlYW0gb3BlcmF0aW9uICovCisgICAgaW50ICAgICAgel9lb2Y7ICAgLyogc2V0IGlmIGVuZCBvZiBpbnB1dCBmaWxlICovCisgICAgRklMRSAgICAgKmZpbGU7ICAgLyogLmd6IGZpbGUgKi8KKyAgICBCeXRlICAgICAqaW5idWY7ICAvKiBpbnB1dCBidWZmZXIgKi8KKyAgICBCeXRlICAgICAqb3V0YnVmOyAvKiBvdXRwdXQgYnVmZmVyICovCisgICAgdUxvbmcgICAgY3JjOyAgICAgLyogY3JjMzIgb2YgdW5jb21wcmVzc2VkIGRhdGEgKi8KKyAgICBjaGFyICAgICAqbXNnOyAgICAvKiBlcnJvciBtZXNzYWdlICovCisgICAgY2hhciAgICAgKnBhdGg7ICAgLyogcGF0aCBuYW1lIGZvciBkZWJ1Z2dpbmcgb25seSAqLworICAgIGludCAgICAgIHRyYW5zcGFyZW50OyAvKiAxIGlmIGlucHV0IGZpbGUgaXMgbm90IGEgLmd6IGZpbGUgKi8KKyAgICBjaGFyICAgICBtb2RlOyAgICAvKiAndycgb3IgJ3InICovCisgICAgbG9uZyAgICAgc3RhcnRwb3M7IC8qIHN0YXJ0IG9mIGNvbXByZXNzZWQgZGF0YSBpbiBmaWxlIChoZWFkZXIgc2tpcHBlZCkgKi8KK30gZ3pfc3RyZWFtOworCisKK2xvY2FsIGd6RmlsZSBnel9vcGVuICAgICAgT0YoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUsIGludCAgZmQpKTsKK2xvY2FsIGludCBkb19mbHVzaCAgICAgICAgT0YoKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpKTsKK2xvY2FsIGludCAgICBnZXRfYnl0ZSAgICAgT0YoKGd6X3N0cmVhbSAqcykpOworbG9jYWwgdm9pZCAgIGNoZWNrX2hlYWRlciBPRigoZ3pfc3RyZWFtICpzKSk7Citsb2NhbCBpbnQgICAgZGVzdHJveSAgICAgIE9GKChnel9zdHJlYW0gKnMpKTsKK2xvY2FsIHZvaWQgICBwdXRMb25nICAgICAgT0YoKEZJTEUgKmZpbGUsIHVMb25nIHgpKTsKK2xvY2FsIHVMb25nICBnZXRMb25nICAgICAgT0YoKGd6X3N0cmVhbSAqcykpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIG1vZGUgcGFyYW1ldGVyCisgICBpcyBhcyBpbiBmb3BlbiAoInJiIiBvciAid2IiKS4gVGhlIGZpbGUgaXMgZ2l2ZW4gZWl0aGVyIGJ5IGZpbGUgZGVzY3JpcHRvcgorICAgb3IgcGF0aCBuYW1lIChpZiBmZCA9PSAtMSkuCisgICAgIGd6X29wZW4gcmV0dXJuIE5VTEwgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBvciBpZiB0aGVyZSB3YXMKKyAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZTsgZXJybm8KKyAgIGNhbiBiZSBjaGVja2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgKGlmIGVycm5vIGlzIHplcm8sIHRoZQorICAgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuCisqLworbG9jYWwgZ3pGaWxlIGd6X29wZW4gKHBhdGgsIG1vZGUsIGZkKQorICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgY29uc3QgY2hhciAqbW9kZTsKKyAgICBpbnQgIGZkOworeworICAgIGludCBlcnI7CisgICAgaW50IGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOyAvKiBjb21wcmVzc2lvbiBsZXZlbCAqLworICAgIGludCBzdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWTsgLyogY29tcHJlc3Npb24gc3RyYXRlZ3kgKi8KKyAgICBjaGFyICpwID0gKGNoYXIqKW1vZGU7CisgICAgZ3pfc3RyZWFtICpzOworICAgIGNoYXIgZm1vZGVbODBdOyAvKiBjb3B5IG9mIG1vZGUsIHdpdGhvdXQgdGhlIGNvbXByZXNzaW9uIGxldmVsICovCisgICAgY2hhciAqbSA9IGZtb2RlOworCisgICAgaWYgKCFwYXRoIHx8ICFtb2RlKSByZXR1cm4gWl9OVUxMOworCisgICAgcyA9IChnel9zdHJlYW0gKilBTExPQyhzaXplb2YoZ3pfc3RyZWFtKSk7CisgICAgaWYgKCFzKSByZXR1cm4gWl9OVUxMOworCisgICAgcy0+c3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgcy0+c3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIHMtPnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZiA9IFpfTlVMTDsKKyAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWYgPSBaX05VTEw7CisgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gcy0+c3RyZWFtLmF2YWlsX291dCA9IDA7CisgICAgcy0+ZmlsZSA9IE5VTEw7CisgICAgcy0+el9lcnIgPSBaX09LOworICAgIHMtPnpfZW9mID0gMDsKKyAgICBzLT5jcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICBzLT5tc2cgPSBOVUxMOworICAgIHMtPnRyYW5zcGFyZW50ID0gMDsKKworICAgIHMtPnBhdGggPSAoY2hhciopQUxMT0Moc3RybGVuKHBhdGgpKzEpOworICAgIGlmIChzLT5wYXRoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOworICAgIH0KKyAgICBzdHJjcHkocy0+cGF0aCwgcGF0aCk7IC8qIGRvIHRoaXMgZWFybHkgZm9yIGRlYnVnZ2luZyAqLworCisgICAgcy0+bW9kZSA9ICdcMCc7CisgICAgZG8geworICAgICAgICBpZiAoKnAgPT0gJ3InKSBzLT5tb2RlID0gJ3InOworICAgICAgICBpZiAoKnAgPT0gJ3cnIHx8ICpwID09ICdhJykgcy0+bW9kZSA9ICd3JzsKKyAgICAgICAgaWYgKCpwID49ICcwJyAmJiAqcCA8PSAnOScpIHsKKwkgICAgbGV2ZWwgPSAqcCAtICcwJzsKKwl9IGVsc2UgaWYgKCpwID09ICdmJykgeworCSAgc3RyYXRlZ3kgPSBaX0ZJTFRFUkVEOworCX0gZWxzZSBpZiAoKnAgPT0gJ2gnKSB7CisJICBzdHJhdGVneSA9IFpfSFVGRk1BTl9PTkxZOworCX0gZWxzZSB7CisJICAgICptKysgPSAqcDsgLyogY29weSB0aGUgbW9kZSAqLworCX0KKyAgICB9IHdoaWxlICgqcCsrICYmIG0gIT0gZm1vZGUgKyBzaXplb2YoZm1vZGUpKTsKKyAgICBpZiAocy0+bW9kZSA9PSAnXDAnKSByZXR1cm4gZGVzdHJveShzKSwgKGd6RmlsZSlaX05VTEw7CisgICAgCisgICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7CisjaWZkZWYgTk9fREVGTEFURQorICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgICAgIGVyciA9IGRlZmxhdGVJbml0MigmKHMtPnN0cmVhbSksIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9ERUZMQVRFRCwgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgc3RyYXRlZ3kpOworICAgICAgICAvKiB3aW5kb3dCaXRzIGlzIHBhc3NlZCA8IDAgdG8gc3VwcHJlc3MgemxpYiBoZWFkZXIgKi8KKworICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsKKyNlbmRpZgorICAgICAgICBpZiAoZXJyICE9IFpfT0sgfHwgcy0+b3V0YnVmID09IFpfTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gID0gcy0+aW5idWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsKKworICAgICAgICBlcnIgPSBpbmZsYXRlSW5pdDIoJihzLT5zdHJlYW0pLCAtTUFYX1dCSVRTKTsKKyAgICAgICAgLyogd2luZG93Qml0cyBpcyBwYXNzZWQgPCAwIHRvIHRlbGwgdGhhdCB0aGVyZSBpcyBubyB6bGliIGhlYWRlci4KKyAgICAgICAgICogTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBpbmZsYXRlICpyZXF1aXJlcyogYW4gZXh0cmEgImR1bW15IiBieXRlCisgICAgICAgICAqIGFmdGVyIHRoZSBjb21wcmVzc2VkIHN0cmVhbSBpbiBvcmRlciB0byBjb21wbGV0ZSBkZWNvbXByZXNzaW9uIGFuZAorICAgICAgICAgKiByZXR1cm4gWl9TVFJFQU1fRU5ELiBIZXJlIHRoZSBnemlwIENSQzMyIGVuc3VyZXMgdGhhdCA0IGJ5dGVzIGFyZQorICAgICAgICAgKiBwcmVzZW50IGFmdGVyIHRoZSBjb21wcmVzc2VkIHN0cmVhbS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChlcnIgIT0gWl9PSyB8fCBzLT5pbmJ1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gWl9CVUZTSVpFOworCisgICAgZXJybm8gPSAwOworICAgIHMtPmZpbGUgPSBmZCA8IDAgPyBGX09QRU4ocGF0aCwgZm1vZGUpIDogKEZJTEUqKWZkb3BlbihmZCwgZm1vZGUpOworCisgICAgaWYgKHMtPmZpbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZGVzdHJveShzKSwgKGd6RmlsZSlaX05VTEw7CisgICAgfQorICAgIGlmIChzLT5tb2RlID09ICd3JykgeworICAgICAgICAvKiBXcml0ZSBhIHZlcnkgc2ltcGxlIC5neiBoZWFkZXI6CisgICAgICAgICAqLworICAgICAgICBmcHJpbnRmKHMtPmZpbGUsICIlYyVjJWMlYyVjJWMlYyVjJWMlYyIsIGd6X21hZ2ljWzBdLCBnel9tYWdpY1sxXSwKKyAgICAgICAgICAgICBaX0RFRkxBVEVELCAwIC8qZmxhZ3MqLywgMCwwLDAsMCAvKnRpbWUqLywgMCAvKnhmbGFncyovLCBPU19DT0RFKTsKKwlzLT5zdGFydHBvcyA9IDEwTDsKKwkvKiBXZSB1c2UgMTBMIGluc3RlYWQgb2YgZnRlbGwocy0+ZmlsZSkgdG8gYmVjYXVzZSBmdGVsbCBjYXVzZXMgYW4KKyAgICAgICAgICogZmZsdXNoIG9uIHNvbWUgc3lzdGVtcy4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGRvZXNuJ3QgdXNlCisgICAgICAgICAqIHN0YXJ0cG9zIGFueXdheSBpbiB3cml0ZSBtb2RlLCBzbyB0aGlzIGluaXRpYWxpemF0aW9uIGlzIG5vdAorICAgICAgICAgKiBuZWNlc3NhcnkuCisgICAgICAgICAqLworICAgIH0gZWxzZSB7CisJY2hlY2tfaGVhZGVyKHMpOyAvKiBza2lwIHRoZSAuZ3ogaGVhZGVyICovCisJcy0+c3RhcnRwb3MgPSAoZnRlbGwocy0+ZmlsZSkgLSBzLT5zdHJlYW0uYXZhaWxfaW4pOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKGd6RmlsZSlzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KKyovCitnekZpbGUgWkVYUE9SVCBnem9wZW4gKHBhdGgsIG1vZGUpCisgICAgY29uc3QgY2hhciAqcGF0aDsKKyAgICBjb25zdCBjaGFyICptb2RlOworeworICAgIHJldHVybiBnel9vcGVuIChwYXRoLCBtb2RlLCAtMSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBBc3NvY2lhdGUgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiBmZCBpcyBub3QgZHVwJ2VkIGhlcmUKKyAgIHRvIG1pbWljIHRoZSBiZWhhdmlvKHUpciBvZiBmZG9wZW4uCisqLworZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiAoZmQsIG1vZGUpCisgICAgaW50IGZkOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgY2hhciBuYW1lWzIwXTsKKworICAgIGlmIChmZCA8IDApIHJldHVybiAoZ3pGaWxlKVpfTlVMTDsKKyAgICBzcHJpbnRmKG5hbWUsICI8ZmQ6JWQ+IiwgZmQpOyAvKiBmb3IgZGVidWdnaW5nICovCisKKyAgICByZXR1cm4gZ3pfb3BlbiAobmFtZSwgbW9kZSwgZmQpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIHN0cmF0ZWd5CisgKi8KK2ludCBaRVhQT1JUIGd6c2V0cGFyYW1zIChmaWxlLCBsZXZlbCwgc3RyYXRlZ3kpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgaW50IGxldmVsOworICAgIGludCBzdHJhdGVneTsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworCisgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICd3JykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogTWFrZSByb29tIHRvIGFsbG93IGZsdXNoaW5nICovCisgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworCisJcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmOworCWlmIChmd3JpdGUocy0+b3V0YnVmLCAxLCBaX0JVRlNJWkUsIHMtPmZpbGUpICE9IFpfQlVGU0laRSkgeworCSAgICBzLT56X2VyciA9IFpfRVJSTk87CisJfQorCXMtPnN0cmVhbS5hdmFpbF9vdXQgPSBaX0JVRlNJWkU7CisgICAgfQorCisgICAgcmV0dXJuIGRlZmxhdGVQYXJhbXMgKCYocy0+c3RyZWFtKSwgbGV2ZWwsIHN0cmF0ZWd5KTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJlYWQgYSBieXRlIGZyb20gYSBnel9zdHJlYW07IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbi4gUmV0dXJuIEVPRgorICAgZm9yIGVuZCBvZiBmaWxlLgorICAgSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHMgaGFzIGJlZW4gc3VjZXNzZnVsbHkgb3BlbmVkIGZvciByZWFkaW5nLgorKi8KK2xvY2FsIGludCBnZXRfYnl0ZShzKQorICAgIGd6X3N0cmVhbSAqczsKK3sKKyAgICBpZiAocy0+el9lb2YpIHJldHVybiBFT0Y7CisgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSB7CisJZXJybm8gPSAwOworCXMtPnN0cmVhbS5hdmFpbF9pbiA9IGZyZWFkKHMtPmluYnVmLCAxLCBaX0JVRlNJWkUsIHMtPmZpbGUpOworCWlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPT0gMCkgeworCSAgICBzLT56X2VvZiA9IDE7CisJICAgIGlmIChmZXJyb3Iocy0+ZmlsZSkpIHMtPnpfZXJyID0gWl9FUlJOTzsKKwkgICAgcmV0dXJuIEVPRjsKKwl9CisJcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKKyAgICB9CisgICAgcy0+c3RyZWFtLmF2YWlsX2luLS07CisgICAgcmV0dXJuICoocy0+c3RyZWFtLm5leHRfaW4pKys7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgQ2hlY2sgdGhlIGd6aXAgaGVhZGVyIG9mIGEgZ3pfc3RyZWFtIG9wZW5lZCBmb3IgcmVhZGluZy4gU2V0IHRoZSBzdHJlYW0KKyAgICBtb2RlIHRvIHRyYW5zcGFyZW50IGlmIHRoZSBnemlwIG1hZ2ljIGhlYWRlciBpcyBub3QgcHJlc2VudDsgc2V0IHMtPmVycgorICAgIHRvIFpfREFUQV9FUlJPUiBpZiB0aGUgbWFnaWMgaGVhZGVyIGlzIHByZXNlbnQgYnV0IHRoZSByZXN0IG9mIHRoZSBoZWFkZXIKKyAgICBpcyBpbmNvcnJlY3QuCisgICAgSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHMgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIHN1Y2Vzc2Z1bGx5OworICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiBpcyB6ZXJvIGZvciB0aGUgZmlyc3QgdGltZSwgYnV0IG1heSBiZSBub24temVybworICAgICAgIGZvciBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzLgorKi8KK2xvY2FsIHZvaWQgY2hlY2tfaGVhZGVyKHMpCisgICAgZ3pfc3RyZWFtICpzOworeworICAgIGludCBtZXRob2Q7IC8qIG1ldGhvZCBieXRlICovCisgICAgaW50IGZsYWdzOyAgLyogZmxhZ3MgYnl0ZSAqLworICAgIHVJbnQgbGVuOworICAgIGludCBjOworCisgICAgLyogQ2hlY2sgdGhlIGd6aXAgbWFnaWMgaGVhZGVyICovCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPCAyOyBsZW4rKykgeworCWMgPSBnZXRfYnl0ZShzKTsKKwlpZiAoYyAhPSBnel9tYWdpY1tsZW5dKSB7CisJICAgIGlmIChsZW4gIT0gMCkgcy0+c3RyZWFtLmF2YWlsX2luKyssIHMtPnN0cmVhbS5uZXh0X2luLS07CisJICAgIGlmIChjICE9IEVPRikgeworCQlzLT5zdHJlYW0uYXZhaWxfaW4rKywgcy0+c3RyZWFtLm5leHRfaW4tLTsKKwkJcy0+dHJhbnNwYXJlbnQgPSAxOworCSAgICB9CisJICAgIHMtPnpfZXJyID0gcy0+c3RyZWFtLmF2YWlsX2luICE9IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EOworCSAgICByZXR1cm47CisJfQorICAgIH0KKyAgICBtZXRob2QgPSBnZXRfYnl0ZShzKTsKKyAgICBmbGFncyA9IGdldF9ieXRlKHMpOworICAgIGlmIChtZXRob2QgIT0gWl9ERUZMQVRFRCB8fCAoZmxhZ3MgJiBSRVNFUlZFRCkgIT0gMCkgeworCXMtPnpfZXJyID0gWl9EQVRBX0VSUk9SOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBEaXNjYXJkIHRpbWUsIHhmbGFncyBhbmQgT1MgY29kZTogKi8KKyAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IDY7IGxlbisrKSAodm9pZClnZXRfYnl0ZShzKTsKKworICAgIGlmICgoZmxhZ3MgJiBFWFRSQV9GSUVMRCkgIT0gMCkgeyAvKiBza2lwIHRoZSBleHRyYSBmaWVsZCAqLworCWxlbiAgPSAgKHVJbnQpZ2V0X2J5dGUocyk7CisJbGVuICs9ICgodUludClnZXRfYnl0ZShzKSk8PDg7CisJLyogbGVuIGlzIGdhcmJhZ2UgaWYgRU9GIGJ1dCB0aGUgbG9vcCBiZWxvdyB3aWxsIHF1aXQgYW55d2F5ICovCisJd2hpbGUgKGxlbi0tICE9IDAgJiYgZ2V0X2J5dGUocykgIT0gRU9GKSA7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiBPUklHX05BTUUpICE9IDApIHsgLyogc2tpcCB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lICovCisJd2hpbGUgKChjID0gZ2V0X2J5dGUocykpICE9IDAgJiYgYyAhPSBFT0YpIDsKKyAgICB9CisgICAgaWYgKChmbGFncyAmIENPTU1FTlQpICE9IDApIHsgICAvKiBza2lwIHRoZSAuZ3ogZmlsZSBjb21tZW50ICovCisJd2hpbGUgKChjID0gZ2V0X2J5dGUocykpICE9IDAgJiYgYyAhPSBFT0YpIDsKKyAgICB9CisgICAgaWYgKChmbGFncyAmIEhFQURfQ1JDKSAhPSAwKSB7ICAvKiBza2lwIHRoZSBoZWFkZXIgY3JjICovCisJZm9yIChsZW4gPSAwOyBsZW4gPCAyOyBsZW4rKykgKHZvaWQpZ2V0X2J5dGUocyk7CisgICAgfQorICAgIHMtPnpfZXJyID0gcy0+el9lb2YgPyBaX0RBVEFfRVJST1IgOiBaX09LOworfQorCisgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDbGVhbnVwIHRoZW4gZnJlZSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBSZXR1cm4gYSB6bGliIGVycm9yIGNvZGUuCisgICBUcnkgZnJlZWluZyBpbiB0aGUgcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9ucy4KKyAqLworbG9jYWwgaW50IGRlc3Ryb3kgKHMpCisgICAgZ3pfc3RyZWFtICpzOworeworICAgIGludCBlcnIgPSBaX09LOworCisgICAgaWYgKCFzKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBUUllGUkVFKHMtPm1zZyk7CisKKyAgICBpZiAocy0+c3RyZWFtLnN0YXRlICE9IE5VTEwpIHsKKwlpZiAocy0+bW9kZSA9PSAndycpIHsKKyNpZmRlZiBOT19ERUZMQVRFCisJICAgIGVyciA9IFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKwkgICAgZXJyID0gZGVmbGF0ZUVuZCgmKHMtPnN0cmVhbSkpOworI2VuZGlmCisJfSBlbHNlIGlmIChzLT5tb2RlID09ICdyJykgeworCSAgICBlcnIgPSBpbmZsYXRlRW5kKCYocy0+c3RyZWFtKSk7CisJfQorICAgIH0KKyAgICBpZiAocy0+ZmlsZSAhPSBOVUxMICYmIGZjbG9zZShzLT5maWxlKSkgeworI2lmZGVmIEVTUElQRQorCWlmIChlcnJubyAhPSBFU1BJUEUpIC8qIGZjbG9zZSBpcyBicm9rZW4gZm9yIHBpcGVzIGluIEhQL1VYICovCisjZW5kaWYKKwkgICAgZXJyID0gWl9FUlJOTzsKKyAgICB9CisgICAgaWYgKHMtPnpfZXJyIDwgMCkgZXJyID0gcy0+el9lcnI7CisKKyAgICBUUllGUkVFKHMtPmluYnVmKTsKKyAgICBUUllGUkVFKHMtPm91dGJ1Zik7CisgICAgVFJZRlJFRShzLT5wYXRoKTsKKyAgICBUUllGUkVFKHMpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBnenJlYWQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yIGVuZCBvZiBmaWxlKS4KKyovCitpbnQgWkVYUE9SVCBnenJlYWQgKGZpbGUsIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBmaWxlOworICAgIHZvaWRwIGJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKyAgICBCeXRlZiAqc3RhcnQgPSAoQnl0ZWYqKWJ1ZjsgLyogc3RhcnRpbmcgcG9pbnQgZm9yIGNyYyBjb21wdXRhdGlvbiAqLworICAgIEJ5dGUgICpuZXh0X291dDsgLyogPT0gc3RyZWFtLm5leHRfb3V0IGJ1dCBub3QgZm9yY2VkIGZhciAoZm9yIE1TRE9TKSAqLworCisgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICdyJykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgaWYgKHMtPnpfZXJyID09IFpfREFUQV9FUlJPUiB8fCBzLT56X2VyciA9PSBaX0VSUk5PKSByZXR1cm4gLTE7CisgICAgaWYgKHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCkgcmV0dXJuIDA7ICAvKiBFT0YgKi8KKworICAgIG5leHRfb3V0ID0gKEJ5dGUqKWJ1ZjsKKyAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZWYqKWJ1ZjsKKyAgICBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gbGVuOworCisgICAgd2hpbGUgKHMtPnN0cmVhbS5hdmFpbF9vdXQgIT0gMCkgeworCisJaWYgKHMtPnRyYW5zcGFyZW50KSB7CisJICAgIC8qIENvcHkgZmlyc3QgdGhlIGxvb2thaGVhZCBieXRlczogKi8KKwkgICAgdUludCBuID0gcy0+c3RyZWFtLmF2YWlsX2luOworCSAgICBpZiAobiA+IHMtPnN0cmVhbS5hdmFpbF9vdXQpIG4gPSBzLT5zdHJlYW0uYXZhaWxfb3V0OworCSAgICBpZiAobiA+IDApIHsKKwkJem1lbWNweShzLT5zdHJlYW0ubmV4dF9vdXQsIHMtPnN0cmVhbS5uZXh0X2luLCBuKTsKKwkJbmV4dF9vdXQgKz0gbjsKKwkJcy0+c3RyZWFtLm5leHRfb3V0ID0gbmV4dF9vdXQ7CisJCXMtPnN0cmVhbS5uZXh0X2luICAgKz0gbjsKKwkJcy0+c3RyZWFtLmF2YWlsX291dCAtPSBuOworCQlzLT5zdHJlYW0uYXZhaWxfaW4gIC09IG47CisJICAgIH0KKwkgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9vdXQgPiAwKSB7CisJCXMtPnN0cmVhbS5hdmFpbF9vdXQgLT0gZnJlYWQobmV4dF9vdXQsIDEsIHMtPnN0cmVhbS5hdmFpbF9vdXQsCisJCQkJCSAgICAgcy0+ZmlsZSk7CisJICAgIH0KKwkgICAgbGVuIC09IHMtPnN0cmVhbS5hdmFpbF9vdXQ7CisJICAgIHMtPnN0cmVhbS50b3RhbF9pbiAgKz0gKHVMb25nKWxlbjsKKwkgICAgcy0+c3RyZWFtLnRvdGFsX291dCArPSAodUxvbmcpbGVuOworICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSBzLT56X2VvZiA9IDE7CisJICAgIHJldHVybiAoaW50KWxlbjsKKwl9CisgICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPT0gMCAmJiAhcy0+el9lb2YpIHsKKworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gZnJlYWQocy0+aW5idWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSk7CisgICAgICAgICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDApIHsKKyAgICAgICAgICAgICAgICBzLT56X2VvZiA9IDE7CisJCWlmIChmZXJyb3Iocy0+ZmlsZSkpIHsKKwkJICAgIHMtPnpfZXJyID0gWl9FUlJOTzsKKwkJICAgIGJyZWFrOworCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOworICAgICAgICB9CisgICAgICAgIHMtPnpfZXJyID0gaW5mbGF0ZSgmKHMtPnN0cmVhbSksIFpfTk9fRkxVU0gpOworCisJaWYgKHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCkgeworCSAgICAvKiBDaGVjayBDUkMgYW5kIG9yaWdpbmFsIHNpemUgKi8KKwkgICAgcy0+Y3JjID0gY3JjMzIocy0+Y3JjLCBzdGFydCwgKHVJbnQpKHMtPnN0cmVhbS5uZXh0X291dCAtIHN0YXJ0KSk7CisJICAgIHN0YXJ0ID0gcy0+c3RyZWFtLm5leHRfb3V0OworCisJICAgIGlmIChnZXRMb25nKHMpICE9IHMtPmNyYykgeworCQlzLT56X2VyciA9IFpfREFUQV9FUlJPUjsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgICh2b2lkKWdldExvbmcocyk7CisgICAgICAgICAgICAgICAgLyogVGhlIHVuY29tcHJlc3NlZCBsZW5ndGggcmV0dXJuZWQgYnkgYWJvdmUgZ2V0bG9uZygpIG1heQorICAgICAgICAgICAgICAgICAqIGJlIGRpZmZlcmVudCBmcm9tIHMtPnN0cmVhbS50b3RhbF9vdXQpIGluIGNhc2Ugb2YKKwkJICogY29uY2F0ZW5hdGVkIC5neiBmaWxlcy4gQ2hlY2sgZm9yIHN1Y2ggZmlsZXM6CisJCSAqLworCQljaGVja19oZWFkZXIocyk7CisJCWlmIChzLT56X2VyciA9PSBaX09LKSB7CisJCSAgICB1TG9uZyB0b3RhbF9pbiA9IHMtPnN0cmVhbS50b3RhbF9pbjsKKwkJICAgIHVMb25nIHRvdGFsX291dCA9IHMtPnN0cmVhbS50b3RhbF9vdXQ7CisKKwkJICAgIGluZmxhdGVSZXNldCgmKHMtPnN0cmVhbSkpOworCQkgICAgcy0+c3RyZWFtLnRvdGFsX2luID0gdG90YWxfaW47CisJCSAgICBzLT5zdHJlYW0udG90YWxfb3V0ID0gdG90YWxfb3V0OworCQkgICAgcy0+Y3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisJCX0KKwkgICAgfQorCX0KKwlpZiAocy0+el9lcnIgIT0gWl9PSyB8fCBzLT56X2VvZikgYnJlYWs7CisgICAgfQorICAgIHMtPmNyYyA9IGNyYzMyKHMtPmNyYywgc3RhcnQsICh1SW50KShzLT5zdHJlYW0ubmV4dF9vdXQgLSBzdGFydCkpOworCisgICAgcmV0dXJuIChpbnQpKGxlbiAtIHMtPnN0cmVhbS5hdmFpbF9vdXQpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiBnemdldGMgcmV0dXJucyB0aGlzIGJ5dGUKKyAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCisqLworaW50IFpFWFBPUlQgZ3pnZXRjKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgdW5zaWduZWQgY2hhciBjOworCisgICAgcmV0dXJuIGd6cmVhZChmaWxlLCAmYywgMSkgPT0gMSA/IGMgOiAtMTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZQorICAgcmVhZCwgb3IgYSBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuCisgICBlbmQtb2YtZmlsZSBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBUaGUgc3RyaW5nIGlzIHRoZW4gdGVybWluYXRlZAorICAgd2l0aCBhIG51bGwgY2hhcmFjdGVyLgorICAgICAgZ3pnZXRzIHJldHVybnMgYnVmLCBvciBaX05VTEwgaW4gY2FzZSBvZiBlcnJvci4KKworICAgICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgbm90IG9wdGltaXplZCBhdCBhbGwuCisqLworY2hhciAqIFpFWFBPUlQgZ3pnZXRzKGZpbGUsIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworeworICAgIGNoYXIgKmIgPSBidWY7CisgICAgaWYgKGJ1ZiA9PSBaX05VTEwgfHwgbGVuIDw9IDApIHJldHVybiBaX05VTEw7CisKKyAgICB3aGlsZSAoLS1sZW4gPiAwICYmIGd6cmVhZChmaWxlLCBidWYsIDEpID09IDEgJiYgKmJ1ZisrICE9ICdcbicpIDsKKyAgICAqYnVmID0gJ1wwJzsKKyAgICByZXR1cm4gYiA9PSBidWYgJiYgbGVuID4gMCA/IFpfTlVMTCA6IGI7Cit9CisKKworI2lmbmRlZiBOT19ERUZMQVRFCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuCisqLworaW50IFpFWFBPUlQgZ3p3cml0ZSAoZmlsZSwgYnVmLCBsZW4pCisgICAgZ3pGaWxlIGZpbGU7CisgICAgY29uc3Qgdm9pZHAgYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworCisgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICd3JykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgcy0+c3RyZWFtLm5leHRfaW4gPSAoQnl0ZWYqKWJ1ZjsKKyAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSBsZW47CisKKyAgICB3aGlsZSAocy0+c3RyZWFtLmF2YWlsX2luICE9IDApIHsKKworICAgICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX291dCA9PSAwKSB7CisKKyAgICAgICAgICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IHMtPm91dGJ1ZjsKKyAgICAgICAgICAgIGlmIChmd3JpdGUocy0+b3V0YnVmLCAxLCBaX0JVRlNJWkUsIHMtPmZpbGUpICE9IFpfQlVGU0laRSkgeworICAgICAgICAgICAgICAgIHMtPnpfZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgPSBaX0JVRlNJWkU7CisgICAgICAgIH0KKyAgICAgICAgcy0+el9lcnIgPSBkZWZsYXRlKCYocy0+c3RyZWFtKSwgWl9OT19GTFVTSCk7CisgICAgICAgIGlmIChzLT56X2VyciAhPSBaX09LKSBicmVhazsKKyAgICB9CisgICAgcy0+Y3JjID0gY3JjMzIocy0+Y3JjLCAoY29uc3QgQnl0ZWYgKilidWYsIGxlbik7CisKKyAgICByZXR1cm4gKGludCkobGVuIC0gcy0+c3RyZWFtLmF2YWlsX2luKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIENvbnZlcnRzLCBmb3JtYXRzLCBhbmQgd3JpdGVzIHRoZSBhcmdzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKKyAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuIGd6cHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuCisqLworI2lmZGVmIFNUREMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworaW50IFpFWFBPUlRWQSBnenByaW50ZiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLyogYXJncyAqLyAuLi4pCit7CisgICAgY2hhciBidWZbWl9QUklOVEZfQlVGU0laRV07CisgICAgdmFfbGlzdCB2YTsKKyAgICBpbnQgbGVuOworCisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisjaWZkZWYgSEFTX3ZzbnByaW50ZgorICAgICh2b2lkKXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIHZhKTsKKyNlbHNlCisgICAgKHZvaWQpdnNwcmludGYoYnVmLCBmb3JtYXQsIHZhKTsKKyNlbmRpZgorICAgIHZhX2VuZCh2YSk7CisgICAgbGVuID0gc3RybGVuKGJ1Zik7IC8qIHNvbWUgKnNwcmludGYgZG9uJ3QgcmV0dXJuIHRoZSBuYiBvZiBieXRlcyB3cml0dGVuICovCisgICAgaWYgKGxlbiA8PSAwKSByZXR1cm4gMDsKKworICAgIHJldHVybiBnendyaXRlKGZpbGUsIGJ1ZiwgKHVuc2lnbmVkKWxlbik7Cit9CisjZWxzZSAvKiBub3QgQU5TSSBDICovCisKK2ludCBaRVhQT1JUVkEgZ3pwcmludGYgKGZpbGUsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLAorCSAgICAgICAgICAgICAgIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCkKKyAgICBnekZpbGUgZmlsZTsKKyAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgaW50IGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwKKwlhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjA7Cit7CisgICAgY2hhciBidWZbWl9QUklOVEZfQlVGU0laRV07CisgICAgaW50IGxlbjsKKworI2lmZGVmIEhBU19zbnByaW50ZgorICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorCSAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKKyNlbHNlCisgICAgc3ByaW50ZihidWYsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorCSAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOworI2VuZGlmCisgICAgbGVuID0gc3RybGVuKGJ1Zik7IC8qIG9sZCBzcHJpbnRmIGRvZXNuJ3QgcmV0dXJuIHRoZSBuYiBvZiBieXRlcyB3cml0dGVuICovCisgICAgaWYgKGxlbiA8PSAwKSByZXR1cm4gMDsKKworICAgIHJldHVybiBnendyaXRlKGZpbGUsIGJ1ZiwgbGVuKTsKK30KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3pwdXRjIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworaW50IFpFWFBPUlQgZ3pwdXRjKGZpbGUsIGMpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgaW50IGM7Cit7CisgICAgdW5zaWduZWQgY2hhciBjYyA9ICh1bnNpZ25lZCBjaGFyKSBjOyAvKiByZXF1aXJlZCBmb3IgYmlnIGVuZGlhbiBzeXN0ZW1zICovCisKKyAgICByZXR1cm4gZ3p3cml0ZShmaWxlLCAmY2MsIDEpID09IDEgPyAoaW50KWNjIDogLTE7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSwgZXhjbHVkaW5nCisgICB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCisgICAgICBnenB1dHMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyovCitpbnQgWkVYUE9SVCBnenB1dHMoZmlsZSwgcykKKyAgICBnekZpbGUgZmlsZTsKKyAgICBjb25zdCBjaGFyICpzOworeworICAgIHJldHVybiBnendyaXRlKGZpbGUsIChjaGFyKilzLCAodW5zaWduZWQpc3RybGVuKHMpKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCisgICBmbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLgorKi8KK2xvY2FsIGludCBkb19mbHVzaCAoZmlsZSwgZmx1c2gpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgaW50IGZsdXNoOworeworICAgIHVJbnQgbGVuOworICAgIGludCBkb25lID0gMDsKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworCisgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICd3JykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gMDsgLyogc2hvdWxkIGJlIHplcm8gYWxyZWFkeSBhbnl3YXkgKi8KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgbGVuID0gWl9CVUZTSVpFIC0gcy0+c3RyZWFtLmF2YWlsX291dDsKKworICAgICAgICBpZiAobGVuICE9IDApIHsKKyAgICAgICAgICAgIGlmICgodUludClmd3JpdGUocy0+b3V0YnVmLCAxLCBsZW4sIHMtPmZpbGUpICE9IGxlbikgeworICAgICAgICAgICAgICAgIHMtPnpfZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IHMtPm91dGJ1ZjsKKyAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgPSBaX0JVRlNJWkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbmUpIGJyZWFrOworICAgICAgICBzLT56X2VyciA9IGRlZmxhdGUoJihzLT5zdHJlYW0pLCBmbHVzaCk7CisKKwkvKiBJZ25vcmUgdGhlIHNlY29uZCBvZiB0d28gY29uc2VjdXRpdmUgZmx1c2hlczogKi8KKwlpZiAobGVuID09IDAgJiYgcy0+el9lcnIgPT0gWl9CVUZfRVJST1IpIHMtPnpfZXJyID0gWl9PSzsKKworICAgICAgICAvKiBkZWZsYXRlIGhhcyBmaW5pc2hlZCBmbHVzaGluZyBvbmx5IHdoZW4gaXQgaGFzbid0IHVzZWQgdXAKKyAgICAgICAgICogYWxsIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXI6IAorICAgICAgICAgKi8KKyAgICAgICAgZG9uZSA9IChzLT5zdHJlYW0uYXZhaWxfb3V0ICE9IDAgfHwgcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EKTsKKyAKKyAgICAgICAgaWYgKHMtPnpfZXJyICE9IFpfT0sgJiYgcy0+el9lcnIgIT0gWl9TVFJFQU1fRU5EKSBicmVhazsKKyAgICB9CisgICAgcmV0dXJuICBzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQgPyBaX09LIDogcy0+el9lcnI7Cit9CisKK2ludCBaRVhQT1JUIGd6Zmx1c2ggKGZpbGUsIGZsdXNoKQorICAgICBnekZpbGUgZmlsZTsKKyAgICAgaW50IGZsdXNoOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisgICAgaW50IGVyciA9IGRvX2ZsdXNoIChmaWxlLCBmbHVzaCk7CisKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgIGZmbHVzaChzLT5maWxlKTsKKyAgICByZXR1cm4gIHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCA/IFpfT0sgOiBzLT56X2VycjsKK30KKyNlbmRpZiAvKiBOT19ERUZMQVRFICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZSBnaXZlbgorICAgY29tcHJlc3NlZCBmaWxlLiBUaGUgb2Zmc2V0IHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICAgICBnenNlZWsgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9mZnNldCBsb2NhdGlvbiBhcyBtZWFzdXJlZCBpbiBieXRlcyBmcm9tCisgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorICAgICAgU0VFS19FTkQgaXMgbm90IGltcGxlbWVudGVkLCByZXR1cm5zIGVycm9yLgorICAgICAgSW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBnenNlZWsgY2FuIGJlIGV4dHJlbWVseSBzbG93LgorKi8KK3pfb2ZmX3QgWkVYUE9SVCBnenNlZWsgKGZpbGUsIG9mZnNldCwgd2hlbmNlKQorICAgIGd6RmlsZSBmaWxlOworICAgIHpfb2ZmX3Qgb2Zmc2V0OworICAgIGludCB3aGVuY2U7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwgfHwgd2hlbmNlID09IFNFRUtfRU5EIHx8CisJcy0+el9lcnIgPT0gWl9FUlJOTyB8fCBzLT56X2VyciA9PSBaX0RBVEFfRVJST1IpIHsKKwlyZXR1cm4gLTFMOworICAgIH0KKyAgICAKKyAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKKyNpZmRlZiBOT19ERUZMQVRFCisJcmV0dXJuIC0xTDsKKyNlbHNlCisJaWYgKHdoZW5jZSA9PSBTRUVLX1NFVCkgeworCSAgICBvZmZzZXQgLT0gcy0+c3RyZWFtLnRvdGFsX2luOworCX0KKwlpZiAob2Zmc2V0IDwgMCkgcmV0dXJuIC0xTDsKKworCS8qIEF0IHRoaXMgcG9pbnQsIG9mZnNldCBpcyB0aGUgbnVtYmVyIG9mIHplcm8gYnl0ZXMgdG8gd3JpdGUuICovCisJaWYgKHMtPmluYnVmID09IFpfTlVMTCkgeworCSAgICBzLT5pbmJ1ZiA9IChCeXRlKilBTExPQyhaX0JVRlNJWkUpOyAvKiBmb3Igc2Vla2luZyAqLworCSAgICB6bWVtemVybyhzLT5pbmJ1ZiwgWl9CVUZTSVpFKTsKKwl9CisJd2hpbGUgKG9mZnNldCA+IDApICB7CisJICAgIHVJbnQgc2l6ZSA9IFpfQlVGU0laRTsKKwkgICAgaWYgKG9mZnNldCA8IFpfQlVGU0laRSkgc2l6ZSA9ICh1SW50KW9mZnNldDsKKworCSAgICBzaXplID0gZ3p3cml0ZShmaWxlLCBzLT5pbmJ1Ziwgc2l6ZSk7CisJICAgIGlmIChzaXplID09IDApIHJldHVybiAtMUw7CisKKwkgICAgb2Zmc2V0IC09IHNpemU7CisJfQorCXJldHVybiAoel9vZmZfdClzLT5zdHJlYW0udG90YWxfaW47CisjZW5kaWYKKyAgICB9CisgICAgLyogUmVzdCBvZiBmdW5jdGlvbiBpcyBmb3IgcmVhZGluZyBvbmx5ICovCisKKyAgICAvKiBjb21wdXRlIGFic29sdXRlIHBvc2l0aW9uICovCisgICAgaWYgKHdoZW5jZSA9PSBTRUVLX0NVUikgeworCW9mZnNldCArPSBzLT5zdHJlYW0udG90YWxfb3V0OworICAgIH0KKyAgICBpZiAob2Zmc2V0IDwgMCkgcmV0dXJuIC0xTDsKKworICAgIGlmIChzLT50cmFuc3BhcmVudCkgeworCS8qIG1hcCB0byBmc2VlayAqLworCXMtPnN0cmVhbS5hdmFpbF9pbiA9IDA7CisJcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKKyAgICAgICAgaWYgKGZzZWVrKHMtPmZpbGUsIG9mZnNldCwgU0VFS19TRVQpIDwgMCkgcmV0dXJuIC0xTDsKKworCXMtPnN0cmVhbS50b3RhbF9pbiA9IHMtPnN0cmVhbS50b3RhbF9vdXQgPSAodUxvbmcpb2Zmc2V0OworCXJldHVybiBvZmZzZXQ7CisgICAgfQorCisgICAgLyogRm9yIGEgbmVnYXRpdmUgc2VlaywgcmV3aW5kIGFuZCB1c2UgcG9zaXRpdmUgc2VlayAqLworICAgIGlmICgodUxvbmcpb2Zmc2V0ID49IHMtPnN0cmVhbS50b3RhbF9vdXQpIHsKKwlvZmZzZXQgLT0gcy0+c3RyZWFtLnRvdGFsX291dDsKKyAgICB9IGVsc2UgaWYgKGd6cmV3aW5kKGZpbGUpIDwgMCkgeworCXJldHVybiAtMUw7CisgICAgfQorICAgIC8qIG9mZnNldCBpcyBub3cgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLiAqLworCisgICAgaWYgKG9mZnNldCAhPSAwICYmIHMtPm91dGJ1ZiA9PSBaX05VTEwpIHsKKwlzLT5vdXRidWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsKKyAgICB9CisgICAgd2hpbGUgKG9mZnNldCA+IDApICB7CisJaW50IHNpemUgPSBaX0JVRlNJWkU7CisJaWYgKG9mZnNldCA8IFpfQlVGU0laRSkgc2l6ZSA9IChpbnQpb2Zmc2V0OworCisJc2l6ZSA9IGd6cmVhZChmaWxlLCBzLT5vdXRidWYsICh1SW50KXNpemUpOworCWlmIChzaXplIDw9IDApIHJldHVybiAtMUw7CisJb2Zmc2V0IC09IHNpemU7CisgICAgfQorICAgIHJldHVybiAoel9vZmZfdClzLT5zdHJlYW0udG90YWxfb3V0OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmV3aW5kcyBpbnB1dCBmaWxlLiAKKyovCitpbnQgWkVYUE9SVCBnenJld2luZCAoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworICAgIAorICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpIHJldHVybiAtMTsKKworICAgIHMtPnpfZXJyID0gWl9PSzsKKyAgICBzLT56X2VvZiA9IDA7CisgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOworICAgIHMtPmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworCQorICAgIGlmIChzLT5zdGFydHBvcyA9PSAwKSB7IC8qIG5vdCBhIGNvbXByZXNzZWQgZmlsZSAqLworCXJld2luZChzLT5maWxlKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAodm9pZCkgaW5mbGF0ZVJlc2V0KCZzLT5zdHJlYW0pOworICAgIHJldHVybiBmc2VlayhzLT5maWxlLCBzLT5zdGFydHBvcywgU0VFS19TRVQpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCisqLworel9vZmZfdCBaRVhQT1JUIGd6dGVsbCAoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICByZXR1cm4gZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX0NVUik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXR1cm5zIDEgd2hlbiBFT0YgaGFzIHByZXZpb3VzbHkgYmVlbiBkZXRlY3RlZCByZWFkaW5nIHRoZSBnaXZlbgorICAgaW5wdXQgc3RyZWFtLCBvdGhlcndpc2UgemVyby4KKyovCitpbnQgWkVYUE9SVCBnemVvZiAoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworICAgIAorICAgIHJldHVybiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSA/IDAgOiBzLT56X2VvZjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBPdXRwdXRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgdG8gdGhlIGdpdmVuIGZpbGUKKyovCitsb2NhbCB2b2lkIHB1dExvbmcgKGZpbGUsIHgpCisgICAgRklMRSAqZmlsZTsKKyAgICB1TG9uZyB4OworeworICAgIGludCBuOworICAgIGZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKKyAgICAgICAgZnB1dGMoKGludCkoeCAmIDB4ZmYpLCBmaWxlKTsKKyAgICAgICAgeCA+Pj0gODsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgUmVhZHMgYSBsb25nIGluIExTQiBvcmRlciBmcm9tIHRoZSBnaXZlbiBnel9zdHJlYW0uIFNldHMgel9lcnIgaW4gY2FzZQorICAgb2YgZXJyb3IuCisqLworbG9jYWwgdUxvbmcgZ2V0TG9uZyAocykKKyAgICBnel9zdHJlYW0gKnM7Cit7CisgICAgdUxvbmcgeCA9ICh1TG9uZylnZXRfYnl0ZShzKTsKKyAgICBpbnQgYzsKKworICAgIHggKz0gKCh1TG9uZylnZXRfYnl0ZShzKSk8PDg7CisgICAgeCArPSAoKHVMb25nKWdldF9ieXRlKHMpKTw8MTY7CisgICAgYyA9IGdldF9ieXRlKHMpOworICAgIGlmIChjID09IEVPRikgcy0+el9lcnIgPSBaX0RBVEFfRVJST1I7CisgICAgeCArPSAoKHVMb25nKWMpPDwyNDsKKyAgICByZXR1cm4geDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKKyAgIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4KKyovCitpbnQgWkVYUE9SVCBnemNsb3NlIChmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIGludCBlcnI7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIGlmIChzLT5tb2RlID09ICd3JykgeworI2lmZGVmIE5PX0RFRkxBVEUKKwlyZXR1cm4gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgICAgICBlcnIgPSBkb19mbHVzaCAoZmlsZSwgWl9GSU5JU0gpOworICAgICAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBkZXN0cm95KChnel9zdHJlYW0qKWZpbGUpOworCisgICAgICAgIHB1dExvbmcgKHMtPmZpbGUsIHMtPmNyYyk7CisgICAgICAgIHB1dExvbmcgKHMtPmZpbGUsIHMtPnN0cmVhbS50b3RhbF9pbik7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIGRlc3Ryb3koKGd6X3N0cmVhbSopZmlsZSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cmVkIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgorICAgZXJyb3Igb2NjdXJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKKyAgIGVycm51bSBpcyBzZXQgdG8gWl9FUlJOTyBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vCisgICB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisqLworY29uc3QgY2hhciogIFpFWFBPUlQgZ3plcnJvciAoZmlsZSwgZXJybnVtKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCAqZXJybnVtOworeworICAgIGNoYXIgKm07CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgKmVycm51bSA9IFpfU1RSRUFNX0VSUk9SOworICAgICAgICByZXR1cm4gKGNvbnN0IGNoYXIqKUVSUl9NU0coWl9TVFJFQU1fRVJST1IpOworICAgIH0KKyAgICAqZXJybnVtID0gcy0+el9lcnI7CisgICAgaWYgKCplcnJudW0gPT0gWl9PSykgcmV0dXJuIChjb25zdCBjaGFyKikiIjsKKworICAgIG0gPSAgKGNoYXIqKSgqZXJybnVtID09IFpfRVJSTk8gPyB6c3RyZXJyb3IoZXJybm8pIDogcy0+c3RyZWFtLm1zZyk7CisKKyAgICBpZiAobSA9PSBOVUxMIHx8ICptID09ICdcMCcpIG0gPSAoY2hhciopRVJSX01TRyhzLT56X2Vycik7CisKKyAgICBUUllGUkVFKHMtPm1zZyk7CisgICAgcy0+bXNnID0gKGNoYXIqKUFMTE9DKHN0cmxlbihzLT5wYXRoKSArIHN0cmxlbihtKSArIDMpOworICAgIHN0cmNweShzLT5tc2csIHMtPnBhdGgpOworICAgIHN0cmNhdChzLT5tc2csICI6ICIpOworICAgIHN0cmNhdChzLT5tc2csIG0pOworICAgIHJldHVybiAoY29uc3QgY2hhciopcy0+bXNnOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvaW5mYmxvY2suYyBiL2NvbW1vbi96bGliL2luZmJsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3YTZkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2luZmJsb2NrLmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qIGluZmJsb2NrLmMgLS0gaW50ZXJwcmV0IGFuZCBwcm9jZXNzIGJsb2NrIHR5cGVzIHRvIGxhc3QgYmxvY2sKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mYmxvY2suaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmNvZGVzLmgiCisjaW5jbHVkZSAiaW5mdXRpbC5oIgorCitzdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKworLyogc2ltcGxpZnkgdGhlIHVzZSBvZiB0aGUgaW5mbGF0ZV9odWZ0IHR5cGUgd2l0aCBzb21lIGRlZmluZXMgKi8KKyNkZWZpbmUgZXhvcCB3b3JkLndoYXQuRXhvcAorI2RlZmluZSBiaXRzIHdvcmQud2hhdC5CaXRzCisKKy8qIFRhYmxlIGZvciBkZWZsYXRlIGZyb20gUEtaSVAncyBhcHBub3RlLnR4dC4gKi8KK2xvY2FsIGNvbnN0IHVJbnQgYm9yZGVyW10gPSB7IC8qIE9yZGVyIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgICAgICAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKKworLyoKKyAgIE5vdGVzIGJleW9uZCB0aGUgMS45M2EgYXBwbm90ZS50eHQ6CisKKyAgIDEuIERpc3RhbmNlIHBvaW50ZXJzIG5ldmVyIHBvaW50IGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQKKyAgICAgIHN0cmVhbS4KKyAgIDIuIERpc3RhbmNlIHBvaW50ZXJzIGNhbiBwb2ludCBiYWNrIGFjcm9zcyBibG9ja3MsIHVwIHRvIDMyayBhd2F5LgorICAgMy4gVGhlcmUgaXMgYW4gaW1wbGllZCBtYXhpbXVtIG9mIDcgYml0cyBmb3IgdGhlIGJpdCBsZW5ndGggdGFibGUgYW5kCisgICAgICAxNSBiaXRzIGZvciB0aGUgYWN0dWFsIGRhdGEuCisgICA0LiBJZiBvbmx5IG9uZSBjb2RlIGV4aXN0cywgdGhlbiBpdCBpcyBlbmNvZGVkIHVzaW5nIG9uZSBiaXQuICAoWmVybworICAgICAgd291bGQgYmUgbW9yZSBlZmZpY2llbnQsIGJ1dCBwZXJoYXBzIGEgbGl0dGxlIGNvbmZ1c2luZy4pICBJZiB0d28KKyAgICAgIGNvZGVzIGV4aXN0LCB0aGV5IGFyZSBjb2RlZCB1c2luZyBvbmUgYml0IGVhY2ggKDAgYW5kIDEpLgorICAgNS4gVGhlcmUgaXMgbm8gd2F5IG9mIHNlbmRpbmcgemVybyBkaXN0YW5jZSBjb2Rlcy0tYSBkdW1teSBtdXN0IGJlCisgICAgICBzZW50IGlmIHRoZXJlIGFyZSBub25lLiAgKEhpc3Rvcnk6IGEgcHJlIDIuMCB2ZXJzaW9uIG9mIFBLWklQIHdvdWxkCisgICAgICBzdG9yZSBibG9ja3Mgd2l0aCBubyBkaXN0YW5jZSBjb2RlcywgYnV0IHRoaXMgd2FzIGRpc2NvdmVyZWQgdG8gYmUKKyAgICAgIHRvbyBoYXJzaCBhIGNyaXRlcmlvbi4pICBWYWxpZCBvbmx5IGZvciAxLjkzYS4gIDIuMDRjIGRvZXMgYWxsb3cKKyAgICAgIHplcm8gZGlzdGFuY2UgY29kZXMsIHdoaWNoIGlzIHNlbnQgYXMgb25lIGNvZGUgb2YgemVybyBiaXRzIGluCisgICAgICBsZW5ndGguCisgICA2LiBUaGVyZSBhcmUgdXAgdG8gMjg2IGxpdGVyYWwvbGVuZ3RoIGNvZGVzLiAgQ29kZSAyNTYgcmVwcmVzZW50cyB0aGUKKyAgICAgIGVuZC1vZi1ibG9jay4gIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBzdGF0aWMgbGVuZ3RoIHRyZWUgZGVmaW5lcworICAgICAgMjg4IGNvZGVzIGp1c3QgdG8gZmlsbCBvdXQgdGhlIEh1ZmZtYW4gY29kZXMuICBDb2RlcyAyODYgYW5kIDI4NworICAgICAgY2Fubm90IGJlIHVzZWQgdGhvdWdoLCBzaW5jZSB0aGVyZSBpcyBubyBsZW5ndGggYmFzZSBvciBleHRyYSBiaXRzCisgICAgICBkZWZpbmVkIGZvciB0aGVtLiAgU2ltaWxhcmlseSwgdGhlcmUgYXJlIHVwIHRvIDMwIGRpc3RhbmNlIGNvZGVzLgorICAgICAgSG93ZXZlciwgc3RhdGljIHRyZWVzIGRlZmluZSAzMiBjb2RlcyAoYWxsIDUgYml0cykgdG8gZmlsbCBvdXQgdGhlCisgICAgICBIdWZmbWFuIGNvZGVzLCBidXQgdGhlIGxhc3QgdHdvIGhhZCBiZXR0ZXIgbm90IHNob3cgdXAgaW4gdGhlIGRhdGEuCisgICA3LiBVbnppcCBjYW4gY2hlY2sgZHluYW1pYyBIdWZmbWFuIGJsb2NrcyBmb3IgY29tcGxldGUgY29kZSBzZXRzLgorICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGF0IGEgc2luZ2xlIGNvZGUgd291bGQgbm90IGJlIGNvbXBsZXRlIChzZWUgIzQpLgorICAgOC4gVGhlIGZpdmUgYml0cyBmb2xsb3dpbmcgdGhlIGJsb2NrIHR5cGUgaXMgcmVhbGx5IHRoZSBudW1iZXIgb2YKKyAgICAgIGxpdGVyYWwgY29kZXMgc2VudCBtaW51cyAyNTcuCisgICA5LiBMZW5ndGggY29kZXMgOCwxNiwxNiBhcmUgaW50ZXJwcmV0ZWQgYXMgMTMgbGVuZ3RoIGNvZGVzIG9mIDggYml0cworICAgICAgKDErNis2KS4gIFRoZXJlZm9yZSwgdG8gb3V0cHV0IHRocmVlIHRpbWVzIHRoZSBsZW5ndGgsIHlvdSBvdXRwdXQKKyAgICAgIHRocmVlIGNvZGVzICgxKzErMSksIHdoZXJlYXMgdG8gb3V0cHV0IGZvdXIgdGltZXMgdGhlIHNhbWUgbGVuZ3RoLAorICAgICAgeW91IG9ubHkgbmVlZCB0d28gY29kZXMgKDErMykuICBIbW0uCisgIDEwLiBJbiB0aGUgdHJlZSByZWNvbnN0cnVjdGlvbiBhbGdvcml0aG0sIENvZGUgPSBDb2RlICsgSW5jcmVtZW50CisgICAgICBvbmx5IGlmIEJpdExlbmd0aChpKSBpcyBub3QgemVyby4gIChQcmV0dHkgb2J2aW91cy4pCisgIDExLiBDb3JyZWN0aW9uOiA0IEJpdHM6ICMgb2YgQml0IExlbmd0aCBjb2RlcyAtIDQgICAgICg0IC0gMTkpCisgIDEyLiBOb3RlOiBsZW5ndGggY29kZSAyODQgY2FuIHJlcHJlc2VudCAyMjctMjU4LCBidXQgbGVuZ3RoIGNvZGUgMjg1CisgICAgICByZWFsbHkgaXMgMjU4LiAgVGhlIGxhc3QgbGVuZ3RoIGRlc2VydmVzIGl0cyBvd24sIHNob3J0IGNvZGUKKyAgICAgIHNpbmNlIGl0IGdldHMgdXNlZCBhIGxvdCBpbiB2ZXJ5IHJlZHVuZGFudCBmaWxlcy4gIFRoZSBsZW5ndGgKKyAgICAgIDI1OCBpcyBzcGVjaWFsIHNpbmNlIDI1OCAtIDMgKHRoZSBtaW4gbWF0Y2ggbGVuZ3RoKSBpcyAyNTUuCisgIDEzLiBUaGUgbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgYml0IGxlbmd0aHMgYXJlIHJlYWQgYXMgYQorICAgICAgc2luZ2xlIHN0cmVhbSBvZiBsZW5ndGhzLiAgSXQgaXMgcG9zc2libGUgKGFuZCBhZHZhbnRhZ2VvdXMpIGZvcgorICAgICAgYSByZXBlYXQgY29kZSAoMTYsIDE3LCBvciAxOCkgdG8gZ28gYWNyb3NzIHRoZSBib3VuZGFyeSBiZXR3ZWVuCisgICAgICB0aGUgdHdvIHNldHMgb2YgbGVuZ3Rocy4KKyAqLworCisKK3ZvaWQgaW5mbGF0ZV9ibG9ja3NfcmVzZXQocywgeiwgYykKK2luZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKK3pfc3RyZWFtcCB6OwordUxvbmdmICpjOworeworICBpZiAoYyAhPSBaX05VTEwpCisgICAgKmMgPSBzLT5jaGVjazsKKyAgaWYgKHMtPm1vZGUgPT0gQlRSRUUgfHwgcy0+bW9kZSA9PSBEVFJFRSkKKyAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOworICBpZiAocy0+bW9kZSA9PSBDT0RFUykKKyAgICBpbmZsYXRlX2NvZGVzX2ZyZWUocy0+c3ViLmRlY29kZS5jb2Rlcywgeik7CisgIHMtPm1vZGUgPSBUWVBFOworICBzLT5iaXRrID0gMDsKKyAgcy0+Yml0YiA9IDA7CisgIHMtPnJlYWQgPSBzLT53cml0ZSA9IHMtPndpbmRvdzsKKyAgaWYgKHMtPmNoZWNrZm4gIT0gWl9OVUxMKQorICAgIHotPmFkbGVyID0gcy0+Y2hlY2sgPSAoKnMtPmNoZWNrZm4pKDBMLCAoY29uc3QgQnl0ZWYgKilaX05VTEwsIDApOworICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgYmxvY2tzIHJlc2V0XG4iKSk7Cit9CisKKworaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICppbmZsYXRlX2Jsb2Nrc19uZXcoeiwgYywgdykKK3pfc3RyZWFtcCB6OworY2hlY2tfZnVuYyBjOwordUludCB3OworeworICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7CisKKyAgaWYgKChzID0gKGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqKVpBTExPQworICAgICAgICh6LDEsc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSkpKSA9PSBaX05VTEwpCisgICAgcmV0dXJuIHM7CisgIGlmICgocy0+aHVmdHMgPQorICAgICAgIChpbmZsYXRlX2h1ZnQgKilaQUxMT0Moeiwgc2l6ZW9mKGluZmxhdGVfaHVmdCksIE1BTlkpKSA9PSBaX05VTEwpCisgIHsKKyAgICBaRlJFRSh6LCBzKTsKKyAgICByZXR1cm4gWl9OVUxMOworICB9CisgIGlmICgocy0+d2luZG93ID0gKEJ5dGVmICopWkFMTE9DKHosIDEsIHcpKSA9PSBaX05VTEwpCisgIHsKKyAgICBaRlJFRSh6LCBzLT5odWZ0cyk7CisgICAgWkZSRUUoeiwgcyk7CisgICAgcmV0dXJuIFpfTlVMTDsKKyAgfQorICBzLT5lbmQgPSBzLT53aW5kb3cgKyB3OworICBzLT5jaGVja2ZuID0gYzsKKyAgcy0+bW9kZSA9IFRZUEU7CisgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBibG9ja3MgYWxsb2NhdGVkXG4iKSk7CisgIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHMsIHosIFpfTlVMTCk7CisgIHJldHVybiBzOworfQorCisKK2ludCBpbmZsYXRlX2Jsb2NrcyhzLCB6LCByKQoraW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOworel9zdHJlYW1wIHo7CitpbnQgcjsKK3sKKyAgdUludCB0OyAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSBzdG9yYWdlICovCisgIHVMb25nIGI7ICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgIHVJbnQgazsgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKyAgQnl0ZWYgKnA7ICAgICAgICAgICAgIC8qIGlucHV0IGRhdGEgcG9pbnRlciAqLworICB1SW50IG47ICAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIHRoZXJlICovCisgIEJ5dGVmICpxOyAgICAgICAgICAgICAvKiBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KKyAgdUludCBtOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyICovCisKKyAgLyogY29weSBpbnB1dC9vdXRwdXQgaW5mb3JtYXRpb24gdG8gbG9jYWxzIChVUERBVEUgbWFjcm8gcmVzdG9yZXMpICovCisgIExPQUQKKworICAvKiBwcm9jZXNzIGlucHV0IGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUgKi8KKyAgd2hpbGUgKDEpIHN3aXRjaCAocy0+bW9kZSkKKyAgeworICAgIGNhc2UgVFlQRToKKyAgICAgIE5FRURCSVRTKDMpCisgICAgICB0ID0gKHVJbnQpYiAmIDc7CisgICAgICBzLT5sYXN0ID0gdCAmIDE7CisgICAgICBzd2l0Y2ggKHQgPj4gMSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZWQgKi8KKyAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgcy0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgRFVNUEJJVFMoMykKKyAgICAgICAgICB0ID0gayAmIDc7ICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCisgICAgICAgICAgRFVNUEJJVFModCkKKyAgICAgICAgICBzLT5tb2RlID0gTEVOUzsgICAgICAgICAgICAgICAvKiBnZXQgbGVuZ3RoIG9mIHN0b3JlZCBibG9jayAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkICovCisgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgcy0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgeworICAgICAgICAgICAgdUludCBibCwgYmQ7CisgICAgICAgICAgICBpbmZsYXRlX2h1ZnQgKnRsLCAqdGQ7CisKKyAgICAgICAgICAgIGluZmxhdGVfdHJlZXNfZml4ZWQoJmJsLCAmYmQsICZ0bCwgJnRkLCB6KTsKKyAgICAgICAgICAgIHMtPnN1Yi5kZWNvZGUuY29kZXMgPSBpbmZsYXRlX2NvZGVzX25ldyhibCwgYmQsIHRsLCB0ZCwgeik7CisgICAgICAgICAgICBpZiAocy0+c3ViLmRlY29kZS5jb2RlcyA9PSBaX05VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHIgPSBaX01FTV9FUlJPUjsKKyAgICAgICAgICAgICAgTEVBVkUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgRFVNUEJJVFMoMykKKyAgICAgICAgICBzLT5tb2RlID0gQ09ERVM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyAqLworICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgcy0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgRFVNUEJJVFMoMykKKyAgICAgICAgICBzLT5tb2RlID0gVEFCTEU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgLyogaWxsZWdhbCAqLworICAgICAgICAgIERVTVBCSVRTKDMpCisgICAgICAgICAgcy0+bW9kZSA9IEJBRDsKKyAgICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgYmxvY2sgdHlwZSI7CisgICAgICAgICAgciA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICBMRUFWRQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBMRU5TOgorICAgICAgTkVFREJJVFMoMzIpCisgICAgICBpZiAoKCgofmIpID4+IDE2KSAmIDB4ZmZmZikgIT0gKGIgJiAweGZmZmYpKQorICAgICAgeworICAgICAgICBzLT5tb2RlID0gQkFEOworICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOworICAgICAgICByID0gWl9EQVRBX0VSUk9SOworICAgICAgICBMRUFWRQorICAgICAgfQorICAgICAgcy0+c3ViLmxlZnQgPSAodUludCliICYgMHhmZmZmOworICAgICAgYiA9IGsgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBkdW1wIGJpdHMgKi8KKyAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxuIiwgcy0+c3ViLmxlZnQpKTsKKyAgICAgIHMtPm1vZGUgPSBzLT5zdWIubGVmdCA/IFNUT1JFRCA6IChzLT5sYXN0ID8gRFJZIDogVFlQRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUT1JFRDoKKyAgICAgIGlmIChuID09IDApCisgICAgICAgIExFQVZFCisgICAgICBORUVET1VUCisgICAgICB0ID0gcy0+c3ViLmxlZnQ7CisgICAgICBpZiAodCA+IG4pIHQgPSBuOworICAgICAgaWYgKHQgPiBtKSB0ID0gbTsKKyAgICAgIHptZW1jcHkocSwgcCwgdCk7CisgICAgICBwICs9IHQ7ICBuIC09IHQ7CisgICAgICBxICs9IHQ7ICBtIC09IHQ7CisgICAgICBpZiAoKHMtPnN1Yi5sZWZ0IC09IHQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kLCAlbHUgdG90YWwgb3V0XG4iLAorICAgICAgICAgICAgICB6LT50b3RhbF9vdXQgKyAocSA+PSBzLT5yZWFkID8gcSAtIHMtPnJlYWQgOgorICAgICAgICAgICAgICAocy0+ZW5kIC0gcy0+cmVhZCkgKyAocSAtIHMtPndpbmRvdykpKSk7CisgICAgICBzLT5tb2RlID0gcy0+bGFzdCA/IERSWSA6IFRZUEU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBQkxFOgorICAgICAgTkVFREJJVFMoMTQpCisgICAgICBzLT5zdWIudHJlZXMudGFibGUgPSB0ID0gKHVJbnQpYiAmIDB4M2ZmZjsKKyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgICAgIGlmICgodCAmIDB4MWYpID4gMjkgfHwgKCh0ID4+IDUpICYgMHgxZikgPiAyOSkKKyAgICAgIHsKKyAgICAgICAgcy0+bW9kZSA9IEJBRDsKKyAgICAgICAgei0+bXNnID0gKGNoYXIqKSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7CisgICAgICAgIHIgPSBaX0RBVEFfRVJST1I7CisgICAgICAgIExFQVZFCisgICAgICB9CisjZW5kaWYKKyAgICAgIHQgPSAyNTggKyAodCAmIDB4MWYpICsgKCh0ID4+IDUpICYgMHgxZik7CisgICAgICBpZiAoKHMtPnN1Yi50cmVlcy5ibGVucyA9ICh1SW50ZiopWkFMTE9DKHosIHQsIHNpemVvZih1SW50KSkpID09IFpfTlVMTCkKKyAgICAgIHsKKyAgICAgICAgciA9IFpfTUVNX0VSUk9SOworICAgICAgICBMRUFWRQorICAgICAgfQorICAgICAgRFVNUEJJVFMoMTQpCisgICAgICBzLT5zdWIudHJlZXMuaW5kZXggPSAwOworICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOworICAgICAgcy0+bW9kZSA9IEJUUkVFOworICAgIGNhc2UgQlRSRUU6CisgICAgICB3aGlsZSAocy0+c3ViLnRyZWVzLmluZGV4IDwgNCArIChzLT5zdWIudHJlZXMudGFibGUgPj4gMTApKQorICAgICAgeworICAgICAgICBORUVEQklUUygzKQorICAgICAgICBzLT5zdWIudHJlZXMuYmxlbnNbYm9yZGVyW3MtPnN1Yi50cmVlcy5pbmRleCsrXV0gPSAodUludCliICYgNzsKKyAgICAgICAgRFVNUEJJVFMoMykKKyAgICAgIH0KKyAgICAgIHdoaWxlIChzLT5zdWIudHJlZXMuaW5kZXggPCAxOSkKKyAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zW2JvcmRlcltzLT5zdWIudHJlZXMuaW5kZXgrK11dID0gMDsKKyAgICAgIHMtPnN1Yi50cmVlcy5iYiA9IDc7CisgICAgICB0ID0gaW5mbGF0ZV90cmVlc19iaXRzKHMtPnN1Yi50cmVlcy5ibGVucywgJnMtPnN1Yi50cmVlcy5iYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnN1Yi50cmVlcy50Yiwgcy0+aHVmdHMsIHopOworICAgICAgaWYgKHQgIT0gWl9PSykKKyAgICAgIHsKKyAgICAgICAgciA9IHQ7CisgICAgICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgIFpGUkVFKHosIHMtPnN1Yi50cmVlcy5ibGVucyk7CisgICAgICAgICAgcy0+bW9kZSA9IEJBRDsKKyAgICAgICAgfQorICAgICAgICBMRUFWRQorICAgICAgfQorICAgICAgcy0+c3ViLnRyZWVzLmluZGV4ID0gMDsKKyAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgYml0cyB0cmVlIG9rXG4iKSk7CisgICAgICBzLT5tb2RlID0gRFRSRUU7CisgICAgY2FzZSBEVFJFRToKKyAgICAgIHdoaWxlICh0ID0gcy0+c3ViLnRyZWVzLnRhYmxlLAorICAgICAgICAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA8IDI1OCArICh0ICYgMHgxZikgKyAoKHQgPj4gNSkgJiAweDFmKSkKKyAgICAgIHsKKyAgICAgICAgaW5mbGF0ZV9odWZ0ICpoOworICAgICAgICB1SW50IGksIGosIGM7CisKKyAgICAgICAgdCA9IHMtPnN1Yi50cmVlcy5iYjsKKyAgICAgICAgTkVFREJJVFModCkKKyAgICAgICAgaCA9IHMtPnN1Yi50cmVlcy50YiArICgodUludCliICYgaW5mbGF0ZV9tYXNrW3RdKTsKKyAgICAgICAgdCA9IGgtPmJpdHM7CisgICAgICAgIGMgPSBoLT5iYXNlOworICAgICAgICBpZiAoYyA8IDE2KQorICAgICAgICB7CisgICAgICAgICAgRFVNUEJJVFModCkKKyAgICAgICAgICBzLT5zdWIudHJlZXMuYmxlbnNbcy0+c3ViLnRyZWVzLmluZGV4KytdID0gYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGMgPT0gMTYuLjE4ICovCisgICAgICAgIHsKKyAgICAgICAgICBpID0gYyA9PSAxOCA/IDcgOiBjIC0gMTQ7CisgICAgICAgICAgaiA9IGMgPT0gMTggPyAxMSA6IDM7CisgICAgICAgICAgTkVFREJJVFModCArIGkpCisgICAgICAgICAgRFVNUEJJVFModCkKKyAgICAgICAgICBqICs9ICh1SW50KWIgJiBpbmZsYXRlX21hc2tbaV07CisgICAgICAgICAgRFVNUEJJVFMoaSkKKyAgICAgICAgICBpID0gcy0+c3ViLnRyZWVzLmluZGV4OworICAgICAgICAgIHQgPSBzLT5zdWIudHJlZXMudGFibGU7CisgICAgICAgICAgaWYgKGkgKyBqID4gMjU4ICsgKHQgJiAweDFmKSArICgodCA+PiA1KSAmIDB4MWYpIHx8CisgICAgICAgICAgICAgIChjID09IDE2ICYmIGkgPCAxKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOworICAgICAgICAgICAgcy0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICByID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgTEVBVkUKKyAgICAgICAgICB9CisgICAgICAgICAgYyA9IGMgPT0gMTYgPyBzLT5zdWIudHJlZXMuYmxlbnNbaSAtIDFdIDogMDsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBzLT5zdWIudHJlZXMuYmxlbnNbaSsrXSA9IGM7CisgICAgICAgICAgfSB3aGlsZSAoLS1qKTsKKyAgICAgICAgICBzLT5zdWIudHJlZXMuaW5kZXggPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgICBzLT5zdWIudHJlZXMudGIgPSBaX05VTEw7CisgICAgICB7CisgICAgICAgIHVJbnQgYmwsIGJkOworICAgICAgICBpbmZsYXRlX2h1ZnQgKnRsLCAqdGQ7CisgICAgICAgIGluZmxhdGVfY29kZXNfc3RhdGVmICpjOworCisgICAgICAgIGJsID0gOTsgICAgICAgICAvKiBtdXN0IGJlIDw9IDkgZm9yIGxvb2thaGVhZCBhc3N1bXB0aW9ucyAqLworICAgICAgICBiZCA9IDY7ICAgICAgICAgLyogbXVzdCBiZSA8PSA5IGZvciBsb29rYWhlYWQgYXNzdW1wdGlvbnMgKi8KKyAgICAgICAgdCA9IHMtPnN1Yi50cmVlcy50YWJsZTsKKyAgICAgICAgdCA9IGluZmxhdGVfdHJlZXNfZHluYW1pYygyNTcgKyAodCAmIDB4MWYpLCAxICsgKCh0ID4+IDUpICYgMHgxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zLCAmYmwsICZiZCwgJnRsLCAmdGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aHVmdHMsIHopOworICAgICAgICBpZiAodCAhPSBaX09LKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHQgPT0gKHVJbnQpWl9EQVRBX0VSUk9SKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFpGUkVFKHosIHMtPnN1Yi50cmVlcy5ibGVucyk7CisgICAgICAgICAgICBzLT5tb2RlID0gQkFEOworICAgICAgICAgIH0KKyAgICAgICAgICByID0gdDsKKyAgICAgICAgICBMRUFWRQorICAgICAgICB9CisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdHJlZXMgb2tcbiIpKTsKKyAgICAgICAgaWYgKChjID0gaW5mbGF0ZV9jb2Rlc19uZXcoYmwsIGJkLCB0bCwgdGQsIHopKSA9PSBaX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICByID0gWl9NRU1fRVJST1I7CisgICAgICAgICAgTEVBVkUKKyAgICAgICAgfQorICAgICAgICBzLT5zdWIuZGVjb2RlLmNvZGVzID0gYzsKKyAgICAgIH0KKyAgICAgIFpGUkVFKHosIHMtPnN1Yi50cmVlcy5ibGVucyk7CisgICAgICBzLT5tb2RlID0gQ09ERVM7CisgICAgY2FzZSBDT0RFUzoKKyAgICAgIFVQREFURQorICAgICAgaWYgKChyID0gaW5mbGF0ZV9jb2RlcyhzLCB6LCByKSkgIT0gWl9TVFJFQU1fRU5EKQorICAgICAgICByZXR1cm4gaW5mbGF0ZV9mbHVzaChzLCB6LCByKTsKKyAgICAgIHIgPSBaX09LOworICAgICAgaW5mbGF0ZV9jb2Rlc19mcmVlKHMtPnN1Yi5kZWNvZGUuY29kZXMsIHopOworICAgICAgTE9BRAorICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBlbmQsICVsdSB0b3RhbCBvdXRcbiIsCisgICAgICAgICAgICAgIHotPnRvdGFsX291dCArIChxID49IHMtPnJlYWQgPyBxIC0gcy0+cmVhZCA6CisgICAgICAgICAgICAgIChzLT5lbmQgLSBzLT5yZWFkKSArIChxIC0gcy0+d2luZG93KSkpKTsKKyAgICAgIGlmICghcy0+bGFzdCkKKyAgICAgIHsKKyAgICAgICAgcy0+bW9kZSA9IFRZUEU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcy0+bW9kZSA9IERSWTsKKyAgICBjYXNlIERSWToKKyAgICAgIEZMVVNICisgICAgICBpZiAocy0+cmVhZCAhPSBzLT53cml0ZSkKKyAgICAgICAgTEVBVkUKKyAgICAgIHMtPm1vZGUgPSBET05FOworICAgIGNhc2UgRE9ORToKKyAgICAgIHIgPSBaX1NUUkVBTV9FTkQ7CisgICAgICBMRUFWRQorICAgIGNhc2UgQkFEOgorICAgICAgciA9IFpfREFUQV9FUlJPUjsKKyAgICAgIExFQVZFCisgICAgZGVmYXVsdDoKKyAgICAgIHIgPSBaX1NUUkVBTV9FUlJPUjsKKyAgICAgIExFQVZFCisgIH0KK30KKworCitpbnQgaW5mbGF0ZV9ibG9ja3NfZnJlZShzLCB6KQoraW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOworel9zdHJlYW1wIHo7Cit7CisgIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHMsIHosIFpfTlVMTCk7CisgIFpGUkVFKHosIHMtPndpbmRvdyk7CisgIFpGUkVFKHosIHMtPmh1ZnRzKTsKKyAgWkZSRUUoeiwgcyk7CisgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBibG9ja3MgZnJlZWRcbiIpKTsKKyAgcmV0dXJuIFpfT0s7Cit9CisKKwordm9pZCBpbmZsYXRlX3NldF9kaWN0aW9uYXJ5KHMsIGQsIG4pCitpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Citjb25zdCBCeXRlZiAqZDsKK3VJbnQgIG47Cit7CisgIHptZW1jcHkocy0+d2luZG93LCBkLCBuKTsKKyAgcy0+cmVhZCA9IHMtPndyaXRlID0gcy0+d2luZG93ICsgbjsKK30KKworCisvKiBSZXR1cm5zIHRydWUgaWYgaW5mbGF0ZSBpcyBjdXJyZW50bHkgYXQgdGhlIGVuZCBvZiBhIGJsb2NrIGdlbmVyYXRlZAorICogYnkgWl9TWU5DX0ZMVVNIIG9yIFpfRlVMTF9GTFVTSC4gCisgKiBJTiBhc3NlcnRpb246IHMgIT0gWl9OVUxMCisgKi8KK2ludCBpbmZsYXRlX2Jsb2Nrc19zeW5jX3BvaW50KHMpCitpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Cit7CisgIHJldHVybiBzLT5tb2RlID09IExFTlM7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9pbmZibG9jay5oIGIvY29tbW9uL3psaWIvaW5mYmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzNiMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvaW5mYmxvY2suaApAQCAtMCwwICsxLDM5IEBACisvKiBpbmZibG9jay5oIC0tIGhlYWRlciB0byB1c2UgaW5mYmxvY2suYworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUgRkFSIGluZmxhdGVfYmxvY2tzX3N0YXRlZjsKKworZXh0ZXJuIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqIGluZmxhdGVfYmxvY2tzX25ldyBPRigoCisgICAgel9zdHJlYW1wIHosCisgICAgY2hlY2tfZnVuYyBjLCAgICAgICAgICAgICAgIC8qIGNoZWNrIGZ1bmN0aW9uICovCisgICAgdUludCB3KSk7ICAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplICovCisKK2V4dGVybiBpbnQgaW5mbGF0ZV9ibG9ja3MgT0YoKAorICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAorICAgIHpfc3RyZWFtcCAsCisgICAgaW50KSk7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWwgcmV0dXJuIGNvZGUgKi8KKworZXh0ZXJuIHZvaWQgaW5mbGF0ZV9ibG9ja3NfcmVzZXQgT0YoKAorICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAorICAgIHpfc3RyZWFtcCAsCisgICAgdUxvbmdmICopKTsgICAgICAgICAgICAgICAgICAvKiBjaGVjayB2YWx1ZSBvbiBvdXRwdXQgKi8KKworZXh0ZXJuIGludCBpbmZsYXRlX2Jsb2Nrc19mcmVlIE9GKCgKKyAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKKyAgICB6X3N0cmVhbXApKTsKKworZXh0ZXJuIHZvaWQgaW5mbGF0ZV9zZXRfZGljdGlvbmFyeSBPRigoCisgICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzLAorICAgIGNvbnN0IEJ5dGVmICpkLCAgLyogZGljdGlvbmFyeSAqLworICAgIHVJbnQgIG4pKTsgICAgICAgLyogZGljdGlvbmFyeSBsZW5ndGggKi8KKworZXh0ZXJuIGludCBpbmZsYXRlX2Jsb2Nrc19zeW5jX3BvaW50IE9GKCgKKyAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnMpKTsKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2luZmNvZGVzLmMgYi9jb21tb24vemxpYi9pbmZjb2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYmU1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9pbmZjb2Rlcy5jCkBAIC0wLDAgKzEsMjUxIEBACisvKiBpbmZjb2Rlcy5jIC0tIHByb2Nlc3MgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZSBwYWlycworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmJsb2NrLmgiCisjaW5jbHVkZSAiaW5mY29kZXMuaCIKKyNpbmNsdWRlICJpbmZ1dGlsLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisvKiBzaW1wbGlmeSB0aGUgdXNlIG9mIHRoZSBpbmZsYXRlX2h1ZnQgdHlwZSB3aXRoIHNvbWUgZGVmaW5lcyAqLworI2RlZmluZSBleG9wIHdvcmQud2hhdC5FeG9wCisjZGVmaW5lIGJpdHMgd29yZC53aGF0LkJpdHMKKwordHlwZWRlZiBlbnVtIHsgICAgICAgIC8qIHdhaXRpbmcgZm9yICJpOiI9aW5wdXQsICJvOiI9b3V0cHV0LCAieDoiPW5vdGhpbmcgKi8KKyAgICAgIFNUQVJULCAgICAvKiB4OiBzZXQgdXAgZm9yIExFTiAqLworICAgICAgTEVOLCAgICAgIC8qIGk6IGdldCBsZW5ndGgvbGl0ZXJhbC9lb2IgbmV4dCAqLworICAgICAgTEVORVhULCAgIC8qIGk6IGdldHRpbmcgbGVuZ3RoIGV4dHJhIChoYXZlIGJhc2UpICovCisgICAgICBESVNULCAgICAgLyogaTogZ2V0IGRpc3RhbmNlIG5leHQgKi8KKyAgICAgIERJU1RFWFQsICAvKiBpOiBnZXR0aW5nIGRpc3RhbmNlIGV4dHJhICovCisgICAgICBDT1BZLCAgICAgLyogbzogY29weWluZyBieXRlcyBpbiB3aW5kb3csIHdhaXRpbmcgZm9yIHNwYWNlICovCisgICAgICBMSVQsICAgICAgLyogbzogZ290IGxpdGVyYWwsIHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSAqLworICAgICAgV0FTSCwgICAgIC8qIG86IGdvdCBlb2IsIHBvc3NpYmx5IHN0aWxsIG91dHB1dCB3YWl0aW5nICovCisgICAgICBFTkQsICAgICAgLyogeDogZ290IGVvYiBhbmQgYWxsIGRhdGEgZmx1c2hlZCAqLworICAgICAgQkFEQ09ERX0gIC8qIHg6IGdvdCBlcnJvciAqLworaW5mbGF0ZV9jb2Rlc19tb2RlOworCisvKiBpbmZsYXRlIGNvZGVzIHByaXZhdGUgc3RhdGUgKi8KK3N0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlIHsKKworICAvKiBtb2RlICovCisgIGluZmxhdGVfY29kZXNfbW9kZSBtb2RlOyAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZV9jb2RlcyBtb2RlICovCisKKyAgLyogbW9kZSBkZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KKyAgdUludCBsZW47CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgaW5mbGF0ZV9odWZ0ICp0cmVlOyAgICAgICAvKiBwb2ludGVyIGludG8gdHJlZSAqLworICAgICAgdUludCBuZWVkOyAgICAgICAgICAgICAgICAvKiBiaXRzIG5lZWRlZCAqLworICAgIH0gY29kZTsgICAgICAgICAgICAgLyogaWYgTEVOIG9yIERJU1QsIHdoZXJlIGluIHRyZWUgKi8KKyAgICB1SW50IGxpdDsgICAgICAgICAgIC8qIGlmIExJVCwgbGl0ZXJhbCAqLworICAgIHN0cnVjdCB7CisgICAgICB1SW50IGdldDsgICAgICAgICAgICAgICAgIC8qIGJpdHMgdG8gZ2V0IGZvciBleHRyYSAqLworICAgICAgdUludCBkaXN0OyAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgZnJvbSAqLworICAgIH0gY29weTsgICAgICAgICAgICAgLyogaWYgRVhUIG9yIENPUFksIHdoZXJlIGFuZCBob3cgbXVjaCAqLworICB9IHN1YjsgICAgICAgICAgICAgICAgLyogc3VibW9kZSAqLworCisgIC8qIG1vZGUgaW5kZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KKyAgQnl0ZSBsYml0czsgICAgICAgICAgIC8qIGx0cmVlIGJpdHMgZGVjb2RlZCBwZXIgYnJhbmNoICovCisgIEJ5dGUgZGJpdHM7ICAgICAgICAgICAvKiBkdHJlZSBiaXRzIGRlY29kZXIgcGVyIGJyYW5jaCAqLworICBpbmZsYXRlX2h1ZnQgKmx0cmVlOyAgICAgICAgICAvKiBsaXRlcmFsL2xlbmd0aC9lb2IgdHJlZSAqLworICBpbmZsYXRlX2h1ZnQgKmR0cmVlOyAgICAgICAgICAvKiBkaXN0YW5jZSB0cmVlICovCisKK307CisKKworaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKmluZmxhdGVfY29kZXNfbmV3KGJsLCBiZCwgdGwsIHRkLCB6KQordUludCBibCwgYmQ7CitpbmZsYXRlX2h1ZnQgKnRsOworaW5mbGF0ZV9odWZ0ICp0ZDsgLyogbmVlZCBzZXBhcmF0ZSBkZWNsYXJhdGlvbiBmb3IgQm9ybGFuZCBDKysgKi8KK3pfc3RyZWFtcCB6OworeworICBpbmZsYXRlX2NvZGVzX3N0YXRlZiAqYzsKKworICBpZiAoKGMgPSAoaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKikKKyAgICAgICBaQUxMT0MoeiwxLHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSkpKSAhPSBaX05VTEwpCisgIHsKKyAgICBjLT5tb2RlID0gU1RBUlQ7CisgICAgYy0+bGJpdHMgPSAoQnl0ZSlibDsKKyAgICBjLT5kYml0cyA9IChCeXRlKWJkOworICAgIGMtPmx0cmVlID0gdGw7CisgICAgYy0+ZHRyZWUgPSB0ZDsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG5ld1xuIikpOworICB9CisgIHJldHVybiBjOworfQorCisKK2ludCBpbmZsYXRlX2NvZGVzKHMsIHosIHIpCitpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Cit6X3N0cmVhbXAgejsKK2ludCByOworeworICB1SW50IGo7ICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgKi8KKyAgaW5mbGF0ZV9odWZ0ICp0OyAgICAgIC8qIHRlbXBvcmFyeSBwb2ludGVyICovCisgIHVJbnQgZTsgICAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG9yIG9wZXJhdGlvbiAqLworICB1TG9uZyBiOyAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworICB1SW50IGs7ICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisgIEJ5dGVmICpwOyAgICAgICAgICAgICAvKiBpbnB1dCBkYXRhIHBvaW50ZXIgKi8KKyAgdUludCBuOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIGF2YWlsYWJsZSB0aGVyZSAqLworICBCeXRlZiAqcTsgICAgICAgICAgICAgLyogb3V0cHV0IHdpbmRvdyB3cml0ZSBwb2ludGVyICovCisgIHVJbnQgbTsgICAgICAgICAgICAgICAvKiBieXRlcyB0byBlbmQgb2Ygd2luZG93IG9yIHJlYWQgcG9pbnRlciAqLworICBCeXRlZiAqZjsgICAgICAgICAgICAgLyogcG9pbnRlciB0byBjb3B5IHN0cmluZ3MgZnJvbSAqLworICBpbmZsYXRlX2NvZGVzX3N0YXRlZiAqYyA9IHMtPnN1Yi5kZWNvZGUuY29kZXM7ICAvKiBjb2RlcyBzdGF0ZSAqLworCisgIC8qIGNvcHkgaW5wdXQvb3V0cHV0IGluZm9ybWF0aW9uIHRvIGxvY2FscyAoVVBEQVRFIG1hY3JvIHJlc3RvcmVzKSAqLworICBMT0FECisKKyAgLyogcHJvY2VzcyBpbnB1dCBhbmQgb3V0cHV0IGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUgKi8KKyAgd2hpbGUgKDEpIHN3aXRjaCAoYy0+bW9kZSkKKyAgeyAgICAgICAgICAgICAvKiB3YWl0aW5nIGZvciAiaToiPWlucHV0LCAibzoiPW91dHB1dCwgIng6Ij1ub3RoaW5nICovCisgICAgY2FzZSBTVEFSVDogICAgICAgICAvKiB4OiBzZXQgdXAgZm9yIExFTiAqLworI2lmbmRlZiBTTE9XCisgICAgICBpZiAobSA+PSAyNTggJiYgbiA+PSAxMCkKKyAgICAgIHsKKyAgICAgICAgVVBEQVRFCisgICAgICAgIHIgPSBpbmZsYXRlX2Zhc3QoYy0+bGJpdHMsIGMtPmRiaXRzLCBjLT5sdHJlZSwgYy0+ZHRyZWUsIHMsIHopOworICAgICAgICBMT0FECisgICAgICAgIGlmIChyICE9IFpfT0spCisgICAgICAgIHsKKyAgICAgICAgICBjLT5tb2RlID0gciA9PSBaX1NUUkVBTV9FTkQgPyBXQVNIIDogQkFEQ09ERTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qICFTTE9XICovCisgICAgICBjLT5zdWIuY29kZS5uZWVkID0gYy0+bGJpdHM7CisgICAgICBjLT5zdWIuY29kZS50cmVlID0gYy0+bHRyZWU7CisgICAgICBjLT5tb2RlID0gTEVOOworICAgIGNhc2UgTEVOOiAgICAgICAgICAgLyogaTogZ2V0IGxlbmd0aC9saXRlcmFsL2VvYiBuZXh0ICovCisgICAgICBqID0gYy0+c3ViLmNvZGUubmVlZDsKKyAgICAgIE5FRURCSVRTKGopCisgICAgICB0ID0gYy0+c3ViLmNvZGUudHJlZSArICgodUludCliICYgaW5mbGF0ZV9tYXNrW2pdKTsKKyAgICAgIERVTVBCSVRTKHQtPmJpdHMpCisgICAgICBlID0gKHVJbnQpKHQtPmV4b3ApOworICAgICAgaWYgKGUgPT0gMCkgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovCisgICAgICB7CisgICAgICAgIGMtPnN1Yi5saXQgPSB0LT5iYXNlOworICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIHQtPmJhc2UgPj0gMHgyMCAmJiB0LT5iYXNlIDwgMHg3ZiA/CisgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6CisgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCB0LT5iYXNlKSk7CisgICAgICAgIGMtPm1vZGUgPSBMSVQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGUgJiAxNikgICAgICAgICAgICAgICAvKiBsZW5ndGggKi8KKyAgICAgIHsKKyAgICAgICAgYy0+c3ViLmNvcHkuZ2V0ID0gZSAmIDE1OworICAgICAgICBjLT5sZW4gPSB0LT5iYXNlOworICAgICAgICBjLT5tb2RlID0gTEVORVhUOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICgoZSAmIDY0KSA9PSAwKSAgICAgICAgLyogbmV4dCB0YWJsZSAqLworICAgICAgeworICAgICAgICBjLT5zdWIuY29kZS5uZWVkID0gZTsKKyAgICAgICAgYy0+c3ViLmNvZGUudHJlZSA9IHQgKyB0LT5iYXNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChlICYgMzIpICAgICAgICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovCisgICAgICB7CisgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXG4iKSk7CisgICAgICAgIGMtPm1vZGUgPSBXQVNIOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGMtPm1vZGUgPSBCQURDT0RFOyAgICAgICAgLyogaW52YWxpZCBjb2RlICovCisgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICByID0gWl9EQVRBX0VSUk9SOworICAgICAgTEVBVkUKKyAgICBjYXNlIExFTkVYVDogICAgICAgIC8qIGk6IGdldHRpbmcgbGVuZ3RoIGV4dHJhIChoYXZlIGJhc2UpICovCisgICAgICBqID0gYy0+c3ViLmNvcHkuZ2V0OworICAgICAgTkVFREJJVFMoaikKKyAgICAgIGMtPmxlbiArPSAodUludCliICYgaW5mbGF0ZV9tYXNrW2pdOworICAgICAgRFVNUEJJVFMoaikKKyAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBjLT5kYml0czsKKyAgICAgIGMtPnN1Yi5jb2RlLnRyZWUgPSBjLT5kdHJlZTsKKyAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBjLT5sZW4pKTsKKyAgICAgIGMtPm1vZGUgPSBESVNUOworICAgIGNhc2UgRElTVDogICAgICAgICAgLyogaTogZ2V0IGRpc3RhbmNlIG5leHQgKi8KKyAgICAgIGogPSBjLT5zdWIuY29kZS5uZWVkOworICAgICAgTkVFREJJVFMoaikKKyAgICAgIHQgPSBjLT5zdWIuY29kZS50cmVlICsgKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbal0pOworICAgICAgRFVNUEJJVFModC0+Yml0cykKKyAgICAgIGUgPSAodUludCkodC0+ZXhvcCk7CisgICAgICBpZiAoZSAmIDE2KSAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlICovCisgICAgICB7CisgICAgICAgIGMtPnN1Yi5jb3B5LmdldCA9IGUgJiAxNTsKKyAgICAgICAgYy0+c3ViLmNvcHkuZGlzdCA9IHQtPmJhc2U7CisgICAgICAgIGMtPm1vZGUgPSBESVNURVhUOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICgoZSAmIDY0KSA9PSAwKSAgICAgICAgLyogbmV4dCB0YWJsZSAqLworICAgICAgeworICAgICAgICBjLT5zdWIuY29kZS5uZWVkID0gZTsKKyAgICAgICAgYy0+c3ViLmNvZGUudHJlZSA9IHQgKyB0LT5iYXNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGMtPm1vZGUgPSBCQURDT0RFOyAgICAgICAgLyogaW52YWxpZCBjb2RlICovCisgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICByID0gWl9EQVRBX0VSUk9SOworICAgICAgTEVBVkUKKyAgICBjYXNlIERJU1RFWFQ6ICAgICAgIC8qIGk6IGdldHRpbmcgZGlzdGFuY2UgZXh0cmEgKi8KKyAgICAgIGogPSBjLT5zdWIuY29weS5nZXQ7CisgICAgICBORUVEQklUUyhqKQorICAgICAgYy0+c3ViLmNvcHkuZGlzdCArPSAodUludCliICYgaW5mbGF0ZV9tYXNrW2pdOworICAgICAgRFVNUEJJVFMoaikKKyAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIGMtPnN1Yi5jb3B5LmRpc3QpKTsKKyAgICAgIGMtPm1vZGUgPSBDT1BZOworICAgIGNhc2UgQ09QWTogICAgICAgICAgLyogbzogY29weWluZyBieXRlcyBpbiB3aW5kb3csIHdhaXRpbmcgZm9yIHNwYWNlICovCisgICAgICBmID0gcSAtIGMtPnN1Yi5jb3B5LmRpc3Q7CisgICAgICB3aGlsZSAoZiA8IHMtPndpbmRvdykgICAgICAgICAgICAgLyogbW9kdWxvIHdpbmRvdyBzaXplLSJ3aGlsZSIgaW5zdGVhZCAqLworICAgICAgICBmICs9IHMtPmVuZCAtIHMtPndpbmRvdzsgICAgICAgIC8qIG9mICJpZiIgaGFuZGxlcyBpbnZhbGlkIGRpc3RhbmNlcyAqLworICAgICAgd2hpbGUgKGMtPmxlbikKKyAgICAgIHsKKyAgICAgICAgTkVFRE9VVAorICAgICAgICBPVVRCWVRFKCpmKyspCisgICAgICAgIGlmIChmID09IHMtPmVuZCkKKyAgICAgICAgICBmID0gcy0+d2luZG93OworICAgICAgICBjLT5sZW4tLTsKKyAgICAgIH0KKyAgICAgIGMtPm1vZGUgPSBTVEFSVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTElUOiAgICAgICAgICAgLyogbzogZ290IGxpdGVyYWwsIHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSAqLworICAgICAgTkVFRE9VVAorICAgICAgT1VUQllURShjLT5zdWIubGl0KQorICAgICAgYy0+bW9kZSA9IFNUQVJUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXQVNIOiAgICAgICAgICAvKiBvOiBnb3QgZW9iLCBwb3NzaWJseSBtb3JlIG91dHB1dCAqLworICAgICAgaWYgKGsgPiA3KSAgICAgICAgLyogcmV0dXJuIHVudXNlZCBieXRlLCBpZiBhbnkgKi8KKyAgICAgIHsKKyAgICAgICAgQXNzZXJ0KGsgPCAxNiwgImluZmxhdGVfY29kZXMgZ3JhYmJlZCB0b28gbWFueSBieXRlcyIpCisgICAgICAgIGsgLT0gODsKKyAgICAgICAgbisrOworICAgICAgICBwLS07ICAgICAgICAgICAgLyogY2FuIGFsd2F5cyByZXR1cm4gb25lICovCisgICAgICB9CisgICAgICBGTFVTSAorICAgICAgaWYgKHMtPnJlYWQgIT0gcy0+d3JpdGUpCisgICAgICAgIExFQVZFCisgICAgICBjLT5tb2RlID0gRU5EOworICAgIGNhc2UgRU5EOgorICAgICAgciA9IFpfU1RSRUFNX0VORDsKKyAgICAgIExFQVZFCisgICAgY2FzZSBCQURDT0RFOiAgICAgICAvKiB4OiBnb3QgZXJyb3IgKi8KKyAgICAgIHIgPSBaX0RBVEFfRVJST1I7CisgICAgICBMRUFWRQorICAgIGRlZmF1bHQ6CisgICAgICByID0gWl9TVFJFQU1fRVJST1I7CisgICAgICBMRUFWRQorICB9CisjaWZkZWYgTkVFRF9EVU1NWV9SRVRVUk4KKyAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyAgLyogU29tZSBkdW1iIGNvbXBpbGVycyBjb21wbGFpbiB3aXRob3V0IHRoaXMgKi8KKyNlbmRpZgorfQorCisKK3ZvaWQgaW5mbGF0ZV9jb2Rlc19mcmVlKGMsIHopCitpbmZsYXRlX2NvZGVzX3N0YXRlZiAqYzsKK3pfc3RyZWFtcCB6OworeworICBaRlJFRSh6LCBjKTsKKyAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBmcmVlXG4iKSk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9pbmZjb2Rlcy5oIGIvY29tbW9uL3psaWIvaW5mY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjgyMWEwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvaW5mY29kZXMuaApAQCAtMCwwICsxLDI3IEBACisvKiBpbmZjb2Rlcy5oIC0tIGhlYWRlciB0byB1c2UgaW5mY29kZXMuYworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlIEZBUiBpbmZsYXRlX2NvZGVzX3N0YXRlZjsKKworZXh0ZXJuIGluZmxhdGVfY29kZXNfc3RhdGVmICppbmZsYXRlX2NvZGVzX25ldyBPRigoCisgICAgdUludCwgdUludCwKKyAgICBpbmZsYXRlX2h1ZnQgKiwgaW5mbGF0ZV9odWZ0ICosCisgICAgel9zdHJlYW1wICkpOworCitleHRlcm4gaW50IGluZmxhdGVfY29kZXMgT0YoKAorICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAorICAgIHpfc3RyZWFtcCAsCisgICAgaW50KSk7CisKK2V4dGVybiB2b2lkIGluZmxhdGVfY29kZXNfZnJlZSBPRigoCisgICAgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKiwKKyAgICB6X3N0cmVhbXAgKSk7CisKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2luZmZhc3QuYyBiL2NvbW1vbi96bGliL2luZmZhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTdmMWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvaW5mZmFzdC5jCkBAIC0wLDAgKzEsMTgzIEBACisvKiBpbmZmYXN0LmMgLS0gcHJvY2VzcyBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlIHBhaXJzIGZhc3QKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZibG9jay5oIgorI2luY2x1ZGUgImluZmNvZGVzLmgiCisjaW5jbHVkZSAiaW5mdXRpbC5oIgorI2luY2x1ZGUgImluZmZhc3QuaCIKKworc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGUge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisKKy8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCisjZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKKyNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cworCisvKiBtYWNyb3MgZm9yIGJpdCBpbnB1dCB3aXRoIG5vIGNoZWNraW5nIGFuZCBmb3IgcmV0dXJuaW5nIHVudXNlZCBieXRlcyAqLworI2RlZmluZSBHUkFCQklUUyhqKSB7d2hpbGUoazwoaikpe2J8PSgodUxvbmcpTkVYVEJZVEUpPDxrO2srPTg7fX0KKyNkZWZpbmUgVU5HUkFCIHtjPXotPmF2YWlsX2luLW47Yz0oaz4+Myk8Yz9rPj4zOmM7bis9YztwLT1jO2stPWM8PDM7fQorCisvKiBDYWxsZWQgd2l0aCBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byB3cml0ZSBpbiB3aW5kb3cgYXQgbGVhc3QgMjU4CisgICAodGhlIG1heGltdW0gc3RyaW5nIGxlbmd0aCkgYW5kIG51bWJlciBvZiBpbnB1dCBieXRlcyBhdmFpbGFibGUKKyAgIGF0IGxlYXN0IHRlbi4gIFRoZSB0ZW4gYnl0ZXMgYXJlIHNpeCBieXRlcyBmb3IgdGhlIGxvbmdlc3QgbGVuZ3RoLworICAgZGlzdGFuY2UgcGFpciBwbHVzIGZvdXIgYnl0ZXMgZm9yIG92ZXJsb2FkaW5nIHRoZSBiaXQgYnVmZmVyLiAqLworCitpbnQgaW5mbGF0ZV9mYXN0KGJsLCBiZCwgdGwsIHRkLCBzLCB6KQordUludCBibCwgYmQ7CitpbmZsYXRlX2h1ZnQgKnRsOworaW5mbGF0ZV9odWZ0ICp0ZDsgLyogbmVlZCBzZXBhcmF0ZSBkZWNsYXJhdGlvbiBmb3IgQm9ybGFuZCBDKysgKi8KK2luZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKK3pfc3RyZWFtcCB6OworeworICBpbmZsYXRlX2h1ZnQgKnQ7ICAgICAgLyogdGVtcG9yYXJ5IHBvaW50ZXIgKi8KKyAgdUludCBlOyAgICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCisgIHVMb25nIGI7ICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgIHVJbnQgazsgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKyAgQnl0ZWYgKnA7ICAgICAgICAgICAgIC8qIGlucHV0IGRhdGEgcG9pbnRlciAqLworICB1SW50IG47ICAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIHRoZXJlICovCisgIEJ5dGVmICpxOyAgICAgICAgICAgICAvKiBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KKyAgdUludCBtOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyICovCisgIHVJbnQgbWw7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsaXRlcmFsL2xlbmd0aCB0cmVlICovCisgIHVJbnQgbWQ7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBkaXN0YW5jZSB0cmVlICovCisgIHVJbnQgYzsgICAgICAgICAgICAgICAvKiBieXRlcyB0byBjb3B5ICovCisgIHVJbnQgZDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgZnJvbSAqLworICBCeXRlZiAqcjsgICAgICAgICAgICAgLyogY29weSBzb3VyY2UgcG9pbnRlciAqLworCisgIC8qIGxvYWQgaW5wdXQsIG91dHB1dCwgYml0IHZhbHVlcyAqLworICBMT0FECisKKyAgLyogaW5pdGlhbGl6ZSBtYXNrcyAqLworICBtbCA9IGluZmxhdGVfbWFza1tibF07CisgIG1kID0gaW5mbGF0ZV9tYXNrW2JkXTsKKworICAvKiBkbyB1bnRpbCBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBzcGFjZSBmb3IgZmFzdCBsb29wICovCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtZSBjYWxsZWQgd2l0aCBtID49IDI1OCAmJiBuID49IDEwICovCisgICAgLyogZ2V0IGxpdGVyYWwvbGVuZ3RoIGNvZGUgKi8KKyAgICBHUkFCQklUUygyMCkgICAgICAgICAgICAgICAgLyogbWF4IGJpdHMgZm9yIGxpdGVyYWwvbGVuZ3RoIGNvZGUgKi8KKyAgICBpZiAoKGUgPSAodCA9IHRsICsgKCh1SW50KWIgJiBtbCkpLT5leG9wKSA9PSAwKQorICAgIHsKKyAgICAgIERVTVBCSVRTKHQtPmJpdHMpCisgICAgICBUcmFjZXZ2KChzdGRlcnIsIHQtPmJhc2UgPj0gMHgyMCAmJiB0LT5iYXNlIDwgMHg3ZiA/CisgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgKiBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgICogbGl0ZXJhbCAweCUwMnhcbiIsIHQtPmJhc2UpKTsKKyAgICAgICpxKysgPSAoQnl0ZSl0LT5iYXNlOworICAgICAgbS0tOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGRvIHsKKyAgICAgIERVTVBCSVRTKHQtPmJpdHMpCisgICAgICBpZiAoZSAmIDE2KQorICAgICAgeworICAgICAgICAvKiBnZXQgZXh0cmEgYml0cyBmb3IgbGVuZ3RoICovCisgICAgICAgIGUgJj0gMTU7CisgICAgICAgIGMgPSB0LT5iYXNlICsgKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbZV0pOworICAgICAgICBEVU1QQklUUyhlKQorICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgICogbGVuZ3RoICV1XG4iLCBjKSk7CisKKyAgICAgICAgLyogZGVjb2RlIGRpc3RhbmNlIGJhc2Ugb2YgYmxvY2sgdG8gY29weSAqLworICAgICAgICBHUkFCQklUUygxNSk7ICAgICAgICAgICAvKiBtYXggYml0cyBmb3IgZGlzdGFuY2UgY29kZSAqLworICAgICAgICBlID0gKHQgPSB0ZCArICgodUludCliICYgbWQpKS0+ZXhvcDsKKyAgICAgICAgZG8geworICAgICAgICAgIERVTVBCSVRTKHQtPmJpdHMpCisgICAgICAgICAgaWYgKGUgJiAxNikKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBnZXQgZXh0cmEgYml0cyB0byBhZGQgdG8gZGlzdGFuY2UgYmFzZSAqLworICAgICAgICAgICAgZSAmPSAxNTsKKyAgICAgICAgICAgIEdSQUJCSVRTKGUpICAgICAgICAgLyogZ2V0IGV4dHJhIGJpdHMgKHVwIHRvIDEzKSAqLworICAgICAgICAgICAgZCA9IHQtPmJhc2UgKyAoKHVJbnQpYiAmIGluZmxhdGVfbWFza1tlXSk7CisgICAgICAgICAgICBEVU1QQklUUyhlKQorICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICAqIGRpc3RhbmNlICV1XG4iLCBkKSk7CisKKyAgICAgICAgICAgIC8qIGRvIHRoZSBjb3B5ICovCisgICAgICAgICAgICBtIC09IGM7CisgICAgICAgICAgICByID0gcSAtIGQ7CisgICAgICAgICAgICBpZiAociA8IHMtPndpbmRvdykgICAgICAgICAgICAgICAgICAvKiB3cmFwIGlmIG5lZWRlZCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgciArPSBzLT5lbmQgLSBzLT53aW5kb3c7ICAgICAgICAvKiBmb3JjZSBwb2ludGVyIGluIHdpbmRvdyAqLworICAgICAgICAgICAgICB9IHdoaWxlIChyIDwgcy0+d2luZG93KTsgICAgICAgICAgLyogY292ZXJzIGludmFsaWQgZGlzdGFuY2VzICovCisgICAgICAgICAgICAgIGUgPSBzLT5lbmQgLSByOworICAgICAgICAgICAgICBpZiAoYyA+IGUpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjIC09IGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyYXBwZWQgY29weSAqLworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9ICpyKys7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1lKTsKKyAgICAgICAgICAgICAgICByID0gcy0+d2luZG93OworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9ICpyKys7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9ybWFsIGNvcHkgKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpxKysgPSAqcisrOyAgYy0tOworICAgICAgICAgICAgICAgICpxKysgPSAqcisrOyAgYy0tOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9ICpyKys7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9ybWFsIGNvcHkgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKnErKyA9ICpyKys7ICBjLS07CisgICAgICAgICAgICAgICpxKysgPSAqcisrOyAgYy0tOworICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgKnErKyA9ICpyKys7CisgICAgICAgICAgICAgIH0gd2hpbGUgKC0tYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoKGUgJiA2NCkgPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICB0ICs9IHQtPmJhc2U7CisgICAgICAgICAgICBlID0gKHQgKz0gKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbZV0pKS0+ZXhvcDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICAgIFVOR1JBQgorICAgICAgICAgICAgVVBEQVRFCisgICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoMSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKChlICYgNjQpID09IDApCisgICAgICB7CisgICAgICAgIHQgKz0gdC0+YmFzZTsKKyAgICAgICAgaWYgKChlID0gKHQgKz0gKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbZV0pKS0+ZXhvcCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIERVTVBCSVRTKHQtPmJpdHMpCisgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCB0LT5iYXNlID49IDB4MjAgJiYgdC0+YmFzZSA8IDB4N2YgPworICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICAqIGxpdGVyYWwgJyVjJ1xuIiA6CisgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgICogbGl0ZXJhbCAweCUwMnhcbiIsIHQtPmJhc2UpKTsKKyAgICAgICAgICAqcSsrID0gKEJ5dGUpdC0+YmFzZTsKKyAgICAgICAgICBtLS07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGUgJiAzMikKKyAgICAgIHsKKyAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICAqIGVuZCBvZiBibG9ja1xuIikpOworICAgICAgICBVTkdSQUIKKyAgICAgICAgVVBEQVRFCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FTkQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKKyAgICAgICAgVU5HUkFCCisgICAgICAgIFVQREFURQorICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgICAgfQorICAgIH0gd2hpbGUgKDEpOworICB9IHdoaWxlIChtID49IDI1OCAmJiBuID49IDEwKTsKKworICAvKiBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dC0tcmVzdG9yZSBwb2ludGVycyBhbmQgcmV0dXJuICovCisgIFVOR1JBQgorICBVUERBVEUKKyAgcmV0dXJuIFpfT0s7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9pbmZmYXN0LmggYi9jb21tb24vemxpYi9pbmZmYXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxYTRiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2luZmZhc3QuaApAQCAtMCwwICsxLDE3IEBACisvKiBpbmZmYXN0LmggLS0gaGVhZGVyIHRvIHVzZSBpbmZmYXN0LmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKK2V4dGVybiBpbnQgaW5mbGF0ZV9mYXN0IE9GKCgKKyAgICB1SW50LAorICAgIHVJbnQsCisgICAgaW5mbGF0ZV9odWZ0ICosCisgICAgaW5mbGF0ZV9odWZ0ICosCisgICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICosCisgICAgel9zdHJlYW1wICkpOwpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvaW5mZml4ZWQuaCBiL2NvbW1vbi96bGliL2luZmZpeGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmN2U3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2luZmZpeGVkLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qIGluZmZpeGVkLmggLS0gdGFibGUgZm9yIGRlY29kaW5nIGZpeGVkIGNvZGVzCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgbWFrZXRyZWUuYyBwcm9ncmFtCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKK2xvY2FsIHVJbnQgZml4ZWRfYmwgPSA5OworbG9jYWwgdUludCBmaXhlZF9iZCA9IDU7Citsb2NhbCBpbmZsYXRlX2h1ZnQgZml4ZWRfdGxbXSA9IHsKKyAgICB7e3s5Niw3fX0sMjU2fSwge3t7MCw4fX0sODB9LCB7e3swLDh9fSwxNn0sIHt7ezg0LDh9fSwxMTV9LAorICAgIHt7ezgyLDd9fSwzMX0sIHt7ezAsOH19LDExMn0sIHt7ezAsOH19LDQ4fSwge3t7MCw5fX0sMTkyfSwKKyAgICB7e3s4MCw3fX0sMTB9LCB7e3swLDh9fSw5Nn0sIHt7ezAsOH19LDMyfSwge3t7MCw5fX0sMTYwfSwKKyAgICB7e3swLDh9fSwwfSwge3t7MCw4fX0sMTI4fSwge3t7MCw4fX0sNjR9LCB7e3swLDl9fSwyMjR9LAorICAgIHt7ezgwLDd9fSw2fSwge3t7MCw4fX0sODh9LCB7e3swLDh9fSwyNH0sIHt7ezAsOX19LDE0NH0sCisgICAge3t7ODMsN319LDU5fSwge3t7MCw4fX0sMTIwfSwge3t7MCw4fX0sNTZ9LCB7e3swLDl9fSwyMDh9LAorICAgIHt7ezgxLDd9fSwxN30sIHt7ezAsOH19LDEwNH0sIHt7ezAsOH19LDQwfSwge3t7MCw5fX0sMTc2fSwKKyAgICB7e3swLDh9fSw4fSwge3t7MCw4fX0sMTM2fSwge3t7MCw4fX0sNzJ9LCB7e3swLDl9fSwyNDB9LAorICAgIHt7ezgwLDd9fSw0fSwge3t7MCw4fX0sODR9LCB7e3swLDh9fSwyMH0sIHt7ezg1LDh9fSwyMjd9LAorICAgIHt7ezgzLDd9fSw0M30sIHt7ezAsOH19LDExNn0sIHt7ezAsOH19LDUyfSwge3t7MCw5fX0sMjAwfSwKKyAgICB7e3s4MSw3fX0sMTN9LCB7e3swLDh9fSwxMDB9LCB7e3swLDh9fSwzNn0sIHt7ezAsOX19LDE2OH0sCisgICAge3t7MCw4fX0sNH0sIHt7ezAsOH19LDEzMn0sIHt7ezAsOH19LDY4fSwge3t7MCw5fX0sMjMyfSwKKyAgICB7e3s4MCw3fX0sOH0sIHt7ezAsOH19LDkyfSwge3t7MCw4fX0sMjh9LCB7e3swLDl9fSwxNTJ9LAorICAgIHt7ezg0LDd9fSw4M30sIHt7ezAsOH19LDEyNH0sIHt7ezAsOH19LDYwfSwge3t7MCw5fX0sMjE2fSwKKyAgICB7e3s4Miw3fX0sMjN9LCB7e3swLDh9fSwxMDh9LCB7e3swLDh9fSw0NH0sIHt7ezAsOX19LDE4NH0sCisgICAge3t7MCw4fX0sMTJ9LCB7e3swLDh9fSwxNDB9LCB7e3swLDh9fSw3Nn0sIHt7ezAsOX19LDI0OH0sCisgICAge3t7ODAsN319LDN9LCB7e3swLDh9fSw4Mn0sIHt7ezAsOH19LDE4fSwge3t7ODUsOH19LDE2M30sCisgICAge3t7ODMsN319LDM1fSwge3t7MCw4fX0sMTE0fSwge3t7MCw4fX0sNTB9LCB7e3swLDl9fSwxOTZ9LAorICAgIHt7ezgxLDd9fSwxMX0sIHt7ezAsOH19LDk4fSwge3t7MCw4fX0sMzR9LCB7e3swLDl9fSwxNjR9LAorICAgIHt7ezAsOH19LDJ9LCB7e3swLDh9fSwxMzB9LCB7e3swLDh9fSw2Nn0sIHt7ezAsOX19LDIyOH0sCisgICAge3t7ODAsN319LDd9LCB7e3swLDh9fSw5MH0sIHt7ezAsOH19LDI2fSwge3t7MCw5fX0sMTQ4fSwKKyAgICB7e3s4NCw3fX0sNjd9LCB7e3swLDh9fSwxMjJ9LCB7e3swLDh9fSw1OH0sIHt7ezAsOX19LDIxMn0sCisgICAge3t7ODIsN319LDE5fSwge3t7MCw4fX0sMTA2fSwge3t7MCw4fX0sNDJ9LCB7e3swLDl9fSwxODB9LAorICAgIHt7ezAsOH19LDEwfSwge3t7MCw4fX0sMTM4fSwge3t7MCw4fX0sNzR9LCB7e3swLDl9fSwyNDR9LAorICAgIHt7ezgwLDd9fSw1fSwge3t7MCw4fX0sODZ9LCB7e3swLDh9fSwyMn0sIHt7ezE5Miw4fX0sMH0sCisgICAge3t7ODMsN319LDUxfSwge3t7MCw4fX0sMTE4fSwge3t7MCw4fX0sNTR9LCB7e3swLDl9fSwyMDR9LAorICAgIHt7ezgxLDd9fSwxNX0sIHt7ezAsOH19LDEwMn0sIHt7ezAsOH19LDM4fSwge3t7MCw5fX0sMTcyfSwKKyAgICB7e3swLDh9fSw2fSwge3t7MCw4fX0sMTM0fSwge3t7MCw4fX0sNzB9LCB7e3swLDl9fSwyMzZ9LAorICAgIHt7ezgwLDd9fSw5fSwge3t7MCw4fX0sOTR9LCB7e3swLDh9fSwzMH0sIHt7ezAsOX19LDE1Nn0sCisgICAge3t7ODQsN319LDk5fSwge3t7MCw4fX0sMTI2fSwge3t7MCw4fX0sNjJ9LCB7e3swLDl9fSwyMjB9LAorICAgIHt7ezgyLDd9fSwyN30sIHt7ezAsOH19LDExMH0sIHt7ezAsOH19LDQ2fSwge3t7MCw5fX0sMTg4fSwKKyAgICB7e3swLDh9fSwxNH0sIHt7ezAsOH19LDE0Mn0sIHt7ezAsOH19LDc4fSwge3t7MCw5fX0sMjUyfSwKKyAgICB7e3s5Niw3fX0sMjU2fSwge3t7MCw4fX0sODF9LCB7e3swLDh9fSwxN30sIHt7ezg1LDh9fSwxMzF9LAorICAgIHt7ezgyLDd9fSwzMX0sIHt7ezAsOH19LDExM30sIHt7ezAsOH19LDQ5fSwge3t7MCw5fX0sMTk0fSwKKyAgICB7e3s4MCw3fX0sMTB9LCB7e3swLDh9fSw5N30sIHt7ezAsOH19LDMzfSwge3t7MCw5fX0sMTYyfSwKKyAgICB7e3swLDh9fSwxfSwge3t7MCw4fX0sMTI5fSwge3t7MCw4fX0sNjV9LCB7e3swLDl9fSwyMjZ9LAorICAgIHt7ezgwLDd9fSw2fSwge3t7MCw4fX0sODl9LCB7e3swLDh9fSwyNX0sIHt7ezAsOX19LDE0Nn0sCisgICAge3t7ODMsN319LDU5fSwge3t7MCw4fX0sMTIxfSwge3t7MCw4fX0sNTd9LCB7e3swLDl9fSwyMTB9LAorICAgIHt7ezgxLDd9fSwxN30sIHt7ezAsOH19LDEwNX0sIHt7ezAsOH19LDQxfSwge3t7MCw5fX0sMTc4fSwKKyAgICB7e3swLDh9fSw5fSwge3t7MCw4fX0sMTM3fSwge3t7MCw4fX0sNzN9LCB7e3swLDl9fSwyNDJ9LAorICAgIHt7ezgwLDd9fSw0fSwge3t7MCw4fX0sODV9LCB7e3swLDh9fSwyMX0sIHt7ezgwLDh9fSwyNTh9LAorICAgIHt7ezgzLDd9fSw0M30sIHt7ezAsOH19LDExN30sIHt7ezAsOH19LDUzfSwge3t7MCw5fX0sMjAyfSwKKyAgICB7e3s4MSw3fX0sMTN9LCB7e3swLDh9fSwxMDF9LCB7e3swLDh9fSwzN30sIHt7ezAsOX19LDE3MH0sCisgICAge3t7MCw4fX0sNX0sIHt7ezAsOH19LDEzM30sIHt7ezAsOH19LDY5fSwge3t7MCw5fX0sMjM0fSwKKyAgICB7e3s4MCw3fX0sOH0sIHt7ezAsOH19LDkzfSwge3t7MCw4fX0sMjl9LCB7e3swLDl9fSwxNTR9LAorICAgIHt7ezg0LDd9fSw4M30sIHt7ezAsOH19LDEyNX0sIHt7ezAsOH19LDYxfSwge3t7MCw5fX0sMjE4fSwKKyAgICB7e3s4Miw3fX0sMjN9LCB7e3swLDh9fSwxMDl9LCB7e3swLDh9fSw0NX0sIHt7ezAsOX19LDE4Nn0sCisgICAge3t7MCw4fX0sMTN9LCB7e3swLDh9fSwxNDF9LCB7e3swLDh9fSw3N30sIHt7ezAsOX19LDI1MH0sCisgICAge3t7ODAsN319LDN9LCB7e3swLDh9fSw4M30sIHt7ezAsOH19LDE5fSwge3t7ODUsOH19LDE5NX0sCisgICAge3t7ODMsN319LDM1fSwge3t7MCw4fX0sMTE1fSwge3t7MCw4fX0sNTF9LCB7e3swLDl9fSwxOTh9LAorICAgIHt7ezgxLDd9fSwxMX0sIHt7ezAsOH19LDk5fSwge3t7MCw4fX0sMzV9LCB7e3swLDl9fSwxNjZ9LAorICAgIHt7ezAsOH19LDN9LCB7e3swLDh9fSwxMzF9LCB7e3swLDh9fSw2N30sIHt7ezAsOX19LDIzMH0sCisgICAge3t7ODAsN319LDd9LCB7e3swLDh9fSw5MX0sIHt7ezAsOH19LDI3fSwge3t7MCw5fX0sMTUwfSwKKyAgICB7e3s4NCw3fX0sNjd9LCB7e3swLDh9fSwxMjN9LCB7e3swLDh9fSw1OX0sIHt7ezAsOX19LDIxNH0sCisgICAge3t7ODIsN319LDE5fSwge3t7MCw4fX0sMTA3fSwge3t7MCw4fX0sNDN9LCB7e3swLDl9fSwxODJ9LAorICAgIHt7ezAsOH19LDExfSwge3t7MCw4fX0sMTM5fSwge3t7MCw4fX0sNzV9LCB7e3swLDl9fSwyNDZ9LAorICAgIHt7ezgwLDd9fSw1fSwge3t7MCw4fX0sODd9LCB7e3swLDh9fSwyM30sIHt7ezE5Miw4fX0sMH0sCisgICAge3t7ODMsN319LDUxfSwge3t7MCw4fX0sMTE5fSwge3t7MCw4fX0sNTV9LCB7e3swLDl9fSwyMDZ9LAorICAgIHt7ezgxLDd9fSwxNX0sIHt7ezAsOH19LDEwM30sIHt7ezAsOH19LDM5fSwge3t7MCw5fX0sMTc0fSwKKyAgICB7e3swLDh9fSw3fSwge3t7MCw4fX0sMTM1fSwge3t7MCw4fX0sNzF9LCB7e3swLDl9fSwyMzh9LAorICAgIHt7ezgwLDd9fSw5fSwge3t7MCw4fX0sOTV9LCB7e3swLDh9fSwzMX0sIHt7ezAsOX19LDE1OH0sCisgICAge3t7ODQsN319LDk5fSwge3t7MCw4fX0sMTI3fSwge3t7MCw4fX0sNjN9LCB7e3swLDl9fSwyMjJ9LAorICAgIHt7ezgyLDd9fSwyN30sIHt7ezAsOH19LDExMX0sIHt7ezAsOH19LDQ3fSwge3t7MCw5fX0sMTkwfSwKKyAgICB7e3swLDh9fSwxNX0sIHt7ezAsOH19LDE0M30sIHt7ezAsOH19LDc5fSwge3t7MCw5fX0sMjU0fSwKKyAgICB7e3s5Niw3fX0sMjU2fSwge3t7MCw4fX0sODB9LCB7e3swLDh9fSwxNn0sIHt7ezg0LDh9fSwxMTV9LAorICAgIHt7ezgyLDd9fSwzMX0sIHt7ezAsOH19LDExMn0sIHt7ezAsOH19LDQ4fSwge3t7MCw5fX0sMTkzfSwKKyAgICB7e3s4MCw3fX0sMTB9LCB7e3swLDh9fSw5Nn0sIHt7ezAsOH19LDMyfSwge3t7MCw5fX0sMTYxfSwKKyAgICB7e3swLDh9fSwwfSwge3t7MCw4fX0sMTI4fSwge3t7MCw4fX0sNjR9LCB7e3swLDl9fSwyMjV9LAorICAgIHt7ezgwLDd9fSw2fSwge3t7MCw4fX0sODh9LCB7e3swLDh9fSwyNH0sIHt7ezAsOX19LDE0NX0sCisgICAge3t7ODMsN319LDU5fSwge3t7MCw4fX0sMTIwfSwge3t7MCw4fX0sNTZ9LCB7e3swLDl9fSwyMDl9LAorICAgIHt7ezgxLDd9fSwxN30sIHt7ezAsOH19LDEwNH0sIHt7ezAsOH19LDQwfSwge3t7MCw5fX0sMTc3fSwKKyAgICB7e3swLDh9fSw4fSwge3t7MCw4fX0sMTM2fSwge3t7MCw4fX0sNzJ9LCB7e3swLDl9fSwyNDF9LAorICAgIHt7ezgwLDd9fSw0fSwge3t7MCw4fX0sODR9LCB7e3swLDh9fSwyMH0sIHt7ezg1LDh9fSwyMjd9LAorICAgIHt7ezgzLDd9fSw0M30sIHt7ezAsOH19LDExNn0sIHt7ezAsOH19LDUyfSwge3t7MCw5fX0sMjAxfSwKKyAgICB7e3s4MSw3fX0sMTN9LCB7e3swLDh9fSwxMDB9LCB7e3swLDh9fSwzNn0sIHt7ezAsOX19LDE2OX0sCisgICAge3t7MCw4fX0sNH0sIHt7ezAsOH19LDEzMn0sIHt7ezAsOH19LDY4fSwge3t7MCw5fX0sMjMzfSwKKyAgICB7e3s4MCw3fX0sOH0sIHt7ezAsOH19LDkyfSwge3t7MCw4fX0sMjh9LCB7e3swLDl9fSwxNTN9LAorICAgIHt7ezg0LDd9fSw4M30sIHt7ezAsOH19LDEyNH0sIHt7ezAsOH19LDYwfSwge3t7MCw5fX0sMjE3fSwKKyAgICB7e3s4Miw3fX0sMjN9LCB7e3swLDh9fSwxMDh9LCB7e3swLDh9fSw0NH0sIHt7ezAsOX19LDE4NX0sCisgICAge3t7MCw4fX0sMTJ9LCB7e3swLDh9fSwxNDB9LCB7e3swLDh9fSw3Nn0sIHt7ezAsOX19LDI0OX0sCisgICAge3t7ODAsN319LDN9LCB7e3swLDh9fSw4Mn0sIHt7ezAsOH19LDE4fSwge3t7ODUsOH19LDE2M30sCisgICAge3t7ODMsN319LDM1fSwge3t7MCw4fX0sMTE0fSwge3t7MCw4fX0sNTB9LCB7e3swLDl9fSwxOTd9LAorICAgIHt7ezgxLDd9fSwxMX0sIHt7ezAsOH19LDk4fSwge3t7MCw4fX0sMzR9LCB7e3swLDl9fSwxNjV9LAorICAgIHt7ezAsOH19LDJ9LCB7e3swLDh9fSwxMzB9LCB7e3swLDh9fSw2Nn0sIHt7ezAsOX19LDIyOX0sCisgICAge3t7ODAsN319LDd9LCB7e3swLDh9fSw5MH0sIHt7ezAsOH19LDI2fSwge3t7MCw5fX0sMTQ5fSwKKyAgICB7e3s4NCw3fX0sNjd9LCB7e3swLDh9fSwxMjJ9LCB7e3swLDh9fSw1OH0sIHt7ezAsOX19LDIxM30sCisgICAge3t7ODIsN319LDE5fSwge3t7MCw4fX0sMTA2fSwge3t7MCw4fX0sNDJ9LCB7e3swLDl9fSwxODF9LAorICAgIHt7ezAsOH19LDEwfSwge3t7MCw4fX0sMTM4fSwge3t7MCw4fX0sNzR9LCB7e3swLDl9fSwyNDV9LAorICAgIHt7ezgwLDd9fSw1fSwge3t7MCw4fX0sODZ9LCB7e3swLDh9fSwyMn0sIHt7ezE5Miw4fX0sMH0sCisgICAge3t7ODMsN319LDUxfSwge3t7MCw4fX0sMTE4fSwge3t7MCw4fX0sNTR9LCB7e3swLDl9fSwyMDV9LAorICAgIHt7ezgxLDd9fSwxNX0sIHt7ezAsOH19LDEwMn0sIHt7ezAsOH19LDM4fSwge3t7MCw5fX0sMTczfSwKKyAgICB7e3swLDh9fSw2fSwge3t7MCw4fX0sMTM0fSwge3t7MCw4fX0sNzB9LCB7e3swLDl9fSwyMzd9LAorICAgIHt7ezgwLDd9fSw5fSwge3t7MCw4fX0sOTR9LCB7e3swLDh9fSwzMH0sIHt7ezAsOX19LDE1N30sCisgICAge3t7ODQsN319LDk5fSwge3t7MCw4fX0sMTI2fSwge3t7MCw4fX0sNjJ9LCB7e3swLDl9fSwyMjF9LAorICAgIHt7ezgyLDd9fSwyN30sIHt7ezAsOH19LDExMH0sIHt7ezAsOH19LDQ2fSwge3t7MCw5fX0sMTg5fSwKKyAgICB7e3swLDh9fSwxNH0sIHt7ezAsOH19LDE0Mn0sIHt7ezAsOH19LDc4fSwge3t7MCw5fX0sMjUzfSwKKyAgICB7e3s5Niw3fX0sMjU2fSwge3t7MCw4fX0sODF9LCB7e3swLDh9fSwxN30sIHt7ezg1LDh9fSwxMzF9LAorICAgIHt7ezgyLDd9fSwzMX0sIHt7ezAsOH19LDExM30sIHt7ezAsOH19LDQ5fSwge3t7MCw5fX0sMTk1fSwKKyAgICB7e3s4MCw3fX0sMTB9LCB7e3swLDh9fSw5N30sIHt7ezAsOH19LDMzfSwge3t7MCw5fX0sMTYzfSwKKyAgICB7e3swLDh9fSwxfSwge3t7MCw4fX0sMTI5fSwge3t7MCw4fX0sNjV9LCB7e3swLDl9fSwyMjd9LAorICAgIHt7ezgwLDd9fSw2fSwge3t7MCw4fX0sODl9LCB7e3swLDh9fSwyNX0sIHt7ezAsOX19LDE0N30sCisgICAge3t7ODMsN319LDU5fSwge3t7MCw4fX0sMTIxfSwge3t7MCw4fX0sNTd9LCB7e3swLDl9fSwyMTF9LAorICAgIHt7ezgxLDd9fSwxN30sIHt7ezAsOH19LDEwNX0sIHt7ezAsOH19LDQxfSwge3t7MCw5fX0sMTc5fSwKKyAgICB7e3swLDh9fSw5fSwge3t7MCw4fX0sMTM3fSwge3t7MCw4fX0sNzN9LCB7e3swLDl9fSwyNDN9LAorICAgIHt7ezgwLDd9fSw0fSwge3t7MCw4fX0sODV9LCB7e3swLDh9fSwyMX0sIHt7ezgwLDh9fSwyNTh9LAorICAgIHt7ezgzLDd9fSw0M30sIHt7ezAsOH19LDExN30sIHt7ezAsOH19LDUzfSwge3t7MCw5fX0sMjAzfSwKKyAgICB7e3s4MSw3fX0sMTN9LCB7e3swLDh9fSwxMDF9LCB7e3swLDh9fSwzN30sIHt7ezAsOX19LDE3MX0sCisgICAge3t7MCw4fX0sNX0sIHt7ezAsOH19LDEzM30sIHt7ezAsOH19LDY5fSwge3t7MCw5fX0sMjM1fSwKKyAgICB7e3s4MCw3fX0sOH0sIHt7ezAsOH19LDkzfSwge3t7MCw4fX0sMjl9LCB7e3swLDl9fSwxNTV9LAorICAgIHt7ezg0LDd9fSw4M30sIHt7ezAsOH19LDEyNX0sIHt7ezAsOH19LDYxfSwge3t7MCw5fX0sMjE5fSwKKyAgICB7e3s4Miw3fX0sMjN9LCB7e3swLDh9fSwxMDl9LCB7e3swLDh9fSw0NX0sIHt7ezAsOX19LDE4N30sCisgICAge3t7MCw4fX0sMTN9LCB7e3swLDh9fSwxNDF9LCB7e3swLDh9fSw3N30sIHt7ezAsOX19LDI1MX0sCisgICAge3t7ODAsN319LDN9LCB7e3swLDh9fSw4M30sIHt7ezAsOH19LDE5fSwge3t7ODUsOH19LDE5NX0sCisgICAge3t7ODMsN319LDM1fSwge3t7MCw4fX0sMTE1fSwge3t7MCw4fX0sNTF9LCB7e3swLDl9fSwxOTl9LAorICAgIHt7ezgxLDd9fSwxMX0sIHt7ezAsOH19LDk5fSwge3t7MCw4fX0sMzV9LCB7e3swLDl9fSwxNjd9LAorICAgIHt7ezAsOH19LDN9LCB7e3swLDh9fSwxMzF9LCB7e3swLDh9fSw2N30sIHt7ezAsOX19LDIzMX0sCisgICAge3t7ODAsN319LDd9LCB7e3swLDh9fSw5MX0sIHt7ezAsOH19LDI3fSwge3t7MCw5fX0sMTUxfSwKKyAgICB7e3s4NCw3fX0sNjd9LCB7e3swLDh9fSwxMjN9LCB7e3swLDh9fSw1OX0sIHt7ezAsOX19LDIxNX0sCisgICAge3t7ODIsN319LDE5fSwge3t7MCw4fX0sMTA3fSwge3t7MCw4fX0sNDN9LCB7e3swLDl9fSwxODN9LAorICAgIHt7ezAsOH19LDExfSwge3t7MCw4fX0sMTM5fSwge3t7MCw4fX0sNzV9LCB7e3swLDl9fSwyNDd9LAorICAgIHt7ezgwLDd9fSw1fSwge3t7MCw4fX0sODd9LCB7e3swLDh9fSwyM30sIHt7ezE5Miw4fX0sMH0sCisgICAge3t7ODMsN319LDUxfSwge3t7MCw4fX0sMTE5fSwge3t7MCw4fX0sNTV9LCB7e3swLDl9fSwyMDd9LAorICAgIHt7ezgxLDd9fSwxNX0sIHt7ezAsOH19LDEwM30sIHt7ezAsOH19LDM5fSwge3t7MCw5fX0sMTc1fSwKKyAgICB7e3swLDh9fSw3fSwge3t7MCw4fX0sMTM1fSwge3t7MCw4fX0sNzF9LCB7e3swLDl9fSwyMzl9LAorICAgIHt7ezgwLDd9fSw5fSwge3t7MCw4fX0sOTV9LCB7e3swLDh9fSwzMX0sIHt7ezAsOX19LDE1OX0sCisgICAge3t7ODQsN319LDk5fSwge3t7MCw4fX0sMTI3fSwge3t7MCw4fX0sNjN9LCB7e3swLDl9fSwyMjN9LAorICAgIHt7ezgyLDd9fSwyN30sIHt7ezAsOH19LDExMX0sIHt7ezAsOH19LDQ3fSwge3t7MCw5fX0sMTkxfSwKKyAgICB7e3swLDh9fSwxNX0sIHt7ezAsOH19LDE0M30sIHt7ezAsOH19LDc5fSwge3t7MCw5fX0sMjU1fQorICB9OworbG9jYWwgaW5mbGF0ZV9odWZ0IGZpeGVkX3RkW10gPSB7CisgICAge3t7ODAsNX19LDF9LCB7e3s4Nyw1fX0sMjU3fSwge3t7ODMsNX19LDE3fSwge3t7OTEsNX19LDQwOTd9LAorICAgIHt7ezgxLDV9fSw1fSwge3t7ODksNX19LDEwMjV9LCB7e3s4NSw1fX0sNjV9LCB7e3s5Myw1fX0sMTYzODV9LAorICAgIHt7ezgwLDV9fSwzfSwge3t7ODgsNX19LDUxM30sIHt7ezg0LDV9fSwzM30sIHt7ezkyLDV9fSw4MTkzfSwKKyAgICB7e3s4Miw1fX0sOX0sIHt7ezkwLDV9fSwyMDQ5fSwge3t7ODYsNX19LDEyOX0sIHt7ezE5Miw1fX0sMjQ1Nzd9LAorICAgIHt7ezgwLDV9fSwyfSwge3t7ODcsNX19LDM4NX0sIHt7ezgzLDV9fSwyNX0sIHt7ezkxLDV9fSw2MTQ1fSwKKyAgICB7e3s4MSw1fX0sN30sIHt7ezg5LDV9fSwxNTM3fSwge3t7ODUsNX19LDk3fSwge3t7OTMsNX19LDI0NTc3fSwKKyAgICB7e3s4MCw1fX0sNH0sIHt7ezg4LDV9fSw3Njl9LCB7e3s4NCw1fX0sNDl9LCB7e3s5Miw1fX0sMTIyODl9LAorICAgIHt7ezgyLDV9fSwxM30sIHt7ezkwLDV9fSwzMDczfSwge3t7ODYsNX19LDE5M30sIHt7ezE5Miw1fX0sMjQ1Nzd9CisgIH07CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9pbmZsYXRlLmMgYi9jb21tb24vemxpYi9pbmZsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiMmU4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2luZmxhdGUuYwpAQCAtMCwwICsxLDM2NiBAQAorLyogaW5mbGF0ZS5jIC0tIHpsaWIgaW50ZXJmYWNlIHRvIGluZmxhdGUgbW9kdWxlcworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZibG9jay5oIgorCitzdHJ1Y3QgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgICBNRVRIT0QsICAgLyogd2FpdGluZyBmb3IgbWV0aG9kIGJ5dGUgKi8KKyAgICAgIEZMQUcsICAgICAvKiB3YWl0aW5nIGZvciBmbGFnIGJ5dGUgKi8KKyAgICAgIERJQ1Q0LCAgICAvKiBmb3VyIGRpY3Rpb25hcnkgY2hlY2sgYnl0ZXMgdG8gZ28gKi8KKyAgICAgIERJQ1QzLCAgICAvKiB0aHJlZSBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvICovCisgICAgICBESUNUMiwgICAgLyogdHdvIGRpY3Rpb25hcnkgY2hlY2sgYnl0ZXMgdG8gZ28gKi8KKyAgICAgIERJQ1QxLCAgICAvKiBvbmUgZGljdGlvbmFyeSBjaGVjayBieXRlIHRvIGdvICovCisgICAgICBESUNUMCwgICAgLyogd2FpdGluZyBmb3IgaW5mbGF0ZVNldERpY3Rpb25hcnkgKi8KKyAgICAgIEJMT0NLUywgICAvKiBkZWNvbXByZXNzaW5nIGJsb2NrcyAqLworICAgICAgQ0hFQ0s0LCAgIC8qIGZvdXIgY2hlY2sgYnl0ZXMgdG8gZ28gKi8KKyAgICAgIENIRUNLMywgICAvKiB0aHJlZSBjaGVjayBieXRlcyB0byBnbyAqLworICAgICAgQ0hFQ0syLCAgIC8qIHR3byBjaGVjayBieXRlcyB0byBnbyAqLworICAgICAgQ0hFQ0sxLCAgIC8qIG9uZSBjaGVjayBieXRlIHRvIGdvICovCisgICAgICBET05FLCAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgKi8KKyAgICAgIEJBRH0gICAgICAvKiBnb3QgYW4gZXJyb3ItLXN0YXkgaGVyZSAqLworaW5mbGF0ZV9tb2RlOworCisvKiBpbmZsYXRlIHByaXZhdGUgc3RhdGUgKi8KK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7CisKKyAgLyogbW9kZSAqLworICBpbmZsYXRlX21vZGUgIG1vZGU7ICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi8KKworICAvKiBtb2RlIGRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLworICB1bmlvbiB7CisgICAgdUludCBtZXRob2Q7ICAgICAgICAvKiBpZiBGTEFHUywgbWV0aG9kIGJ5dGUgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgdUxvbmcgd2FzOyAgICAgICAgICAgICAgICAvKiBjb21wdXRlZCBjaGVjayB2YWx1ZSAqLworICAgICAgdUxvbmcgbmVlZDsgICAgICAgICAgICAgICAvKiBzdHJlYW0gY2hlY2sgdmFsdWUgKi8KKyAgICB9IGNoZWNrOyAgICAgICAgICAgIC8qIGlmIENIRUNLLCBjaGVjayB2YWx1ZXMgdG8gY29tcGFyZSAqLworICAgIHVJbnQgbWFya2VyOyAgICAgICAgLyogaWYgQkFELCBpbmZsYXRlU3luYydzIG1hcmtlciBieXRlcyBjb3VudCAqLworICB9IHN1YjsgICAgICAgIC8qIHN1Ym1vZGUgKi8KKworICAvKiBtb2RlIGluZGVwZW5kZW50IGluZm9ybWF0aW9uICovCisgIGludCAgbm93cmFwOyAgICAgICAgICAvKiBmbGFnIGZvciBubyB3cmFwcGVyICovCisgIHVJbnQgd2JpdHM7ICAgICAgICAgICAvKiBsb2cyKHdpbmRvdyBzaXplKSAgKDguLjE1LCBkZWZhdWx0cyB0byAxNSkgKi8KKyAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmIAorICAgICpibG9ja3M7ICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlX2Jsb2NrcyBzdGF0ZSAqLworCit9OworCisKK2ludCBaRVhQT1JUIGluZmxhdGVSZXNldCh6KQorel9zdHJlYW1wIHo7Cit7CisgIGlmICh6ID09IFpfTlVMTCB8fCB6LT5zdGF0ZSA9PSBaX05VTEwpCisgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICB6LT50b3RhbF9pbiA9IHotPnRvdGFsX291dCA9IDA7CisgIHotPm1zZyA9IFpfTlVMTDsKKyAgei0+c3RhdGUtPm1vZGUgPSB6LT5zdGF0ZS0+bm93cmFwID8gQkxPQ0tTIDogTUVUSE9EOworICBpbmZsYXRlX2Jsb2Nrc19yZXNldCh6LT5zdGF0ZS0+YmxvY2tzLCB6LCBaX05VTEwpOworICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IHJlc2V0XG4iKSk7CisgIHJldHVybiBaX09LOworfQorCisKK2ludCBaRVhQT1JUIGluZmxhdGVFbmQoeikKK3pfc3RyZWFtcCB6OworeworICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPnpmcmVlID09IFpfTlVMTCkKKyAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgIGlmICh6LT5zdGF0ZS0+YmxvY2tzICE9IFpfTlVMTCkKKyAgICBpbmZsYXRlX2Jsb2Nrc19mcmVlKHotPnN0YXRlLT5ibG9ja3MsIHopOworICBaRlJFRSh6LCB6LT5zdGF0ZSk7CisgIHotPnN0YXRlID0gWl9OVUxMOworICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGVuZFxuIikpOworICByZXR1cm4gWl9PSzsKK30KKworCitpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDJfKHosIHcsIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW1wIHo7CitpbnQgdzsKK2NvbnN0IGNoYXIgKnZlcnNpb247CitpbnQgc3RyZWFtX3NpemU7Cit7CisgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IFpMSUJfVkVSU0lPTlswXSB8fAorICAgICAgc3RyZWFtX3NpemUgIT0gc2l6ZW9mKHpfc3RyZWFtKSkKKyAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7CisKKyAgLyogaW5pdGlhbGl6ZSBzdGF0ZSAqLworICBpZiAoeiA9PSBaX05VTEwpCisgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICB6LT5tc2cgPSBaX05VTEw7CisgIGlmICh6LT56YWxsb2MgPT0gWl9OVUxMKQorICB7CisgICAgei0+emFsbG9jID0gemNhbGxvYzsKKyAgICB6LT5vcGFxdWUgPSAodm9pZHBmKTA7CisgIH0KKyAgaWYgKHotPnpmcmVlID09IFpfTlVMTCkgei0+emZyZWUgPSB6Y2ZyZWU7CisgIGlmICgoei0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKQorICAgICAgIFpBTExPQyh6LDEsc2l6ZW9mKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSkpKSA9PSBaX05VTEwpCisgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICB6LT5zdGF0ZS0+YmxvY2tzID0gWl9OVUxMOworCisgIC8qIGhhbmRsZSB1bmRvY3VtZW50ZWQgbm93cmFwIG9wdGlvbiAobm8gemxpYiBoZWFkZXIgb3IgY2hlY2spICovCisgIHotPnN0YXRlLT5ub3dyYXAgPSAwOworICBpZiAodyA8IDApCisgIHsKKyAgICB3ID0gLSB3OworICAgIHotPnN0YXRlLT5ub3dyYXAgPSAxOworICB9CisKKyAgLyogc2V0IHdpbmRvdyBzaXplICovCisgIGlmICh3IDwgOCB8fCB3ID4gMTUpCisgIHsKKyAgICBpbmZsYXRlRW5kKHopOworICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgfQorICB6LT5zdGF0ZS0+d2JpdHMgPSAodUludCl3OworCisgIC8qIGNyZWF0ZSBpbmZsYXRlX2Jsb2NrcyBzdGF0ZSAqLworICBpZiAoKHotPnN0YXRlLT5ibG9ja3MgPQorICAgICAgaW5mbGF0ZV9ibG9ja3NfbmV3KHosIHotPnN0YXRlLT5ub3dyYXAgPyBaX05VTEwgOiBhZGxlcjMyLCAodUludCkxIDw8IHcpKQorICAgICAgPT0gWl9OVUxMKQorICB7CisgICAgaW5mbGF0ZUVuZCh6KTsKKyAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgIH0KKyAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKKworICAvKiByZXNldCBzdGF0ZSAqLworICBpbmZsYXRlUmVzZXQoeik7CisgIHJldHVybiBaX09LOworfQorCisKK2ludCBaRVhQT1JUIGluZmxhdGVJbml0Xyh6LCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKK3pfc3RyZWFtcCB6OworY29uc3QgY2hhciAqdmVyc2lvbjsKK2ludCBzdHJlYW1fc2l6ZTsKK3sKKyAgcmV0dXJuIGluZmxhdGVJbml0Ml8oeiwgREVGX1dCSVRTLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7Cit9CisKKworI2RlZmluZSBORUVEQllURSB7aWYoei0+YXZhaWxfaW49PTApcmV0dXJuIHI7cj1mO30KKyNkZWZpbmUgTkVYVEJZVEUgKHotPmF2YWlsX2luLS0sei0+dG90YWxfaW4rKywqei0+bmV4dF9pbisrKQorCitpbnQgWkVYUE9SVCBpbmZsYXRlKHosIGYpCit6X3N0cmVhbXAgejsKK2ludCBmOworeworICBpbnQgcjsKKyAgdUludCBiOworCisgIGlmICh6ID09IFpfTlVMTCB8fCB6LT5zdGF0ZSA9PSBaX05VTEwgfHwgei0+bmV4dF9pbiA9PSBaX05VTEwpCisgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICBmID0gZiA9PSBaX0ZJTklTSCA/IFpfQlVGX0VSUk9SIDogWl9PSzsKKyAgciA9IFpfQlVGX0VSUk9SOworICB3aGlsZSAoMSkgc3dpdGNoICh6LT5zdGF0ZS0+bW9kZSkKKyAgeworICAgIGNhc2UgTUVUSE9EOgorICAgICAgTkVFREJZVEUKKyAgICAgIGlmICgoKHotPnN0YXRlLT5zdWIubWV0aG9kID0gTkVYVEJZVEUpICYgMHhmKSAhPSBaX0RFRkxBVEVEKQorICAgICAgeworICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgei0+bXNnID0gKGNoYXIqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gNTsgICAgICAgLyogY2FuJ3QgdHJ5IGluZmxhdGVTeW5jICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKCh6LT5zdGF0ZS0+c3ViLm1ldGhvZCA+PiA0KSArIDggPiB6LT5zdGF0ZS0+d2JpdHMpCisgICAgICB7CisgICAgICAgIHotPnN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgd2luZG93IHNpemUiOworICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHotPnN0YXRlLT5tb2RlID0gRkxBRzsKKyAgICBjYXNlIEZMQUc6CisgICAgICBORUVEQllURQorICAgICAgYiA9IE5FWFRCWVRFOworICAgICAgaWYgKCgoei0+c3RhdGUtPnN1Yi5tZXRob2QgPDwgOCkgKyBiKSAlIDMxKQorICAgICAgeworICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIjsKKyAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSA1OyAgICAgICAvKiBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IHpsaWIgaGVhZGVyIG9rXG4iKSk7CisgICAgICBpZiAoIShiICYgUFJFU0VUX0RJQ1QpKQorICAgICAgeworICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJMT0NLUzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB6LT5zdGF0ZS0+bW9kZSA9IERJQ1Q0OworICAgIGNhc2UgRElDVDQ6CisgICAgICBORUVEQllURQorICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkID0gKHVMb25nKU5FWFRCWVRFIDw8IDI0OworICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUMzsKKyAgICBjYXNlIERJQ1QzOgorICAgICAgTkVFREJZVEUKKyAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCArPSAodUxvbmcpTkVYVEJZVEUgPDwgMTY7CisgICAgICB6LT5zdGF0ZS0+bW9kZSA9IERJQ1QyOworICAgIGNhc2UgRElDVDI6CisgICAgICBORUVEQllURQorICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURSA8PCA4OworICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUMTsKKyAgICBjYXNlIERJQ1QxOgorICAgICAgTkVFREJZVEUKKyAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCArPSAodUxvbmcpTkVYVEJZVEU7CisgICAgICB6LT5hZGxlciA9IHotPnN0YXRlLT5zdWIuY2hlY2submVlZDsKKyAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDA7CisgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7CisgICAgY2FzZSBESUNUMDoKKyAgICAgIHotPnN0YXRlLT5tb2RlID0gQkFEOworICAgICAgei0+bXNnID0gKGNoYXIqKSJuZWVkIGRpY3Rpb25hcnkiOworICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSAwOyAgICAgICAvKiBjYW4gdHJ5IGluZmxhdGVTeW5jICovCisgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgY2FzZSBCTE9DS1M6CisgICAgICByID0gaW5mbGF0ZV9ibG9ja3Moei0+c3RhdGUtPmJsb2Nrcywgeiwgcik7CisgICAgICBpZiAociA9PSBaX0RBVEFfRVJST1IpCisgICAgICB7CisgICAgICAgIHotPnN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDA7ICAgICAgIC8qIGNhbiB0cnkgaW5mbGF0ZVN5bmMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAociA9PSBaX09LKQorICAgICAgICByID0gZjsKKyAgICAgIGlmIChyICE9IFpfU1RSRUFNX0VORCkKKyAgICAgICAgcmV0dXJuIHI7CisgICAgICByID0gZjsKKyAgICAgIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHotPnN0YXRlLT5ibG9ja3MsIHosICZ6LT5zdGF0ZS0+c3ViLmNoZWNrLndhcyk7CisgICAgICBpZiAoei0+c3RhdGUtPm5vd3JhcCkKKyAgICAgIHsKKyAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBET05FOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHotPnN0YXRlLT5tb2RlID0gQ0hFQ0s0OworICAgIGNhc2UgQ0hFQ0s0OgorICAgICAgTkVFREJZVEUKKyAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCA9ICh1TG9uZylORVhUQllURSA8PCAyNDsKKyAgICAgIHotPnN0YXRlLT5tb2RlID0gQ0hFQ0szOworICAgIGNhc2UgQ0hFQ0szOgorICAgICAgTkVFREJZVEUKKyAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCArPSAodUxvbmcpTkVYVEJZVEUgPDwgMTY7CisgICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLMjsKKyAgICBjYXNlIENIRUNLMjoKKyAgICAgIE5FRURCWVRFCisgICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDg7CisgICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLMTsKKyAgICBjYXNlIENIRUNLMToKKyAgICAgIE5FRURCWVRFCisgICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFOworCisgICAgICBpZiAoei0+c3RhdGUtPnN1Yi5jaGVjay53YXMgIT0gei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkKQorICAgICAgeworICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbmNvcnJlY3QgZGF0YSBjaGVjayI7CisgICAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gNTsgICAgICAgLyogY2FuJ3QgdHJ5IGluZmxhdGVTeW5jICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiB6bGliIGNoZWNrIG9rXG4iKSk7CisgICAgICB6LT5zdGF0ZS0+bW9kZSA9IERPTkU7CisgICAgY2FzZSBET05FOgorICAgICAgcmV0dXJuIFpfU1RSRUFNX0VORDsKKyAgICBjYXNlIEJBRDoKKyAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgfQorI2lmZGVmIE5FRURfRFVNTVlfUkVUVVJOCisgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsgIC8qIFNvbWUgZHVtYiBjb21waWxlcnMgY29tcGxhaW4gd2l0aG91dCB0aGlzICovCisjZW5kaWYKK30KKworCitpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeSh6LCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQorel9zdHJlYW1wIHo7Citjb25zdCBCeXRlZiAqZGljdGlvbmFyeTsKK3VJbnQgIGRpY3RMZW5ndGg7Cit7CisgIHVJbnQgbGVuZ3RoID0gZGljdExlbmd0aDsKKworICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPnN0YXRlLT5tb2RlICE9IERJQ1QwKQorICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICBpZiAoYWRsZXIzMigxTCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkgIT0gei0+YWRsZXIpIHJldHVybiBaX0RBVEFfRVJST1I7CisgIHotPmFkbGVyID0gMUw7CisKKyAgaWYgKGxlbmd0aCA+PSAoKHVJbnQpMTw8ei0+c3RhdGUtPndiaXRzKSkKKyAgeworICAgIGxlbmd0aCA9ICgxPDx6LT5zdGF0ZS0+d2JpdHMpLTE7CisgICAgZGljdGlvbmFyeSArPSBkaWN0TGVuZ3RoIC0gbGVuZ3RoOworICB9CisgIGluZmxhdGVfc2V0X2RpY3Rpb25hcnkoei0+c3RhdGUtPmJsb2NrcywgZGljdGlvbmFyeSwgbGVuZ3RoKTsKKyAgei0+c3RhdGUtPm1vZGUgPSBCTE9DS1M7CisgIHJldHVybiBaX09LOworfQorCisKK2ludCBaRVhQT1JUIGluZmxhdGVTeW5jKHopCit6X3N0cmVhbXAgejsKK3sKKyAgdUludCBuOyAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gbG9vayBhdCAqLworICBCeXRlZiAqcDsgICAgIC8qIHBvaW50ZXIgdG8gYnl0ZXMgKi8KKyAgdUludCBtOyAgICAgICAvKiBudW1iZXIgb2YgbWFya2VyIGJ5dGVzIGZvdW5kIGluIGEgcm93ICovCisgIHVMb25nIHIsIHc7ICAgLyogdGVtcG9yYXJpZXMgdG8gc2F2ZSB0b3RhbF9pbiBhbmQgdG90YWxfb3V0ICovCisKKyAgLyogc2V0IHVwICovCisgIGlmICh6ID09IFpfTlVMTCB8fCB6LT5zdGF0ZSA9PSBaX05VTEwpCisgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICBpZiAoei0+c3RhdGUtPm1vZGUgIT0gQkFEKQorICB7CisgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSAwOworICB9CisgIGlmICgobiA9IHotPmF2YWlsX2luKSA9PSAwKQorICAgIHJldHVybiBaX0JVRl9FUlJPUjsKKyAgcCA9IHotPm5leHRfaW47CisgIG0gPSB6LT5zdGF0ZS0+c3ViLm1hcmtlcjsKKworICAvKiBzZWFyY2ggKi8KKyAgd2hpbGUgKG4gJiYgbSA8IDQpCisgIHsKKyAgICBzdGF0aWMgY29uc3QgQnl0ZSBtYXJrWzRdID0gezAsIDAsIDB4ZmYsIDB4ZmZ9OworICAgIGlmICgqcCA9PSBtYXJrW21dKQorICAgICAgbSsrOworICAgIGVsc2UgaWYgKCpwKQorICAgICAgbSA9IDA7CisgICAgZWxzZQorICAgICAgbSA9IDQgLSBtOworICAgIHArKywgbi0tOworICB9CisKKyAgLyogcmVzdG9yZSAqLworICB6LT50b3RhbF9pbiArPSBwIC0gei0+bmV4dF9pbjsKKyAgei0+bmV4dF9pbiA9IHA7CisgIHotPmF2YWlsX2luID0gbjsKKyAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSBtOworCisgIC8qIHJldHVybiBubyBqb3kgb3Igc2V0IHVwIHRvIHJlc3RhcnQgb24gYSBuZXcgYmxvY2sgKi8KKyAgaWYgKG0gIT0gNCkKKyAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICByID0gei0+dG90YWxfaW47ICB3ID0gei0+dG90YWxfb3V0OworICBpbmZsYXRlUmVzZXQoeik7CisgIHotPnRvdGFsX2luID0gcjsgIHotPnRvdGFsX291dCA9IHc7CisgIHotPnN0YXRlLT5tb2RlID0gQkxPQ0tTOworICByZXR1cm4gWl9PSzsKK30KKworCisvKiBSZXR1cm5zIHRydWUgaWYgaW5mbGF0ZSBpcyBjdXJyZW50bHkgYXQgdGhlIGVuZCBvZiBhIGJsb2NrIGdlbmVyYXRlZAorICogYnkgWl9TWU5DX0ZMVVNIIG9yIFpfRlVMTF9GTFVTSC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IG9uZSBQUFAKKyAqIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYW4gYWRkaXRpb25hbCBzYWZldHkgY2hlY2suIFBQUCB1c2VzIFpfU1lOQ19GTFVTSAorICogYnV0IHJlbW92ZXMgdGhlIGxlbmd0aCBieXRlcyBvZiB0aGUgcmVzdWx0aW5nIGVtcHR5IHN0b3JlZCBibG9jay4gV2hlbgorICogZGVjb21wcmVzc2luZywgUFBQIGNoZWNrcyB0aGF0IGF0IHRoZSBlbmQgb2YgaW5wdXQgcGFja2V0LCBpbmZsYXRlIGlzCisgKiB3YWl0aW5nIGZvciB0aGVzZSBsZW5ndGggYnl0ZXMuCisgKi8KK2ludCBaRVhQT1JUIGluZmxhdGVTeW5jUG9pbnQoeikKK3pfc3RyZWFtcCB6OworeworICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPnN0YXRlLT5ibG9ja3MgPT0gWl9OVUxMKQorICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgcmV0dXJuIGluZmxhdGVfYmxvY2tzX3N5bmNfcG9pbnQoei0+c3RhdGUtPmJsb2Nrcyk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9pbmZ0cmVlcy5jIGIvY29tbW9uL3psaWIvaW5mdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMyY2EzCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvaW5mdHJlZXMuYwpAQCAtMCwwICsxLDQ1NCBAQAorLyogaW5mdHJlZXMuYyAtLSBnZW5lcmF0ZSBIdWZmbWFuIHRyZWVzIGZvciBlZmZpY2llbnQgZGVjb2RpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKworI2lmICFkZWZpbmVkKEJVSUxERklYRUQpICYmICFkZWZpbmVkKFNUREMpCisjICBkZWZpbmUgQlVJTERGSVhFRCAgIC8qIG5vbiBBTlNJIGNvbXBpbGVycyBtYXkgbm90IGFjY2VwdCBpbmZmaXhlZC5oICovCisjZW5kaWYKKworY29uc3QgY2hhciBpbmZsYXRlX2NvcHlyaWdodFtdID0KKyAgICIgaW5mbGF0ZSAxLjEuNCBDb3B5cmlnaHQgMTk5NS0yMDAyIE1hcmsgQWRsZXIgIjsKKy8qCisgIElmIHlvdSB1c2UgdGhlIHpsaWIgbGlicmFyeSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGlzIHdlbGNvbWUKKyAgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBwcm9kdWN0LiBJZiBmb3Igc29tZSByZWFzb24geW91IGNhbm5vdAorICBpbmNsdWRlIHN1Y2ggYW4gYWNrbm93bGVkZ21lbnQsIEkgd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBrZWVwIHRoaXMKKyAgY29weXJpZ2h0IHN0cmluZyBpbiB0aGUgZXhlY3V0YWJsZSBvZiB5b3VyIHByb2R1Y3QuCisgKi8KK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZSAge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisKKy8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCisjZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKKyNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cworCisKK2xvY2FsIGludCBodWZ0X2J1aWxkIE9GKCgKKyAgICB1SW50ZiAqLCAgICAgICAgICAgIC8qIGNvZGUgbGVuZ3RocyBpbiBiaXRzICovCisgICAgdUludCwgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgKi8KKyAgICB1SW50LCAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiAic2ltcGxlIiBjb2RlcyAqLworICAgIGNvbnN0IHVJbnRmICosICAgICAgLyogbGlzdCBvZiBiYXNlIHZhbHVlcyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLworICAgIGNvbnN0IHVJbnRmICosICAgICAgLyogbGlzdCBvZiBleHRyYSBiaXRzIGZvciBub24tc2ltcGxlIGNvZGVzICovCisgICAgaW5mbGF0ZV9odWZ0ICogRkFSKiwvKiByZXN1bHQ6IHN0YXJ0aW5nIHRhYmxlICovCisgICAgdUludGYgKiwgICAgICAgICAgICAvKiBtYXhpbXVtIGxvb2t1cCBiaXRzIChyZXR1cm5zIGFjdHVhbCkgKi8KKyAgICBpbmZsYXRlX2h1ZnQgKiwgICAgIC8qIHNwYWNlIGZvciB0cmVlcyAqLworICAgIHVJbnQgKiwgICAgICAgICAgICAgLyogaHVmdHMgdXNlZCBpbiBzcGFjZSAqLworICAgIHVJbnRmICogKSk7ICAgICAgICAgLyogc3BhY2UgZm9yIHZhbHVlcyAqLworCisvKiBUYWJsZXMgZm9yIGRlZmxhdGUgZnJvbSBQS1pJUCdzIGFwcG5vdGUudHh0LiAqLworbG9jYWwgY29uc3QgdUludCBjcGxlbnNbMzFdID0geyAvKiBDb3B5IGxlbmd0aHMgZm9yIGxpdGVyYWwgY29kZXMgMjU3Li4yODUgKi8KKyAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSwKKyAgICAgICAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDB9OworICAgICAgICAvKiBzZWUgbm90ZSAjMTMgYWJvdmUgYWJvdXQgMjU4ICovCitsb2NhbCBjb25zdCB1SW50IGNwbGV4dFszMV0gPSB7IC8qIEV4dHJhIGJpdHMgZm9yIGxpdGVyYWwgY29kZXMgMjU3Li4yODUgKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgICAgICAgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgMCwgMTEyLCAxMTJ9OyAvKiAxMTI9PWludmFsaWQgKi8KK2xvY2FsIGNvbnN0IHVJbnQgY3BkaXN0WzMwXSA9IHsgLyogQ29weSBvZmZzZXRzIGZvciBkaXN0YW5jZSBjb2RlcyAwLi4yOSAqLworICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsCisgICAgICAgIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwKKyAgICAgICAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3N307Citsb2NhbCBjb25zdCB1SW50IGNwZGV4dFszMF0gPSB7IC8qIEV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlIGNvZGVzICovCisgICAgICAgIDAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsCisgICAgICAgIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLAorICAgICAgICAxMiwgMTIsIDEzLCAxM307CisKKy8qCisgICBIdWZmbWFuIGNvZGUgZGVjb2RpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIGEgbXVsdGktbGV2ZWwgdGFibGUgbG9va3VwLgorICAgVGhlIGZhc3Rlc3Qgd2F5IHRvIGRlY29kZSBpcyB0byBzaW1wbHkgYnVpbGQgYSBsb29rdXAgdGFibGUgd2hvc2UKKyAgIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwgdGhlIHRpbWUgaXQgdGFrZXMKKyAgIHRvIGJ1aWxkIHRoaXMgdGFibGUgY2FuIGFsc28gYmUgYSBmYWN0b3IgaWYgdGhlIGRhdGEgYmVpbmcgZGVjb2RlZAorICAgaXMgbm90IHZlcnkgbG9uZy4gIFRoZSBtb3N0IGNvbW1vbiBjb2RlcyBhcmUgbmVjZXNzYXJpbHkgdGhlCisgICBzaG9ydGVzdCBjb2Rlcywgc28gdGhvc2UgY29kZXMgZG9taW5hdGUgdGhlIGRlY29kaW5nIHRpbWUsIGFuZCBoZW5jZQorICAgdGhlIHNwZWVkLiAgVGhlIGlkZWEgaXMgeW91IGNhbiBoYXZlIGEgc2hvcnRlciB0YWJsZSB0aGF0IGRlY29kZXMgdGhlCisgICBzaG9ydGVyLCBtb3JlIHByb2JhYmxlIGNvZGVzLCBhbmQgdGhlbiBwb2ludCB0byBzdWJzaWRpYXJ5IHRhYmxlcyBmb3IKKyAgIHRoZSBsb25nZXIgY29kZXMuICBUaGUgdGltZSBpdCBjb3N0cyB0byBkZWNvZGUgdGhlIGxvbmdlciBjb2RlcyBpcworICAgdGhlbiB0cmFkZWQgYWdhaW5zdCB0aGUgdGltZSBpdCB0YWtlcyB0byBtYWtlIGxvbmdlciB0YWJsZXMuCisKKyAgIFRoaXMgcmVzdWx0cyBvZiB0aGlzIHRyYWRlIGFyZSBpbiB0aGUgdmFyaWFibGVzIGxiaXRzIGFuZCBkYml0cworICAgYmVsb3cuICBsYml0cyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhlIGZpcnN0IGxldmVsIHRhYmxlIGZvciBsaXRlcmFsLworICAgbGVuZ3RoIGNvZGVzIGNhbiBkZWNvZGUgaW4gb25lIHN0ZXAsIGFuZCBkYml0cyBpcyB0aGUgc2FtZSB0aGluZyBmb3IKKyAgIHRoZSBkaXN0YW5jZSBjb2Rlcy4gIFN1YnNlcXVlbnQgdGFibGVzIGFyZSBhbHNvIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgdGhvc2Ugc2l6ZXMuICBUaGVzZSB2YWx1ZXMgbWF5IGJlIGFkanVzdGVkIGVpdGhlciB3aGVuIGFsbCBvZiB0aGUKKyAgIGNvZGVzIGFyZSBzaG9ydGVyIHRoYW4gdGhhdCwgaW4gd2hpY2ggY2FzZSB0aGUgbG9uZ2VzdCBjb2RlIGxlbmd0aCBpbgorICAgYml0cyBpcyB1c2VkLCBvciB3aGVuIHRoZSBzaG9ydGVzdCBjb2RlIGlzICpsb25nZXIqIHRoYW4gdGhlIHJlcXVlc3RlZAorICAgdGFibGUgc2l6ZSwgaW4gd2hpY2ggY2FzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVzdCBjb2RlIGluIGJpdHMgaXMKKyAgIHVzZWQuCisKKyAgIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlIHR3byB0YWJsZXMsIHNpbmNlIHRoZXkgY29kZSBhCisgICBkaWZmZXJlbnQgbnVtYmVyIG9mIHBvc3NpYmlsaXRpZXMgZWFjaC4gIFRoZSBsaXRlcmFsL2xlbmd0aCB0YWJsZQorICAgY29kZXMgMjg2IHBvc3NpYmxlIHZhbHVlcywgb3IgaW4gYSBmbGF0IGNvZGUsIGEgbGl0dGxlIG92ZXIgZWlnaHQKKyAgIGJpdHMuICBUaGUgZGlzdGFuY2UgdGFibGUgY29kZXMgMzAgcG9zc2libGUgdmFsdWVzLCBvciBhIGxpdHRsZSBsZXNzCisgICB0aGFuIGZpdmUgYml0cywgZmxhdC4gIFRoZSBvcHRpbXVtIHZhbHVlcyBmb3Igc3BlZWQgZW5kIHVwIGJlaW5nCisgICBhYm91dCBvbmUgYml0IG1vcmUgdGhhbiB0aG9zZSwgc28gbGJpdHMgaXMgOCsxIGFuZCBkYml0cyBpcyA1KzEuCisgICBUaGUgb3B0aW11bSB2YWx1ZXMgbWF5IGRpZmZlciB0aG91Z2ggZnJvbSBtYWNoaW5lIHRvIG1hY2hpbmUsIGFuZAorICAgcG9zc2libHkgZXZlbiBiZXR3ZWVuIGNvbXBpbGVycy4gIFlvdXIgbWlsZWFnZSBtYXkgdmFyeS4KKyAqLworCisKKy8qIElmIEJNQVggbmVlZHMgdG8gYmUgbGFyZ2VyIHRoYW4gMTYsIHRoZW4gaCBhbmQgeFtdIHNob3VsZCBiZSB1TG9uZy4gKi8KKyNkZWZpbmUgQk1BWCAxNSAgICAgICAgIC8qIG1heGltdW0gYml0IGxlbmd0aCBvZiBhbnkgY29kZSAqLworCitsb2NhbCBpbnQgaHVmdF9idWlsZChiLCBuLCBzLCBkLCBlLCB0LCBtLCBocCwgaG4sIHYpCit1SW50ZiAqYjsgICAgICAgICAgICAgICAvKiBjb2RlIGxlbmd0aHMgaW4gYml0cyAoYWxsIGFzc3VtZWQgPD0gQk1BWCkgKi8KK3VJbnQgbjsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyAoYXNzdW1lZCA8PSAyODgpICovCit1SW50IHM7ICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc2ltcGxlLXZhbHVlZCBjb2RlcyAoMC4ucy0xKSAqLworY29uc3QgdUludGYgKmQ7ICAgICAgICAgLyogbGlzdCBvZiBiYXNlIHZhbHVlcyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLworY29uc3QgdUludGYgKmU7ICAgICAgICAgLyogbGlzdCBvZiBleHRyYSBiaXRzIGZvciBub24tc2ltcGxlIGNvZGVzICovCitpbmZsYXRlX2h1ZnQgKiBGQVIgKnQ7ICAvKiByZXN1bHQ6IHN0YXJ0aW5nIHRhYmxlICovCit1SW50ZiAqbTsgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGxvb2t1cCBiaXRzLCByZXR1cm5zIGFjdHVhbCAqLworaW5mbGF0ZV9odWZ0ICpocDsgICAgICAgLyogc3BhY2UgZm9yIHRyZWVzICovCit1SW50ICpobjsgICAgICAgICAgICAgICAvKiBodWZ0cyB1c2VkIGluIHNwYWNlICovCit1SW50ZiAqdjsgICAgICAgICAgICAgICAvKiB3b3JraW5nIGFyZWE6IHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RoICovCisvKiBHaXZlbiBhIGxpc3Qgb2YgY29kZSBsZW5ndGhzIGFuZCBhIG1heGltdW0gdGFibGUgc2l6ZSwgbWFrZSBhIHNldCBvZgorICAgdGFibGVzIHRvIGRlY29kZSB0aGF0IHNldCBvZiBjb2Rlcy4gIFJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SCisgICBpZiB0aGUgZ2l2ZW4gY29kZSBzZXQgaXMgaW5jb21wbGV0ZSAodGhlIHRhYmxlcyBhcmUgc3RpbGwgYnVpbHQgaW4gdGhpcworICAgY2FzZSksIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZC4gKi8KK3sKKworICB1SW50IGE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVyIGZvciBjb2RlcyBvZiBsZW5ndGggayAqLworICB1SW50IGNbQk1BWCsxXTsgICAgICAgICAgICAgICAvKiBiaXQgbGVuZ3RoIGNvdW50IHRhYmxlICovCisgIHVJbnQgZjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgcmVwZWF0cyBpbiB0YWJsZSBldmVyeSBmIGVudHJpZXMgKi8KKyAgaW50IGc7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBjb2RlIGxlbmd0aCAqLworICBpbnQgaDsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBsZXZlbCAqLworICByZWdpc3RlciB1SW50IGk7ICAgICAgICAgICAgICAvKiBjb3VudGVyLCBjdXJyZW50IGNvZGUgKi8KKyAgcmVnaXN0ZXIgdUludCBqOyAgICAgICAgICAgICAgLyogY291bnRlciAqLworICByZWdpc3RlciBpbnQgazsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBjdXJyZW50IGNvZGUgKi8KKyAgaW50IGw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0cyBwZXIgdGFibGUgKHJldHVybmVkIGluIG0pICovCisgIHVJbnQgbWFzazsgICAgICAgICAgICAgICAgICAgIC8qICgxIDw8IHcpIC0gMSwgdG8gYXZvaWQgY2MgLU8gYnVnIG9uIEhQICovCisgIHJlZ2lzdGVyIHVJbnRmICpwOyAgICAgICAgICAgIC8qIHBvaW50ZXIgaW50byBjW10sIGJbXSwgb3IgdltdICovCisgIGluZmxhdGVfaHVmdCAqcTsgICAgICAgICAgICAgIC8qIHBvaW50cyB0byBjdXJyZW50IHRhYmxlICovCisgIHN0cnVjdCBpbmZsYXRlX2h1ZnRfcyByOyAgICAgIC8qIHRhYmxlIGVudHJ5IGZvciBzdHJ1Y3R1cmUgYXNzaWdubWVudCAqLworICBpbmZsYXRlX2h1ZnQgKnVbQk1BWF07ICAgICAgICAvKiB0YWJsZSBzdGFjayAqLworICByZWdpc3RlciBpbnQgdzsgICAgICAgICAgICAgICAvKiBiaXRzIGJlZm9yZSB0aGlzIHRhYmxlID09IChsICogaCkgKi8KKyAgdUludCB4W0JNQVgrMV07ICAgICAgICAgICAgICAgLyogYml0IG9mZnNldHMsIHRoZW4gY29kZSBzdGFjayAqLworICB1SW50ZiAqeHA7ICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIGludG8geCAqLworICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZHVtbXkgY29kZXMgYWRkZWQgKi8KKyAgdUludCB6OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gY3VycmVudCB0YWJsZSAqLworCisKKyAgLyogR2VuZXJhdGUgY291bnRzIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKyAgcCA9IGM7CisjZGVmaW5lIEMwICpwKysgPSAwOworI2RlZmluZSBDMiBDMCBDMCBDMCBDMAorI2RlZmluZSBDNCBDMiBDMiBDMiBDMgorICBDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBjW10tLWFzc3VtZSBCTUFYKzEgaXMgMTYgKi8KKyAgcCA9IGI7ICBpID0gbjsKKyAgZG8geworICAgIGNbKnArK10rKzsgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgYWxsIGVudHJpZXMgPD0gQk1BWCAqLworICB9IHdoaWxlICgtLWkpOworICBpZiAoY1swXSA9PSBuKSAgICAgICAgICAgICAgICAvKiBudWxsIGlucHV0LS1hbGwgemVybyBsZW5ndGggY29kZXMgKi8KKyAgeworICAgICp0ID0gKGluZmxhdGVfaHVmdCAqKVpfTlVMTDsKKyAgICAqbSA9IDA7CisgICAgcmV0dXJuIFpfT0s7CisgIH0KKworCisgIC8qIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGgsIGJvdW5kICptIGJ5IHRob3NlICovCisgIGwgPSAqbTsKKyAgZm9yIChqID0gMTsgaiA8PSBCTUFYOyBqKyspCisgICAgaWYgKGNbal0pCisgICAgICBicmVhazsKKyAgayA9IGo7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBjb2RlIGxlbmd0aCAqLworICBpZiAoKHVJbnQpbCA8IGopCisgICAgbCA9IGo7CisgIGZvciAoaSA9IEJNQVg7IGk7IGktLSkKKyAgICBpZiAoY1tpXSkKKyAgICAgIGJyZWFrOworICBnID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCisgIGlmICgodUludClsID4gaSkKKyAgICBsID0gaTsKKyAgKm0gPSBsOworCisKKyAgLyogQWRqdXN0IGxhc3QgbGVuZ3RoIGNvdW50IHRvIGZpbGwgb3V0IGNvZGVzLCBpZiBuZWVkZWQgKi8KKyAgZm9yICh5ID0gMSA8PCBqOyBqIDwgaTsgaisrLCB5IDw8PSAxKQorICAgIGlmICgoeSAtPSBjW2pdKSA8IDApCisgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICBpZiAoKHkgLT0gY1tpXSkgPCAwKQorICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisgIGNbaV0gKz0geTsKKworCisgIC8qIEdlbmVyYXRlIHN0YXJ0aW5nIG9mZnNldHMgaW50byB0aGUgdmFsdWUgdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCisgIHhbMV0gPSBqID0gMDsKKyAgcCA9IGMgKyAxOyAgeHAgPSB4ICsgMjsKKyAgd2hpbGUgKC0taSkgeyAgICAgICAgICAgICAgICAgLyogbm90ZSB0aGF0IGkgPT0gZyBmcm9tIGFib3ZlICovCisgICAgKnhwKysgPSAoaiArPSAqcCsrKTsKKyAgfQorCisKKyAgLyogTWFrZSBhIHRhYmxlIG9mIHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RocyAqLworICBwID0gYjsgIGkgPSAwOworICBkbyB7CisgICAgaWYgKChqID0gKnArKykgIT0gMCkKKyAgICAgIHZbeFtqXSsrXSA9IGk7CisgIH0gd2hpbGUgKCsraSA8IG4pOworICBuID0geFtnXTsgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgbiB0byBsZW5ndGggb2YgdiAqLworCisKKyAgLyogR2VuZXJhdGUgdGhlIEh1ZmZtYW4gY29kZXMgYW5kIGZvciBlYWNoLCBtYWtlIHRoZSB0YWJsZSBlbnRyaWVzICovCisgIHhbMF0gPSBpID0gMDsgICAgICAgICAgICAgICAgIC8qIGZpcnN0IEh1ZmZtYW4gY29kZSBpcyB6ZXJvICovCisgIHAgPSB2OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYWIgdmFsdWVzIGluIGJpdCBvcmRlciAqLworICBoID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBubyB0YWJsZXMgeWV0LS1sZXZlbCAtMSAqLworICB3ID0gLWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGRlY29kZWQgPT0gKGwgKiBoKSAqLworICB1WzBdID0gKGluZmxhdGVfaHVmdCAqKVpfTlVMTDsgICAgICAgIC8qIGp1c3QgdG8ga2VlcCBjb21waWxlcnMgaGFwcHkgKi8KKyAgcSA9IChpbmZsYXRlX2h1ZnQgKilaX05VTEw7ICAgLyogZGl0dG8gKi8KKyAgeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZGl0dG8gKi8KKworICAvKiBnbyB0aHJvdWdoIHRoZSBiaXQgbGVuZ3RocyAoayBhbHJlYWR5IGlzIGJpdHMgaW4gc2hvcnRlc3QgY29kZSkgKi8KKyAgZm9yICg7IGsgPD0gZzsgaysrKQorICB7CisgICAgYSA9IGNba107CisgICAgd2hpbGUgKGEtLSkKKyAgICB7CisgICAgICAvKiBoZXJlIGkgaXMgdGhlIEh1ZmZtYW4gY29kZSBvZiBsZW5ndGggayBiaXRzIGZvciB2YWx1ZSAqcCAqLworICAgICAgLyogbWFrZSB0YWJsZXMgdXAgdG8gcmVxdWlyZWQgbGV2ZWwgKi8KKyAgICAgIHdoaWxlIChrID4gdyArIGwpCisgICAgICB7CisgICAgICAgIGgrKzsKKyAgICAgICAgdyArPSBsOyAgICAgICAgICAgICAgICAgLyogcHJldmlvdXMgdGFibGUgYWx3YXlzIGwgYml0cyAqLworCisgICAgICAgIC8qIGNvbXB1dGUgbWluaW11bSBzaXplIHRhYmxlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBsIGJpdHMgKi8KKyAgICAgICAgeiA9IGcgLSB3OworICAgICAgICB6ID0geiA+ICh1SW50KWwgPyBsIDogejsgICAgICAgIC8qIHRhYmxlIHNpemUgdXBwZXIgbGltaXQgKi8KKyAgICAgICAgaWYgKChmID0gMSA8PCAoaiA9IGsgLSB3KSkgPiBhICsgMSkgICAgIC8qIHRyeSBhIGstdyBiaXQgdGFibGUgKi8KKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogdG9vIGZldyBjb2RlcyBmb3Igay13IGJpdCB0YWJsZSAqLworICAgICAgICAgIGYgLT0gYSArIDE7ICAgICAgICAgICAvKiBkZWR1Y3QgY29kZXMgZnJvbSBwYXR0ZXJucyBsZWZ0ICovCisgICAgICAgICAgeHAgPSBjICsgazsKKyAgICAgICAgICBpZiAoaiA8IHopCisgICAgICAgICAgICB3aGlsZSAoKytqIDwgeikgICAgIC8qIHRyeSBzbWFsbGVyIHRhYmxlcyB1cCB0byB6IGJpdHMgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKChmIDw8PSAxKSA8PSAqKyt4cCkKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogZW5vdWdoIGNvZGVzIHRvIHVzZSB1cCBqIGJpdHMgKi8KKyAgICAgICAgICAgICAgZiAtPSAqeHA7ICAgICAgICAgLyogZWxzZSBkZWR1Y3QgY29kZXMgZnJvbSBwYXR0ZXJucyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHogPSAxIDw8IGo7ICAgICAgICAgICAgIC8qIHRhYmxlIGVudHJpZXMgZm9yIGotYml0IHRhYmxlICovCisKKyAgICAgICAgLyogYWxsb2NhdGUgbmV3IHRhYmxlICovCisgICAgICAgIGlmICgqaG4gKyB6ID4gTUFOWSkgICAgIC8qIChub3RlOiBkb2Vzbid0IG1hdHRlciBmb3IgZml4ZWQpICovCisgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsgIC8qIG92ZXJmbG93IG9mIE1BTlkgKi8KKyAgICAgICAgdVtoXSA9IHEgPSBocCArICpobjsKKyAgICAgICAgKmhuICs9IHo7CisKKyAgICAgICAgLyogY29ubmVjdCB0byBsYXN0IHRhYmxlLCBpZiB0aGVyZSBpcyBvbmUgKi8KKyAgICAgICAgaWYgKGgpCisgICAgICAgIHsKKyAgICAgICAgICB4W2hdID0gaTsgICAgICAgICAgICAgLyogc2F2ZSBwYXR0ZXJuIGZvciBiYWNraW5nIHVwICovCisgICAgICAgICAgci5iaXRzID0gKEJ5dGUpbDsgICAgIC8qIGJpdHMgdG8gZHVtcCBiZWZvcmUgdGhpcyB0YWJsZSAqLworICAgICAgICAgIHIuZXhvcCA9IChCeXRlKWo7ICAgICAvKiBiaXRzIGluIHRoaXMgdGFibGUgKi8KKyAgICAgICAgICBqID0gaSA+PiAodyAtIGwpOworICAgICAgICAgIHIuYmFzZSA9ICh1SW50KShxIC0gdVtoLTFdIC0gaik7ICAgLyogb2Zmc2V0IHRvIHRoaXMgdGFibGUgKi8KKyAgICAgICAgICB1W2gtMV1bal0gPSByOyAgICAgICAgLyogY29ubmVjdCB0byBsYXN0IHRhYmxlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICp0ID0gcTsgICAgICAgICAgICAgICAvKiBmaXJzdCB0YWJsZSBpcyByZXR1cm5lZCByZXN1bHQgKi8KKyAgICAgIH0KKworICAgICAgLyogc2V0IHVwIHRhYmxlIGVudHJ5IGluIHIgKi8KKyAgICAgIHIuYml0cyA9IChCeXRlKShrIC0gdyk7CisgICAgICBpZiAocCA+PSB2ICsgbikKKyAgICAgICAgci5leG9wID0gMTI4ICsgNjQ7ICAgICAgLyogb3V0IG9mIHZhbHVlcy0taW52YWxpZCBjb2RlICovCisgICAgICBlbHNlIGlmICgqcCA8IHMpCisgICAgICB7CisgICAgICAgIHIuZXhvcCA9IChCeXRlKSgqcCA8IDI1NiA/IDAgOiAzMiArIDY0KTsgICAgIC8qIDI1NiBpcyBlbmQtb2YtYmxvY2sgKi8KKyAgICAgICAgci5iYXNlID0gKnArKzsgICAgICAgICAgLyogc2ltcGxlIGNvZGUgaXMganVzdCB0aGUgdmFsdWUgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgci5leG9wID0gKEJ5dGUpKGVbKnAgLSBzXSArIDE2ICsgNjQpOy8qIG5vbi1zaW1wbGUtLWxvb2sgdXAgaW4gbGlzdHMgKi8KKyAgICAgICAgci5iYXNlID0gZFsqcCsrIC0gc107CisgICAgICB9CisKKyAgICAgIC8qIGZpbGwgY29kZS1saWtlIGVudHJpZXMgd2l0aCByICovCisgICAgICBmID0gMSA8PCAoayAtIHcpOworICAgICAgZm9yIChqID0gaSA+PiB3OyBqIDwgejsgaiArPSBmKQorICAgICAgICBxW2pdID0gcjsKKworICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgay1iaXQgY29kZSBpICovCisgICAgICBmb3IgKGogPSAxIDw8IChrIC0gMSk7IGkgJiBqOyBqID4+PSAxKQorICAgICAgICBpIF49IGo7CisgICAgICBpIF49IGo7CisKKyAgICAgIC8qIGJhY2t1cCBvdmVyIGZpbmlzaGVkIHRhYmxlcyAqLworICAgICAgbWFzayA9ICgxIDw8IHcpIC0gMTsgICAgICAvKiBuZWVkZWQgb24gSFAsIGNjIC1PIGJ1ZyAqLworICAgICAgd2hpbGUgKChpICYgbWFzaykgIT0geFtoXSkKKyAgICAgIHsKKyAgICAgICAgaC0tOyAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgbmVlZCB0byB1cGRhdGUgcSAqLworICAgICAgICB3IC09IGw7CisgICAgICAgIG1hc2sgPSAoMSA8PCB3KSAtIDE7CisgICAgICB9CisgICAgfQorICB9CisKKworICAvKiBSZXR1cm4gWl9CVUZfRVJST1IgaWYgd2Ugd2VyZSBnaXZlbiBhbiBpbmNvbXBsZXRlIHRhYmxlICovCisgIHJldHVybiB5ICE9IDAgJiYgZyAhPSAxID8gWl9CVUZfRVJST1IgOiBaX09LOworfQorCisKK2ludCBpbmZsYXRlX3RyZWVzX2JpdHMoYywgYmIsIHRiLCBocCwgeikKK3VJbnRmICpjOyAgICAgICAgICAgICAgIC8qIDE5IGNvZGUgbGVuZ3RocyAqLwordUludGYgKmJiOyAgICAgICAgICAgICAgLyogYml0cyB0cmVlIGRlc2lyZWQvYWN0dWFsIGRlcHRoICovCitpbmZsYXRlX2h1ZnQgKiBGQVIgKnRiOyAvKiBiaXRzIHRyZWUgcmVzdWx0ICovCitpbmZsYXRlX2h1ZnQgKmhwOyAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KK3pfc3RyZWFtcCB6OyAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLworeworICBpbnQgcjsKKyAgdUludCBobiA9IDA7ICAgICAgICAgIC8qIGh1ZnRzIHVzZWQgaW4gc3BhY2UgKi8KKyAgdUludGYgKnY7ICAgICAgICAgICAgIC8qIHdvcmsgYXJlYSBmb3IgaHVmdF9idWlsZCAqLworCisgIGlmICgodiA9ICh1SW50ZiopWkFMTE9DKHosIDE5LCBzaXplb2YodUludCkpKSA9PSBaX05VTEwpCisgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICByID0gaHVmdF9idWlsZChjLCAxOSwgMTksICh1SW50ZiopWl9OVUxMLCAodUludGYqKVpfTlVMTCwKKyAgICAgICAgICAgICAgICAgdGIsIGJiLCBocCwgJmhuLCB2KTsKKyAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQorICAgIHotPm1zZyA9IChjaGFyKikib3ZlcnN1YnNjcmliZWQgZHluYW1pYyBiaXQgbGVuZ3RocyB0cmVlIjsKKyAgZWxzZSBpZiAociA9PSBaX0JVRl9FUlJPUiB8fCAqYmIgPT0gMCkKKyAgeworICAgIHotPm1zZyA9IChjaGFyKikiaW5jb21wbGV0ZSBkeW5hbWljIGJpdCBsZW5ndGhzIHRyZWUiOworICAgIHIgPSBaX0RBVEFfRVJST1I7CisgIH0KKyAgWkZSRUUoeiwgdik7CisgIHJldHVybiByOworfQorCisKK2ludCBpbmZsYXRlX3RyZWVzX2R5bmFtaWMobmwsIG5kLCBjLCBibCwgYmQsIHRsLCB0ZCwgaHAsIHopCit1SW50IG5sOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KK3VJbnQgbmQ7ICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLwordUludGYgKmM7ICAgICAgICAgICAgICAgLyogdGhhdCBtYW55ICh0b3RhbCkgY29kZSBsZW5ndGhzICovCit1SW50ZiAqYmw7ICAgICAgICAgICAgICAvKiBsaXRlcmFsIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwordUludGYgKmJkOyAgICAgICAgICAgICAgLyogZGlzdGFuY2UgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCitpbmZsYXRlX2h1ZnQgKiBGQVIgKnRsOyAvKiBsaXRlcmFsL2xlbmd0aCB0cmVlIHJlc3VsdCAqLworaW5mbGF0ZV9odWZ0ICogRkFSICp0ZDsgLyogZGlzdGFuY2UgdHJlZSByZXN1bHQgKi8KK2luZmxhdGVfaHVmdCAqaHA7ICAgICAgIC8qIHNwYWNlIGZvciB0cmVlcyAqLworel9zdHJlYW1wIHo7ICAgICAgICAgICAgLyogZm9yIG1lc3NhZ2VzICovCit7CisgIGludCByOworICB1SW50IGhuID0gMDsgICAgICAgICAgLyogaHVmdHMgdXNlZCBpbiBzcGFjZSAqLworICB1SW50ZiAqdjsgICAgICAgICAgICAgLyogd29yayBhcmVhIGZvciBodWZ0X2J1aWxkICovCisKKyAgLyogYWxsb2NhdGUgd29yayBhcmVhICovCisgIGlmICgodiA9ICh1SW50ZiopWkFMTE9DKHosIDI4OCwgc2l6ZW9mKHVJbnQpKSkgPT0gWl9OVUxMKQorICAgIHJldHVybiBaX01FTV9FUlJPUjsKKworICAvKiBidWlsZCBsaXRlcmFsL2xlbmd0aCB0cmVlICovCisgIHIgPSBodWZ0X2J1aWxkKGMsIG5sLCAyNTcsIGNwbGVucywgY3BsZXh0LCB0bCwgYmwsIGhwLCAmaG4sIHYpOworICBpZiAociAhPSBaX09LIHx8ICpibCA9PSAwKQorICB7CisgICAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQorICAgICAgei0+bXNnID0gKGNoYXIqKSJvdmVyc3Vic2NyaWJlZCBsaXRlcmFsL2xlbmd0aCB0cmVlIjsKKyAgICBlbHNlIGlmIChyICE9IFpfTUVNX0VSUk9SKQorICAgIHsKKyAgICAgIHotPm1zZyA9IChjaGFyKikiaW5jb21wbGV0ZSBsaXRlcmFsL2xlbmd0aCB0cmVlIjsKKyAgICAgIHIgPSBaX0RBVEFfRVJST1I7CisgICAgfQorICAgIFpGUkVFKHosIHYpOworICAgIHJldHVybiByOworICB9CisKKyAgLyogYnVpbGQgZGlzdGFuY2UgdHJlZSAqLworICByID0gaHVmdF9idWlsZChjICsgbmwsIG5kLCAwLCBjcGRpc3QsIGNwZGV4dCwgdGQsIGJkLCBocCwgJmhuLCB2KTsKKyAgaWYgKHIgIT0gWl9PSyB8fCAoKmJkID09IDAgJiYgbmwgPiAyNTcpKQorICB7CisgICAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQorICAgICAgei0+bXNnID0gKGNoYXIqKSJvdmVyc3Vic2NyaWJlZCBkaXN0YW5jZSB0cmVlIjsKKyAgICBlbHNlIGlmIChyID09IFpfQlVGX0VSUk9SKSB7CisjaWZkZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgICAgIHIgPSBaX09LOworICAgIH0KKyNlbHNlCisgICAgICB6LT5tc2cgPSAoY2hhciopImluY29tcGxldGUgZGlzdGFuY2UgdHJlZSI7CisgICAgICByID0gWl9EQVRBX0VSUk9SOworICAgIH0KKyAgICBlbHNlIGlmIChyICE9IFpfTUVNX0VSUk9SKQorICAgIHsKKyAgICAgIHotPm1zZyA9IChjaGFyKikiZW1wdHkgZGlzdGFuY2UgdHJlZSB3aXRoIGxlbmd0aHMiOworICAgICAgciA9IFpfREFUQV9FUlJPUjsKKyAgICB9CisgICAgWkZSRUUoeiwgdik7CisgICAgcmV0dXJuIHI7CisjZW5kaWYKKyAgfQorCisgIC8qIGRvbmUgKi8KKyAgWkZSRUUoeiwgdik7CisgIHJldHVybiBaX09LOworfQorCisKKy8qIGJ1aWxkIGZpeGVkIHRhYmxlcyBvbmx5IG9uY2UtLWtlZXAgdGhlbSBoZXJlICovCisjaWZkZWYgQlVJTERGSVhFRAorbG9jYWwgaW50IGZpeGVkX2J1aWx0ID0gMDsKKyNkZWZpbmUgRklYRURIIDU0NCAgICAgIC8qIG51bWJlciBvZiBodWZ0cyB1c2VkIGJ5IGZpeGVkIHRhYmxlcyAqLworbG9jYWwgaW5mbGF0ZV9odWZ0IGZpeGVkX21lbVtGSVhFREhdOworbG9jYWwgdUludCBmaXhlZF9ibDsKK2xvY2FsIHVJbnQgZml4ZWRfYmQ7Citsb2NhbCBpbmZsYXRlX2h1ZnQgKmZpeGVkX3RsOworbG9jYWwgaW5mbGF0ZV9odWZ0ICpmaXhlZF90ZDsKKyNlbHNlCisjaW5jbHVkZSAiaW5mZml4ZWQuaCIKKyNlbmRpZgorCisKK2ludCBpbmZsYXRlX3RyZWVzX2ZpeGVkKGJsLCBiZCwgdGwsIHRkLCB6KQordUludGYgKmJsOyAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCit1SW50ZiAqYmQ7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCitpbmZsYXRlX2h1ZnQgKiBGQVIgKnRsOyAgLyogbGl0ZXJhbC9sZW5ndGggdHJlZSByZXN1bHQgKi8KK2luZmxhdGVfaHVmdCAqIEZBUiAqdGQ7ICAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLworel9zdHJlYW1wIHo7ICAgICAgICAgICAgIC8qIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAqLworeworI2lmZGVmIEJVSUxERklYRUQKKyAgLyogYnVpbGQgZml4ZWQgdGFibGVzIGlmIG5vdCBhbHJlYWR5ICovCisgIGlmICghZml4ZWRfYnVpbHQpCisgIHsKKyAgICBpbnQgazsgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLworICAgIHVJbnQgZiA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIGh1ZnRzIHVzZWQgaW4gZml4ZWRfbWVtICovCisgICAgdUludGYgKmM7ICAgICAgICAgICAvKiBsZW5ndGggbGlzdCBmb3IgaHVmdF9idWlsZCAqLworICAgIHVJbnRmICp2OyAgICAgICAgICAgLyogd29yayBhcmVhIGZvciBodWZ0X2J1aWxkICovCisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgICBpZiAoKGMgPSAodUludGYqKVpBTExPQyh6LCAyODgsIHNpemVvZih1SW50KSkpID09IFpfTlVMTCkKKyAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICBpZiAoKHYgPSAodUludGYqKVpBTExPQyh6LCAyODgsIHNpemVvZih1SW50KSkpID09IFpfTlVMTCkKKyAgICB7CisgICAgICBaRlJFRSh6LCBjKTsKKyAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBsaXRlcmFsIHRhYmxlICovCisgICAgZm9yIChrID0gMDsgayA8IDE0NDsgaysrKQorICAgICAgY1trXSA9IDg7CisgICAgZm9yICg7IGsgPCAyNTY7IGsrKykKKyAgICAgIGNba10gPSA5OworICAgIGZvciAoOyBrIDwgMjgwOyBrKyspCisgICAgICBjW2tdID0gNzsKKyAgICBmb3IgKDsgayA8IDI4ODsgaysrKQorICAgICAgY1trXSA9IDg7CisgICAgZml4ZWRfYmwgPSA5OworICAgIGh1ZnRfYnVpbGQoYywgMjg4LCAyNTcsIGNwbGVucywgY3BsZXh0LCAmZml4ZWRfdGwsICZmaXhlZF9ibCwKKyAgICAgICAgICAgICAgIGZpeGVkX21lbSwgJmYsIHYpOworCisgICAgLyogZGlzdGFuY2UgdGFibGUgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgMzA7IGsrKykKKyAgICAgIGNba10gPSA1OworICAgIGZpeGVkX2JkID0gNTsKKyAgICBodWZ0X2J1aWxkKGMsIDMwLCAwLCBjcGRpc3QsIGNwZGV4dCwgJmZpeGVkX3RkLCAmZml4ZWRfYmQsCisgICAgICAgICAgICAgICBmaXhlZF9tZW0sICZmLCB2KTsKKworICAgIC8qIGRvbmUgKi8KKyAgICBaRlJFRSh6LCB2KTsKKyAgICBaRlJFRSh6LCBjKTsKKyAgICBmaXhlZF9idWlsdCA9IDE7CisgIH0KKyNlbmRpZgorICAqYmwgPSBmaXhlZF9ibDsKKyAgKmJkID0gZml4ZWRfYmQ7CisgICp0bCA9IGZpeGVkX3RsOworICAqdGQgPSBmaXhlZF90ZDsKKyAgcmV0dXJuIFpfT0s7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9pbmZ0cmVlcy5oIGIvY29tbW9uL3psaWIvaW5mdHJlZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGI3M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvaW5mdHJlZXMuaApAQCAtMCwwICsxLDU4IEBACisvKiBpbmZ0cmVlcy5oIC0tIGhlYWRlciB0byB1c2UgaW5mdHJlZXMuYworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogSHVmZm1hbiBjb2RlIGxvb2t1cCB0YWJsZSBlbnRyeS0tdGhpcyBlbnRyeSBpcyBmb3VyIGJ5dGVzIGZvciBtYWNoaW5lcworICAgdGhhdCBoYXZlIDE2LWJpdCBwb2ludGVycyAoZS5nLiBQQydzIGluIHRoZSBzbWFsbCBvciBtZWRpdW0gbW9kZWwpLiAqLworCit0eXBlZGVmIHN0cnVjdCBpbmZsYXRlX2h1ZnRfcyBGQVIgaW5mbGF0ZV9odWZ0OworCitzdHJ1Y3QgaW5mbGF0ZV9odWZ0X3MgeworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIEJ5dGUgRXhvcDsgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIG9yIG9wZXJhdGlvbiAqLworICAgICAgQnl0ZSBCaXRzOyAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHN1YmNvZGUgKi8KKyAgICB9IHdoYXQ7CisgICAgdUludCBwYWQ7ICAgICAgICAgICAvKiBwYWQgc3RydWN0dXJlIHRvIGEgcG93ZXIgb2YgMiAoNCBieXRlcyBmb3IgKi8KKyAgfSB3b3JkOyAgICAgICAgICAgICAgIC8qICAxNi1iaXQsIDggYnl0ZXMgZm9yIDMyLWJpdCBpbnQncykgKi8KKyAgdUludCBiYXNlOyAgICAgICAgICAgIC8qIGxpdGVyYWwsIGxlbmd0aCBiYXNlLCBkaXN0YW5jZSBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGFibGUgb2Zmc2V0ICovCit9OworCisvKiBNYXhpbXVtIHNpemUgb2YgZHluYW1pYyB0cmVlLiAgVGhlIG1heGltdW0gZm91bmQgaW4gYSBsb25nIGJ1dCBub24tCisgICBleGhhdXN0aXZlIHNlYXJjaCB3YXMgMTAwNCBodWZ0IHN0cnVjdHVyZXMgKDg1MCBmb3IgbGVuZ3RoL2xpdGVyYWxzCisgICBhbmQgMTU0IGZvciBkaXN0YW5jZXMsIHRoZSBsYXR0ZXIgYWN0dWFsbHkgdGhlIHJlc3VsdCBvZiBhbgorICAgZXhoYXVzdGl2ZSBzZWFyY2gpLiAgVGhlIGFjdHVhbCBtYXhpbXVtIGlzIG5vdCBrbm93biwgYnV0IHRoZQorICAgdmFsdWUgYmVsb3cgaXMgbW9yZSB0aGFuIHNhZmUuICovCisjZGVmaW5lIE1BTlkgMTQ0MAorCitleHRlcm4gaW50IGluZmxhdGVfdHJlZXNfYml0cyBPRigoCisgICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIDE5IGNvZGUgbGVuZ3RocyAqLworICAgIHVJbnRmICosICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIHRyZWUgZGVzaXJlZC9hY3R1YWwgZGVwdGggKi8KKyAgICBpbmZsYXRlX2h1ZnQgKiBGQVIgKiwgICAgICAgLyogYml0cyB0cmVlIHJlc3VsdCAqLworICAgIGluZmxhdGVfaHVmdCAqLCAgICAgICAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KKyAgICB6X3N0cmVhbXApKTsgICAgICAgICAgICAgICAgLyogZm9yIG1lc3NhZ2VzICovCisKK2V4dGVybiBpbnQgaW5mbGF0ZV90cmVlc19keW5hbWljIE9GKCgKKyAgICB1SW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisgICAgdUludCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworICAgIHVJbnRmICosICAgICAgICAgICAgICAgICAgICAvKiB0aGF0IG1hbnkgKHRvdGFsKSBjb2RlIGxlbmd0aHMgKi8KKyAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCBkZXNpcmVkL2FjdHVhbCBiaXQgZGVwdGggKi8KKyAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCisgICAgaW5mbGF0ZV9odWZ0ICogRkFSICosICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRyZWUgcmVzdWx0ICovCisgICAgaW5mbGF0ZV9odWZ0ICogRkFSICosICAgICAgIC8qIGRpc3RhbmNlIHRyZWUgcmVzdWx0ICovCisgICAgaW5mbGF0ZV9odWZ0ICosICAgICAgICAgICAgIC8qIHNwYWNlIGZvciB0cmVlcyAqLworICAgIHpfc3RyZWFtcCkpOyAgICAgICAgICAgICAgICAvKiBmb3IgbWVzc2FnZXMgKi8KKworZXh0ZXJuIGludCBpbmZsYXRlX3RyZWVzX2ZpeGVkIE9GKCgKKyAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCBkZXNpcmVkL2FjdHVhbCBiaXQgZGVwdGggKi8KKyAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCisgICAgaW5mbGF0ZV9odWZ0ICogRkFSICosICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRyZWUgcmVzdWx0ICovCisgICAgaW5mbGF0ZV9odWZ0ICogRkFSICosICAgICAgIC8qIGRpc3RhbmNlIHRyZWUgcmVzdWx0ICovCisgICAgel9zdHJlYW1wKSk7ICAgICAgICAgICAgICAgIC8qIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvaW5mdXRpbC5jIGIvY29tbW9uL3psaWIvaW5mdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMDc2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9pbmZ1dGlsLmMKQEAgLTAsMCArMSw4NyBAQAorLyogaW5mbGF0ZV91dGlsLmMgLS0gZGF0YSBhbmQgcm91dGluZXMgY29tbW9uIHRvIGJsb2NrcyBhbmQgY29kZXMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mYmxvY2suaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmNvZGVzLmgiCisjaW5jbHVkZSAiaW5mdXRpbC5oIgorCitzdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKworLyogQW5kJ2luZyB3aXRoIG1hc2tbbl0gbWFza3MgdGhlIGxvd2VyIG4gYml0cyAqLwordUludCBpbmZsYXRlX21hc2tbMTddID0geworICAgIDB4MDAwMCwKKyAgICAweDAwMDEsIDB4MDAwMywgMHgwMDA3LCAweDAwMGYsIDB4MDAxZiwgMHgwMDNmLCAweDAwN2YsIDB4MDBmZiwKKyAgICAweDAxZmYsIDB4MDNmZiwgMHgwN2ZmLCAweDBmZmYsIDB4MWZmZiwgMHgzZmZmLCAweDdmZmYsIDB4ZmZmZgorfTsKKworCisvKiBjb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgc2xpZGluZyB3aW5kb3cgdG8gdGhlIG91dHB1dCBhcmVhICovCitpbnQgaW5mbGF0ZV9mbHVzaChzLCB6LCByKQoraW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOworel9zdHJlYW1wIHo7CitpbnQgcjsKK3sKKyAgdUludCBuOworICBCeXRlZiAqcDsKKyAgQnl0ZWYgKnE7CisKKyAgLyogbG9jYWwgY29waWVzIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KKyAgcCA9IHotPm5leHRfb3V0OworICBxID0gcy0+cmVhZDsKKworICAvKiBjb21wdXRlIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGFzIGZhciBhcyBlbmQgb2Ygd2luZG93ICovCisgIG4gPSAodUludCkoKHEgPD0gcy0+d3JpdGUgPyBzLT53cml0ZSA6IHMtPmVuZCkgLSBxKTsKKyAgaWYgKG4gPiB6LT5hdmFpbF9vdXQpIG4gPSB6LT5hdmFpbF9vdXQ7CisgIGlmIChuICYmIHIgPT0gWl9CVUZfRVJST1IpIHIgPSBaX09LOworCisgIC8qIHVwZGF0ZSBjb3VudGVycyAqLworICB6LT5hdmFpbF9vdXQgLT0gbjsKKyAgei0+dG90YWxfb3V0ICs9IG47CisKKyAgLyogdXBkYXRlIGNoZWNrIGluZm9ybWF0aW9uICovCisgIGlmIChzLT5jaGVja2ZuICE9IFpfTlVMTCkKKyAgICB6LT5hZGxlciA9IHMtPmNoZWNrID0gKCpzLT5jaGVja2ZuKShzLT5jaGVjaywgcSwgbik7CisKKyAgLyogY29weSBhcyBmYXIgYXMgZW5kIG9mIHdpbmRvdyAqLworICB6bWVtY3B5KHAsIHEsIG4pOworICBwICs9IG47CisgIHEgKz0gbjsKKworICAvKiBzZWUgaWYgbW9yZSB0byBjb3B5IGF0IGJlZ2lubmluZyBvZiB3aW5kb3cgKi8KKyAgaWYgKHEgPT0gcy0+ZW5kKQorICB7CisgICAgLyogd3JhcCBwb2ludGVycyAqLworICAgIHEgPSBzLT53aW5kb3c7CisgICAgaWYgKHMtPndyaXRlID09IHMtPmVuZCkKKyAgICAgIHMtPndyaXRlID0gcy0+d2luZG93OworCisgICAgLyogY29tcHV0ZSBieXRlcyB0byBjb3B5ICovCisgICAgbiA9ICh1SW50KShzLT53cml0ZSAtIHEpOworICAgIGlmIChuID4gei0+YXZhaWxfb3V0KSBuID0gei0+YXZhaWxfb3V0OworICAgIGlmIChuICYmIHIgPT0gWl9CVUZfRVJST1IpIHIgPSBaX09LOworCisgICAgLyogdXBkYXRlIGNvdW50ZXJzICovCisgICAgei0+YXZhaWxfb3V0IC09IG47CisgICAgei0+dG90YWxfb3V0ICs9IG47CisKKyAgICAvKiB1cGRhdGUgY2hlY2sgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAocy0+Y2hlY2tmbiAhPSBaX05VTEwpCisgICAgICB6LT5hZGxlciA9IHMtPmNoZWNrID0gKCpzLT5jaGVja2ZuKShzLT5jaGVjaywgcSwgbik7CisKKyAgICAvKiBjb3B5ICovCisgICAgem1lbWNweShwLCBxLCBuKTsKKyAgICBwICs9IG47CisgICAgcSArPSBuOworICB9CisKKyAgLyogdXBkYXRlIHBvaW50ZXJzICovCisgIHotPm5leHRfb3V0ID0gcDsKKyAgcy0+cmVhZCA9IHE7CisKKyAgLyogZG9uZSAqLworICByZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2luZnV0aWwuaCBiL2NvbW1vbi96bGliL2luZnV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDAxZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvaW5mdXRpbC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qIGluZnV0aWwuaCAtLSB0eXBlcyBhbmQgbWFjcm9zIGNvbW1vbiB0byBibG9ja3MgYW5kIGNvZGVzCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisjaWZuZGVmIF9JTkZVVElMX0gKKyNkZWZpbmUgX0lORlVUSUxfSAorCit0eXBlZGVmIGVudW0geworICAgICAgVFlQRSwgICAgIC8qIGdldCB0eXBlIGJpdHMgKDMsIGluY2x1ZGluZyBlbmQgYml0KSAqLworICAgICAgTEVOUywgICAgIC8qIGdldCBsZW5ndGhzIGZvciBzdG9yZWQgKi8KKyAgICAgIFNUT1JFRCwgICAvKiBwcm9jZXNzaW5nIHN0b3JlZCBibG9jayAqLworICAgICAgVEFCTEUsICAgIC8qIGdldCB0YWJsZSBsZW5ndGhzICovCisgICAgICBCVFJFRSwgICAgLyogZ2V0IGJpdCBsZW5ndGhzIHRyZWUgZm9yIGEgZHluYW1pYyBibG9jayAqLworICAgICAgRFRSRUUsICAgIC8qIGdldCBsZW5ndGgsIGRpc3RhbmNlIHRyZWVzIGZvciBhIGR5bmFtaWMgYmxvY2sgKi8KKyAgICAgIENPREVTLCAgICAvKiBwcm9jZXNzaW5nIGZpeGVkIG9yIGR5bmFtaWMgYmxvY2sgKi8KKyAgICAgIERSWSwgICAgICAvKiBvdXRwdXQgcmVtYWluaW5nIHdpbmRvdyBieXRlcyAqLworICAgICAgRE9ORSwgICAgIC8qIGZpbmlzaGVkIGxhc3QgYmxvY2ssIGRvbmUgKi8KKyAgICAgIEJBRH0gICAgICAvKiBnb3QgYSBkYXRhIGVycm9yLS1zdHVjayBoZXJlICovCitpbmZsYXRlX2Jsb2NrX21vZGU7CisKKy8qIGluZmxhdGUgYmxvY2tzIHNlbWktcHJpdmF0ZSBzdGF0ZSAqLworc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlIHsKKworICAvKiBtb2RlICovCisgIGluZmxhdGVfYmxvY2tfbW9kZSAgbW9kZTsgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZV9ibG9jayBtb2RlICovCisKKyAgLyogbW9kZSBkZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KKyAgdW5pb24geworICAgIHVJbnQgbGVmdDsgICAgICAgICAgLyogaWYgU1RPUkVELCBieXRlcyBsZWZ0IHRvIGNvcHkgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgdUludCB0YWJsZTsgICAgICAgICAgICAgICAvKiB0YWJsZSBsZW5ndGhzICgxNCBiaXRzKSAqLworICAgICAgdUludCBpbmRleDsgICAgICAgICAgICAgICAvKiBpbmRleCBpbnRvIGJsZW5zIChvciBib3JkZXIpICovCisgICAgICB1SW50ZiAqYmxlbnM7ICAgICAgICAgICAgIC8qIGJpdCBsZW5ndGhzIG9mIGNvZGVzICovCisgICAgICB1SW50IGJiOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBsZW5ndGggdHJlZSBkZXB0aCAqLworICAgICAgaW5mbGF0ZV9odWZ0ICp0YjsgICAgICAgICAvKiBiaXQgbGVuZ3RoIGRlY29kaW5nIHRyZWUgKi8KKyAgICB9IHRyZWVzOyAgICAgICAgICAgIC8qIGlmIERUUkVFLCBkZWNvZGluZyBpbmZvIGZvciB0cmVlcyAqLworICAgIHN0cnVjdCB7CisgICAgICBpbmZsYXRlX2NvZGVzX3N0YXRlZiAKKyAgICAgICAgICpjb2RlczsKKyAgICB9IGRlY29kZTsgICAgICAgICAgIC8qIGlmIENPREVTLCBjdXJyZW50IHN0YXRlICovCisgIH0gc3ViOyAgICAgICAgICAgICAgICAvKiBzdWJtb2RlICovCisgIHVJbnQgbGFzdDsgICAgICAgICAgICAvKiB0cnVlIGlmIHRoaXMgYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sgKi8KKworICAvKiBtb2RlIGluZGVwZW5kZW50IGluZm9ybWF0aW9uICovCisgIHVJbnQgYml0azsgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKyAgdUxvbmcgYml0YjsgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgaW5mbGF0ZV9odWZ0ICpodWZ0czsgIC8qIHNpbmdsZSBtYWxsb2MgZm9yIHRyZWUgc3BhY2UgKi8KKyAgQnl0ZWYgKndpbmRvdzsgICAgICAgIC8qIHNsaWRpbmcgd2luZG93ICovCisgIEJ5dGVmICplbmQ7ICAgICAgICAgICAvKiBvbmUgYnl0ZSBhZnRlciBzbGlkaW5nIHdpbmRvdyAqLworICBCeXRlZiAqcmVhZDsgICAgICAgICAgLyogd2luZG93IHJlYWQgcG9pbnRlciAqLworICBCeXRlZiAqd3JpdGU7ICAgICAgICAgLyogd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KKyAgY2hlY2tfZnVuYyBjaGVja2ZuOyAgIC8qIGNoZWNrIGZ1bmN0aW9uICovCisgIHVMb25nIGNoZWNrOyAgICAgICAgICAvKiBjaGVjayBvbiBvdXRwdXQgKi8KKworfTsKKworCisvKiBkZWZpbmVzIGZvciBpbmZsYXRlIGlucHV0L291dHB1dCAqLworLyogICB1cGRhdGUgcG9pbnRlcnMgYW5kIHJldHVybiAqLworI2RlZmluZSBVUERCSVRTIHtzLT5iaXRiPWI7cy0+Yml0az1rO30KKyNkZWZpbmUgVVBESU4ge3otPmF2YWlsX2luPW47ei0+dG90YWxfaW4rPXAtei0+bmV4dF9pbjt6LT5uZXh0X2luPXA7fQorI2RlZmluZSBVUERPVVQge3MtPndyaXRlPXE7fQorI2RlZmluZSBVUERBVEUge1VQREJJVFMgVVBESU4gVVBET1VUfQorI2RlZmluZSBMRUFWRSB7VVBEQVRFIHJldHVybiBpbmZsYXRlX2ZsdXNoKHMseixyKTt9CisvKiAgIGdldCBieXRlcyBhbmQgYml0cyAqLworI2RlZmluZSBMT0FESU4ge3A9ei0+bmV4dF9pbjtuPXotPmF2YWlsX2luO2I9cy0+Yml0YjtrPXMtPmJpdGs7fQorI2RlZmluZSBORUVEQllURSB7aWYobilyPVpfT0s7ZWxzZSBMRUFWRX0KKyNkZWZpbmUgTkVYVEJZVEUgKG4tLSwqcCsrKQorI2RlZmluZSBORUVEQklUUyhqKSB7d2hpbGUoazwoaikpe05FRURCWVRFO2J8PSgodUxvbmcpTkVYVEJZVEUpPDxrO2srPTg7fX0KKyNkZWZpbmUgRFVNUEJJVFMoaikge2I+Pj0oaik7ay09KGopO30KKy8qICAgb3V0cHV0IGJ5dGVzICovCisjZGVmaW5lIFdBVkFJTCAodUludCkocTxzLT5yZWFkP3MtPnJlYWQtcS0xOnMtPmVuZC1xKQorI2RlZmluZSBMT0FET1VUIHtxPXMtPndyaXRlO209KHVJbnQpV0FWQUlMO30KKyNkZWZpbmUgV1JBUCB7aWYocT09cy0+ZW5kJiZzLT5yZWFkIT1zLT53aW5kb3cpe3E9cy0+d2luZG93O209KHVJbnQpV0FWQUlMO319CisjZGVmaW5lIEZMVVNIIHtVUERPVVQgcj1pbmZsYXRlX2ZsdXNoKHMseixyKTsgTE9BRE9VVH0KKyNkZWZpbmUgTkVFRE9VVCB7aWYobT09MCl7V1JBUCBpZihtPT0wKXtGTFVTSCBXUkFQIGlmKG09PTApIExFQVZFfX1yPVpfT0s7fQorI2RlZmluZSBPVVRCWVRFKGEpIHsqcSsrPShCeXRlKShhKTttLS07fQorLyogICBsb2FkIGxvY2FsIHBvaW50ZXJzICovCisjZGVmaW5lIExPQUQge0xPQURJTiBMT0FET1VUfQorCisvKiBtYXNrcyBmb3IgbG93ZXIgYml0cyAoc2l6ZSBnaXZlbiB0byBhdm9pZCBzaWxseSB3YXJuaW5ncyB3aXRoIFZpc3VhbCBDKyspICovCitleHRlcm4gdUludCBpbmZsYXRlX21hc2tbMTddOworCisvKiBjb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgc2xpZGluZyB3aW5kb3cgdG8gdGhlIG91dHB1dCBhcmVhICovCitleHRlcm4gaW50IGluZmxhdGVfZmx1c2ggT0YoKAorICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAorICAgIHpfc3RyZWFtcCAsCisgICAgaW50KSk7CisKK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZSAgICAgIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL21ha2V0cmVlLmMgYi9jb21tb24vemxpYi9tYWtldHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmQ0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9tYWtldHJlZS5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIG1ha2V0cmVlLmMgLS0gbWFrZSBpbmZmaXhlZC5oIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogVGhpcyBwcm9ncmFtIGlzIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGNvbXBsZXRlbmVzcy4KKyAgIFlvdSBkbyBub3QgbmVlZCB0byBjb21waWxlIG9yIHJ1biB0aGlzIHByb2dyYW0gc2luY2UgaW5mZml4ZWQuaAorICAgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgVG8gdXNlIHRoaXMgcHJvZ3JhbQorICAgeW91IG5lZWQgdG8gY29tcGlsZSB6bGliIHdpdGggQlVJTERGSVhFRCBkZWZpbmVkIGFuZCB0aGVuIGNvbXBpbGUKKyAgIGFuZCBsaW5rIHRoaXMgcHJvZ3JhbSB3aXRoIHRoZSB6bGliIGxpYnJhcnkuICBUaGVuIHRoZSBvdXRwdXQgb2YKKyAgIHRoaXMgcHJvZ3JhbSBjYW4gYmUgcGlwZWQgdG8gaW5mZml4ZWQuaC4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorCisvKiBzaW1wbGlmeSB0aGUgdXNlIG9mIHRoZSBpbmZsYXRlX2h1ZnQgdHlwZSB3aXRoIHNvbWUgZGVmaW5lcyAqLworI2RlZmluZSBleG9wIHdvcmQud2hhdC5FeG9wCisjZGVmaW5lIGJpdHMgd29yZC53aGF0LkJpdHMKKworLyogZ2VuZXJhdGUgaW5pdGlhbGl6YXRpb24gdGFibGUgZm9yIGFuIGluZmxhdGVfaHVmdCBzdHJ1Y3R1cmUgYXJyYXkgKi8KK3ZvaWQgbWFrZXRyZWUodUludCBiLCBpbmZsYXRlX2h1ZnQgKnQpCit7CisgIGludCBpLCBlOworCisgIGkgPSAwOworICB3aGlsZSAoMSkKKyAgeworICAgIGUgPSB0W2ldLmV4b3A7CisgICAgaWYgKGUgJiYgKGUgJiAoMTYrNjQpKSA9PSAwKSAgICAgICAgLyogdGFibGUgcG9pbnRlciAqLworICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXRyZWU6IGNhbm5vdCBpbml0aWFsaXplIHN1Yi10YWJsZXMhXG4iKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGlmIChpICUgNCA9PSAwKQorICAgICAgcHJpbnRmKCJcbiAgICIpOworICAgIHByaW50ZigiIHt7eyV1LCV1fX0sJXV9IiwgdFtpXS5leG9wLCB0W2ldLmJpdHMsIHRbaV0uYmFzZSk7CisgICAgaWYgKCsraSA9PSAoMTw8YikpCisgICAgICBicmVhazsKKyAgICBwdXRjaGFyKCcsJyk7CisgIH0KKyAgcHV0cygiIik7Cit9CisKKy8qIGNyZWF0ZSB0aGUgZml4ZWQgdGFibGVzIGluIEMgaW5pdGlhbGl6YXRpb24gc3ludGF4ICovCit2b2lkIG1haW4odm9pZCkKK3sKKyAgaW50IHI7CisgIHVJbnQgYmwsIGJkOworICBpbmZsYXRlX2h1ZnQgKnRsLCAqdGQ7CisgIHpfc3RyZWFtIHo7CisKKyAgei56YWxsb2MgPSB6Y2FsbG9jOworICB6Lm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgei56ZnJlZSA9IHpjZnJlZTsKKyAgciA9IGluZmxhdGVfdHJlZXNfZml4ZWQoJmJsLCAmYmQsICZ0bCwgJnRkLCAmeik7CisgIGlmIChyKQorICB7CisgICAgZnByaW50ZihzdGRlcnIsICJpbmZsYXRlX3RyZWVzX2ZpeGVkIGVycm9yICVkXG4iLCByKTsKKyAgICByZXR1cm47CisgIH0KKyAgcHV0cygiLyogaW5mZml4ZWQuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMiKTsKKyAgcHV0cygiICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIG1ha2V0cmVlLmMgcHJvZ3JhbSIpOworICBwdXRzKCIgKi8iKTsKKyAgcHV0cygiIik7CisgIHB1dHMoIi8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzIik7CisgIHB1dHMoIiAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcyIpOworICBwdXRzKCIgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguIik7CisgIHB1dHMoIiAqLyIpOworICBwdXRzKCIiKTsKKyAgcHJpbnRmKCJsb2NhbCB1SW50IGZpeGVkX2JsID0gJWQ7XG4iLCBibCk7CisgIHByaW50ZigibG9jYWwgdUludCBmaXhlZF9iZCA9ICVkO1xuIiwgYmQpOworICBwcmludGYoImxvY2FsIGluZmxhdGVfaHVmdCBmaXhlZF90bFtdID0geyIpOworICBtYWtldHJlZShibCwgdGwpOworICBwdXRzKCIgIH07Iik7CisgIHByaW50ZigibG9jYWwgaW5mbGF0ZV9odWZ0IGZpeGVkX3RkW10gPSB7Iik7CisgIG1ha2V0cmVlKGJkLCB0ZCk7CisgIHB1dHMoIiAgfTsiKTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL21pbmlnemlwLmMgYi9jb21tb24vemxpYi9taW5pZ3ppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTAyYmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9taW5pZ3ppcC5jCkBAIC0wLDAgKzEsMzIwIEBACisvKiBtaW5pZ3ppcC5jIC0tIHNpbXVsYXRlIGd6aXAgdXNpbmcgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyoKKyAqIG1pbmlnemlwIGlzIGEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ3ppcCB1dGlsaXR5LiBUaGlzIGlzCisgKiBvbmx5IGFuIGV4YW1wbGUgb2YgdXNpbmcgemxpYiBhbmQgaXNuJ3QgbWVhbnQgdG8gcmVwbGFjZSB0aGUKKyAqIGZ1bGwtZmVhdHVyZWQgZ3ppcC4gTm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGRlYWwgd2l0aCBmaWxlIHN5c3RlbXMKKyAqIGxpbWl0aW5nIG5hbWVzIHRvIDE0IG9yIDgrMyBjaGFyYWN0ZXJzLCBldGMuLi4gRXJyb3IgY2hlY2tpbmcgaXMKKyAqIHZlcnkgbGltaXRlZC4gU28gdXNlIG1pbmlnemlwIG9ubHkgZm9yIHRlc3Rpbmc7IHVzZSBnemlwIGZvciB0aGUKKyAqIHJlYWwgdGhpbmcuIE9uIE1TRE9TLCB1c2Ugb25seSBvbiBmaWxlIG5hbWVzIHdpdGhvdXQgZXh0ZW5zaW9uCisgKiBvciBpbiBwaXBlIG1vZGUuCisgKi8KKworLyogQCgjKSAkSWQ6IG1pbmlnemlwLmMsdiAxLjEgMjAwNC8xMC8wOCAwOTo0NDoyNiBjb25zdF9rIEV4cCAkICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInpsaWIuaCIKKworI2lmZGVmIFNUREMKKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjZWxzZQorICAgZXh0ZXJuIHZvaWQgZXhpdCAgT0YoKGludCkpOworI2VuZGlmCisKKyNpZmRlZiBVU0VfTU1BUAorIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICBpbmNsdWRlIDxzeXMvbW1hbi5oPgorIyAgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCisjICBpbmNsdWRlIDxmY250bC5oPgorIyAgaW5jbHVkZSA8aW8uaD4KKyMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkgc2V0bW9kZShmaWxlbm8oZmlsZSksIE9fQklOQVJZKQorI2Vsc2UKKyMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKKyNlbmRpZgorCisjaWZkZWYgVk1TCisjICBkZWZpbmUgdW5saW5rIGRlbGV0ZQorIyAgZGVmaW5lIEdaX1NVRkZJWCAiLWd6IgorI2VuZGlmCisjaWZkZWYgUklTQ09TCisjICBkZWZpbmUgdW5saW5rIHJlbW92ZQorIyAgZGVmaW5lIEdaX1NVRkZJWCAiLWd6IgorIyAgZGVmaW5lIGZpbGVubyhmaWxlKSBmaWxlLT5fX2ZpbGUKKyNlbmRpZgorI2lmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19kZXN0X29zICE9IF9fYmVfb3MgJiYgX19kZXN0X29zICE9IF9fd2luMzJfb3MKKyMgIGluY2x1ZGUgPHVuaXguaD4gLyogZm9yIGZpbGVubyAqLworI2VuZGlmCisKKyNpZm5kZWYgV0lOMzIgLyogdW5saW5rIGFscmVhZHkgaW4gc3RkaW8uaCBmb3IgV0lOMzIgKi8KKyAgZXh0ZXJuIGludCB1bmxpbmsgT0YoKGNvbnN0IGNoYXIgKikpOworI2VuZGlmCisKKyNpZm5kZWYgR1pfU1VGRklYCisjICBkZWZpbmUgR1pfU1VGRklYICIuZ3oiCisjZW5kaWYKKyNkZWZpbmUgU1VGRklYX0xFTiAoc2l6ZW9mKEdaX1NVRkZJWCktMSkKKworI2RlZmluZSBCVUZMRU4gICAgICAxNjM4NAorI2RlZmluZSBNQVhfTkFNRV9MRU4gMTAyNAorCisjaWZkZWYgTUFYU0VHXzY0SworIyAgZGVmaW5lIGxvY2FsIHN0YXRpYworICAgLyogTmVlZGVkIGZvciBzeXN0ZW1zIHdpdGggbGltaXRhdGlvbiBvbiBzdGFjayBzaXplLiAqLworI2Vsc2UKKyMgIGRlZmluZSBsb2NhbAorI2VuZGlmCisKK2NoYXIgKnByb2c7CisKK3ZvaWQgZXJyb3IgICAgICAgICAgICBPRigoY29uc3QgY2hhciAqbXNnKSk7Cit2b2lkIGd6X2NvbXByZXNzICAgICAgT0YoKEZJTEUgICAqaW4sIGd6RmlsZSBvdXQpKTsKKyNpZmRlZiBVU0VfTU1BUAoraW50ICBnel9jb21wcmVzc19tbWFwIE9GKChGSUxFICAgKmluLCBnekZpbGUgb3V0KSk7CisjZW5kaWYKK3ZvaWQgZ3pfdW5jb21wcmVzcyAgICBPRigoZ3pGaWxlIGluLCBGSUxFICAgKm91dCkpOwordm9pZCBmaWxlX2NvbXByZXNzICAgIE9GKChjaGFyICAqZmlsZSwgY2hhciAqbW9kZSkpOwordm9pZCBmaWxlX3VuY29tcHJlc3MgIE9GKChjaGFyICAqZmlsZSkpOworaW50ICBtYWluICAgICAgICAgICAgIE9GKChpbnQgYXJnYywgY2hhciAqYXJndltdKSk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGlzcGxheSBlcnJvciBtZXNzYWdlIGFuZCBleGl0CisgKi8KK3ZvaWQgZXJyb3IobXNnKQorICAgIGNvbnN0IGNoYXIgKm1zZzsKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZywgbXNnKTsKKyAgICBleGl0KDEpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXByZXNzIGlucHV0IHRvIG91dHB1dCB0aGVuIGNsb3NlIGJvdGggZmlsZXMuCisgKi8KKwordm9pZCBnel9jb21wcmVzcyhpbiwgb3V0KQorICAgIEZJTEUgICAqaW47CisgICAgZ3pGaWxlIG91dDsKK3sKKyAgICBsb2NhbCBjaGFyIGJ1ZltCVUZMRU5dOworICAgIGludCBsZW47CisgICAgaW50IGVycjsKKworI2lmZGVmIFVTRV9NTUFQCisgICAgLyogVHJ5IGZpcnN0IGNvbXByZXNzaW5nIHdpdGggbW1hcC4gSWYgbW1hcCBmYWlscyAobWluaWd6aXAgdXNlZCBpbiBhCisgICAgICogcGlwZSksIHVzZSB0aGUgbm9ybWFsIGZyZWFkIGxvb3AuCisgICAgICovCisgICAgaWYgKGd6X2NvbXByZXNzX21tYXAoaW4sIG91dCkgPT0gWl9PSykgcmV0dXJuOworI2VuZGlmCisgICAgZm9yICg7OykgeworICAgICAgICBsZW4gPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBpbik7CisgICAgICAgIGlmIChmZXJyb3IoaW4pKSB7CisgICAgICAgICAgICBwZXJyb3IoImZyZWFkIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPT0gMCkgYnJlYWs7CisKKyAgICAgICAgaWYgKGd6d3JpdGUob3V0LCBidWYsICh1bnNpZ25lZClsZW4pICE9IGxlbikgZXJyb3IoZ3plcnJvcihvdXQsICZlcnIpKTsKKyAgICB9CisgICAgZmNsb3NlKGluKTsKKyAgICBpZiAoZ3pjbG9zZShvdXQpICE9IFpfT0spIGVycm9yKCJmYWlsZWQgZ3pjbG9zZSIpOworfQorCisjaWZkZWYgVVNFX01NQVAgLyogTU1BUCB2ZXJzaW9uLCBNaWd1ZWwgQWxicmVjaHQgPG1hbGJyZWNoQGVzby5vcmc+ICovCisKKy8qIFRyeSBjb21wcmVzc2luZyB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlIHVzaW5nIG1tYXAuIFJldHVybiBaX09LIGlmCisgKiBpZiBzdWNjZXNzLCBaX0VSUk5PIG90aGVyd2lzZS4KKyAqLworaW50IGd6X2NvbXByZXNzX21tYXAoaW4sIG91dCkKKyAgICBGSUxFICAgKmluOworICAgIGd6RmlsZSBvdXQ7Cit7CisgICAgaW50IGxlbjsKKyAgICBpbnQgZXJyOworICAgIGludCBpZmQgPSBmaWxlbm8oaW4pOworICAgIGNhZGRyX3QgYnVmOyAgICAvKiBtbWFwJ2VkIGJ1ZmZlciBmb3IgdGhlIGVudGlyZSBpbnB1dCBmaWxlICovCisgICAgb2ZmX3QgYnVmX2xlbjsgIC8qIGxlbmd0aCBvZiB0aGUgaW5wdXQgZmlsZSAqLworICAgIHN0cnVjdCBzdGF0IHNiOworCisgICAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBmaWxlLCBuZWVkZWQgZm9yIG1tYXA6ICovCisgICAgaWYgKGZzdGF0KGlmZCwgJnNiKSA8IDApIHJldHVybiBaX0VSUk5POworICAgIGJ1Zl9sZW4gPSBzYi5zdF9zaXplOworICAgIGlmIChidWZfbGVuIDw9IDApIHJldHVybiBaX0VSUk5POworCisgICAgLyogTm93IGRvIHRoZSBhY3R1YWwgbW1hcDogKi8KKyAgICBidWYgPSBtbWFwKChjYWRkcl90KSAwLCBidWZfbGVuLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGlmZCwgKG9mZl90KTApOyAKKyAgICBpZiAoYnVmID09IChjYWRkcl90KSgtMSkpIHJldHVybiBaX0VSUk5POworCisgICAgLyogQ29tcHJlc3MgdGhlIHdob2xlIGZpbGUgYXQgb25jZTogKi8KKyAgICBsZW4gPSBnendyaXRlKG91dCwgKGNoYXIgKilidWYsICh1bnNpZ25lZClidWZfbGVuKTsKKworICAgIGlmIChsZW4gIT0gKGludClidWZfbGVuKSBlcnJvcihnemVycm9yKG91dCwgJmVycikpOworCisgICAgbXVubWFwKGJ1ZiwgYnVmX2xlbik7CisgICAgZmNsb3NlKGluKTsKKyAgICBpZiAoZ3pjbG9zZShvdXQpICE9IFpfT0spIGVycm9yKCJmYWlsZWQgZ3pjbG9zZSIpOworICAgIHJldHVybiBaX09LOworfQorI2VuZGlmIC8qIFVTRV9NTUFQICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVW5jb21wcmVzcyBpbnB1dCB0byBvdXRwdXQgdGhlbiBjbG9zZSBib3RoIGZpbGVzLgorICovCit2b2lkIGd6X3VuY29tcHJlc3MoaW4sIG91dCkKKyAgICBnekZpbGUgaW47CisgICAgRklMRSAgICpvdXQ7Cit7CisgICAgbG9jYWwgY2hhciBidWZbQlVGTEVOXTsKKyAgICBpbnQgbGVuOworICAgIGludCBlcnI7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxlbiA9IGd6cmVhZChpbiwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgIGlmIChsZW4gPCAwKSBlcnJvciAoZ3plcnJvcihpbiwgJmVycikpOworICAgICAgICBpZiAobGVuID09IDApIGJyZWFrOworCisgICAgICAgIGlmICgoaW50KWZ3cml0ZShidWYsIDEsICh1bnNpZ25lZClsZW4sIG91dCkgIT0gbGVuKSB7CisJICAgIGVycm9yKCJmYWlsZWQgZndyaXRlIik7CisJfQorICAgIH0KKyAgICBpZiAoZmNsb3NlKG91dCkpIGVycm9yKCJmYWlsZWQgZmNsb3NlIik7CisKKyAgICBpZiAoZ3pjbG9zZShpbikgIT0gWl9PSykgZXJyb3IoImZhaWxlZCBnemNsb3NlIik7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wcmVzcyB0aGUgZ2l2ZW4gZmlsZTogY3JlYXRlIGEgY29ycmVzcG9uZGluZyAuZ3ogZmlsZSBhbmQgcmVtb3ZlIHRoZQorICogb3JpZ2luYWwuCisgKi8KK3ZvaWQgZmlsZV9jb21wcmVzcyhmaWxlLCBtb2RlKQorICAgIGNoYXIgICpmaWxlOworICAgIGNoYXIgICptb2RlOworeworICAgIGxvY2FsIGNoYXIgb3V0ZmlsZVtNQVhfTkFNRV9MRU5dOworICAgIEZJTEUgICppbjsKKyAgICBnekZpbGUgb3V0OworCisgICAgc3RyY3B5KG91dGZpbGUsIGZpbGUpOworICAgIHN0cmNhdChvdXRmaWxlLCBHWl9TVUZGSVgpOworCisgICAgaW4gPSBmb3BlbihmaWxlLCAicmIiKTsKKyAgICBpZiAoaW4gPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIG91dCA9IGd6b3BlbihvdXRmaWxlLCBtb2RlKTsKKyAgICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgZ3pvcGVuICVzXG4iLCBwcm9nLCBvdXRmaWxlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZ3pfY29tcHJlc3MoaW4sIG91dCk7CisKKyAgICB1bmxpbmsoZmlsZSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVbmNvbXByZXNzIHRoZSBnaXZlbiBmaWxlIGFuZCByZW1vdmUgdGhlIG9yaWdpbmFsLgorICovCit2b2lkIGZpbGVfdW5jb21wcmVzcyhmaWxlKQorICAgIGNoYXIgICpmaWxlOworeworICAgIGxvY2FsIGNoYXIgYnVmW01BWF9OQU1FX0xFTl07CisgICAgY2hhciAqaW5maWxlLCAqb3V0ZmlsZTsKKyAgICBGSUxFICAqb3V0OworICAgIGd6RmlsZSBpbjsKKyAgICBpbnQgbGVuID0gc3RybGVuKGZpbGUpOworCisgICAgc3RyY3B5KGJ1ZiwgZmlsZSk7CisKKyAgICBpZiAobGVuID4gU1VGRklYX0xFTiAmJiBzdHJjbXAoZmlsZStsZW4tU1VGRklYX0xFTiwgR1pfU1VGRklYKSA9PSAwKSB7CisgICAgICAgIGluZmlsZSA9IGZpbGU7CisgICAgICAgIG91dGZpbGUgPSBidWY7CisgICAgICAgIG91dGZpbGVbbGVuLTNdID0gJ1wwJzsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRmaWxlID0gZmlsZTsKKyAgICAgICAgaW5maWxlID0gYnVmOworICAgICAgICBzdHJjYXQoaW5maWxlLCBHWl9TVUZGSVgpOworICAgIH0KKyAgICBpbiA9IGd6b3BlbihpbmZpbGUsICJyYiIpOworICAgIGlmIChpbiA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IGd6b3BlbiAlc1xuIiwgcHJvZywgaW5maWxlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgb3V0ID0gZm9wZW4ob3V0ZmlsZSwgIndiIik7CisgICAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgICAgIHBlcnJvcihmaWxlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBnel91bmNvbXByZXNzKGluLCBvdXQpOworCisgICAgdW5saW5rKGluZmlsZSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVc2FnZTogIG1pbmlnemlwIFstZF0gWy1mXSBbLWhdIFstMSB0byAtOV0gW2ZpbGVzLi4uXQorICogICAtZCA6IGRlY29tcHJlc3MKKyAqICAgLWYgOiBjb21wcmVzcyB3aXRoIFpfRklMVEVSRUQKKyAqICAgLWggOiBjb21wcmVzcyB3aXRoIFpfSFVGRk1BTl9PTkxZCisgKiAgIC0xIHRvIC05IDogY29tcHJlc3Npb24gbGV2ZWwKKyAqLworCitpbnQgbWFpbihhcmdjLCBhcmd2KQorICAgIGludCBhcmdjOworICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyAgICBpbnQgdW5jb21wciA9IDA7CisgICAgZ3pGaWxlIGZpbGU7CisgICAgY2hhciBvdXRtb2RlWzIwXTsKKworICAgIHN0cmNweShvdXRtb2RlLCAid2I2ICIpOworCisgICAgcHJvZyA9IGFyZ3ZbMF07CisgICAgYXJnYy0tLCBhcmd2Kys7CisKKyAgICB3aGlsZSAoYXJnYyA+IDApIHsKKyAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICItZCIpID09IDApCisJdW5jb21wciA9IDE7CisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItZiIpID09IDApCisJb3V0bW9kZVszXSA9ICdmJzsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1oIikgPT0gMCkKKwlvdXRtb2RlWzNdID0gJ2gnOworICAgICAgZWxzZSBpZiAoKCphcmd2KVswXSA9PSAnLScgJiYgKCphcmd2KVsxXSA+PSAnMScgJiYgKCphcmd2KVsxXSA8PSAnOScgJiYKKwkgICAgICAgKCphcmd2KVsyXSA9PSAwKQorCW91dG1vZGVbMl0gPSAoKmFyZ3YpWzFdOworICAgICAgZWxzZQorCWJyZWFrOworICAgICAgYXJnYy0tLCBhcmd2Kys7CisgICAgfQorICAgIGlmIChhcmdjID09IDApIHsKKyAgICAgICAgU0VUX0JJTkFSWV9NT0RFKHN0ZGluKTsKKyAgICAgICAgU0VUX0JJTkFSWV9NT0RFKHN0ZG91dCk7CisgICAgICAgIGlmICh1bmNvbXByKSB7CisgICAgICAgICAgICBmaWxlID0gZ3pkb3BlbihmaWxlbm8oc3RkaW4pLCAicmIiKTsKKyAgICAgICAgICAgIGlmIChmaWxlID09IE5VTEwpIGVycm9yKCJjYW4ndCBnemRvcGVuIHN0ZGluIik7CisgICAgICAgICAgICBnel91bmNvbXByZXNzKGZpbGUsIHN0ZG91dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxlID0gZ3pkb3BlbihmaWxlbm8oc3Rkb3V0KSwgb3V0bW9kZSk7CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKSBlcnJvcigiY2FuJ3QgZ3pkb3BlbiBzdGRvdXQiKTsKKyAgICAgICAgICAgIGd6X2NvbXByZXNzKHN0ZGluLCBmaWxlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmICh1bmNvbXByKSB7CisgICAgICAgICAgICAgICAgZmlsZV91bmNvbXByZXNzKCphcmd2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsZV9jb21wcmVzcygqYXJndiwgb3V0bW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGFyZ3YrKywgLS1hcmdjKTsKKyAgICB9CisgICAgZXhpdCgwKTsKKyAgICByZXR1cm4gMDsgLyogdG8gYXZvaWQgd2FybmluZyAqLworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvdHJlZXMuYyBiL2NvbW1vbi96bGliL3RyZWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzYzJiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL3RyZWVzLmMKQEAgLTAsMCArMSwxMjE0IEBACisvKiB0cmVlcy5jIC0tIG91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5CisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKy8qCisgKiAgQUxHT1JJVEhNCisgKgorICogICAgICBUaGUgImRlZmxhdGlvbiIgcHJvY2VzcyB1c2VzIHNldmVyYWwgSHVmZm1hbiB0cmVlcy4gVGhlIG1vcmUKKyAqICAgICAgY29tbW9uIHNvdXJjZSB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGJ5IHNob3J0ZXIgYml0IHNlcXVlbmNlcy4KKyAqCisgKiAgICAgIEVhY2ggY29kZSB0cmVlIGlzIHN0b3JlZCBpbiBhIGNvbXByZXNzZWQgZm9ybSB3aGljaCBpcyBpdHNlbGYKKyAqIGEgSHVmZm1hbiBlbmNvZGluZyBvZiB0aGUgbGVuZ3RocyBvZiBhbGwgdGhlIGNvZGUgc3RyaW5ncyAoaW4KKyAqIGFzY2VuZGluZyBvcmRlciBieSBzb3VyY2UgdmFsdWVzKS4gIFRoZSBhY3R1YWwgY29kZSBzdHJpbmdzIGFyZQorICogcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsZW5ndGhzIGluIHRoZSBpbmZsYXRlIHByb2Nlc3MsIGFzIGRlc2NyaWJlZAorICogaW4gdGhlIGRlZmxhdGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiAgUkVGRVJFTkNFUworICoKKyAqICAgICAgRGV1dHNjaCwgTC5QLiwiJ0RlZmxhdGUnIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIuCisgKiAgICAgIEF2YWlsYWJsZSBpbiBmdHAudXUubmV0Oi9wdWIvYXJjaGl2aW5nL3ppcC9kb2MvZGVmbGF0ZS0xLjEuZG9jCisgKgorICogICAgICBTdG9yZXIsIEphbWVzIEEuCisgKiAgICAgICAgICBEYXRhIENvbXByZXNzaW9uOiAgTWV0aG9kcyBhbmQgVGhlb3J5LCBwcC4gNDktNTAuCisgKiAgICAgICAgICBDb21wdXRlciBTY2llbmNlIFByZXNzLCAxOTg4LiAgSVNCTiAwLTcxNjctODE1Ni01LgorICoKKyAqICAgICAgU2VkZ2V3aWNrLCBSLgorICogICAgICAgICAgQWxnb3JpdGhtcywgcDI5MC4KKyAqICAgICAgICAgIEFkZGlzb24tV2VzbGV5LCAxOTgzLiBJU0JOIDAtMjAxLTA2NjcyLTYuCisgKi8KKworLyogQCgjKSAkSWQ6IHRyZWVzLmMsdiAxLjEgMjAwNC8xMC8wOCAwOTo0NDoyNiBjb25zdF9rIEV4cCAkICovCisKKy8qICNkZWZpbmUgR0VOX1RSRUVTX0ggKi8KKworI2luY2x1ZGUgImRlZmxhdGUuaCIKKworI2lmZGVmIERFQlVHCisjICBpbmNsdWRlIDxjdHlwZS5oPgorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uc3RhbnRzCisgKi8KKworI2RlZmluZSBNQVhfQkxfQklUUyA3CisvKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovCisKKyNkZWZpbmUgRU5EX0JMT0NLIDI1NgorLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqLworCisjZGVmaW5lIFJFUF8zXzYgICAgICAxNgorLyogcmVwZWF0IHByZXZpb3VzIGJpdCBsZW5ndGggMy02IHRpbWVzICgyIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworCisjZGVmaW5lIFJFUFpfM18xMCAgICAxNworLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovCisKKyNkZWZpbmUgUkVQWl8xMV8xMzggIDE4CisvKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworCitsb2NhbCBjb25zdCBpbnQgZXh0cmFfbGJpdHNbTEVOR1RIX0NPREVTXSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovCisgICA9IHswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDB9OworCitsb2NhbCBjb25zdCBpbnQgZXh0cmFfZGJpdHNbRF9DT0RFU10gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBkaXN0YW5jZSBjb2RlICovCisgICA9IHswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzfTsKKworbG9jYWwgY29uc3QgaW50IGV4dHJhX2JsYml0c1tCTF9DT0RFU10vKiBleHRyYSBiaXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqLworICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN307CisKK2xvY2FsIGNvbnN0IHVjaCBibF9vcmRlcltCTF9DT0RFU10KKyAgID0gezE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTV9OworLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZworICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuCisgKi8KKworI2RlZmluZSBCdWZfc2l6ZSAoOCAqIDIqc2l6ZW9mKGNoYXIpKQorLyogTnVtYmVyIG9mIGJpdHMgdXNlZCB3aXRoaW4gYmlfYnVmLiAoYmlfYnVmIG1pZ2h0IGJlIGltcGxlbWVudGVkIG9uCisgKiBtb3JlIHRoYW4gMTYgYml0cyBvbiBzb21lIHN5c3RlbXMuKQorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS4KKyAqLworCisjZGVmaW5lIERJU1RfQ09ERV9MRU4gIDUxMiAvKiBzZWUgZGVmaW5pdGlvbiBvZiBhcnJheSBkaXN0X2NvZGUgYmVsb3cgKi8KKworI2lmIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpCisvKiBub24gQU5TSSBjb21waWxlcnMgbWF5IG5vdCBhY2NlcHQgdHJlZXMuaCAqLworCitsb2NhbCBjdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTKzJdOworLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm8KKyAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyCisgKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXQKKyAqIGJlbG93KS4KKyAqLworCitsb2NhbCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXTsKKy8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2UKKyAqIDUgYml0cy4pCisgKi8KKwordWNoIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl07CisvKiBEaXN0YW5jZSBjb2Rlcy4gVGhlIGZpcnN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZGlzdGFuY2VzCisgKiAzIC4uIDI1OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mCisgKiB0aGUgMTUgYml0IGRpc3RhbmNlcy4KKyAqLworCit1Y2ggX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV07CisvKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovCisKK2xvY2FsIGludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdOworLyogRmlyc3Qgbm9ybWFsaXplZCBsZW5ndGggZm9yIGVhY2ggY29kZSAoMCA9IE1JTl9NQVRDSCkgKi8KKworbG9jYWwgaW50IGJhc2VfZGlzdFtEX0NPREVTXTsKKy8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovCisKKyNlbHNlCisjICBpbmNsdWRlICJ0cmVlcy5oIgorI2VuZGlmIC8qIEdFTl9UUkVFU19IICovCisKK3N0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3MgeworICAgIGNvbnN0IGN0X2RhdGEgKnN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqLworICAgIGNvbnN0IGludGYgKmV4dHJhX2JpdHM7ICAgICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi8KKyAgICBpbnQgICAgIGV4dHJhX2Jhc2U7ICAgICAgICAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi8KKyAgICBpbnQgICAgIGVsZW1zOyAgICAgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi8KKyAgICBpbnQgICAgIG1heF9sZW5ndGg7ICAgICAgICAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi8KK307CisKK2xvY2FsIHN0YXRpY190cmVlX2Rlc2MgIHN0YXRpY19sX2Rlc2MgPQore3N0YXRpY19sdHJlZSwgZXh0cmFfbGJpdHMsIExJVEVSQUxTKzEsIExfQ09ERVMsIE1BWF9CSVRTfTsKKworbG9jYWwgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2RfZGVzYyA9Cit7c3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFN9OworCitsb2NhbCBzdGF0aWNfdHJlZV9kZXNjICBzdGF0aWNfYmxfZGVzYyA9Cit7KGNvbnN0IGN0X2RhdGEgKikwLCBleHRyYV9ibGJpdHMsIDAsICAgQkxfQ09ERVMsIE1BWF9CTF9CSVRTfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCAoc3RhdGljKSByb3V0aW5lcyBpbiB0aGlzIGZpbGUuCisgKi8KKworbG9jYWwgdm9pZCB0cl9zdGF0aWNfaW5pdCBPRigodm9pZCkpOworbG9jYWwgdm9pZCBpbml0X2Jsb2NrICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBwcWRvd25oZWFwICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IGspKTsKK2xvY2FsIHZvaWQgZ2VuX2JpdGxlbiAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHRyZWVfZGVzYyAqZGVzYykpOworbG9jYWwgdm9pZCBnZW5fY29kZXMgICAgICBPRigoY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlLCB1c2hmICpibF9jb3VudCkpOworbG9jYWwgdm9pZCBidWlsZF90cmVlICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdHJlZV9kZXNjICpkZXNjKSk7Citsb2NhbCB2b2lkIHNjYW5fdHJlZSAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpKTsKK2xvY2FsIHZvaWQgc2VuZF90cmVlICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSkpOworbG9jYWwgaW50ICBidWlsZF9ibF90cmVlICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBzZW5kX2FsbF90cmVlcyBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGxjb2RlcywgaW50IGRjb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGNvZGVzKSk7Citsb2NhbCB2b2lkIGNvbXByZXNzX2Jsb2NrIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICpsdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0X2RhdGEgKmR0cmVlKSk7Citsb2NhbCB2b2lkIHNldF9kYXRhX3R5cGUgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCB1bnNpZ25lZCBiaV9yZXZlcnNlIE9GKCh1bnNpZ25lZCB2YWx1ZSwgaW50IGxlbmd0aCkpOworbG9jYWwgdm9pZCBiaV93aW5kdXAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBiaV9mbHVzaCAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBjb3B5X2Jsb2NrICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdW5zaWduZWQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlcikpOworCisjaWZkZWYgR0VOX1RSRUVTX0gKK2xvY2FsIHZvaWQgZ2VuX3RyZWVzX2hlYWRlciBPRigodm9pZCkpOworI2VuZGlmCisKKyNpZm5kZWYgREVCVUcKKyMgIGRlZmluZSBzZW5kX2NvZGUocywgYywgdHJlZSkgc2VuZF9iaXRzKHMsIHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pCisgICAvKiBTZW5kIGEgY29kZSBvZiB0aGUgZ2l2ZW4gdHJlZS4gYyBhbmQgdHJlZSBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLworCisjZWxzZSAvKiBERUJVRyAqLworIyAgZGVmaW5lIHNlbmRfY29kZShzLCBjLCB0cmVlKSBcCisgICAgIHsgaWYgKHpfdmVyYm9zZT4yKSBmcHJpbnRmKHN0ZGVyciwiXG5jZCAlM2QgIiwoYykpOyBcCisgICAgICAgc2VuZF9iaXRzKHMsIHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pOyB9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS4KKyAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi4KKyAqLworI2RlZmluZSBwdXRfc2hvcnQocywgdykgeyBcCisgICAgcHV0X2J5dGUocywgKHVjaCkoKHcpICYgMHhmZikpOyBcCisgICAgcHV0X2J5dGUocywgKHVjaCkoKHVzaCkodykgPj4gOCkpOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuCisgKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy4KKyAqLworI2lmZGVmIERFQlVHCitsb2NhbCB2b2lkIHNlbmRfYml0cyAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgdmFsdWUsIGludCBsZW5ndGgpKTsKKworbG9jYWwgdm9pZCBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCB2YWx1ZTsgIC8qIHZhbHVlIHRvIHNlbmQgKi8KKyAgICBpbnQgbGVuZ3RoOyAvKiBudW1iZXIgb2YgYml0cyAqLworeworICAgIFRyYWNldnYoKHN0ZGVyciwiIGwgJTJkIHYgJTR4ICIsIGxlbmd0aCwgdmFsdWUpKTsKKyAgICBBc3NlcnQobGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gMTUsICJpbnZhbGlkIGxlbmd0aCIpOworICAgIHMtPmJpdHNfc2VudCArPSAodWxnKWxlbmd0aDsKKworICAgIC8qIElmIG5vdCBlbm91Z2ggcm9vbSBpbiBiaV9idWYsIHVzZSAodmFsaWQpIGJpdHMgZnJvbSBiaV9idWYgYW5kCisgICAgICogKDE2IC0gYmlfdmFsaWQpIGJpdHMgZnJvbSB2YWx1ZSwgbGVhdmluZyAod2lkdGggLSAoMTYtYmlfdmFsaWQpKQorICAgICAqIHVudXNlZCBiaXRzIGluIHZhbHVlLgorICAgICAqLworICAgIGlmIChzLT5iaV92YWxpZCA+IChpbnQpQnVmX3NpemUgLSBsZW5ndGgpIHsKKyAgICAgICAgcy0+YmlfYnVmIHw9ICh2YWx1ZSA8PCBzLT5iaV92YWxpZCk7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgICAgICBzLT5iaV9idWYgPSAodXNoKXZhbHVlID4+IChCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkKTsKKyAgICAgICAgcy0+YmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+YmlfYnVmIHw9IHZhbHVlIDw8IHMtPmJpX3ZhbGlkOworICAgICAgICBzLT5iaV92YWxpZCArPSBsZW5ndGg7CisgICAgfQorfQorI2Vsc2UgLyogIURFQlVHICovCisKKyNkZWZpbmUgc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIFwKK3sgaW50IGxlbiA9IGxlbmd0aDtcCisgIGlmIChzLT5iaV92YWxpZCA+IChpbnQpQnVmX3NpemUgLSBsZW4pIHtcCisgICAgaW50IHZhbCA9IHZhbHVlO1wKKyAgICBzLT5iaV9idWYgfD0gKHZhbCA8PCBzLT5iaV92YWxpZCk7XAorICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpO1wKKyAgICBzLT5iaV9idWYgPSAodXNoKXZhbCA+PiAoQnVmX3NpemUgLSBzLT5iaV92YWxpZCk7XAorICAgIHMtPmJpX3ZhbGlkICs9IGxlbiAtIEJ1Zl9zaXplO1wKKyAgfSBlbHNlIHtcCisgICAgcy0+YmlfYnVmIHw9ICh2YWx1ZSkgPDwgcy0+YmlfdmFsaWQ7XAorICAgIHMtPmJpX3ZhbGlkICs9IGxlbjtcCisgIH1cCit9CisjZW5kaWYgLyogREVCVUcgKi8KKworCisjZGVmaW5lIE1BWChhLGIpIChhID49IGIgPyBhIDogYikKKy8qIHRoZSBhcmd1bWVudHMgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLgorICovCitsb2NhbCB2b2lkIHRyX3N0YXRpY19pbml0KCkKK3sKKyNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQorICAgIHN0YXRpYyBpbnQgc3RhdGljX2luaXRfZG9uZSA9IDA7CisgICAgaW50IG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovCisgICAgaW50IGxlbmd0aDsgICAvKiBsZW5ndGggdmFsdWUgKi8KKyAgICBpbnQgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi8KKyAgICBpbnQgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovCisgICAgdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdOworICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqLworCisgICAgaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjsKKworICAgIC8qIEZvciBzb21lIGVtYmVkZGVkIHRhcmdldHMsIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdCBpbml0aWFsaXplZDogKi8KKyAgICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlOworICAgIHN0YXRpY19sX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2xiaXRzOworICAgIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7CisgICAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7CisgICAgc3RhdGljX2JsX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2JsYml0czsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi8KKyAgICBsZW5ndGggPSAwOworICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMtMTsgY29kZSsrKSB7CisgICAgICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7CisgICAgICAgICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gKHVjaCljb2RlOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAobGVuZ3RoID09IDI1NiwgInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2Iik7CisgICAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWQKKyAgICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZQorICAgICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBlbmNvZGluZzoKKyAgICAgKi8KKyAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoLTFdID0gKHVjaCljb2RlOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovCisgICAgZGlzdCA9IDA7CisgICAgZm9yIChjb2RlID0gMCA7IGNvZGUgPCAxNjsgY29kZSsrKSB7CisgICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8ZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHsKKyAgICAgICAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9ICh1Y2gpY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IGRpc3QgIT0gMjU2Iik7CisgICAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovCisgICAgZm9yICggOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7CisgICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNzsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDwoZXh0cmFfZGJpdHNbY29kZV0tNykpOyBuKyspIHsKKyAgICAgICAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9ICh1Y2gpY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IDI1NitkaXN0ICE9IDUxMiIpOworCisgICAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqLworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgYmxfY291bnRbYml0c10gPSAwOworICAgIG4gPSAwOworICAgIHdoaWxlIChuIDw9IDE0Mykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKKyAgICB3aGlsZSAobiA8PSAyNTUpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDksIGJsX2NvdW50WzldKys7CisgICAgd2hpbGUgKG4gPD0gMjc5KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA3LCBibF9jb3VudFs3XSsrOworICAgIHdoaWxlIChuIDw9IDI4Nykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKKyAgICAvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGUKKyAgICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGUKKyAgICAgKiBhbGwgb25lcykKKyAgICAgKi8KKyAgICBnZW5fY29kZXMoKGN0X2RhdGEgKilzdGF0aWNfbHRyZWUsIExfQ09ERVMrMSwgYmxfY291bnQpOworCisgICAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovCisgICAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykgeworICAgICAgICBzdGF0aWNfZHRyZWVbbl0uTGVuID0gNTsKKyAgICAgICAgc3RhdGljX2R0cmVlW25dLkNvZGUgPSBiaV9yZXZlcnNlKCh1bnNpZ25lZCluLCA1KTsKKyAgICB9CisgICAgc3RhdGljX2luaXRfZG9uZSA9IDE7CisKKyMgIGlmZGVmIEdFTl9UUkVFU19ICisgICAgZ2VuX3RyZWVzX2hlYWRlcigpOworIyAgZW5kaWYKKyNlbmRpZiAvKiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKSAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdlbmVyZXJhdGUgdGhlIGZpbGUgdHJlZXMuaCBkZXNjcmliaW5nIHRoZSBzdGF0aWMgdHJlZXMuCisgKi8KKyNpZmRlZiBHRU5fVFJFRVNfSAorIyAgaWZuZGVmIERFQlVHCisjICAgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBlbmRpZgorCisjICBkZWZpbmUgU0VQQVJBVE9SKGksIGxhc3QsIHdpZHRoKSBcCisgICAgICAoKGkpID09IChsYXN0KT8gIlxufTtcblxuIiA6ICAgIFwKKyAgICAgICAoKGkpICUgKHdpZHRoKSA9PSAod2lkdGgpLTEgPyAiLFxuIiA6ICIsICIpKQorCit2b2lkIGdlbl90cmVlc19oZWFkZXIoKQoreworICAgIEZJTEUgKmhlYWRlciA9IGZvcGVuKCJ0cmVlcy5oIiwgInciKTsKKyAgICBpbnQgaTsKKworICAgIEFzc2VydCAoaGVhZGVyICE9IE5VTEwsICJDYW4ndCBvcGVuIHRyZWVzLmgiKTsKKyAgICBmcHJpbnRmKGhlYWRlciwKKwkgICAgIi8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovXG5cbiIpOworCisgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTKzJdID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IExfQ09ERVMrMjsgaSsrKSB7CisJZnByaW50ZihoZWFkZXIsICJ7eyUzdX0seyUzdX19JXMiLCBzdGF0aWNfbHRyZWVbaV0uQ29kZSwKKwkJc3RhdGljX2x0cmVlW2ldLkxlbiwgU0VQQVJBVE9SKGksIExfQ09ERVMrMSwgNSkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU10gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRF9DT0RFUzsgaSsrKSB7CisJZnByaW50ZihoZWFkZXIsICJ7eyUydX0seyUydX19JXMiLCBzdGF0aWNfZHRyZWVbaV0uQ29kZSwKKwkJc3RhdGljX2R0cmVlW2ldLkxlbiwgU0VQQVJBVE9SKGksIERfQ09ERVMtMSwgNSkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAiY29uc3QgdWNoIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRElTVF9DT0RFX0xFTjsgaSsrKSB7CisJZnByaW50ZihoZWFkZXIsICIlMnUlcyIsIF9kaXN0X2NvZGVbaV0sCisJCVNFUEFSQVRPUihpLCBESVNUX0NPREVfTEVOLTEsIDIwKSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsICJjb25zdCB1Y2ggX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV09IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUFUQ0gtTUlOX01BVENIKzE7IGkrKykgeworCWZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfbGVuZ3RoX2NvZGVbaV0sCisJCVNFUEFSQVRPUihpLCBNQVhfTUFUQ0gtTUlOX01BVENILCAyMCkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU10gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTEVOR1RIX0NPREVTOyBpKyspIHsKKwlmcHJpbnRmKGhlYWRlciwgIiUxdSVzIiwgYmFzZV9sZW5ndGhbaV0sCisJCVNFUEFSQVRPUihpLCBMRU5HVEhfQ09ERVMtMSwgMjApKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGludCBiYXNlX2Rpc3RbRF9DT0RFU10gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRF9DT0RFUzsgaSsrKSB7CisJZnByaW50ZihoZWFkZXIsICIlNXUlcyIsIGJhc2VfZGlzdFtpXSwKKwkJU0VQQVJBVE9SKGksIERfQ09ERVMtMSwgMTApKTsKKyAgICB9CisKKyAgICBmY2xvc2UoaGVhZGVyKTsKK30KKyNlbmRpZiAvKiBHRU5fVFJFRVNfSCAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS4KKyAqLwordm9pZCBfdHJfaW5pdChzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgdHJfc3RhdGljX2luaXQoKTsKKworICAgIHMtPmxfZGVzYy5keW5fdHJlZSA9IHMtPmR5bl9sdHJlZTsKKyAgICBzLT5sX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19sX2Rlc2M7CisKKyAgICBzLT5kX2Rlc2MuZHluX3RyZWUgPSBzLT5keW5fZHRyZWU7CisgICAgcy0+ZF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfZF9kZXNjOworCisgICAgcy0+YmxfZGVzYy5keW5fdHJlZSA9IHMtPmJsX3RyZWU7CisgICAgcy0+YmxfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2JsX2Rlc2M7CisKKyAgICBzLT5iaV9idWYgPSAwOworICAgIHMtPmJpX3ZhbGlkID0gMDsKKyAgICBzLT5sYXN0X2VvYl9sZW4gPSA4OyAvKiBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlICovCisjaWZkZWYgREVCVUcKKyAgICBzLT5jb21wcmVzc2VkX2xlbiA9IDBMOworICAgIHMtPmJpdHNfc2VudCA9IDBMOworI2VuZGlmCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi8KKyAgICBpbml0X2Jsb2NrKHMpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suCisgKi8KK2xvY2FsIHZvaWQgaW5pdF9ibG9jayhzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaW50IG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovCisgICAgZm9yIChuID0gMDsgbiA8IExfQ09ERVM7ICBuKyspIHMtPmR5bl9sdHJlZVtuXS5GcmVxID0gMDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgcy0+ZHluX2R0cmVlW25dLkZyZXEgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSBzLT5ibF90cmVlW25dLkZyZXEgPSAwOworCisgICAgcy0+ZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7CisgICAgcy0+b3B0X2xlbiA9IHMtPnN0YXRpY19sZW4gPSAwTDsKKyAgICBzLT5sYXN0X2xpdCA9IHMtPm1hdGNoZXMgPSAwOworfQorCisjZGVmaW5lIFNNQUxMRVNUIDEKKy8qIEluZGV4IHdpdGhpbiB0aGUgaGVhcCBhcnJheSBvZiBsZWFzdCBmcmVxdWVudCBub2RlIGluIHRoZSBIdWZmbWFuIHRyZWUgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlbW92ZSB0aGUgc21hbGxlc3QgZWxlbWVudCBmcm9tIHRoZSBoZWFwIGFuZCByZWNyZWF0ZSB0aGUgaGVhcCB3aXRoCisgKiBvbmUgbGVzcyBlbGVtZW50LiBVcGRhdGVzIGhlYXAgYW5kIGhlYXBfbGVuLgorICovCisjZGVmaW5lIHBxcmVtb3ZlKHMsIHRyZWUsIHRvcCkgXAore1wKKyAgICB0b3AgPSBzLT5oZWFwW1NNQUxMRVNUXTsgXAorICAgIHMtPmhlYXBbU01BTExFU1RdID0gcy0+aGVhcFtzLT5oZWFwX2xlbi0tXTsgXAorICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW4KKyAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLgorICovCisjZGVmaW5lIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIFwKKyAgICh0cmVlW25dLkZyZXEgPCB0cmVlW21dLkZyZXEgfHwgXAorICAgKHRyZWVbbl0uRnJlcSA9PSB0cmVlW21dLkZyZXEgJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLAorICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmcKKyAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKKyAqIHR3byBzb25zKS4KKyAqLworbG9jYWwgdm9pZCBwcWRvd25oZWFwKHMsIHRyZWUsIGspCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqLworICAgIGludCBrOyAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gbW92ZSBkb3duICovCit7CisgICAgaW50IHYgPSBzLT5oZWFwW2tdOworICAgIGludCBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqLworICAgIHdoaWxlIChqIDw9IHMtPmhlYXBfbGVuKSB7CisgICAgICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovCisgICAgICAgIGlmIChqIDwgcy0+aGVhcF9sZW4gJiYKKyAgICAgICAgICAgIHNtYWxsZXIodHJlZSwgcy0+aGVhcFtqKzFdLCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqLworICAgICAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIGJyZWFrOworCisgICAgICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovCisgICAgICAgIHMtPmhlYXBba10gPSBzLT5oZWFwW2pdOyAgayA9IGo7CisKKyAgICAgICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqLworICAgICAgICBqIDw8PSAxOworICAgIH0KKyAgICBzLT5oZWFwW2tdID0gdjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aAorICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmQKKyAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlCisgKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguCisgKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzCisgKiAgICAgbm90IG51bGwuCisgKi8KK2xvY2FsIHZvaWQgZ2VuX2JpdGxlbihzLCBkZXNjKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCit7CisgICAgY3RfZGF0YSAqdHJlZSAgICAgICAgPSBkZXNjLT5keW5fdHJlZTsKKyAgICBpbnQgbWF4X2NvZGUgICAgICAgICA9IGRlc2MtPm1heF9jb2RlOworICAgIGNvbnN0IGN0X2RhdGEgKnN0cmVlID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKKyAgICBjb25zdCBpbnRmICpleHRyYSAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYml0czsKKyAgICBpbnQgYmFzZSAgICAgICAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYmFzZTsKKyAgICBpbnQgbWF4X2xlbmd0aCAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+bWF4X2xlbmd0aDsKKyAgICBpbnQgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi8KKyAgICBpbnQgbiwgbTsgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqLworICAgIGludCBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqLworICAgIGludCB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqLworICAgIHVzaCBmOyAgICAgICAgICAgICAgLyogZnJlcXVlbmN5ICovCisgICAgaW50IG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqLworCisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBzLT5ibF9jb3VudFtiaXRzXSA9IDA7CisKKyAgICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heQorICAgICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLgorICAgICAqLworICAgIHRyZWVbcy0+aGVhcFtzLT5oZWFwX21heF1dLkxlbiA9IDA7IC8qIHJvb3Qgb2YgdGhlIGhlYXAgKi8KKworICAgIGZvciAoaCA9IHMtPmhlYXBfbWF4KzE7IGggPCBIRUFQX1NJWkU7IGgrKykgeworICAgICAgICBuID0gcy0+aGVhcFtoXTsKKyAgICAgICAgYml0cyA9IHRyZWVbdHJlZVtuXS5EYWRdLkxlbiArIDE7CisgICAgICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkgYml0cyA9IG1heF9sZW5ndGgsIG92ZXJmbG93Kys7CisgICAgICAgIHRyZWVbbl0uTGVuID0gKHVzaCliaXRzOworICAgICAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqLworCisgICAgICAgIGlmIChuID4gbWF4X2NvZGUpIGNvbnRpbnVlOyAvKiBub3QgYSBsZWFmIG5vZGUgKi8KKworICAgICAgICBzLT5ibF9jb3VudFtiaXRzXSsrOworICAgICAgICB4Yml0cyA9IDA7CisgICAgICAgIGlmIChuID49IGJhc2UpIHhiaXRzID0gZXh0cmFbbi1iYXNlXTsKKyAgICAgICAgZiA9IHRyZWVbbl0uRnJlcTsKKyAgICAgICAgcy0+b3B0X2xlbiArPSAodWxnKWYgKiAoYml0cyArIHhiaXRzKTsKKyAgICAgICAgaWYgKHN0cmVlKSBzLT5zdGF0aWNfbGVuICs9ICh1bGcpZiAqIChzdHJlZVtuXS5MZW4gKyB4Yml0cyk7CisgICAgfQorICAgIGlmIChvdmVyZmxvdyA9PSAwKSByZXR1cm47CisKKyAgICBUcmFjZSgoc3RkZXJyLCJcbmJpdCBsZW5ndGggb3ZlcmZsb3dcbiIpKTsKKyAgICAvKiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cyAqLworCisgICAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi8KKyAgICBkbyB7CisgICAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoLTE7CisgICAgICAgIHdoaWxlIChzLT5ibF9jb3VudFtiaXRzXSA9PSAwKSBiaXRzLS07CisgICAgICAgIHMtPmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovCisgICAgICAgIHMtPmJsX2NvdW50W2JpdHMrMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqLworICAgICAgICBzLT5ibF9jb3VudFttYXhfbGVuZ3RoXS0tOworICAgICAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLAorICAgICAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF0KKyAgICAgICAgICovCisgICAgICAgIG92ZXJmbG93IC09IDI7CisgICAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTsKKworICAgIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2FubmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KKyAgICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsCisgICAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW4KKyAgICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLikKKyAgICAgKi8KKyAgICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9IDA7IGJpdHMtLSkgeworICAgICAgICBuID0gcy0+YmxfY291bnRbYml0c107CisgICAgICAgIHdoaWxlIChuICE9IDApIHsKKyAgICAgICAgICAgIG0gPSBzLT5oZWFwWy0taF07CisgICAgICAgICAgICBpZiAobSA+IG1heF9jb2RlKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICh0cmVlW21dLkxlbiAhPSAodW5zaWduZWQpIGJpdHMpIHsKKyAgICAgICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCJjb2RlICVkIGJpdHMgJWQtPiVkXG4iLCBtLCB0cmVlW21dLkxlbiwgYml0cykpOworICAgICAgICAgICAgICAgIHMtPm9wdF9sZW4gKz0gKChsb25nKWJpdHMgLSAobG9uZyl0cmVlW21dLkxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobG9uZyl0cmVlW21dLkZyZXE7CisgICAgICAgICAgICAgICAgdHJlZVttXS5MZW4gPSAodXNoKWJpdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlCisgKiBvcHRpbWFsKS4KKyAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yCisgKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLgorICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub24KKyAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLgorICovCitsb2NhbCB2b2lkIGdlbl9jb2RlcyAodHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KQorICAgIGN0X2RhdGEgKnRyZWU7ICAgICAgICAgICAgIC8qIHRoZSB0cmVlIHRvIGRlY29yYXRlICovCisgICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisgICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqLworeworICAgIHVzaCBuZXh0X2NvZGVbTUFYX0JJVFMrMV07IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovCisgICAgdXNoIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovCisgICAgaW50IGJpdHM7ICAgICAgICAgICAgICAgICAgLyogYml0IGluZGV4ICovCisgICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqLworCisgICAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzCisgICAgICogd2l0aG91dCBiaXQgcmV2ZXJzYWwuCisgICAgICovCisgICAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7CisgICAgICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMtMV0pIDw8IDE7CisgICAgfQorICAgIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGUKKyAgICAgKiBtdXN0IGJlIGFsbCBvbmVzLgorICAgICAqLworICAgIEFzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSwKKyAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgYml0IGNvdW50cyIpOworICAgIFRyYWNldigoc3RkZXJyLCJcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgIiwgbWF4X2NvZGUpKTsKKworICAgIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgaW50IGxlbiA9IHRyZWVbbl0uTGVuOworICAgICAgICBpZiAobGVuID09IDApIGNvbnRpbnVlOworICAgICAgICAvKiBOb3cgcmV2ZXJzZSB0aGUgYml0cyAqLworICAgICAgICB0cmVlW25dLkNvZGUgPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7CisKKyAgICAgICAgVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVyciwiXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpICIsCisgICAgICAgICAgICAgbiwgKGlzZ3JhcGgobikgPyBuIDogJyAnKSwgbGVuLCB0cmVlW25dLkNvZGUsIG5leHRfY29kZVtsZW5dLTEpKTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuCisgKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLgorICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aAorICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzCisgKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LgorICovCitsb2NhbCB2b2lkIGJ1aWxkX3RyZWUocywgZGVzYykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqLworeworICAgIGN0X2RhdGEgKnRyZWUgICAgICAgICA9IGRlc2MtPmR5bl90cmVlOworICAgIGNvbnN0IGN0X2RhdGEgKnN0cmVlICA9IGRlc2MtPnN0YXRfZGVzYy0+c3RhdGljX3RyZWU7CisgICAgaW50IGVsZW1zICAgICAgICAgICAgID0gZGVzYy0+c3RhdF9kZXNjLT5lbGVtczsKKyAgICBpbnQgbiwgbTsgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIGhlYXAgZWxlbWVudHMgKi8KKyAgICBpbnQgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisgICAgaW50IG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi8KKworICAgIC8qIENvbnN0cnVjdCB0aGUgaW5pdGlhbCBoZWFwLCB3aXRoIGxlYXN0IGZyZXF1ZW50IGVsZW1lbnQgaW4KKyAgICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4KKyAgICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICAgICAqLworICAgIHMtPmhlYXBfbGVuID0gMCwgcy0+aGVhcF9tYXggPSBIRUFQX1NJWkU7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykgeworICAgICAgICBpZiAodHJlZVtuXS5GcmVxICE9IDApIHsKKyAgICAgICAgICAgIHMtPmhlYXBbKysocy0+aGVhcF9sZW4pXSA9IG1heF9jb2RlID0gbjsKKyAgICAgICAgICAgIHMtPmRlcHRoW25dID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyZWVbbl0uTGVuID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsCisgICAgICogYW5kIHRoYXQgYXQgbGVhc3Qgb25lIGJpdCBzaG91bGQgYmUgc2VudCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lCisgICAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3QKKyAgICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LgorICAgICAqLworICAgIHdoaWxlIChzLT5oZWFwX2xlbiA8IDIpIHsKKyAgICAgICAgbm9kZSA9IHMtPmhlYXBbKysocy0+aGVhcF9sZW4pXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7CisgICAgICAgIHRyZWVbbm9kZV0uRnJlcSA9IDE7CisgICAgICAgIHMtPmRlcHRoW25vZGVdID0gMDsKKyAgICAgICAgcy0+b3B0X2xlbi0tOyBpZiAoc3RyZWUpIHMtPnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZV0uTGVuOworICAgICAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi8KKyAgICB9CisgICAgZGVzYy0+bWF4X2NvZGUgPSBtYXhfY29kZTsKKworICAgIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSwKKyAgICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczoKKyAgICAgKi8KKyAgICBmb3IgKG4gPSBzLT5oZWFwX2xlbi8yOyBuID49IDE7IG4tLSkgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsKKworICAgIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d28KKyAgICAgKiBmcmVxdWVudCBub2Rlcy4KKyAgICAgKi8KKyAgICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi8KKyAgICBkbyB7CisgICAgICAgIHBxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovCisgICAgICAgIG0gPSBzLT5oZWFwW1NNQUxMRVNUXTsgLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi8KKworICAgICAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovCisgICAgICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IG07CisKKyAgICAgICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi8KKyAgICAgICAgdHJlZVtub2RlXS5GcmVxID0gdHJlZVtuXS5GcmVxICsgdHJlZVttXS5GcmVxOworICAgICAgICBzLT5kZXB0aFtub2RlXSA9ICh1Y2gpIChNQVgocy0+ZGVwdGhbbl0sIHMtPmRlcHRoW21dKSArIDEpOworICAgICAgICB0cmVlW25dLkRhZCA9IHRyZWVbbV0uRGFkID0gKHVzaClub2RlOworI2lmZGVmIERVTVBfQkxfVFJFRQorICAgICAgICBpZiAodHJlZSA9PSBzLT5ibF90cmVlKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG5ub2RlICVkKCVkKSwgc29ucyAlZCglZCkgJWQoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgdHJlZVtub2RlXS5GcmVxLCBuLCB0cmVlW25dLkZyZXEsIG0sIHRyZWVbbV0uRnJlcSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqLworICAgICAgICBzLT5oZWFwW1NNQUxMRVNUXSA9IG5vZGUrKzsKKyAgICAgICAgcHFkb3duaGVhcChzLCB0cmVlLCBTTUFMTEVTVCk7CisKKyAgICB9IHdoaWxlIChzLT5oZWFwX2xlbiA+PSAyKTsKKworICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IHMtPmhlYXBbU01BTExFU1RdOworCisgICAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vdworICAgICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy4KKyAgICAgKi8KKyAgICBnZW5fYml0bGVuKHMsICh0cmVlX2Rlc2MgKilkZXNjKTsKKworICAgIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi8KKyAgICBnZW5fY29kZXMgKChjdF9kYXRhICopdHJlZSwgbWF4X2NvZGUsIHMtPmJsX2NvdW50KTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzCisgKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLgorICovCitsb2NhbCB2b2lkIHNjYW5fdHJlZSAocywgdHJlZSwgbWF4X2NvZGUpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi8KKyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworeworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCisgICAgaW50IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLworICAgIGludCBuZXh0bGVuID0gdHJlZVswXS5MZW47IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KKyAgICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqLworICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi8KKyAgICBpbnQgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovCisKKyAgICBpZiAobmV4dGxlbiA9PSAwKSBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgdHJlZVttYXhfY29kZSsxXS5MZW4gPSAodXNoKTB4ZmZmZjsgLyogZ3VhcmQgKi8KKworICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgeworICAgICAgICBjdXJsZW4gPSBuZXh0bGVuOyBuZXh0bGVuID0gdHJlZVtuKzFdLkxlbjsKKyAgICAgICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW2N1cmxlbl0uRnJlcSArPSBjb3VudDsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSBzLT5ibF90cmVlW2N1cmxlbl0uRnJlcSsrOworICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBfM182XS5GcmVxKys7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKyAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQWl8zXzEwXS5GcmVxKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW1JFUFpfMTFfMTM4XS5GcmVxKys7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOworICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW4KKyAqIGJsX3RyZWUuCisgKi8KK2xvY2FsIHZvaWQgc2VuZF90cmVlIChzLCB0cmVlLCBtYXhfY29kZSkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGN0X2RhdGEgKnRyZWU7IC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi8KKyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworeworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCisgICAgaW50IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLworICAgIGludCBuZXh0bGVuID0gdHJlZVswXS5MZW47IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KKyAgICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqLworICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi8KKyAgICBpbnQgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovCisKKyAgICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi8KKyAgICBpZiAobmV4dGxlbiA9PSAwKSBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisKKyAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CisgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgeworICAgICAgICAgICAgZG8geyBzZW5kX2NvZGUocywgY3VybGVuLCBzLT5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPSAwKTsKKworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY3VybGVuICE9IHByZXZsZW4pIHsKKyAgICAgICAgICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLT5ibF90cmVlKTsgY291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydChjb3VudCA+PSAzICYmIGNvdW50IDw9IDYsICIgM182PyIpOworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMywgMik7CisKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkgeworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfM18xMCwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0zLCAzKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTExLCA3KTsKKyAgICAgICAgfQorICAgICAgICBjb3VudCA9IDA7IHByZXZsZW4gPSBjdXJsZW47CisgICAgICAgIGlmIChuZXh0bGVuID09IDApIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNiwgbWluX2NvdW50ID0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDcsIG1pbl9jb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpbgorICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisgKi8KK2xvY2FsIGludCBidWlsZF9ibF90cmVlKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpbnQgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCisgICAgc2Nhbl90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCBzLT5sX2Rlc2MubWF4X2NvZGUpOworICAgIHNjYW5fdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSwgcy0+ZF9kZXNjLm1heF9jb2RlKTsKKworICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6ICovCisgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+YmxfZGVzYykpKTsKKyAgICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0CisgICAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy4KKyAgICAgKi8KKworICAgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdAorICAgICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzCisgICAgICogMyBidXQgdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGlzIDQuKQorICAgICAqLworICAgIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUy0xOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7CisgICAgICAgIGlmIChzLT5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XV0uTGVuICE9IDApIGJyZWFrOworICAgIH0KKyAgICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqLworICAgIHMtPm9wdF9sZW4gKz0gMyoobWF4X2JsaW5kZXgrMSkgKyA1KzUrNDsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZCIsCisgICAgICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7CisKKyAgICByZXR1cm4gbWF4X2JsaW5kZXg7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlCisgKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS4KKyAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC4KKyAqLworbG9jYWwgdm9pZCBzZW5kX2FsbF90cmVlcyhzLCBsY29kZXMsIGRjb2RlcywgYmxjb2RlcykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi8KK3sKKyAgICBpbnQgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovCisKKyAgICBBc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCAibm90IGVub3VnaCBjb2RlcyIpOworICAgIEFzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUywKKyAgICAgICAgICAgICJ0b28gbWFueSBjb2RlcyIpOworICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCBjb3VudHM6ICIpKTsKKyAgICBzZW5kX2JpdHMocywgbGNvZGVzLTI1NywgNSk7IC8qIG5vdCArMjU1IGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqLworICAgIHNlbmRfYml0cyhzLCBkY29kZXMtMSwgICA1KTsKKyAgICBzZW5kX2JpdHMocywgYmxjb2Rlcy00LCAgNCk7IC8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKyAgICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCBjb2RlICUyZCAiLCBibF9vcmRlcltyYW5rXSkpOworICAgICAgICBzZW5kX2JpdHMocywgcy0+YmxfdHJlZVtibF9vcmRlcltyYW5rXV0uTGVuLCAzKTsKKyAgICB9CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmJsIHRyZWU6IHNlbnQgJWxkIiwgcy0+Yml0c19zZW50KSk7CisKKyAgICBzZW5kX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fbHRyZWUsIGxjb2Rlcy0xKTsgLyogbGl0ZXJhbCB0cmVlICovCisgICAgVHJhY2V2KChzdGRlcnIsICJcbmxpdCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOworCisgICAgc2VuZF90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2R0cmVlLCBkY29kZXMtMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBzdG9yZWQgYmxvY2sKKyAqLwordm9pZCBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgZW9mKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2sgKi8KKyAgICB1bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KKyAgICBpbnQgZW9mOyAgICAgICAgICAvKiB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworeworICAgIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLPDwxKStlb2YsIDMpOyAgLyogc2VuZCBibG9jayB0eXBlICovCisjaWZkZWYgREVCVUcKKyAgICBzLT5jb21wcmVzc2VkX2xlbiA9IChzLT5jb21wcmVzc2VkX2xlbiArIDMgKyA3KSAmICh1bGcpfjdMOworICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IChzdG9yZWRfbGVuICsgNCkgPDwgMzsKKyNlbmRpZgorICAgIGNvcHlfYmxvY2socywgYnVmLCAodW5zaWduZWQpc3RvcmVkX2xlbiwgMSk7IC8qIHdpdGggaGVhZGVyICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS4KKyAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLgorICogVGhlIGN1cnJlbnQgaW5mbGF0ZSBjb2RlIHJlcXVpcmVzIDkgYml0cyBvZiBsb29rYWhlYWQuIElmIHRoZQorICogbGFzdCB0d28gY29kZXMgZm9yIHRoZSBwcmV2aW91cyBibG9jayAocmVhbCBjb2RlIHBsdXMgRU9CKSB3ZXJlIGNvZGVkCisgKiBvbiA1IGJpdHMgb3IgbGVzcywgaW5mbGF0ZSBtYXkgaGF2ZSBvbmx5IDUrMyBiaXRzIG9mIGxvb2thaGVhZCB0byBkZWNvZGUKKyAqIHRoZSBsYXN0IHJlYWwgY29kZS4gSW4gdGhpcyBjYXNlIHdlIHNlbmQgdHdvIGVtcHR5IHN0YXRpYyBibG9ja3MgaW5zdGVhZAorICogb2Ygb25lLiAoVGhlcmUgYXJlIG5vIHByb2JsZW1zIGlmIHRoZSBwcmV2aW91cyBibG9jayBpcyBzdG9yZWQgb3IgZml4ZWQuKQorICogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIGFzc3VtZSB0aGUgd29yc3QgY2FzZSBvZiBsYXN0IHJlYWwgY29kZSBlbmNvZGVkCisgKiBvbiBvbmUgYml0IG9ubHkuCisgKi8KK3ZvaWQgX3RyX2FsaWduKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTPDwxLCAzKTsKKyAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpOworI2lmZGVmIERFQlVHCisgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMTBMOyAvKiAzIGZvciBibG9jayB0eXBlLCA3IGZvciBFT0IgKi8KKyNlbmRpZgorICAgIGJpX2ZsdXNoKHMpOworICAgIC8qIE9mIHRoZSAxMCBiaXRzIGZvciB0aGUgZW1wdHkgYmxvY2ssIHdlIGhhdmUgYWxyZWFkeSBzZW50CisgICAgICogKDEwIC0gYmlfdmFsaWQpIGJpdHMuIFRoZSBsb29rYWhlYWQgZm9yIHRoZSBsYXN0IHJlYWwgY29kZSAoYmVmb3JlCisgICAgICogdGhlIEVPQiBvZiB0aGUgcHJldmlvdXMgYmxvY2spIHdhcyB0aHVzIGF0IGxlYXN0IG9uZSBwbHVzIHRoZSBsZW5ndGgKKyAgICAgKiBvZiB0aGUgRU9CIHBsdXMgd2hhdCB3ZSBoYXZlIGp1c3Qgc2VudCBvZiB0aGUgZW1wdHkgc3RhdGljIGJsb2NrLgorICAgICAqLworICAgIGlmICgxICsgcy0+bGFzdF9lb2JfbGVuICsgMTAgLSBzLT5iaV92YWxpZCA8IDkpIHsKKyAgICAgICAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUzw8MSwgMyk7CisgICAgICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMTBMOworI2VuZGlmCisgICAgICAgIGJpX2ZsdXNoKHMpOworICAgIH0KKyAgICBzLT5sYXN0X2VvYl9sZW4gPSA3OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpYworICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLgorICovCit2b2lkIF90cl9mbHVzaF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGVvZikKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi8KKyAgICB1bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KKyAgICBpbnQgZW9mOyAgICAgICAgICAvKiB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworeworICAgIHVsZyBvcHRfbGVuYiwgc3RhdGljX2xlbmI7IC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi8KKyAgICBpbnQgbWF4X2JsaW5kZXggPSAwOyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLworCisgICAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqLworICAgIGlmIChzLT5sZXZlbCA+IDApIHsKKworCSAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBhc2NpaSBvciBiaW5hcnkgKi8KKwlpZiAocy0+ZGF0YV90eXBlID09IFpfVU5LTk9XTikgc2V0X2RhdGFfdHlwZShzKTsKKworCS8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KKwlidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5sX2Rlc2MpKSk7CisJVHJhY2V2KChzdGRlcnIsICJcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCisJCXMtPnN0YXRpY19sZW4pKTsKKworCWJ1aWxkX3RyZWUocywgKHRyZWVfZGVzYyAqKSgmKHMtPmRfZGVzYykpKTsKKwlUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCisJCXMtPnN0YXRpY19sZW4pKTsKKwkvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2YKKwkgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLgorCSAqLworCisJLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKKwkgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC4KKwkgKi8KKwltYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgZmlyc3QgdGhlIGJsb2NrIGxlbmd0aCBpbiBieXRlcyovCisJb3B0X2xlbmIgPSAocy0+b3B0X2xlbiszKzcpPj4zOworCXN0YXRpY19sZW5iID0gKHMtPnN0YXRpY19sZW4rMys3KT4+MzsKKworCVRyYWNldigoc3RkZXJyLCAiXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSAiLAorCQlvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCisJCXMtPmxhc3RfbGl0KSk7CisKKwlpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBc3NlcnQoYnVmICE9IChjaGFyKikwLCAibG9zdCBidWYiKTsKKwlvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovCisgICAgfQorCisjaWZkZWYgRk9SQ0VfU1RPUkVECisgICAgaWYgKGJ1ZiAhPSAoY2hhciopMCkgeyAvKiBmb3JjZSBzdG9yZWQgYmxvY2sgKi8KKyNlbHNlCisgICAgaWYgKHN0b3JlZF9sZW4rNCA8PSBvcHRfbGVuYiAmJiBidWYgIT0gKGNoYXIqKTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogNDogdHdvIHdvcmRzIGZvciB0aGUgbGVuZ3RocyAqLworI2VuZGlmCisgICAgICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuCisgICAgICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2UKKyAgICAgICAgICogdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuCisgICAgICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0bworICAgICAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLgorICAgICAgICAgKi8KKyAgICAgICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGVvZik7CisKKyNpZmRlZiBGT1JDRV9TVEFUSUMKKyAgICB9IGVsc2UgaWYgKHN0YXRpY19sZW5iID49IDApIHsgLyogZm9yY2Ugc3RhdGljIHRyZWVzICovCisjZWxzZQorICAgIH0gZWxzZSBpZiAoc3RhdGljX2xlbmIgPT0gb3B0X2xlbmIpIHsKKyNlbmRpZgorICAgICAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUzw8MSkrZW9mLCAzKTsKKyAgICAgICAgY29tcHJlc3NfYmxvY2socywgKGN0X2RhdGEgKilzdGF0aWNfbHRyZWUsIChjdF9kYXRhICopc3RhdGljX2R0cmVlKTsKKyNpZmRlZiBERUJVRworICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAzICsgcy0+c3RhdGljX2xlbjsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTPDwxKStlb2YsIDMpOworICAgICAgICBzZW5kX2FsbF90cmVlcyhzLCBzLT5sX2Rlc2MubWF4X2NvZGUrMSwgcy0+ZF9kZXNjLm1heF9jb2RlKzEsCisgICAgICAgICAgICAgICAgICAgICAgIG1heF9ibGluZGV4KzEpOworICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUpOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDMgKyBzLT5vcHRfbGVuOworI2VuZGlmCisgICAgfQorICAgIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCAiYmFkIGNvbXByZXNzZWQgc2l6ZSIpOworICAgIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CCisgICAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuCisgICAgICovCisgICAgaW5pdF9ibG9jayhzKTsKKworICAgIGlmIChlb2YpIHsKKyAgICAgICAgYmlfd2luZHVwKHMpOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDc7ICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCisjZW5kaWYKKyAgICB9CisgICAgVHJhY2V2KChzdGRlcnIsIlxuY29tcHJsZW4gJWx1KCVsdSkgIiwgcy0+Y29tcHJlc3NlZF9sZW4+PjMsCisgICAgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuLTcqZW9mKSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmCisgKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuCisgKi8KK2ludCBfdHJfdGFsbHkgKHMsIGRpc3QsIGxjKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdW5zaWduZWQgZGlzdDsgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovCisgICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovCit7CisgICAgcy0+ZF9idWZbcy0+bGFzdF9saXRdID0gKHVzaClkaXN0OworICAgIHMtPmxfYnVmW3MtPmxhc3RfbGl0KytdID0gKHVjaClsYzsKKyAgICBpZiAoZGlzdCA9PSAwKSB7CisgICAgICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqLworICAgICAgICBzLT5keW5fbHRyZWVbbGNdLkZyZXErKzsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5tYXRjaGVzKys7CisgICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KKyAgICAgICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovCisgICAgICAgIEFzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmCisgICAgICAgICAgICAgICAodXNoKWxjIDw9ICh1c2gpKE1BWF9NQVRDSC1NSU5fTUFUQ0gpICYmCisgICAgICAgICAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgICJfdHJfdGFsbHk6IGJhZCBtYXRjaCIpOworCisgICAgICAgIHMtPmR5bl9sdHJlZVtfbGVuZ3RoX2NvZGVbbGNdK0xJVEVSQUxTKzFdLkZyZXErKzsKKyAgICAgICAgcy0+ZHluX2R0cmVlW2RfY29kZShkaXN0KV0uRnJlcSsrOworICAgIH0KKworI2lmZGVmIFRSVU5DQVRFX0JMT0NLCisgICAgLyogVHJ5IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBoZXJlICovCisgICAgaWYgKChzLT5sYXN0X2xpdCAmIDB4MWZmZikgPT0gMCAmJiBzLT5sZXZlbCA+IDIpIHsKKyAgICAgICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICovCisgICAgICAgIHVsZyBvdXRfbGVuZ3RoID0gKHVsZylzLT5sYXN0X2xpdCo4TDsKKyAgICAgICAgdWxnIGluX2xlbmd0aCA9ICh1bGcpKChsb25nKXMtPnN0cnN0YXJ0IC0gcy0+YmxvY2tfc3RhcnQpOworICAgICAgICBpbnQgZGNvZGU7CisgICAgICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHsKKyAgICAgICAgICAgIG91dF9sZW5ndGggKz0gKHVsZylzLT5keW5fZHRyZWVbZGNvZGVdLkZyZXEgKgorICAgICAgICAgICAgICAgICg1TCtleHRyYV9kYml0c1tkY29kZV0pOworICAgICAgICB9CisgICAgICAgIG91dF9sZW5ndGggPj49IDM7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCJcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSAiLAorICAgICAgICAgICAgICAgcy0+bGFzdF9saXQsIGluX2xlbmd0aCwgb3V0X2xlbmd0aCwKKyAgICAgICAgICAgICAgIDEwMEwgLSBvdXRfbGVuZ3RoKjEwMEwvaW5fbGVuZ3RoKSk7CisgICAgICAgIGlmIChzLT5tYXRjaGVzIDwgcy0+bGFzdF9saXQvMiAmJiBvdXRfbGVuZ3RoIDwgaW5fbGVuZ3RoLzIpIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7CisgICAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLCisgICAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG8KKyAgICAgKiA2NEstMSBieXRlcy4KKyAgICAgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIHRoZSBibG9jayBkYXRhIGNvbXByZXNzZWQgdXNpbmcgdGhlIGdpdmVuIEh1ZmZtYW4gdHJlZXMKKyAqLworbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovCisgICAgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi8KK3sKKyAgICB1bnNpZ25lZCBkaXN0OyAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovCisgICAgaW50IGxjOyAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi8KKyAgICB1bnNpZ25lZCBseCA9IDA7ICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KKyAgICB1bnNpZ25lZCBjb2RlOyAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi8KKyAgICBpbnQgZXh0cmE7ICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQgKi8KKworICAgIGlmIChzLT5sYXN0X2xpdCAhPSAwKSBkbyB7CisgICAgICAgIGRpc3QgPSBzLT5kX2J1ZltseF07CisgICAgICAgIGxjID0gcy0+bF9idWZbbHgrK107CisgICAgICAgIGlmIChkaXN0ID09IDApIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBsYywgbHRyZWUpOyAvKiBzZW5kIGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLCIgJyVjJyAiLCBsYykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLworICAgICAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107CisgICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZStMSVRFUkFMUysxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovCisgICAgICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdOworICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKKyAgICAgICAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTsKKyAgICAgICAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqLworICAgICAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTsKKyAgICAgICAgICAgIEFzc2VydCAoY29kZSA8IERfQ09ERVMsICJiYWQgZF9jb2RlIik7CisKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBjb2RlLCBkdHJlZSk7ICAgICAgIC8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07CisgICAgICAgICAgICBpZiAoZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdOworICAgICAgICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqLworICAgICAgICAgICAgfQorICAgICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovCisKKyAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgb3ZlcmxheSBiZXR3ZWVuIHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1ZiBpcyBvazogKi8KKyAgICAgICAgQXNzZXJ0KHMtPnBlbmRpbmcgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsICJwZW5kaW5nQnVmIG92ZXJmbG93Iik7CisKKyAgICB9IHdoaWxlIChseCA8IHMtPmxhc3RfbGl0KTsKKworICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTsKKyAgICBzLT5sYXN0X2VvYl9sZW4gPSBsdHJlZVtFTkRfQkxPQ0tdLkxlbjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgdGhlIGRhdGEgdHlwZSB0byBBU0NJSSBvciBCSU5BUlksIHVzaW5nIGEgY3J1ZGUgYXBwcm94aW1hdGlvbjoKKyAqIGJpbmFyeSBpZiBtb3JlIHRoYW4gMjAlIG9mIHRoZSBieXRlcyBhcmUgPD0gNiBvciA+PSAxMjgsIGFzY2lpIG90aGVyd2lzZS4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0IGFuZCB0aGUgdG90YWwgb2YgYWxsCisgKiBmcmVxdWVuY2llcyBkb2VzIG5vdCBleGNlZWQgNjRLICh0byBmaXQgaW4gYW4gaW50IG9uIDE2IGJpdCBtYWNoaW5lcykuCisgKi8KK2xvY2FsIHZvaWQgc2V0X2RhdGFfdHlwZShzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaW50IG4gPSAwOworICAgIHVuc2lnbmVkIGFzY2lpX2ZyZXEgPSAwOworICAgIHVuc2lnbmVkIGJpbl9mcmVxID0gMDsKKyAgICB3aGlsZSAobiA8IDcpICAgICAgICBiaW5fZnJlcSArPSBzLT5keW5fbHRyZWVbbisrXS5GcmVxOworICAgIHdoaWxlIChuIDwgMTI4KSAgICBhc2NpaV9mcmVxICs9IHMtPmR5bl9sdHJlZVtuKytdLkZyZXE7CisgICAgd2hpbGUgKG4gPCBMSVRFUkFMUykgYmluX2ZyZXEgKz0gcy0+ZHluX2x0cmVlW24rK10uRnJlcTsKKyAgICBzLT5kYXRhX3R5cGUgPSAoQnl0ZSkoYmluX2ZyZXEgPiAoYXNjaWlfZnJlcSA+PiAyKSA/IFpfQklOQVJZIDogWl9BU0NJSSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXIKKyAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSkKKyAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTUKKyAqLworbG9jYWwgdW5zaWduZWQgYmlfcmV2ZXJzZShjb2RlLCBsZW4pCisgICAgdW5zaWduZWQgY29kZTsgLyogdGhlIHZhbHVlIHRvIGludmVydCAqLworICAgIGludCBsZW47ICAgICAgIC8qIGl0cyBiaXQgbGVuZ3RoICovCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgcmVzID0gMDsKKyAgICBkbyB7CisgICAgICAgIHJlcyB8PSBjb2RlICYgMTsKKyAgICAgICAgY29kZSA+Pj0gMSwgcmVzIDw8PSAxOworICAgIH0gd2hpbGUgKC0tbGVuID4gMCk7CisgICAgcmV0dXJuIHJlcyA+PiAxOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyLCBrZWVwaW5nIGF0IG1vc3QgNyBiaXRzIGluIGl0LgorICovCitsb2NhbCB2b2lkIGJpX2ZsdXNoKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpZiAocy0+YmlfdmFsaWQgPT0gMTYpIHsKKyAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7CisgICAgICAgIHMtPmJpX2J1ZiA9IDA7CisgICAgICAgIHMtPmJpX3ZhbGlkID0gMDsKKyAgICB9IGVsc2UgaWYgKHMtPmJpX3ZhbGlkID49IDgpIHsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTsKKyAgICAgICAgcy0+YmlfYnVmID4+PSA4OworICAgICAgICBzLT5iaV92YWxpZCAtPSA4OworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnkKKyAqLworbG9jYWwgdm9pZCBiaV93aW5kdXAocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIGlmIChzLT5iaV92YWxpZCA+IDgpIHsKKyAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7CisgICAgfSBlbHNlIGlmIChzLT5iaV92YWxpZCA+IDApIHsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTsKKyAgICB9CisgICAgcy0+YmlfYnVmID0gMDsKKyAgICBzLT5iaV92YWxpZCA9IDA7CisjaWZkZWYgREVCVUcKKyAgICBzLT5iaXRzX3NlbnQgPSAocy0+Yml0c19zZW50KzcpICYgfjc7CisjZW5kaWYKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0cworICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuCisgKi8KK2xvY2FsIHZvaWQgY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY2hhcmYgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovCisgICAgaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovCit7CisgICAgYmlfd2luZHVwKHMpOyAgICAgICAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworICAgIHMtPmxhc3RfZW9iX2xlbiA9IDg7IC8qIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUgKi8KKworICAgIGlmIChoZWFkZXIpIHsKKyAgICAgICAgcHV0X3Nob3J0KHMsICh1c2gpbGVuKTsgICAKKyAgICAgICAgcHV0X3Nob3J0KHMsICh1c2gpfmxlbik7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcy0+Yml0c19zZW50ICs9IDIqMTY7CisjZW5kaWYKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBzLT5iaXRzX3NlbnQgKz0gKHVsZylsZW48PDM7CisjZW5kaWYKKyAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgcHV0X2J5dGUocywgKmJ1ZisrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi90cmVlcy5oIGIvY29tbW9uL3psaWIvdHJlZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmZhY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvdHJlZXMuaApAQCAtMCwwICsxLDEyOCBAQAorLyogaGVhZGVyIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aXRoIC1ER0VOX1RSRUVTX0ggKi8KKworbG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXSA9IHsKK3t7IDEyfSx7ICA4fX0sIHt7MTQwfSx7ICA4fX0sIHt7IDc2fSx7ICA4fX0sIHt7MjA0fSx7ICA4fX0sIHt7IDQ0fSx7ICA4fX0sCit7ezE3Mn0seyAgOH19LCB7ezEwOH0seyAgOH19LCB7ezIzNn0seyAgOH19LCB7eyAyOH0seyAgOH19LCB7ezE1Nn0seyAgOH19LAore3sgOTJ9LHsgIDh9fSwge3syMjB9LHsgIDh9fSwge3sgNjB9LHsgIDh9fSwge3sxODh9LHsgIDh9fSwge3sxMjR9LHsgIDh9fSwKK3t7MjUyfSx7ICA4fX0sIHt7ICAyfSx7ICA4fX0sIHt7MTMwfSx7ICA4fX0sIHt7IDY2fSx7ICA4fX0sIHt7MTk0fSx7ICA4fX0sCit7eyAzNH0seyAgOH19LCB7ezE2Mn0seyAgOH19LCB7eyA5OH0seyAgOH19LCB7ezIyNn0seyAgOH19LCB7eyAxOH0seyAgOH19LAore3sxNDZ9LHsgIDh9fSwge3sgODJ9LHsgIDh9fSwge3syMTB9LHsgIDh9fSwge3sgNTB9LHsgIDh9fSwge3sxNzh9LHsgIDh9fSwKK3t7MTE0fSx7ICA4fX0sIHt7MjQyfSx7ICA4fX0sIHt7IDEwfSx7ICA4fX0sIHt7MTM4fSx7ICA4fX0sIHt7IDc0fSx7ICA4fX0sCit7ezIwMn0seyAgOH19LCB7eyA0Mn0seyAgOH19LCB7ezE3MH0seyAgOH19LCB7ezEwNn0seyAgOH19LCB7ezIzNH0seyAgOH19LAore3sgMjZ9LHsgIDh9fSwge3sxNTR9LHsgIDh9fSwge3sgOTB9LHsgIDh9fSwge3syMTh9LHsgIDh9fSwge3sgNTh9LHsgIDh9fSwKK3t7MTg2fSx7ICA4fX0sIHt7MTIyfSx7ICA4fX0sIHt7MjUwfSx7ICA4fX0sIHt7ICA2fSx7ICA4fX0sIHt7MTM0fSx7ICA4fX0sCit7eyA3MH0seyAgOH19LCB7ezE5OH0seyAgOH19LCB7eyAzOH0seyAgOH19LCB7ezE2Nn0seyAgOH19LCB7ezEwMn0seyAgOH19LAore3syMzB9LHsgIDh9fSwge3sgMjJ9LHsgIDh9fSwge3sxNTB9LHsgIDh9fSwge3sgODZ9LHsgIDh9fSwge3syMTR9LHsgIDh9fSwKK3t7IDU0fSx7ICA4fX0sIHt7MTgyfSx7ICA4fX0sIHt7MTE4fSx7ICA4fX0sIHt7MjQ2fSx7ICA4fX0sIHt7IDE0fSx7ICA4fX0sCit7ezE0Mn0seyAgOH19LCB7eyA3OH0seyAgOH19LCB7ezIwNn0seyAgOH19LCB7eyA0Nn0seyAgOH19LCB7ezE3NH0seyAgOH19LAore3sxMTB9LHsgIDh9fSwge3syMzh9LHsgIDh9fSwge3sgMzB9LHsgIDh9fSwge3sxNTh9LHsgIDh9fSwge3sgOTR9LHsgIDh9fSwKK3t7MjIyfSx7ICA4fX0sIHt7IDYyfSx7ICA4fX0sIHt7MTkwfSx7ICA4fX0sIHt7MTI2fSx7ICA4fX0sIHt7MjU0fSx7ICA4fX0sCit7eyAgMX0seyAgOH19LCB7ezEyOX0seyAgOH19LCB7eyA2NX0seyAgOH19LCB7ezE5M30seyAgOH19LCB7eyAzM30seyAgOH19LAore3sxNjF9LHsgIDh9fSwge3sgOTd9LHsgIDh9fSwge3syMjV9LHsgIDh9fSwge3sgMTd9LHsgIDh9fSwge3sxNDV9LHsgIDh9fSwKK3t7IDgxfSx7ICA4fX0sIHt7MjA5fSx7ICA4fX0sIHt7IDQ5fSx7ICA4fX0sIHt7MTc3fSx7ICA4fX0sIHt7MTEzfSx7ICA4fX0sCit7ezI0MX0seyAgOH19LCB7eyAgOX0seyAgOH19LCB7ezEzN30seyAgOH19LCB7eyA3M30seyAgOH19LCB7ezIwMX0seyAgOH19LAore3sgNDF9LHsgIDh9fSwge3sxNjl9LHsgIDh9fSwge3sxMDV9LHsgIDh9fSwge3syMzN9LHsgIDh9fSwge3sgMjV9LHsgIDh9fSwKK3t7MTUzfSx7ICA4fX0sIHt7IDg5fSx7ICA4fX0sIHt7MjE3fSx7ICA4fX0sIHt7IDU3fSx7ICA4fX0sIHt7MTg1fSx7ICA4fX0sCit7ezEyMX0seyAgOH19LCB7ezI0OX0seyAgOH19LCB7eyAgNX0seyAgOH19LCB7ezEzM30seyAgOH19LCB7eyA2OX0seyAgOH19LAore3sxOTd9LHsgIDh9fSwge3sgMzd9LHsgIDh9fSwge3sxNjV9LHsgIDh9fSwge3sxMDF9LHsgIDh9fSwge3syMjl9LHsgIDh9fSwKK3t7IDIxfSx7ICA4fX0sIHt7MTQ5fSx7ICA4fX0sIHt7IDg1fSx7ICA4fX0sIHt7MjEzfSx7ICA4fX0sIHt7IDUzfSx7ICA4fX0sCit7ezE4MX0seyAgOH19LCB7ezExN30seyAgOH19LCB7ezI0NX0seyAgOH19LCB7eyAxM30seyAgOH19LCB7ezE0MX0seyAgOH19LAore3sgNzd9LHsgIDh9fSwge3syMDV9LHsgIDh9fSwge3sgNDV9LHsgIDh9fSwge3sxNzN9LHsgIDh9fSwge3sxMDl9LHsgIDh9fSwKK3t7MjM3fSx7ICA4fX0sIHt7IDI5fSx7ICA4fX0sIHt7MTU3fSx7ICA4fX0sIHt7IDkzfSx7ICA4fX0sIHt7MjIxfSx7ICA4fX0sCit7eyA2MX0seyAgOH19LCB7ezE4OX0seyAgOH19LCB7ezEyNX0seyAgOH19LCB7ezI1M30seyAgOH19LCB7eyAxOX0seyAgOX19LAore3syNzV9LHsgIDl9fSwge3sxNDd9LHsgIDl9fSwge3s0MDN9LHsgIDl9fSwge3sgODN9LHsgIDl9fSwge3szMzl9LHsgIDl9fSwKK3t7MjExfSx7ICA5fX0sIHt7NDY3fSx7ICA5fX0sIHt7IDUxfSx7ICA5fX0sIHt7MzA3fSx7ICA5fX0sIHt7MTc5fSx7ICA5fX0sCit7ezQzNX0seyAgOX19LCB7ezExNX0seyAgOX19LCB7ezM3MX0seyAgOX19LCB7ezI0M30seyAgOX19LCB7ezQ5OX0seyAgOX19LAore3sgMTF9LHsgIDl9fSwge3syNjd9LHsgIDl9fSwge3sxMzl9LHsgIDl9fSwge3szOTV9LHsgIDl9fSwge3sgNzV9LHsgIDl9fSwKK3t7MzMxfSx7ICA5fX0sIHt7MjAzfSx7ICA5fX0sIHt7NDU5fSx7ICA5fX0sIHt7IDQzfSx7ICA5fX0sIHt7Mjk5fSx7ICA5fX0sCit7ezE3MX0seyAgOX19LCB7ezQyN30seyAgOX19LCB7ezEwN30seyAgOX19LCB7ezM2M30seyAgOX19LCB7ezIzNX0seyAgOX19LAore3s0OTF9LHsgIDl9fSwge3sgMjd9LHsgIDl9fSwge3syODN9LHsgIDl9fSwge3sxNTV9LHsgIDl9fSwge3s0MTF9LHsgIDl9fSwKK3t7IDkxfSx7ICA5fX0sIHt7MzQ3fSx7ICA5fX0sIHt7MjE5fSx7ICA5fX0sIHt7NDc1fSx7ICA5fX0sIHt7IDU5fSx7ICA5fX0sCit7ezMxNX0seyAgOX19LCB7ezE4N30seyAgOX19LCB7ezQ0M30seyAgOX19LCB7ezEyM30seyAgOX19LCB7ezM3OX0seyAgOX19LAore3syNTF9LHsgIDl9fSwge3s1MDd9LHsgIDl9fSwge3sgIDd9LHsgIDl9fSwge3syNjN9LHsgIDl9fSwge3sxMzV9LHsgIDl9fSwKK3t7MzkxfSx7ICA5fX0sIHt7IDcxfSx7ICA5fX0sIHt7MzI3fSx7ICA5fX0sIHt7MTk5fSx7ICA5fX0sIHt7NDU1fSx7ICA5fX0sCit7eyAzOX0seyAgOX19LCB7ezI5NX0seyAgOX19LCB7ezE2N30seyAgOX19LCB7ezQyM30seyAgOX19LCB7ezEwM30seyAgOX19LAore3szNTl9LHsgIDl9fSwge3syMzF9LHsgIDl9fSwge3s0ODd9LHsgIDl9fSwge3sgMjN9LHsgIDl9fSwge3syNzl9LHsgIDl9fSwKK3t7MTUxfSx7ICA5fX0sIHt7NDA3fSx7ICA5fX0sIHt7IDg3fSx7ICA5fX0sIHt7MzQzfSx7ICA5fX0sIHt7MjE1fSx7ICA5fX0sCit7ezQ3MX0seyAgOX19LCB7eyA1NX0seyAgOX19LCB7ezMxMX0seyAgOX19LCB7ezE4M30seyAgOX19LCB7ezQzOX0seyAgOX19LAore3sxMTl9LHsgIDl9fSwge3szNzV9LHsgIDl9fSwge3syNDd9LHsgIDl9fSwge3s1MDN9LHsgIDl9fSwge3sgMTV9LHsgIDl9fSwKK3t7MjcxfSx7ICA5fX0sIHt7MTQzfSx7ICA5fX0sIHt7Mzk5fSx7ICA5fX0sIHt7IDc5fSx7ICA5fX0sIHt7MzM1fSx7ICA5fX0sCit7ezIwN30seyAgOX19LCB7ezQ2M30seyAgOX19LCB7eyA0N30seyAgOX19LCB7ezMwM30seyAgOX19LCB7ezE3NX0seyAgOX19LAore3s0MzF9LHsgIDl9fSwge3sxMTF9LHsgIDl9fSwge3szNjd9LHsgIDl9fSwge3syMzl9LHsgIDl9fSwge3s0OTV9LHsgIDl9fSwKK3t7IDMxfSx7ICA5fX0sIHt7Mjg3fSx7ICA5fX0sIHt7MTU5fSx7ICA5fX0sIHt7NDE1fSx7ICA5fX0sIHt7IDk1fSx7ICA5fX0sCit7ezM1MX0seyAgOX19LCB7ezIyM30seyAgOX19LCB7ezQ3OX0seyAgOX19LCB7eyA2M30seyAgOX19LCB7ezMxOX0seyAgOX19LAore3sxOTF9LHsgIDl9fSwge3s0NDd9LHsgIDl9fSwge3sxMjd9LHsgIDl9fSwge3szODN9LHsgIDl9fSwge3syNTV9LHsgIDl9fSwKK3t7NTExfSx7ICA5fX0sIHt7ICAwfSx7ICA3fX0sIHt7IDY0fSx7ICA3fX0sIHt7IDMyfSx7ICA3fX0sIHt7IDk2fSx7ICA3fX0sCit7eyAxNn0seyAgN319LCB7eyA4MH0seyAgN319LCB7eyA0OH0seyAgN319LCB7ezExMn0seyAgN319LCB7eyAgOH0seyAgN319LAore3sgNzJ9LHsgIDd9fSwge3sgNDB9LHsgIDd9fSwge3sxMDR9LHsgIDd9fSwge3sgMjR9LHsgIDd9fSwge3sgODh9LHsgIDd9fSwKK3t7IDU2fSx7ICA3fX0sIHt7MTIwfSx7ICA3fX0sIHt7ICA0fSx7ICA3fX0sIHt7IDY4fSx7ICA3fX0sIHt7IDM2fSx7ICA3fX0sCit7ezEwMH0seyAgN319LCB7eyAyMH0seyAgN319LCB7eyA4NH0seyAgN319LCB7eyA1Mn0seyAgN319LCB7ezExNn0seyAgN319LAore3sgIDN9LHsgIDh9fSwge3sxMzF9LHsgIDh9fSwge3sgNjd9LHsgIDh9fSwge3sxOTV9LHsgIDh9fSwge3sgMzV9LHsgIDh9fSwKK3t7MTYzfSx7ICA4fX0sIHt7IDk5fSx7ICA4fX0sIHt7MjI3fSx7ICA4fX0KK307CisKK2xvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdID0gewore3sgMH0seyA1fX0sIHt7MTZ9LHsgNX19LCB7eyA4fSx7IDV9fSwge3syNH0seyA1fX0sIHt7IDR9LHsgNX19LAore3syMH0seyA1fX0sIHt7MTJ9LHsgNX19LCB7ezI4fSx7IDV9fSwge3sgMn0seyA1fX0sIHt7MTh9LHsgNX19LAore3sxMH0seyA1fX0sIHt7MjZ9LHsgNX19LCB7eyA2fSx7IDV9fSwge3syMn0seyA1fX0sIHt7MTR9LHsgNX19LAore3szMH0seyA1fX0sIHt7IDF9LHsgNX19LCB7ezE3fSx7IDV9fSwge3sgOX0seyA1fX0sIHt7MjV9LHsgNX19LAore3sgNX0seyA1fX0sIHt7MjF9LHsgNX19LCB7ezEzfSx7IDV9fSwge3syOX0seyA1fX0sIHt7IDN9LHsgNX19LAore3sxOX0seyA1fX0sIHt7MTF9LHsgNX19LCB7ezI3fSx7IDV9fSwge3sgN30seyA1fX0sIHt7MjN9LHsgNX19Cit9OworCitjb25zdCB1Y2ggX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXSA9IHsKKyAwLCAgMSwgIDIsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwKKyA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKzEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKzExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKzEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywKKzEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKzEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKzE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKzE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKzE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKzE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKzE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKzE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAgMCwgIDAsIDE2LCAxNywKKzE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwKKzIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKKzI0LCAyNCwgMjQsIDI0LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwKKzI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKKzI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKKzI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKKzI3LCAyNywgMjcsIDI3LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKKzI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKKzI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKKzI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKKzI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKKzI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKKzI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjkKK307CisKK2NvbnN0IHVjaCBfbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXT0geworIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLAorMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LAorMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLAorMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLAorMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLAorMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LAorMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LAorMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LAorMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LAorMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LAorMjYsIDI2LCAyNiwgMjYsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LAorMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjgKK307CisKK2xvY2FsIGNvbnN0IGludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdID0geworMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgMTAsIDEyLCAxNCwgMTYsIDIwLCAyNCwgMjgsIDMyLCA0MCwgNDgsIDU2LAorNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDAKK307CisKK2xvY2FsIGNvbnN0IGludCBiYXNlX2Rpc3RbRF9DT0RFU10gPSB7CisgICAgMCwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA2LCAgICAgOCwgICAgMTIsICAgIDE2LCAgICAyNCwKKyAgIDMyLCAgICA0OCwgICAgNjQsICAgIDk2LCAgIDEyOCwgICAxOTIsICAgMjU2LCAgIDM4NCwgICA1MTIsICAgNzY4LAorIDEwMjQsICAxNTM2LCAgMjA0OCwgIDMwNzIsICA0MDk2LCAgNjE0NCwgIDgxOTIsIDEyMjg4LCAxNjM4NCwgMjQ1NzYKK307CisKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL3VuY29tcHIuYyBiL2NvbW1vbi96bGliL3VuY29tcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGE0YTY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvdW5jb21wci5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIHVuY29tcHIuYyAtLSBkZWNvbXByZXNzIGEgbWVtb3J5IGJ1ZmZlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogQCgjKSAkSWQ6IHVuY29tcHIuYyx2IDEuMSAyMDA0LzEwLzA4IDA5OjQ0OjI2IGNvbnN0X2sgRXhwICQgKi8KKworI2luY2x1ZGUgInpsaWIuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKKyAgIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUKKyAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgorICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKKyAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgorICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCisgICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCisKKyAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkLgorKi8KK2ludCBaRVhQT1JUIHVuY29tcHJlc3MgKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuKQorICAgIEJ5dGVmICpkZXN0OworICAgIHVMb25nZiAqZGVzdExlbjsKKyAgICBjb25zdCBCeXRlZiAqc291cmNlOworICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgaW50IGVycjsKKworICAgIHN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilzb3VyY2U7CisgICAgc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpc291cmNlTGVuOworICAgIC8qIENoZWNrIGZvciBzb3VyY2UgPiA2NEsgb24gMTYtYml0IG1hY2hpbmU6ICovCisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfaW4gIT0gc291cmNlTGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0ubmV4dF9vdXQgPSBkZXN0OworICAgIHN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkqZGVzdExlbjsKKyAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9vdXQgIT0gKmRlc3RMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKKworICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKworICAgIGVyciA9IGluZmxhdGVJbml0KCZzdHJlYW0pOworICAgIGlmIChlcnIgIT0gWl9PSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGluZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICAgIHJldHVybiBlcnIgPT0gWl9PSyA/IFpfQlVGX0VSUk9SIDogZXJyOworICAgIH0KKyAgICAqZGVzdExlbiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZzdHJlYW0pOworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi96Y29uZi5oIGIvY29tbW9uL3psaWIvemNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQ2Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvemNvbmYuaApAQCAtMCwwICsxLDI3OSBAQAorLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKy8qIEAoIykgJElkOiB6Y29uZi5oLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjYgY29uc3RfayBFeHAgJCAqLworCisjaWZuZGVmIF9aQ09ORl9ICisjZGVmaW5lIF9aQ09ORl9ICisKKy8qCisgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCisgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqLworI2lmZGVmIFpfUFJFRklYCisjICBkZWZpbmUgZGVmbGF0ZUluaXRfCXpfZGVmbGF0ZUluaXRfCisjICBkZWZpbmUgZGVmbGF0ZQl6X2RlZmxhdGUKKyMgIGRlZmluZSBkZWZsYXRlRW5kCXpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGluZmxhdGVJbml0XyAJel9pbmZsYXRlSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlCXpfaW5mbGF0ZQorIyAgZGVmaW5lIGluZmxhdGVFbmQJel9pbmZsYXRlRW5kCisjICBkZWZpbmUgZGVmbGF0ZUluaXQyXwl6X2RlZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgZGVmbGF0ZUNvcHkJel9kZWZsYXRlQ29weQorIyAgZGVmaW5lIGRlZmxhdGVSZXNldAl6X2RlZmxhdGVSZXNldAorIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMJel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXwl6X2luZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMJel9pbmZsYXRlU3luYworIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0CXpfaW5mbGF0ZVJlc2V0CisjICBkZWZpbmUgY29tcHJlc3MJel9jb21wcmVzcworIyAgZGVmaW5lIGNvbXByZXNzMgl6X2NvbXByZXNzMgorIyAgZGVmaW5lIHVuY29tcHJlc3MJel91bmNvbXByZXNzCisjICBkZWZpbmUgYWRsZXIzMgl6X2FkbGVyMzIKKyMgIGRlZmluZSBjcmMzMgkJel9jcmMzMgorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgel9nZXRfY3JjX3RhYmxlCisKKyMgIGRlZmluZSBCeXRlCQl6X0J5dGUKKyMgIGRlZmluZSB1SW50CQl6X3VJbnQKKyMgIGRlZmluZSB1TG9uZwkJel91TG9uZworIyAgZGVmaW5lIEJ5dGVmCSAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGNoYXJmCQl6X2NoYXJmCisjICBkZWZpbmUgaW50ZgkJel9pbnRmCisjICBkZWZpbmUgdUludGYJCXpfdUludGYKKyMgIGRlZmluZSB1TG9uZ2YJel91TG9uZ2YKKyMgIGRlZmluZSB2b2lkcGYJel92b2lkcGYKKyMgIGRlZmluZSB2b2lkcAkJel92b2lkcAorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSkgJiYgIWRlZmluZWQoV0lOMzIpCisjICBkZWZpbmUgV0lOMzIKKyNlbmRpZgorI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX18zODZfXykgfHwgZGVmaW5lZChpMzg2KQorIyAgaWZuZGVmIF9fMzJCSVRfXworIyAgICBkZWZpbmUgX18zMkJJVF9fCisjICBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQorIyAgZGVmaW5lIE1TRE9TCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZiBkZWZpbmVkKE1TRE9TKSAmJiAhZGVmaW5lZChfXzMyQklUX18pCisjICBkZWZpbmUgTUFYU0VHXzY0SworI2VuZGlmCisjaWZkZWYgTVNET1MKKyMgIGRlZmluZSBVTkFMSUdORURfT0sKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKSAgJiYgIWRlZmluZWQoU1REQykKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fT1MyX18pCisjICBpZm5kZWYgU1REQworIyAgICBkZWZpbmUgU1REQworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0CisjICBlbmRpZgorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKSB8fCBkZWZpbmVkKGFwcGxlYykgfHxkZWZpbmVkKFRISU5LX0MpIHx8ZGVmaW5lZChfX1NDX18pCisjICBkZWZpbmUgTk9fRFVNTVlfREVDTAorI2VuZGlmCisKKy8qIE9sZCBCb3JsYW5kIEMgaW5jb3JyZWN0bHkgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcmV0dXJuczogKi8KKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA8IDB4NTAwKQorIyAgZGVmaW5lIE5FRURfRFVNTVlfUkVUVVJOCisjZW5kaWYKKworCisvKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi8KKyNpZm5kZWYgTUFYX01FTV9MRVZFTAorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA4CisjICBlbHNlCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3Igd2luZG93Qml0cyBpbiBkZWZsYXRlSW5pdDIgYW5kIGluZmxhdGVJbml0Mi4KKyAqIFdBUk5JTkc6IHJlZHVjaW5nIE1BWF9XQklUUyBtYWtlcyBtaW5pZ3ppcCB1bmFibGUgdG8gZXh0cmFjdCAuZ3ogZmlsZXMKKyAqIGNyZWF0ZWQgYnkgZ3ppcC4gKEZpbGVzIGNyZWF0ZWQgYnkgbWluaWd6aXAgY2FuIHN0aWxsIGJlIGV4dHJhY3RlZCBieQorICogZ3ppcC4pCisgKi8KKyNpZm5kZWYgTUFYX1dCSVRTCisjICBkZWZpbmUgTUFYX1dCSVRTICAgMTUgLyogMzJLIExaNzcgd2luZG93ICovCisjZW5kaWYKKworLyogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6CisgICAgICAgICAgICAoMSA8PCAod2luZG93Qml0cysyKSkgKyAgKDEgPDwgKG1lbUxldmVsKzkpKQorIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHM9MTUgICsgIDEyOEsgZm9yIG1lbUxldmVsID0gOCAgKGRlZmF1bHQgdmFsdWVzKQorIHBsdXMgYSBmZXcga2lsb2J5dGVzIGZvciBzbWFsbCBvYmplY3RzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gcmVkdWNlCisgdGhlIGRlZmF1bHQgbWVtb3J5IHJlcXVpcmVtZW50cyBmcm9tIDI1NksgdG8gMTI4SywgY29tcGlsZSB3aXRoCisgICAgIG1ha2UgQ0ZMQUdTPSItTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NyIKKyBPZiBjb3Vyc2UgdGhpcyB3aWxsIGdlbmVyYWxseSBkZWdyYWRlIGNvbXByZXNzaW9uICh0aGVyZSdzIG5vIGZyZWUgbHVuY2gpLgorCisgICBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgaW5mbGF0ZSBhcmUgKGluIGJ5dGVzKSAxIDw8IHdpbmRvd0JpdHMKKyB0aGF0IGlzLCAzMksgZm9yIHdpbmRvd0JpdHM9MTUgKGRlZmF1bHQgdmFsdWUpIHBsdXMgYSBmZXcga2lsb2J5dGVzCisgZm9yIHNtYWxsIG9iamVjdHMuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIE9GIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyMgIGlmZGVmIFNUREMKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBPRihhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKKyAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCisgKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKKyAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKKyAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KKyAqLworI2lmIChkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkpICYmICFkZWZpbmVkKF9fMzJCSVRfXykKKyAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgIGlmZGVmIF9NU0NfVkVSCisjICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgZWxzZQorIyAgICBkZWZpbmUgRkFSIGZhcgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisjICBpZm5kZWYgX18zMkJJVF9fCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgZGVmaW5lIEZBUiBfZmFyCisjICBlbmRpZgorI2VuZGlmCisKKy8qIENvbXBpbGUgd2l0aCAtRFpMSUJfRExMIGZvciBXaW5kb3dzIERMTCBzdXBwb3J0ICovCisjaWYgZGVmaW5lZChaTElCX0RMTCkKKyMgIGlmIGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoV0lORE9XUykKKyMgICAgaWZkZWYgRkFSCisjICAgICAgdW5kZWYgRkFSCisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgICAgZGVmaW5lIFpFWFBPUlQgIFdJTkFQSQorIyAgICBpZmRlZiBXSU4zMgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgIEZBUiBfY2RlY2wgX2V4cG9ydAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgICAgaWYgKF9fQk9STEFORENfXyA+PSAweDA1MDApICYmIGRlZmluZWQgKFdJTjMyKQorIyAgICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgICAgICBkZWZpbmUgWkVYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgV0lOQVBJCisjICAgICAgZGVmaW5lIFpFWFBPUlRSVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGlmIGRlZmluZWQgKF9XaW5kb3dzKSAmJiBkZWZpbmVkIChfX0RMTF9fKQorIyAgICAgICAgZGVmaW5lIFpFWFBPUlQgX2V4cG9ydAorIyAgICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfZXhwb3J0CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQkVPU19fKQorIyAgaWYgZGVmaW5lZCAoWkxJQl9ETEwpCisjICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFpFWFBPUlQKKyMgIGRlZmluZSBaRVhQT1JUCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVFZBCisjICBkZWZpbmUgWkVYUE9SVFZBCisjZW5kaWYKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKworI2lmbmRlZiBGQVIKKyMgICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKE1BQ09TKSAmJiAhZGVmaW5lZChUQVJHRVRfT1NfTUFDKQordHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOyAgLyogOCBiaXRzICovCisjZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgdUludDsgIC8qIDE2IGJpdHMgb3IgbW9yZSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB1TG9uZzsgLyogMzIgYml0cyBvciBtb3JlICovCisKKyNpZmRlZiBTTUFMTF9NRURJVU0KKyAgIC8qIEJvcmxhbmQgQy9DKysgYW5kIHNvbWUgb2xkIE1TQyB2ZXJzaW9ucyBpZ25vcmUgRkFSIGluc2lkZSB0eXBlZGVmICovCisjICBkZWZpbmUgQnl0ZWYgQnl0ZSBGQVIKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgIEZBUiBCeXRlZjsKKyNlbmRpZgordHlwZWRlZiBjaGFyICBGQVIgY2hhcmY7Cit0eXBlZGVmIGludCAgIEZBUiBpbnRmOwordHlwZWRlZiB1SW50ICBGQVIgdUludGY7Cit0eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7CisKKyNpZmRlZiBTVERDCisgICB0eXBlZGVmIHZvaWQgRkFSICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICp2b2lkcDsKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgRkFSICp2b2lkcGY7CisgICB0eXBlZGVmIEJ5dGUgICAgICp2b2lkcDsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBvZmZfdCAqLworIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgIC8qIGZvciBTRUVLXyogYW5kIG9mZl90ICovCisjICBkZWZpbmUgel9vZmZfdCAgb2ZmX3QKKyNlbmRpZgorI2lmbmRlZiBTRUVLX1NFVAorIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KKyNlbmRpZgorI2lmbmRlZiB6X29mZl90CisjICBkZWZpbmUgIHpfb2ZmX3QgbG9uZworI2VuZGlmCisKKy8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCisjaWYgZGVmaW5lZChfX01WU19fKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdDJfLCJJTklOMiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlRW5kLCJJTkVORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlU2V0RGljdGlvbmFyeSwiSU5TRURJIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfYmxvY2tzLCJJTkJMIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfYmxvY2tzX25ldywiSU5CTE5FIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfYmxvY2tzX2ZyZWUsIklOQkxGUiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2Jsb2Nrc19yZXNldCwiSU5CTFJFIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29kZXNfZnJlZSwiSU5DT0ZSIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29kZXMsIklOQ08iKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfZmx1c2gsIklORkxVIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfbWFzaywiSU5NQSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3NldF9kaWN0aW9uYXJ5LCJJTlNFREkyIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90cmVlc19iaXRzLCJJTlRSQkkiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90cmVlc19keW5hbWljLCJJTlRSRFkiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90cmVlc19maXhlZCwiSU5UUkZJIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfdHJlZXNfZnJlZSwiSU5UUkZSIikKKyNlbmRpZgorCisjZW5kaWYgLyogX1pDT05GX0ggKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL3psaWIuMyBiL2NvbW1vbi96bGliL3psaWIuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZlNDUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvemxpYi4zCkBAIC0wLDAgKzEsMTA3IEBACisuVEggWkxJQiAzICIxMSBNYXJjaCAyMDAyIgorLlNIIE5BTUUKK3psaWIgXC0gY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBsaWJyYXJ5CisuU0ggU1lOT1BTSVMKK1tzZWUKKy5JIHpsaWIuaAorZm9yIGZ1bGwgZGVzY3JpcHRpb25dCisuU0ggREVTQ1JJUFRJT04KK1RoZQorLkkgemxpYgorbGlicmFyeSBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCitUaGUgY29kZSBpcyB0aHJlYWQgc2FmZS4KK0l0IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsCitpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCitUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kIChkZWZsYXRpb24pCitidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUgc3RyZWFtIGludGVyZmFjZS4KKy5MUAorQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UgZW5vdWdoCisoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwKK29yIGNhbiBiZSBkb25lIGJ5IHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4KK0luIHRoZSBsYXR0ZXIgY2FzZSwKK3RoZSBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CisocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgorLkxQCitUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4KKy5JIGd6aXAKKyguZ3opIGZvcm1hdAord2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLgorLkxQCitUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gVGhlIGRlY29kZXIgY2hlY2tzCit0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyCitjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgorLkxQCitBbGwgZnVuY3Rpb25zIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlCisuSVIgemxpYi5oLgorVGhlIGRpc3RyaWJ1dGlvbiBzb3VyY2UgaW5jbHVkZXMgZXhhbXBsZXMgb2YgdXNlIG9mIHRoZSBsaWJyYXJ5Cit0aGUgZmlsZXMKKy5JIGV4YW1wbGUuYworYW5kCisuSVIgbWluaWd6aXAuYyAuCisuTFAKK0EgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZgorLklSIHpsaWIKK2lzIGF2YWlsYWJsZSBpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQgMS4xCisuSVAKK2h0dHA6Ly93d3cuamF2YXNvZnQuY29tL3Byb2R1Y3RzL0pESy8xLjEvZG9jcy9hcGkvUGFja2FnZS1qYXZhLnV0aWwuemlwLmh0bWwKKy5MUAorQSBQZXJsIGludGVyZmFjZSB0bworLklSIHpsaWIgLAord3JpdHRlbiBieSBQYXVsIE1hcnF1ZXNzIChwbWFycXVlc3NAYmZzZWMuYnQuY28udWspCitpcyBhdmFpbGFibGUgYXQgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMsCitzdWNoIGFzOgorLklQCitmdHA6Ly9mdHAuY2lzLnVmbC5lZHUvcHViL3BlcmwvQ1BBTi9tb2R1bGVzL2J5LW1vZHVsZS9Db21wcmVzcy9Db21wcmVzcy1abGliKgorLkxQCitBIFB5dGhvbiBpbnRlcmZhY2UgdG8KKy5JUiB6bGliCit3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcgPGFta0BtYWduZXQuY29tPgoraXMgYXZhaWxhYmxlIGZyb20gdGhlIFB5dGhvbiBTb2Z0d2FyZSBBc3NvY2lhdGlvbiBzaXRlcywgc3VjaCBhczoKKy5JUAorZnRwOi8vZnRwLnB5dGhvbi5vcmcvcHViL3B5dGhvbi9jb250cmliL0VuY29kaW5nL3psaWIqLnRhci5negorLlNIICJTRUUgQUxTTyIKK1F1ZXN0aW9ucyBhYm91dCB6bGliIHNob3VsZCBiZSBzZW50IHRvOgorLklQCit6bGliQHF1ZXN0LmpwbC5uYXNhLmdvdgorb3IsIGlmIHRoaXMgZmFpbHMsIHRvIHRoZSBhdXRob3IgYWRkcmVzc2VzIGdpdmVuIGJlbG93LgorVGhlIHpsaWIgaG9tZSBwYWdlIGlzOgorLklQCitodHRwOi8vd3d3LmNkcm9tLmNvbS9wdWIvaW5mb3ppcC96bGliLworLkxQCitUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkMKKyhSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlczogCisuSVAKK2Z0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MC50eHQgKHpsaWIgZm9ybWF0KQorLmJyCityZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpCisuYnIKK3JmYzE5NTIudHh0IChnemlwIGZvcm1hdCkKKy5MUAorVGhlc2UgZG9jdW1lbnRzIGFyZSBhbHNvIGF2YWlsYWJsZSBpbiBvdGhlciBmb3JtYXRzIGZyb206CisuSVAKK2Z0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvcG5nL2RvY3VtZW50cy96bGliL3pkb2MtaW5kZXguaHRtbAorLlNIIEFVVEhPUlMKK1ZlcnNpb24gMS4xLjQKK0NvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkgKGpsb3VwQGd6aXAub3JnKQorYW5kIE1hcmsgQWRsZXIgKG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUpLgorLkxQCitUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcy1pcywiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCitJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KK1NlZSB0aGUgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gcmVxdWlyZW1lbnRzCitnb3Zlcm5pbmcgcmVkaXN0cmlidXRpb24uCitUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieQorLkkgemxpYgord2FzIGRlZmluZWQgYnkgUGhpbCBLYXR6LgorVGhlIGRlZmxhdGUgYW5kCisuSSB6bGliCitzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gUGV0ZXIgRGV1dHNjaC4KK1RoYW5rcyB0byBhbGwgdGhlIHBlb3BsZSB3aG8gcmVwb3J0ZWQgcHJvYmxlbXMgYW5kIHN1Z2dlc3RlZCB2YXJpb3VzCitpbXByb3ZlbWVudHMgaW4KKy5JUiB6bGliIDsKK3dobyBhcmUgdG9vIG51bWVyb3VzIHRvIGNpdGUgaGVyZS4KKy5MUAorVU5JWCBtYW51YWwgcGFnZSBieSBSLiBQLiBDLiBSb2RnZXJzLAorVS5TLiBOYXRpb25hbCBMaWJyYXJ5IG9mIE1lZGljaW5lIChyb2RnZXJzQG5sbS5uaWguZ292KS4KKy5cIiBlbmQgb2YgbWFuIHBhZ2UKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL3psaWIuZHNwIGIvY29tbW9uL3psaWIvemxpYi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlNTg1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL3psaWIuZHNwCkBAIC0wLDAgKzEsMjE3IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InpsaWIiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQNCisNCitDRkc9emxpYiAtIFdpbjMyIERlYnVnIFVuaWNvZGUNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInpsaWIubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInpsaWIubWFrIiBDRkc9InpsaWIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJ6bGliIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQorIU1FU1NBR0UgInpsaWIgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQorIU1FU1NBR0UgInpsaWIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxSZWxlYXNlXHpsaWIiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMSAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiLi5cRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXERlYnVnXHpsaWIiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiX0RFQlVHIiAvRCAiX0xJQiIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSUIzMj1saW5rLmV4ZSAtbGliDQorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvDQorIyBBREQgTElCMzIgL25vbG9nbw0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgRGVidWcgVW5pY29kZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJ6bGliX19fV2luMzJfRGVidWdfVW5pY29kZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ6bGliX19fV2luMzJfRGVidWdfVW5pY29kZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiLi5cRGVidWdfVW5pY29kZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cRGVidWdfVW5pY29kZVx6bGliIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiX0xJQiIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1VOSUNPREUiIC9EICJVTklDT0RFIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgInpsaWIgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiemxpYiAtIFdpbjMyIERlYnVnIg0KKyMgTmFtZSAiemxpYiAtIFdpbjMyIERlYnVnIFVuaWNvZGUiDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYWRsZXIzMi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cY29tcHJlc3MuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGNyYzMyLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxkZWZsYXRlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxnemlvLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbmZibG9jay5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caW5mY29kZXMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGluZmZhc3QuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGluZmxhdGUuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGluZnRyZWVzLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbmZ1dGlsLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx0cmVlcy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdW5jb21wci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cenV0aWwuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxkZWZsYXRlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbmZibG9jay5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caW5mY29kZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGluZmZhc3QuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGluZmZpeGVkLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbmZ0cmVlcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caW5mdXRpbC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdHJlZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHpjb25mLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx6bGliLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx6dXRpbC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi96bGliLmggYi9jb21tb24vemxpYi96bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjYjUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL3psaWIuaApAQCAtMCwwICsxLDg5MyBAQAorLyogemxpYi5oIC0tIGludGVyZmFjZSBvZiB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgIHZlcnNpb24gMS4xLjQsIE1hcmNoIDExdGgsIDIwMDIKKworICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKKyAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCisKKyAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDcyAoUmVxdWVzdCBmb3IKKyAgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMgZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMxOTUwLnR4dAorICAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpIGFuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLgorKi8KKworI2lmbmRlZiBfWkxJQl9ICisjZGVmaW5lIF9aTElCX0gKKworI2luY2x1ZGUgInpjb25mLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBaTElCX1ZFUlNJT04gIjEuMS40IgorCisvKiAKKyAgICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKKyAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAgZGF0YS4gIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QKKyAgKGRlZmxhdGlvbikgYnV0IG90aGVyIGFsZ29yaXRobXMgd2lsbCBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lCisgIHN0cmVhbSBpbnRlcmZhY2UuCisKKyAgICAgQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UKKyAgZW5vdWdoIChmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLCBvciBjYW4gYmUgZG9uZSBieQorICByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQorICBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CisgIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisKKyAgICAgVGhlIGxpYnJhcnkgYWxzbyBzdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzIGluIGd6aXAgKC5neikgZm9ybWF0CisgIHdpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpby4KKworICAgICBUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gVGhlIGRlY29kZXIgY2hlY2tzCisgIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIKKyAgY3Jhc2ggZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KKyovCisKK3R5cGVkZWYgdm9pZHBmICgqYWxsb2NfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkpOwordHlwZWRlZiB2b2lkICAgKCpmcmVlX2Z1bmMpICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIGFkZHJlc3MpKTsKKworc3RydWN0IGludGVybmFsX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB6X3N0cmVhbV9zIHsKKyAgICBCeXRlZiAgICAqbmV4dF9pbjsgIC8qIG5leHQgaW5wdXQgYnl0ZSAqLworICAgIHVJbnQgICAgIGF2YWlsX2luOyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luICovCisgICAgdUxvbmcgICAgdG90YWxfaW47ICAvKiB0b3RhbCBuYiBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqLworCisgICAgQnl0ZWYgICAgKm5leHRfb3V0OyAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi8KKyAgICB1SW50ICAgICBhdmFpbF9vdXQ7IC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0ICovCisgICAgdUxvbmcgICAgdG90YWxfb3V0OyAvKiB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovCisKKyAgICBjaGFyICAgICAqbXNnOyAgICAgIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqLworICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKnN0YXRlOyAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KKworICAgIGFsbG9jX2Z1bmMgemFsbG9jOyAgLyogdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICBmcmVlX2Z1bmMgIHpmcmVlOyAgIC8qIHVzZWQgdG8gZnJlZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICB2b2lkcGYgICAgIG9wYXF1ZTsgIC8qIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUgKi8KKworICAgIGludCAgICAgZGF0YV90eXBlOyAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBhc2NpaSBvciBiaW5hcnkgKi8KKyAgICB1TG9uZyAgIGFkbGVyOyAgICAgIC8qIGFkbGVyMzIgdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgdUxvbmcgICByZXNlcnZlZDsgICAvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworfSB6X3N0cmVhbTsKKwordHlwZWRlZiB6X3N0cmVhbSBGQVIgKnpfc3RyZWFtcDsKKworLyoKKyAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbiB3aGVuIGF2YWlsX2luIGhhcworICAgZHJvcHBlZCB0byB6ZXJvLiBJdCBtdXN0IHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0IHdoZW4gYXZhaWxfb3V0CisgICBoYXMgZHJvcHBlZCB0byB6ZXJvLiBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIHphbGxvYywgemZyZWUgYW5kCisgICBvcGFxdWUgYmVmb3JlIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCBieSB0aGUKKyAgIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIG11c3Qgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorCisgICBUaGUgb3BhcXVlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QKKyAgIHBhcmFtZXRlciBmb3IgY2FsbHMgb2YgemFsbG9jIGFuZCB6ZnJlZS4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjdXN0b20KKyAgIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGUgY29tcHJlc3Npb24gbGlicmFyeSBhdHRhY2hlcyBubyBtZWFuaW5nIHRvIHRoZQorICAgb3BhcXVlIHZhbHVlLgorCisgICB6YWxsb2MgbXVzdCByZXR1cm4gWl9OVUxMIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgorICAgSWYgemxpYiBpcyB1c2VkIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24sIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZQorICAgdGhyZWFkIHNhZmUuCisKKyAgIE9uIDE2LWJpdCBzeXN0ZW1zLCB0aGUgZnVuY3Rpb25zIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZSBhYmxlIHRvIGFsbG9jYXRlCisgICBleGFjdGx5IDY1NTM2IGJ5dGVzLCBidXQgd2lsbCBub3QgYmUgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMKKyAgIGlmIHRoZSBzeW1ib2wgTUFYU0VHXzY0SyBpcyBkZWZpbmVkIChzZWUgemNvbmYuaCkuIFdBUk5JTkc6IE9uIE1TRE9TLAorICAgcG9pbnRlcnMgcmV0dXJuZWQgYnkgemFsbG9jIGZvciBvYmplY3RzIG9mIGV4YWN0bHkgNjU1MzYgYnl0ZXMgKm11c3QqCisgICBoYXZlIHRoZWlyIG9mZnNldCBub3JtYWxpemVkIHRvIHplcm8uIFRoZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb24KKyAgIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeSBlbnN1cmVzIHRoaXMgKHNlZSB6dXRpbC5jKS4gVG8gcmVkdWNlIG1lbW9yeQorICAgcmVxdWlyZW1lbnRzIGFuZCBhdm9pZCBhbnkgYWxsb2NhdGlvbiBvZiA2NEsgb2JqZWN0cywgYXQgdGhlIGV4cGVuc2Ugb2YKKyAgIGNvbXByZXNzaW9uIHJhdGlvLCBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggLURNQVhfV0JJVFM9MTQgKHNlZSB6Y29uZi5oKS4KKworICAgVGhlIGZpZWxkcyB0b3RhbF9pbiBhbmQgdG90YWxfb3V0IGNhbiBiZSB1c2VkIGZvciBzdGF0aXN0aWNzIG9yCisgICBwcm9ncmVzcyByZXBvcnRzLiBBZnRlciBjb21wcmVzc2lvbiwgdG90YWxfaW4gaG9sZHMgdGhlIHRvdGFsIHNpemUgb2YKKyAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhbmQgbWF5IGJlIHNhdmVkIGZvciB1c2UgaW4gdGhlIGRlY29tcHJlc3NvcgorICAgKHBhcnRpY3VsYXJseSBpZiB0aGUgZGVjb21wcmVzc29yIHdhbnRzIHRvIGRlY29tcHJlc3MgZXZlcnl0aGluZyBpbgorICAgYSBzaW5nbGUgc3RlcCkuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25zdGFudHMgKi8KKworI2RlZmluZSBaX05PX0ZMVVNIICAgICAgMAorI2RlZmluZSBaX1BBUlRJQUxfRkxVU0ggMSAvKiB3aWxsIGJlIHJlbW92ZWQsIHVzZSBaX1NZTkNfRkxVU0ggaW5zdGVhZCAqLworI2RlZmluZSBaX1NZTkNfRkxVU0ggICAgMgorI2RlZmluZSBaX0ZVTExfRkxVU0ggICAgMworI2RlZmluZSBaX0ZJTklTSCAgICAgICAgNAorLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX09LICAgICAgICAgICAgMAorI2RlZmluZSBaX1NUUkVBTV9FTkQgICAgMQorI2RlZmluZSBaX05FRURfRElDVCAgICAgMgorI2RlZmluZSBaX0VSUk5PICAgICAgICAoLTEpCisjZGVmaW5lIFpfU1RSRUFNX0VSUk9SICgtMikKKyNkZWZpbmUgWl9EQVRBX0VSUk9SICAgKC0zKQorI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCisjZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKKyNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKKy8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQorICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KKyAqLworCisjZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCisjZGVmaW5lIFpfQkVTVF9TUEVFRCAgICAgICAgICAgICAxCisjZGVmaW5lIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgICA5CisjZGVmaW5lIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgKC0xKQorLyogY29tcHJlc3Npb24gbGV2ZWxzICovCisKKyNkZWZpbmUgWl9GSUxURVJFRCAgICAgICAgICAgIDEKKyNkZWZpbmUgWl9IVUZGTUFOX09OTFkgICAgICAgIDIKKyNkZWZpbmUgWl9ERUZBVUxUX1NUUkFURUdZICAgIDAKKy8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5OyBzZWUgZGVmbGF0ZUluaXQyKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX0JJTkFSWSAgIDAKKyNkZWZpbmUgWl9BU0NJSSAgICAxCisjZGVmaW5lIFpfVU5LTk9XTiAgMgorLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKi8KKworI2RlZmluZSBaX0RFRkxBVEVEICAgOAorLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KKworI2RlZmluZSBaX05VTEwgIDAgIC8qIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlICovCisKKyNkZWZpbmUgemxpYl92ZXJzaW9uIHpsaWJWZXJzaW9uKCkKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgPCAxLjAuMiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNpYyBmdW5jdGlvbnMgKi8KKworWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCB6bGliVmVyc2lvbiBPRigodm9pZCkpOworLyogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb21wYXJlIHpsaWJWZXJzaW9uIGFuZCBaTElCX1ZFUlNJT04gZm9yIGNvbnNpc3RlbmN5LgorICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMKKyAgIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgIFRoaXMgY2hlY2sgaXMgYXV0b21hdGljYWxseSBtYWRlIGJ5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdC4KKyAqLworCisvKiAKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgbGV2ZWwpKTsKKworICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBjb21wcmVzc2lvbi4gVGhlIGZpZWxkcworICAgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCisgICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBkZWZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8KKyAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgorCisgICAgIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBtdXN0IGJlIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgb3IgYmV0d2VlbiAwIGFuZCA5OgorICAgMSBnaXZlcyBiZXN0IHNwZWVkLCA5IGdpdmVzIGJlc3QgY29tcHJlc3Npb24sIDAgZ2l2ZXMgbm8gY29tcHJlc3Npb24gYXQKKyAgIGFsbCAodGhlIGlucHV0IGRhdGEgaXMgc2ltcGx5IGNvcGllZCBhIGJsb2NrIGF0IGEgdGltZSkuCisgICBaX0RFRkFVTFRfQ09NUFJFU1NJT04gcmVxdWVzdHMgYSBkZWZhdWx0IGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQKKyAgIGNvbXByZXNzaW9uIChjdXJyZW50bHkgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KKworICAgICBkZWZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgbGV2ZWwgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbGV2ZWwsCisgICBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICh6bGliX3ZlcnNpb24pIGlzIGluY29tcGF0aWJsZQorICAgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuCisgICBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgZGVmbGF0ZSBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZSBzb21lCisgIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCisgIGZvcmNlZCB0byBmbHVzaC4KKworICAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGRlZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gQ29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KKyAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBhbmQgYXZhaWxfaW4gYXJlIHVwZGF0ZWQgYW5kCisgICAgcHJvY2Vzc2luZyB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KKworICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0CisgICAgYWNjb3JkaW5nbHkuIFRoaXMgYWN0aW9uIGlzIGZvcmNlZCBpZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIG5vbiB6ZXJvLgorICAgIEZvcmNpbmcgZmx1c2ggZnJlcXVlbnRseSBkZWdyYWRlcyB0aGUgY29tcHJlc3Npb24gcmF0aW8sIHNvIHRoaXMgcGFyYW1ldGVyCisgICAgc2hvdWxkIGJlIHNldCBvbmx5IHdoZW4gbmVjZXNzYXJ5IChpbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbnMpLgorICAgIFNvbWUgb3V0cHV0IG1heSBiZSBwcm92aWRlZCBldmVuIGlmIGZsdXNoIGlzIG5vdCBzZXQuCisKKyAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKKyAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyBhdmFpbF9pbiBvciBhdmFpbF9vdXQgYWNjb3JkaW5nbHk7IGF2YWlsX291dAorICBzaG91bGQgbmV2ZXIgYmUgemVybyBiZWZvcmUgdGhlIGNhbGwuIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUKKyAgY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsCisgIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZiBkZWZsYXRlKCkuIElmIGRlZmxhdGUgcmV0dXJucyBaX09LCisgIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUKKyAgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisKKyAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX1NZTkNfRkxVU0gsIGFsbCBwZW5kaW5nIG91dHB1dCBpcworICBmbHVzaGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0aGUgb3V0cHV0IGlzIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBzbworICB0aGF0IHRoZSBkZWNvbXByZXNzb3IgY2FuIGdldCBhbGwgaW5wdXQgZGF0YSBhdmFpbGFibGUgc28gZmFyLiAoSW4gcGFydGljdWxhcgorICBhdmFpbF9pbiBpcyB6ZXJvIGFmdGVyIHRoZSBjYWxsIGlmIGVub3VnaCBvdXRwdXQgc3BhY2UgaGFzIGJlZW4gcHJvdmlkZWQKKyAgYmVmb3JlIHRoZSBjYWxsLikgIEZsdXNoaW5nIG1heSBkZWdyYWRlIGNvbXByZXNzaW9uIGZvciBzb21lIGNvbXByZXNzaW9uCisgIGFsZ29yaXRobXMgYW5kIHNvIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuCisKKyAgICBJZiBmbHVzaCBpcyBzZXQgdG8gWl9GVUxMX0ZMVVNILCBhbGwgb3V0cHV0IGlzIGZsdXNoZWQgYXMgd2l0aAorICBaX1NZTkNfRkxVU0gsIGFuZCB0aGUgY29tcHJlc3Npb24gc3RhdGUgaXMgcmVzZXQgc28gdGhhdCBkZWNvbXByZXNzaW9uIGNhbgorICByZXN0YXJ0IGZyb20gdGhpcyBwb2ludCBpZiBwcmV2aW91cyBjb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gZGFtYWdlZCBvciBpZgorICByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuIFVzaW5nIFpfRlVMTF9GTFVTSCB0b28gb2Z0ZW4gY2FuIHNlcmlvdXNseSBkZWdyYWRlCisgIHRoZSBjb21wcmVzc2lvbi4KKworICAgIElmIGRlZmxhdGUgcmV0dXJucyB3aXRoIGF2YWlsX291dCA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCisgIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKKyAgYXZhaWxfb3V0KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlIChkZWZsYXRlIHJldHVybnMgd2l0aCBub24temVybworICBhdmFpbF9vdXQpLgorCisgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9GSU5JU0gsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkLAorICBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIGFuZCBkZWZsYXRlIHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgaWYgdGhlcmUKKyAgd2FzIGVub3VnaCBvdXRwdXQgc3BhY2U7IGlmIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfT0ssIHRoaXMgZnVuY3Rpb24gbXVzdCBiZQorICBjYWxsZWQgYWdhaW4gd2l0aCBaX0ZJTklTSCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQgYXZhaWxfb3V0KSBidXQgbm8KKyAgbW9yZSBpbnB1dCBkYXRhLCB1bnRpbCBpdCByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIG9yIGFuIGVycm9yLiBBZnRlcgorICBkZWZsYXRlIGhhcyByZXR1cm5lZCBaX1NUUkVBTV9FTkQsIHRoZSBvbmx5IHBvc3NpYmxlIG9wZXJhdGlvbnMgb24gdGhlCisgIHN0cmVhbSBhcmUgZGVmbGF0ZVJlc2V0IG9yIGRlZmxhdGVFbmQuCisgIAorICAgIFpfRklOSVNIIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0IGlmIGFsbCB0aGUgY29tcHJlc3Npb24KKyAgaXMgdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwLiBJbiB0aGlzIGNhc2UsIGF2YWlsX291dCBtdXN0IGJlIGF0IGxlYXN0CisgIDAuMSUgbGFyZ2VyIHRoYW4gYXZhaWxfaW4gcGx1cyAxMiBieXRlcy4gIElmIGRlZmxhdGUgZG9lcyBub3QgcmV0dXJuCisgIFpfU1RSRUFNX0VORCwgdGhlbiBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhcyBkZXNjcmliZWQgYWJvdmUuCisKKyAgICBkZWZsYXRlKCkgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgaW5wdXQgcmVhZAorICBzbyBmYXIgKHRoYXQgaXMsIHRvdGFsX2luIGJ5dGVzKS4KKworICAgIGRlZmxhdGUoKSBtYXkgdXBkYXRlIGRhdGFfdHlwZSBpZiBpdCBjYW4gbWFrZSBhIGdvb2QgZ3Vlc3MgYWJvdXQKKyAgdGhlIGlucHV0IGRhdGEgdHlwZSAoWl9BU0NJSSBvciBaX0JJTkFSWSkuIEluIGRvdWJ0LCB0aGUgZGF0YSBpcyBjb25zaWRlcmVkCisgIGJpbmFyeS4gVGhpcyBmaWVsZCBpcyBvbmx5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3NlcyBhbmQgZG9lcyBub3QgYWZmZWN0CisgIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaW4gYW55IG1hbm5lci4KKworICAgIGRlZmxhdGUoKSByZXR1cm5zIFpfT0sgaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0CisgIHByb2Nlc3NlZCBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIFpfU1RSRUFNX0VORCBpZiBhbGwgaW5wdXQgaGFzIGJlZW4KKyAgY29uc3VtZWQgYW5kIGFsbCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQgKG9ubHkgd2hlbiBmbHVzaCBpcyBzZXQgdG8KKyAgWl9GSU5JU0gpLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlCisgIGlmIG5leHRfaW4gb3IgbmV4dF9vdXQgd2FzIE5VTEwpLCBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZQorICAoZm9yIGV4YW1wbGUgYXZhaWxfaW4gb3IgYXZhaWxfb3V0IHdhcyB6ZXJvKS4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKKyAgIHBlbmRpbmcgb3V0cHV0LgorCisgICAgIGRlZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAorICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiBJbiB0aGUgZXJyb3IgY2FzZSwKKyAgIG1zZyBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlCisgICBkZWFsbG9jYXRlZCkuCisqLworCisKKy8qIAorWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKworICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uLiBUaGUgZmllbGRzCisgICBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5CisgICB0aGUgY2FsbGVyLiBJZiBuZXh0X2luIGlzIG5vdCBaX05VTEwgYW5kIGF2YWlsX2luIGlzIGxhcmdlIGVub3VnaCAodGhlIGV4YWN0CisgICB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjb21wcmVzc2lvbiBtZXRob2QpLCBpbmZsYXRlSW5pdCBkZXRlcm1pbmVzIHRoZQorICAgY29tcHJlc3Npb24gbWV0aG9kIGZyb20gdGhlIHpsaWIgaGVhZGVyIGFuZCBhbGxvY2F0ZXMgYWxsIGRhdGEgc3RydWN0dXJlcworICAgYWNjb3JkaW5nbHk7IG90aGVyd2lzZSB0aGUgYWxsb2NhdGlvbiB3aWxsIGJlIGRlZmVycmVkIHRvIHRoZSBmaXJzdCBjYWxsIG9mCisgICBpbmZsYXRlLiAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgaW5mbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvCisgICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKworICAgICBpbmZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKKyAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLiAgbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yCisgICBtZXNzYWdlLiBpbmZsYXRlSW5pdCBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uIGFwYXJ0IGZyb20gcmVhZGluZworICAgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZAorICAgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW5jaGFuZ2VkLikKKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7CisvKgorICAgIGluZmxhdGUgZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IHNvbWUKKyAgaW50cm9kdWNlIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkKKyAgZXhjZXB0IHdoZW4gZm9yY2VkIHRvIGZsdXNoLgorCisgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgorICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGlzIHVwZGF0ZWQgYW5kIHByb2Nlc3NpbmcKKyAgICB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KKworICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0CisgICAgYWNjb3JkaW5nbHkuICBpbmZsYXRlKCkgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUsIHVudGlsIHRoZXJlCisgICAgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgKHNlZSBiZWxvdworICAgIGFib3V0IHRoZSBmbHVzaCBwYXJhbWV0ZXIpLgorCisgIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCisgIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuCisgIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IKKyAgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaAorICBjYWxsIG9mIGluZmxhdGUoKS4gSWYgaW5mbGF0ZSByZXR1cm5zIFpfT0sgYW5kIHdpdGggemVybyBhdmFpbF9vdXQsIGl0CisgIG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUKKyAgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KKworICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfU1lOQ19GTFVTSCwgaW5mbGF0ZSBmbHVzaGVzIGFzIG11Y2gKKyAgb3V0cHV0IGFzIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGUgZmx1c2hpbmcgYmVoYXZpb3Igb2YgaW5mbGF0ZSBpcworICBub3Qgc3BlY2lmaWVkIGZvciB2YWx1ZXMgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBvdGhlciB0aGFuIFpfU1lOQ19GTFVTSAorICBhbmQgWl9GSU5JU0gsIGJ1dCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0CisgIGFzIHBvc3NpYmxlIGFueXdheS4KKworICAgIGluZmxhdGUoKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgWl9TVFJFQU1fRU5EIG9yIGFuCisgIGVycm9yLiBIb3dldmVyIGlmIGFsbCBkZWNvbXByZXNzaW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBzdGVwCisgIChhIHNpbmdsZSBjYWxsIG9mIGluZmxhdGUpLCB0aGUgcGFyYW1ldGVyIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8KKyAgWl9GSU5JU0guIEluIHRoaXMgY2FzZSBhbGwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQgYW5kIGFsbCBwZW5kaW5nCisgIG91dHB1dCBpcyBmbHVzaGVkOyBhdmFpbF9vdXQgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlCisgIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4gc2F2ZWQKKyAgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0CisgIGJlIGluZmxhdGVFbmQgdG8gZGVhbGxvY2F0ZSB0aGUgZGVjb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHVzZSBvZiBaX0ZJTklTSAorICBpcyBuZXZlciByZXF1aXJlZCwgYnV0IGNhbiBiZSB1c2VkIHRvIGluZm9ybSBpbmZsYXRlIHRoYXQgYSBmYXN0ZXIgcm91dGluZQorICBtYXkgYmUgdXNlZCBmb3IgdGhlIHNpbmdsZSBpbmZsYXRlKCkgY2FsbC4KKworICAgICBJZiBhIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50IChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKKyAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS1hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiB0aGUKKyAgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9ORUVEX0RJQ1Q7IG90aGVyd2lzZSAKKyAgaXQgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkCisgIHNvIGZhciAodGhhdCBpcywgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IKKyAgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgaW5mbGF0ZSgpCisgIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCBhZGxlcjMyIGNoZWNrc3VtIGlzIGVxdWFsIHRvIHRoYXQgc2F2ZWQgYnkgdGhlCisgIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9TVFJFQU1fRU5EIG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCisKKyAgICBpbmZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dCBwcm9jZXNzZWQKKyAgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcworICBiZWVuIHJlYWNoZWQgYW5kIGFsbCB1bmNvbXByZXNzZWQgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkLCBaX05FRURfRElDVCBpZiBhCisgIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzCisgIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QKKyAgYWRsZXIzMiBjaGVja3N1bSksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQKKyAgKGZvciBleGFtcGxlIGlmIG5leHRfaW4gb3IgbmV4dF9vdXQgd2FzIE5VTEwpLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlIG9yIGlmIHRoZXJlIHdhcyBub3QKKyAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLiBJbiB0aGUgWl9EQVRBX0VSUk9SCisgIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgdGhlbiBjYWxsIGluZmxhdGVTeW5jIHRvIGxvb2sgZm9yIGEgZ29vZAorICBjb21wcmVzc2lvbiBibG9jay4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKKyAgIHBlbmRpbmcgb3V0cHV0LgorCisgICAgIGluZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUKKyAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQorICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZWQgZnVuY3Rpb25zICovCisKKy8qCisgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG5lZWRlZCBvbmx5IGluIHNvbWUgc3BlY2lhbCBhcHBsaWNhdGlvbnMuCisqLworCisvKiAgIAorWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBzdHJhdGVneSkpOworCisgICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGRlZmxhdGVJbml0IHdpdGggbW9yZSBjb21wcmVzc2lvbiBvcHRpb25zLiBUaGUKKyAgIGZpZWxkcyBuZXh0X2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKKyAgIHRoZSBjYWxsZXIuCisKKyAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gSXQgbXVzdCBiZSBaX0RFRkxBVEVEIGluCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplCisgICAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yIHRoaXMKKyAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIExhcmdlciB2YWx1ZXMgb2YgdGhpcyBwYXJhbWV0ZXIgcmVzdWx0IGluIGJldHRlcgorICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgorICAgZGVmbGF0ZUluaXQgaXMgdXNlZCBpbnN0ZWFkLgorCisgICAgIFRoZSBtZW1MZXZlbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkCisgICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiBtZW1MZXZlbD0xIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0CisgICBpcyBzbG93IGFuZCByZWR1Y2VzIGNvbXByZXNzaW9uIHJhdGlvOyBtZW1MZXZlbD05IHVzZXMgbWF4aW11bSBtZW1vcnkKKyAgIGZvciBvcHRpbWFsIHNwZWVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5CisgICB1c2FnZSBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLgorCisgICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uIFVzZSB0aGUKKyAgIHZhbHVlIFpfREVGQVVMVF9TVFJBVEVHWSBmb3Igbm9ybWFsIGRhdGEsIFpfRklMVEVSRUQgZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQorICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBvciBaX0hVRkZNQU5fT05MWSB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCisgICBzdHJpbmcgbWF0Y2gpLiAgRmlsdGVyZWQgZGF0YSBjb25zaXN0cyBtb3N0bHkgb2Ygc21hbGwgdmFsdWVzIHdpdGggYQorICAgc29tZXdoYXQgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzCisgICB0dW5lZCB0byBjb21wcmVzcyB0aGVtIGJldHRlci4gVGhlIGVmZmVjdCBvZiBaX0ZJTFRFUkVEIGlzIHRvIGZvcmNlIG1vcmUKKyAgIEh1ZmZtYW4gY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZzsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlCisgICBiZXR3ZWVuIFpfREVGQVVMVCBhbmQgWl9IVUZGTUFOX09OTFkuIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgb25seSBhZmZlY3RzCisgICB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4KKyAgIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS4KKworICAgICAgZGVmbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKKyAgIG1ldGhvZCkuIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQyIGRvZXMKKyAgIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVNldERpY3Rpb25hcnkgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7CisvKgorICAgICBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlCisgICB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKKyAgIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0LCBkZWZsYXRlSW5pdDIgb3IgZGVmbGF0ZVJlc2V0LCBiZWZvcmUgYW55CisgICBjYWxsIG9mIGRlZmxhdGUuIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQorICAgZGljdGlvbmFyeSAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5KS4KKworICAgICBUaGUgZGljdGlvbmFyeSBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5CisgICB0byBiZSBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5CisgICB1c2VkIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiBVc2luZyBhCisgICBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQgY2FuIGJlCisgICBwcmVkaWN0ZWQgd2l0aCBnb29kIGFjY3VyYWN5OyB0aGUgZGF0YSBjYW4gdGhlbiBiZSBjb21wcmVzc2VkIGJldHRlciB0aGFuCisgICB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuCisKKyAgICAgRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2lvbiBkYXRhIHN0cnVjdHVyZXMgc2VsZWN0ZWQgYnkKKyAgIGRlZmxhdGVJbml0IG9yIGRlZmxhdGVJbml0MiwgYSBwYXJ0IG9mIHRoZSBkaWN0aW9uYXJ5IG1heSBpbiBlZmZlY3QgYmUKKyAgIGRpc2NhcmRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdyBzaXplIGluCisgICBkZWZsYXRlIG9yIGRlZmxhdGUyLiBUaHVzIHRoZSBzdHJpbmdzIG1vc3QgbGlrZWx5IHRvIGJlIHVzZWZ1bCBzaG91bGQgYmUKKyAgIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LCBub3QgYXQgdGhlIGZyb250LgorCisgICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgQWRsZXIzMiB2YWx1ZQorICAgb2YgdGhlIGRpY3Rpb25hcnk7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQorICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAoVGhlIEFkbGVyMzIgdmFsdWUKKyAgIGFwcGxpZXMgdG8gdGhlIHdob2xlIGRpY3Rpb25hcnkgZXZlbiBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBkaWN0aW9uYXJ5IGlzCisgICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLikKKworICAgICBkZWZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgYQorICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCisgICBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlIGlmIGRlZmxhdGUgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc3RyZWFtCisgICBvciBpZiB0aGUgY29tcHJlc3Npb24gbWV0aG9kIGlzIGJzb3J0KS4gZGVmbGF0ZVNldERpY3Rpb25hcnkgZG9lcyBub3QKKyAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfc3RyZWFtcCBzb3VyY2UpKTsKKy8qCisgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCisKKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gc2V2ZXJhbCBjb21wcmVzc2lvbiBzdHJhdGVnaWVzIHdpbGwgYmUKKyAgIHRyaWVkLCBmb3IgZXhhbXBsZSB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIHdheXMgb2YgcHJlLXByb2Nlc3NpbmcgdGhlIGlucHV0CisgICBkYXRhIHdpdGggYSBmaWx0ZXIuIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKKyAgIGJ5IGNhbGxpbmcgZGVmbGF0ZUVuZC4gIE5vdGUgdGhhdCBkZWZsYXRlQ29weSBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAorICAgY29tcHJlc3Npb24gc3RhdGUgd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kCisgICBjYW4gY29uc3VtZSBsb3RzIG9mIG1lbW9yeS4KKworICAgICBkZWZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAorICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIE5VTEwpLiBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCisgICBkZXN0aW5hdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRlZmxhdGVFbmQgZm9sbG93ZWQgYnkgZGVmbGF0ZUluaXQsCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLgorICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGFueSBvdGhlciBhdHRyaWJ1dGVzCisgICB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGRlZmxhdGVJbml0Mi4KKworICAgICAgZGVmbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgTlVMTCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVQYXJhbXMgT0YoKHpfc3RyZWFtcCBzdHJtLAorCQkJCSAgICAgIGludCBsZXZlbCwKKwkJCQkgICAgICBpbnQgc3RyYXRlZ3kpKTsKKy8qCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LiAgVGhlCisgICBpbnRlcnByZXRhdGlvbiBvZiBsZXZlbCBhbmQgc3RyYXRlZ3kgaXMgYXMgaW4gZGVmbGF0ZUluaXQyLiAgVGhpcyBjYW4gYmUKKyAgIHVzZWQgdG8gc3dpdGNoIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIGlucHV0IGRhdGEsIG9yCisgICB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQga2luZCBvZiBpbnB1dCBkYXRhIHJlcXVpcmluZyBhIGRpZmZlcmVudAorICAgc3RyYXRlZ3kuIElmIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBjaGFuZ2VkLCB0aGUgaW5wdXQgYXZhaWxhYmxlIHNvIGZhcgorICAgaXMgY29tcHJlc3NlZCB3aXRoIHRoZSBvbGQgbGV2ZWwgKGFuZCBtYXkgYmUgZmx1c2hlZCk7IHRoZSBuZXcgbGV2ZWwgd2lsbAorICAgdGFrZSBlZmZlY3Qgb25seSBhdCB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KKworICAgICBCZWZvcmUgdGhlIGNhbGwgb2YgZGVmbGF0ZVBhcmFtcywgdGhlIHN0cmVhbSBzdGF0ZSBtdXN0IGJlIHNldCBhcyBmb3IKKyAgIGEgY2FsbCBvZiBkZWZsYXRlKCksIHNpbmNlIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGlucHV0IG1heSBoYXZlIHRvCisgICBiZSBjb21wcmVzc2VkIGFuZCBmbHVzaGVkLiBJbiBwYXJ0aWN1bGFyLCBzdHJtLT5hdmFpbF9vdXQgbXVzdCBiZSBub24temVyby4KKworICAgICBkZWZsYXRlUGFyYW1zIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCBvciBpZiBhIHBhcmFtZXRlciB3YXMgaW52YWxpZCwgWl9CVUZfRVJST1IKKyAgIGlmIHN0cm0tPmF2YWlsX291dCB3YXMgemVyby4KKyovCisKKy8qICAgCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzKSk7CisKKyAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgaW5mbGF0ZUluaXQgd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuIFRoZQorICAgZmllbGRzIG5leHRfaW4sIGF2YWlsX2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZAorICAgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCisKKyAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIG1heGltdW0gd2luZG93CisgICBzaXplICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IKKyAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYgaW5mbGF0ZUluaXQgaXMgdXNlZAorICAgaW5zdGVhZC4gSWYgYSBjb21wcmVzc2VkIHN0cmVhbSB3aXRoIGEgbGFyZ2VyIHdpbmRvdyBzaXplIGlzIGdpdmVuIGFzCisgICBpbnB1dCwgaW5mbGF0ZSgpIHdpbGwgcmV0dXJuIHdpdGggdGhlIGVycm9yIGNvZGUgWl9EQVRBX0VSUk9SIGluc3RlYWQgb2YKKyAgIHRyeWluZyB0byBhbGxvY2F0ZSBhIGxhcmdlciB3aW5kb3cuCisKKyAgICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhIG5lZ2F0aXZlCisgICBtZW1MZXZlbCkuIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQyCisgICBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uIGFwYXJ0IGZyb20gcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYKKyAgIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gKFNvIG5leHRfaW4gYW5kIGF2YWlsX2luIG1heSBiZQorICAgbW9kaWZpZWQsIGJ1dCBuZXh0X291dCBhbmQgYXZhaWxfb3V0IGFyZSB1bmNoYW5nZWQuKQorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKKy8qCisgICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKKyAgIHNlcXVlbmNlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCBvZiBpbmZsYXRlCisgICBpZiB0aGlzIGNhbGwgcmV0dXJuZWQgWl9ORUVEX0RJQ1QuIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgorICAgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgQWRsZXIzMiB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGNhbGwgb2YKKyAgIGluZmxhdGUuIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQorICAgZGljdGlvbmFyeSAoc2VlIGRlZmxhdGVTZXREaWN0aW9uYXJ5KS4KKworICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYQorICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCisgICBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQorICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgQWRsZXIzMiB2YWx1ZSkuIGluZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBzdWJzZXF1ZW50IGNhbGxzIG9mCisgICBpbmZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTeW5jIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyogCisgICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgYSBmdWxsIGZsdXNoIHBvaW50IChzZWUgYWJvdmUgdGhlCisgIGRlc2NyaXB0aW9uIG9mIGRlZmxhdGUgd2l0aCBaX0ZVTExfRkxVU0gpIGNhbiBiZSBmb3VuZCwgb3IgdW50aWwgYWxsCisgIGF2YWlsYWJsZSBpbnB1dCBpcyBza2lwcGVkLiBObyBvdXRwdXQgaXMgcHJvdmlkZWQuCisKKyAgICBpbmZsYXRlU3luYyByZXR1cm5zIFpfT0sgaWYgYSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLCBaX0JVRl9FUlJPUgorICBpZiBubyBtb3JlIGlucHV0IHdhcyBwcm92aWRlZCwgWl9EQVRBX0VSUk9SIGlmIG5vIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAorICBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgc3VjY2VzcworICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHNhdmUgdGhlIGN1cnJlbnQgY3VycmVudCB2YWx1ZSBvZiB0b3RhbF9pbiB3aGljaAorICBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gSW4gdGhlIGVycm9yIGNhc2UsIHRoZQorICBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIGluZmxhdGVTeW5jLCBwcm92aWRpbmcgbW9yZSBpbnB1dCBlYWNoIHRpbWUsCisgIHVudGlsIHN1Y2Nlc3Mgb3IgZW5kIG9mIHRoZSBpbnB1dCBkYXRhLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gaW5mbGF0ZUVuZCBmb2xsb3dlZCBieSBpbmZsYXRlSW5pdCwKKyAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgZGVjb21wcmVzc2lvbiBzdGF0ZS4KKyAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIGF0dHJpYnV0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSBpbmZsYXRlSW5pdDIuCisKKyAgICAgIGluZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIE5VTEwpLgorKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGUgZm9sbG93aW5nIHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlCisgICBiYXNpYyBzdHJlYW0tb3JpZW50ZWQgZnVuY3Rpb25zLiBUbyBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlLCBzb21lCisgICBkZWZhdWx0IG9wdGlvbnMgYXJlIGFzc3VtZWQgKGNvbXByZXNzaW9uIGxldmVsIGFuZCBtZW1vcnkgdXNhZ2UsCisgICBzdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMpLiBUaGUgc291cmNlIGNvZGUgb2YgdGhlc2UKKyAgIHV0aWxpdHkgZnVuY3Rpb25zIGNhbiBlYXNpbHkgYmUgbW9kaWZpZWQgaWYgeW91IG5lZWQgc3BlY2lhbCBvcHRpb25zLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBjb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcworICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAorICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4KKyAgIHNvdXJjZUxlbiBwbHVzIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQorICAgY29tcHJlc3NlZCBidWZmZXIuCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCisgICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCisgICAgIGNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgY29tcHJlc3MyIE9GKChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkpOworLyoKKyAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIFRoZSBsZXZlbAorICAgcGFyYW1ldGVyIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIGRlZmxhdGVJbml0LiAgc291cmNlTGVuIGlzIHRoZSBieXRlCisgICBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCisgICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgMC4xJSBsYXJnZXIgdGhhbiBzb3VyY2VMZW4gcGx1cworICAgMTIgYnl0ZXMuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgorCisgICAgIGNvbXByZXNzMiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwKKyAgIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBsZXZlbCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKKyAgIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUKKyAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgorICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKKyAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgorICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCisgICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCisKKyAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkLgorKi8KKworCit0eXBlZGVmIHZvaWRwIGd6RmlsZTsKKworWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW4gIE9GKChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKSk7CisvKgorICAgICBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLiBUaGUgbW9kZSBwYXJhbWV0ZXIKKyAgIGlzIGFzIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwKKyAgICgid2I5Iikgb3IgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvcgorICAgSHVmZm1hbiBvbmx5IGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIi4gKFNlZSB0aGUgZGVzY3JpcHRpb24KKyAgIG9mIGRlZmxhdGVJbml0MiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RyYXRlZ3kgcGFyYW1ldGVyLikKKworICAgICBnem9wZW4gY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0OyBpbiB0aGlzCisgICBjYXNlIGd6cmVhZCB3aWxsIGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgZmlsZSB3aXRob3V0IGRlY29tcHJlc3Npb24uCisKKyAgICAgZ3pvcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIG9yIGlmIHRoZXJlIHdhcworICAgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlOyBlcnJubworICAgY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlCisgICB6bGliIGVycm9yIGlzIFpfTUVNX0VSUk9SKS4gICovCisKK1pFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiAgT0YoKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSkpOworLyoKKyAgICAgZ3pkb3BlbigpIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZQorICAgZGVzY3JpcHRvcnMgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yCisgICBmaWxlbm8gKGluIHRoZSBmaWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLgorICAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KKyAgICAgVGhlIG5leHQgY2FsbCBvZiBnemNsb3NlIG9uIHRoZSByZXR1cm5lZCBnekZpbGUgd2lsbCBhbHNvIGNsb3NlIHRoZQorICAgZmlsZSBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCksIG1vZGUpIGNsb3NlcyB0aGUgZmlsZQorICAgZGVzY3JpcHRvciBmZC4gSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZ3pkb3BlbihkdXAoZmQpLCBtb2RlKS4KKyAgICAgZ3pkb3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUKKyAgIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKKy8qCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuIFNlZSB0aGUgZGVzY3JpcHRpb24KKyAgIG9mIGRlZmxhdGVJbml0MiBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlc2UgcGFyYW1ldGVycy4KKyAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKKyAgIG9wZW5lZCBmb3Igd3JpdGluZy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pyZWFkICBPRigoZ3pGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKSk7CisvKgorICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCBnenJlYWQgY29waWVzIHRoZSBnaXZlbiBudW1iZXIKKyAgIG9mIGJ5dGVzIGludG8gdGhlIGJ1ZmZlci4KKyAgICAgZ3pyZWFkIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgcmVhZCAoMCBmb3IKKyAgIGVuZCBvZiBmaWxlLCAtMSBmb3IgZXJyb3IpLiAqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6d3JpdGUgT0YoKGd6RmlsZSBmaWxlLCAKKwkJCQkgICBjb25zdCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbikpOworLyoKKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuCisgICAoMCBpbiBjYXNlIG9mIGVycm9yKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlRWQSAgIGd6cHJpbnRmIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKTsKKy8qCisgICAgIENvbnZlcnRzLCBmb3JtYXRzLCBhbmQgd3JpdGVzIHRoZSBhcmdzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKKyAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuIGd6cHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6cHV0cyBPRigoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKnMpKTsKKy8qCisgICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSwgZXhjbHVkaW5nCisgICB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCisgICAgICBnenB1dHMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyovCisKK1pFWFRFUk4gY2hhciAqIFpFWFBPUlQgZ3pnZXRzIE9GKChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKSk7CisvKgorICAgICAgUmVhZHMgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlIHVudGlsIGxlbi0xIGNoYXJhY3RlcnMgYXJlIHJlYWQsIG9yCisgICBhIG5ld2xpbmUgY2hhcmFjdGVyIGlzIHJlYWQgYW5kIHRyYW5zZmVycmVkIHRvIGJ1Ziwgb3IgYW4gZW5kLW9mLWZpbGUKKyAgIGNvbmRpdGlvbiBpcyBlbmNvdW50ZXJlZC4gIFRoZSBzdHJpbmcgaXMgdGhlbiB0ZXJtaW5hdGVkIHdpdGggYSBudWxsCisgICBjaGFyYWN0ZXIuCisgICAgICBnemdldHMgcmV0dXJucyBidWYsIG9yIFpfTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenB1dGMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgYykpOworLyoKKyAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3pwdXRjIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Z2V0YyBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgICBSZWFkcyBvbmUgYnl0ZSBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZQorICAgb3IgLTEgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOworLyoKKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCisgICBmbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCisgICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBnemVycm9yIGJlbG93KS4gZ3pmbHVzaCByZXR1cm5zIFpfT0sgaWYKKyAgIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaXMgWl9GSU5JU0ggYW5kIGFsbCBvdXRwdXQgY291bGQgYmUgZmx1c2hlZC4KKyAgICAgZ3pmbHVzaCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBzdHJpY3RseSBuZWNlc3NhcnkgYmVjYXVzZSBpdCBjYW4KKyAgIGRlZ3JhZGUgY29tcHJlc3Npb24uCisqLworCitaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCAgICBnenNlZWsgT0YoKGd6RmlsZSBmaWxlLAorCQkJCSAgICAgIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7CisvKiAKKyAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiBUaGUgd2hlbmNlIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGluIGxzZWVrKDIpOworICAgdGhlIHZhbHVlIFNFRUtfRU5EIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCisgICBleHRyZW1lbHkgc2xvdy4gSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nLCBvbmx5IGZvcndhcmQgc2Vla3MgYXJlCisgICBzdXBwb3J0ZWQ7IGd6c2VlayB0aGVuIGNvbXByZXNzZXMgYSBzZXF1ZW5jZSBvZiB6ZXJvZXMgdXAgdG8gdGhlIG5ldworICAgc3RhcnRpbmcgcG9zaXRpb24uCisKKyAgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KKyAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCisgICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgorICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenJld2luZCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCisKKyAgIGd6cmV3aW5kKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludClnenNlZWsoZmlsZSwgMEwsIFNFRUtfU0VUKQorKi8KKworWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3p0ZWxsIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCisKKyAgIGd6dGVsbChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6ZW9mIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KKyAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Y2xvc2UgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCisgICBhbmQgZGVhbGxvY2F0ZXMgYWxsIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIKKyAgIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLgorKi8KKworWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCBnemVycm9yIE9GKChnekZpbGUgZmlsZSwgaW50ICplcnJudW0pKTsKKy8qCisgICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgorICAgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksCisgICBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubworICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tzdW0gZnVuY3Rpb25zICovCisKKy8qCisgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHJlbGF0ZWQgdG8gY29tcHJlc3Npb24gYnV0IGFyZSBleHBvcnRlZAorICAgYW55d2F5IGJlY2F1c2UgdGhleSBtaWdodCBiZSB1c2VmdWwgaW4gYXBwbGljYXRpb25zIHVzaW5nIHRoZQorICAgY29tcHJlc3Npb24gbGlicmFyeS4KKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyIE9GKCh1TG9uZyBhZGxlciwgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pKTsKKworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBBZGxlci0zMiBjaGVja3N1bSB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZAorICAgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgorICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyICAgT0YoKHVMb25nIGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pKTsKKy8qCisgICAgIFVwZGF0ZSBhIHJ1bm5pbmcgY3JjIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kIHJldHVybiB0aGUgdXBkYXRlZAorICAgY3JjLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1aXJlZCBpbml0aWFsIHZhbHVlCisgICBmb3IgdGhlIGNyYy4gUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzIHBlcmZvcm1lZAorICAgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVXNhZ2UgZXhhbXBsZToKKworICAgICB1TG9uZyBjcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIGNyYyA9IGNyYzMyKGNyYywgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmIChjcmMgIT0gb3JpZ2luYWxfY3JjKSBlcnJvcigpOworKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YXJpb3VzIGhhY2tzLCBkb24ndCBsb29rIDopICovCisKKy8qIGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBhcmUgbWFjcm9zIHRvIGFsbG93IGNoZWNraW5nIHRoZSB6bGliIHZlcnNpb24KKyAqIGFuZCB0aGUgY29tcGlsZXIncyB2aWV3IG9mIHpfc3RyZWFtOgorICovCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyXyBPRigoel9zdHJlYW1wIHN0cm0sIGludCAgbGV2ZWwsIGludCAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywgaW50IG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKKyNkZWZpbmUgZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIFwKKyAgICAgICAgZGVmbGF0ZUluaXRfKChzdHJtKSwgKGxldmVsKSwgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlSW5pdChzdHJtKSBcCisgICAgICAgIGluZmxhdGVJbml0Xygoc3RybSksICAgICAgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAorICAgICAgICBkZWZsYXRlSW5pdDJfKChzdHJtKSwobGV2ZWwpLChtZXRob2QpLCh3aW5kb3dCaXRzKSwobWVtTGV2ZWwpLFwKKyAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kpLCAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgXAorICAgICAgICBpbmZsYXRlSW5pdDJfKChzdHJtKSwgKHdpbmRvd0JpdHMpLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisKKworI2lmICFkZWZpbmVkKF9aX1VUSUxfSCkgJiYgIWRlZmluZWQoTk9fRFVNTVlfREVDTCkKKyAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUge2ludCBkdW1teTt9OyAvKiBoYWNrIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCitaRVhURVJOIGNvbnN0IGNoYXIgICAqIFpFWFBPUlQgekVycm9yICAgICAgICAgICBPRigoaW50IGVycikpOworWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGluZmxhdGVTeW5jUG9pbnQgT0YoKHpfc3RyZWFtcCB6KSk7CitaRVhURVJOIGNvbnN0IHVMb25nZiAqIFpFWFBPUlQgZ2V0X2NyY190YWJsZSAgICBPRigodm9pZCkpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1pMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvemxpYi5odG1sIGIvY29tbW9uL3psaWIvemxpYi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNDM3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi96bGliLmh0bWwKQEAgLTAsMCArMSw5NzEgQEAKKzxodG1sPgorPGhlYWQ+CisgPHRpdGxlPgorIHpsaWIgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkgdmVyc2lvbiAxLjEuNAorIDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSJXaGl0ZSIgdGV4dD0iQmxhY2siIHZsaW5rPSJSZWQiIGFsaW5rPSJOYXZ5IiBsaW5rPSJSZWQiPgorPCEtLSBiYWNrZ3JvdW5kPSJ6bGliYmcuZ2lmIiAtLT4KKworPGgxPiB6bGliIDEuMS40IE1hbnVhbCA8L2gxPgorPGhyPgorPGEgbmFtZT0iQ29udGVudHMiPjxoMj5Db250ZW50czwvaDI+Cis8b2wgdHlwZT0iSSI+Cis8bGk+IDxhIGhyZWY9IiNQcm9sb2d1ZSI+UHJvbG9ndWU8L2E+Cis8bGk+IDxhIGhyZWY9IiNJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT4KKzxsaT4gPGEgaHJlZj0iI1V0aWxpdHkgZnVuY3Rpb25zIj5VdGlsaXR5IGZ1bmN0aW9uczwvYT4KKzxsaT4gPGEgaHJlZj0iI0Jhc2ljIGZ1bmN0aW9ucyI+QmFzaWMgZnVuY3Rpb25zPC9hPgorPGxpPiA8YSBocmVmPSIjQWR2YW5jZWQgZnVuY3Rpb25zIj5BZHZhbmNlZCBmdW5jdGlvbnM8L2E+Cis8bGk+IDxhIGhyZWY9IiNDb25zdGFudHMiPkNvbnN0YW50czwvYT4KKzxsaT4gPGEgaHJlZj0iI3N0cnVjdCB6X3N0cmVhbV9zIj5zdHJ1Y3Qgel9zdHJlYW1fczwvYT4KKzxsaT4gPGEgaHJlZj0iI0NoZWNrc3VtIGZ1bmN0aW9ucyI+Q2hlY2tzdW0gZnVuY3Rpb25zPC9hPgorPGxpPiA8YSBocmVmPSIjTWlzYyI+TWlzYzwvYT4KKzwvb2w+Cis8aHI+Cis8YSBuYW1lPSJQcm9sb2d1ZSI+PGgyPiBQcm9sb2d1ZSA8L2gyPgorICAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkgdmVyc2lvbiAxLjEuNCwgTWFyY2ggMTF0aCwgMjAwMgorICA8cD4KKyAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorICA8cD4KKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICA8cD4KKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICA8b2w+CisgICA8bGk+IFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCA7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgIDxsaT4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAgPGxpPiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICA8L29sPgorCisgIDxkbD4KKyAgPGR0PkplYW4tbG91cCBHYWlsbHkgICAgICAgIAorICA8ZGQ+PGEgaHJlZj0ibWFpbHRvOmpsb3VwQGd6aXAub3JnIj5qbG91cEBnemlwLm9yZzwvYT4KKyAgPGR0Pk1hcmsgQWRsZXIKKyAgPGRkPjxhIGhyZWY9Im1haWx0bzptYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ij5tYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PC9hPgorICA8L2RsPgorCisgIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCisgIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzCisgIDxhIGhyZWY9ImZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MC50eHQiPgorICBmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTAudHh0IDwvYT4KKyAgKHpsaWIgZm9ybWF0KSwgCisgIDxhIGhyZWY9ImZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MS50eHQiPgorICByZmMxOTUxLnR4dCA8L2E+CisgICg8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gZm9ybWF0KSBhbmQgCisgIDxhIGhyZWY9ImZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1Mi50eHQiPgorICByZmMxOTUyLnR4dCA8L2E+CisgIChnemlwIGZvcm1hdCkuCisgIDxwPgorICBUaGlzIG1hbnVhbCBpcyBjb252ZXJ0ZWQgZnJvbSB6bGliLmggYnkgCisgIDxhIGhyZWY9Im1haWx0bzpwaWFpcEBjc2llLm50dS5lZHUudHciPiBwaWFpcCA8L2E+CisgIDxwPgorICBWaXNpdCA8YSBocmVmPSJodHRwOi8vZnRwLmNkcm9tLmNvbS9wdWIvaW5mb3ppcC96bGliLyI+CisgIGh0dHA6Ly9mdHAuY2Ryb20uY29tL3B1Yi9pbmZvemlwL3psaWIvPC9hPiAKKyAgZm9yIHRoZSBvZmZpY2lhbCB6bGliIHdlYiBwYWdlLgorICA8cD4KKworPGhyPgorPGEgbmFtZT0iSW50cm9kdWN0aW9uIj48aDI+IEludHJvZHVjdGlvbiA8L2gyPgorICAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZAorICBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZAorICBkYXRhLiAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZAorICAoZGVmbGF0aW9uKSBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUKKyAgc3RyZWFtIGludGVyZmFjZS4KKyAgPHA+CisKKyAgICAgQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UKKyAgZW5vdWdoIChmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLCBvciBjYW4gYmUgZG9uZSBieQorICByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQorICBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CisgIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisgIDxwPgorCisgICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAorICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8uCisgIDxwPgorCisgICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKKyAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgorICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgorICA8cD4KKworPGhyPgorPGEgbmFtZT0iVXRpbGl0eSBmdW5jdGlvbnMiPjxoMj4gVXRpbGl0eSBmdW5jdGlvbnMgPC9oMj4KKyAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZQorICAgPGEgaHJlZj0iI0Jhc2ljIGZ1bmN0aW9ucyI+YmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9uczwvYT4uIAorICAgVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQorICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAorICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCisgICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KKzxoMz4gRnVuY3Rpb24gbGlzdCA8L2gzPgorPHVsPgorPGxpPiBpbnQgIDxhIGhyZWY9IiNjb21wcmVzcyI+Y29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7Cis8bGk+IGludCAgPGEgaHJlZj0iI2NvbXByZXNzMiI+Y29tcHJlc3MyPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sIGludCBsZXZlbCk7Cis8bGk+IGludCAgPGEgaHJlZj0iI3VuY29tcHJlc3MiPnVuY29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7Cis8bGk+IHR5cGVkZWYgdm9pZHAgZ3pGaWxlOworPGxpPiAgZ3pGaWxlICA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+ICAoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSk7Cis8bGk+IGd6RmlsZSAgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+ICAoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKTsKKzxsaT4gaW50ICA8YSBocmVmPSIjZ3pzZXRwYXJhbXMiPmd6c2V0cGFyYW1zPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KTsKKzxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+ICAoZ3pGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKTsKKzxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3p3cml0ZSI+Z3p3cml0ZTwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7Cis8bGk+IGludCBWQSAgIDxhIGhyZWY9IiNnenByaW50ZiI+Z3pwcmludGY8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworPGxpPiBpbnQgIDxhIGhyZWY9IiNnenB1dHMiPmd6cHV0czwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpzKTsKKzxsaT4gY2hhciAqICA8YSBocmVmPSIjZ3pnZXRzIj5nemdldHM8L2E+IChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKTsKKzxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pwdXRjIj5nenB1dGM8L2E+IChnekZpbGUgZmlsZSwgaW50IGMpOworPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnemdldGMiPmd6Z2V0YzwvYT4gKGd6RmlsZSBmaWxlKTsKKzxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pmbHVzaCI+Z3pmbHVzaDwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpOworPGxpPiB6X29mZl90ICAgICA8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+IChnekZpbGUgZmlsZSwgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpOworPGxpPiB6X29mZl90ICAgICA8YSBocmVmPSIjZ3p0ZWxsIj5nenRlbGw8L2E+IChnekZpbGUgZmlsZSk7Cis8bGk+IGludCAgICAgPGEgaHJlZj0iI2d6cmV3aW5kIj5nenJld2luZDwvYT4gKGd6RmlsZSBmaWxlKTsKKzxsaT4gaW50ICA8YSBocmVmPSIjZ3plb2YiPmd6ZW9mPC9hPiAoZ3pGaWxlIGZpbGUpOworPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnemNsb3NlIj5nemNsb3NlPC9hPiAoZ3pGaWxlIGZpbGUpOworPGxpPiBjb25zdCBjaGFyICogIDxhIGhyZWY9IiNnemVycm9yIj5nemVycm9yPC9hPiAoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKTsKKzwvdWw+Cis8aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+Cis8ZGw+Cis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImNvbXByZXNzIj5jb21wcmVzczwvYT4gKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCisgICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgMC4xJSBsYXJnZXIgdGhhbgorICAgc291cmNlTGVuIHBsdXMgMTIgYnl0ZXMuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCisgICBjb21wcmVzc2VkIGJ1ZmZlci48cD4KKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiBhIHdob2xlIGZpbGUgYXQgb25jZSBpZiB0aGUKKyAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC48cD4KKyAgICAgPGEgaHJlZj0iI2NvbXByZXNzIj5jb21wcmVzczwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIuPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iY29tcHJlc3MyIj5jb21wcmVzczI8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwgaW50IGxldmVsKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKKyAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPi4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQorICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4gc291cmNlTGVuIHBsdXMKKyAgIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKyAgIDxwPgorCisgICAgIDxhIGhyZWY9IiNjb21wcmVzczIiPmNvbXByZXNzMjwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwKKyAgIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBsZXZlbCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9InVuY29tcHJlc3MiPnVuY29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7PC9mb250PgorPGRkPgorICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCisgICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCisgICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCisgICBiZWVuIHNhdmVkIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IKKyAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCisgICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4gPHA+CisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZGVjb21wcmVzcyBhIHdob2xlIGZpbGUgYXQgb25jZSBpZiB0aGUKKyAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC4KKyAgIDxwPgorCisgICAgIDxhIGhyZWY9IiN1bmNvbXByZXNzIj51bmNvbXByZXNzPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlciwgb3IgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkLgorICAgPHA+CisKKzxkdD4gdHlwZWRlZiB2b2lkcCBnekZpbGU7Cis8ZGQ+IDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgZ3pGaWxlICA8YSBuYW1lPSJnem9wZW4iPmd6b3BlbjwvYT4gIChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgorICAgaXMgYXMgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikgYnV0IGNhbiBhbHNvIGluY2x1ZGUgYSBjb21wcmVzc2lvbiBsZXZlbAorICAgKCJ3YjkiKSBvciBhIHN0cmF0ZWd5OiAnZicgZm9yIGZpbHRlcmVkIGRhdGEgYXMgaW4gIndiNmYiLCAnaCcgZm9yCisgICBIdWZmbWFuIG9ubHkgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLiAoU2VlIHRoZSBkZXNjcmlwdGlvbgorICAgb2YgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RyYXRlZ3kgcGFyYW1ldGVyLikKKyAgIDxwPgorCisgICAgIDxhIGhyZWY9IiNnem9wZW4iPmd6b3BlbjwvYT4gY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0IDsgaW4gdGhpcworICAgY2FzZSA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQgZGVjb21wcmVzc2lvbi4KKyAgIDxwPgorCisgICAgIDxhIGhyZWY9IiNnem9wZW4iPmd6b3BlbjwvYT4gcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCisgICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gOyBlcnJubworICAgY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlCisgICB6bGliIGVycm9yIGlzIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+KS4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBnekZpbGUgIDxhIG5hbWU9Imd6ZG9wZW4iPmd6ZG9wZW48L2E+ICAoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIDxhIGhyZWY9IiNnemRvcGVuIj5nemRvcGVuPC9hPigpIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZQorICAgZGVzY3JpcHRvcnMgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yCisgICBmaWxlbm8gKGluIHRoZSBmaWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLgorICAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIDxhIGhyZWY9IiNnem9wZW4iPmd6b3BlbjwvYT4uCisgICA8cD4KKyAgICAgVGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjZ3pjbG9zZSI+Z3pjbG9zZTwvYT4gb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlCisgICBmaWxlIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkKSwgbW9kZSkgY2xvc2VzIHRoZSBmaWxlCisgICBkZXNjcmlwdG9yIGZkLiBJZiB5b3Ugd2FudCB0byBrZWVwIGZkIG9wZW4sIHVzZSA8YSBocmVmPSIjZ3pkb3BlbiI+Z3pkb3BlbjwvYT4oZHVwKGZkKSwgbW9kZSkuCisgICA8cD4KKyAgICAgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+IHJldHVybnMgTlVMTCBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZQorICAgdGhlIChkZSljb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9Imd6c2V0cGFyYW1zIj5nenNldHBhcmFtczwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7PC9mb250PgorPGRkPgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIG9yIHN0cmF0ZWd5LiBTZWUgdGhlIGRlc2NyaXB0aW9uCisgICBvZiA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IGZvciB0aGUgbWVhbmluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzLgorICAgPHA+CisgICAgIDxhIGhyZWY9IiNnenNldHBhcmFtcyI+Z3pzZXRwYXJhbXM8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBmaWxlIHdhcyBub3QKKyAgIG9wZW5lZCBmb3Igd3JpdGluZy4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6cmVhZCI+Z3pyZWFkPC9hPiAgKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7PC9mb250PgorPGRkPgorICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IGNvcGllcyB0aGUgZ2l2ZW4gbnVtYmVyCisgICBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCisgICA8cD4KKyAgICAgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yCisgICBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6d3JpdGUiPmd6d3JpdGU8L2E+IChnekZpbGUgZmlsZSwgY29uc3Qgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pOzwvZm9udD4KKzxkZD4KKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIDxhIGhyZWY9IiNnendyaXRlIj5nendyaXRlPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4KKyAgICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCBWQSAgIDxhIG5hbWU9Imd6cHJpbnRmIj5nenByaW50ZjwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7PC9mb250PgorPGRkPgorICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCisgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiA8YSBocmVmPSIjZ3pwcmludGYiPmd6cHJpbnRmPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZ3pwdXRzIj5nenB1dHM8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcyk7PC9mb250PgorPGRkPgorICAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZworICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgorICAgPHA+CisgICAgICA8YSBocmVmPSIjZ3pwdXRzIj5nenB1dHM8L2E+IHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gY2hhciAqICA8YSBuYW1lPSJnemdldHMiPmd6Z2V0czwvYT4gKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pOzwvZm9udD4KKzxkZD4KKyAgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvcgorICAgYSBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCisgICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBUaGUgc3RyaW5nIGlzIHRoZW4gdGVybWluYXRlZCB3aXRoIGEgbnVsbAorICAgY2hhcmFjdGVyLgorICAgPHA+CisgICAgICA8YSBocmVmPSIjZ3pnZXRzIj5nemdldHM8L2E+IHJldHVybnMgYnVmLCBvciA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnenB1dGMiPmd6cHV0YzwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgYyk7PC9mb250PgorPGRkPgorICAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICA8YSBocmVmPSIjZ3pwdXRjIj5nenB1dGM8L2E+IHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemdldGMiPmd6Z2V0YzwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgICBSZWFkcyBvbmUgYnl0ZSBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuIDxhIGhyZWY9IiNnemdldGMiPmd6Z2V0YzwvYT4gcmV0dXJucyB0aGlzIGJ5dGUKKyAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemZsdXNoIj5nemZsdXNoPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCk7PC9mb250PgorPGRkPgorICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuIFRoZSBwYXJhbWV0ZXIKKyAgIGZsdXNoIGlzIGFzIGluIHRoZSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBmdW5jdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgorICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gPGEgaHJlZj0iI2d6ZXJyb3IiPmd6ZXJyb3I8L2E+IGJlbG93KS4gPGEgaHJlZj0iI2d6Zmx1c2giPmd6Zmx1c2g8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmCisgICB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGFuZCBhbGwgb3V0cHV0IGNvdWxkIGJlIGZsdXNoZWQuCisgICA8cD4KKyAgICAgPGEgaHJlZj0iI2d6Zmx1c2giPmd6Zmx1c2g8L2E+IHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgorICAgZGVncmFkZSBjb21wcmVzc2lvbi4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiB6X29mZl90ICAgICA8YSBuYW1lPSJnenNlZWsiPmd6c2VlazwvYT4gKGd6RmlsZSBmaWxlLCB6X29mZl90IG9mZnNldCwgaW50IHdoZW5jZSk7PC9mb250PgorPGRkPgorICAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IDxhIGhyZWY9IiNnenJlYWQiPmd6cmVhZDwvYT4gb3IgPGEgaHJlZj0iI2d6d3JpdGUiPmd6d3JpdGU8L2E+IG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGUgb2Zmc2V0IHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uIFRoZSB3aGVuY2UgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgaW4gbHNlZWsoMik7CisgICB0aGUgdmFsdWUgU0VFS19FTkQgaXMgbm90IHN1cHBvcnRlZC4KKyAgIDxwPgorICAgICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoaXMgZnVuY3Rpb24gaXMgZW11bGF0ZWQgYnV0IGNhbiBiZQorICAgZXh0cmVtZWx5IHNsb3cuIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQorICAgc3VwcG9ydGVkIDsgPGEgaHJlZj0iI2d6c2VlayI+Z3pzZWVrPC9hPiB0aGVuIGNvbXByZXNzZXMgYSBzZXF1ZW5jZSBvZiB6ZXJvZXMgdXAgdG8gdGhlIG5ldworICAgc3RhcnRpbmcgcG9zaXRpb24uCisgICA8cD4KKyAgICAgIDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4gcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9mZnNldCBsb2NhdGlvbiBhcyBtZWFzdXJlZCBpbiBieXRlcyBmcm9tCisgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLCBpbgorICAgcGFydGljdWxhciBpZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcgYW5kIHRoZSBuZXcgc3RhcnRpbmcgcG9zaXRpb24KKyAgIHdvdWxkIGJlIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6cmV3aW5kIj5nenJld2luZDwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCisgICAgIDxwPgorICAgPGEgaHJlZj0iI2d6cmV3aW5kIj5nenJld2luZDwvYT4oZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KTxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4oZmlsZSwgMEwsIFNFRUtfU0VUKQorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHpfb2ZmX3QgICAgIDxhIG5hbWU9Imd6dGVsbCI+Z3p0ZWxsPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KKzxkZD4KKyAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IDxhIGhyZWY9IiNnenJlYWQiPmd6cmVhZDwvYT4gb3IgPGEgaHJlZj0iI2d6d3JpdGUiPmd6d3JpdGU8L2E+IG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCisgICA8cD4KKworICAgPGEgaHJlZj0iI2d6dGVsbCI+Z3p0ZWxsPC9hPihmaWxlKSBpcyBlcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4oZmlsZSwgMEwsIFNFRUtfQ1VSKQorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZ3plb2YiPmd6ZW9mPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KKzxkZD4KKyAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KKyAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemNsb3NlIj5nemNsb3NlPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KKzxkZD4KKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZQorICAgYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCisgICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiA8YSBocmVmPSIjZ3plcnJvciI+Z3plcnJvcjwvYT4gYmVsb3cpLgorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGNvbnN0IGNoYXIgKiAgPGEgbmFtZT0iZ3plcnJvciI+Z3plcnJvcjwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgKmVycm51bSk7PC9mb250PgorPGRkPgorICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gZXJybnVtIGlzIHNldCB0byB6bGliIGVycm9yIG51bWJlci4gSWYgYW4KKyAgIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbm90IGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LAorICAgZXJybnVtIGlzIHNldCB0byA8YSBocmVmPSIjWl9FUlJOTyI+Wl9FUlJOTzwvYT4gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubworICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgorICAgPHA+Cis8L2RsPgorPGhyPgorPGEgbmFtZT0iQmFzaWMgZnVuY3Rpb25zIj48aDI+IEJhc2ljIGZ1bmN0aW9ucyA8L2gyPgorPGgzPiBGdW5jdGlvbiBsaXN0IDwvaDM+Cis8dWw+Cis8bGk+ICBjb25zdCBjaGFyICogIDxhIGhyZWY9IiN6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+ICh2b2lkKTsKKzxsaT4gIGludCAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGxldmVsKTsKKzxsaT4gIGludCAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBmbHVzaCk7Cis8bGk+ICBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKKzxsaT4gIGludCAgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Cis8bGk+ICBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgZmx1c2gpOworPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Cis8L3VsPgorCis8aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+Cis8ZGw+Cis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgY29uc3QgY2hhciAqICA8YSBuYW1lPSJ6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+ICh2b2lkKTs8L2ZvbnQ+Cis8ZGQ+IFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSA8YSBocmVmPSIjemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KKyAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCisgICBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICBUaGlzIGNoZWNrIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBhbmQgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4uCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBsZXZlbCk7PC9mb250PgorPGRkPgorICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGZvciBjb21wcmVzc2lvbi4gVGhlIGZpZWxkcworICAgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4KKyAgIElmIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFyZSBzZXQgdG8gPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gdXBkYXRlcyB0aGVtIHRvCisgICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKyAgIDxwPgorCisgICAgIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBtdXN0IGJlIDxhIGhyZWY9IiNaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4sIG9yIGJldHdlZW4gMCBhbmQgOToKKyAgIDEgZ2l2ZXMgYmVzdCBzcGVlZCwgOSBnaXZlcyBiZXN0IGNvbXByZXNzaW9uLCAwIGdpdmVzIG5vIGNvbXByZXNzaW9uIGF0CisgICBhbGwgKHRoZSBpbnB1dCBkYXRhIGlzIHNpbXBseSBjb3BpZWQgYSBibG9jayBhdCBhIHRpbWUpLgorICAgPHA+CisKKyAgIDxhIGhyZWY9IiNaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4gcmVxdWVzdHMgYSBkZWZhdWx0IGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQKKyAgIGNvbXByZXNzaW9uIChjdXJyZW50bHkgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KKyAgIDxwPgorCisgICAgIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGxldmVsIGlzIG5vdCBhIHZhbGlkIGNvbXByZXNzaW9uIGxldmVsLAorICAgPGEgaHJlZj0iI1pfVkVSU0lPTl9FUlJPUiI+Wl9WRVJTSU9OX0VSUk9SPC9hPiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKDxhIGhyZWY9IiN6bGliX3ZlcnNpb24iPnpsaWJfdmVyc2lvbjwvYT4pIGlzIGluY29tcGF0aWJsZQorICAgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuCisgICA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLgorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImRlZmxhdGUiPmRlZmxhdGU8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBmbHVzaCk7PC9mb250PgorPGRkPgorICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZSBzb21lCisgIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCisgIGZvcmNlZCB0byBmbHVzaC48cD4KKworICAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKKyAgZm9sbG93aW5nIGFjdGlvbnM6CisKKyAgPHVsPgorICA8bGk+IENvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCB1cGRhdGUgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPgorICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IGFyZSB1cGRhdGVkIGFuZAorICAgIHByb2Nlc3Npbmcgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS4KKworICA8bGk+IAorICAgIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIHVwZGF0ZSA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPgorICAgIGFjY29yZGluZ2x5LiBUaGlzIGFjdGlvbiBpcyBmb3JjZWQgaWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBub24gemVyby4KKyAgICBGb3JjaW5nIGZsdXNoIGZyZXF1ZW50bHkgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvLCBzbyB0aGlzIHBhcmFtZXRlcgorICAgIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIG5lY2Vzc2FyeSAoaW4gaW50ZXJhY3RpdmUgYXBwbGljYXRpb25zKS4KKyAgICBTb21lIG91dHB1dCBtYXkgYmUgcHJvdmlkZWQgZXZlbiBpZiBmbHVzaCBpcyBub3Qgc2V0LgorICA8L3VsPiA8cD4KKworICBCZWZvcmUgdGhlIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCisgIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gb3IgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBhY2NvcmRpbmdseSA7IDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4KKyAgc2hvdWxkIG5ldmVyIGJlIHplcm8gYmVmb3JlIHRoZSBjYWxsLiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlCisgIGNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvciBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbAorICAoPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLiBJZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4KKyAgYW5kIHdpdGggemVybyA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUKKyAgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisgIDxwPgorCisgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzCisgIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQgaXMgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIHNvCisgIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuIChJbiBwYXJ0aWN1bGFyCisgIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IGlzIHplcm8gYWZ0ZXIgdGhlIGNhbGwgaWYgZW5vdWdoIG91dHB1dCBzcGFjZSBoYXMgYmVlbiBwcm92aWRlZAorICBiZWZvcmUgdGhlIGNhbGwuKSAgRmx1c2hpbmcgbWF5IGRlZ3JhZGUgY29tcHJlc3Npb24gZm9yIHNvbWUgY29tcHJlc3Npb24KKyAgYWxnb3JpdGhtcyBhbmQgc28gaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4KKyAgPHA+CisKKyAgICBJZiBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPiwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKKyAgPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgYW5kIHRoZSBjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBpcyByZXNldCBzbyB0aGF0IGRlY29tcHJlc3Npb24gY2FuCisgIHJlc3RhcnQgZnJvbSB0aGlzIHBvaW50IGlmIHByZXZpb3VzIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBkYW1hZ2VkIG9yIGlmCisgIHJhbmRvbSBhY2Nlc3MgaXMgZGVzaXJlZC4gVXNpbmcgPGEgaHJlZj0iI1pfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPiB0b28gb2Z0ZW4gY2FuIHNlcmlvdXNseSBkZWdyYWRlCisgIHRoZSBjb21wcmVzc2lvbi4KKyAgPHA+CisKKyAgICBJZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgorICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCisgIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4pLCB1bnRpbCB0aGUgZmx1c2ggaXMgY29tcGxldGUgKDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIHdpdGggbm9uLXplcm8KKyAgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPikuCisgIDxwPgorCisgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4sIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkLAorICBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIGFuZCA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gaWYgdGhlcmUKKyAgd2FzIGVub3VnaCBvdXRwdXQgc3BhY2UgOyBpZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCisgIGNhbGxlZCBhZ2FpbiB3aXRoIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+KSBidXQgbm8KKyAgbW9yZSBpbnB1dCBkYXRhLCB1bnRpbCBpdCByZXR1cm5zIHdpdGggPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBvciBhbiBlcnJvci4gQWZ0ZXIKKyAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGhhcyByZXR1cm5lZCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+LCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZQorICBzdHJlYW0gYXJlIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4gb3IgPGEgaHJlZj0iI2RlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+LgorICA8cD4KKyAgCisgICAgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4gY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gaWYgYWxsIHRoZSBjb21wcmVzc2lvbgorICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuIEluIHRoaXMgY2FzZSwgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBtdXN0IGJlIGF0IGxlYXN0CisgIDAuMSUgbGFyZ2VyIHRoYW4gPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gcGx1cyAxMiBieXRlcy4gIElmIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBkb2VzIG5vdCByZXR1cm4KKyAgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiwgdGhlbiBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhcyBkZXNjcmliZWQgYWJvdmUuCisgIDxwPgorCisgICAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkgc2V0cyBzdHJtLSZndCA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiB0byB0aGUgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtIG9mIGFsbCBpbnB1dCByZWFkCisgIHNvIGZhciAodGhhdCBpcywgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gYnl0ZXMpLgorICA8cD4KKworICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIG1heSB1cGRhdGUgPGEgaHJlZj0iI2RhdGFfdHlwZSI+ZGF0YV90eXBlPC9hPiBpZiBpdCBjYW4gbWFrZSBhIGdvb2QgZ3Vlc3MgYWJvdXQKKyAgdGhlIGlucHV0IGRhdGEgdHlwZSAoPGEgaHJlZj0iI1pfQVNDSUkiPlpfQVNDSUk8L2E+IG9yIDxhIGhyZWY9IiNaX0JJTkFSWSI+Wl9CSU5BUlk8L2E+KS4gSW4gZG91YnQsIHRoZSBkYXRhIGlzIGNvbnNpZGVyZWQKKyAgYmluYXJ5LiBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QKKyAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgorICA8cD4KKworICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAorICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IGlmIGFsbCBpbnB1dCBoYXMgYmVlbgorICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bworICA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgaWYgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IG9yIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IHdhcyBOVUxMKSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKKyAgKGZvciBleGFtcGxlIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IG9yIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gd2FzIHplcm8pLgorICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgorPGRkPgorICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgorICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQorICAgcGVuZGluZyBvdXRwdXQuCisgICA8cD4KKworICAgICA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlCisgICBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCwgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAorICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiBJbiB0aGUgZXJyb3IgY2FzZSwKKyAgIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQorICAgZGVhbGxvY2F0ZWQpLgorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgorPGRkPiAgICAgCisJSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBmb3IgZGVjb21wcmVzc2lvbi4gVGhlIGZpZWxkcworICAgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+LCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKKyAgIHRoZSBjYWxsZXIuIElmIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBpcyBub3QgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gaXMgbGFyZ2UgZW5vdWdoICh0aGUgZXhhY3QKKyAgIHZhbHVlIGRlcGVuZHMgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCksIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGRldGVybWluZXMgdGhlCisgICBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSB0aGUgemxpYiBoZWFkZXIgYW5kIGFsbG9jYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzCisgICBhY2NvcmRpbmdseSA7IG90aGVyd2lzZSB0aGUgYWxsb2NhdGlvbiB3aWxsIGJlIGRlZmVycmVkIHRvIHRoZSBmaXJzdCBjYWxsIG9mCisgICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4uICBJZiA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBhcmUgc2V0IHRvIDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4sIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IHVwZGF0ZXMgdGhlbSB0bworICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisgICA8cD4KKworICAgICA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCA8YSBocmVmPSIjWl9WRVJTSU9OX0VSUk9SIj5aX1ZFUlNJT05fRVJST1I8L2E+IGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKKyAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLiAgPGEgaHJlZj0iI21zZyI+bXNnPC9hPiBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvcgorICAgbWVzc2FnZS4gPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcKKyAgIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKS4gIChTbyA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kCisgICA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBtYXkgYmUgbW9kaWZpZWQsIGJ1dCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBhcmUgdW5jaGFuZ2VkLikKKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJpbmZsYXRlIj5pbmZsYXRlPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgZmx1c2gpOzwvZm9udD4KKzxkZD4KKyAgICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IHNvbWUKKyAgaW50cm9kdWNlIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkKKyAgZXhjZXB0IHdoZW4gZm9yY2VkIHRvIGZsdXNoLgorICA8cD4KKworICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIDx1bD4KKyAgPGxpPiBEZWNvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCB1cGRhdGUgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPgorICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gaXMgdXBkYXRlZCBhbmQgcHJvY2Vzc2luZworICAgIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuCisKKyAgPGxpPiBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCB1cGRhdGUgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIAorICAgIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYWNjb3JkaW5nbHkuICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwgCisgICAgdW50aWwgdGhlcmUgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgCisgICAgKHNlZSBiZWxvdyBhYm91dCB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KKyAgPC91bD4gPHA+CisKKyAgQmVmb3JlIHRoZSBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0CisgIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZworICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIHRoZSBuZXh0XyogYW5kIGF2YWlsXyogdmFsdWVzIGFjY29yZGluZ2x5LgorICBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yCisgIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsICg8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+ID09IDApLCBvciBhZnRlciBlYWNoCisgIGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuIElmIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBhbmQgd2l0aCB6ZXJvIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4sIGl0CisgIG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUKKyAgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KKyAgPHA+CisKKyAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byA8YSBocmVmPSIjWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+LCA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gZmx1c2hlcyBhcyBtdWNoCisgIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlIGZsdXNoaW5nIGJlaGF2aW9yIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBpcworICBub3Qgc3BlY2lmaWVkIGZvciB2YWx1ZXMgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBvdGhlciB0aGFuIDxhIGhyZWY9IiNaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4KKyAgYW5kIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+LCBidXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYWN0dWFsbHkgZmx1c2hlcyBhcyBtdWNoIG91dHB1dAorICBhcyBwb3NzaWJsZSBhbnl3YXkuCisgIDxwPgorCisgICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb3IgYW4KKyAgZXJyb3IuIEhvd2V2ZXIgaWYgYWxsIGRlY29tcHJlc3Npb24gaXMgdG8gYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIHN0ZXAKKyAgKGEgc2luZ2xlIGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvCisgIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+LiBJbiB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZworICBvdXRwdXQgaXMgZmx1c2hlZCA7IDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlCisgIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4gc2F2ZWQKKyAgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0CisgIGJlIDxhIGhyZWY9IiNpbmZsYXRlRW5kIj5pbmZsYXRlRW5kPC9hPiB0byBkZWFsbG9jYXRlIHRoZSBkZWNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LiBUaGUgdXNlIG9mIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+CisgIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiB0aGF0IGEgZmFzdGVyIHJvdXRpbmUKKyAgbWF5IGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgY2FsbC4KKyAgPHA+CisKKyAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCAoc2VlIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+CisgIGJlbG93KSwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IHNldHMgc3RybS08YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiB0byB0aGUgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtIG9mIHRoZQorICBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyA8YSBocmVmPSIjWl9ORUVEX0RJQ1QiPlpfTkVFRF9ESUNUPC9hPiA7IG90aGVyd2lzZSAKKyAgaXQgc2V0cyBzdHJtLSZndCA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiB0byB0aGUgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQKKyAgc28gZmFyICh0aGF0IGlzLCA8YSBocmVmPSIjdG90YWxfb3V0Ij50b3RhbF9vdXQ8L2E+IGJ5dGVzKSBhbmQgcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4sIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb3IKKyAgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkKKyAgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZQorICBjb21wcmVzc29yIGFuZCByZXR1cm5zIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KKyAgPHA+CisKKyAgICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCisgIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCisgIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIDxhIGhyZWY9IiNaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+IGlmIGEKKyAgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIGlucHV0IGRhdGEgd2FzCisgIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QKKyAgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtKSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudAorICAoZm9yIGV4YW1wbGUgaWYgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IG9yIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IHdhcyBOVUxMKSwgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAorICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90CisgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4gPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4gaXMgdXNlZC4gSW4gdGhlIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4KKyAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuIGNhbGwgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gdG8gbG9vayBmb3IgYSBnb29kCisgIGNvbXByZXNzaW9uIGJsb2NrLgorICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgorPGRkPgorICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgorICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQorICAgcGVuZGluZyBvdXRwdXQuCisgICA8cD4KKworICAgICA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPgorICAgd2FzIGluY29uc2lzdGVudC4gSW4gdGhlIGVycm9yIGNhc2UsIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQorICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgorPC9kbD4KKzxocj4KKzxhIG5hbWU9IkFkdmFuY2VkIGZ1bmN0aW9ucyI+PGgyPiBBZHZhbmNlZCBmdW5jdGlvbnMgPC9oMj4KKyAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIG9ubHkgaW4gc29tZSBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KKzxoMz4gRnVuY3Rpb24gbGlzdCA8L2gzPgorPHVsPgorPGxpPiAgaW50ICA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sCis8bGk+IGludCAgPGEgaHJlZj0iI2RlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOworPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlQ29weSI+ZGVmbGF0ZUNvcHk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IGRlc3QsIDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc291cmNlKTsKKzxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOworPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7Cis8bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgIHdpbmRvd0JpdHMpOworPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwgdUludCAgZGljdExlbmd0aCk7Cis8bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Cis8bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVSZXNldCI+aW5mbGF0ZVJlc2V0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKKworPC91bD4KKzxoMz4gRnVuY3Rpb24gZGVzY3JpcHRpb24gPC9oMz4KKzxkbD4KKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImRlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgIGxldmVsLCBpbnQgIG1ldGhvZCwgaW50ICB3aW5kb3dCaXRzLCBpbnQgIG1lbUxldmVsLCBpbnQgIHN0cmF0ZWd5KTs8L2ZvbnQ+CisKKzxkZD4gVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gd2l0aCBtb3JlIGNvbXByZXNzaW9uIG9wdGlvbnMuIFRoZQorICAgZmllbGRzIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKKyAgIHRoZSBjYWxsZXIuPHA+CisKKyAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gSXQgbXVzdCBiZSA8YSBocmVmPSIjWl9ERUZMQVRFRCI+Wl9ERUZMQVRFRDwvYT4gaW4KKyAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS48cD4KKworICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUKKyAgICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IgdGhpcworICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCisgICBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmCisgICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBpcyB1c2VkIGluc3RlYWQuPHA+CisKKyAgICAgVGhlIG1lbUxldmVsIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQKKyAgIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQKKyAgIGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW8gOyBtZW1MZXZlbD05IHVzZXMgbWF4aW11bSBtZW1vcnkKKyAgIGZvciBvcHRpbWFsIHNwZWVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5CisgICB1c2FnZSBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLjxwPgorCisgICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uIFVzZSB0aGUKKyAgIHZhbHVlIDxhIGhyZWY9IiNaX0RFRkFVTFRfU1RSQVRFR1kiPlpfREVGQVVMVF9TVFJBVEVHWTwvYT4gZm9yIG5vcm1hbCBkYXRhLCA8YSBocmVmPSIjWl9GSUxURVJFRCI+Wl9GSUxURVJFRDwvYT4gZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQorICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBvciA8YSBocmVmPSIjWl9IVUZGTUFOX09OTFkiPlpfSFVGRk1BTl9PTkxZPC9hPiB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCisgICBzdHJpbmcgbWF0Y2gpLiAgRmlsdGVyZWQgZGF0YSBjb25zaXN0cyBtb3N0bHkgb2Ygc21hbGwgdmFsdWVzIHdpdGggYQorICAgc29tZXdoYXQgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzCisgICB0dW5lZCB0byA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiB0aGVtIGJldHRlci4gVGhlIGVmZmVjdCBvZiA8YSBocmVmPSIjWl9GSUxURVJFRCI+Wl9GSUxURVJFRDwvYT4gaXMgdG8gZm9yY2UgbW9yZQorICAgSHVmZm1hbiBjb2RpbmcgYW5kIGxlc3Mgc3RyaW5nIG1hdGNoaW5nIDsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlCisgICBiZXR3ZWVuIFpfREVGQVVMVCBhbmQgPGEgaHJlZj0iI1pfSFVGRk1BTl9PTkxZIj5aX0hVRkZNQU5fT05MWTwvYT4uIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgb25seSBhZmZlY3RzCisgICB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4KKyAgIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS48cD4KKworICAgICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKKyAgIG1ldGhvZCkuIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gZG9lcworICAgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS48cD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwgdUludCAgZGljdExlbmd0aCk7PC9mb250PgorPGRkPgorICAgICBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlCisgICB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKKyAgIGltbWVkaWF0ZWx5IGFmdGVyIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+LCA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IG9yIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4sIGJlZm9yZSBhbnkKKyAgIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+LiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKKyAgIGRpY3Rpb25hcnkgKHNlZSA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPikuPHA+CisKKyAgICAgVGhlIGRpY3Rpb25hcnkgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseQorICAgdG8gYmUgZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seQorICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQorICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQorICAgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeSA7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyIHRoYW4KKyAgIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS48cD4KKworICAgICBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIGRhdGEgc3RydWN0dXJlcyBzZWxlY3RlZCBieQorICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gb3IgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiwgYSBwYXJ0IG9mIHRoZSBkaWN0aW9uYXJ5IG1heSBpbiBlZmZlY3QgYmUKKyAgIGRpc2NhcmRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdyBzaXplIGluCisgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gb3IgZGVmbGF0ZTIuIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZnVsIHNob3VsZCBiZQorICAgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuPHA+CisKKyAgICAgVXBvbiByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbiwgc3RybS0mZ3QgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gaXMgc2V0IHRvIHRoZSBBZGxlcjMyIHZhbHVlCisgICBvZiB0aGUgZGljdGlvbmFyeSA7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQorICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAoVGhlIEFkbGVyMzIgdmFsdWUKKyAgIGFwcGxpZXMgdG8gdGhlIHdob2xlIGRpY3Rpb25hcnkgZXZlbiBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBkaWN0aW9uYXJ5IGlzCisgICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLik8cD4KKworICAgICA8YSBocmVmPSIjZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhCisgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBOVUxMIGRpY3Rpb25hcnkpIG9yIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gaXMKKyAgIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUgaWYgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQorICAgb3IgaWYgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBic29ydCkuIDxhIGhyZWY9IiNkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBkZXN0LCA8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHNvdXJjZSk7PC9mb250PgorPGRkPgorICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLjxwPgorCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHNldmVyYWwgY29tcHJlc3Npb24gc3RyYXRlZ2llcyB3aWxsIGJlCisgICB0cmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIHByZS1wcm9jZXNzaW5nIHRoZSBpbnB1dAorICAgZGF0YSB3aXRoIGEgZmlsdGVyLiBUaGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgZGlzY2FyZGVkIHNob3VsZCB0aGVuIGJlIGZyZWVkCisgICBieSBjYWxsaW5nIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPi4gIE5vdGUgdGhhdCA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAorICAgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kCisgICBjYW4gY29uc3VtZSBsb3RzIG9mIG1lbW9yeS48cD4KKworICAgICA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50CisgICAoc3VjaCBhcyA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGJlaW5nIE5VTEwpLiA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAorICAgZGVzdGluYXRpb24uPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KKzxkZD4gICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gZm9sbG93ZWQgYnkgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4sCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LgorICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGFueSBvdGhlciBhdHRyaWJ1dGVzCisgICB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4uPHA+CisKKyAgICAgIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2Vzcywgb3IgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBvciA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBiZWluZyBOVUxMKS48cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7PC9mb250PgorPGRkPgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQorICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4uICBUaGlzIGNhbiBiZQorICAgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQgZGF0YSwgb3IKKyAgIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IGRhdGEgcmVxdWlyaW5nIGEgZGlmZmVyZW50CisgICBzdHJhdGVneS4gSWYgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGNoYW5nZWQsIHRoZSBpbnB1dCBhdmFpbGFibGUgc28gZmFyCisgICBpcyBjb21wcmVzc2VkIHdpdGggdGhlIG9sZCBsZXZlbCAoYW5kIG1heSBiZSBmbHVzaGVkKTsgdGhlIG5ldyBsZXZlbCB3aWxsCisgICB0YWtlIGVmZmVjdCBvbmx5IGF0IHRoZSBuZXh0IGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuPHA+CisKKyAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiwgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBtdXN0IGJlIHNldCBhcyBmb3IKKyAgIGEgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSwgc2luY2UgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgaW5wdXQgbWF5IGhhdmUgdG8KKyAgIGJlIGNvbXByZXNzZWQgYW5kIGZsdXNoZWQuIEluIHBhcnRpY3VsYXIsIHN0cm0tJmd0IDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gbXVzdCBiZSAKKyAgIG5vbi16ZXJvLjxwPgorCisgICAgIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCBvciBpZiBhIHBhcmFtZXRlciB3YXMgaW52YWxpZCwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4KKyAgIGlmIHN0cm0tJmd0YXZhaWxfb3V0IHdhcyB6ZXJvLjxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImluZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgIHdpbmRvd0JpdHMpOzwvZm9udD4KKworPGRkPiAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuIFRoZQorICAgZmllbGRzIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiwgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4sIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IG11c3QgYmUgaW5pdGlhbGl6ZWQKKyAgIGJlZm9yZSBieSB0aGUgY2FsbGVyLjxwPgorCisgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdworICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGlzIHVzZWQKKyAgIGluc3RlYWQuIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cgc2l6ZSBpcyBnaXZlbiBhcworICAgaW5wdXQsIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpIHdpbGwgcmV0dXJuIHdpdGggdGhlIGVycm9yIGNvZGUgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpbnN0ZWFkIG9mCisgICB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LjxwPgorCisgICAgICA8YSBocmVmPSIjaW5mbGF0ZUluaXQyIj5pbmZsYXRlSW5pdDI8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYSBuZWdhdGl2ZQorICAgbWVtTGV2ZWwpLiA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICA8YSBocmVmPSIjaW5mbGF0ZUluaXQyIj5pbmZsYXRlSW5pdDI8L2E+CisgICBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uIGFwYXJ0IGZyb20gcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYKKyAgIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLiAoU28gPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBtYXkgYmUKKyAgIG1vZGlmaWVkLCBidXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYXJlIHVuY2hhbmdlZC4pPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOzwvZm9udD4KKzxkZD4KKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGRlY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiB1bmNvbXByZXNzZWQgYnl0ZQorICAgc2VxdWVuY2UuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPgorICAgaWYgdGhpcyBjYWxsIHJldHVybmVkIDxhIGhyZWY9IiNaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+LiBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKKyAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIEFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBjYWxsIG9mCisgICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4uIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQorICAgZGljdGlvbmFyeSAoc2VlIDxhIGhyZWY9IiNkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+KS48cD4KKworICAgICA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhCisgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBOVUxMIGRpY3Rpb25hcnkpIG9yIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gaXMKKyAgIGluY29uc2lzdGVudCwgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQorICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgQWRsZXIzMiB2YWx1ZSkuIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBzdWJzZXF1ZW50IGNhbGxzIG9mCisgICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKS48cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KKworPGRkPiAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKKyAgZGVzY3JpcHRpb24gb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHdpdGggPGEgaHJlZj0iI1pfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPikgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKKyAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dCBpcyBwcm92aWRlZC48cD4KKworICAgIDxhIGhyZWY9IiNpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIGEgZnVsbCBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4KKyAgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgbm8gZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsCisgIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCisgIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCBjdXJyZW50IHZhbHVlIG9mIDxhIGhyZWY9IiN0b3RhbF9pbiI+dG90YWxfaW48L2E+IHdoaWNoCisgIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlCisgIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4sIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKKyAgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iaW5mbGF0ZVJlc2V0Ij5pbmZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KKzxkZD4KKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNpbmZsYXRlRW5kIj5pbmZsYXRlRW5kPC9hPiBmb2xsb3dlZCBieSA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiwKKyAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgZGVjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4KKyAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIGF0dHJpYnV0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSA8YSBocmVmPSIjaW5mbGF0ZUluaXQyIj5pbmZsYXRlSW5pdDI8L2E+LgorICAgPHA+CisKKyAgICAgIDxhIGhyZWY9IiNpbmZsYXRlUmVzZXQiPmluZmxhdGVSZXNldDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2Vzcywgb3IgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBvciA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBiZWluZyBOVUxMKS4KKyAgIDxwPgorPC9kbD4KKworPGhyPgorPGEgbmFtZT0iQ2hlY2tzdW0gZnVuY3Rpb25zIj48aDI+IENoZWNrc3VtIGZ1bmN0aW9ucyA8L2gyPgorICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKKyAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKKyAgIGNvbXByZXNzaW9uIGxpYnJhcnkuCis8aDM+IEZ1bmN0aW9uIGxpc3QgPC9oMz4KKzx1bD4KKzxsaT4gdUxvbmcgIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiAodUxvbmcgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4sIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTsKKzxsaT4gdUxvbmcgIDxhIGhyZWY9IiNjcmMzMiI+Y3JjMzI8L2E+ICAgKHVMb25nIGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pOworPC91bD4KKzxoMz4gRnVuY3Rpb24gZGVzY3JpcHRpb24gPC9oMz4KKzxkbD4KKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHVMb25nICA8YSBuYW1lPSJhZGxlcjMyIj5hZGxlcjMyPC9hPiAodUxvbmcgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4sIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIFVwZGF0ZSBhIHJ1bm5pbmcgQWRsZXItMzIgY2hlY2tzdW0gd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQKKyAgIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBjaGVja3N1bS4KKyAgIDxwPgorICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6CisgICA8cHJlPgorCisgICAgIHVMb25nIDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+ID0gPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+KDBMLCA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+LCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+ID0gPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+KDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+LCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+ICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworICAgPC9wcmU+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHVMb25nICA8YSBuYW1lPSJjcmMzMiI+Y3JjMzI8L2E+ICAgKHVMb25nIGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pOzwvZm9udD4KKzxkZD4KKyAgICAgVXBkYXRlIGEgcnVubmluZyBjcmMgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkCisgICBjcmMuIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUKKyAgIGZvciB0aGUgY3JjLiBQcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZyAob25lJ3MgY29tcGxlbWVudCkgaXMgcGVyZm9ybWVkCisgICB3aXRoaW4gdGhpcyBmdW5jdGlvbiBzbyBpdCBzaG91bGRuJ3QgYmUgZG9uZSBieSB0aGUgYXBwbGljYXRpb24uCisgICBVc2FnZSBleGFtcGxlOgorICAgPHByZT4KKworICAgICB1TG9uZyBjcmMgPSA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPigwTCwgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgMCk7CisKKyAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKKyAgICAgICBjcmMgPSA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPihjcmMsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgfQorICAgICBpZiAoY3JjICE9IG9yaWdpbmFsX2NyYykgZXJyb3IoKTsKKyAgIDwvcHJlPgorPC9kbD4KKzxocj4KKzxhIG5hbWU9InN0cnVjdCB6X3N0cmVhbV9zIj48aDI+IHN0cnVjdCB6X3N0cmVhbV9zIDwvaDI+Cis8Zm9udCBjb2xvcj0iQmx1ZSI+Cis8YSBuYW1lPSJ6X3N0cmVhbV9zIj4KKzxwcmU+Cit0eXBlZGVmIHN0cnVjdCB6X3N0cmVhbV9zIHsKKyAgICBCeXRlZiAgICAqPGEgbmFtZT0ibmV4dF9pbiI+bmV4dF9pbjwvYT47ICAvKiBuZXh0IGlucHV0IGJ5dGUgKi8KKyAgICB1SW50ICAgICA8YSBuYW1lPSJhdmFpbF9pbiI+YXZhaWxfaW48L2E+OyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gKi8KKyAgICB1TG9uZyAgICA8YSBuYW1lPSJ0b3RhbF9pbiI+dG90YWxfaW48L2E+OyAgLyogdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi8KKworICAgIEJ5dGVmICAgICo8YSBuYW1lPSJuZXh0X291dCI+bmV4dF9vdXQ8L2E+OyAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi8KKyAgICB1SW50ICAgICA8YSBuYW1lPSJhdmFpbF9vdXQiPmF2YWlsX291dDwvYT47IC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+ICovCisgICAgdUxvbmcgICAgPGEgbmFtZT0idG90YWxfb3V0Ij50b3RhbF9vdXQ8L2E+OyAvKiB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovCisKKyAgICBjaGFyICAgICAqPGEgbmFtZT0ibXNnIj5tc2c8L2E+OyAgICAgIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqLworICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKjxhIG5hbWU9InN0YXRlIj5zdGF0ZTwvYT47IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLworCisgICAgYWxsb2NfZnVuYyA8YSBuYW1lPSJ6YWxsb2MiPnphbGxvYzwvYT47ICAvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiAqLworICAgIGZyZWVfZnVuYyAgPGEgbmFtZT0iemZyZWUiPnpmcmVlPC9hPjsgICAvKiB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+ICovCisgICAgdm9pZHBmICAgICA8YSBuYW1lPSJvcGFxdWUiPm9wYXF1ZTwvYT47ICAvKiBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiAqLworCisgICAgaW50ICAgICA8YSBuYW1lPSJkYXRhX3R5cGUiPmRhdGFfdHlwZTwvYT47ICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGFzY2lpIG9yIGJpbmFyeSAqLworICAgIHVMb25nICAgPGEgbmFtZT0iYWRsZXIiPmFkbGVyPC9hPjsgICAgICAvKiA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgdUxvbmcgICA8YSBuYW1lPSJyZXNlcnZlZCI+cmVzZXJ2ZWQ8L2E+OyAgIC8qIDxhIGhyZWY9IiNyZXNlcnZlZCI+cmVzZXJ2ZWQ8L2E+IGZvciBmdXR1cmUgdXNlICovCit9IDxhIGhyZWY9IiN6X3N0cmVhbV9zIj56X3N0cmVhbTwvYT4gOworCit0eXBlZGVmIDxhIGhyZWY9IiN6X3N0cmVhbV9zIj56X3N0cmVhbTwvYT4gRkFSICogPGEgbmFtZT0iel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+OyAg/yAKKzwvcHJlPgorPC9mb250PgorICAgVGhlIGFwcGxpY2F0aW9uIG11c3QgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gd2hlbiA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBoYXMKKyAgIGRyb3BwZWQgdG8gemVyby4gSXQgbXVzdCB1cGRhdGUgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gd2hlbiA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+CisgICBoYXMgZHJvcHBlZCB0byB6ZXJvLiBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZAorICAgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiBiZWZvcmUgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZQorICAgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgbXVzdCBub3QgYmUgdXBkYXRlZCBieSB0aGUgYXBwbGljYXRpb24uIDxwPgorCisgICBUaGUgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0CisgICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+LiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGN1c3RvbQorICAgbWVtb3J5IG1hbmFnZW1lbnQuIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCisgICA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IHZhbHVlLiA8cD4KKworICAgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBtdXN0IHJldHVybiA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgorICAgSWYgemxpYiBpcyB1c2VkIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24sIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IG11c3QgYmUKKyAgIHRocmVhZCBzYWZlLiA8cD4KKworICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gbXVzdCBiZSBhYmxlIHRvIGFsbG9jYXRlCisgICBleGFjdGx5IDY1NTM2IGJ5dGVzLCBidXQgd2lsbCBub3QgYmUgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMKKyAgIGlmIHRoZSBzeW1ib2wgTUFYU0VHXzY0SyBpcyBkZWZpbmVkIChzZWUgemNvbmYuaCkuIFdBUk5JTkc6IE9uIE1TRE9TLAorICAgcG9pbnRlcnMgcmV0dXJuZWQgYnkgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBmb3Igb2JqZWN0cyBvZiBleGFjdGx5IDY1NTM2IGJ5dGVzICptdXN0KgorICAgaGF2ZSB0aGVpciBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uCisgICBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuIFRvIHJlZHVjZSBtZW1vcnkKKyAgIHJlcXVpcmVtZW50cyBhbmQgYXZvaWQgYW55IGFsbG9jYXRpb24gb2YgNjRLIG9iamVjdHMsIGF0IHRoZSBleHBlbnNlIG9mCisgICBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCisgICA8cD4KKworICAgVGhlIGZpZWxkcyA8YSBocmVmPSIjdG90YWxfaW4iPnRvdGFsX2luPC9hPiBhbmQgPGEgaHJlZj0iI3RvdGFsX291dCI+dG90YWxfb3V0PC9hPiBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvcgorICAgcHJvZ3Jlc3MgcmVwb3J0cy4gQWZ0ZXIgY29tcHJlc3Npb24sIDxhIGhyZWY9IiN0b3RhbF9pbiI+dG90YWxfaW48L2E+IGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mCisgICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IKKyAgIChwYXJ0aWN1bGFybHkgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4KKyAgIGEgc2luZ2xlIHN0ZXApLiA8cD4KKworPGhyPgorPGEgbmFtZT0iQ29uc3RhbnRzIj48aDI+IENvbnN0YW50cyA8L2gyPgorPGZvbnQgY29sb3I9IkJsdWUiPgorPHByZT4KKyNkZWZpbmUgPGEgbmFtZT0iWl9OT19GTFVTSCI+Wl9OT19GTFVTSDwvYT4gICAgICAwCisjZGVmaW5lIDxhIG5hbWU9IlpfUEFSVElBTF9GTFVTSCI+Wl9QQVJUSUFMX0ZMVVNIPC9hPiAxIAorCS8qIHdpbGwgYmUgcmVtb3ZlZCwgdXNlIDxhIGhyZWY9IiNaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4gaW5zdGVhZCAqLworI2RlZmluZSA8YSBuYW1lPSJaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4gICAgMgorI2RlZmluZSA8YSBuYW1lPSJaX0ZVTExfRkxVU0giPlpfRlVMTF9GTFVTSDwvYT4gICAgMworI2RlZmluZSA8YSBuYW1lPSJaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+ICAgICAgICA0CisvKiBBbGxvd2VkIGZsdXNoIHZhbHVlcyA7IHNlZSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBiZWxvdyBmb3IgZGV0YWlscyAqLworCisjZGVmaW5lIDxhIG5hbWU9IlpfT0siPlpfT0s8L2E+ICAgICAgICAgICAgMAorI2RlZmluZSA8YSBuYW1lPSJaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gICAgMQorI2RlZmluZSA8YSBuYW1lPSJaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+ICAgICAyCisjZGVmaW5lIDxhIG5hbWU9IlpfRVJSTk8iPlpfRVJSTk88L2E+ICAgICAgICAoLTEpCisjZGVmaW5lIDxhIG5hbWU9IlpfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gKC0yKQorI2RlZmluZSA8YSBuYW1lPSJaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gICAoLTMpCisjZGVmaW5lIDxhIG5hbWU9IlpfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gICAgKC00KQorI2RlZmluZSA8YSBuYW1lPSJaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+ICAgICgtNSkKKyNkZWZpbmUgPGEgbmFtZT0iWl9WRVJTSU9OX0VSUk9SIj5aX1ZFUlNJT05fRVJST1I8L2E+ICgtNikKKy8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQorICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KKyAqLworCisjZGVmaW5lIDxhIG5hbWU9IlpfTk9fQ09NUFJFU1NJT04iPlpfTk9fQ09NUFJFU1NJT048L2E+ICAgICAgICAgMAorI2RlZmluZSA8YSBuYW1lPSJaX0JFU1RfU1BFRUQiPlpfQkVTVF9TUEVFRDwvYT4gICAgICAgICAgICAgMQorI2RlZmluZSA8YSBuYW1lPSJaX0JFU1RfQ09NUFJFU1NJT04iPlpfQkVTVF9DT01QUkVTU0lPTjwvYT4gICAgICAgOQorI2RlZmluZSA8YSBuYW1lPSJaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4gICgtMSkKKy8qIGNvbXByZXNzaW9uIGxldmVscyAqLworCisjZGVmaW5lIDxhIG5hbWU9IlpfRklMVEVSRUQiPlpfRklMVEVSRUQ8L2E+ICAgICAgICAgICAgMQorI2RlZmluZSA8YSBuYW1lPSJaX0hVRkZNQU5fT05MWSI+Wl9IVUZGTUFOX09OTFk8L2E+ICAgICAgICAyCisjZGVmaW5lIDxhIG5hbWU9IlpfREVGQVVMVF9TVFJBVEVHWSI+Wl9ERUZBVUxUX1NUUkFURUdZPC9hPiAgICAwCisvKiBjb21wcmVzc2lvbiBzdHJhdGVneSA7IHNlZSA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+KCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSA8YSBuYW1lPSJaX0JJTkFSWSI+Wl9CSU5BUlk8L2E+ICAgMAorI2RlZmluZSA8YSBuYW1lPSJaX0FTQ0lJIj5aX0FTQ0lJPC9hPiAgICAxCisjZGVmaW5lIDxhIG5hbWU9IlpfVU5LTk9XTiI+Wl9VTktOT1dOPC9hPiAgMgorLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSA8YSBocmVmPSIjZGF0YV90eXBlIj5kYXRhX3R5cGU8L2E+IGZpZWxkICovCisKKyNkZWZpbmUgPGEgbmFtZT0iWl9ERUZMQVRFRCI+Wl9ERUZMQVRFRDwvYT4gICA4CisvKiBUaGUgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGNvbXByZXNzaW9uIG1ldGhvZCAodGhlIG9ubHkgb25lIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24pICovCisKKyNkZWZpbmUgPGEgbmFtZT0iWl9OVUxMIj5aX05VTEw8L2E+ICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+LCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+ICovCisKKyNkZWZpbmUgPGEgbmFtZT0iemxpYl92ZXJzaW9uIj56bGliX3ZlcnNpb248L2E+IDxhIGhyZWY9IiN6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+KCkKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgbGVzcyB0aGFuIDEuMC4yICovCis8L3ByZT4KKzwvZm9udD4KKworPGhyPgorPGEgbmFtZT0iTWlzYyI+PGgyPiBNaXNjIDwvaDI+CisgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gYW5kIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgorIGFuZCB0aGUgY29tcGlsZXIncyB2aWV3IG9mIDxhIGhyZWY9IiN6X3N0cmVhbV9zIj56X3N0cmVhbTwvYT4uCisgPHA+CisgT3RoZXIgZnVuY3Rpb25zOgorIDxkbD4KKyA8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBjb25zdCBjaGFyICAgKiAgPGEgbmFtZT0iekVycm9yIj56RXJyb3I8L2E+ICAgICAgICAgICAoaW50IGVycik7PC9mb250PgorIDxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgICAgICAgICA8YSBuYW1lPSJpbmZsYXRlU3luY1BvaW50Ij5pbmZsYXRlU3luY1BvaW50PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiB6KTs8L2ZvbnQ+CisgPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gY29uc3QgdUxvbmdmICogIDxhIG5hbWU9ImdldF9jcmNfdGFibGUiPmdldF9jcmNfdGFibGU8L2E+ICAgICh2b2lkKTs8L2ZvbnQ+CisgPC9kbD4KKyA8aHI+CisgPGZvbnQgc2l6ZT0iLTEiPgorIExhc3QgdXBkYXRlOiBXZWQgT2N0IDEzIDIwOjQyOjM0IDE5OTk8YnI+CisgcGlhcGlAY3NpZS5udHUuZWR1LnR3CisgPC9mb250PgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi96dXRpbC5jIGIvY29tbW9uL3psaWIvenV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWJlYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvenV0aWwuYwpAQCAtMCwwICsxLDIyNSBAQAorLyogenV0aWwuYyAtLSB0YXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogQCgjKSAkSWQ6IHp1dGlsLmMsdiAxLjEgMjAwNC8xMC8wOCAwOTo0NDoyOCBjb25zdF9rIEV4cCAkICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgICAgICB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKworI2lmbmRlZiBTVERDCitleHRlcm4gdm9pZCBleGl0IE9GKChpbnQpKTsKKyNlbmRpZgorCitjb25zdCBjaGFyICp6X2Vycm1zZ1sxMF0gPSB7CisibmVlZCBkaWN0aW9uYXJ5IiwgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovCisic3RyZWFtIGVuZCIsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovCisiIiwgICAgICAgICAgICAgICAgICAgIC8qIFpfT0sgICAgICAgICAgICAgIDAgICovCisiZmlsZSBlcnJvciIsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovCisic3RyZWFtIGVycm9yIiwgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovCisiZGF0YSBlcnJvciIsICAgICAgICAgIC8qIFpfREFUQV9FUlJPUiAgICAoLTMpICovCisiaW5zdWZmaWNpZW50IG1lbW9yeSIsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovCisiYnVmZmVyIGVycm9yIiwgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovCisiaW5jb21wYXRpYmxlIHZlcnNpb24iLC8qIFpfVkVSU0lPTl9FUlJPUiAoLTYpICovCisiIn07CisKKworY29uc3QgY2hhciAqIFpFWFBPUlQgemxpYlZlcnNpb24oKQoreworICAgIHJldHVybiBaTElCX1ZFUlNJT047Cit9CisKKyNpZmRlZiBERUJVRworCisjICBpZm5kZWYgdmVyYm9zZQorIyAgICBkZWZpbmUgdmVyYm9zZSAwCisjICBlbmRpZgoraW50IHpfdmVyYm9zZSA9IHZlcmJvc2U7CisKK3ZvaWQgel9lcnJvciAobSkKKyAgICBjaGFyICptOworeworICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG0pOworICAgIGV4aXQoMSk7Cit9CisjZW5kaWYKKworLyogZXhwb3J0ZWQgdG8gYWxsb3cgY29udmVyc2lvbiBvZiBlcnJvciBjb2RlIHRvIHN0cmluZyBmb3IgY29tcHJlc3MoKSBhbmQKKyAqIHVuY29tcHJlc3MoKQorICovCitjb25zdCBjaGFyICogWkVYUE9SVCB6RXJyb3IoZXJyKQorICAgIGludCBlcnI7Cit7CisgICAgcmV0dXJuIEVSUl9NU0coZXJyKTsKK30KKworCisjaWZuZGVmIEhBVkVfTUVNQ1BZCisKK3ZvaWQgem1lbWNweShkZXN0LCBzb3VyY2UsIGxlbikKKyAgICBCeXRlZiogZGVzdDsKKyAgICBjb25zdCBCeXRlZiogc291cmNlOworICAgIHVJbnQgIGxlbjsKK3sKKyAgICBpZiAobGVuID09IDApIHJldHVybjsKKyAgICBkbyB7CisgICAgICAgICpkZXN0KysgPSAqc291cmNlKys7IC8qID8/PyB0byBiZSB1bnJvbGxlZCAqLworICAgIH0gd2hpbGUgKC0tbGVuICE9IDApOworfQorCitpbnQgem1lbWNtcChzMSwgczIsIGxlbikKKyAgICBjb25zdCBCeXRlZiogczE7CisgICAgY29uc3QgQnl0ZWYqIHMyOworICAgIHVJbnQgIGxlbjsKK3sKKyAgICB1SW50IGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgICAgaWYgKHMxW2pdICE9IHMyW2pdKSByZXR1cm4gMiooczFbal0gPiBzMltqXSktMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgem1lbXplcm8oZGVzdCwgbGVuKQorICAgIEJ5dGVmKiBkZXN0OworICAgIHVJbnQgIGxlbjsKK3sKKyAgICBpZiAobGVuID09IDApIHJldHVybjsKKyAgICBkbyB7CisgICAgICAgICpkZXN0KysgPSAwOyAgLyogPz8/IHRvIGJlIHVucm9sbGVkICovCisgICAgfSB3aGlsZSAoLS1sZW4gIT0gMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fVFVSQk9DX18KKyNpZiAoZGVmaW5lZCggX19CT1JMQU5EQ19fKSB8fCAhZGVmaW5lZChTTUFMTF9NRURJVU0pKSAmJiAhZGVmaW5lZChfXzMyQklUX18pCisvKiBTbWFsbCBhbmQgbWVkaXVtIG1vZGVsIGluIFR1cmJvIEMgYXJlIGZvciBub3cgbGltaXRlZCB0byBuZWFyIGFsbG9jYXRpb24KKyAqIHdpdGggcmVkdWNlZCBNQVhfV0JJVFMgYW5kIE1BWF9NRU1fTEVWRUwKKyAqLworIyAgZGVmaW5lIE1ZX1pDQUxMT0MKKworLyogVHVyYm8gQyBtYWxsb2MoKSBkb2VzIG5vdCBhbGxvdyBkeW5hbWljIGFsbG9jYXRpb24gb2YgNjRLIGJ5dGVzCisgKiBhbmQgZmFybWFsbG9jKDY0SykgcmV0dXJucyBhIHBvaW50ZXIgd2l0aCBhbiBvZmZzZXQgb2YgOCwgc28gd2UKKyAqIG11c3QgZml4IHRoZSBwb2ludGVyLiBXYXJuaW5nOiB0aGUgcG9pbnRlciBtdXN0IGJlIHB1dCBiYWNrIHRvIGl0cworICogb3JpZ2luYWwgZm9ybSBpbiBvcmRlciB0byBmcmVlIGl0LCB1c2UgemNmcmVlKCkuCisgKi8KKworI2RlZmluZSBNQVhfUFRSIDEwCisvKiAxMCo2NEsgPSA2NDBLICovCisKK2xvY2FsIGludCBuZXh0X3B0ciA9IDA7CisKK3R5cGVkZWYgc3RydWN0IHB0cl90YWJsZV9zIHsKKyAgICB2b2lkcGYgb3JnX3B0cjsKKyAgICB2b2lkcGYgbmV3X3B0cjsKK30gcHRyX3RhYmxlOworCitsb2NhbCBwdHJfdGFibGUgdGFibGVbTUFYX1BUUl07CisvKiBUaGlzIHRhYmxlIGlzIHVzZWQgdG8gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIGZvcm0gb2YgcG9pbnRlcnMKKyAqIHRvIGxhcmdlIGJ1ZmZlcnMgKDY0SykuIFN1Y2ggcG9pbnRlcnMgYXJlIG5vcm1hbGl6ZWQgd2l0aCBhIHplcm8gb2Zmc2V0LgorICogU2luY2UgTVNET1MgaXMgbm90IGEgcHJlZW1wdGl2ZSBtdWx0aXRhc2tpbmcgT1MsIHRoaXMgdGFibGUgaXMgbm90CisgKiBwcm90ZWN0ZWQgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gVGhpcyBoYWNrIGRvZXNuJ3Qgd29yayBhbnl3YXkgb24KKyAqIGEgcHJvdGVjdGVkIHN5c3RlbSBsaWtlIE9TLzIuIFVzZSBNaWNyb3NvZnQgQyBpbnN0ZWFkLgorICovCisKK3ZvaWRwZiB6Y2FsbG9jICh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICB2b2lkcGYgYnVmID0gb3BhcXVlOyAvKiBqdXN0IHRvIG1ha2Ugc29tZSBjb21waWxlcnMgaGFwcHkgKi8KKyAgICB1bGcgYnNpemUgPSAodWxnKWl0ZW1zKnNpemU7CisKKyAgICAvKiBJZiB3ZSBhbGxvY2F0ZSBsZXNzIHRoYW4gNjU1MjAgYnl0ZXMsIHdlIGFzc3VtZSB0aGF0IGZhcm1hbGxvYworICAgICAqIHdpbGwgcmV0dXJuIGEgdXNhYmxlIHBvaW50ZXIgd2hpY2ggZG9lc24ndCBoYXZlIHRvIGJlIG5vcm1hbGl6ZWQuCisgICAgICovCisgICAgaWYgKGJzaXplIDwgNjU1MjBMKSB7CisgICAgICAgIGJ1ZiA9IGZhcm1hbGxvYyhic2l6ZSk7CisgICAgICAgIGlmICgqKHVzaCopJmJ1ZiAhPSAwKSByZXR1cm4gYnVmOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZiA9IGZhcm1hbGxvYyhic2l6ZSArIDE2TCk7CisgICAgfQorICAgIGlmIChidWYgPT0gTlVMTCB8fCBuZXh0X3B0ciA+PSBNQVhfUFRSKSByZXR1cm4gTlVMTDsKKyAgICB0YWJsZVtuZXh0X3B0cl0ub3JnX3B0ciA9IGJ1ZjsKKworICAgIC8qIE5vcm1hbGl6ZSB0aGUgcG9pbnRlciB0byBzZWc6MCAqLworICAgICooKHVzaCopJmJ1ZisxKSArPSAoKHVzaCkoKHVjaCopYnVmLTApICsgMTUpID4+IDQ7CisgICAgKih1c2gqKSZidWYgPSAwOworICAgIHRhYmxlW25leHRfcHRyKytdLm5ld19wdHIgPSBidWY7CisgICAgcmV0dXJuIGJ1ZjsKK30KKwordm9pZCAgemNmcmVlICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKQoreworICAgIGludCBuOworICAgIGlmICgqKHVzaCopJnB0ciAhPSAwKSB7IC8qIG9iamVjdCA8IDY0SyAqLworICAgICAgICBmYXJmcmVlKHB0cik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogRmluZCB0aGUgb3JpZ2luYWwgcG9pbnRlciAqLworICAgIGZvciAobiA9IDA7IG4gPCBuZXh0X3B0cjsgbisrKSB7CisgICAgICAgIGlmIChwdHIgIT0gdGFibGVbbl0ubmV3X3B0cikgY29udGludWU7CisKKyAgICAgICAgZmFyZnJlZSh0YWJsZVtuXS5vcmdfcHRyKTsKKyAgICAgICAgd2hpbGUgKCsrbiA8IG5leHRfcHRyKSB7CisgICAgICAgICAgICB0YWJsZVtuLTFdID0gdGFibGVbbl07CisgICAgICAgIH0KKyAgICAgICAgbmV4dF9wdHItLTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwdHIgPSBvcGFxdWU7IC8qIGp1c3QgdG8gbWFrZSBzb21lIGNvbXBpbGVycyBoYXBweSAqLworICAgIEFzc2VydCgwLCAiemNmcmVlOiBwdHIgbm90IGZvdW5kIik7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBfX1RVUkJPQ19fICovCisKKworI2lmIGRlZmluZWQoTV9JODYpICYmICFkZWZpbmVkKF9fMzJCSVRfXykKKy8qIE1pY3Jvc29mdCBDIGluIDE2LWJpdCBtb2RlICovCisKKyMgIGRlZmluZSBNWV9aQ0FMTE9DCisKKyNpZiAoIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA8PSA2MDApKQorIyAgZGVmaW5lIF9oYWxsb2MgIGhhbGxvYworIyAgZGVmaW5lIF9oZnJlZSAgIGhmcmVlCisjZW5kaWYKKwordm9pZHBmIHpjYWxsb2MgKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKQoreworICAgIGlmIChvcGFxdWUpIG9wYXF1ZSA9IDA7IC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKyAgICByZXR1cm4gX2hhbGxvYygobG9uZylpdGVtcywgc2l6ZSk7Cit9CisKK3ZvaWQgIHpjZnJlZSAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikKK3sKKyAgICBpZiAob3BhcXVlKSBvcGFxdWUgPSAwOyAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgX2hmcmVlKHB0cik7Cit9CisKKyNlbmRpZiAvKiBNU0MgKi8KKworCisjaWZuZGVmIE1ZX1pDQUxMT0MgLyogQW55IHN5c3RlbSB3aXRob3V0IGEgc3BlY2lhbCBhbGxvYyBmdW5jdGlvbiAqLworCisjaWZuZGVmIFNUREMKK2V4dGVybiB2b2lkcCAgY2FsbG9jIE9GKCh1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKK2V4dGVybiB2b2lkICAgZnJlZSAgIE9GKCh2b2lkcGYgcHRyKSk7CisjZW5kaWYKKwordm9pZHBmIHpjYWxsb2MgKG9wYXF1ZSwgaXRlbXMsIHNpemUpCisgICAgdm9pZHBmIG9wYXF1ZTsKKyAgICB1bnNpZ25lZCBpdGVtczsKKyAgICB1bnNpZ25lZCBzaXplOworeworICAgIGlmIChvcGFxdWUpIGl0ZW1zICs9IHNpemUgLSBzaXplOyAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgcmV0dXJuICh2b2lkcGYpY2FsbG9jKGl0ZW1zLCBzaXplKTsKK30KKwordm9pZCAgemNmcmVlIChvcGFxdWUsIHB0cikKKyAgICB2b2lkcGYgb3BhcXVlOworICAgIHZvaWRwZiBwdHI7Cit7CisgICAgZnJlZShwdHIpOworICAgIGlmIChvcGFxdWUpIHJldHVybjsgLyogbWFrZSBjb21waWxlciBoYXBweSAqLworfQorCisjZW5kaWYgLyogTVlfWkNBTExPQyAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvenV0aWwuaCBiL2NvbW1vbi96bGliL3p1dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlYjc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL3p1dGlsLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qIHp1dGlsLmggLS0gaW50ZXJuYWwgaW50ZXJmYWNlIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisvKiBAKCMpICRJZDogenV0aWwuaCx2IDEuMSAyMDA0LzEwLzA4IDA5OjQ0OjI4IGNvbnN0X2sgRXhwICQgKi8KKworI2lmbmRlZiBfWl9VVElMX0gKKyNkZWZpbmUgX1pfVVRJTF9ICisKKyNpbmNsdWRlICJ6bGliLmgiCisKKyNpZmRlZiBTVERDCisjICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBOT19FUlJOT19ICisgICAgZXh0ZXJuIGludCBlcnJubzsKKyNlbHNlCisjICAgaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaWZuZGVmIGxvY2FsCisjICBkZWZpbmUgbG9jYWwgc3RhdGljCisjZW5kaWYKKy8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVjaDsKK3R5cGVkZWYgdWNoIEZBUiB1Y2hmOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7Cit0eXBlZGVmIHVzaCBGQVIgdXNoZjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOworCitleHRlcm4gY29uc3QgY2hhciAqel9lcnJtc2dbMTBdOyAvKiBpbmRleGVkIGJ5IDItemxpYl9lcnJvciAqLworLyogKHNpemUgZ2l2ZW4gdG8gYXZvaWQgc2lsbHkgd2FybmluZ3Mgd2l0aCBWaXN1YWwgQysrKSAqLworCisjZGVmaW5lIEVSUl9NU0coZXJyKSB6X2Vycm1zZ1taX05FRURfRElDVC0oZXJyKV0KKworI2RlZmluZSBFUlJfUkVUVVJOKHN0cm0sZXJyKSBcCisgIHJldHVybiAoc3RybS0+bXNnID0gKGNoYXIqKUVSUl9NU0coZXJyKSwgKGVycikpCisvKiBUbyBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgc3RhdGUgaXMga25vd24gdG8gYmUgdmFsaWQgKi8KKworICAgICAgICAvKiBjb21tb24gY29uc3RhbnRzICovCisKKyNpZm5kZWYgREVGX1dCSVRTCisjICBkZWZpbmUgREVGX1dCSVRTIE1BWF9XQklUUworI2VuZGlmCisvKiBkZWZhdWx0IHdpbmRvd0JpdHMgZm9yIGRlY29tcHJlc3Npb24uIE1BWF9XQklUUyBpcyBmb3IgY29tcHJlc3Npb24gb25seSAqLworCisjaWYgTUFYX01FTV9MRVZFTCA+PSA4CisjICBkZWZpbmUgREVGX01FTV9MRVZFTCA4CisjZWxzZQorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKKyNlbmRpZgorLyogZGVmYXVsdCBtZW1MZXZlbCAqLworCisjZGVmaW5lIFNUT1JFRF9CTE9DSyAwCisjZGVmaW5lIFNUQVRJQ19UUkVFUyAxCisjZGVmaW5lIERZTl9UUkVFUyAgICAyCisvKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqLworCisjZGVmaW5lIE1JTl9NQVRDSCAgMworI2RlZmluZSBNQVhfTUFUQ0ggIDI1OAorLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqLworCisjZGVmaW5lIFBSRVNFVF9ESUNUIDB4MjAgLyogcHJlc2V0IGRpY3Rpb25hcnkgZmxhZyBpbiB6bGliIGhlYWRlciAqLworCisgICAgICAgIC8qIHRhcmdldCBkZXBlbmRlbmNpZXMgKi8KKworI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMAorIyAgaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyMgICAgaWYoX19TVERDX18gPT0gMSkgJiYgKGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKSkKKyAgICAgICAvKiBBbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkICovCisgICAgICAgdm9pZCBfQ2RlY2wgZmFyZnJlZSggdm9pZCAqYmxvY2sgKTsKKyAgICAgICB2b2lkICpfQ2RlY2wgZmFybWFsbG9jKCB1bnNpZ25lZCBsb25nIG5ieXRlcyApOworIyAgICBlbHNlCisjICAgICBpbmNsdWRlIDxhbGxvYy5oPgorIyAgICBlbmRpZgorIyAgZWxzZSAvKiBNU0Mgb3IgREpHUFAgKi8KKyMgICAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBPUzIKKyMgIGRlZmluZSBPU19DT0RFICAweDA2CisjZW5kaWYKKworI2lmZGVmIFdJTjMyIC8qIFdpbmRvdyA5NSAmIFdpbmRvd3MgTlQgKi8KKyMgIGRlZmluZSBPU19DT0RFICAweDBiCisjZW5kaWYKKworI2lmIGRlZmluZWQoVkFYQykgfHwgZGVmaW5lZChWTVMpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMgorIyAgZGVmaW5lIEZfT1BFTihuYW1lLCBtb2RlKSBcCisgICAgIGZvcGVuKChuYW1lKSwgKG1vZGUpLCAibWJjPTYwIiwgImN0eD1zdG0iLCAicmZtPWZpeCIsICJtcnM9NTEyIikKKyNlbmRpZgorCisjaWZkZWYgQU1JR0EKKyMgIGRlZmluZSBPU19DT0RFICAweDAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoQVRBUkkpIHx8IGRlZmluZWQoYXRhcmlzdCkKKyMgIGRlZmluZSBPU19DT0RFICAweDA1CisjZW5kaWYKKworI2lmIGRlZmluZWQoTUFDT1MpIHx8IGRlZmluZWQoVEFSR0VUX09TX01BQykKKyMgIGRlZmluZSBPU19DT0RFICAweDA3CisjICBpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIF9fZGVzdF9vcyAhPSBfX2JlX29zICYmIF9fZGVzdF9vcyAhPSBfX3dpbjMyX29zCisjICAgIGluY2x1ZGUgPHVuaXguaD4gLyogZm9yIGZkb3BlbiAqLworIyAgZWxzZQorIyAgICBpZm5kZWYgZmRvcGVuCisjICAgICAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfXzUwU0VSSUVTIC8qIFByaW1lL1BSSU1PUyAqLworIyAgZGVmaW5lIE9TX0NPREUgIDB4MEYKKyNlbmRpZgorCisjaWZkZWYgVE9QUzIwCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwYQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9CRU9TXykgfHwgZGVmaW5lZChSSVNDT1MpCisjICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDYwMCkpCisjICBkZWZpbmUgZmRvcGVuKGZkLHR5cGUpICBfZmRvcGVuKGZkLHR5cGUpCisjZW5kaWYKKworCisgICAgICAgIC8qIENvbW1vbiBkZWZhdWx0cyAqLworCisjaWZuZGVmIE9TX0NPREUKKyMgIGRlZmluZSBPU19DT0RFICAweDAzICAvKiBhc3N1bWUgVW5peCAqLworI2VuZGlmCisKKyNpZm5kZWYgRl9PUEVOCisjICBkZWZpbmUgRl9PUEVOKG5hbWUsIG1vZGUpIGZvcGVuKChuYW1lKSwgKG1vZGUpKQorI2VuZGlmCisKKyAgICAgICAgIC8qIGZ1bmN0aW9ucyAqLworCisjaWZkZWYgSEFWRV9TVFJFUlJPUgorICAgZXh0ZXJuIGNoYXIgKnN0cmVycm9yIE9GKChpbnQpKTsKKyMgIGRlZmluZSB6c3RyZXJyb3IoZXJybnVtKSBzdHJlcnJvcihlcnJudW0pCisjZWxzZQorIyAgZGVmaW5lIHpzdHJlcnJvcihlcnJudW0pICIiCisjZW5kaWYKKworI2lmIGRlZmluZWQocHlyKQorIyAgZGVmaW5lIE5PX01FTUNQWQorI2VuZGlmCisjaWYgZGVmaW5lZChTTUFMTF9NRURJVU0pICYmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX1NDX18pCisgLyogVXNlIG91ciBvd24gZnVuY3Rpb25zIGZvciBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsIHdpdGggTVNDIDw9IDUuMC4KKyAgKiBZb3UgbWF5IGhhdmUgdG8gdXNlIHRoZSBzYW1lIHN0cmF0ZWd5IGZvciBCb3JsYW5kIEMgKHVudGVzdGVkKS4KKyAgKiBUaGUgX19TQ19fIGNoZWNrIGlzIGZvciBTeW1hbnRlYy4KKyAgKi8KKyMgIGRlZmluZSBOT19NRU1DUFkKKyNlbmRpZgorI2lmIGRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoSEFWRV9NRU1DUFkpICYmICFkZWZpbmVkKE5PX01FTUNQWSkKKyMgIGRlZmluZSBIQVZFX01FTUNQWQorI2VuZGlmCisjaWZkZWYgSEFWRV9NRU1DUFkKKyMgIGlmZGVmIFNNQUxMX01FRElVTSAvKiBNU0RPUyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIHptZW1jcHkgX2ZtZW1jcHkKKyMgICAgZGVmaW5lIHptZW1jbXAgX2ZtZW1jbXAKKyMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgX2ZtZW1zZXQoZGVzdCwgMCwgbGVuKQorIyAgZWxzZQorIyAgICBkZWZpbmUgem1lbWNweSBtZW1jcHkKKyMgICAgZGVmaW5lIHptZW1jbXAgbWVtY21wCisjICAgIGRlZmluZSB6bWVtemVybyhkZXN0LCBsZW4pIG1lbXNldChkZXN0LCAwLCBsZW4pCisjICBlbmRpZgorI2Vsc2UKKyAgIGV4dGVybiB2b2lkIHptZW1jcHkgIE9GKChCeXRlZiogZGVzdCwgY29uc3QgQnl0ZWYqIHNvdXJjZSwgdUludCBsZW4pKTsKKyAgIGV4dGVybiBpbnQgIHptZW1jbXAgIE9GKChjb25zdCBCeXRlZiogczEsIGNvbnN0IEJ5dGVmKiBzMiwgdUludCBsZW4pKTsKKyAgIGV4dGVybiB2b2lkIHptZW16ZXJvIE9GKChCeXRlZiogZGVzdCwgdUludCBsZW4pKTsKKyNlbmRpZgorCisvKiBEaWFnbm9zdGljIGZ1bmN0aW9ucyAqLworI2lmZGVmIERFQlVHCisjICBpbmNsdWRlIDxzdGRpby5oPgorICAgZXh0ZXJuIGludCB6X3ZlcmJvc2U7CisgICBleHRlcm4gdm9pZCB6X2Vycm9yICAgIE9GKChjaGFyICptKSk7CisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgel9lcnJvcihtc2cpO30KKyMgIGRlZmluZSBUcmFjZSh4KSB7aWYgKHpfdmVyYm9zZT49MCkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAoel92ZXJib3NlPjApIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNldnYoeCkge2lmICh6X3ZlcmJvc2U+MSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh6X3ZlcmJvc2U+MCAmJiAoYykpIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KSB7aWYgKHpfdmVyYm9zZT4xICYmIChjKSkgZnByaW50ZiB4IDt9CisjZWxzZQorIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKKyMgIGRlZmluZSBUcmFjZSh4KQorIyAgZGVmaW5lIFRyYWNldih4KQorIyAgZGVmaW5lIFRyYWNldnYoeCkKKyMgIGRlZmluZSBUcmFjZWMoYyx4KQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQorI2VuZGlmCisKKwordHlwZWRlZiB1TG9uZyAoWkVYUE9SVCAqY2hlY2tfZnVuYykgT0YoKHVMb25nIGNoZWNrLCBjb25zdCBCeXRlZiAqYnVmLAorCQkJCSAgICAgICB1SW50IGxlbikpOwordm9pZHBmIHpjYWxsb2MgT0YoKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKSk7Cit2b2lkICAgemNmcmVlICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikpOworCisjZGVmaW5lIFpBTExPQyhzdHJtLCBpdGVtcywgc2l6ZSkgXAorICAgICAgICAgICAoKigoc3RybSktPnphbGxvYykpKChzdHJtKS0+b3BhcXVlLCAoaXRlbXMpLCAoc2l6ZSkpCisjZGVmaW5lIFpGUkVFKHN0cm0sIGFkZHIpICAoKigoc3RybSktPnpmcmVlKSkoKHN0cm0pLT5vcGFxdWUsICh2b2lkcGYpKGFkZHIpKQorI2RlZmluZSBUUllfRlJFRShzLCBwKSB7aWYgKHApIFpGUkVFKHMsIHApO30KKworI2VuZGlmIC8qIF9aX1VUSUxfSCAqLwo=