ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggOTdiNjZlMi4uMzU3MTNmMSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTUgKzEsMTQgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NTA2MjAgb2YgV2luZSB0aGUgTVMgV2luZG93cyBlbXVsYXRvci4gIFRoaXMgaXMgc3RpbGwgYQorVGhpcyBpcyByZWxlYXNlIDk1MDcwNiBvZiBXaW5lIHRoZSBNUyBXaW5kb3dzIGVtdWxhdG9yLiAgVGhpcyBpcyBzdGlsbCBhCiBkZXZlbG9wZXIncyBvbmx5IHJlbGVhc2UuICBUaGVyZSBhcmUgbWFueSBidWdzIGFuZCBtYW55IHVuaW1wbGVtZW50ZWQgQVBJCiBmZWF0dXJlcy4gIE1vc3QgYXBwbGljYXRpb25zIHN0aWxsIGRvIG5vdCB3b3JrLgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gIndpbmUtbmV3QGFtc2NvbnMuY29tIi4gIFBsZWFzZSBkb24ndCBmb3JnZXQKIHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuICBJJ2xsIG1ha2UgYSBuZXcgcmVsZWFzZSBldmVyeSBvdGhlciBTdW5kYXkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk1MDYyMDogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBNYW55IGZpeGVzIHRvIGVkaXQgYW5kIGxpc3Rib3ggY29udHJvbHMuCi0JLSBCZXR0ZXIgTURJIGNvZGUuCi0JLSBNYW55IGxvY2FsIGhlYXAgZml4ZXMuCi0JLSBTb21lIGJ1aWx0LWluIERMTHMgYXJlIG5vdyBkaXNhYmxlZCBieSBkZWZhdWx0LgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTUwNzA2OiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIEJ1aWx0LWluIGRlYnVnZ2VyIHN1cHBvcnRzIHNpbmdsZS1zdGVwcGluZyAocGxlYXNlIHRlc3QgaXQgb24gKkJTRCkuCisJLSBXaW5lbGliIHNob3VsZCBjb21waWxlIGFnYWluLgorCS0gTW9yZSBPTEUyIGZ1bmN0aW9ucy4KIAktIExvdHMgb2YgYnVnIGZpeGVzLgogCiBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCkBAIC0xOCwxMSArMTcsMTEgQEAKIHRoZSByZWxlYXNlIGlzIGF2YWlsYWJsZSBhdCB0aGUgZnRwIHNpdGVzLiAgVGhlIHNvdXJjZXMgd2lsbCBiZSBhdmFpbGFibGUKIGZyb20gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CiAKLSAgICBzdW5zaXRlLnVuYy5lZHU6L3B1Yi9MaW51eC9BTFBIQS93aW5lL1dpbmUtOTUwNjIwLnRhci5negotICAgIHRzeC0xMS5taXQuZWR1Oi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk1MDYyMC50YXIuZ3oKLSAgICBmdHAuaW5mb21hZ2ljLmNvbTovcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk1MDYyMC50YXIuZ3oKLSAgICBmdHAuZnVuZXQuZmk6L3B1Yi9PUy9MaW51eC9BTFBIQS9XaW5lL1dpbmUtOTUwNjIwLnRhci5negotICAgIGFyaXMuY29tOi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk1MDYyMC50YXIuZ3oKKyAgICBzdW5zaXRlLnVuYy5lZHU6L3B1Yi9MaW51eC9BTFBIQS93aW5lL1dpbmUtOTUwNzA2LnRhci5negorICAgIHRzeC0xMS5taXQuZWR1Oi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk1MDcwNi50YXIuZ3oKKyAgICBmdHAuaW5mb21hZ2ljLmNvbTovcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk1MDcwNi50YXIuZ3oKKyAgICBmdHAuZnVuZXQuZmk6L3B1Yi9PUy9MaW51eC9BTFBIQS9XaW5lL1dpbmUtOTUwNzA2LnRhci5negorICAgIGFyaXMuY29tOi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk1MDcwNi50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggMzc2NjE3OC4uNGVhYjU2ZCAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDE2OSBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV2VkIEp1bCAgNSAxOTowNjozNSAxOTk1ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxhbGV4QG51bWVub3I+CisKKwkqIFtjb250cm9scy9zY3JvbGwuY10KKwlGaXhlZCBkcmF3aW5nIGJ1ZyB0aGF0IGNhdXNlZCBwYXJ0IG9mIGEgbm9uLWNsaWVudCBzY3JvbGwgYmFyCisJdG8gYmUgcGFpbnRlZCBldmVuIHdoZW4gdGhlIHNjcm9sbC1iYXIgd2FzIGhpZGRlbi4KKworCSogW2RlYnVnZ2VyL2JyZWFrLmNdIFtkZWJ1Z2dlci9kYmcueV0KKwlSZXdyb3RlIGJyZWFrcG9pbnQgaGFuZGxpbmcgdG8gd29yayBpbiAxNi1iaXQgbW9kZS4KKwlJbXBsZW1lbnRlZCBzaW5nbGUtc3RlcHBpbmcgKCdzdGVwJyBhbmQgJ25leHQnIGluc3RydWN0aW9ucykuCisKKwkqIFtkZWJ1Z2dlci9kZWJ1Zy5sXQorCUZvcm1hdCBzcGVjaWZpZXIgaXMgbm93IGEgc2VwYXJhdGUgdG9rZW4uCisJRW50ZXJpbmcgYW4gZW1wdHkgbGluZSBhdCB0aGUgZGVidWdnZXIgcHJvbXB0IGNhdXNlcyB0aGUgcHJldmlvdXMKKwljb21tYW5kIHRvIGJlIHJlcGVhdGVkLCBsaWtlIHVuZGVyIGdkYi4KKwkKKwkqIFtkZWJ1Z2dlci9kZWJ1Zy5sXSBbZGVidWdnZXIvcmVnaXN0ZXJzLmNdCisJRGlmZmVyZW50aWF0ZSAxNi1iaXQgYW5kIDMyLWJpdCByZWdpc3RlcnMgd2l0aG91dCB0YWtpbmcgY3VycmVudAorCW1vZGUgaW50byBhY2NvdW50ICgkZWF4IGlzIGFsd2F5cyAzMi1iaXQsICRheCBhbHdheXMgMTYtYml0KS4KKworCSogW2RlYnVnZ2VyL3N0YWNrLmNdCisJRml4ZWQgc3RhY2sgaW5mb3JtYXRpb24gcm91dGluZXMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIDE2LWJpdAorCWFuZCAzMi1iaXQgc3RhY2tzLgorCisJKiBbbG9hZGVyL3Rhc2suY10KKwlPcHRpb24gLWRlYnVnIG5vdyBzZXRzIGEgYnJlYWtwb2ludCBhdCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YKKwlldmVyeSBsb2FkZWQgdGFzay4KKworCSogW21pc2NlbXUvaW5zdHIuY10KKwlBZGRlZCBoYW5kbGluZyBvZiBsb2NrLCByZXBlIGFuZCByZXBuZSBwcmVmaXhlcy4KKworCSogW29iamVjdHMvZGliLmNdCisJQ2hhbmdlZCBTdHJldGNoRElCaXRzKCkgdG8gZG8gdGhlIGNvcnJlY3QgdGhpbmcsIGV2ZW4gaWYgaXQncyBzdGlsbAorCW5vdCByZWFsbHkgb3B0aW1hbC4KKworCSogW3dpbmRvd3MvZ3JhcGhpY3MuY10KKwlGaXhlcyBpbiBSb3VuZFJlY3QoKSwgdGhhbmtzIHRvIEJhYmFrIE1hc2FsZWhkYW4uCisKKwkqIFt3aW5kb3dzL21lc3NhZ2UuY10KKwlUcmllZCB0byBmaXggbW91c2UgZXZlbnQgaGFuZGxpbmcgd2l0aCByZXNwZWN0IHRvIGRpc2FibGVkCisJd2luZG93cy4KKworCSogW3dpbmRvd3MvcGFpbnRpbmcuY10KKwlDbGVhciBXSU5fTkVFRFNfTkNQQUlOVCBmbGFnIGJlZm9yZSBzZW5kaW5nIFdNX05DUEFJTlQgdG8gYXZvaWQKKwlpbmZpbml0ZSBsb29wcy4KKworCSogW3dpbmRvd3Mvd2luLmNdCisJRml4ZWQgSXNXaW5kb3dWaXNpYmxlKCkgdG8gcmV0dXJuIEZBTFNFIHdoZW4gb25lIG9mIHRoZSBwYXJlbnQKKwl3aW5kb3dzIGlzIGhpZGRlbi4KKworU2F0IEp1bCAgMSAyMjowODoyMSAxOTk1ICAgTWFydGluIHZvbiBMb2V3aXMgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KKworCSogW2lmMTYzMi9jb21wb2JqLnNwZWNdW21pc2MvY29tcG9iai5jXQorCUNvR2V0TWFsbG9jOiBOZXcgZnVuY3Rpb24KKwlBZGRlZCByZWxheSBlbnRyaWVzIGZvciBDT01QT0JKIG9yZGluYWxzIGFib3ZlIDEwMAorCUNvSW5pdGlhbGl6ZTogQ2hhbmdlZCBwYXJhbWV0ZXIgdG8gRFdPUkQKKworCSogW2lmMTYzMi9vbGUyLnNwZWNdCisJRXhwb3J0ZWQgaW1wbGVtZW50YXRpb24gb2YgT2xlQnVpbGRWZXJzaW9uCisKKwkqIFtpZjE2MzIvb2xlMmRpc3Auc3BlY11bbWlzYy9vbGUyZGlzcC5jXVttaXNjL0ltYWtlZmlsZV0KKwlvbGUyZGlzcC5jOiBOZXcgZmlsZQorCVN5c0FsbG9jU3RyaW5nLCBTeXNSZWFsbG9jU3RyaW5nLCBTeXNBbGxvY1N0cmluZ0xlbiwKKwlTeXNSZUFsbG9jU3RyaW5nTGVuLCBTeXNGcmVlU3RyaW5nLCBTeXNTdHJpbmdMZW46IG5ldyBmdW5jdGlvbnMKKworCSogW2lmMTYzMi9vbGUybmxzLnNwZWNdW2luY2x1ZGUvd2lubmxzLmhdW21pc2Mvb2xlMm5scy5jXQorCUNvbXBhcmVTdHJpbmdBOiBOZXcgZnVuY3Rpb24KKworVGh1IEp1biAyOSAxOTo0MjowMiAxOTk1ICBNYXJjdXMgTWVpc3NuZXIgIDxtc21laXNzbkBmYXVpMDEuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisJKiBbb2JqZWN0cy9mb250LmNdIFtpZjE2MzIvZ2RpLnNwZWNdCisJTmV3IHN0dWJzIGZvciBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZSwgR2V0R2x5cGhPdXRsaW5lLgorCitUaHUgSnVuIDI5IDEzOjQ3OjA4IEdNVCAxOTk1ICBH9nJhbiBUaHluaSAgKGdvcmFuQG5vcnJza2VuLmJpbGRiYXNlbi5zZSkKKworCSogW21pc2MvY29tbWRsZy5jXQorCUV4dGVuc2l2ZSBjaGFuZ2VzIGFuZCBidWcgZml4ZXMgdG8gRmlsZURpYWxvZyBoYW5kbGluZywKKyAgICAgICAgYmVoYXZlcyBtb3JlIGxpa2UgbmF0aXZlIFdpbmRvd3MuCisKK1dlZCBKdW4gMjggMTM6MDQ6NDQgMTk5NSAgIEJlcm5kIFNjaG1pZHQgPGNydXhAcG9vbC5pbmZvcm1hdGlrLnJ3dGgtYWFjaGVuLmRlPgorCisgICAgICAgICogW2NvbnRyb2xzL2xpc3Rib3guY10gW2NvbnRyb2xzL2NvbWJvLmNdCisJU29tZSBtaW5vciBvcHRpbWl6YXRpb25zLgorCQorCSogW21lbW9yeS9sb2NhbC5jXQorCUxPQ0FMX0ZpbmRGcmVlQmxvY2soKTogTmV2ZXIgdXNlIHRoZSBsYXN0IG9uZS4KKwkKKwkqIFttZW1vcnkvZ2xvYmFsLmNdCisJR2xvYmFsUmVBbGxvYygpOiBHTUVNX01PRElGWSBtdXN0IG5vdCBiZSBpZ25vcmVkIHdoZW4gc2l6ZT09MC4KKwkKKwkqIFttaXNjL2ZpbGUuY10KKwlyZWFkKCkgcmV0dXJucyBhbiBlcnJvciB3aGVuIGxlbmd0aD09MC4gVGhpcyBpcyBub3Qgd2hhdCBXaW5kb3dzCisJcHJvZ3JhbXMgZXhwZWN0LCBzbyBwYXkgYXR0ZW50aW9uIHRvIHRoaXMgaW4gX2xyZWFkKCkuIENoYW5nZWQgdGhpcworCWluIF9sd3JpdGUoKSwgX2hyZWFkKCksIF9od3JpdGUoKSwgdG9vLgorCisJKiBbbG9hZGVyL3Jlc291cmNlLmNdCisJTG9hZEljb24oKTogSWdub3JlIGJpaC0+YmlTaXplSW1hZ2UsIHNvbWUgaWNvbnMgaGF2ZSB3cm9uZyB2YWx1ZXMgaW4KKwl0aGVyZS4KKwkKKwkqIFtpZjE2MzIvc2hlbGwuc3BlY10gW21pc2Mvc2hlbGwuY10KKwlXcm9uZyBzcGVjIGZpbGUgZW50cmllcyBjYXVzZWQgaGF2b2M6IEhLRVkgaGFzIDMyIGJpdCwgbm90IDE2LgorCUFjY2VwdCBzb21lIG1vcmUgY29tYmluYXRpb25zIG9mIHBhcmFtZXRlcnMgaW4gdGhlIFJlZy4uKCkgZnVuY3Rpb25zLgorCQorCSogW2lmMTYzMi90b29saGVscC5zcGVjXQorCU1ha2UgSW50ZXJydXB0UmVnaXN0ZXIoKSBhbmQgSW50ZXJydXB0VW5yZWdpc3RlcigpIHJldHVybiBmYWxzZS4KKworCSogW3dpbmRvd3MvaG9vay5jXQorCUNhbGxOZXh0SG9va0V4KCkgdXNlZCB0byBjcmFzaCB3aGVuIGNhbGxlZCB3aXRoIGEgbnVsbCBoaG9vay4gRml4ZWQuCisKK1dlZCBKdW4gMjggMTA6MTQ6MzQgMTk5NSAgTWFydGluIHZvbiBMb2V3aXMgIDxtYXJ0aW5AaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+CisKKwkqIFtpbmNsdWRlL25lZXhlLmhdW2xvYWRlci9uZV9pbWFnZS5jXQorCU5FX0xvYWRTZWdtZW50OiBEZXRlY3QgaXRlcmF0ZWQgc2VnbWVudHMKKworCSogW21pc2Mvb2xlMm5scy5jXQorCUxPQ0FMRV9TTE9OR0RBVEU6IGZpeGVkIHR5cG8KKworCSogW21pc2NlbXUvaW50NWMuY10KKwlSZW9yZGVyZWQgaW5jbHVkZSBmaWxlcyB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBMaW51eCBsaWJjLjUuMQorCisJKiBbcmMvd2luZXJjLmNdCisJQWRkZWQgLWIgb3B0aW9uIHRvIHByb2Nlc3MgYmluYXJ5IHJlc291cmNlIGZpbGVzIGludG8gQyBhcnJheXMKKworCSogW2luY2x1ZGUvY2FsbGJhY2suaF0KKwlDYWxsV25kUHJvYzogQWRkZWQgZHVtbXkgZHMgcGFyYW1ldGVyIGZvciBsaWJ3aW5lCisKKwkqIFtpbmNsdWRlL2dkaS5oXVtpbmNsdWRlL3VzZXIuaF0KKwlVU0VSX0hFQVBfQUxMT0MsIEdESV9IRUFQX0FMTE9DOiBkcm9wcGVkIGZsYWdzIHBhcmFtZXRlcgorCisJKiBbaW5jbHVkZS9sZHQuaF1baW5jbHVkZS9zdGFja2ZyYW1lLmhdCisJZGVmaW5lZCBzZWdtZW50IGNvbnZlcnNpb24gbWFjcm9zIGZvciBsaWJ3aW5lCisKKwkqIFttaXNjL2F0b20uY10KKwlEZWZpbmVkIFVTRVJfSGVhcFNlbCBmb3IgbGlid2luZQorCisJKiBbbWlzYy9tYWluLmNdCisJRGlzYWJsZSAtZGxsIG9wdGlvbiBmb3IgbGlid2luZQorCisJKiBbbWlzYy91c2VyLmNdCisJcmVtb3ZlZCBHZXRGcmVlU3lzdGVtUmVzb3VyY2VzLCBTeXN0ZW1IZWFwSW5mbyBmcm9tIGxpYndpbmUgZm9yIG5vdworCisJKiBbdG9vbGtpdC9oZWFwLmNdCisJZml4ZWQgTG9jYWxMb2NrIHByb3RvdHlwZQorCisJKiBbdG9vbGtpdC9zdXAuY10KKwlzeW5jJ2VkIGxvYWRfbXpfaGVhZGVyLCBsb2FkX25lX2hlYWRlciB3aXRoIHN0cnVjdHVyZXMKKworCSogW3Rvb2xraXQvd2lubWFpbi5jXQorCURpc2FibGVkIHJlc291cmNlIERMTHMgZm9yIGxpYndpbmUgZm9yIG5vdworCitNb24gSnVuIDI2IDE5OjMwOjI0IDE5OTUgIEhhbnMgZGUgR3JhYWZmICAoZ3JhYWZmQHR3aTcyLnR3aS50dWRlbGZ0Lm5sKQorCisJKiBbbWlzYy9tYWluLmNdCisJRml4ZWQgLWVuaGFuY2VkIG9wdGlvbiB0byByZXBvcnQgYSAzODYgQ1BVIGluc3RlYWQgb2YgYSAyODYuCisKK0ZyaSBKdW4gMjMgMjM6MTg6MjUgMTk5NSAgTWFyY3VzIE1laXNzbmVyICA8bXNtZWlzc25AZmF1aTAxLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCisJKiBbbWlzYy9kb3NfZnMuY10KKwlSZW1vdmUgbWF4aW11bSBvcGVuIGRvc2RpcmVudCBsaW1pdCAoZml4aW5nIHRoZSB3aW5maWxlLmV4ZQorIAlwcm9ibGVtKSBieSB1c2luZyB0ZWxsZGlyKCkvc2Vla2RpcigpLgorCQorRnJpIEp1biAyMyAxMzo0MjoyNSAxOTk1ICBIYW5zIGRlIEdyYWFmZiAgKGdyYWFmZkB0d2k3Mi50d2kudHVkZWxmdC5ubCkKKworCSogW21pc2MvcHJvZmlsZS5jXQorCUZpeGVkIHByb2JsZW0gcGFyc2luZyBlbXB0eSBsaW5lcyB3aXRoaW4gc2VjdGlvbnMgaW4gLmluaSBmaWxlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTW9uIEp1biAxOSAyMDoyOTo1MCAxOTk1ICBBbGV4YW5kcmUgSnVsbGlhcmQgIChqdWxsaWFyZEBzdW5zaXRlLnVuYy5lZHUpCiAKIAkqIFtkZWJ1Z2dlci8qLmNdCmRpZmYgLS1naXQgYS9Db25maWd1cmUgYi9Db25maWd1cmUKaW5kZXggODkyZTQ4MS4uM2E0YzZmNyAxMDA2NDQKLS0tIGEvQ29uZmlndXJlCisrKyBiL0NvbmZpZ3VyZQpAQCAtMTAzLDcgKzEwMyw2IEBACiAJZmkKIAlwcm9tcHQgIldoZXJlIHNob3VsZCBXaW5kb3dzIGFwcHMgc3RvcmUgdGVtcCBmaWxlcyIgQ0ZfVGVtcCAkQ0ZfVGVtcAogCXByb21wdCAiV2hpY2ggcGF0aCBzaG91bGQgYmUgdXNlZCB0byBmaW5kIHByb2dzL0RMTCdzIiBDRl9QYXRoICIkQ0ZfV2luZG93czskQ0ZfU3lzdGVtIgotCXByb21wdCAiV2hlcmUgaXMgc3lzcmVzLmRsbCIgQ0ZfU3lzdGVtUmVzb3VyY2VzIGBwd2RgL3N5c3Jlcy5kbGwKIAlwcm9tcHQgIldoZXJlIGlzIENPTTEiIENGX0NvbTEgJy9kZXYvY3VhMCcKIAlwcm9tcHQgIldoZXJlIGlzIENPTTIiIENGX0NvbTIgJy9kZXYvY3VhMScKIAlwcm9tcHQgIldoZXJlIGlzIExQVDEiIENGX0xwdDEgJy9kZXYvbHAwJwpkaWZmIC0tZ2l0IGEvV2luZS5tYW4gYi9XaW5lLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzliYmZkCi0tLSAvZGV2L251bGwKKysrIGIvV2luZS5tYW4KQEAgLTAsMCArMSwzMjggQEAKKy5cIiAtKi0gbnJvZmYgLSotCisuVEggV0lORSAxICJKdW5lIDI5LCAxOTk1IiAiVmVyc2lvbiA2LzIwLzk1IiAiV2luZG93cyBFbXVsYXRpb24iCisuU0ggTkFNRQord2luZSBcLSBydW4gV2luZG93cyAzLnggcHJvZ3JhbXMgdW5kZXIgTGludXgKKy5TSCBTWU5PUFNJUworLkIgd2luZQorWworLkkgb3B0aW9ucworXQorLkkgcHJvZ3JhbV9uYW1lCitbCisuSSBhcmd1bWVudHMKK10KKy5TSCBERVNDUklQVElPTgorLkIgd2luZQoraW52b2tlcyB0aGUgTGludXggV2luZG93cyBlbXVsYXRvci4KKy5QUAorLkIgd2luZSAKK2N1cnJlbnRseSBydW5zIGEgbnVtYmVyIG9mIGdhbWVzIGFuZCBzbWFsbCBhcHBsaWNhdGlvbnMgKGFwcHJveGltYXRlbHkKK2hhbGYgb2YgdGhlIGFwcGxldHMgYW5kIGNvbW1vbiBnYW1lcyBhY3R1YWxseSBydW4pLCBhbHRob3VnaCB0aGUgZW50aXJlIEFQSQoraGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLgorLlBQCitTZWUgdGhlIGZpbGVzIAorLkIgUkVBRE1FLAorLkIgQ2hhbmdlTG9nLCAKKy5CIENvbmZpZ3VyZSwgCithbmQgdGhlCisuQiBNYWtlZmlsZQorY29udGFpbmVkIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uCit0byBjb21waWxlCisuQiB3aW5lLgorLlNIIFJFUVVJUkVNRU5UUworQXQgcHJlc2VudCwgCisuQiB3aW5lCit3aWxsIHJ1biB1bmRlciBhbnkgTGludXgga2VybmVsIG1vcmUgcmVjZW50IHRoYW4gMC45OS4xMywgb3IKK3VuZGVyIHJlY2VudCByZWxlYXNlcyBvZiBOZXRCU0QgYW5kIEZyZWVCU0QuCisuUFAKKy5CIFgKK211c3QgYmUgaW5zdGFsbGVkLgorLlBQCisuQiBsaWJYcG0KK211c3QgYmUgaW5zdGFsbGVkLiAgKEl0IGlzIHByb2JhYmx5IGF2YWlsYWJsZSBmcm9tIHRoZSBzYW1lIHNpdGUgCisuQiB3aW5lCit3YXMsIG9yIHRoZSBzb3VyY2VzIG1heSBiZSBGVFAnZCBmcm9tIGZ0cC54Lm9yZykuCisuU0ggSU5TVEFMTEFUSU9OCitUbyBpbnN0YWxsIAorLkIgd2luZSwKK3J1biAiLi9Db25maWd1cmUiLCB3aGljaCB3aWxsIGFzayBmb3IgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQKK2NyZWF0ZSB0aGUgTWFrZWZpbGVzLCB0aGVuIHJ1biAibWFrZSIuCisuU0ggT1BUSU9OUworLlRQCisuSSAtZGVwdGggbgorQ2hhbmdlIHRoZSBkZXB0aCB0byB1c2UgZm9yIG11bHRpcGxlLWRlcHRoIHNjcmVlbnMKKy5UUAorLkkgLWRlc2t0b3AgZ2VvbQorVXNlIGEgZGVza3RvcCB3aW5kb3cgb2YgdGhlIGdpdmVuIGdlb21ldHJ5CisuVFAKKy5JIC1kaXNwbGF5IG5hbWUKK1VzZSB0aGUgc3BlY2lmaWVkIGRpc3BsYXkKKy5UUAorLkkgLWljb25pYworU3RhcnQgYXMgYW4gaWNvbgorLlRQCisuSSAtZGVidWcKK0VudGVyIHRoZSBkZWJ1Z2dlciBiZWZvcmUgc3RhcnRpbmcgYXBwbGljYXRpb24KKy5UUAorLkkgLW5hbWUgbmFtZQorU2V0IHRoZSBhcHBsaWNhdGlvbiBuYW1lCisuVFAKKy5JIC1wcml2YXRlbWFwCitVc2UgYSBwcml2YXRlIGNvbG9yIG1hcAorLlRQCisuSSAtc3luY2hyb25vdXMKK1R1cm4gb24gc3luY2hyb25vdXMgZGlzcGxheSBtb2RlCisuVFAKKy5JIC1iYWNraW5nc3RvcmUKK1R1cm4gb24gYmFja2luZyBzdG9yZQorLlRQCisuSSAtc3B5IGZpbGUKK1R1cm4gb24gbWVzc2FnZSBzcHlpbmcgdG8gdGhlIHNwZWNpZmllZCBmaWxlCisuVFAKKy5JIC1kZWJ1Z21zZyBuYW1lWyxuYW1lXQorVHVybiBkZWJ1Z2dpbmcgbWVzc2FnZXMgb24gb3Igb2ZmIC0gZm9yIGluc3RhbmNlLCAKKy5JIC1kZWJ1Z21zZyArZGxsLCtoZWFwCit3aWxsIHR1cm4gb24gRExMIGFuZCBoZWFwIGRlYnVnZ2luZyBtZXNzYWdlcy4gIFRoZSBmdWxsIGxpc3QgaXM6CithbGwsIGFjY2VsLCBiaXRibHQsIGJpdG1hcCwgY2FyZXQsIGNhdGNoLCBjZGF1ZGlvLCBjbGFzcywgY2xpcGJvYXJkLCBjbGlwcGluZywKK2NvbWJvLCBjb21tLCBjdXJzb3IsIGRjLCBkaWFsb2csIGRsbCwgZG9zZnMsIGRyaXZlciwgZWRpdCwgZW51bSwgZXZlbnQsIGV4ZWMsCitmaWxlLCBmaXh1cCwgZm9udCwgZ2RpLCBnbG9iYWwsIGdyYXBoaWNzLCBpY29uLCBpbnQsIGtleSwga2V5Ym9hcmQsIGxkdCwKK2xpc3Rib3gsIGxvY2FsLCBtYWxsb2MsIG1jaSwgbWNpYW5pbSwgbWNpd2F2ZSwgbWRpLCBtZW51LCBtZW51Y2FsYywgbWVzc2FnZSwKK21ldGFmaWxlLCBtaWRpLCBtbWlvLCBtbXN5cywgbW10aW1lLCBtb2R1bGUsIG1zZywgbm9uY2xpZW50LCBvbGUsIHBhbGV0dGUsIAorcHJvZmlsZSwgcHJvcCwgcmVnLCByZWdpb24sIHJlbGF5LCByZXNvdXJjZSwgc2Nyb2xsLCBzZWxlY3Rvciwgc2VsZWN0b3JzLCAKK3N0cmVzcywgc3lzY29sb3IsIHRhc2ssIHRleHQsIHRpbWVyLCB0b29saGVscCwgdXRpbGl0eSwgd2luLCB3aW5zb2NrLgorLlRQCisuSSAtZGxsIG5hbWUKK0VuYWJsZXMvZGlzYWJsZXMgYnVpbHQtaW4gRExMJ3MgLSBzdGFydGluZyB3aW5lIHdpdGgKKy5JIC1kbGwgLWNvbW1kbGcKK2lzIHByb2JhYmx5IGEgZ29vZCBpZGVhLgorVGhlIGZ1bGwgbGlzdCBvZiBETExzIG1vZGlmaWFibGUgYnkgdGhpcyBpczoKK0tFUk5FTCwgVVNFUiwgR0RJLCBXSU44N0VNLCBTSEVMTCwgU09VTkQsIEtFWUJPQVJELCBXSU5TT0NLLCBTVFJFU1MsIE1NU1lTVEVNLAorU1lTVEVNLCBUT09MSEVMUCwgTU9VU0UsIENPTU1ETEcsIE9MRTIsIE9MRTJDT05WLCBPTEUyRElTUCwgT0xFMk5MUywgT0xFMlBST1gsCitPTEVDTEksIE9MRVNWUiwgQ09NUE9CSiwgU1RPUkFHRSwgV0lOUFJPQ1MsIERERU1MCisuVFAKKy5JIC1hbGxvd3JlYWRvbmx5CitSZWFkIG9ubHkgZmlsZXMgbWF5IGJlIG9wZW5lZCBpbiB3cml0ZSBtb2RlCisuVFAKKy5JIC1lbmhhbmNlZAorU3RhcnRzIHdpbmUgaW4gRW5oYW5jZWQgbW9kZSAobm90IGd1YXJhbnRlZWQgdG8gd29yayB5ZXQpCisuUEQgMQorLlNIIFBST0dSQU0vQVJHVU1FTlRTCitUaGUgcHJvZ3JhbSBuYW1lIG1heSBiZSBzcGVjaWZpZWQgaW4gRE9TIGZvcm1hdCAoQzpcXFdJTkRPV1NcXFNPTC5FWEUpIG9yIGluIAorTGludXggZm9ybWF0ICgvbXNkb3Mvd2luZG93cy9zb2wuZXhlKS4gIFRoZSBwcm9ncmFtIGJlaW5nIGV4ZWN1dGVkIG1heSBiZSAKK3Bhc3NlZCBhcmd1bWVudHMgYnkgYWRkaW5nIHRoZW0gb24gdG8gdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lIGludm9raW5nCisuQiB3aW5lCisoc3VjaCBhczogd2luZSAibm90ZXBhZCBDOlxcVEVNUFxcUkVBRE1FLlRYVCIpLiAgTm90ZSB0aGF0Cit0aGUgcHJvZ3JhbSBuYW1lIGFuZCBpdHMgYXJndW1lbnRzIAorLkkgbXVzdAorYmUgcGFzc2VkIGFzIGEgc2luZ2xlIHBhcmFtZXRlciwgd2hpY2ggaXMgdXN1YWxseSBhY2NvbXBsaXNoZWQgYnkgcGxhY2luZwordGhlbSB0b2dldGhlciBpbiBxdW90YXRpb24gbWFya3MuICBNdWx0aXBsZSBhcHBsaWNhdGlvbnMgbWF5IGJlIHN0YXJ0ZWQKK2J5IHBsYWNpbmcgYWxsIG9mIHRoZW0gb24gdGhlIGNvbW1hbmQgbGluZSAoc3VjaCBhczogd2luZSBub3RlcGFkIGNsb2NrKS4KKy5TSCBDT05GSUdVUkFUSU9OIEZJTEUKKy5CIHdpbmUKK2V4cGVjdHMgYSBjb25maWd1cmF0aW9uIGZpbGUgKC91c3IvbG9jYWwvZXRjL3dpbmUuY29uZiksIAord2hpY2ggc2hvdWxkIGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBydWxlcy4gIFRoZSBhY3R1YWwgZmlsZSBuYW1lIG1heQorYmUgc3BlY2lmaWVkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZQorLkIgQ29uZmlndXJlCitzY3JpcHQuICBBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IGhhdmUgYSAKKy5JIC53aW5lcmMKK2ZpbGUgb2YgdGhpcyBmb3JtYXQgaW4geW91ciBob21lIGRpcmVjdG9yeS4KKy5TSCBDT05GSUdVUkFUSU9OIEZJTEUgRk9STUFUCisuQiBbZHJpdmVzXQorLmJyCisuSSBmb3JtYXQ6IDxkcml2ZWxldHRlcj4gPSA8cm9vdGRpcmVjdG9yeT4KKy5icgorZGVmYXVsdDogbm9uZQorLmJyCitUaGlzIHNlY3Rpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSByb290IGRpcmVjdG9yeSBvZiBlYWNoIAorLkIgRE9TCitkcml2ZSwgc2luY2UgbW9zdCBXaW5kb3dzIGFwcGxpY2F0aW9ucyByZXF1aXJlIGEgRE9TL01TLVdpbmRvd3MgYmFzZWQgCitkaXNrIGRyaXZlICYgZGlyZWN0b3J5IHNjaGVtZS4KKy5icgorSWYgeW91IG1vdW50ZWQgeW91ciBkb3MgcGFydGl0aW9uIGFzIAorLkkgL2RvcworYW5kIGluc3RhbGxlZCBNaWNyb3NvZnQgV2luZG93cyBpbiAKK0M6XFxXSU5ET1dTIHRoZW4geW91IHNob3VsZCBzcGVjaWZ5IAorLkkgYz0vZG9zCitpbiB0aGUgZHJpdmVzIHNlY3Rpb24uCisuUFAKKy5CIFt3aW5lXQorLmJyCisuSSBmb3JtYXQ6IHdpbmRvd3MgPSA8ZGlyZWN0b3J5PgorLmJyCitkZWZhdWx0OiBDOlxcV0lORE9XUworLmJyCitVc2VkIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgV2luZG93cyBkaXJlY3RvcnkKKy5QUAorLkkgZm9ybWF0OiBzeXN0ZW0gPSA8ZGlyZWN0b3J5PgorLmJyCitkZWZhdWx0OiBDOlxcV0lORE9XU1xcU1lTVEVNCisuYnIKK1VzZWQgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBzeXN0ZW0gZGlyZWN0b3J5CisuUFAKKy5JIGZvcm1hdDogdGVtcCA9IDxkaXJlY3Rvcnk+CisuYnIKK2RlZmF1bHQ6IEM6XFxURU1QCisuYnIKK1VzZWQgdG8gc3BlY2lmeSBhIGRpcmVjdG9yeSB3aGVyZSBXaW5kb3dzIGFwcGxpY2F0aW9ucyBjYW4gc3RvcmUgCit0ZW1wb3JhcnkgZmlsZXMuCisuUFAKKy5JIGZvcm1hdDogcGF0aCA9IDxkaXJlY3RvcmllcyBzZXBhcmF0ZWQgYnkgc2VtaS1jb2xvbnM+CisuYnIKK2RlZmF1bHQ6IEM6XFxXSU5ET1dTO0M6XFxXSU5ET1dTXFxTWVNURU0KKy5icgorVXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBmaW5kIGV4ZWN1dGFibGVzIGFuZCAuRExMJ3MuCisuUFAKKy5JIGZvcm1hdDogc3ltYm9sdGFibGVmaWxlID0gPGZpbGVuYW1lPgorLmJyCitkZWZhdWx0OiB3aW5lLnN5bQorLmJyCitVc2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggYW5kIGZpbGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRhYmxlIHVzZWQgYnkgdGhlIGJ1aWx0LWluCitkZWJ1Z2dlci4KKy5QUAorLkIgW3NlcmlhbHBvcnRzXQorLmJyCisuSSBmb3JtYXQ6IGNvbVsxMjM0NTY3OF0gPSA8ZGV2aWNlbmFtZT4KKy5icgorZGVmYXVsdDogbm9uZQorLmJyCitVc2VkIHRvIHNwZWNpZnkgdGhlIGRldmljZXMgd2hpY2ggYXJlIHVzZWQgYXMgY29tMSAtIGNvbTguCisuUFAKKy5CIFtwYXJhbGxlbHBvcnRzXQorLmJyCisuSSBmb3JtYXQ6IGxwdFsxMjM0NTY3OF0gPSA8ZGV2aWNlbmFtZT4KKy5icgorZGVmYXVsdDogbm9uZQorLmJyCitVc2VkIHRvIHNwZWNpZnkgdGhlIGRldmljZXMgd2hpY2ggYXJlIHVzZWQgYXMgbHB0MSAtIGxwdDguCisuUFAKKy5CIFtzcHldCisuYnIKKy5JIGZvcm1hdDogZmlsZSA9IDxmaWxlbmFtZSBvciBDT04gd2hlbiBsb2dnaW5nIHRvIHN0ZG91dD4KKy5icgorZGVmYXVsdDogbm9uZQorLmJyCitVc2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgd2hpY2ggd2lsbCBiZSB1c2VkIGFzCisuQiBsb2dmaWxlLgorLlBQCisuSSBmb3JtYXQ6IGV4Y2x1ZGUgPSA8bWVzc2FnZSBuYW1lcyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucz4KKy5icgorZGVmYXVsdDogbm9uZQorLmJyCitVc2VkIHRvIHNwZWNpZnkgd2hpY2ggbWVzc2FnZXMgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHRoZSBsb2dmaWxlLgorLlBQCisuSSBmb3JtYXQ6IGluY2x1ZGUgPSA8bWVzc2FnZSBuYW1lcyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucz4KKy5icgorZGVmYXVsdDogbm9uZQorLmJyIFVzZWQgdG8gc3BlY2lmeSB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBsb2dmaWxlLgorLlNIIFNBTVBMRSB3aW5lLmNvbmYKK1tkcml2ZXNdCisuYnIKK2E9L21udC9mZDAKKy5icgorYz0vZG9zCisuYnIKK2Q9fi9XaW5lCisuUFAKK1t3aW5lXQorLmJyCit3aW5kb3dzPWM6XFx3aW5kb3dzCisuYnIKK3N5c3RlbT1jOlxcd2luZG93c1xcc3lzdGVtCisuYnIKK3RlbXA9YzpcXHRlbXAKKy5icgorcGF0aD1jOlxcd2luZG93cztjOlxcd2luZG93c1xcc3lzdGVtO2M6XFx3aW5hcHBzXFx3b3JkCisuYnIKK3N5bWJvbHRhYmxlZmlsZT0vdXNyL2xvY2FsL2xpYi93aW5lLnN5bQorLlBQCitbc2VyaWFscG9ydHNdCisuYnIKK2NvbTE9L2Rldi9jdWExCisuYnIKK2NvbTI9L2Rldi9jdWExCisuUFAKK1twYXJhbGxlbHBvcnRzXQorLmJyCitscHQxPS9kZXYvbHAwCisuUFAKK1tzcHldCisuYnIKKztGaWxlPUNPTgorLmJyCis7RmlsZT1zcHkubG9nCisuYnIKK0V4Y2x1ZGU9V01fVElNRVI7V01fU0VUQ1VSU09SO1dNX01PVVNFTU9WRTtXTV9OQ0hJVFRFU1Q7CisuYnIKK0luY2x1ZGU9V01fQ09NTUFORDsKKy5TSCBBVVRIT1JTCisuQiBXaW5lCitpcyBhdmFpbGFibGUgdGhhbmtzIHRvIHRoZSB3b3JrIG9mIEJvYiBBbXN0YWR0LCBEYWcgQXNoZWltLAorTWFydGluIEF5b3R0ZSwgUm9zcyBCaXJvLCBFcmlrIEJvcywgRm9ucyBCb3RtYW4sIEpvaG4gQnJlemFrLAorQW5kcmV3IEJ1bGhhaywgSm9obiBCdXJ0b24sIFBhdWwgRmFsc3RhZCwgT2xhZiBGbGViYmUsIFBldGVyIEdhbGJhdnksCitDYW1lcm9uIEhlaWRlLCBKZWZmcmV5IEhzdSwgTWlndWVsIGRlIEljYXphLCBBbGV4YW5kcmUgSnVsbGlhcmQsCitKb24gS29ucmF0aCwgU2NvdHQgQS4gTGFpcmQsIE1hcnRpbiB2b24gTG9ld2lzLCBLZW5uZXRoIE1hY0RvbmFsZCwKK1BldGVyIE1hY0RvbmFsZCwgV2lsbGlhbSBNYWdybywgRGF2aWQgTWV0Y2FsZmUsIE1pY2hhZWwgUGF0cmEsCitKb2huIFJpY2hhcmRzb24sIEpvaGFubmVzIFJ1c2NoZWluc2tpLCBUaG9tYXMgU2FuZGZvcmQsCitDb25zdGFudGluZSBTYXB1bnR6YWtpcywgQmVybmQgU2NobWlkdCwgWW5ndmkgU2lndXJqb25zc29uLCBSaWNrIFNsYWRrZXksCitXaWxsaWFtIFNtaXRoLCBFcmlrIFN2ZW5kc2VuLCBHb3JhbiBUaHluaSwgSmltbXkgVGlydGF3YW5nc2EsIEpvbiBUb21icywKK0xpbnVzIFRvcnZhbGRzLCBNaWNoYWVsIFZla3NsZXIsIENhcmwgV2lsbGlhbXMsIEthcmwgR3VlbnRlciBXdWVuc2NoLAorRXJpYyBZb3VuZ2RhbGUsIGFuZCBKYW1lcyBZb3VuZ21hbi4KKy5QUAorVGhpcyBtYW4gcGFnZSBpcyBtYWludGFpbmVkIGJ5IE1pa2UgUGhpbGxpcHMgKG1zcGhpbEBtYWlsLndtLmVkdSksIHNvIHBsZWFzZQorc2VuZCBhbGwgY29ycmVjdGlvbnMsIGNvbW1lbnRzLCBmbGFtZXMsIGV0Yy4sIHRvIGhpbS4KKy5TSCBCVUdTCitUaGVyZSBhcmUgdG9vIG1hbnkgdG8gY291bnQsIG11Y2ggbGVzcyBsaXN0LiAgU29tZSBhcmUgb2Ygbm90ZSwgaG93ZXZlcjoKK0FueSBXaW5kb3dzIHByb2dyYW0gdXNpbmcgVmlzdWFsIEJhc2ljIChWQlJVTnh4eC5ETEwpIHdpbGwgbm90IHJ1biB5ZXQsCitub3Igd2lsbCBhbnkgcHJvZ3JhbSBkZXBlbmRpbmcgb24gdW5kb2N1bWVudGVkIGZ1bmN0aW9ucyBvciBvbiB0aGUKK0NPTU1ETEcgKGFueSBzdGFuZGFyZCBmaWxlIG9wZW4vc2F2ZSBpbnRlcmZhY2UpIHVubGVzcyB5b3UgZGlzYWJsZSB0aGUgCitpbnRlcm5hbCBDT01NRExHIHdpdGggdGhlIAorLkkgLWRsbCAtY29tbWRsZworb3B0aW9uLiAgSW4gYWRkaXRpb24sIDE2LWNvbG9yIHN1cHBvcnQgaXMgaW1wZXJmZWN0IGF0IGJlc3QsIGFuZCAKK2ljb25zIHNvbWV0aW1lcyBkaXNwbGF5IGltcHJvcGVybHkgb24gc29tZSBzeXN0ZW1zLiAgQ2VydGFpbiAKK211bHRpLWxhbmd1YWdlIG1vZHVsZXMgd2lsbCBub3QgbG9hZCBwcm9wZXJseS4gIFByb2dyZXNzIGlzIGJlaW5nIG1hZGUgCityZWd1bGFybHksIGhvd2V2ZXIuCisuUFAKK0N1cnJlbnRseSwgbm8gZGlyZWN0b3JpZXMgaW4gdGhlIHBhdGggY2FuIGhhdmUgdXBwZXItY2FzZSBsZXR0ZXJzIGluIHRoZW0KKyhleC4gL21zZG9zL2RyaXZlQyksIGFzIHRoZSBjb252ZXJzaW9ucyBuZWNlc3NhcnkgdG8gaGFuZGxlIHRoZSBtc2RvcyAKK2ZpbGVuYW1lIGNvbnZlbnRpb25zIGN1cnJlbnRseSBjYXVzZSB0aGVtIHRvIGJlIGxvc3QuCisuUFAKK0EgcGFydGlhbCBsaXN0IG9mIGFwcGxpY2F0aW9ucyBrbm93biB0byB3b3JrIHdpdGggCisuQiB3aW5lCitpbmNsdWRlOiBzb2wsIGNydWVsLCBnb2xmLmV4ZSwgY2xvY2ssIG5vdGVwYWQsIGNoYXJtYXAsIGFuZCBjYWxjLgorVGhlIGZvbGxvd2luZyBVUkxzIHBvaW50IHRvIGRpZmZlcmVudCBzdWNjZXNzL3Rlc3RpbmcgbGlzdHM6CisuYnIKKy5JIGh0dHA6Ly93d3cuaWZpLnVpby5uby9+ZGFzaC93aW5lL3dvcmtpbmctYXBwcy5odG1sCisuYnIKKy5JIGh0dHA6Ly9kdXRpZnAudHdpLnR1ZGVsZnQubmw6ODAwMC93aW5lLworLlBQCitXZSB3b3VsZCBsaWtlIHRvIGhlYXIgYWJvdXQgd2hhdCBzb2Z0d2FyZSBkb2VzIHJ1biB1bmRlciAKKy5CIFdpbmUsCithbmQgc3VjaCByZXBvcnRzIG1heSBiZSBwb3N0ZWQgdG8gCisuSSBjb21wLmVtdWxhdG9ycy5tcy13aW5kb3dzLndpbmUuCisuU0ggQVZBSUxBQklMSVRZCitUaGUgbW9zdCByZWNlbnQgcHVibGljIHZlcnNpb24gb2YgCisuQiB3aW5lCitjYW4gYmUgZnRwJ2VkIGZyb20gdHN4LTExLm1pdC5lZHUgaW4gdGhlIC9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudCAKK2RpcmVjdG9yeS4gIFRoZSByZWxlYXNlcyBhcmUgaW4gdGhlIGZvcm1hdCAnV2luZS15eW1tZGQudGFyLmd6JywgCitvciAnV2luZS15eW1tZGQuZGlmZi5neicgZm9yIHRoZSBkaWZmJ3MgZnJvbSB0aGUgcHJldmlvdXMgcmVsZWFzZS4KKy5TSCBGSUxFUworLlBEIDAKKy5UUAorLkkgL3Vzci9sb2NhbC9iaW4vd2luZQorVGhlIGludm9rZXIgcHJvZ3JhbS4KKy5UUAorLkkgL3Vzci9sb2NhbC9ldGMvd2luZS5jb25mCitNYWluIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3Igd2luZS4KKy5UUAorLkkgQ2hhbmdlTG9nCitDaGFuZ2VzIGluIFdpbmUsIHNpbmNlIHRoZSBiZWdpbm5pbmcgKG1vc3QgcmVjZW50IGNoYW5nZXMgZmlyc3QpCisuVFAKKy5JIENvbmZpZ3VyZQorU2hlbGwgc2NyaXB0IHRvIGF1dG9tYXRlIGNvbXBpbGF0aW9uLiAgVXN1YWxseSBmb2xsb3dlZCBieSBtYWtlIChvciBnbWFrZSAKK29uICpCU0Qgc3lzdGVtcykgdG8gY29tcGlsZSB3aW5lOyBpdCBjYW4gZXZlbiBidWlsZCBhIHNhbXBsZSAKKy5CIHdpbmUuY29uZgorZmlsZQorCisuVFAKKy5JIFdpbmUgbmV3c2dyb3VwCitTdWJzY3JpYmUgdG8gY29tcC5lbXVsYXRvcnMubXMtd2luZG93cy53aW5lCmRpZmYgLS1naXQgYS9jb250cm9scy9jb21iby5jIGIvY29udHJvbHMvY29tYm8uYwppbmRleCBhYmY3YWJiLi4xOTY3OTI2IDEwMDY0NAotLS0gYS9jb250cm9scy9jb21iby5jCisrKyBiL2NvbnRyb2xzL2NvbWJvLmMKQEAgLTI5LDEwMCArMjksNiBAQAogICAqIEkgaG9wZSBubyBwcm9ncmFtcyByZWx5IG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjb21ib3MuCiAgICovCiAKLXN0YXRpYyBMT05HIENCTkNDcmVhdGUoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCQ3JlYXRlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkdldERsZ0NvZGUoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCRGVzdHJveSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JQYWludCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JLZXlEb3duKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkNoYXIoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCU2V0Rm9udCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JTZXRSZWRyYXcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCTEJ1dHRvbkRvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCU2V0Rm9jdXMoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCS2lsbEZvY3VzKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQlJlc2V0Q29udGVudCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JEaXIoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCQWRkU3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkdldExCVGV4dCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JJbnNlcnRTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCRGVsZXRlU3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkZpbmRTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCR2V0Q291bnQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCR2V0Q3VyU2VsKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkdldEl0ZW1EYXRhKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkdldEl0ZW1IZWlnaHQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCR2V0TEJUZXh0TGVuKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQlNlbGVjdFN0cmluZyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JTZXRJdGVtRGF0YSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JTZXRDdXJTZWwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCU2V0SXRlbUhlaWdodCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JTaG93RHJvcERvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLQotc3RhdGljIExPTkcgQ0JMQ3JlYXRlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkxHZXREbGdDb2RlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkxLZXlEb3duKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkxDaGFyKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkxQYWludCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JMS2lsbEZvY3VzKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkxBY3RpdmF0ZSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JMTEJ1dHRvbkRvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIENCTExCdXR0b25VcCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgQ0JMTW91c2VNb3ZlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBDQkxWU2Nyb2xsKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgV09SRCAgIG1lc3NhZ2U7Ci0gIExPTkcgICgqaGFuZGxlcikoSFdORCwgV09SRCwgV1BBUkFNLCBMUEFSQU0pOwotfSBtc2dfdGJsOwotCi1zdGF0aWMgbXNnX3RibCBjb21ib190YmxbXSA9IHsKLSAge1dNX05DQ1JFQVRFLCBDQk5DQ3JlYXRlfSwKLSAge1dNX0NSRUFURSwgQ0JDcmVhdGV9LAotICB7V01fREVTVFJPWSwgQ0JEZXN0cm95fSwKLSAge1dNX0dFVERMR0NPREUsIENCR2V0RGxnQ29kZX0sCi0gIHtXTV9LRVlET1dOLCBDQktleURvd259LAotICB7V01fQ0hBUiwgQ0JDaGFyfSwKLSAge1dNX1NFVEZPTlQsIENCU2V0Rm9udH0sCi0gIHtXTV9TRVRSRURSQVcsIENCU2V0UmVkcmF3fSwKLSAge1dNX1BBSU5ULCBDQlBhaW50fSwKLSAge1dNX0xCVVRUT05ET1dOLCBDQkxCdXR0b25Eb3dufSwKLSAge1dNX1NFVEZPQ1VTLCBDQlNldEZvY3VzfSwKLSAge1dNX0tJTExGT0NVUywgQ0JLaWxsRm9jdXN9LAotICB7Q0JfUkVTRVRDT05URU5ULCBDQlJlc2V0Q29udGVudH0sCi0gIHtDQl9ESVIsIENCRGlyfSwKLSAge0NCX0FERFNUUklORywgQ0JBZGRTdHJpbmd9LAotICB7Q0JfSU5TRVJUU1RSSU5HLCBDQkluc2VydFN0cmluZ30sCi0gIHtDQl9ERUxFVEVTVFJJTkcsIENCRGVsZXRlU3RyaW5nfSwKLSAge0NCX0ZJTkRTVFJJTkcsIENCRmluZFN0cmluZ30sCi0gIHtDQl9HRVRDT1VOVCwgQ0JHZXRDb3VudH0sCi0gIHtDQl9HRVRDVVJTRUwsIENCR2V0Q3VyU2VsfSwKLSAge0NCX0dFVElURU1EQVRBLCBDQkdldEl0ZW1EYXRhfSwKLSAge0NCX0dFVElURU1IRUlHSFQsIENCR2V0SXRlbUhlaWdodH0sCi0gIHtDQl9HRVRMQlRFWFQsIENCR2V0TEJUZXh0fSwKLSAge0NCX0dFVExCVEVYVExFTiwgQ0JHZXRMQlRleHRMZW59LAotICB7Q0JfU0VMRUNUU1RSSU5HLCBDQlNlbGVjdFN0cmluZ30sCi0gIHtDQl9TRVRJVEVNREFUQSwgQ0JTZXRJdGVtRGF0YX0sCi0gIHtDQl9TRVRDVVJTRUwsIENCU2V0Q3VyU2VsfSwKLSAge0NCX1NFVElURU1IRUlHSFQsIENCU2V0SXRlbUhlaWdodH0sCi0gIHtDQl9TSE9XRFJPUERPV04sIENCU2hvd0Ryb3BEb3dufQotICAgIAotfTsKLQotc3RhdGljIG1zZ190YmwgY2xib3hfdGJsW10gPSB7Ci0gIHtXTV9DUkVBVEUsIENCTENyZWF0ZX0sCi0gIHtXTV9HRVRETEdDT0RFLCBDQkxHZXREbGdDb2RlfSwKLSAge1dNX0tFWURPV04sIENCTEtleURvd259LAotICB7V01fQ0hBUiwgQ0JMQ2hhcn0sCi0gIHtXTV9QQUlOVCwgQ0JMUGFpbnR9LAotICB7V01fS0lMTEZPQ1VTLCBDQkxLaWxsRm9jdXN9LAotICB7V01fQUNUSVZBVEUsIENCTEFjdGl2YXRlfSwKLSAge1dNX0xCVVRUT05ET1dOLCBDQkxMQnV0dG9uRG93bn0sCi0gIHtXTV9MQlVUVE9OVVAsIENCTExCdXR0b25VcH0sCi0gIHtXTV9NT1VTRU1PVkUsIENCTE1vdXNlTW92ZX0sCi0gIHtXTV9WU0NST0xMLCBDQkxWU2Nyb2xsfQotfTsKLQogc3RhdGljIEhCSVRNQVAgaENvbWJvQml0ID0gMDsKIHN0YXRpYyBXT1JEIENCaXRIZWlnaHQsIENCaXRXaWR0aDsKIApAQCAtMTc0LDcgKzgwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCTkNDcmVhdGUKICAqLwotc3RhdGljIExPTkcgQ0JOQ0NyZWF0ZShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgQ0JOQ0NyZWF0ZShIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgQ1JFQVRFU1RSVUNUICpjcmVhdGVTdHJ1Y3Q7CiAKQEAgLTE4NSwxNCArOTEsMTQgQEAKICAgU2V0V2luZG93TG9uZyhod25kLCBHV0xfU1RZTEUsIGNyZWF0ZVN0cnVjdC0+c3R5bGUpOwogCiAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDb21ib0JveCBXTV9OQ0NSRUFURSFcbiIpOwotICByZXR1cm4gRGVmV2luZG93UHJvYyhod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIFdNX05DQ1JFQVRFLCB3UGFyYW0sIGxQYXJhbSk7CiAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JDcmVhdGUKICAqLwotc3RhdGljIExPTkcgQ0JDcmVhdGUoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCQ3JlYXRlKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUICAgbHBobDsKICAgTFBIRUFEQ09NQk8gIGxwaGM7CkBAIC0yNjgsNyArMTc0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCRGVzdHJveQogICovCi1zdGF0aWMgTE9ORyBDQkRlc3Ryb3koSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCRGVzdHJveShIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwogCkBAIC0yODEsNyArMTg3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCUGFpbnQKICAqLwotc3RhdGljIExPTkcgQ0JQYWludChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgQ0JQYWludChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwogICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwpAQCAtMzI0LDcgKzIzMCw3IEBACiAgICAgaGVpZ2h0ID0gbHBscy0+bWlzLml0ZW1IZWlnaHQ7CiAgICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGhlaWdodDsKIAotICAgIGlmIChPV05FUl9EUkFXTihscGhsKSkgeworICAgIGlmIChscGhsLT5Pd25lckRyYXduKSB7CiAgICAgICBMaXN0Qm94RHJhd0l0ZW0gKGh3bmQsIGxwaGwsIGhkYywgbHBscywgJnJlY3QsIE9EQV9EUkFXRU5USVJFLCAwKTsKICAgICB9IGVsc2UgewogICAgICAgTGlzdEJveERyYXdJdGVtIChod25kLCBscGhsLCBoZGMsIGxwbHMsICZyZWN0LCBPREFfRFJBV0VOVElSRSwgMCk7CkBAIC0zNDAsNyArMjQ2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCR2V0RGxnQ29kZQogICovCi1zdGF0aWMgTE9ORyBDQkdldERsZ0NvZGUoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCR2V0RGxnQ29kZShIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgcmV0dXJuIERMR0NfV0FOVEFSUk9XUyB8IERMR0NfV0FOVENIQVJTOwogfQpAQCAtMzQ4LDcgKzI1NCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQkxCdXR0b25Eb3duCiAgKi8KLXN0YXRpYyBMT05HIENCTEJ1dHRvbkRvd24oSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCTEJ1dHRvbkRvd24oSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIFNlbmRNZXNzYWdlKGh3bmQsQ0JfU0hPV0RST1BET1dOLCFscGhjLT5Ecm9wRG93blZpc2libGUsMCk7CkBAIC0zNTgsNyArMjY0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCS2V5RG93bgogICovCi1zdGF0aWMgTE9ORyBDQktleURvd24oSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCS2V5RG93bihIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwogICBXT1JEICAgICAgIG5ld0ZvY3VzZWQgPSBscGhsLT5JdGVtRm9jdXNlZDsKQEAgLTM5Nyw3ICszMDMsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JDaGFyCiAgKi8KLXN0YXRpYyBMT05HIENCQ2hhcihIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgQ0JDaGFyKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIFdPUkQgICAgICAgbmV3Rm9jdXNlZDsKQEAgLTQyMiw3ICszMjgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JLaWxsRm9jdXMKICAqLwotc3RhdGljIExPTkcgQ0JLaWxsRm9jdXMoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCS2lsbEZvY3VzKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICByZXR1cm4gMDsKIH0KQEAgLTQzMCw3ICszMzYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JTZXRGb2N1cwogICovCi1zdGF0aWMgTE9ORyBDQlNldEZvY3VzKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBDQlNldEZvY3VzKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICByZXR1cm4gMDsKIH0KQEAgLTQzOCw3ICszNDQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JSZXNldENvbnRlbnQKICAqLwotc3RhdGljIExPTkcgQ0JSZXNldENvbnRlbnQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCUmVzZXRDb250ZW50KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CkBAIC00NTEsNyArMzU3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCRGlyCiAgKi8KLXN0YXRpYyBMT05HIENCRGlyKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBDQkRpcihIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgV09SRCB3UmV0OwogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CkBAIC00NjUsMTMgKzM3MSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JJbnNlcnRTdHJpbmcKICAqLwotc3RhdGljIExPTkcgQ0JJbnNlcnRTdHJpbmcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCSW5zZXJ0U3RyaW5nKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBXT1JEICB3UmV0OwogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAKLSAgaWYgKEhhc1N0cmluZ3MobHBobCkpCisgIGlmIChscGhsLT5IYXNTdHJpbmdzKQogICAgIHdSZXQgPSBMaXN0Qm94SW5zZXJ0U3RyaW5nKGxwaGwsIHdQYXJhbSwgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOwogICBlbHNlCiAgICAgd1JldCA9IExpc3RCb3hJbnNlcnRTdHJpbmcobHBobCwgd1BhcmFtLCAoTFBTVFIpbFBhcmFtKTsKQEAgLTQ4MywxMyArMzg5LDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQkFkZFN0cmluZwogICovCi1zdGF0aWMgTE9ORyBDQkFkZFN0cmluZyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgQ0JBZGRTdHJpbmcoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIFdPUkQgIHdSZXQ7CiAgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKICAgTFBIRUFEQ09NQk8gbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKIAotICBpZiAoSGFzU3RyaW5ncyhscGhsKSkKKyAgaWYgKGxwaGwtPkhhc1N0cmluZ3MpCiAgICAgd1JldCA9IExpc3RCb3hBZGRTdHJpbmcobHBobCwgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOwogICBlbHNlCiAgICAgd1JldCA9IExpc3RCb3hBZGRTdHJpbmcobHBobCwgKExQU1RSKWxQYXJhbSk7CkBAIC01MDEsNyArNDA3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCRGVsZXRlU3RyaW5nCiAgKi8KLXN0YXRpYyBMT05HIENCRGVsZXRlU3RyaW5nKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBDQkRlbGV0ZVN0cmluZyhIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwogICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwpAQCAtNTE0LDcgKzQyMCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQlNlbGVjdFN0cmluZwogICovCi1zdGF0aWMgTE9ORyBDQlNlbGVjdFN0cmluZyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgQ0JTZWxlY3RTdHJpbmcoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKICAgV09SRCAgd1JldDsKQEAgLTUyOSw3ICs0MzUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JGaW5kU3RyaW5nCiAgKi8KLXN0YXRpYyBMT05HIENCRmluZFN0cmluZyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgQ0JGaW5kU3RyaW5nKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIHJldHVybiBMaXN0Qm94RmluZFN0cmluZyhscGhsLCB3UGFyYW0sIGxQYXJhbSk7CkBAIC01MzgsNyArNDQ0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCR2V0Q291bnQKICAqLwotc3RhdGljIExPTkcgQ0JHZXRDb3VudChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgQ0JHZXRDb3VudChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwogICByZXR1cm4gbHBobC0+SXRlbXNDb3VudDsKQEAgLTU0Nyw3ICs0NTMsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JTZXRDdXJTZWwKICAqLwotc3RhdGljIExPTkcgQ0JTZXRDdXJTZWwoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCU2V0Q3VyU2VsKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIFdPUkQgIHdSZXQ7CkBAIC01NjMsNyArNDY5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCR2V0Q3VyU2VsCiAgKi8KLXN0YXRpYyBMT05HIENCR2V0Q3VyU2VsKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBDQkdldEN1clNlbChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwogICByZXR1cm4gbHBobC0+SXRlbUZvY3VzZWQ7CkBAIC01NzIsNyArNDc4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCR2V0SXRlbUhlaWdodAogICovCi1zdGF0aWMgTE9ORyBDQkdldEl0ZW1IZWlnaHQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCR2V0SXRlbUhlaWdodChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwogICBMUExJU1RTVFJVQ1QgbHBscyA9IExpc3RCb3hHZXRJdGVtIChscGhsLCB3UGFyYW0pOwpAQCAtNTg0LDcgKzQ5MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQlNldEl0ZW1IZWlnaHQKICAqLwotc3RhdGljIExPTkcgQ0JTZXRJdGVtSGVpZ2h0KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBDQlNldEl0ZW1IZWlnaHQoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKICAgcmV0dXJuIExpc3RCb3hTZXRJdGVtSGVpZ2h0KGxwaGwsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTU5Myw3ICs0OTksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JTZXRSZWRyYXcKICAqLwotc3RhdGljIExPTkcgQ0JTZXRSZWRyYXcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCU2V0UmVkcmF3KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIGxwaGwtPmJSZWRyYXdGbGFnID0gd1BhcmFtOwpAQCAtNjAzLDcgKzUwOSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQlNldEZvbnQKICAqLwotc3RhdGljIExPTkcgQ0JTZXRGb250KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBDQlNldEZvbnQoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAKQEAgLTYxOCwxOSArNTI0LDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQkdldExCVGV4dExlbgogICovCi1zdGF0aWMgTE9ORyBDQkdldExCVGV4dExlbihIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgQ0JHZXRMQlRleHRMZW4oSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgICBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwogICBMUExJU1RTVFJVQ1QgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsd1BhcmFtKTsKIAotICBpZiAobHBscyA9PSBOVUxMIHx8ICFIYXNTdHJpbmdzKGxwaGwpKSByZXR1cm4gTEJfRVJSOworICBpZiAobHBscyA9PSBOVUxMIHx8ICFscGhsLT5IYXNTdHJpbmdzKSByZXR1cm4gTEJfRVJSOwogICByZXR1cm4gc3RybGVuKGxwbHMtPml0ZW1UZXh0KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JHZXRMQlRleHQKICAqLwotc3RhdGljIExPTkcgQ0JHZXRMQlRleHQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIENCR2V0TEJUZXh0KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIHJldHVybiBMaXN0Qm94R2V0VGV4dChscGhsLCB3UGFyYW0sIChMUFNUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKQEAgLTYzOSw3ICs1NDUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JHZXRJdGVtRGF0YQogICovCi1zdGF0aWMgTE9ORyBDQkdldEl0ZW1EYXRhKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBDQkdldEl0ZW1EYXRhKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIHJldHVybiBMaXN0Qm94R2V0SXRlbURhdGEobHBobCwgd1BhcmFtKTsKQEAgLTY0OCw3ICs1NTQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JTZXRJdGVtRGF0YQogICovCi1zdGF0aWMgTE9ORyBDQlNldEl0ZW1EYXRhKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBDQlNldEl0ZW1EYXRhKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIHJldHVybiBMaXN0Qm94U2V0SXRlbURhdGEobHBobCwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtNjU3LDcgKzU2Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQlNob3dEcm9wRG93bgogICovCi1zdGF0aWMgTE9ORyBDQlNob3dEcm9wRG93bihIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgQ0JTaG93RHJvcERvd24oSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIFJFQ1QgcmVjdDsKQEAgLTY4MSwxNiArNTg3LDM4IEBACiAgKi8KIExPTkcgQ29tYm9Cb3hXbmRQcm9jKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0gIGludCBpZHggPSAwOwotICBpbnQgdGFibGVfc2l6ZSA9IHNpemVvZiAoY29tYm9fdGJsKSAvIHNpemVvZiAobXNnX3RibCk7Ci0KLSAgd2hpbGUgKGlkeCA8IHRhYmxlX3NpemUpIHsKLSAgICBpZiAobWVzc2FnZSA9PSBjb21ib190YmxbaWR4XS5tZXNzYWdlKSB7Ci0gICAgICByZXR1cm4gKCooY29tYm9fdGJsW2lkeF0uaGFuZGxlcikpKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICBzd2l0Y2gobWVzc2FnZSkgewkKKyAgICAgY2FzZSBXTV9OQ0NSRUFURTogcmV0dXJuIENCTkNDcmVhdGUoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIFdNX0NSRUFURTogcmV0dXJuIENCQ3JlYXRlKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9ERVNUUk9ZOiByZXR1cm4gQ0JEZXN0cm95KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9HRVRETEdDT0RFOiByZXR1cm4gQ0JHZXREbGdDb2RlKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9LRVlET1dOOiByZXR1cm4gQ0JLZXlEb3duKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9DSEFSOiByZXR1cm4gQ0JDaGFyKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9TRVRGT05UOiByZXR1cm4gQ0JTZXRGb250KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9TRVRSRURSQVc6IHJldHVybiBDQlNldFJlZHJhdyhod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fUEFJTlQ6IHJldHVybiBDQlBhaW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjogcmV0dXJuIENCTEJ1dHRvbkRvd24oaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIFdNX1NFVEZPQ1VTOiByZXR1cm4gQ0JTZXRGb2N1cyhod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fS0lMTEZPQ1VTOiByZXR1cm4gQ0JLaWxsRm9jdXMoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIENCX1JFU0VUQ09OVEVOVDogcmV0dXJuIENCUmVzZXRDb250ZW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBDQl9ESVI6IHJldHVybiBDQkRpcihod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgQ0JfQUREU1RSSU5HOiByZXR1cm4gQ0JBZGRTdHJpbmcoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIENCX0lOU0VSVFNUUklORzogcmV0dXJuIENCSW5zZXJ0U3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBDQl9ERUxFVEVTVFJJTkc6IHJldHVybiBDQkRlbGV0ZVN0cmluZyhod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgQ0JfRklORFNUUklORzogcmV0dXJuIENCRmluZFN0cmluZyhod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgQ0JfR0VUQ09VTlQ6IHJldHVybiBDQkdldENvdW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBDQl9HRVRDVVJTRUw6IHJldHVybiBDQkdldEN1clNlbChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgQ0JfR0VUSVRFTURBVEE6IHJldHVybiBDQkdldEl0ZW1EYXRhKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBDQl9HRVRJVEVNSEVJR0hUOiByZXR1cm4gQ0JHZXRJdGVtSGVpZ2h0KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBDQl9HRVRMQlRFWFQ6IHJldHVybiBDQkdldExCVGV4dChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgQ0JfR0VUTEJURVhUTEVOOiByZXR1cm4gQ0JHZXRMQlRleHRMZW4oaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIENCX1NFTEVDVFNUUklORzogcmV0dXJuIENCU2VsZWN0U3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBDQl9TRVRJVEVNREFUQTogcmV0dXJuIENCU2V0SXRlbURhdGEoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIENCX1NFVENVUlNFTDogcmV0dXJuIENCU2V0Q3VyU2VsKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBDQl9TRVRJVEVNSEVJR0hUOiByZXR1cm4gQ0JTZXRJdGVtSGVpZ2h0KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBDQl9TSE9XRFJPUERPV046IHJldHVybiBDQlNob3dEcm9wRG93bihod25kLCB3UGFyYW0sIGxQYXJhbSk7CiAgICAgfQotICAgIGlkeCsrOwotICB9Ci0gIHJldHVybiBEZWZXaW5kb3dQcm9jIChod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTcwOSw3ICs2MzcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JMQ3JlYXRlCiAgKi8KLXN0YXRpYyBMT05HIENCTENyZWF0ZSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCitzdGF0aWMgTE9ORyBDQkxDcmVhdGUoIEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKIHsKICAgQ1JFQVRFU1RSVUNUICpjcmVhdGVTdHJ1Y3QgPSAoQ1JFQVRFU1RSVUNUICopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKICAgU2V0V2luZG93V29yZChod25kLDAsTE9XT1JEKGNyZWF0ZVN0cnVjdC0+bHBDcmVhdGVQYXJhbXMpKTsKQEAgLTcxOSw3ICs2NDcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JMR2V0RGxnQ29kZQogICovCi1zdGF0aWMgTE9ORyBDQkxHZXREbGdDb2RlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK3N0YXRpYyBMT05HIENCTEdldERsZ0NvZGUoIEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKIHsKICAgcmV0dXJuIERMR0NfV0FOVEFSUk9XUyB8IERMR0NfV0FOVENIQVJTOwogfQpAQCAtNzI3LDcgKzY1NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQkxLZXlEb3duCiAgKi8KLXN0YXRpYyBMT05HIENCTEtleURvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKSAKK3N0YXRpYyBMT05HIENCTEtleURvd24oIEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkgCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IENMQm94R2V0TGlzdEhlYWRlcihod25kKTsKICAgV09SRCBuZXdGb2N1c2VkID0gbHBobC0+SXRlbUZvY3VzZWQ7CkBAIC03NzUsNyArNzAzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCTENoYXIKICAqLwotc3RhdGljIExPTkcgQ0JMQ2hhciggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCitzdGF0aWMgTE9ORyBDQkxDaGFyKCBIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCiB7CiAgIHJldHVybiAwOwogfQpAQCAtNzgzLDcgKzcxMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQkxQYWludAogICovCi1zdGF0aWMgTE9ORyBDQkxQYWludCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCitzdGF0aWMgTE9ORyBDQkxQYWludCggSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQogewogICBMUEhFQURMSVNUICAgbHBobCA9IENMQm94R2V0TGlzdEhlYWRlcihod25kKTsKICAgTFBMSVNUU1RSVUNUIGxwbHM7CkBAIC04MjgsNyArNzU2LDcgQEAKICAgICAgIGxwbHMtPml0ZW1SZWN0LnJpZ2h0ICA9IHJlY3QucmlnaHQ7CiAKICAgICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsImRyYXdpbmcgaXRlbTogJWQgJWQgJWQgJWQgJWRcbiIscmVjdC5sZWZ0LHRvcCxyZWN0LnJpZ2h0LHRvcCtoZWlnaHQsbHBscy0+aXRlbVN0YXRlKTsKLSAgICAgIGlmIChPV05FUl9EUkFXTihscGhsKSkgeworICAgICAgaWYgKGxwaGwtPk93bmVyRHJhd24pIHsKIAlMaXN0Qm94RHJhd0l0ZW0gKGNvbWJvaHduZCwgbHBobCwgaGRjLCBscGxzLCAmbHBscy0+aXRlbVJlY3QsIE9EQV9EUkFXRU5USVJFLCAwKTsKIAlpZiAobHBscy0+aXRlbVN0YXRlKQogCSAgTGlzdEJveERyYXdJdGVtIChjb21ib2h3bmQsIGxwaGwsIGhkYywgbHBscywgJmxwbHMtPml0ZW1SZWN0LCBPREFfU0VMRUNULCBPRFNfU0VMRUNURUQpOwpAQCAtODU0LDcgKzc4Miw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQkxLaWxsRm9jdXMKICAqLwotc3RhdGljIExPTkcgQ0JMS2lsbEZvY3VzKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK3N0YXRpYyBMT05HIENCTEtpbGxGb2N1cyggSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQogewogLyogIFNlbmRNZXNzYWdlKENMQm94R2V0Q29tYm8oaHduZCksQ0JfU0hPV0RST1BET1dOLDAsMCk7Ki8KICAgcmV0dXJuIDA7CkBAIC04NjMsNyArNzkxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCTEFjdGl2YXRlCiAgKi8KLXN0YXRpYyBMT05HIENCTEFjdGl2YXRlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK3N0YXRpYyBMT05HIENCTEFjdGl2YXRlKCBIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCiB7CiAgIGlmICh3UGFyYW0gPT0gV0FfSU5BQ1RJVkUpCiAgICAgU2VuZE1lc3NhZ2UoQ0xCb3hHZXRDb21ibyhod25kKSxDQl9TSE9XRFJPUERPV04sMCwwKTsKQEAgLTg3Myw3ICs4MDEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JMTEJ1dHRvbkRvd24KICAqLwotc3RhdGljIExPTkcgQ0JMTEJ1dHRvbkRvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQorc3RhdGljIExPTkcgQ0JMTEJ1dHRvbkRvd24oIEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKIHsKICAgTFBIRUFETElTVCBscGhsID0gQ0xCb3hHZXRMaXN0SGVhZGVyKGh3bmQpOwogICBpbnQgICAgICAgIHk7CkBAIC04OTgsNyArODI2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCTExCdXR0b25VcAogICovCi1zdGF0aWMgTE9ORyBDQkxMQnV0dG9uVXAoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQorc3RhdGljIExPTkcgQ0JMTEJ1dHRvblVwKCBIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IENMQm94R2V0TGlzdEhlYWRlcihod25kKTsKIApAQCAtOTE2LDcgKzg0NCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDQkxNb3VzZU1vdmUKICAqLwotc3RhdGljIExPTkcgQ0JMTW91c2VNb3ZlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK3N0YXRpYyBMT05HIENCTE1vdXNlTW92ZSggSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBDTEJveEdldExpc3RIZWFkZXIoaHduZCk7CiAgIGludCAgeTsKQEAgLTk1OSw3ICs4ODcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0JMVlNjcm9sbAogICovCi1zdGF0aWMgTE9ORyBDQkxWU2Nyb2xsKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK3N0YXRpYyBMT05HIENCTFZTY3JvbGwoIEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKIHsKICAgTFBIRUFETElTVCBscGhsID0gQ0xCb3hHZXRMaXN0SGVhZGVyKGh3bmQpOwogICBpbnQgIHk7CkBAIC0xMDA5LDE2ICs5MzcsMjAgQEAKICAqLwogTE9ORyBDb21ib0xCb3hXbmRQcm9jKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0gIGludCBpZHggPSAwOwotICBpbnQgdGFibGVfc2l6ZSA9IHNpemVvZiAoY2xib3hfdGJsKSAvIHNpemVvZiAobXNnX3RibCk7Ci0KLSAgd2hpbGUgKGlkeCA8IHRhYmxlX3NpemUpIHsKLSAgICBpZiAobWVzc2FnZSA9PSBjbGJveF90YmxbaWR4XS5tZXNzYWdlKSB7Ci0gICAgICByZXR1cm4gKCooY2xib3hfdGJsW2lkeF0uaGFuZGxlcikpKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICBzd2l0Y2gobWVzc2FnZSkgewkKKyAgICAgY2FzZSBXTV9DUkVBVEU6IHJldHVybiBDQkxDcmVhdGUoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIFdNX0dFVERMR0NPREU6IHJldHVybiBDQkxHZXREbGdDb2RlKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9LRVlET1dOOiByZXR1cm4gQ0JMS2V5RG93bihod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fQ0hBUjogcmV0dXJuIENCTENoYXIoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIFdNX1BBSU5UOiByZXR1cm4gQ0JMUGFpbnQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIFdNX0tJTExGT0NVUzogcmV0dXJuIENCTEtpbGxGb2N1cyhod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fQUNUSVZBVEU6IHJldHVybiBDQkxBY3RpdmF0ZShod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fTEJVVFRPTkRPV046IHJldHVybiBDQkxMQnV0dG9uRG93bihod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fTEJVVFRPTlVQOiByZXR1cm4gQ0JMTEJ1dHRvblVwKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9NT1VTRU1PVkU6IHJldHVybiBDQkxNb3VzZU1vdmUoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIFdNX1ZTQ1JPTEw6IHJldHVybiBDQkxWU2Nyb2xsKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKICAgICB9Ci0gICAgaWR4Kys7Ci0gIH0KLSAgcmV0dXJuIERlZldpbmRvd1Byb2MgKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICByZXR1cm4gRGVmV2luZG93UHJvYyhod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2xpc3Rib3guYyBiL2NvbnRyb2xzL2xpc3Rib3guYwppbmRleCBhMjUxOGI2Li5kMWZjOWFjIDEwMDY0NAotLS0gYS9jb250cm9scy9saXN0Ym94LmMKKysrIGIvY29udHJvbHMvbGlzdGJveC5jCkBAIC00MCwxMjAgKzQwLDYgQEAKIAogI2RlZmluZSBMSVNUX0hFQVBfU0laRSAweDEwMDAwCiAKLS8qIERlc2lnbiBub3RlcyBnbyBoZXJlICovCi0KLXN0YXRpYyBMT05HIExCQ3JlYXRlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQkdldERsZ0NvZGUoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCRGVzdHJveSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJWU2Nyb2xsKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQkhTY3JvbGwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCTEJ1dHRvbkRvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCTEJ1dHRvblVwKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQlJCdXR0b25VcCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJNb3VzZU1vdmUoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCS2V5RG93biggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJDaGFyKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQlNldEZvbnQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCU2V0UmVkcmF3KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQlBhaW50KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQlNldEZvY3VzKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQktpbGxGb2N1cyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJSZXNldENvbnRlbnQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCRGlyKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQkFkZFN0cmluZyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJHZXRUZXh0KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQkluc2VydFN0cmluZyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJEZWxldGVTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCRmluZFN0cmluZyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJHZXRDYXJldEluZGV4KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQkdldENvdW50KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQkdldEN1clNlbCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJHZXRIb3Jpem9udGFsRXh0ZW50KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCR2V0SXRlbURhdGEoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCR2V0SXRlbUhlaWdodCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJHZXRJdGVtUmVjdCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJHZXRTZWwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCR2V0U2VsQ291bnQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCR2V0U2VsSXRlbXMoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCR2V0VGV4dExlbiggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJHZXRUb3BJbmRleCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJTZWxlY3RTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCU2VsSXRlbVJhbmdlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQlNldENhcmV0SW5kZXgoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCU2V0Q29sdW1uV2lkdGgoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCU2V0SG9yaXpvbnRhbEV4dGVudChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQlNldEl0ZW1EYXRhKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQlNldFRhYlN0b3BzKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1zdGF0aWMgTE9ORyBMQlNldEN1clNlbCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgTEJTZXRTZWwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCU2V0VG9wSW5kZXgoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLXN0YXRpYyBMT05HIExCU2V0SXRlbUhlaWdodCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFdPUkQgICBtZXNzYWdlOwotICBMT05HICAoKmhhbmRsZXIpKEhXTkQsIFdPUkQsIFdQQVJBTSwgTFBBUkFNKTsKLX0gbXNnX3RibDsKLQotc3RhdGljIG1zZ190YmwgbWV0aG9kc1tdID0gewotICB7V01fQ1JFQVRFLCBMQkNyZWF0ZX0sCi0gIHtXTV9ERVNUUk9ZLCBMQkRlc3Ryb3l9LAotICB7V01fR0VURExHQ09ERSwgTEJHZXREbGdDb2RlfSwKLSAge1dNX1ZTQ1JPTEwsIExCVlNjcm9sbH0sCi0gIHtXTV9IU0NST0xMLCBMQkhTY3JvbGx9LAotICB7V01fTEJVVFRPTkRPV04sIExCTEJ1dHRvbkRvd259LAotICB7V01fTEJVVFRPTlVQLCBMQkxCdXR0b25VcH0sCi0gIHtXTV9SQlVUVE9OVVAsIExCUkJ1dHRvblVwfSwKLSAge1dNX0xCVVRUT05EQkxDTEssIExCUkJ1dHRvblVwfSwKLSAge1dNX01PVVNFTU9WRSwgTEJNb3VzZU1vdmV9LAotICB7V01fS0VZRE9XTiwgTEJLZXlEb3dufSwKLSAge1dNX0NIQVIsIExCQ2hhcn0sCi0gIHtXTV9TRVRGT05ULCBMQlNldEZvbnR9LAotICB7V01fU0VUUkVEUkFXLCBMQlNldFJlZHJhd30sCi0gIHtXTV9QQUlOVCwgTEJQYWludH0sCi0gIHtXTV9TRVRGT0NVUywgTEJTZXRGb2N1c30sCi0gIHtXTV9LSUxMRk9DVVMsIExCS2lsbEZvY3VzfSwKLSAge0xCX1JFU0VUQ09OVEVOVCwgTEJSZXNldENvbnRlbnR9LAotICB7TEJfRElSLCBMQkRpcn0sCi0gIHtMQl9BRERTVFJJTkcsIExCQWRkU3RyaW5nfSwKLSAge0xCX0lOU0VSVFNUUklORywgTEJJbnNlcnRTdHJpbmd9LAotICB7TEJfREVMRVRFU1RSSU5HLCBMQkRlbGV0ZVN0cmluZ30sCi0gIHtMQl9GSU5EU1RSSU5HLCBMQkZpbmRTdHJpbmd9LAotICB7TEJfR0VUQ0FSRVRJTkRFWCwgTEJHZXRDYXJldEluZGV4fSwKLSAge0xCX0dFVENPVU5ULCBMQkdldENvdW50fSwKLSAge0xCX0dFVENVUlNFTCwgTEJHZXRDdXJTZWx9LAotICB7TEJfR0VUSE9SSVpPTlRBTEVYVEVOVCwgTEJHZXRIb3Jpem9udGFsRXh0ZW50fSwKLSAge0xCX0dFVElURU1EQVRBLCBMQkdldEl0ZW1EYXRhfSwKLSAge0xCX0dFVElURU1IRUlHSFQsIExCR2V0SXRlbUhlaWdodH0sCi0gIHtMQl9HRVRJVEVNUkVDVCwgTEJHZXRJdGVtUmVjdH0sCi0gIHtMQl9HRVRTRUwsIExCR2V0U2VsfSwKLSAge0xCX0dFVFNFTENPVU5ULCBMQkdldFNlbENvdW50fSwKLSAge0xCX0dFVFNFTElURU1TLCBMQkdldFNlbEl0ZW1zfSwKLSAge0xCX0dFVFRFWFQsIExCR2V0VGV4dH0sCi0gIHtMQl9HRVRURVhUTEVOLCBMQkdldFRleHRMZW59LAotICB7TEJfR0VUVE9QSU5ERVgsIExCR2V0VG9wSW5kZXh9LAotICB7TEJfU0VMRUNUU1RSSU5HLCBMQlNlbGVjdFN0cmluZ30sCi0gIHtMQl9TRUxJVEVNUkFOR0UsIExCU2VsSXRlbVJhbmdlfSwKLSAge0xCX1NFVENBUkVUSU5ERVgsIExCU2V0Q2FyZXRJbmRleH0sCi0gIHtMQl9TRVRDT0xVTU5XSURUSCwgTEJTZXRDb2x1bW5XaWR0aH0sCi0gIHtMQl9TRVRIT1JJWk9OVEFMRVhURU5ULCBMQlNldEhvcml6b250YWxFeHRlbnR9LAotICB7TEJfU0VUSVRFTURBVEEsIExCU2V0SXRlbURhdGF9LAotICB7TEJfU0VUVEFCU1RPUFMsIExCU2V0VGFiU3RvcHN9LAotICB7TEJfU0VUQ1VSU0VMLCBMQlNldEN1clNlbH0sCi0gIHtMQl9TRVRTRUwsIExCU2V0U2VsfSwKLSAge0xCX1NFVFRPUElOREVYLCBMQlNldFRvcEluZGV4fSwKLSAge0xCX1NFVElURU1IRUlHSFQsIExCU2V0SXRlbUhlaWdodH0KLX07Ci0KLUJPT0wgT1dORVJfRFJBV04oTFBIRUFETElTVCBscGhsKQotewotICByZXR1cm4gbHBobC0+ZHdTdHlsZSAmIChMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfT1dORVJEUkFXVkFSSUFCTEUpOwotfQotCi1CT09MIEhhc1N0cmluZ3MoTFBIRUFETElTVCBscGhsKQotewotICByZXR1cm4gKGxwaGwtPmR3U3R5bGUgJiBMQlNfSEFTU1RSSU5HUykgfHwgIU9XTkVSX0RSQVdOKGxwaGwpOwotfQotCiBzdGF0aWMgdm9pZCBMaXN0Qm94SW5pdGlhbGl6ZShMUEhFQURMSVNUIGxwaGwpCiB7CiAgIGxwaGwtPmxwRmlyc3QgICAgICAgID0gTlVMTDsKQEAgLTE4Nyw4ICs3MywxMCBAQAogICBscGhsLT5oUGFyZW50ICAgICAgICA9IHBhcmVudDsKICAgbHBobC0+U3RkSXRlbUhlaWdodCAgPSAxNTsgLyogRklYTUU6IHNob3VsZCBnZXQgdGhlIGZvbnQgaGVpZ2h0ICovCiAgIGxwaGwtPmR3U3R5bGUgICAgICAgID0gc3R5bGVzOworICBscGhsLT5Pd25lckRyYXduICAgICA9IHN0eWxlcyAmIChMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfT1dORVJEUkFXVkFSSUFCTEUpOworICBscGhsLT5IYXNTdHJpbmdzICAgICA9IChzdHlsZXMgJiBMQlNfSEFTU1RSSU5HUykgfHwgIWxwaGwtPk93bmVyRHJhd247CiAKLSAgaWYgKE9XTkVSX0RSQVdOKGxwaGwpKSB7CisgIGlmIChscGhsLT5Pd25lckRyYXduKSB7CiAgICAgTElTVFNUUlVDVCBkdW1teWxzOwogICAgIAogICAgIGxwaGwtPmhEcmF3SXRlbVN0cnVjdCA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoRFJBV0lURU1TVFJVQ1QpKTsKQEAgLTMwMiw3ICsxOTAsNyBAQAogdm9pZCBMaXN0Qm94RHJhd0l0ZW0gKEhXTkQgaHduZCwgTFBIRUFETElTVCBscGhsLCBIREMgaGRjLCBMUExJU1RTVFJVQ1QgbHBscywgCiAJCSAgICAgIFJFQ1QgKnJlY3QsIFdPUkQgaXRlbUFjdGlvbiwgV09SRCBpdGVtU3RhdGUpCiB7Ci0gIGlmIChPV05FUl9EUkFXTihscGhsKSkgeworICBpZiAobHBobC0+T3duZXJEcmF3bikgewogICAgIERSQVdJVEVNU1RSVUNUICAgKmRpcyA9IFVTRVJfSEVBUF9MSU5fQUREUihscGhsLT5oRHJhd0l0ZW1TdHJ1Y3QpOwogCiAgICAgZGlzLT5DdGxJRCAgICA9IGxwbHMtPm1pcy5DdGxJRDsKQEAgLTQ0Niw3ICszMzQsOCBAQAogICBscGhsLT5JdGVtc0NvdW50Kys7CiAgIAogICBoU3RyID0gMDsKLSAgaWYgKEhhc1N0cmluZ3MobHBobCkpIHsKKyAgaWYgKGxwaGwtPkhhc1N0cmluZ3MpIHsKKyAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCIgIHN0cmluZzogJXNcbiIsIG5ld3N0cik7CiAgICAgaFN0ciA9IExJU1RfSEVBUF9BTExPQyhscGhsLCBMTUVNX01PVkVBQkxFLCBzdHJsZW4obmV3c3RyKSArIDEpOwogICAgIHN0ciA9IChMUFNUUilMSVNUX0hFQVBfQUREUihscGhsLCBoU3RyKTsKICAgICBpZiAoc3RyID09IE5VTEwpIHJldHVybiBMQl9FUlJTUEFDRTsKQEAgLTQ4MCw3ICszNjksNyBAQAogewogICAgIFVJTlQgcG9zID0gKFVJTlQpIC0xOwogICAgIAotICAgIGlmIChIYXNTdHJpbmdzKGxwaGwpICYmIChscGhsLT5kd1N0eWxlICYgTEJTX1NPUlQpKSB7CisgICAgaWYgKGxwaGwtPkhhc1N0cmluZ3MgJiYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfU09SVCkpIHsKIAlMUExJU1RTVFJVQ1QgbHBscyA9IGxwaGwtPmxwRmlyc3Q7CiAJZm9yIChwb3MgPSAwOyBscGxzICE9IE5VTEw7IGxwbHMgPSBscGxzLT5scE5leHQsIHBvcysrKQogCSAgICBpZiAoc3RyY21wKGxwbHMtPml0ZW1UZXh0LCBuZXdzdHIpID49IDApCkBAIC01MDIsNyArMzkxLDcgQEAKICAgbHBscyA9IExpc3RCb3hHZXRJdGVtIChscGhsLCB1SW5kZXgpOwogICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwogCi0gIGlmICghSGFzU3RyaW5ncyhscGhsKSkgeworICBpZiAoIWxwaGwtPkhhc1N0cmluZ3MpIHsKICAgICAqKChsb25nICopT3V0U3RyKSA9IGxwbHMtPm1pcy5pdGVtRGF0YTsKICAgICByZXR1cm4gNDsKICAgfQpAQCAtNTc4LDEyICs0NjcsMTIgQEAKIAogICBpZiAoRmlyc3QgPiBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOwogCi0gIGlmIChIYXNTdHJpbmdzKGxwaGwpKSBscE1hdGNoU3RyID0gUFRSX1NFR19UT19MSU4oTWF0Y2hTdHIpOworICBpZiAobHBobC0+SGFzU3RyaW5ncykgbHBNYXRjaFN0ciA9IFBUUl9TRUdfVE9fTElOKE1hdGNoU3RyKTsKICAgCiAgIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCBGaXJzdCk7CiAgIENvdW50ID0gMDsKICAgd2hpbGUobHBscyAhPSBOVUxMKSB7Ci0gICAgaWYgKEhhc1N0cmluZ3MobHBobCkpIHsKKyAgICBpZiAobHBobC0+SGFzU3RyaW5ncykgewogICAgICAgaWYgKHN0cnN0cihscGxzLT5pdGVtVGV4dCwgbHBNYXRjaFN0cikgPT0gbHBscy0+aXRlbVRleHQpIHJldHVybiBDb3VudDsKICAgICB9IGVsc2UgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfU09SVCkgewogICAgICAgLyogWFhYIERvIGEgY29tcGFyZSBpdGVtICovCkBAIC02MDAsNyArNDg5LDcgQEAKICAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7CiAKICAgd2hpbGUgKENvdW50IDwgRmlyc3QpIHsKLSAgICBpZiAoSGFzU3RyaW5ncyhscGhsKSkgeworICAgIGlmIChscGhsLT5IYXNTdHJpbmdzKSB7CiAgICAgICBpZiAoc3Ryc3RyKGxwbHMtPml0ZW1UZXh0LCBscE1hdGNoU3RyKSA9PSBscGxzLT5pdGVtVGV4dCkgcmV0dXJuIENvdW50OwogICAgIH0gZWxzZSBpZiAobHBobC0+ZHdTdHlsZSAmIExCU19TT1JUKSB7CiAgICAgICAvKiBYWFggRG8gYSBjb21wYXJlIGl0ZW0gKi8KQEAgLTc5NCw3ICs2ODMsNyBAQAogICBVSU5UCSAgICAgICBjb3VudCxmaXJzdDsKIAogICBpZiAoKGNoYXIpd0NoYXIgPCAnICcpIHJldHVybiBMQl9FUlI7Ci0gIGlmICghSGFzU3RyaW5ncyhscGhsKSkgcmV0dXJuIExCX0VSUjsKKyAgaWYgKCFscGhsLT5IYXNTdHJpbmdzKSByZXR1cm4gTEJfRVJSOwogCiAgIGxwbHMgPSBscGhsLT5scEZpcnN0OwogICAKQEAgLTgxNSw3ICs3MDQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJDcmVhdGUKICAqLwotc3RhdGljIExPTkcgTEJDcmVhdGUoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCQ3JlYXRlKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUICAgbHBobDsKICAgUkVDVCByZWN0OwpAQCAtODM2LDcgKzcyNSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkRlc3Ryb3kKICAqLwotc3RhdGljIExPTkcgTEJEZXN0cm95KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQkRlc3Ryb3koSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogCkBAIC04NTAsNyArNzM5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCVlNjcm9sbAogICovCi1zdGF0aWMgTE9ORyBMQlZTY3JvbGwoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCVlNjcm9sbChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIGludCAgeTsKQEAgLTg5OSw3ICs3ODgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJIU2Nyb2xsCiAgKi8KLXN0YXRpYyBMT05HIExCSFNjcm9sbChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJIU2Nyb2xsKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGw7CiAgIGludCAgICAgICAgeTsKQEAgLTk1Niw3ICs4NDUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJMQnV0dG9uRG93bgogICovCi1zdGF0aWMgTE9ORyBMQkxCdXR0b25Eb3duKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQkxCdXR0b25Eb3duKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgV09SRCAgICAgICB3UmV0OwpAQCAtOTkyLDcgKzg4MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkxCdXR0b25VcAogICovCi1zdGF0aWMgTE9ORyBMQkxCdXR0b25VcChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJMQnV0dG9uVXAoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogCkBAIC0xMDA3LDcgKzg5Niw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlJCdXR0b25VcAogICovCi1zdGF0aWMgTE9ORyBMQlJCdXR0b25VcChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJSQnV0dG9uVXAoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogCkBAIC0xMDIwLDcgKzkwOSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQk1vdXNlTW92ZQogICovCi1zdGF0aWMgTE9ORyBMQk1vdXNlTW92ZShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJNb3VzZU1vdmUoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBpbnQgIHk7CkBAIC0xMDcxLDcgKzk2MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQktleURvd24KICAqLwotc3RhdGljIExPTkcgTEJLZXlEb3duKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQktleURvd24oSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBXT1JEICAgICAgIG5ld0ZvY3VzZWQgPSBscGhsLT5JdGVtRm9jdXNlZDsKQEAgLTExNDMsNyArMTAzMiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkNoYXIKICAqLwotc3RhdGljIExPTkcgTEJDaGFyKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQkNoYXIoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBXT1JEICAgICAgIG5ld0ZvY3VzZWQ7CkBAIC0xMTY5LDcgKzEwNTgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJTZXRSZWRyYXcKICAqLwotc3RhdGljIExPTkcgTEJTZXRSZWRyYXcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCU2V0UmVkcmF3KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAKQEAgLTExODIsNyArMTA3MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlNldEZvbnQKICAqLwotc3RhdGljIExPTkcgTEJTZXRGb250KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQlNldEZvbnQoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIApAQCAtMTE5Nyw3ICsxMDg2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCUGFpbnQKICAqLwotc3RhdGljIExPTkcgTEJQYWludChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJQYWludChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgTFBMSVNUU1RSVUNUIGxwbHM7CkBAIC0xMjYwLDcgKzExNDksNyBAQAogICAgICAgbHBscy0+aXRlbVJlY3QucmlnaHQgID0gcmVjdC5yaWdodDsKIAogICAgICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiZHJhd2luZyBpdGVtOiAlZCAlZCAlZCAlZCAlZFxuIixyZWN0LmxlZnQsdG9wLHJlY3QucmlnaHQsdG9wK2hlaWdodCxscGxzLT5pdGVtU3RhdGUpOwotICAgICAgaWYgKE9XTkVSX0RSQVdOKGxwaGwpKSB7CisgICAgICBpZiAobHBobC0+T3duZXJEcmF3bikgewogCUxpc3RCb3hEcmF3SXRlbSAoaHduZCwgbHBobCwgaGRjLCBscGxzLCAmbHBscy0+aXRlbVJlY3QsIE9EQV9EUkFXRU5USVJFLCAwKTsKIAlpZiAobHBscy0+aXRlbVN0YXRlKQogCSAgTGlzdEJveERyYXdJdGVtIChod25kLCBscGhsLCBoZGMsIGxwbHMsICZscGxzLT5pdGVtUmVjdCwgT0RBX1NFTEVDVCwgT0RTX1NFTEVDVEVEKTsKQEAgLTEyODYsNyArMTE3NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlNldEZvY3VzCiAgKi8KLXN0YXRpYyBMT05HIExCU2V0Rm9jdXMoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCU2V0Rm9jdXMoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggV01fU0VURk9DVVMgIVxuIik7CiAKQEAgLTEyOTYsNyArMTE4NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQktpbGxGb2N1cwogICovCi1zdGF0aWMgTE9ORyBMQktpbGxGb2N1cyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJLaWxsRm9jdXMoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggV01fS0lMTEZPQ1VTICFcbiIpOwogCkBAIC0xMzA4LDcgKzExOTcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJSZXNldENvbnRlbnQKICAqLwotc3RhdGljIExPTkcgTEJSZXNldENvbnRlbnQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCUmVzZXRDb250ZW50KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIApAQCAtMTMyMSw3ICsxMjEwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCRGlyCiAgKi8KLXN0YXRpYyBMT05HIExCRGlyKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQkRpcihIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgV09SRCAgIHdSZXQ7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwpAQCAtMTMzNSwxMiArMTIyNCwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJBZGRTdHJpbmcKICAqLwotc3RhdGljIExPTkcgTEJBZGRTdHJpbmcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCQWRkU3RyaW5nKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBXT1JEICB3UmV0OwogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIAotICBpZiAoSGFzU3RyaW5ncyhscGhsKSkKKyAgaWYgKGxwaGwtPkhhc1N0cmluZ3MpCiAgICAgd1JldCA9IExpc3RCb3hBZGRTdHJpbmcobHBobCwgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOwogICBlbHNlCiAgICAgd1JldCA9IExpc3RCb3hBZGRTdHJpbmcobHBobCwgKExQU1RSKWxQYXJhbSk7CkBAIC0xMzUyLDcgKzEyNDEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRUZXh0CiAgKi8KLXN0YXRpYyBMT05HIExCR2V0VGV4dChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJHZXRUZXh0KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMT05HICAgd1JldDsKICAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CkBAIC0xMzY2LDEyICsxMjU1LDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkluc2VydFN0cmluZwogICovCi1zdGF0aWMgTE9ORyBMQkluc2VydFN0cmluZyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJJbnNlcnRTdHJpbmcoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIFdPUkQgIHdSZXQ7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogCi0gIGlmIChIYXNTdHJpbmdzKGxwaGwpKQorICBpZiAobHBobC0+SGFzU3RyaW5ncykKICAgICB3UmV0ID0gTGlzdEJveEluc2VydFN0cmluZyhscGhsLCB3UGFyYW0sIChMUFNUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKICAgZWxzZQogICAgIHdSZXQgPSBMaXN0Qm94SW5zZXJ0U3RyaW5nKGxwaGwsIHdQYXJhbSwgKExQU1RSKWxQYXJhbSk7CkBAIC0xMzgzLDcgKzEyNzIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJEZWxldGVTdHJpbmcKICAqLwotc3RhdGljIExPTkcgTEJEZWxldGVTdHJpbmcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCRGVsZXRlU3RyaW5nKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgTE9ORyBsUmV0ID0gTGlzdEJveERlbGV0ZVN0cmluZyhscGhsLHdQYXJhbSk7CkBAIC0xMzk1LDcgKzEyODQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJGaW5kU3RyaW5nCiAgKi8KLXN0YXRpYyBMT05HIExCRmluZFN0cmluZyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJGaW5kU3RyaW5nKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgcmV0dXJuIExpc3RCb3hGaW5kU3RyaW5nKGxwaGwsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTE0MDQsNyArMTI5Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldENhcmV0SW5kZXgKICAqLwotc3RhdGljIExPTkcgTEJHZXRDYXJldEluZGV4KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQkdldENhcmV0SW5kZXgoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICByZXR1cm4gbHBobC0+SXRlbUZvY3VzZWQ7CkBAIC0xNDEzLDcgKzEzMDIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRDb3VudAogICovCi1zdGF0aWMgTE9ORyBMQkdldENvdW50KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQkdldENvdW50KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUICBscGhsOwogCkBAIC0xNDI0LDcgKzEzMTMsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRDdXJTZWwKICAqLwotc3RhdGljIExPTkcgTEJHZXRDdXJTZWwoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCR2V0Q3VyU2VsKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUICBscGhsOwogCkBAIC0xNDM3LDcgKzEzMjYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRIb3Jpem9udGFsRXh0ZW50CiAgKi8KLXN0YXRpYyBMT05HIExCR2V0SG9yaXpvbnRhbEV4dGVudChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJHZXRIb3Jpem9udGFsRXh0ZW50KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogeyAgICAKICAgcmV0dXJuIDA7CiB9CkBAIC0xNDQ1LDcgKzEzMzQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRJdGVtSGVpZ2h0CiAgKi8KLXN0YXRpYyBMT05HIExCR2V0SXRlbUhlaWdodChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJHZXRJdGVtSGVpZ2h0KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgTFBMSVNUU1RSVUNUIGxwbHMgPSBMaXN0Qm94R2V0SXRlbSAobHBobCwgd1BhcmFtKTsKQEAgLTE0NTcsNyArMTM0Niw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldEl0ZW1SZWN0CiAgKi8KLXN0YXRpYyBMT05HIExCR2V0SXRlbVJlY3QoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCR2V0SXRlbVJlY3QoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICByZXR1cm4gTGlzdEJveEdldEl0ZW1SZWN0KGxwaGwsIHdQYXJhbSwgUFRSX1NFR19UT19MSU4obFBhcmFtKSk7CkBAIC0xNDY2LDcgKzEzNTUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRTZWwKICAqLwotc3RhdGljIExPTkcgTEJHZXRTZWwoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCR2V0U2VsKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgcmV0dXJuIExpc3RCb3hHZXRTZWwobHBobCwgd1BhcmFtKTsKQEAgLTE0NzUsNyArMTM2NCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldFNlbENvdW50CiAgKi8KLXN0YXRpYyBMT05HIExCR2V0U2VsQ291bnQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCR2V0U2VsQ291bnQoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBMUExJU1RTVFJVQ1QgbHBsczsKQEAgLTE0OTcsNyArMTM4Niw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldFNlbEl0ZW1zCiAgKi8KLXN0YXRpYyBMT05HIExCR2V0U2VsSXRlbXMoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCR2V0U2VsSXRlbXMoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgTFBMSVNUU1RSVUNUIGxwbHM7CkBAIC0xNTI1LDE5ICsxNDE0LDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldFRleHRMZW4KICAqLwotc3RhdGljIExPTkcgTEJHZXRUZXh0TGVuKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQkdldFRleHRMZW4oSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIExQTElTVFNUUlVDVCBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCx3UGFyYW0pOwogCi0gIGlmIChscGxzID09IE5VTEwgfHwgIUhhc1N0cmluZ3MobHBobCkpIHJldHVybiBMQl9FUlI7CisgIGlmIChscGxzID09IE5VTEwgfHwgIWxwaGwtPkhhc1N0cmluZ3MpIHJldHVybiBMQl9FUlI7CiAgIHJldHVybiBzdHJsZW4obHBscy0+aXRlbVRleHQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldERsZ0NvZGUKICAqLwotc3RhdGljIExPTkcgTEJHZXREbGdDb2RlKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQkdldERsZ0NvZGUoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIHJldHVybiBETEdDX1dBTlRBUlJPV1MgfCBETEdDX1dBTlRDSEFSUzsKIH0KQEAgLTE1NDUsNyArMTQzNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldFRvcEluZGV4CiAgKi8KLXN0YXRpYyBMT05HIExCR2V0VG9wSW5kZXgoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCR2V0VG9wSW5kZXgoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogCkBAIC0xNTU2LDcgKzE0NDUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJTZWxlY3RTdHJpbmcKICAqLwotc3RhdGljIExPTkcgTEJTZWxlY3RTdHJpbmcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCU2VsZWN0U3RyaW5nKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgV09SRCAgd1JldDsKQEAgLTE1NzEsNyArMTQ2MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlNlbEl0ZW1SYW5nZQogICovCi1zdGF0aWMgTE9ORyBMQlNlbEl0ZW1SYW5nZShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJTZWxJdGVtUmFuZ2UoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIExQTElTVFNUUlVDVCBscGxzOwpAQCAtMTYwNCw3ICsxNDkzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2V0Q2FyZXRJbmRleAogICovCi1zdGF0aWMgTE9ORyBMQlNldENhcmV0SW5kZXgoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCU2V0Q2FyZXRJbmRleChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAKQEAgLTE2MjIsNyArMTUxMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlNldENvbHVtbldpZHRoCiAgKi8KLXN0YXRpYyBMT05HIExCU2V0Q29sdW1uV2lkdGgoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCU2V0Q29sdW1uV2lkdGgoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBscGhsLT5Db2x1bW5zV2lkdGggPSB3UGFyYW07CkBAIC0xNjMzLDcgKzE1MjIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJTZXRIb3Jpem9udGFsRXh0ZW50CiAgKi8KLXN0YXRpYyBMT05HIExCU2V0SG9yaXpvbnRhbEV4dGVudChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJTZXRIb3Jpem9udGFsRXh0ZW50KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICByZXR1cm4gMDsKIH0KQEAgLTE2NDEsNyArMTUzMCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldEl0ZW1EYXRhCiAgKi8KLXN0YXRpYyBMT05HIExCR2V0SXRlbURhdGEoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCR2V0SXRlbURhdGEoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTEJfR0VUSVRFTURBVEEgd1BhcmFtPSV4XG4iLCB3UGFyYW0pOwpAQCAtMTY1MSw3ICsxNTQwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2V0SXRlbURhdGEKICAqLwotc3RhdGljIExPTkcgTEJTZXRJdGVtRGF0YShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJTZXRJdGVtRGF0YShIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsICJMQl9TRVRJVEVNREFUQSAgd1BhcmFtPSV4ICBsUGFyYW09JWx4XG4iLCB3UGFyYW0sIGxQYXJhbSk7CkBAIC0xNjYxLDcgKzE1NTAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJTZXRUYWJTdG9wcwogICovCi1zdGF0aWMgTE9ORyBMQlNldFRhYlN0b3BzKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQlNldFRhYlN0b3BzKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUICBscGhsOwogCkBAIC0xNjg1LDcgKzE1NzQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJTZXRDdXJTZWwKICAqLwotc3RhdGljIExPTkcgTEJTZXRDdXJTZWwoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCU2V0Q3VyU2VsKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgV09SRCAgd1JldDsKQEAgLTE3MDQsNyArMTU5Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlNldFNlbAogICovCi1zdGF0aWMgTE9ORyBMQlNldFNlbChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExPTkcgTEJTZXRTZWwoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBXT1JEIHdSZXQ7CkBAIC0xNzIwLDcgKzE2MDksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJTZXRUb3BJbmRleAogICovCi1zdGF0aWMgTE9ORyBMQlNldFRvcEluZGV4KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTE9ORyBMQlNldFRvcEluZGV4KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIApAQCAtMTczNyw3ICsxNjI2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2V0SXRlbUhlaWdodAogICovCi1zdGF0aWMgTE9ORyBMQlNldEl0ZW1IZWlnaHQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMT05HIExCU2V0SXRlbUhlaWdodChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIFdPUkQgd1JldDsKQEAgLTE3NTMsMTYgKzE2NDIsNTcgQEAKICAqLwogTE9ORyBMaXN0Qm94V25kUHJvYyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogeyAKLSAgaW50IGlkeCA9IDA7Ci0gIGludCB0YWJsZV9zaXplID0gc2l6ZW9mIChtZXRob2RzKSAvIHNpemVvZiAobXNnX3RibCk7Ci0KLSAgd2hpbGUgKGlkeCA8IHRhYmxlX3NpemUpIHsKLSAgICBpZiAobWVzc2FnZSA9PSBtZXRob2RzW2lkeF0ubWVzc2FnZSkgewotICAgICAgcmV0dXJuICgqKG1ldGhvZHNbaWR4XS5oYW5kbGVyKSkoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworICAgIHN3aXRjaCAobWVzc2FnZSkgeworICAgICBjYXNlIFdNX0NSRUFURTogcmV0dXJuIExCQ3JlYXRlKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9ERVNUUk9ZOiByZXR1cm4gTEJEZXN0cm95KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9HRVRETEdDT0RFOiByZXR1cm4gTEJHZXREbGdDb2RlKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9WU0NST0xMOiByZXR1cm4gTEJWU2Nyb2xsKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9IU0NST0xMOiByZXR1cm4gTEJIU2Nyb2xsKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjogcmV0dXJuIExCTEJ1dHRvbkRvd24oaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIFdNX0xCVVRUT05VUDogcmV0dXJuIExCTEJ1dHRvblVwKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9SQlVUVE9OVVA6IHJldHVybiBMQlJCdXR0b25VcChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fTEJVVFRPTkRCTENMSzogcmV0dXJuIExCUkJ1dHRvblVwKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9NT1VTRU1PVkU6IHJldHVybiBMQk1vdXNlTW92ZShod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fS0VZRE9XTjogcmV0dXJuIExCS2V5RG93bihod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fQ0hBUjogcmV0dXJuIExCQ2hhcihod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fU0VURk9OVDogcmV0dXJuIExCU2V0Rm9udChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fU0VUUkVEUkFXOiByZXR1cm4gTEJTZXRSZWRyYXcoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIFdNX1BBSU5UOiByZXR1cm4gTEJQYWludChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgV01fU0VURk9DVVM6IHJldHVybiBMQlNldEZvY3VzKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBXTV9LSUxMRk9DVVM6IHJldHVybiBMQktpbGxGb2N1cyhod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgTEJfUkVTRVRDT05URU5UOiByZXR1cm4gTEJSZXNldENvbnRlbnQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIExCX0RJUjogcmV0dXJuIExCRGlyKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9BRERTVFJJTkc6IHJldHVybiBMQkFkZFN0cmluZyhod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgTEJfSU5TRVJUU1RSSU5HOiByZXR1cm4gTEJJbnNlcnRTdHJpbmcoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIExCX0RFTEVURVNUUklORzogcmV0dXJuIExCRGVsZXRlU3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9GSU5EU1RSSU5HOiByZXR1cm4gTEJGaW5kU3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9HRVRDQVJFVElOREVYOiByZXR1cm4gTEJHZXRDYXJldEluZGV4KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9HRVRDT1VOVDogcmV0dXJuIExCR2V0Q291bnQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIExCX0dFVENVUlNFTDogcmV0dXJuIExCR2V0Q3VyU2VsKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9HRVRIT1JJWk9OVEFMRVhURU5UOiByZXR1cm4gTEJHZXRIb3Jpem9udGFsRXh0ZW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9HRVRJVEVNREFUQTogcmV0dXJuIExCR2V0SXRlbURhdGEoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIExCX0dFVElURU1IRUlHSFQ6IHJldHVybiBMQkdldEl0ZW1IZWlnaHQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIExCX0dFVElURU1SRUNUOiByZXR1cm4gTEJHZXRJdGVtUmVjdChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgTEJfR0VUU0VMOiByZXR1cm4gTEJHZXRTZWwoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIExCX0dFVFNFTENPVU5UOiByZXR1cm4gTEJHZXRTZWxDb3VudChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgTEJfR0VUU0VMSVRFTVM6IHJldHVybiBMQkdldFNlbEl0ZW1zKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9HRVRURVhUOiByZXR1cm4gTEJHZXRUZXh0KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9HRVRURVhUTEVOOiByZXR1cm4gTEJHZXRUZXh0TGVuKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9HRVRUT1BJTkRFWDogcmV0dXJuIExCR2V0VG9wSW5kZXgoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIExCX1NFTEVDVFNUUklORzogcmV0dXJuIExCU2VsZWN0U3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9TRUxJVEVNUkFOR0U6IHJldHVybiBMQlNlbEl0ZW1SYW5nZShod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgTEJfU0VUQ0FSRVRJTkRFWDogcmV0dXJuIExCU2V0Q2FyZXRJbmRleChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgTEJfU0VUQ09MVU1OV0lEVEg6IHJldHVybiBMQlNldENvbHVtbldpZHRoKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9TRVRIT1JJWk9OVEFMRVhURU5UOiByZXR1cm4gTEJTZXRIb3Jpem9udGFsRXh0ZW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9TRVRJVEVNREFUQTogcmV0dXJuIExCU2V0SXRlbURhdGEoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIExCX1NFVFRBQlNUT1BTOiByZXR1cm4gTEJTZXRUYWJTdG9wcyhod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgIGNhc2UgTEJfU0VUQ1VSU0VMOiByZXR1cm4gTEJTZXRDdXJTZWwoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIExCX1NFVFNFTDogcmV0dXJuIExCU2V0U2VsKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgY2FzZSBMQl9TRVRUT1BJTkRFWDogcmV0dXJuIExCU2V0VG9wSW5kZXgoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIExCX1NFVElURU1IRUlHSFQ6IHJldHVybiBMQlNldEl0ZW1IZWlnaHQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwogICAgIH0KLSAgICBpZHgrKzsKLSAgfQotICByZXR1cm4gRGVmV2luZG93UHJvYyAoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworICAgIAorICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvY29udHJvbHMvc2Nyb2xsLmMgYi9jb250cm9scy9zY3JvbGwuYwppbmRleCAxZjMwYmVlLi4xMWI4ZTIwIDEwMDY0NAotLS0gYS9jb250cm9scy9zY3JvbGwuYworKysgYi9jb250cm9scy9zY3JvbGwuYwpAQCAtMzQwLDkgKzM0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIGJvdHRvbV9zZWxlY3RlZCApCiB7CiAgICAgUkVDVCByOwotICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLSAgICBpZiAoKChuQmFyID09IFNCX1ZFUlQpICYmICEod25kUHRyLT5kd1N0eWxlICYgV1NfVlNDUk9MTCkpCi0gICAgICAgIHx8ICgobkJhciA9PSBTQl9IT1JaKSAmJiAoIXduZFB0ci0+ZHdTdHlsZSAmIFdTX0hTQ1JPTEwpKSkgcmV0dXJuOwogCiAgICAgICAvKiBTZWxlY3QgdGhlIGNvcnJlY3QgYnJ1c2ggYW5kIHBlbiAqLwogCkBAIC00NDAsOSArNDM3LDEzIEBACiAgICAgV09SRCBhcnJvd1NpemUsIHRodW1iUG9zOwogICAgIFJFQ1QgcmVjdDsKICAgICBCT09MIHZlcnRpY2FsOwotCisgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIFNDUk9MTElORk8gKmluZm9QdHIgPSBTQ1JPTExfR2V0U2Nyb2xsSW5mbyggaHduZCwgbkJhciApOwotICAgIGlmICghaW5mb1B0cikgcmV0dXJuOworCisgICAgaWYgKCF3bmRQdHIgfHwgIWluZm9QdHIgfHwKKyAgICAgICAgKChuQmFyID09IFNCX1ZFUlQpICYmICEod25kUHRyLT5kd1N0eWxlICYgV1NfVlNDUk9MTCkpIHx8CisgICAgICAgICgobkJhciA9PSBTQl9IT1JaKSAmJiAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0hTQ1JPTEwpKSkgcmV0dXJuOworCiAgICAgdmVydGljYWwgPSBTQ1JPTExfR2V0U2Nyb2xsQmFyUmVjdCggaHduZCwgbkJhciwgJnJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycm93U2l6ZSwgJnRodW1iUG9zICk7CiAgICAgICAvKiBEcmF3IHRoZSBhcnJvd3MgKi8KQEAgLTQ2Nyw5ICs0NjgsMTMgQEAKICAgICBSRUNUIHJlY3Q7CiAgICAgQk9PTCB2ZXJ0aWNhbDsKICAgICBIREMgaGRjOwotCisgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIFNDUk9MTElORk8gKmluZm9QdHIgPSBTQ1JPTExfR2V0U2Nyb2xsSW5mbyggaHduZCwgbkJhciApOwotICAgIGlmICghaW5mb1B0cikgcmV0dXJuOworCisgICAgaWYgKCF3bmRQdHIgfHwgIWluZm9QdHIgfHwKKyAgICAgICAgKChuQmFyID09IFNCX1ZFUlQpICYmICEod25kUHRyLT5kd1N0eWxlICYgV1NfVlNDUk9MTCkpIHx8CisgICAgICAgICgobkJhciA9PSBTQl9IT1JaKSAmJiAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0hTQ1JPTEwpKSkgcmV0dXJuOworCiAgICAgdmVydGljYWwgPSBTQ1JPTExfR2V0U2Nyb2xsQmFyUmVjdCggaHduZCwgbkJhciwgJnJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycm93U2l6ZSwgJnRodW1iUG9zICk7CiAgICAgaGRjID0gKG5CYXIgPT0gU0JfQ1RMKSA/IEdldERDKGh3bmQpIDogR2V0V2luZG93REMoaHduZCk7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9JbWFrZWZpbGUgYi9kZWJ1Z2dlci9JbWFrZWZpbGUKaW5kZXggN2I3ZWE5ZC4uMzljNDZmNCAxMDA2NDQKLS0tIGEvZGVidWdnZXIvSW1ha2VmaWxlCisrKyBiL2RlYnVnZ2VyL0ltYWtlZmlsZQpAQCAtMTYsNyArMTYsOSBAQAogCWRiZy50YWIuYyBcCiAJaGFzaC5jIFwKIAlpbmZvLmMgXAotCWxleC55eS5jCisJbGV4Lnl5LmMgXAorCXJlZ2lzdGVycy5jIFwKKwlzdGFjay5jCiAKIFNVQkRJUlNfT0JKUyA9IHJlYWRsaW5lL3JlYWRsaW5lLm8KIApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvYnJlYWsuYyBiL2RlYnVnZ2VyL2JyZWFrLmMKaW5kZXggNzExYzQ5NS4uZTE0MzY2OSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvYnJlYWsuYworKysgYi9kZWJ1Z2dlci9icmVhay5jCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIERlYnVnZ2VyIGJyZWFrLXBvaW50cyBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAxOTk0IE1hcnRpbiB2b24gTG9ld2lzCisgKiBDb3B5cmlnaHQgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTUsMTAwICsxMSw0MiBAQAogI2lmZGVmIGxpbnV4CiAjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KICNlbmRpZgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlICJkYl9kaXNhc20uaCIKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZGVidWdnZXIuaCIKIAotI2RlZmluZSBOX0JQIDI1CisjZGVmaW5lIElOVDMgICAgICAgICAgMHhjYyAgIC8qIGludCAzIG9wY29kZSAqLworI2RlZmluZSBTVEVQX0ZMQUcgICAgIDB4MTAwICAvKiBzaW5nbGUtc3RlcCBmbGFnICovCiAKLWV4dGVybiBpbnQgZGJnX21vZGU7CisjZGVmaW5lIE1BWF9CUkVBS1BPSU5UUyAyNQogCi1zdHJ1Y3Qgd2luZV9icHsKLSAgdW5zaWduZWQgbG9uZyBhZGRyOwotICB1bnNpZ25lZCBsb25nIG5leHRfYWRkcjsKLSAgY2hhciBpbl91c2U7Ci0gIGNoYXIgZW5hYmxlZDsKLSAgdW5zaWduZWQgY2hhciBkYXRhYnl0ZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgd2luZV9icCB3YnBbTl9CUF0gPSB7ezAsfSx9OwotCi1zdGF0aWMgaW50IGN1cnJlbnRfYnAgPSAtMTsKLXN0YXRpYyBpbnQgY29udF9tb2RlPTA7CS8qIDAgLSBjb250aW51b3VzIGV4ZWN1dGlvbgotCQkJICAgMSAtIGFkdmFuY2luZyBhZnRlciBicmVha3BvaW50Ci0JCQkgICAyIC0gc2luZ2xlIHN0ZXAgLSBub3QgaW1wbGVtZW50ZWQKLQkJCSovCi0KLXZvaWQgaW5mb19icmVhayh2b2lkKQordHlwZWRlZiBzdHJ1Y3QKIHsKLSAgaW50IGo7Ci0gIGZwcmludGYoc3RkZXJyLCJCcmVha3BvaW50IHN0YXR1c1xuIik7Ci0gIGZvcihqPTA7IGo8Tl9CUDsgaisrKQotICAgIGlmKHdicFtqXS5pbl91c2UpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwiJWQ6ICVjICU4bHhcbiIsIGosICh3YnBbal0uZW5hYmxlZCA/ICd5JyA6ICduJyksCi0JICAgICAgd2JwW2pdLmFkZHIpOwotfQorICAgIHVuc2lnbmVkIGludCAgc2VnbWVudDsKKyAgICB1bnNpZ25lZCBpbnQgIGFkZHI7CisgICAgQllURSAgICAgICAgICBhZGRybGVuOworICAgIEJZVEUgICAgICAgICAgb3Bjb2RlOworICAgIEJPT0wgICAgICAgICAgZW5hYmxlZDsKKyAgICBCT09MICAgICAgICAgIGluX3VzZTsKK30gQlJFQUtQT0lOVDsKIAotdm9pZCBkaXNhYmxlX2JyZWFrKGludCBicG51bSkKK3N0YXRpYyBCUkVBS1BPSU5UIGJyZWFrcG9pbnRzW01BWF9CUkVBS1BPSU5UU10gPSB7IHsgMCwgfSwgfTsKKworc3RhdGljIGludCBuZXh0X2JwID0gMTsgIC8qIGJyZWFrcG9pbnQgMCBpcyByZXNlcnZlZCBmb3Igc3RlcC1vdmVyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgREVCVUdfQ2hhbmdlT3Bjb2RlCisgKgorICogQ2hhbmdlIHRoZSBvcGNvZGUgYXQgc2VnbWVudDphZGRyLgorICovCitzdGF0aWMgdm9pZCBERUJVR19TZXRPcGNvZGUoIHVuc2lnbmVkIGludCBzZWdtZW50LCB1bnNpZ25lZCBpbnQgYWRkciwgQllURSBvcCApCiB7Ci0gIGlmKGJwbnVtID49IE5fQlAgfHwgYnBudW0gPCAwKQotICAgIGZwcmludGYoc3RkZXJyLCJCcmVha3BvaW50IG51bWJlciBvdXQgb2YgcmFuZ2VcbiIpOwotCi0gIHdicFticG51bV0uZW5hYmxlZCA9IDA7Ci19Ci0KLXZvaWQgZW5hYmxlX2JyZWFrKGludCBicG51bSkKLXsKLSAgaWYoYnBudW0gPj0gTl9CUCB8fCBicG51bSA8IDApCi0gICAgZnByaW50ZihzdGRlcnIsIkJyZWFrcG9pbnQgbnVtYmVyIG91dCBvZiByYW5nZVxuIik7Ci0KLSAgd2JwW2JwbnVtXS5lbmFibGVkID0gMTsKLX0KLQotdm9pZCBhZGRfYnJlYWsodW5zaWduZWQgbG9uZyBhZGRyKQotewotICBpbnQgajsKLSAgZm9yKGo9MDsgajxOX0JQOyBqKyspCi0gICAgaWYoIXdicFtqXS5pbl91c2UpCi0gICAgICB7Ci0Jd2JwW2pdLmluX3VzZSA9IDE7Ci0Jd2JwW2pdLmVuYWJsZWQgPSAxOwotCXdicFtqXS5hZGRyID0gYWRkcjsKLQl3YnBbal0ubmV4dF9hZGRyID0gMDsKLQlyZXR1cm47Ci0gICAgICB9Ci0gIGZwcmludGYoc3RkZXJyLCJObyBtb3JlIGJyZWFrcG9pbnRzXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgYmFyaygpCi17Ci0gIHN0YXRpYyBpbnQgYmFya2VkPTA7Ci0gIGlmKGJhcmtlZClyZXR1cm47Ci0gIGJhcmtlZD0xOwotICBwZXJyb3IoIlNvcnJ5LCBjYW4ndCBzZXQgYnJlYWsgcG9pbnQiKTsKLSNpZmRlZiBsaW51eAotICB7c3RydWN0IHV0c25hbWUgYnVmOwotICB1bmFtZSgmYnVmKTsKLSAgaWYoc3RyY21wKGJ1Zi5zeXNuYW1lLCJMaW51eCIpPT0wKQotICB7CWlmKHN0cmNtcChidWYucmVsZWFzZSwiMS4xLjYyIik8MCkKLQkgIGZwcmludGYoc3RkZXJyLCJZb3VyIGN1cnJlbnQgTGludXggcmVsZWFzZSBpcyAlcy4gIgotCQkiWW91IHNob3VsZCB1cGdyYWRlIHRvIDEuMS42MiBvciBoaWdoZXJcbiIKLQkJIkFsdGVybmF0aXZlbHksIGluIC91c3Ivc3JjL2xpbnV4L2ZzL2V4ZWMuYywiCi0JCSIgY2hhbmdlIE1BUF9TSEFSRUQgdG8gTUFQX1BSSVZBVEUuXG4iLCBidWYucmVsZWFzZSk7Ci0gIH0gZWxzZQotICBmcHJpbnRmKHN0ZGVyciwiV2h5IGRpZCB5b3UgY29tcGlsZSBmb3IgTGludXgsIHdoaWxlIHlvdXIgc3lzdGVtIGlzIgotICAgIiBhY3R1YWxseSAlcz9cbiIsYnVmLnN5c25hbWUpOwotICB9Ci0jZW5kaWYKLX0KLSAgCi12b2lkIGluc2VydF9icmVhayhpbnQgZmxhZykKLXsKLSAgdW5zaWduZWQgY2hhciAqIHBudDsKLSAgaW50IGo7Ci0KLSAgZm9yKGo9MDsgajxOX0JQOyBqKyspCi0gICAgaWYod2JwW2pdLmVuYWJsZWQpCi0gICAgICB7CisgICAgaWYgKHNlZ21lbnQpCisgICAgeworICAgICAgICAqKEJZVEUgKilQVFJfU0VHX09GRl9UT19MSU4oIHNlZ21lbnQsIGFkZHIgKSA9IG9wOworICAgIH0KKyAgICBlbHNlICAvKiAzMi1iaXQgY29kZSwgc28gd2UgaGF2ZSB0byBjaGFuZ2UgdGhlIHByb3RlY3Rpb24gZmlyc3QgKi8KKyAgICB7CiAgICAgICAgIC8qIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBwcm9ibGVtcyB3aXRoIHRoaXMuIE9uIExpbnV4IHByaW9yIHRvCiAgICAgICAgICAgIDEuMS42MiwgdGhpcyBjYWxsIGZhaWxzIChFTk9BQ0NFU1MpIGR1ZSB0byBhIGJ1ZyBpbiBmcy9leGVjLmMuCiAgICAgICAgICAgIFRoaXMgY29kZSBpcyBjdXJyZW50bHkgbm90IHRlc3RlZCBhdCBhbGwgb24gQlNELgpAQCAtMTA4LDU0ICs1NiwyMjEgQEAKICAgICAgICAgICAgTm90IHRoYXQgcG9ydGFiaWxpdHkgbWF0dGVycywgdGhpcyBjb2RlIGlzIGkzODYgb25seSBhbnl3YXlzLi4uCiAgICAgICAgICAgIEhvdyBkbyBJIGdldCB0aGUgb2xkIHByb3RlY3Rpb24gaW4gb3JkZXIgdG8gcmVzdG9yZSBpdCBsYXRlciBvbj8KICAgICAgICAgKi8KLQlpZihtcHJvdGVjdCgoY2FkZHJfdCkod2JwW2pdLmFkZHIgJiAofjQwOTUpKSwgNDA5NiwgCi0JICBQUk9UX1JFQUR8UFJPVF9XUklURXxQUk9UX0VYRUMpID09IC0xKXsKLQkgICAgYmFyaygpOworICAgICAgICBpZiAobXByb3RlY3QoKGNhZGRyX3QpKGFkZHIgJiAofjQwOTUpKSwgNDA5NiwKKyAgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRHxQUk9UX1dSSVRFfFBST1RfRVhFQykgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBlcnJvciggIkNhbid0IHNldCBicmVhayBwb2ludCIgKTsKICAgICAgICAgICAgIHJldHVybjsKIAl9Ci0JcG50ID0gKHVuc2lnbmVkIGNoYXIgKikgd2JwW2pdLmFkZHI7Ci0JaWYoZmxhZykgewotCSAgd2JwW2pdLmRhdGFieXRlID0gKnBudDsKLQkgICpwbnQgPSAweGNjOyAgLyogQ2hhbmdlIHRvIGFuIGludCAzIGluc3RydWN0aW9uICovCi0JfSBlbHNlIHsKLQkgICpwbnQgPSB3YnBbal0uZGF0YWJ5dGU7Ci0JfQotCW1wcm90ZWN0KChjYWRkcl90KSh3YnBbal0uYWRkciAmIH40MDk1KSwgNDA5NiwgUFJPVF9SRUFEfFBST1RfRVhFQyk7Ci0gICAgICB9Ci19Ci0KLS8qIEdldCB0aGUgYnJlYWtwb2ludCBudW1iZXIgdGhhdCB3ZSBicm9rZSB1cG9uICovCi1pbnQgZ2V0X2JwbnVtKHVuc2lnbmVkIGludCBhZGRyKQotewotICBpbnQgajsKLQotICBmb3Ioaj0wOyBqPE5fQlA7IGorKykKLSAgICBpZih3YnBbal0uZW5hYmxlZCkKLSAgICAgIGlmKHdicFtqXS5hZGRyID09IGFkZHIpIHJldHVybiBqOwotCi0gIHJldHVybiAtMTsKLX0KLQotdm9pZCB0b2dnbGVfbmV4dChpbnQgbnVtKQotewotICAgdW5zaWduZWQgaW50IGFkZHI7Ci0gICBhZGRyPXdicFtudW1dLmFkZHI7Ci0gICBpZih3YnBbbnVtXS5uZXh0X2FkZHIgPT0gMCkKLQl3YnBbbnVtXS5uZXh0X2FkZHIgPSBkYl9kaXNhc20oIDAsIGFkZHIsIChkYmdfbW9kZSA9PSAxNikgKTsKLSAgIHdicFtudW1dLmFkZHI9d2JwW251bV0ubmV4dF9hZGRyOwotICAgd2JwW251bV0ubmV4dF9hZGRyPWFkZHI7Ci19Ci0KLWludCBzaG91bGRfY29udGludWUoaW50IGJwbnVtKQotewotICAgIGlmKGJwbnVtPDApcmV0dXJuIDA7Ci0gICAgdG9nZ2xlX25leHQoYnBudW0pOwotICAgIGlmKGJwbnVtPT1jdXJyZW50X2JwKXsKLSAgICAgICAgY3VycmVudF9icD0tMTsKLQljb250X21vZGU9MDsKLQlyZXR1cm4gMTsKKyAgICAgICAgKihCWVRFICopYWRkciA9IG9wOworCW1wcm90ZWN0KChjYWRkcl90KShhZGRyICYgfjQwOTUpLCA0MDk2LCBQUk9UX1JFQUR8UFJPVF9FWEVDKTsKICAgICB9Ci0gICAgY29udF9tb2RlPTE7Ci0gICAgY3VycmVudF9icD1icG51bTsKLSAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBERUJVR19TZXRCcmVha3BvaW50cworICoKKyAqIFNldCBvciByZW1vdmUgYWxsIHRoZSBicmVha3BvaW50cy4KKyAqLwordm9pZCBERUJVR19TZXRCcmVha3BvaW50cyggQk9PTCBzZXQgKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9CUkVBS1BPSU5UUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGJyZWFrcG9pbnRzW2ldLmluX3VzZSAmJiBicmVha3BvaW50c1tpXS5lbmFibGVkKQorICAgICAgICAgICAgREVCVUdfU2V0T3Bjb2RlKCBicmVha3BvaW50c1tpXS5zZWdtZW50LCBicmVha3BvaW50c1tpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgPyBJTlQzIDogYnJlYWtwb2ludHNbaV0ub3Bjb2RlICk7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERFQlVHX0ZpbmRCcmVha3BvaW50CisgKgorICogRmluZCB0aGUgYnJlYWtwb2ludCBmb3IgYSBnaXZlbiBhZGRyZXNzLiBSZXR1cm4gdGhlIGJyZWFrcG9pbnQKKyAqIG51bWJlciBvciAtMSBpZiBub25lLgorICovCitpbnQgREVCVUdfRmluZEJyZWFrcG9pbnQoIHVuc2lnbmVkIGludCBzZWdtZW50LCB1bnNpZ25lZCBpbnQgYWRkciApCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0JSRUFLUE9JTlRTOyBpKyspCisgICAgeworICAgICAgICBpZiAoYnJlYWtwb2ludHNbaV0uaW5fdXNlICYmIGJyZWFrcG9pbnRzW2ldLmVuYWJsZWQgJiYKKyAgICAgICAgICAgIGJyZWFrcG9pbnRzW2ldLnNlZ21lbnQgPT0gc2VnbWVudCAmJiBicmVha3BvaW50c1tpXS5hZGRyID09IGFkZHIpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERFQlVHX0FkZEJyZWFrcG9pbnQKKyAqCisgKiBBZGQgYSBicmVha3BvaW50LgorICovCit2b2lkIERFQlVHX0FkZEJyZWFrcG9pbnQoIHVuc2lnbmVkIGludCBzZWdtZW50LCB1bnNpZ25lZCBpbnQgYWRkciApCit7CisgICAgaW50IG51bTsKKyAgICBCWVRFICpwOworCisgICAgaWYgKHNlZ21lbnQgPT0gMHhmZmZmZmZmZikgc2VnbWVudCA9IENTOworICAgIGlmIChzZWdtZW50ID09IFdJTkVfQ09ERV9TRUxFQ1RPUikgc2VnbWVudCA9IDA7CisKKyAgICBpZiAobmV4dF9icCA8IE1BWF9CUkVBS1BPSU5UUykKKyAgICAgICAgbnVtID0gbmV4dF9icCsrOworICAgIGVsc2UgIC8qIHRyeSB0byBmaW5kIGFuIGVtcHR5IHNsb3QgKi8gIAorICAgIHsKKyAgICAgICAgZm9yIChudW0gPSAxOyBudW0gPCBNQVhfQlJFQUtQT0lOVFM7IG51bSsrKQorICAgICAgICAgICAgaWYgKCFicmVha3BvaW50c1tudW1dLmluX3VzZSkgYnJlYWs7CisgICAgICAgIGlmIChudW0gPj0gTUFYX0JSRUFLUE9JTlRTKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJUb28gbWFueSBicmVha3BvaW50cy4gUGxlYXNlIGRlbGV0ZSBzb21lLlxuIiApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHAgPSBzZWdtZW50ID8gKEJZVEUgKilQVFJfU0VHX09GRl9UT19MSU4oIHNlZ21lbnQsIGFkZHIgKSA6IChCWVRFICopYWRkcjsKKyAgICBicmVha3BvaW50c1tudW1dLnNlZ21lbnQgPSBzZWdtZW50OworICAgIGJyZWFrcG9pbnRzW251bV0uYWRkciAgICA9IGFkZHI7CisgICAgYnJlYWtwb2ludHNbbnVtXS5hZGRybGVuID0gIXNlZ21lbnQgPyAzMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIChHRVRfU0VMX0ZMQUdTKHNlZ21lbnQpICYgTERUX0ZMQUdTXzMyQklUKSA/IDMyIDogMTY7CisgICAgYnJlYWtwb2ludHNbbnVtXS5vcGNvZGUgID0gKnA7CisgICAgYnJlYWtwb2ludHNbbnVtXS5lbmFibGVkID0gVFJVRTsKKyAgICBicmVha3BvaW50c1tudW1dLmluX3VzZSAgPSBUUlVFOworICAgIGZwcmludGYoIHN0ZGVyciwgIkJyZWFrcG9pbnQgJWQgYXQgIiwgbnVtICk7CisgICAgcHJpbnRfYWRkcmVzcyggc2VnbWVudCwgYWRkciwgYnJlYWtwb2ludHNbbnVtXS5hZGRybGVuICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgREVCVUdfRGVsQnJlYWtwb2ludAorICoKKyAqIERlbGV0ZSBhIGJyZWFrcG9pbnQuCisgKi8KK3ZvaWQgREVCVUdfRGVsQnJlYWtwb2ludCggaW50IG51bSApCit7CisgICAgaWYgKChudW0gPD0gMCkgfHwgKG51bSA+PSBuZXh0X2JwKSB8fCAhYnJlYWtwb2ludHNbbnVtXS5pbl91c2UpCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlkIGJyZWFrcG9pbnQgbnVtYmVyICVkXG4iLCBudW0gKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBicmVha3BvaW50c1tudW1dLmVuYWJsZWQgPSBGQUxTRTsKKyAgICBicmVha3BvaW50c1tudW1dLmluX3VzZSAgPSBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBERUJVR19FbmFibGVCcmVha3BvaW50CisgKgorICogRW5hYmxlIG9yIGRpc2FibGUgYSBicmVhayBwb2ludC4KKyAqLwordm9pZCBERUJVR19FbmFibGVCcmVha3BvaW50KCBpbnQgbnVtLCBCT09MIGVuYWJsZSApCit7CisgICAgaWYgKChudW0gPD0gMCkgfHwgKG51bSA+PSBuZXh0X2JwKSB8fCAhYnJlYWtwb2ludHNbbnVtXS5pbl91c2UpCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlkIGJyZWFrcG9pbnQgbnVtYmVyICVkXG4iLCBudW0gKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBicmVha3BvaW50c1tudW1dLmVuYWJsZWQgPSBlbmFibGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgREVCVUdfSW5mb0JyZWFrcG9pbnRzCisgKgorICogRGlzcGxheSBicmVhayBwb2ludHMgaW5mb3JtYXRpb24uCisgKi8KK3ZvaWQgREVCVUdfSW5mb0JyZWFrcG9pbnRzKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmcHJpbnRmKCBzdGRlcnIsICJCcmVha3BvaW50czpcbiIgKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbmV4dF9icDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGJyZWFrcG9pbnRzW2ldLmluX3VzZSkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJWQ6ICVjICIsIGksIGJyZWFrcG9pbnRzW2ldLmVuYWJsZWQgPyAneScgOiAnbicpOworICAgICAgICAgICAgcHJpbnRfYWRkcmVzcyggYnJlYWtwb2ludHNbaV0uc2VnbWVudCwgYnJlYWtwb2ludHNbaV0uYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRzW2ldLmFkZHJsZW4gKTsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERFQlVHX1Nob3VsZENvbnRpbnVlCisgKgorICogRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBjb250aW51ZSBleGVjdXRpb24gYWZ0ZXIgYSBTSUdUUkFQIHNpZ25hbCB3aGVuCisgKiBleGVjdXRpbmcgaW4gdGhlIGdpdmVuIG1vZGUuCisgKi8KK0JPT0wgREVCVUdfU2hvdWxkQ29udGludWUoIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZXhlY19tb2RlIG1vZGUgKQoreworICAgIHVuc2lnbmVkIGludCBzZWdtZW50LCBhZGRyOworICAgIGludCBicG51bTsKKworICAgICAgLyogSWYgbm90IHNpbmdsZS1zdGVwcGluZywgYmFjayB1cCBvdmVyIHRoZSBpbnQzIGluc3RydWN0aW9uICovCisgICAgaWYgKCEoRUZMICYgU1RFUF9GTEFHKSkgRUlQLS07CisKKyAgICBzZWdtZW50ID0gKENTID09IFdJTkVfQ09ERV9TRUxFQ1RPUikgPyAwIDogQ1M7CisgICAgYWRkciAgICA9IEVJUDsKKyAgICBicG51bSAgPSBERUJVR19GaW5kQnJlYWtwb2ludCggc2VnbWVudCwgYWRkciApOworICAgIGJyZWFrcG9pbnRzWzBdLmVuYWJsZWQgPSAwOyAgLyogZGlzYWJsZSB0aGUgc3RlcC1vdmVyIGJyZWFrcG9pbnQgKi8KKworICAgIGlmICgoYnBudW0gIT0gMCkgJiYgKGJwbnVtICE9IC0xKSkKKyAgICB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlN0b3BwZWQgb24gYnJlYWtwb2ludCAlZCBhdCAiLCBicG51bSApOworICAgICAgICBwcmludF9hZGRyZXNzKCBicmVha3BvaW50c1ticG51bV0uc2VnbWVudCwgYnJlYWtwb2ludHNbYnBudW1dLmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRzW2JwbnVtXS5hZGRybGVuICk7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgLyogbm8gYnJlYWtwb2ludCwgY29udGludWUgaWYgaW4gY29udGludW91cyBtb2RlICovCisgICAgcmV0dXJuIChtb2RlID09IEVYRUNfQ09OVCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgREVCVUdfUmVzdGFydEV4ZWN1dGlvbgorICoKKyAqIFNldCB0aGUgYnJlYWtwb2ludHMgdG8gdGhlIGNvcnJlY3Qgc3RhdGUgdG8gcmVzdGFydCBleGVjdXRpb24KKyAqIGluIHRoZSBnaXZlbiBtb2RlLgorICovCit2b2lkIERFQlVHX1Jlc3RhcnRFeGVjdXRpb24oIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBleGVjX21vZGUgbW9kZSwgaW50IGluc3RyX2xlbiApCit7CisgICAgdW5zaWduZWQgaW50IHNlZ21lbnQsIGFkZHI7CisKKyAgICBzZWdtZW50ID0gKENTID09IFdJTkVfQ09ERV9TRUxFQ1RPUikgPyAwIDogQ1M7CisgICAgYWRkciAgICA9IEVJUDsKKworICAgIGlmIChERUJVR19GaW5kQnJlYWtwb2ludCggc2VnbWVudCwgYWRkciApICE9IC0xKQorICAgICAgICBtb2RlID0gRVhFQ19TVEVQX0lOU1RSOyAgLyogSWYgdGhlcmUncyBhIGJyZWFrcG9pbnQsIHNraXAgaXQgKi8KKworICAgIHN3aXRjaChtb2RlKQorICAgIHsKKyAgICBjYXNlIEVYRUNfQ09OVDogLyogQ29udGludW91cyBleGVjdXRpb24gKi8KKyAgICAgICAgRUZMICY9IH5TVEVQX0ZMQUc7CisgICAgICAgIERFQlVHX1NldEJyZWFrcG9pbnRzKCBUUlVFICk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFWEVDX1NURVBfT1ZFUjogIC8qIFN0ZXBwaW5nIG92ZXIgYSBjYWxsICovCisgICAgICAgIEVGTCAmPSB+U1RFUF9GTEFHOworICAgICAgICBicmVha3BvaW50c1swXS5zZWdtZW50ID0gc2VnbWVudDsKKyAgICAgICAgYnJlYWtwb2ludHNbMF0uYWRkciAgICA9IGFkZHIgKyBpbnN0cl9sZW47CisgICAgICAgIGJyZWFrcG9pbnRzWzBdLmVuYWJsZWQgPSBUUlVFOworICAgICAgICBicmVha3BvaW50c1swXS5pbl91c2UgID0gVFJVRTsKKyAgICAgICAgYnJlYWtwb2ludHNbMF0ub3Bjb2RlICA9IHNlZ21lbnQgPworICAgICAgICAgICAqKEJZVEUgKilQVFJfU0VHX09GRl9UT19MSU4oc2VnbWVudCxhZGRyK2luc3RyX2xlbikgOiAqKEJZVEUgKilhZGRyOworICAgICAgICBERUJVR19TZXRCcmVha3BvaW50cyggVFJVRSApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVhFQ19TVEVQX0lOU1RSOiAvKiBTaW5nbGUtc3RlcHBpbmcgYW4gaW5zdHJ1Y3Rpb24gKi8KKyAgICAgICAgRUZMIHw9IFNURVBfRkxBRzsKKyAgICAgICAgYnJlYWs7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGJfZGlzYXNtLmMgYi9kZWJ1Z2dlci9kYl9kaXNhc20uYwppbmRleCA1ZDdkMTc2Li41MDQ3NGQ2IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYl9kaXNhc20uYworKysgYi9kZWJ1Z2dlci9kYl9kaXNhc20uYwpAQCAtNjEsMjUgKzYxLDE1IEBACiAvKgogICogSW5zdHJ1Y3Rpb24gZGlzYXNzZW1ibGVyLgogICovCi0jaWYgMAotI2luY2x1ZGUgPG1hY2gvYm9vbGVhbi5oPgotI2luY2x1ZGUgImRiX21hY2hkZXAuaCIKIAotI2luY2x1ZGUgImRiX2FjY2Vzcy5oIgotI2luY2x1ZGUgImRiX3N5bS5oIgotCi0jaW5jbHVkZSA8a2Vybi90YXNrLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRiX2Rpc2FzbS5oIgorI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJsZHQuaCIKIAotZXh0ZXJuIHZvaWQgcHJpbnRfYWRkcmVzcyggdW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGFkZHIsIGludCBhZGRybGVuICk7Ci0KIC8qCiAgKiBTd2l0Y2ggdG8gZGlzYXNzZW1ibGUgMTYtYml0IGNvZGUuCiAgKi8KLXN0YXRpYyBib29sZWFuX3QJZGJfZGlzYXNtXzE2ID0gRkFMU0U7CitzdGF0aWMgQk9PTCBkYl9kaXNhc21fMTYgPSBGQUxTRTsKIAogLyoKICAqIFNpemUgYXR0cmlidXRlcwpAQCAtOTMyLDEzICs5MjIsOSBAQAogLyoKICAqIFJlYWQgYWRkcmVzcyBhdCBsb2NhdGlvbiBhbmQgcmV0dXJuIHVwZGF0ZWQgbG9jYXRpb24uCiAgKi8KLWRiX2FkZHJfdAotZGJfcmVhZF9hZGRyZXNzKHNlZ21lbnQsIGxvYywgc2hvcnRfYWRkciwgcmVnbW9kcm0sIGFkZHJwKQotICAgICAgICB1bnNpZ25lZCBpbnQgc2VnbWVudDsKLQlkYl9hZGRyX3QJbG9jOwotCWludAkJc2hvcnRfYWRkcjsKLQlpbnQJCXJlZ21vZHJtOwotCXN0cnVjdCBpX2FkZHIJKmFkZHJwOwkJLyogb3V0ICovCit1bnNpZ25lZCBpbnQgZGJfcmVhZF9hZGRyZXNzKCB1bnNpZ25lZCBpbnQgc2VnbWVudCwgdW5zaWduZWQgaW50IGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaG9ydF9hZGRyLCBpbnQgcmVnbW9kcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaV9hZGRyICphZGRycCApCiB7CiAJaW50CQltb2QsIHJtLCBzaWIsIGluZGV4LCBkaXNwOwogCkBAIC0xMDU4LDIxICsxMDQ0LDE1IEBACiAJCWZwcmludGYoc3RkZXJyLCIsJXMsJWQiLCBhZGRycC0+aW5kZXgsIDE8PGFkZHJwLT5zcyk7CiAJICAgIGZwcmludGYoc3RkZXJyLCIpIik7CiAJfSBlbHNlCi0JICAgIGRiX3Rhc2tfcHJpbnRzeW0oKGRiX2FkZHJfdClhZGRycC0+ZGlzcCwgc2l6ZSk7CisJICAgIGRiX3Rhc2tfcHJpbnRzeW0oYWRkcnAtPmRpc3AsIHNpemUpOwogfQogCiAvKgogICogRGlzYXNzZW1ibGUgZmxvYXRpbmctcG9pbnQgKCJlc2NhcGUiKSBpbnN0cnVjdGlvbgogICogYW5kIHJldHVybiB1cGRhdGVkIGxvY2F0aW9uLgogICovCi1kYl9hZGRyX3QKLWRiX2Rpc2FzbV9lc2Moc2VnbWVudCwgbG9jLCBpbnN0LCBzaG9ydF9hZGRyLCBzaXplLCBzZWcpCi0gICAgICAgIHVuc2lnbmVkIGludCBzZWdtZW50OwotCWRiX2FkZHJfdAlsb2M7Ci0JaW50CQlpbnN0OwotCWludAkJc2hvcnRfYWRkcjsKLQlpbnQJCXNpemU7Ci0JY2hhciAqCQlzZWc7Cit1bnNpZ25lZCBpbnQgZGJfZGlzYXNtX2VzYyggdW5zaWduZWQgaW50IHNlZ21lbnQsIHVuc2lnbmVkIGludCBsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluc3QsIGludCBzaG9ydF9hZGRyLCBpbnQgc2l6ZSwgY2hhciAqc2VnICkKIHsKIAlpbnQJCXJlZ21vZHJtOwogCXN0cnVjdCBmaW5zdAkqZnA7CkBAIC0xMTUxLDExICsxMTMxLDcgQEAKICAqIERpc2Fzc2VtYmxlIGluc3RydWN0aW9uIGF0ICdsb2MnLiAgUmV0dXJuIGFkZHJlc3Mgb2Ygc3RhcnQgb2YKICAqIG5leHQgaW5zdHJ1Y3Rpb24uCiAgKi8KLWRiX2FkZHJfdAotZGJfZGlzYXNtKHNlZ21lbnQsIGxvYywgZmxhZzE2KQotICAgICAgICB1bnNpZ25lZCBpbnQgc2VnbWVudDsKLQlkYl9hZGRyX3QJbG9jOwotICAgICAgICBib29sZWFuX3QgICAgICAgZmxhZzE2OwordW5zaWduZWQgaW50IGRiX2Rpc2FzbSggdW5zaWduZWQgaW50IHNlZ21lbnQsIHVuc2lnbmVkIGludCBsb2MgKQogewogCWludAlpbnN0OwogCWludAlzaXplOwpAQCAtMTE2Niw3ICsxMTQyLDcgQEAKIAlpbnQJaV9zaXplOwogCWludAlpX21vZGU7CiAJaW50CXJlZ21vZHJtID0gMDsKLQlib29sZWFuX3QJZmlyc3Q7CisJQk9PTCAgICBmaXJzdDsKIAlpbnQJZGlzcGw7CiAJaW50CXByZWZpeDsKIAlpbnQJaW1tOwpAQCAtMTE3NCw3ICsxMTUwLDggQEAKIAlpbnQJbGVuOwogCXN0cnVjdCBpX2FkZHIJYWRkcmVzczsKIAotCWRiX2Rpc2FzbV8xNiA9IGZsYWcxNjsKKyAgICAgICAgaWYgKCFzZWdtZW50KSBkYl9kaXNhc21fMTYgPSBGQUxTRTsKKyAgICAgICAgZWxzZSBkYl9kaXNhc21fMTYgPSAhKEdFVF9TRUxfRkxBR1Moc2VnbWVudCkgJiBMRFRfRkxBR1NfMzJCSVQpOwogCiAJZ2V0X3ZhbHVlX2luYyhpbnN0LCBzZWdtZW50LCBsb2MsIDEsIEZBTFNFKTsKIApAQCAtMTI0MCw3ICsxMjE3LDcgQEAKIAl9IHdoaWxlIChwcmVmaXgpOwogCiAJaWYgKGluc3QgPj0gMHhkOCAmJiBpbnN0IDw9IDB4ZGYpIHsKLQkgICAgbG9jID0gZGJfZGlzYXNtX2VzYyhsb2MsIGluc3QsIHNob3J0X2FkZHIsIHNpemUsIHNlZyk7CisJICAgIGxvYyA9IGRiX2Rpc2FzbV9lc2Moc2VnbWVudCwgbG9jLCBpbnN0LCBzaG9ydF9hZGRyLCBzaXplLCBzZWcpOwogCSAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKIAkgICAgcmV0dXJuIChsb2MpOwogCX0KQEAgLTE0NDEsOCArMTQxOCw3IEBACiAJCSAgICBpZiAoc2VnKQogCQkJZnByaW50ZihzdGRlcnIsIiVzOiVkIixzZWcsIGRpc3BsKTsKIAkJICAgIGVsc2UKLQkJCWRiX3Rhc2tfcHJpbnRzeW0oKGRiX2FkZHJfdClkaXNwbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRfYWRkciA/IFdPUkQgOiBMT05HKTsKKwkJCWRiX3Rhc2tfcHJpbnRzeW0oZGlzcGwsIHNob3J0X2FkZHIgPyBXT1JEIDogTE9ORyk7CiAJCSAgICBicmVhazsKIAogCQljYXNlIERiOgpAQCAtMTQ1NCw4ICsxNDMwLDcgQEAKIAkJICAgIH0KIAkJICAgIGVsc2UKIAkJCWRpc3BsID0gZGlzcGwgKyBsb2M7Ci0JCSAgICBkYl90YXNrX3ByaW50c3ltKChkYl9hZGRyX3QpZGlzcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRfYWRkciA/IFdPUkQgOiBMT05HKTsKKwkJICAgIGRiX3Rhc2tfcHJpbnRzeW0oZGlzcGwsIHNob3J0X2FkZHIgPyBXT1JEIDogTE9ORyk7CiAJCSAgICBicmVhazsKIAogCQljYXNlIERsOgpAQCAtMTQ2OSw4ICsxNDQ0LDcgQEAKIAkJCWdldF92YWx1ZV9pbmMoZGlzcGwsIHNlZ21lbnQsIGxvYywgNCwgVFJVRSk7CiAJCQlkaXNwbCA9IGRpc3BsICsgbG9jOwogCQkgICAgfQotCQkgICAgZGJfdGFza19wcmludHN5bSgoZGJfYWRkcl90KWRpc3BsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0X2FkZHIgPyBXT1JEIDogTE9ORyk7CisJCSAgICBkYl90YXNrX3ByaW50c3ltKCBkaXNwbCwgc2hvcnRfYWRkciA/IFdPUkQgOiBMT05HKTsKIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgbzE6CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kYl9kaXNhc20uaCBiL2RlYnVnZ2VyL2RiX2Rpc2FzbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzk5MmQ3Li4wMDAwMDAwCi0tLSBhL2RlYnVnZ2VyL2RiX2Rpc2FzbS5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jZGVmaW5lIEZBTFNFIDAKLSNkZWZpbmUgVFJVRSAxCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgZGJfYWRkcl90OwotCi1leHRlcm4gZGJfYWRkcl90IGRiX2Rpc2FzbSh1bnNpZ25lZCBpbnQgc2VnbWVudCwgZGJfYWRkcl90IGxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fdCBmbGFnMTYpOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGJnLnkgYi9kZWJ1Z2dlci9kYmcueQppbmRleCBmZDg3NDhkLi5jOWE1NTg1IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYmcueQorKysgYi9kZWJ1Z2dlci9kYmcueQpAQCAtMTAsMjQgKzEwLDI1IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgImxkdC5oIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJ3aW5lLmgiCisjaW5jbHVkZSAiZGVidWdnZXIuaCIKIAogI2RlZmluZSBZWVNUWVBFIGludAogCi0jaW5jbHVkZSAicmVncG9zLmgiCiBleHRlcm4gRklMRSAqIHl5aW47Ci11bnNpZ25lZCBpbnQgKiByZWd2YWwgPSBOVUxMOwotdW5zaWduZWQgaW50IGRiZ19tYXNrID0gMDsKIHVuc2lnbmVkIGludCBkYmdfbW9kZSA9IDA7CiAKK3N0YXRpYyBlbnVtIGV4ZWNfbW9kZSBkYmdfZXhlY19tb2RlID0gRVhFQ19DT05UOworCiB2b2lkIGlzc3VlX3Byb21wdCh2b2lkKTsKIHZvaWQgbW9kZV9jb21tYW5kKGludCk7CiAlfQogCiAKICV0b2tlbiBDT05UCisldG9rZW4gU1RFUAorJXRva2VuIE5FWFQKICV0b2tlbiBRVUlUCiAldG9rZW4gSEVMUAogJXRva2VuIEJBQ0tUUkFDRQpAQCAtNDAsMTAgKzQxLDEzIEBACiAldG9rZW4gRU5BQkxFCiAldG9rZW4gRElTQUJMRQogJXRva2VuIEJSRUFLCisldG9rZW4gREVMRVRFCiAldG9rZW4gU0VUCiAldG9rZW4gTU9ERQogJXRva2VuIFBSSU5UCisldG9rZW4gRVhBTQogJXRva2VuIElERU5USUZJRVIKKyV0b2tlbiBGT1JNQVQKICV0b2tlbiBOT19TWU1CT0wKICV0b2tlbiBTWU1CT0xGSUxFCiAldG9rZW4gREVGSU5FCkBAIC01OCw2OCArNjIsNTkgQEAKIAl8IGluZm9jbWQgJ1xuJwogCXwgZXJyb3IgJ1xuJyAgICAgICB7IHl5ZXJyb2s7IH0KIAl8IFFVSVQgICdcbicgICAgICAgeyBleGl0KDApOyB9Ci0JfCAncScgJ1xuJyAgICAgICAgIHsgZXhpdCgwKTsgfQogCXwgSEVMUCAgJ1xuJyAgICAgICB7IGRiZ19oZWxwKCk7IH0KLQl8IENPTlQgJ1xuJyAgICAgICAgeyByZXR1cm4gMDsgfQotCXwgJ2MnICdcbicgICAgICAgICB7IHJldHVybiAwOyB9CisJfCBDT05UICdcbicgICAgICAgIHsgZGJnX2V4ZWNfbW9kZSA9IEVYRUNfQ09OVDsgcmV0dXJuIDA7IH0KKwl8IFNURVAgJ1xuJyAgICAgICAgeyBkYmdfZXhlY19tb2RlID0gRVhFQ19TVEVQX0lOU1RSOyByZXR1cm4gMDsgfQorCXwgTkVYVCAnXG4nICAgICAgICB7IGRiZ19leGVjX21vZGUgPSBFWEVDX1NURVBfT1ZFUjsgcmV0dXJuIDA7IH0KIAl8IEFCT1JUICdcbicgICAgICAgeyBraWxsKGdldHBpZCgpLCBTSUdBQlJUKTsgfQotIAl8IFNZTUJPTEZJTEUgSURFTlRJRklFUiAnXG4nIHsgcmVhZF9zeW1ib2x0YWJsZSgkMik7IH0KKyAJfCBTWU1CT0xGSUxFIElERU5USUZJRVIgJ1xuJyAgIHsgcmVhZF9zeW1ib2x0YWJsZSgkMik7IH0KIAl8IERFRklORSBJREVOVElGSUVSIGV4cHIgJ1xuJyAgeyBhZGRfaGFzaCgkMiwgMCwgJDMpOyB9Ci0JfCBNT0RFIE5VTQkgICB7IG1vZGVfY29tbWFuZCgkMik7IH0KLQl8IEVOQUJMRSBOVU0JICAgeyBlbmFibGVfYnJlYWsoJDIpOyB9Ci0JfCBESVNBQkxFIE5VTQkgICB7IGRpc2FibGVfYnJlYWsoJDIpOyB9Ci0JfCBCUkVBSyAnKicgZXhwciAgIHsgYWRkX2JyZWFrKCQzKTsgfQorCXwgTU9ERSBOVU0gJ1xuJyAgICAgICAgIHsgbW9kZV9jb21tYW5kKCQyKTsgfQorCXwgRU5BQkxFIE5VTSAnXG4nICAgICAgIHsgREVCVUdfRW5hYmxlQnJlYWtwb2ludCggJDIsIFRSVUUgKTsgfQorCXwgRElTQUJMRSBOVU0gJ1xuJyAgICAgIHsgREVCVUdfRW5hYmxlQnJlYWtwb2ludCggJDIsIEZBTFNFICk7IH0KKwl8IEJSRUFLICcqJyBleHByICAgICAgICB7IERFQlVHX0FkZEJyZWFrcG9pbnQoIDB4ZmZmZmZmZmYsICQzICk7IH0KKyAgICAgICAgfCBCUkVBSyAnXG4nICAgICAgICAgICAgeyBERUJVR19BZGRCcmVha3BvaW50KCAweGZmZmZmZmZmLCBFSVAgKTsgfQorICAgICAgICB8IERFTEVURSBCUkVBSyBOVU0gJ1xuJyB7IERFQlVHX0RlbEJyZWFrcG9pbnQoICQzICk7IH0KKwl8IEJBQ0tUUkFDRSAnXG4nICAgICAgICB7IERFQlVHX0JhY2tUcmFjZSgpOyB9CiAJfCB4X2NvbW1hbmQKLQl8IEJBQ0tUUkFDRSAnXG4nICAgeyBkYmdfYnQoKTsgfQogCXwgcHJpbnRfY29tbWFuZAogCXwgZGVwb3NpdF9jb21tYW5kCiAKIGRlcG9zaXRfY29tbWFuZDoKLQlTRVQgUkVHICc9JyBleHByICdcbicgeyBpZihyZWd2YWwpIHJlZ3ZhbFskMl0gPSAkNDsgZWxzZSBhcHBsaWNhdGlvbl9ub3RfcnVubmluZygpO30KKwlTRVQgUkVHICc9JyBleHByICdcbicgICAgICAgIHsgREVCVUdfU2V0UmVnaXN0ZXIoICQyLCAkNCApOyB9CiAJfCBTRVQgJyonIGV4cHIgJz0nIGV4cHIgJ1xuJyB7ICooKHVuc2lnbmVkIGludCAqKSAkMykgPSAkNTsgfQotCXwgU0VUIHN5bWJvbCAnPScgZXhwciAnXG4nIHsgKigodW5zaWduZWQgaW50ICopICQyKSA9ICQ0OyB9CisJfCBTRVQgc3ltYm9sICc9JyBleHByICdcbicgICB7ICooKHVuc2lnbmVkIGludCAqKSAkMikgPSAkNDsgfQogCiAKIHhfY29tbWFuZDoKLQkgICd4JyBleHByICAnXG4nIHsgZXhhbWluZV9tZW1vcnkoIDB4ZmZmZmZmZmYsICQyLCAxLCAneCcpOyB9Ci0JfCAneCcgJy8nIGZtdCBleHByICAnXG4nIHsgZXhhbWluZV9tZW1vcnkoIDB4ZmZmZmZmZmYsICQ0LCAxLCAkMyk7IH0KLQl8ICd4JyAnLycgTlVNIGZtdCBleHByICAnXG4nIHsgZXhhbWluZV9tZW1vcnkoIDB4ZmZmZmZmZmYsICQ1LCAkMywgJDQpOyB9CisJICBFWEFNIGV4cHIgICdcbicgeyBleGFtaW5lX21lbW9yeSggMHhmZmZmZmZmZiwgJDIsIDEsICd4Jyk7IH0KKwl8IEVYQU0gRk9STUFUIGV4cHIgICdcbicgeyBleGFtaW5lX21lbW9yeSggMHhmZmZmZmZmZiwgJDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyID4+IDgsICQyICYgMHhmZiApOyB9CiAKLXByaW50OgotCSAgJ3AnCi0JfCBQUklOVAotCQogIHByaW50X2NvbW1hbmQ6Ci0JICBwcmludCBleHByICdcbicgeyBleGFtaW5lX21lbW9yeSggMCwgKCh1bnNpZ25lZCBpbnQpICYkMiApLCAxLCAneCcpOyB9Ci0JfCBwcmludCAnLycgZm10IGV4cHIgJ1xuJyB7IGV4YW1pbmVfbWVtb3J5KCAwLCAodW5zaWduZWQgaW50KSAmJDQsIDEsICQzKTsgfQorCSAgUFJJTlQgZXhwciAnXG4nIHsgZXhhbWluZV9tZW1vcnkoIDAsICgodW5zaWduZWQgaW50KSAmJDIgKSwgMSwneCcpOyB9CisJfCBQUklOVCBGT1JNQVQgZXhwciAnXG4nIHsgZXhhbWluZV9tZW1vcnkoIDAsICh1bnNpZ25lZCBpbnQpJiQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIgPj4gOCwgJDIgJiAweGZmICk7IH0KIAotIGZtdDogICd4JyAgICAgeyAkJCA9ICd4JzsgfQotCXwgJ2QnICB7ICQkID0gJ2QnOyB9Ci0JfCAnaScgIHsgJCQgPSAnaSc7IH0KLQl8ICd3JyAgeyAkJCA9ICd3JzsgfQotCXwgJ3MnICB7ICQkID0gJ3MnOyB9Ci0JfCAnYycgIHsgJCQgPSAnYyc7IH0KLQl8ICdiJyB7ICQkID0gJ2InOyB9Ci0KLSBzeW1ib2w6IElERU5USUZJRVIgICAgICAgICAgICAgeyAkJCA9IGZpbmRfaGFzaCgkMSk7Ci0JCQkgICAgICAgICAgIGlmKCQkID09IDB4ZmZmZmZmZmYpIHsKLQkJCQkJICAgZnByaW50ZihzdGRlcnIsIlN5bWJvbCAlcyBub3QgZm91bmRcbiIsICQxKTsKLQkJCQkJICAgWVlFUlJPUjsKLQkJCQkgICB9Ci0JCQkgICAgICAgIH0gCisgc3ltYm9sOiBJREVOVElGSUVSICAgeyBpZiAoKCQkID0gZmluZF9oYXNoKCQxKSkgPT0gMHhmZmZmZmZmZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJTeW1ib2wgJXMgbm90IGZvdW5kXG4iLCAoY2hhciAqKSQxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfSAKIAogIGV4cHI6ICBOVU0JCQl7ICQkID0gJDE7CX0KLQl8IFJFRwkJCXsgaWYocmVndmFsKSAkJCA9IHJlZ3ZhbFskMV07IGVsc2UgYXBwbGljYXRpb25fbm90X3J1bm5pbmcoKTt9CisJfCBSRUcJCQl7ICQkID0gREVCVUdfR2V0UmVnaXN0ZXIoJDEpOyB9CiAJfCBzeW1ib2wgICAJCXsgJCQgPSAkMTsgfQogCXwgZXhwciAnKycgTlVNCQl7ICQkID0gJDEgKyAkMzsgfQogCXwgZXhwciAnLScgTlVNCQl7ICQkID0gJDEgLSAkMzsgfQogCXwgJygnIGV4cHIgJyknCQl7ICQkID0gJDI7IH0KIAl8ICcqJyBleHByCQl7ICQkID0gKigodW5zaWduZWQgaW50ICopICQyKTsgfQogCQotIGluZm9jbWQ6IElORk8gUkVHUyAgICAgeyBpbmZvX3JlZygpOyB9Ci0JfCBJTkZPIFNUQUNLICAgIHsgaW5mb19zdGFjaygpOyB9CisgaW5mb2NtZDogSU5GTyBSRUdTICAgICB7IERFQlVHX0luZm9SZWdpc3RlcnMoKTsgfQorCXwgSU5GTyBTVEFDSyAgICB7IERFQlVHX0luZm9TdGFjaygpOyB9CisJfCBJTkZPIEJSRUFLICAgIHsgREVCVUdfSW5mb0JyZWFrcG9pbnRzKCk7IH0KIAl8IElORk8gU0VHTUVOVFMgeyBMRFRfUHJpbnQoKTsgfQotCXwgSU5GTyBCUkVBSyAgICB7IGluZm9fYnJlYWsoKTsgfQogCiAKICUlCkBAIC0xMzMsNzggKzEyOCw1NSBAQAogCiB2b2lkIG1vZGVfY29tbWFuZChpbnQgbmV3bW9kZSkKIHsKLSAgaWYobmV3bW9kZSA9PSAxNil7Ci0gICAgZGJnX21hc2sgPSAweGZmZmY7Ci0gICAgZGJnX21vZGUgPSAxNjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYobmV3bW9kZSA9PSAzMil7IAotICAgIGRiZ19tYXNrID0gMHhmZmZmZmZmZjsKLSAgICBkYmdfbW9kZSA9IDMyOwotICAgIHJldHVybjsKLSAgfQotICBmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBtb2RlICh1c2UgMTYgb3IgMzIpXG4iKTsKKyAgICBpZiAoKG5ld21vZGUgPT0gMTYpIHx8IChuZXdtb2RlID09IDMyKSkgZGJnX21vZGUgPSBuZXdtb2RlOworICAgIGVsc2UgZnByaW50ZihzdGRlcnIsIkludmFsaWQgbW9kZSAodXNlIDE2IG9yIDMyKVxuIik7CiB9CiAKLXN0YXRpYyBpbnQgbG9hZGVkX3N5bWJvbHMgPSAwOwogCi12b2lkCi13aW5lX2RlYnVnKGludCBzaWduYWwsIGludCAqIHJlZ3MpCit2b2lkIHdpbmVfZGVidWcoIGludCBzaWduYWwsIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqcmVncyApCiB7Ci0Jc3RhdGljIGludCBkdW1teV9yZWdzWzMyXTsKLQljaGFyIFN5bWJvbFRhYmxlRmlsZVsyNTZdOworICAgIHN0YXRpYyBpbnQgbG9hZGVkX3N5bWJvbHMgPSAwOworICAgIGNoYXIgU3ltYm9sVGFibGVGaWxlWzI1Nl07CisgICAgaW50IGluc3RyX2xlbiA9IDAsIG5ld21vZGU7CiAjaWZkZWYgWVlERUJVRwotCXl5ZGVidWcgPSAwOworICAgIHl5ZGVidWcgPSAxOwogI2VuZGlmCiAKLQl5eWluID0gc3RkaW47Ci0JcmVndmFsID0gcmVncyA/IHJlZ3MgOiBkdW1teV9yZWdzOworICAgIHl5aW4gPSBzdGRpbjsKKyAgICBjb250ZXh0ID0gKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqKXJlZ3M7CiAKLQlpZiAoU0NfQ1MgPT0gV0lORV9DT0RFX1NFTEVDVE9SKSBkYmdfbW9kZSA9IDMyOwotICAgICAgICBlbHNlIGRiZ19tb2RlID0gKEdFVF9TRUxfRkxBR1MoU0NfQ1MpICYgTERUX0ZMQUdTXzMyQklUKSA/IDMyIDogMTY7Ci0gICAgICAgIGRiZ19tYXNrID0gKGRiZ19tb2RlID09IDMyKSA/IDB4ZmZmZmZmZmYgOiAweGZmZmY7CisgICAgaWYgKENTID09IFdJTkVfQ09ERV9TRUxFQ1RPUikgbmV3bW9kZSA9IDMyOworICAgIGVsc2UgbmV3bW9kZSA9IChHRVRfU0VMX0ZMQUdTKENTKSAmIExEVF9GTEFHU18zMkJJVCkgPyAzMiA6IDE2OwogCi0JZnByaW50ZihzdGRlcnIsIkluICVkIGJpdCBtb2RlLlxuIiwgZGJnX21vZGUpOworICAgIGlmIChuZXdtb2RlICE9IGRiZ19tb2RlKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwiSW4gJWQgYml0IG1vZGUuXG4iLCBkYmdfbW9kZSA9IG5ld21vZGUpOwogCi0JaWYoZGJnX21vZGUgPT0gMzIgJiYgIWxvYWRlZF9zeW1ib2xzKQotICAgICAgICB7Ci0JCWxvYWRlZF9zeW1ib2xzKys7Ci0JCUdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJ3aW5lIiwgIlN5bWJvbFRhYmxlRmlsZSIsICJ3aW5lLnN5bSIsCi0JCQlTeW1ib2xUYWJsZUZpbGUsIHNpemVvZihTeW1ib2xUYWJsZUZpbGUpLCBXSU5FX0lOSSk7Ci0JCXJlYWRfc3ltYm9sdGFibGUoU3ltYm9sVGFibGVGaWxlKTsKLQl9CisgICAgaWYoZGJnX21vZGUgPT0gMzIgJiYgIWxvYWRlZF9zeW1ib2xzKQorICAgIHsKKyAgICAgICAgbG9hZGVkX3N5bWJvbHMrKzsKKyAgICAgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIndpbmUiLCAiU3ltYm9sVGFibGVGaWxlIiwgIndpbmUuc3ltIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sVGFibGVGaWxlLCBzaXplb2YoU3ltYm9sVGFibGVGaWxlKSwgV0lORV9JTkkpOworICAgICAgICByZWFkX3N5bWJvbHRhYmxlKFN5bWJvbFRhYmxlRmlsZSk7CisgICAgfQogCi0JLyogUmVtb3ZlIHRoZSBicmVha3BvaW50cyBmcm9tIG1lbW9yeS4uLiAqLwotCWluc2VydF9icmVhaygwKTsKKyAgICBERUJVR19TZXRCcmVha3BvaW50cyggRkFMU0UgKTsKIAotCS8qIElmIHdlIHN0b3BwZWQgb24gYSBicmVha3BvaW50LCByZXBvcnQgdGhpcyBmYWN0ICovCi0JaWYoc2lnbmFsID09IFNJR1RSQVApCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBhZGRyOwotCSAgICBpbnQgYnBudW07Ci0JICAgIGFkZHIgPSBTQ19FSVAoZGJnX21hc2spOwotCSAgICBpZiAoZGJnX21vZGUgPT0gMTYpIGFkZHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIFNDX0NTLCBhZGRyICk7Ci0JICAgIGlmKHNob3VsZF9jb250aW51ZShicG51bT1nZXRfYnBudW0oYWRkcikpKXsKLQkJaW5zZXJ0X2JyZWFrKDEpOwotCQlyZXR1cm47Ci0JICAgIH0KLQkgICAgZnByaW50ZihzdGRlcnIsIlN0b3BwZWQgb24gYnJlYWtwb2ludCAlZFxuIiwgYnBudW0pOwotCSAgfQorICAgIGlmICgoc2lnbmFsICE9IFNJR1RSQVApIHx8ICFERUJVR19TaG91bGRDb250aW51ZSggcmVncywgZGJnX2V4ZWNfbW9kZSApKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHNlZ21lbnQgPSAoQ1MgPT0gV0lORV9DT0RFX1NFTEVDVE9SKSA/IDAgOiBDUzsKIAotCS8qIFNob3cgd2hlcmUgd2UgY3Jhc2hlZCAqLwotCWlmKHJlZ3MpCi0JICBleGFtaW5lX21lbW9yeSgweGZmZmZmZmZmLCBTQ19FSVAoZGJnX21hc2spLCAxLCAnaScpOworICAgICAgICAvKiBTaG93IHdoZXJlIHdlIGNyYXNoZWQgKi8KKyAgICAgICAgcHJpbnRfYWRkcmVzcyggc2VnbWVudCwgRUlQLCBkYmdfbW9kZSApOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiOiAgIik7CisgICAgICAgIGluc3RyX2xlbiA9IGRiX2Rpc2FzbSggc2VnbWVudCwgRUlQICkgLSBFSVA7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOworICAgICAgICAKKyAgICAgICAgaXNzdWVfcHJvbXB0KCk7CisgICAgICAgIHl5cGFyc2UoKTsKKyAgICAgICAgZmx1c2hfc3ltYm9scygpOworICAgIH0KIAotCWlzc3VlX3Byb21wdCgpOwotCi0JeXlwYXJzZSgpOwotCWZsdXNoX3N5bWJvbHMoKTsKLQotCS8qIFJlLWluc2VydCB0aGUgYnJlYWtwb2ludHMgZnJvbSBtZW1vcnkuLi4gKi8KLQlpbnNlcnRfYnJlYWsoMSk7Ci0KLQlmcHJpbnRmKHN0ZGVyciwiUmV0dXJuaW5nIHRvIFdpbmUuLi5cbiIpOwotCisgICAgREVCVUdfUmVzdGFydEV4ZWN1dGlvbiggcmVncywgZGJnX2V4ZWNfbW9kZSwgaW5zdHJfbGVuICk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGVidWcubCBiL2RlYnVnZ2VyL2RlYnVnLmwKaW5kZXggNjg5NzViNy4uNGI4Y2NmMSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZGVidWcubAorKysgYi9kZWJ1Z2dlci9kZWJ1Zy5sCkBAIC03LDkgKzcsMTAgQEAKIAogJXsKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgImRiZy50YWIuaCIKLSNpbmNsdWRlICJyZWdwb3MuaCIKKyNpbmNsdWRlICJkZWJ1Z2dlci5oIgogCiAjaWZkZWYgVVNFX1JFQURMSU5FCiAjdW5kZWYgWVlfSU5QVVQKQEAgLTE5LDEwMiArMjAsODkgQEAKICNlbmRpZgogCiBleHRlcm4gY2hhciAqIHJlYWRsaW5lKGNoYXIgKik7CitleHRlcm4gdm9pZCBhZGRfaGlzdG9yeShjaGFyICopOworc3RhdGljIGludCBkYmdfcmVhZChjaGFyICogYnVmLCBpbnQgc2l6ZSk7CiBzdGF0aWMgY2hhciAqIG1ha2Vfc3ltYm9sKGNoYXIgKik7CiB2b2lkIGZsdXNoX3N5bWJvbHMoKTsKIHN0YXRpYyBpbnQgc3ludGF4X2Vycm9yOwogZXh0ZXJuIGludCB5eWx2YWw7CiAlfQogCi1ESUdJVAlbMC05XQotSEVYRElHSVQgWzAtOWEtZkEtRl0KLQorRElHSVQJICAgWzAtOV0KK0hFWERJR0lUICAgWzAtOWEtZkEtRl0KK0ZPUk1BVCAgICAgW2JjZGlzd3hdCiBJREVOVElGSUVSIFtfYS16QS1aXC5+XVtfYS16QS1aMC05XC5+XSoKIAogJSUKIAotXG4JCXsgc3ludGF4X2Vycm9yID0gMDsgcmV0dXJuICdcbic7IH0gLyogSW5kaWNhdGUgZW5kIG9mIGNvbW1hbmQgKi8KK1xuCQl7IHN5bnRheF9lcnJvciA9IDA7IHJldHVybiAnXG4nOyB9IC8qSW5kaWNhdGUgZW5kIG9mIGNvbW1hbmQqLwogCi0iKyIJCXsgcmV0dXJuICcrJzsgfSAKK1stKz0oKSpdICAgICAgICB7IHJldHVybiAqeXl0ZXh0OyB9CiAKLSItIgkJeyByZXR1cm4gJy0nOyB9IAorIjB4IntIRVhESUdJVH0rICAgICAgeyBzc2NhbmYoeXl0ZXh0LCAiJXgiLCAmeXlsdmFsKTsgcmV0dXJuIE5VTTsgfQore0RJR0lUfSsgICAgICAgICAgICAgeyBzc2NhbmYoeXl0ZXh0LCAiJWQiLCAmeXlsdmFsKTsgcmV0dXJuIE5VTTsgfQogCi0iLyIJCXsgcmV0dXJuICcvJzsgfSAKKyIvIntESUdJVH0re0ZPUk1BVH0gIHsgY2hhciAqbGFzdDsgeXlsdmFsID0gc3RydG9sKCB5eXRleHQrMSwgJmxhc3QsIE5VTEwgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgeXlsdmFsID0gKHl5bHZhbCA8PCA4KSB8ICpsYXN0OyByZXR1cm4gRk9STUFUOyB9CisiLyJ7Rk9STUFUfSAgICAgICAgICB7IHl5bHZhbCA9ICgxIDw8IDgpIHwgeXl0ZXh0WzFdOyByZXR1cm4gRk9STUFUOyB9CiAKLSI9IgkJeyByZXR1cm4gJz0nOyB9IAorJHBjICAgICB7IHl5bHZhbCA9IFJFR19FSVA7IHJldHVybiBSRUc7IH0KKyRmbGFncyAgeyB5eWx2YWwgPSBSRUdfRUZMOyByZXR1cm4gUkVHOyB9CiskZWlwICAgIHsgeXlsdmFsID0gUkVHX0VJUDsgcmV0dXJuIFJFRzsgfQorJGlwICAgICB7IHl5bHZhbCA9IFJFR19JUDsgIHJldHVybiBSRUc7IH0KKyRlc3AgICAgeyB5eWx2YWwgPSBSRUdfRVNQOyByZXR1cm4gUkVHOyB9Ciskc3AgICAgIHsgeXlsdmFsID0gUkVHX1NQOyAgcmV0dXJuIFJFRzsgfQorJGVheCAgICB7IHl5bHZhbCA9IFJFR19FQVg7IHJldHVybiBSRUc7IH0KKyRlYnggICAgeyB5eWx2YWwgPSBSRUdfRUJYOyByZXR1cm4gUkVHOyB9CiskZWN4ICAgIHsgeXlsdmFsID0gUkVHX0VDWDsgcmV0dXJuIFJFRzsgfQorJGVkeCAgICB7IHl5bHZhbCA9IFJFR19FRFg7IHJldHVybiBSRUc7IH0KKyRlc2kgICAgeyB5eWx2YWwgPSBSRUdfRVNJOyByZXR1cm4gUkVHOyB9CiskZWRpICAgIHsgeXlsdmFsID0gUkVHX0VESTsgcmV0dXJuIFJFRzsgfQorJGVicCAgICB7IHl5bHZhbCA9IFJFR19FQlA7IHJldHVybiBSRUc7IH0KKyRheCAgICAgeyB5eWx2YWwgPSBSRUdfQVg7ICByZXR1cm4gUkVHOyB9CiskYnggICAgIHsgeXlsdmFsID0gUkVHX0JYOyAgcmV0dXJuIFJFRzsgfQorJGN4ICAgICB7IHl5bHZhbCA9IFJFR19DWDsgIHJldHVybiBSRUc7IH0KKyRkeCAgICAgeyB5eWx2YWwgPSBSRUdfRFg7ICByZXR1cm4gUkVHOyB9Ciskc2kgICAgIHsgeXlsdmFsID0gUkVHX1NJOyAgcmV0dXJuIFJFRzsgfQorJGRpICAgICB7IHl5bHZhbCA9IFJFR19ESTsgIHJldHVybiBSRUc7IH0KKyRicCAgICAgeyB5eWx2YWwgPSBSRUdfQlA7ICByZXR1cm4gUkVHOyB9CiskZXMgICAgIHsgeXlsdmFsID0gUkVHX0VTOyAgcmV0dXJuIFJFRzsgfQorJGRzICAgICB7IHl5bHZhbCA9IFJFR19EUzsgIHJldHVybiBSRUc7IH0KKyRjcyAgICAgeyB5eWx2YWwgPSBSRUdfQ1M7ICByZXR1cm4gUkVHOyB9Ciskc3MgICAgIHsgeXlsdmFsID0gUkVHX1NTOyAgcmV0dXJuIFJFRzsgfQogCi0iKCIJCXsgcmV0dXJuICcoJzsgfSAKLQotIikiCQl7IHJldHVybiAnKSc7IH0gCi0KLSIqIgkJeyByZXR1cm4gJyonOyB9IAotCi0iPyIJCXsgcmV0dXJuIEhFTFA7IH0KLQotIjB4Iit7SEVYRElHSVR9KyAgIHsKLQkJc3NjYW5mKHl5dGV4dCwgIiV4IiwgJnl5bHZhbCk7Ci0JCXJldHVybiBOVU07Ci0JCX0KLQote0RJR0lUfSsgICB7Ci0JCXNzY2FuZih5eXRleHQsICIlZCIsICZ5eWx2YWwpOwotCQlyZXR1cm4gTlVNOwotCQl9Ci0KLSRwYwkJeyB5eWx2YWwgPSBSTl9FSVA7IHJldHVybiBSRUc7fQotJHNwCQl7IHl5bHZhbCA9IFJOX0VTUF9BVF9TSUdOQUw7IHJldHVybiBSRUc7fQotJGVpcAkJeyB5eWx2YWwgPSBSTl9FSVA7IHJldHVybiBSRUc7fQotJGVzcAkJeyB5eWx2YWwgPSBSTl9FU1BfQVRfU0lHTkFMOyByZXR1cm4gUkVHO30KLSRlYnAJCXsgeXlsdmFsID0gUk5fRUJQOyByZXR1cm4gUkVHO30KLSRlYXgJCXsgeXlsdmFsID0gUk5fRUFYOyByZXR1cm4gUkVHO30KLSRlYngJCXsgeXlsdmFsID0gUk5fRUJYOyByZXR1cm4gUkVHO30KLSRlY3gJCXsgeXlsdmFsID0gUk5fRUNYOyByZXR1cm4gUkVHO30KLSRlZHgJCXsgeXlsdmFsID0gUk5fRURYOyByZXR1cm4gUkVHO30KLSRlc2kJCXsgeXlsdmFsID0gUk5fRVNJOyByZXR1cm4gUkVHO30KLSRlZGkJCXsgeXlsdmFsID0gUk5fRURJOyByZXR1cm4gUkVHO30KLQotJGVzCQl7IHl5bHZhbCA9IFJOX0VTOyAgcmV0dXJuIFJFRzt9Ci0kZHMJCXsgeXlsdmFsID0gUk5fRFM7ICByZXR1cm4gUkVHO30KLSRjcwkJeyB5eWx2YWwgPSBSTl9DUzsgIHJldHVybiBSRUc7fQotJHNzCQl7IHl5bHZhbCA9IFJOX1NTOyAgcmV0dXJuIFJFRzt9Ci0KLWluZm98aW5mfGluCQl7IHJldHVybiBJTkZPOyB9Ci1zZWdtZW50c3xzZWdtICAgICAgICAgICB7IHJldHVybiBTRUdNRU5UUzsgfQotYnJlYWt8YnJlYXxicmUgICAgICAgICAgeyByZXR1cm4gQlJFQUs7IH0KLWVuYWJsZXxlbmFibHxlbmFifGVuYSAgIHsgcmV0dXJuIEVOQUJMRTt9CitpbmZvfGluZnxpbgkJICAgICAgeyByZXR1cm4gSU5GTzsgfQorc2VnbWVudHN8c2VnbSAgICAgICAgICAgICAgICAgeyByZXR1cm4gU0VHTUVOVFM7IH0KK2JyZWFrfGJyZWF8YnJlfGJyfGIgICAgICAgICAgIHsgcmV0dXJuIEJSRUFLOyB9CitlbmFibGV8ZW5hYmx8ZW5hYnxlbmEgICAgICAgICB7IHJldHVybiBFTkFCTEU7fQogZGlzYWJsZXxkaXNhYmx8ZGlzYWJ8ZGlzYXxkaXMgeyByZXR1cm4gRElTQUJMRTsgfQotCi1xdWl0fHF1aXxxdSAJeyByZXR1cm4gUVVJVDsgfQorZGVsZXRlfGRlbGV0fGRlbGV8ZGVsICAgICAgICAgeyByZXR1cm4gREVMRVRFOyB9CitxdWl0fHF1aXxxdXxxICAgICAgICAgICAgICAgICB7IHJldHVybiBRVUlUOyB9Cit4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBFWEFNOyB9CiAKIGhlbHB8aGVsfGhlCXsgcmV0dXJuIEhFTFA7IH0KKyI/IgkJeyByZXR1cm4gSEVMUDsgfQogCiBzZXR8c2UJCXsgcmV0dXJuIFNFVDsgfQogCiBidAkJeyByZXR1cm4gQkFDS1RSQUNFOyB9CiAKLWNvbnR8Y29ufGNvCQl7IHJldHVybiBDT05UOyB9Citjb250fGNvbnxjb3xjICAgeyByZXR1cm4gQ09OVDsgfQorc3RlcHxzdGV8c3R8cyAgIHsgcmV0dXJuIFNURVA7IH0KK25leHR8bmV4fG5lfG4gICB7IHJldHVybiBORVhUOyB9CiAKIHN5bWJvbGZpbGV8c3ltYm9sZmlsfHN5bWJvbGZpfHN5bWJvbGZ8c3ltYm9sfHN5bWJvfHN5bWIgeyByZXR1cm4gU1lNQk9MRklMRTsgfQogCiBkZWZpbmV8ZGVmaW58ZGVmaXxkZWZ8ZGUgICAgICAgIHsgcmV0dXJuIERFRklORTsgfQogYWJvcnR8YWJvcnxhYm8gICAgICAgICAJICAgICAgICB7IHJldHVybiBBQk9SVDsgfQotcHJpbnR8cHJpbnxwcml8cHIJCXsgcmV0dXJuIFBSSU5UOyB9CitwcmludHxwcmlufHByaXxwcnxwCQl7IHJldHVybiBQUklOVDsgfQogCiBtb2RlCQkJCXsgcmV0dXJuIE1PREU7IH0KIAotcmVnc3xyZWd8cmUJeyByZXR1cm4gUkVHUzsgfQorcmVnaXN0ZXJzfHJlZ3N8cmVnfHJlCXsgcmV0dXJuIFJFR1M7IH0KIAogc3RhY2t8c3RhY3xzdGF8c3QgICAgIAl7IHJldHVybiBTVEFDSzsgfQogCi1wICAJCXsgcmV0dXJuICdwJzsgfQoteCAgCQl7IHJldHVybiAneCc7IH0KLWQJCXsgcmV0dXJuICdkJzsgfQotaQkJeyByZXR1cm4gJ2knOyB9Ci13CQl7IHJldHVybiAndyc7IH0KLWIJCXsgcmV0dXJuICdiJzsgfQotcwkJeyByZXR1cm4gJ3MnOyB9Ci1jCQl7IHJldHVybiAnYyc7IH0KLXEJCXsgcmV0dXJuICdxJzsgfQotCiB7SURFTlRJRklFUn0Je3l5bHZhbCA9IChpbnQpIG1ha2Vfc3ltYm9sKHl5dGV4dCk7IAogCSAgICAgICAgICByZXR1cm4gSURFTlRJRklFUjsKIAkgICAgICAgICB9CkBAIC0xNjEsMzUgKzE0OSw0NSBAQAogICBzdHJpbmdbKytpXSA9ICdcMCc7CiB9CiAKLWRiZ19yZWFkKGNoYXIgKiBidWYsIGludCBzaXplKXsKLQljaGFyICogbGluZTsKLQlpbnQgbGVuOworc3RhdGljIGludCBkYmdfcmVhZChjaGFyICogYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBzdGF0aWMgY2hhciBsYXN0X2xpbmVbMjU2XSA9ICIiOworICAgIGNoYXIgKiBsaW5lOworICAgIGludCBsZW47CisgICAgCisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIGZsdXNoX3N5bWJvbHMoKTsKKyAgICAgICAgbGluZSA9IHJlYWRsaW5lICgiV2luZS1kYmc+Iik7CisgICAgICAgIGlmICghbGluZSkgZXhpdCgwKTsKIAotCWRvewotCQlmbHVzaF9zeW1ib2xzKCk7Ci0JCWxpbmUgPSByZWFkbGluZSAoIldpbmUtZGJnPiIpOwotICAgICAgICAgICAgICAgIGlmICghbGluZSkgcmV0dXJuIDA7Ci0JCWxlbiA9IHN0cmxlbihsaW5lKTsKKyAgICAgICAgLyogUmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgbGluZS4KKyAgICAgICAgICAgVGhlbiwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCwgYWRkIGl0IHRvIHRoZSBoaXN0b3J5IGxpc3QKKyAgICAgICAgICAgYW5kIGV4ZWN1dGUgaXQuICovCisgICAgICAgIHN0cmlwd2hpdGUgKGxpbmUpOwogCi0gICAgICAgICAgICAgICAgLyogUmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgbGluZS4KLSAgICAgICAgICAgICAgICAgICBUaGVuLCBpZiB0aGVyZSBpcyBhbnl0aGluZyBsZWZ0LCBhZGQgaXQgdG8gdGhlIGhpc3RvcnkgbGlzdAotICAgICAgICAgICAgICAgICAgIGFuZCBleGVjdXRlIGl0LiAqLwotICAgICAgICAgICAgICAgIHN0cmlwd2hpdGUgKGxpbmUpOwotCQkJCi0gICAgICAgICAgICAgICAgaWYgKCpsaW5lKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkX2hpc3RvcnkgKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBpZihzaXplIDwgbGVuICsgMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRmF0YWwgcmVhZGxpbmUgZ29vZi5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdHJjcHkoYnVmLCBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAnXG4nOwotICAgICAgICAgICAgICAgICAgICBidWZbbGVuKzFdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbiArIDE7Ci0gICAgICAgICAgICAgICAgfQotCX0gd2hpbGUgKDE9PTEpOworICAgICAgICBpZiAoKmxpbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZF9oaXN0b3J5KCBsaW5lICk7CisgICAgICAgICAgICBzdHJuY3B5KCBsYXN0X2xpbmUsIGxpbmUsIDI1NSApOworICAgICAgICAgICAgbGFzdF9saW5lWzI1NV0gPSAnXDAnOyAKKyAgICAgICB9CisgICAgICAgIGVsc2UgbGluZSA9IGxhc3RfbGluZTsgIC8qIFJlcGVhdCBwcmV2aW91cyBjb21tYW5kICovCisKKyAgICAgICAgaWYgKChsZW4gPSBzdHJsZW4obGluZSkpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemUgPCBsZW4gKyAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJGYXRhbCByZWFkbGluZSBnb29mLlxuIik7CisgICAgICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmNweShidWYsIGxpbmUpOworICAgICAgICAgICAgYnVmW2xlbl0gPSAnXG4nOworICAgICAgICAgICAgYnVmW2xlbisxXSA9IDA7CisgICAgICAgICAgICBmcmVlKGxpbmUpOworICAgICAgICAgICAgcmV0dXJuIGxlbiArIDE7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHN0YXRpYyBjaGFyICpsb2NhbF9zeW1ib2xzWzEwXTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2R0ZXN0LmMgYi9kZWJ1Z2dlci9kdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODcyY2JmLi4wMDAwMDAwCi0tLSBhL2RlYnVnZ2VyL2R0ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotZXh0ZXJuIHZvaWQgd2luZV9kZWJ1Zyh1bnNpZ25lZCBpbnQqKTsKLQotCi0jaWZkZWYgbGludXgKLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNlbmRpZgotCi1zdHJ1Y3Qgc2lnYWN0aW9uIHNlZ3ZfYWN0OwotCi0jaWZkZWYgbGludXgKLQotc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydCBzY19ncywgX19nc2g7Ci0JdW5zaWduZWQgc2hvcnQgc2NfZnMsIF9fZnNoOwotCXVuc2lnbmVkIHNob3J0IHNjX2VzLCBfX2VzaDsKLQl1bnNpZ25lZCBzaG9ydCBzY19kcywgX19kc2g7Ci0JdW5zaWduZWQgbG9uZyBzY19lZGk7Ci0JdW5zaWduZWQgbG9uZyBzY19lc2k7Ci0JdW5zaWduZWQgbG9uZyBzY19lYnA7Ci0JdW5zaWduZWQgbG9uZyBzY19lc3A7Ci0JdW5zaWduZWQgbG9uZyBzY19lYng7Ci0JdW5zaWduZWQgbG9uZyBzY19lZHg7Ci0JdW5zaWduZWQgbG9uZyBzY19lY3g7Ci0JdW5zaWduZWQgbG9uZyBzY19lYXg7Ci0JdW5zaWduZWQgbG9uZyBzY190cmFwbm87Ci0JdW5zaWduZWQgbG9uZyBzY19lcnI7Ci0JdW5zaWduZWQgbG9uZyBzY19laXA7Ci0JdW5zaWduZWQgc2hvcnQgc2NfY3MsIF9fY3NoOwotCXVuc2lnbmVkIGxvbmcgc2NfZWZsYWdzOwotCXVuc2lnbmVkIGxvbmcgZXNwX2F0X3NpZ25hbDsKLQl1bnNpZ25lZCBzaG9ydCBzY19zcywgX19zc2g7Ci0JdW5zaWduZWQgbG9uZyBpMzg3OwotCXVuc2lnbmVkIGxvbmcgb2xkbWFzazsKLQl1bnNpZ25lZCBsb25nIGNyMjsKLX07Ci0jZW5kaWYKLQotI2lmZGVmIGxpbnV4Ci1zdGF0aWMgdm9pZCB3aW5fZmF1bHQoaW50IHNpZ25hbCwgc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0IGNvbnRleHQpewotICAgICAgICBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKnNjcCA9ICZjb250ZXh0OwotI2Vsc2UKLXN0YXRpYyB2b2lkIHdpbl9mYXVsdChpbnQgc2lnbmFsLCBpbnQgY29kZSwgc3RydWN0IHNpZ2NvbnRleHQgKnNjcCl7Ci0jZW5kaWYKLQotCXdpbmVfZGVidWcoKHVuc2lnbmVkIGludCAqKSBzY3ApOyAgLyogRW50ZXIgb3VyIGRlYnVnZ2VyICovCi19Ci0KLWNoYXIgcmVhbHRleHRbXSA9ICJUaGlzIGlzIHdoYXQgc2hvdWxkIHJlYWxseSBiZSBwcmludGVkXG4iOwotCi1pbnQgCi1tYWluKCl7Ci0JY2hhciAqIHBudDsKLSNpZmRlZiBsaW51eAotCXNlZ3ZfYWN0LnNhX2hhbmRsZXIgPSAoX19zaWdoYW5kbGVyX3QpIHdpbl9mYXVsdDsKLQlzaWdhY3Rpb24oU0lHU0VHViwgJnNlZ3ZfYWN0LCBOVUxMKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAgICAgc2lnc2V0X3Qgc2lnX21hc2s7Ci0gICAgICAgIAotICAgICAgICBzaWdlbXB0eXNldCgmc2lnX21hc2spOwotICAgICAgICBzZWd2X2FjdC5zYV9oYW5kbGVyID0gKF9fc2lnaGFuZGxlcl90KSB3aW5fZmF1bHQ7Ci0Jc2Vndl9hY3Quc2FfZmxhZ3MgPSAwOwotICAgICAgICBzZWd2X2FjdC5zYV9tYXNrID0gc2lnX21hc2s7Ci0JaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmc2Vndl9hY3QsIE5VTEwpIDwgMCkgewotICAgICAgICAgICAgICAgIHBlcnJvcigic2lnYWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotI2VuZGlmCi0KLQlmcHJpbnRmKHN0ZGVyciwiJXhcbiIsIHJlYWx0ZXh0KTsKLQotCS8qIE5vdyBmb3JjZSBhIHNlZ21lbnRhdGlvbiBmYXVsdCAqLwotCXBudCA9IChjaGFyICopIDB4YzAwMDAwMDA7Ci0KLQlmcHJpbnRmKHN0ZGVyciwiJXMiLCBwbnQpOwotCXJldHVybiAwOwotCi19Ci0KLQotdW5zaWduZWQgaW50ICogd2luZV9maWxlcyA9IE5VTEw7Ci0KLUdldEVudHJ5UG9pbnRGcm9tT3JkaW5hbChpbnQgd3BudCwgaW50IG9yZGluYWwpIHt9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9oYXNoLmMgYi9kZWJ1Z2dlci9oYXNoLmMKaW5kZXggNTEzNmMxYy4uYmNhNjU1MyAxMDA2NDQKLS0tIGEvZGVidWdnZXIvaGFzaC5jCisrKyBiL2RlYnVnZ2VyL2hhc2guYwpAQCAtMTU1LDEwICsxNTUsNiBAQAogfQogCiAKLS8qIExvYWQgdGhlIGVudHJ5IHBvaW50cyBmcm9tIHRoZSBkeW5hbWljIGxpbmtpbmcgaW50byB0aGUgaGFzaCB0YWJsZXMuIAotICogVGhpcyBkb2VzIG5vdCB3b3JrIHlldCAtIHNvbWV0aGluZyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgaXQgc2NhbnMgdGhlCi0gKiB0YWJsZXMgY29ycmVjdGx5IAotICovCiAKIHZvaWQgbG9hZF9lbnRyeXBvaW50cyggSE1PRFVMRSBoTW9kdWxlICkKIHsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2luZm8uYyBiL2RlYnVnZ2VyL2luZm8uYwppbmRleCAzZjk5MzQ5Li42NWY4YmJkIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9pbmZvLmMKKysrIGIvZGVidWdnZXIvaW5mby5jCkBAIC02LDE2ICs2LDEwIEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImxkdC5oIgotI2luY2x1ZGUgImRiX2Rpc2FzbS5oIgotI2luY2x1ZGUgInJlZ3Bvcy5oIgorI2luY2x1ZGUgImRlYnVnZ2VyLmgiCiAKIGV4dGVybiBjaGFyICogZmluZF9uZWFyZXN0X3N5bWJvbCggdW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGFkZHIgKTsKIAotZXh0ZXJuIGludCAqIHJlZ3ZhbDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZGJnX21hc2s7Ci1leHRlcm4gdW5zaWduZWQgaW50IGRiZ19tb2RlOwotCiB2b2lkIGFwcGxpY2F0aW9uX25vdF9ydW5uaW5nKCkKIHsKICAgZnByaW50ZihzdGRlcnIsIkFwcGxpY2F0aW9uIG5vdCBydW5uaW5nXG4iKTsKQEAgLTMyLDU0ICsyNiw2IEBACiB9CiAKIAotdm9pZCBpbmZvX3JlZygpewotCi0JICBpZighcmVndmFsKSB7Ci0JICAgIGFwcGxpY2F0aW9uX25vdF9ydW5uaW5nKCk7Ci0JICAgIHJldHVybjsKLQkgIH0KLQotCWZwcmludGYoc3RkZXJyLCJSZWdpc3RlciBkdW1wOlxuIik7Ci0JLyogRmlyc3QgZ2V0IHRoZSBzZWdtZW50IHJlZ2lzdGVycyBvdXQgb2YgdGhlIHdheSAqLwotCWZwcmludGYoc3RkZXJyLCIgQ1M6JTQuNHggU1M6JTQuNHggRFM6JTQuNHggRVM6JTQuNHggR1M6JTQuNHggRlM6JTQuNHhcbiIsIAotCQlTQ19DUywgU0NfU1MsIFNDX0RTLCBTQ19FUywgU0NfR1MsIFNDX0ZTKTsKLQotCS8qIE5vdyBkdW1wIHRoZSBtYWluIHJlZ2lzdGVycyAqLwotCWZwcmludGYoc3RkZXJyLCIgRUlQOiU4Ljh4IEVTUDolOC44eCBFQlA6JTguOHggRUZMQUdTOiU4Ljh4XG4iLCAKLQkJU0NfRUlQKGRiZ19tYXNrKSwgU0NfRVNQKGRiZ19tYXNrKSwgU0NfRUJQKGRiZ19tYXNrKSwgU0NfRUZMQUdTKTsKLQotCS8qIEFuZCBkdW1wIHRoZSByZWd1bGFyIHJlZ2lzdGVycyAqLwotCi0JZnByaW50ZihzdGRlcnIsIiBFQVg6JTguOHggRUJYOiU4Ljh4IEVDWDolOC44eCBFRFg6JTguOHhcbiIsIAotCQlTQ19FQVgoZGJnX21hc2spLCBTQ19FQlgoZGJnX21hc2spLCBTQ19FQ1goZGJnX21hc2spLCBTQ19FRFgoZGJnX21hc2spKTsKLQotCS8qIEZpbmFsbHkgZHVtcCB0aGVzZSBtYWluIHJlZ2lzdGVycyAqLwotCWZwcmludGYoc3RkZXJyLCIgRURJOiU4Ljh4IEVTSTolOC44eFxuIiwgCi0JCVNDX0VESShkYmdfbWFzayksIFNDX0VTSShkYmdfbWFzaykpOwotCi19Ci0KLXZvaWQgaW5mb19zdGFjaygpewotCXVuc2lnbmVkIGludCAqIGR1bXA7Ci0JaW50IGk7Ci0KLQlpZighcmVndmFsKSB7Ci0JICBhcHBsaWNhdGlvbl9ub3RfcnVubmluZygpOwotCSAgcmV0dXJuOwotCX0KLQotCWZwcmludGYoc3RkZXJyLCJTdGFjayBkdW1wOlxuIik7Ci0JZHVtcCA9IChpbnQqKSBTQ19FU1AoZGJnX21hc2spOwotCWZvcihpPTA7IGk8MjI7IGkrKykgCi0JewotCSAgICBmcHJpbnRmKHN0ZGVyciwiICU4Ljh4IiwgKmR1bXArKyk7Ci0JICAgIGlmICgoaSAlIDgpID09IDcpCi0JCWZwcmludGYoc3RkZXJyLCJcbiIpOwotCX0KLQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLX0KLQotCiB2b2lkIGV4YW1pbmVfbWVtb3J5KCB1bnNpZ25lZCBpbnQgc2VnbWVudCwgdW5zaWduZWQgaW50IGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGNoYXIgZm9ybWF0ICkKIHsKQEAgLTg4LDkgKzM0LDEwIEBACiAgICAgdW5zaWduZWQgc2hvcnQgaW50ICogd2R1bXA7CiAgICAgaW50IGk7CiAKLSAgICBpZiAoc2VnbWVudCA9PSAweGZmZmZmZmZmKQotICAgICAgICBzZWdtZW50ID0gKGRiZ19tb2RlID09IDMyKSA/IDAgOiAoZm9ybWF0ID09ICdpJyA/IFNDX0NTIDogU0NfRFMpOwotICAgIAorICAgIGlmIChzZWdtZW50ID09IDB4ZmZmZmZmZmYpIHNlZ21lbnQgPSAoZm9ybWF0ID09ICdpJyA/IENTIDogRFMpOworICAgIGlmICgoc2VnbWVudCA9PSBXSU5FX0NPREVfU0VMRUNUT1IpIHx8IChzZWdtZW50ID09IFdJTkVfREFUQV9TRUxFQ1RPUikpCisgICAgICAgIHNlZ21lbnQgPSAwOworCiAgICAgaWYgKGZvcm1hdCAhPSAnaScgJiYgY291bnQgPiAxKQogICAgIHsKICAgICAgICAgcHJpbnRfYWRkcmVzcyggc2VnbWVudCwgYWRkciwgZGJnX21vZGUgKTsKQEAgLTExNCw3ICs2MSw3IEBACiAJCWZvcihpPTA7IGk8Y291bnQ7IGkrKykgewogCQkJcHJpbnRfYWRkcmVzcyggc2VnbWVudCwgYWRkciwgZGJnX21vZGUgKTsKIAkJCWZwcmludGYoc3RkZXJyLCI6ICAiKTsKLQkJCWFkZHIgPSBkYl9kaXNhc20oIHNlZ21lbnQsIGFkZHIsIChkYmdfbW9kZSA9PSAxNikgKTsKKwkJCWFkZHIgPSBkYl9kaXNhc20oIHNlZ21lbnQsIGFkZHIgKTsKIAkJCWZwcmludGYoc3RkZXJyLCJcbiIpOwogCQl9OwogCQlyZXR1cm47CkBAIC0xNTIsNyArOTksNyBAQAogCQl3ZHVtcCA9ICh1bnNpZ25lZCBzaG9ydCAqKXBudDsKIAkJZm9yKGk9MDsgaTxjb3VudDsgaSsrKSAKIAkJewotCQkJZnByaW50ZihzdGRlcnIsIiAleCIsICp3ZHVtcCsrKTsKKwkJCWZwcmludGYoc3RkZXJyLCIgJTA0eCIsICp3ZHVtcCsrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgKz0gMjsKIAkJCWlmICgoaSAlIDEwKSA9PSA3KSB7CiAJCQkJZnByaW50ZihzdGRlcnIsIlxuIik7CkBAIC0yMDUsMTQgKzE1MiwxNSBAQAogIlRoZSBjb21tYW5kcyBhY2NlcHRlZCBieSB0aGUgV2luZSBkZWJ1Z2dlciBhcmUgYSBzbWFsbCBzdWJzZXQiLAogIm9mIHRoZSBjb21tYW5kcyB0aGF0IGdkYiB3b3VsZCBhY2NlcHQuICBUaGUgY29tbWFuZHMgY3VycmVudGx5IiwKICJhcmU6XG4iLAotIiAgYnJlYWsgKjxhZGRyPiAgICAgICAgICAgICAgICAgICAgICAgIGJ0IiwKKyIgIGJyZWFrIFsqPGFkZHI+XSAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYnJlYWsgYnBudW0iLAogIiAgZGlzYWJsZSBicG51bSAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSBicG51bSIsCiAiICBoZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpdCIsCiAiICB4IDxleHByPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udCIsCisiICBzdGVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCIsCiAiICBtb2RlIFsxNiwzMl0gICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPGV4cHI+IiwKICIgIHNldCA8cmVnPiA9IDxleHByPiAgICAgICAgICAgICAgICAgICBzZXQgKjxleHByPiA9IDxleHByPiIsCi0iICBpbmZvIFtyZWcsc3RhY2ssYnJlYWssc2VnbWVudHNdICAgICAgc3ltYm9sZmlsZSA8ZmlsZW5hbWU+IiwKLSIgIGRlZmluZSA8aWRlbnRpZmllcj4gPGV4cHI+IiwKKyIgIGluZm8gW3JlZyxzdGFjayxicmVhayxzZWdtZW50c10gICAgICBidCIsCisiICBzeW1ib2xmaWxlIDxmaWxlbmFtZT4gICAgICAgICAgICAgICAgZGVmaW5lIDxpZGVudGlmaWVyPiA8ZXhwcj4iLAogIiIsCiAiVGhlICd4JyBjb21tYW5kIGFjY2VwdHMgcmVwZWF0IGNvdW50cyBhbmQgZm9ybWF0cyAoaW5jbHVkaW5nICdpJykgaW4gdGhlIiwKICJzYW1lIHdheSB0aGF0IGdkYiBkb2VzLiIsCkBAIC0yMzAsNTcgKzE3OCwzIEBACiAJaSA9IDA7CiAJd2hpbGUoaGVscHRleHRbaV0pIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgaGVscHRleHRbaSsrXSk7CiB9Ci0KLQotc3RydWN0IGZyYW1lewotICB1bmlvbnsKLSAgICBzdHJ1Y3QgewotICAgICAgdW5zaWduZWQgc2hvcnQgc2F2ZWRfYnA7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBzYXZlZF9pcDsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHNhdmVkX2NzOwotICAgIH0gd2luMTY7Ci0gICAgc3RydWN0IHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc2F2ZWRfYnA7Ci0gICAgICB1bnNpZ25lZCBsb25nIHNhdmVkX2lwOwotICAgICAgdW5zaWduZWQgc2hvcnQgc2F2ZWRfY3M7Ci0gICAgfSB3aW4zMjsKLSAgfSB1OwotfTsKLQotCi12b2lkIGRiZ19idCgpewotICBzdHJ1Y3QgZnJhbWUgKiBmcmFtZTsKLSAgdW5zaWduZWQgc2hvcnQgY3M7Ci0gIGludCBmcmFtZW5vID0gMDsKLQotICBpZighcmVndmFsKSB7Ci0gICAgYXBwbGljYXRpb25fbm90X3J1bm5pbmcoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZGJnX21vZGUgPT0gMTYpCi0gICAgICBmcmFtZSA9IChzdHJ1Y3QgZnJhbWUgKilQVFJfU0VHX09GRl9UT19MSU4oIFNDX1NTLCBTQ19CUCAmIH4xICk7Ci0gIGVsc2UKLSAgICAgIGZyYW1lID0gKHN0cnVjdCBmcmFtZSAqKVNDX0VCUChkYmdfbWFzayk7Ci0KLSAgZnByaW50ZihzdGRlcnIsIkJhY2t0cmFjZTpcbiIpOwotICBjcyA9IFNDX0NTOwotICB3aGlsZSgoY3MgJiAzKSA9PSAzKSB7Ci0gICAgLyogU2VlIGlmIGluIDMyIGJpdCBtb2RlIG9yIG5vdC4gIEFzc3VtZSBHRFQgbWVhbnMgMzIgYml0LiAqLwotICAgIGlmICgoY3MgJiA3KSAhPSA3KSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwiJWQgIixmcmFtZW5vKyspOwotICAgICAgcHJpbnRfYWRkcmVzcyggMCwgZnJhbWUtPnUud2luMzIuc2F2ZWRfaXAsIDMyICk7Ci0gICAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKLSAgICAgIGlmICghZnJhbWUtPnUud2luMzIuc2F2ZWRfaXApIGJyZWFrOwotICAgICAgZnJhbWUgPSAoc3RydWN0IGZyYW1lICopIGZyYW1lLT51LndpbjMyLnNhdmVkX2JwOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZnJhbWUtPnUud2luMTYuc2F2ZWRfYnAgJiAxKSBjcyA9IGZyYW1lLT51LndpbjE2LnNhdmVkX2NzOwotICAgICAgZnByaW50ZihzdGRlcnIsIiVkICU0LjR4OiU0LjR4XG4iLCBmcmFtZW5vKyssIGNzLCAKLQkgICAgICBmcmFtZS0+dS53aW4xNi5zYXZlZF9pcCk7Ci0gICAgICBpZiAoIWZyYW1lLT51LndpbjE2LnNhdmVkX2JwKSBicmVhazsKLSAgICAgIGZyYW1lID0gKHN0cnVjdCBmcmFtZSAqKSBQVFJfU0VHX09GRl9UT19MSU4oIFNDX1NTLCBmcmFtZS0+dS53aW4xNi5zYXZlZF9icCAmIH4xKTsKLSAgICB9Ci0gIH0KLSAgcHV0Y2hhcignXG4nKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvcmVnaXN0ZXJzLmMgYi9kZWJ1Z2dlci9yZWdpc3RlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDk0OGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvcmVnaXN0ZXJzLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBEZWJ1Z2dlciByZWdpc3RlciBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAxOTk1IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImRlYnVnZ2VyLmgiCisKKworc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgREVCVUdfU2V0UmVnaXN0ZXIKKyAqCisgKiBTZXQgYSByZWdpc3RlciB2YWx1ZS4KKyAqLwordm9pZCBERUJVR19TZXRSZWdpc3RlciggZW51bSBkZWJ1Z19yZWdzIHJlZywgaW50IHZhbCApCit7CisgICAgc3dpdGNoKHJlZykKKyAgICB7CisgICAgICAgIGNhc2UgUkVHX0VBWDogRUFYID0gdmFsOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfRUJYOiBFQlggPSB2YWw7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19FQ1g6IEVDWCA9IHZhbDsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0VEWDogRURYID0gdmFsOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfRVNJOiBFU0kgPSB2YWw7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19FREk6IEVESSA9IHZhbDsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0VCUDogRUJQID0gdmFsOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfRUZMOiBFRkwgPSB2YWw7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19FSVA6IEVJUCA9IHZhbDsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0VTUDogRVNQID0gdmFsOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfQVg6ICBBWCAgPSB2YWw7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19CWDogIEJYICA9IHZhbDsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0NYOiAgQ1ggID0gdmFsOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfRFg6ICBEWCAgPSB2YWw7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19TSTogIFNJICA9IHZhbDsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0RJOiAgREkgID0gdmFsOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfQlA6ICBCUCAgPSB2YWw7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19GTDogIEZMICA9IHZhbDsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0lQOiAgSVAgID0gdmFsOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfU1A6ICBTUCAgPSB2YWw7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19DUzogIENTICA9IHZhbDsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0RTOiAgRFMgID0gdmFsOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfRVM6ICBFUyAgPSB2YWw7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19TUzogIFNTICA9IHZhbDsgYnJlYWs7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERFQlVHX0dldFJlZ2lzdGVyCisgKgorICogR2V0IGEgcmVnaXN0ZXIgdmFsdWUuCisgKi8KK2ludCBERUJVR19HZXRSZWdpc3RlciggZW51bSBkZWJ1Z19yZWdzIHJlZyApCit7CisgICAgc3dpdGNoKHJlZykKKyAgICB7CisgICAgICAgIGNhc2UgUkVHX0VBWDogcmV0dXJuIEVBWDsKKyAgICAgICAgY2FzZSBSRUdfRUJYOiByZXR1cm4gRUJYOworICAgICAgICBjYXNlIFJFR19FQ1g6IHJldHVybiBFQ1g7CisgICAgICAgIGNhc2UgUkVHX0VEWDogcmV0dXJuIEVEWDsKKyAgICAgICAgY2FzZSBSRUdfRVNJOiByZXR1cm4gRVNJOworICAgICAgICBjYXNlIFJFR19FREk6IHJldHVybiBFREk7CisgICAgICAgIGNhc2UgUkVHX0VCUDogcmV0dXJuIEVCUDsKKyAgICAgICAgY2FzZSBSRUdfRUZMOiByZXR1cm4gRUZMOworICAgICAgICBjYXNlIFJFR19FSVA6IHJldHVybiBFSVA7CisgICAgICAgIGNhc2UgUkVHX0VTUDogcmV0dXJuIEVTUDsKKyAgICAgICAgY2FzZSBSRUdfQVg6ICByZXR1cm4gQVg7CisgICAgICAgIGNhc2UgUkVHX0JYOiAgcmV0dXJuIEJYOworICAgICAgICBjYXNlIFJFR19DWDogIHJldHVybiBDWDsKKyAgICAgICAgY2FzZSBSRUdfRFg6ICByZXR1cm4gRFg7CisgICAgICAgIGNhc2UgUkVHX1NJOiAgcmV0dXJuIFNJOworICAgICAgICBjYXNlIFJFR19ESTogIHJldHVybiBESTsKKyAgICAgICAgY2FzZSBSRUdfQlA6ICByZXR1cm4gQlA7CisgICAgICAgIGNhc2UgUkVHX0ZMOiAgcmV0dXJuIEZMOworICAgICAgICBjYXNlIFJFR19JUDogIHJldHVybiBJUDsKKyAgICAgICAgY2FzZSBSRUdfU1A6ICByZXR1cm4gU1A7CisgICAgICAgIGNhc2UgUkVHX0NTOiAgcmV0dXJuIENTOworICAgICAgICBjYXNlIFJFR19EUzogIHJldHVybiBEUzsKKyAgICAgICAgY2FzZSBSRUdfRVM6ICByZXR1cm4gRVM7CisgICAgICAgIGNhc2UgUkVHX1NTOiAgcmV0dXJuIFNTOworICAgIH0KKyAgICByZXR1cm4gMDsgIC8qIHNob3VsZCBub3QgaGFwcGVuICovCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBERUJVR19JbmZvUmVnaXN0ZXJzCisgKgorICogRGlzcGxheSByZWdpc3RlcnMgaW5mb3JtYXRpb24uIAorICovCit2b2lkIERFQlVHX0luZm9SZWdpc3RlcnModm9pZCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwiUmVnaXN0ZXIgZHVtcDpcbiIpOworCisgICAgLyogRmlyc3QgZ2V0IHRoZSBzZWdtZW50IHJlZ2lzdGVycyBvdXQgb2YgdGhlIHdheSAqLworICAgIGZwcmludGYoIHN0ZGVyciwiIENTOiUwNHggU1M6JTA0eCBEUzolMDR4IEVTOiUwNHhcbiIsIENTLCBTUywgRFMsIEVTICk7CisKKyAgICBpZiAoZGJnX21vZGUgPT0gMTYpCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIiBJUDolMDR4IFNQOiUwNHggQlA6JTA0eCBGTEFHUzolMDR4XG4iLAorICAgICAgICAgICAgICAgICBJUCwgU1AsIEJQLCBGTCApOworCWZwcmludGYoIHN0ZGVyciwiIEFYOiUwNHggQlg6JTA0eCBDWDolMDR4IERYOiUwNHggU0k6JTA0eCBESTolMDR4XG4iLAorICAgICAgICAgICAgICAgICBBWCwgQlgsIENYLCBEWCwgU0ksIERJICk7CisgICAgfQorICAgIGVsc2UgIC8qIDMyLWJpdCBtb2RlICovCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIgRUlQOiUwOGx4IEVTUDolMDhseCBFQlA6JTA4bHggRUZMQUdTOiUwOGx4XG4iLCAKKyAgICAgICAgICAgICAgICAgRUlQLCBFU1AsIEVCUCwgRUZMICk7CisJZnByaW50Ziggc3RkZXJyLCAiIEVBWDolMDhseCBFQlg6JTA4bHggRUNYOiUwOGx4IEVEWDolMDhseFxuIiwgCisJCSBFQVgsIEVCWCwgRUNYLCBFRFgpOworCWZwcmludGYoIHN0ZGVyciwgIiBFU0k6JTA4bHggRURJOiUwOGx4XG4iLCBFU0ksIEVESSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWdwb3MuaCBiL2RlYnVnZ2VyL3JlZ3Bvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDA2OGUxLi4wMDAwMDAwCi0tLSBhL2RlYnVnZ2VyL3JlZ3Bvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLQotI2lmZGVmIGxpbnV4Ci0vKiBSZWdpc3RlciBudW1iZXJzICovCi0jZGVmaW5lICBSTl9HUwkJCTAKLSNkZWZpbmUgIFJOX0ZTCQkJMQotI2RlZmluZSAgUk5fRVMJCQkyCi0jZGVmaW5lICBSTl9EUwkJCTMKLSNkZWZpbmUgIFJOX0VESSAgCQk0Ci0jZGVmaW5lICBSTl9FU0kJCQk1Ci0jZGVmaW5lICBSTl9FQlAJCQk2Ci0jZGVmaW5lICBSTl9FU1AJCQk3Ci0jZGVmaW5lICBSTl9FQlgJCQk4Ci0jZGVmaW5lICBSTl9FRFgJCQk5Ci0jZGVmaW5lICBSTl9FQ1gJCQkxMAotI2RlZmluZSAgUk5fRUFYCQkJMTEKLSNkZWZpbmUgIFJOX1RSQVBOTwkJMTIKLSNkZWZpbmUgIFJOX0VSUgkJCTEzCi0jZGVmaW5lICBSTl9FSVAJCQkxNAotI2RlZmluZSAgUk5fQ1MJCQkxNQotI2RlZmluZSAgUk5fRUZMQUdTCQkxNgotI2RlZmluZSAgUk5fRVNQX0FUX1NJR05BTAkxNwotI2RlZmluZSAgUk5fU1MJCQkxOAotI2RlZmluZSAgUk5fSTM4NwkJMTkKLSNkZWZpbmUgIFJOX09MRE1BU0sJCTIwCi0jZGVmaW5lICBSTl9DUjIJCQkyMQotI2VuZGlmCi0KLSNpZmRlZiBfX05ldEJTRF9fCi0vKiBSZWdpc3RlciBudW1iZXJzICovCi0jZGVmaW5lICBSTl9HUwkJCTAKLSNkZWZpbmUgIFJOX0ZTCQkJMQotI2RlZmluZSAgUk5fRVMJCQkyCi0jZGVmaW5lICBSTl9EUwkJCTMKLSNkZWZpbmUgIFJOX0VESSAgCQk0Ci0jZGVmaW5lICBSTl9FU0kJCQk1Ci0jZGVmaW5lICBSTl9FQlAJCQk2Ci0jZGVmaW5lICBSTl9FQlgJCQk3Ci0jZGVmaW5lICBSTl9FRFgJCQk4Ci0jZGVmaW5lICBSTl9FQ1gJCQk5Ci0jZGVmaW5lICBSTl9FQVgJCQkxMAotI2RlZmluZSAgUk5fRUlQCQkJMTEKLSNkZWZpbmUgIFJOX0NTCQkJMTIKLSNkZWZpbmUgIFJOX0VGTEFHUwkJMTMKLSNkZWZpbmUgIFJOX0VTUF9BVF9TSUdOQUwJMTQKLSNkZWZpbmUgIFJOX1NTCQkJMTUKLSNkZWZpbmUgIFJOX09MRE1BU0sJCTE3Ci0jZW5kaWYKLQotI2lmZGVmIF9fRnJlZUJTRF9fCi0jZGVmaW5lICBSTl9PTERNQVNLCQkxCi0vKiBSZWdpc3RlciBudW1iZXJzICovCi0jZGVmaW5lICBSTl9FU1AJCQkyCi0jZGVmaW5lICBSTl9FQlAJCQkzCi0jZGVmaW5lICBSTl9FU1BfQVRfU0lHTkFMCTQKLSNkZWZpbmUgIFJOX0VJUAkJCTUKLSNkZWZpbmUgIFJOX0VGTEFHUwkJNgotI2RlZmluZSAgUk5fRVMJCQk3Ci0jZGVmaW5lICBSTl9EUwkJCTgKLSNkZWZpbmUgIFJOX0NTCQkJOQotI2RlZmluZSAgUk5fU1MJCQkxMAotI2RlZmluZSAgUk5fRURJICAJCTExCi0jZGVmaW5lICBSTl9FU0kJCQkxMgotI2RlZmluZSAgUk5fRUJYCQkJMTMKLSNkZWZpbmUgIFJOX0VEWAkJCTE0Ci0jZGVmaW5lICBSTl9FQ1gJCQkxNQotI2RlZmluZSAgUk5fRUFYCQkJMTYKLS8qIEZyZWVCU0QgZG9lc24ndCBzYXZlIGdzIG9yIGZzICovCi0jZGVmaW5lICBTQ19HUwkJCTB4MjcKLSNkZWZpbmUgIFNDX0ZTCQkJMHgyNwotI2VuZGlmCi0KLSNpZmRlZiBsaW51eAotI2RlZmluZSAgU0NfR1MJCQlyZWd2YWxbUk5fR1NdCi0jZGVmaW5lICBTQ19GUwkJCXJlZ3ZhbFtSTl9GU10KLSNkZWZpbmUgIEkzODcJCQlyZWd2YWxbUk5fSTM4N10KLSNkZWZpbmUgIENSMgkJCXJlZ3ZhbFtSTl9DUjJdCi0jZW5kaWYKLSNpZmRlZiBfX05ldEJTRF9fCi0jZGVmaW5lICBTQ19HUwkJCXJlZ3ZhbFtSTl9HU10KLSNkZWZpbmUgIFNDX0ZTCQkJcmVndmFsW1JOX0ZTXQotI2VuZGlmCi0jZGVmaW5lICBTQ19FUwkJCXJlZ3ZhbFtSTl9FU10KLSNkZWZpbmUgIFNDX0RTCQkJcmVndmFsW1JOX0RTXQotI2RlZmluZSAgU0NfRURJKGRiZ19tYXNrKSAgCShyZWd2YWxbUk5fRURJXSAmIGRiZ19tYXNrKQotI2RlZmluZSAgU0NfRVNJKGRiZ19tYXNrKQkocmVndmFsW1JOX0VTSV0gJiBkYmdfbWFzaykKLSNkZWZpbmUgIFNDX0VCUChkYmdfbWFzaykJKHJlZ3ZhbFtSTl9FQlBdICYgZGJnX21hc2spCi0jZGVmaW5lICBTQ19FQlgoZGJnX21hc2spCShyZWd2YWxbUk5fRUJYXSAmIGRiZ19tYXNrKQotI2RlZmluZSAgU0NfRURYKGRiZ19tYXNrKQkocmVndmFsW1JOX0VEWF0gJiBkYmdfbWFzaykKLSNkZWZpbmUgIFNDX0VDWChkYmdfbWFzaykJKHJlZ3ZhbFtSTl9FQ1hdICYgZGJnX21hc2spCi0jZGVmaW5lICBTQ19FQVgoZGJnX21hc2spCShyZWd2YWxbUk5fRUFYXSAmIGRiZ19tYXNrKQotI2RlZmluZSAgU0NfREkgICAgICAgICAgICAgICAgICAocmVndmFsW1JOX0VESV0gJiAweGZmZmYpCi0jZGVmaW5lICBTQ19TSSAgICAgICAgICAgICAgICAgIChyZWd2YWxbUk5fRVNJXSAmIDB4ZmZmZikKLSNkZWZpbmUgIFNDX0JQICAgICAgICAgICAgICAgICAgKHJlZ3ZhbFtSTl9FQlBdICYgMHhmZmZmKQotI2RlZmluZSAgU0NfU1AgICAgICAgICAgICAgICAgICAocmVndmFsW1JOX0VTUF0gJiAweGZmZmYpCi0jZGVmaW5lICBTQ19CWCAgICAgICAgICAgICAgICAgIChyZWd2YWxbUk5fRUJYXSAmIDB4ZmZmZikKLSNkZWZpbmUgIFNDX0RYICAgICAgICAgICAgICAgICAgKHJlZ3ZhbFtSTl9FRFhdICYgMHhmZmZmKQotI2RlZmluZSAgU0NfQ1ggICAgICAgICAgICAgICAgICAocmVndmFsW1JOX0VDWF0gJiAweGZmZmYpCi0jZGVmaW5lICBTQ19BWCAgICAgICAgICAgICAgICAgIChyZWd2YWxbUk5fRUFYXSAmIDB4ZmZmZikKLSNkZWZpbmUgIFNDX1RSQVBOTwkJcmVndmFsW1JOX1RSQVBOT10KLSNkZWZpbmUgIFNDX0VSUgkJCXJlZ3ZhbFtSTl9FUlJdCi0jZGVmaW5lICBTQ19FSVAoZGJnX21hc2spCShyZWd2YWxbUk5fRUlQXSAmIGRiZ19tYXNrKQotI2RlZmluZSAgU0NfQ1MJCQlyZWd2YWxbUk5fQ1NdCi0jZGVmaW5lICBTQ19FRkxBR1MJCXJlZ3ZhbFtSTl9FRkxBR1NdCi0jZGVmaW5lICBTQ19FU1AoZGJnX21hc2spCShyZWd2YWxbUk5fRVNQX0FUX1NJR05BTF0gJiBkYmdfbWFzaykKLSNkZWZpbmUgIFNDX1NTCQkJcmVndmFsW1JOX1NTXQotI2RlZmluZSAgT0xETUFTSwkJcmVndmFsW1JOX09MRE1BU0tdCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9zdGFjay5jIGIvZGVidWdnZXIvc3RhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmE0YjYyCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvc3RhY2suYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZGVidWdnZXIuaCIKKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFdPUkQgYnA7CisgICAgV09SRCBpcDsKKyAgICBXT1JEIGNzOworfSBGUkFNRTE2OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIERXT1JEIGJwOworICAgIERXT1JEIGlwOworICAgIFdPUkQgY3M7Cit9IEZSQU1FMzI7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBERUJVR19JbmZvU3RhY2sKKyAqCisgKiBEdW1wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCisgKi8KK3ZvaWQgREVCVUdfSW5mb1N0YWNrKHZvaWQpCit7CisgICAgZnByaW50ZihzdGRlcnIsIlN0YWNrIGR1bXA6XG4iKTsKKyAgICBpZiAoKFNTID09IFdJTkVfREFUQV9TRUxFQ1RPUikgfHwKKyAgICAgICAgKEdFVF9TRUxfRkxBR1MoU1MpICYgTERUX0ZMQUdTXzMyQklUKSkgIC8qIDMyLWJpdCBtb2RlICovCisgICAgeworICAgICAgICBleGFtaW5lX21lbW9yeSggMCwgRVNQLCAxMCwgJ3gnICk7CisgICAgfQorICAgIGVsc2UgIC8qIDE2LWJpdCBtb2RlICovCisgICAgeworICAgICAgICBleGFtaW5lX21lbW9yeSggU1MsIFNQLCAxMCwgJ3cnICk7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERFQlVHX0JhY2tUcmFjZQorICoKKyAqIERpc3BsYXkgYSBzdGFjayBiYWNrLXRyYWNlLgorICovCit2b2lkIERFQlVHX0JhY2tUcmFjZSh2b2lkKQoreworICBpbnQgZnJhbWVubyA9IDA7CisKKyAgZnByaW50ZihzdGRlcnIsIkJhY2t0cmFjZTpcbiIpOworICBpZiAoU1MgPT0gV0lORV9EQVRBX1NFTEVDVE9SKSAgLyogMzItYml0IG1vZGUgKi8KKyAgeworICAgICAgRlJBTUUzMiAqZnJhbWUgPSAoRlJBTUUzMiAqKUVCUDsKKyAgICAgIHdoaWxlIChmcmFtZS0+aXApCisgICAgICB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVkICIsZnJhbWVubysrKTsKKyAgICAgICAgICBwcmludF9hZGRyZXNzKCAwLCBmcmFtZS0+aXAsIDMyICk7CisgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CisgICAgICAgICAgZnJhbWUgPSAoRlJBTUUzMiAqKWZyYW1lLT5icDsKKyAgICAgIH0KKyAgfQorICBlbHNlICAvKiAxNi1iaXQgbW9kZSAqLworICB7CisgICAgICBGUkFNRTE2ICpmcmFtZSA9IChGUkFNRTE2ICopUFRSX1NFR19PRkZfVE9fTElOKCBTUywgQlAgJiB+MSApOworICAgICAgV09SRCBjcyA9IENTOworICAgICAgaWYgKEdFVF9TRUxfRkxBR1MoU1MpICYgTERUX0ZMQUdTXzMyQklUKQorICAgICAgeworICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIk5vdCBpbXBsZW1lbnRlZDogMzItYml0IGJhY2t0cmFjZSBvbiBhIGRpZmZlcmVudCBzdGFjayBzZWdtZW50LlxuIiApOworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChmcmFtZS0+YnApCisgICAgICB7CisgICAgICAgICAgaWYgKGZyYW1lLT5icCAmIDEpIGNzID0gZnJhbWUtPmNzOworICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwiJWQgIiwgZnJhbWVubysrICk7CisgICAgICAgICAgcHJpbnRfYWRkcmVzcyggY3MsIGZyYW1lLT5pcCwgMTYgKTsKKyAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKKyAgICAgICAgICBmcmFtZSA9IChGUkFNRTE2ICopUFRSX1NFR19PRkZfVE9fTElOKCBTUywgZnJhbWUtPmJwICYgfjEgKTsKKyAgICAgIH0KKyAgfQorICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKK30KZGlmZiAtLWdpdCBhL2lmMTYzMi9jb21wb2JqLnNwZWMgYi9pZjE2MzIvY29tcG9iai5zcGVjCmluZGV4IDc2NWFkMzAuLmM3Y2ZmYjggMTAwNjQ0Ci0tLSBhL2lmMTYzMi9jb21wb2JqLnNwZWMKKysrIGIvaWYxNjMyL2NvbXBvYmouc3BlYwpAQCAtMiw5ICsyLDkgQEAKIGlkCTIyCiAKIDEgcGFzY2FsIENvQnVpbGRWZXJzaW9uKCkgQ29CdWlsZFZlcnNpb24KLTIgcGFzY2FsIENvSW5pdGlhbGl6ZShwdHIpIENvSW5pdGlhbGl6ZQorMiBwYXNjYWwgQ29Jbml0aWFsaXplKGxvbmcpIENvSW5pdGlhbGl6ZQogMyBwYXNjYWwgQ29VbmluaXRpYWxpemUoKSBDb1VuaXRpYWxpemUKLTQgc3R1YiBDT0dFVE1BTExPQworNCBwYXNjYWwgQ29HZXRNYWxsb2MobG9uZyBwdHIpIENvR2V0TWFsbG9jCiA1IHN0dWIgQ09SRUdJU1RFUkNMQVNTT0JKRUNUCiA2IHN0dWIgQ09SRVZPS0VDTEFTU09CSkVDVAogNyBzdHViIENPR0VUQ0xBU1NPQkpFQ1QKQEAgLTk3LDQ5ICs5Nyw0OSBAQAogOTUgc3R1YiBTRVRFVEFTSwogOTYgc3R1YiBMUlBDRlJFRU1PTklUT1JEQVRBCiA5NyBzdHViIFJFTUxPT0tVUFNIVU5LCi0jMTAwID8/MENBUlJBWUZWQUxVRUBAUkVDQEtJQFoKLSMxMDEgPz8xQ0FSUkFZRlZBTFVFQEBSRUNAWFoKLSMxMDIgP0FTU0VSVFZBTElEQENBUlJBWUZWQUxVRUBAUkZDWFhaCi0jMTAzID9GUkVFRVhUUkFAQ0FSUkFZRlZBTFVFQEBSRUNYWFoKLSMxMDQgP19HRVRBVEBDQVJSQVlGVkFMVUVAQFJGQ1BFWEhAWgotIzEwNSA/R0VUU0laRUBDQVJSQVlGVkFMVUVAQFJGQ0hYWgotIzEwOCA/SU5ERVhPRkBDQVJSQVlGVkFMVUVAQFJFQ0hQRVhJSUBaCi0jMTA5ID9JTlNFUlRBVEBDQVJSQVlGVkFMVUVAQFJFQ0hIUEVYSEBaCi0jMTExID9SRU1PVkVBVEBDQVJSQVlGVkFMVUVAQFJFQ1hISEBaCi0jMTEyID9TRVRBVEBDQVJSQVlGVkFMVUVAQFJFQ1hIUEVYQFoKLSMxMTMgP1NFVEFUR1JPV0BDQVJSQVlGVkFMVUVAQFJFQ0hIUEVYQFoKLSMxMTQgP1NFVFNJWkVAQ0FSUkFZRlZBTFVFQEBSRUNISEhAWgotIzEyMCA/R0VUQVNTT0NBVEBDTUFQS0VZVE9WQUxVRUBAQkZDUEVVQ0FTU09DQDFAUEVYSUFFSUBaCi0jMTIxID9TRVRBU1NPQ0tFWUBDTUFQS0VZVE9WQUxVRUBAQkZDSFBFVUNBU1NPQ0AxQFBFWElAWgotIzEyMiA/PzFDTUFQS0VZVE9WQUxVRUBAUkVDQFhaCi0jMTIzID9HRVRBU1NPQ0tFWVBUUkBDTUFQS0VZVE9WQUxVRUBAQkZDWFBFVUNBU1NPQ0AxQFBFUEVYUEVJQFoKLSMxMjQgP05FV0FTU09DQENNQVBLRVlUT1ZBTFVFQEBCRUNQRVVDQVNTT0NAMUBJUEVYSTBAWgotIzEyNSA/U0laRUFTU09DQENNQVBLRVlUT1ZBTFVFQEBCRkNJWFoKLSMxMjYgP0ZSRUVBU1NPQ0BDTUFQS0VZVE9WQUxVRUBAQkVDWFBFVUNBU1NPQ0AxQEBaCi0jMTI3ID9HRVRTVEFSVFBPU0lUSU9OQENNQVBLRVlUT1ZBTFVFQEBSRkNQRVhYWgotIzEyOCA/R0VUTkVYVEFTU09DQENNQVBLRVlUT1ZBTFVFQEBSRkNYUEVQRVhQRVhQRUkxQFoKLSMxMjkgP0NPTVBBUkVBU1NPQ0tFWUBDTUFQS0VZVE9WQUxVRUBAQkZDSFBFVUNBU1NPQ0AxQFBFWElAWgotIzEzMCA/UkVNT1ZFSEtFWUBDTUFQS0VZVE9WQUxVRUBAUkVDSEtAWgotIzEzMSA/R0VUSEtFWUBDTUFQS0VZVE9WQUxVRUBAUkZDS1BFWElAWgotIzEzMiA/R0VUQ09VTlRAQ01BUEtFWVRPVkFMVUVAQFJGQ0hYWgotIzEzMyA/TE9PS1VQQENNQVBLRVlUT1ZBTFVFQEBSRkNIUEVYSTBAWgotIzEzNCA/R0VUQVNTT0NWQUxVRUBDTUFQS0VZVE9WQUxVRUBAQkZDWFBFVUNBU1NPQ0AxQFBFWEBaCi0jMTM1ID9SRU1PVkVLRVlAQ01BUEtFWVRPVkFMVUVAQFJFQ0hQRVhJQFoKLSMxMzYgP1JFTU9WRUFMTEBDTUFQS0VZVE9WQUxVRUBAUkVDWFhaCi0jMTM4ID9GUkVFQVNTT0NLRVlAQ01BUEtFWVRPVkFMVUVAQEJGQ1hQRVVDQVNTT0NAMUBAWgotIzEzOSA/U0VUQVRAQ01BUEtFWVRPVkFMVUVAQFJFQ0hQRVhJMEBaCi0jMTQwID9MT09LVVBIS0VZQENNQVBLRVlUT1ZBTFVFQEBSRkNIS1BFWEBaCi0jMTQxID9BU1NFUlRWQUxJREBDTUFQS0VZVE9WQUxVRUBAUkZDWFhaCi0jMTQyID9TRVRBU1NPQ1ZBTFVFQENNQVBLRVlUT1ZBTFVFQEBCRkNYUEVVQ0FTU09DQDFAUEVYQFoKLSMxNDMgP1NFVEFUSEtFWUBDTUFQS0VZVE9WQUxVRUBAUkVDSEtQRVhAWgotIzE0NCA/PzBDTUFQS0VZVE9WQUxVRUBAUkVDQEtJSUhQN0NJUEVYSUBaSUBaCi0jMTQ1ID9JTklUSEFTSFRBQkxFQENNQVBLRVlUT1ZBTFVFQEBCRUNIWFoKLSMxNDYgP0dFVEFTU09DVkFMVUVQVFJAQ01BUEtFWVRPVkFMVUVAQEJGQ1hQRVVDQVNTT0NAMUBQRVBFWEBaCi0jMTQ3ID9MT09LVVBBRERAQ01BUEtFWVRPVkFMVUVAQFJGQ0hQRVhJMEBaCi0jMTQ4IE1LVkRFRkFVTFRIQVNIS0VZCi0jMTUwIENPTUVNQ1RYT0YKLSMxNTEgQ09NRU1BTExPQwotIzE1MiBDT01FTUZSRUUKLSMxNjAgQ09SVU5NT0RBTExPT1AKLSMxNjEgQ09IQU5ETEVJTkNPTUlOR0NBTEwKLSMxNjIgQ09TRVRBQ0tTVEFURQorMTAwIHN0dWIgPz8wQ0FSUkFZRlZBTFVFQEBSRUNAS0lAWgorMTAxIHN0dWIgPz8xQ0FSUkFZRlZBTFVFQEBSRUNAWFoKKzEwMiBzdHViID9BU1NFUlRWQUxJREBDQVJSQVlGVkFMVUVAQFJGQ1hYWgorMTAzIHN0dWIgP0ZSRUVFWFRSQUBDQVJSQVlGVkFMVUVAQFJFQ1hYWgorMTA0IHN0dWIgP19HRVRBVEBDQVJSQVlGVkFMVUVAQFJGQ1BFWEhAWgorMTA1IHN0dWIgP0dFVFNJWkVAQ0FSUkFZRlZBTFVFQEBSRkNIWFoKKzEwOCBzdHViID9JTkRFWE9GQENBUlJBWUZWQUxVRUBAUkVDSFBFWElJQFoKKzEwOSBzdHViID9JTlNFUlRBVEBDQVJSQVlGVkFMVUVAQFJFQ0hIUEVYSEBaCisxMTEgc3R1YiA/UkVNT1ZFQVRAQ0FSUkFZRlZBTFVFQEBSRUNYSEhAWgorMTEyIHN0dWIgP1NFVEFUQENBUlJBWUZWQUxVRUBAUkVDWEhQRVhAWgorMTEzIHN0dWIgP1NFVEFUR1JPV0BDQVJSQVlGVkFMVUVAQFJFQ0hIUEVYQFoKKzExNCBzdHViID9TRVRTSVpFQENBUlJBWUZWQUxVRUBAUkVDSEhIQFoKKzEyMCBzdHViID9HRVRBU1NPQ0FUQENNQVBLRVlUT1ZBTFVFQEBCRkNQRVVDQVNTT0NAMUBQRVhJQUVJQFoKKzEyMSBzdHViID9TRVRBU1NPQ0tFWUBDTUFQS0VZVE9WQUxVRUBAQkZDSFBFVUNBU1NPQ0AxQFBFWElAWgorMTIyIHN0dWIgPz8xQ01BUEtFWVRPVkFMVUVAQFJFQ0BYWgorMTIzIHN0dWIgP0dFVEFTU09DS0VZUFRSQENNQVBLRVlUT1ZBTFVFQEBCRkNYUEVVQ0FTU09DQDFAUEVQRVhQRUlAWgorMTI0IHN0dWIgP05FV0FTU09DQENNQVBLRVlUT1ZBTFVFQEBCRUNQRVVDQVNTT0NAMUBJUEVYSTBAWgorMTI1IHN0dWIgP1NJWkVBU1NPQ0BDTUFQS0VZVE9WQUxVRUBAQkZDSVhaCisxMjYgc3R1YiA/RlJFRUFTU09DQENNQVBLRVlUT1ZBTFVFQEBCRUNYUEVVQ0FTU09DQDFAQFoKKzEyNyBzdHViID9HRVRTVEFSVFBPU0lUSU9OQENNQVBLRVlUT1ZBTFVFQEBSRkNQRVhYWgorMTI4IHN0dWIgP0dFVE5FWFRBU1NPQ0BDTUFQS0VZVE9WQUxVRUBAUkZDWFBFUEVYUEVYUEVJMUBaCisxMjkgc3R1YiA/Q09NUEFSRUFTU09DS0VZQENNQVBLRVlUT1ZBTFVFQEBCRkNIUEVVQ0FTU09DQDFAUEVYSUBaCisxMzAgc3R1YiA/UkVNT1ZFSEtFWUBDTUFQS0VZVE9WQUxVRUBAUkVDSEtAWgorMTMxIHN0dWIgP0dFVEhLRVlAQ01BUEtFWVRPVkFMVUVAQFJGQ0tQRVhJQFoKKzEzMiBzdHViID9HRVRDT1VOVEBDTUFQS0VZVE9WQUxVRUBAUkZDSFhaCisxMzMgc3R1YiA/TE9PS1VQQENNQVBLRVlUT1ZBTFVFQEBSRkNIUEVYSTBAWgorMTM0IHN0dWIgP0dFVEFTU09DVkFMVUVAQ01BUEtFWVRPVkFMVUVAQEJGQ1hQRVVDQVNTT0NAMUBQRVhAWgorMTM1IHN0dWIgP1JFTU9WRUtFWUBDTUFQS0VZVE9WQUxVRUBAUkVDSFBFWElAWgorMTM2IHN0dWIgP1JFTU9WRUFMTEBDTUFQS0VZVE9WQUxVRUBAUkVDWFhaCisxMzggc3R1YiA/RlJFRUFTU09DS0VZQENNQVBLRVlUT1ZBTFVFQEBCRkNYUEVVQ0FTU09DQDFAQFoKKzEzOSBzdHViID9TRVRBVEBDTUFQS0VZVE9WQUxVRUBAUkVDSFBFWEkwQFoKKzE0MCBzdHViID9MT09LVVBIS0VZQENNQVBLRVlUT1ZBTFVFQEBSRkNIS1BFWEBaCisxNDEgc3R1YiA/QVNTRVJUVkFMSURAQ01BUEtFWVRPVkFMVUVAQFJGQ1hYWgorMTQyIHN0dWIgP1NFVEFTU09DVkFMVUVAQ01BUEtFWVRPVkFMVUVAQEJGQ1hQRVVDQVNTT0NAMUBQRVhAWgorMTQzIHN0dWIgP1NFVEFUSEtFWUBDTUFQS0VZVE9WQUxVRUBAUkVDSEtQRVhAWgorMTQ0IHN0dWIgPz8wQ01BUEtFWVRPVkFMVUVAQFJFQ0BLSUlIUDdDSVBFWElAWklAWgorMTQ1IHN0dWIgP0lOSVRIQVNIVEFCTEVAQ01BUEtFWVRPVkFMVUVAQEJFQ0hYWgorMTQ2IHN0dWIgP0dFVEFTU09DVkFMVUVQVFJAQ01BUEtFWVRPVkFMVUVAQEJGQ1hQRVVDQVNTT0NAMUBQRVBFWEBaCisxNDcgc3R1YiA/TE9PS1VQQUREQENNQVBLRVlUT1ZBTFVFQEBSRkNIUEVYSTBAWgorMTQ4IHN0dWIgTUtWREVGQVVMVEhBU0hLRVkKKzE1MCBzdHViIENPTUVNQ1RYT0YKKzE1MSBzdHViIENPTUVNQUxMT0MKKzE1MiBzdHViIENPTUVNRlJFRQorMTYwIHN0dWIgQ09SVU5NT0RBTExPT1AKKzE2MSBzdHViIENPSEFORExFSU5DT01JTkdDQUxMCisxNjIgc3R1YiBDT1NFVEFDS1NUQVRFCmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpLnNwZWMgYi9pZjE2MzIvZ2RpLnNwZWMKaW5kZXggOTliNzY5Yi4uOTRhMzFlYyAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaS5zcGVjCisrKyBiL2lmMTYzMi9nZGkuc3BlYwpAQCAtMjA1LDggKzIwNSw4IEBACiAzMDYgc3R1YiBFTkdJTkVNQUtFRk9OVERJUgogMzA3IHN0dWIgR2V0Q2hhckFCQ1dpZHRocwogMzA4IHN0dWIgR2V0T3V0TGluZVRleHRNZXRyaWNzCi0zMDkgc3R1YiBHZXRHbHlwaE91dExpbmUKLTMxMCBzdHViIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlCiszMDkgcGFzY2FsICAgR2V0R2x5cGhPdXRMaW5lKHdvcmQgd29yZCB3b3JkIHB0ciBsb25nIHB0ciBwdHIpIEdldEdseXBoT3V0TGluZQorMzEwIHBhc2NhbDE2IENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlKHdvcmQgcHRyIHB0ciBwdHIpIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlCiAzMTEgc3R1YiBHZXRGb250RGF0YQogMzEyIHN0dWIgQ29udmVydE91dExpbmVGb250RmlsZQogMzEzIHBhc2NhbDE2IEdldFJhc3Rlcml6ZXJDYXBzKHB0ciB3b3JkKSBHZXRSYXN0ZXJpemVyQ2FwcwpkaWZmIC0tZ2l0IGEvaWYxNjMyL29sZTIuc3BlYyBiL2lmMTYzMi9vbGUyLnNwZWMKaW5kZXggZmU4MmI3MS4uYzNjYWE4MiAxMDA2NDQKLS0tIGEvaWYxNjMyL29sZTIuc3BlYworKysgYi9pZjE2MzIvb2xlMi5zcGVjCkBAIC0xLDcgKzEsNyBAQAogbmFtZQlPTEUyCiBpZAkxNQogCi0xIHN0dWIgT2xlQnVpbGRWZXJzaW9uCisxIHBhc2NhbCBPbGVCdWlsZFZlcnNpb24oKSBPbGVCdWlsZFZlcnNpb24KIDIgcGFzY2FsIE9sZUluaXRpYWxpemUocHRyKSBPbGVJbml0aWFsaXplCiAzIHBhc2NhbCBPbGVVbmluaXRpYWxpemUoKSBPbGVVbmluaXRpYWxpemUKIDQgc3R1YiBETExHRVRDTEFTU09CSkVDVApkaWZmIC0tZ2l0IGEvaWYxNjMyL29sZTJkaXNwLnNwZWMgYi9pZjE2MzIvb2xlMmRpc3Auc3BlYwppbmRleCA3ZjA5YWVjLi5lOGYzNGJmIDEwMDY0NAotLS0gYS9pZjE2MzIvb2xlMmRpc3Auc3BlYworKysgYi9pZjE2MzIvb2xlMmRpc3Auc3BlYwpAQCAtMiwxMiArMiwxMiBAQAogaWQJMTcKIAogMSBzdHViIERMTEdFVENMQVNTT0JKRUNUCi0yIHN0dWIgU1lTQUxMT0NTVFJJTkcKLTMgc3R1YiBTWVNSRUFMTE9DU1RSSU5HCi00IHN0dWIgU1lTQUxMT0NTVFJJTkdMRU4KLTUgc3R1YiBTWVNSRUFMTE9DU1RSSU5HTEVOCi02IHN0dWIgU1lTRlJFRVNUUklORwotNyBzdHViIFNZU1NUUklOR0xFTgorMiBwYXNjYWwgU3lzQWxsb2NTdHJpbmcocHRyKQlTeXNBbGxvY1N0cmluZworMyBwYXNjYWwgU3lzUmVhbGxvY1N0cmluZyhwdHIgcHRyKQlTeXNSZUFsbG9jU3RyaW5nCis0IHBhc2NhbCBTeXNBbGxvY1N0cmluZ0xlbihwdHIgd29yZCkJU3lzQWxsb2NTdHJpbmdMZW4KKzUgcGFzY2FsIFN5c1JlQWxsb2NTdHJpbmdMZW4ocHRyIHB0ciB3b3JkKSBTeXNSZUFsbG9jU3RyaW5nTGVuCis2IHBhc2NhbCBTeXNGcmVlU3RyaW5nKGxvbmcpCVN5c0ZyZWVTdHJpbmcKKzcgcGFzY2FsIFN5c1N0cmluZ0xlbihsb25nKQlTeXNTdHJpbmdMZW4KIDggc3R1YiBWQVJJQU5USU5JVAogOSBzdHViIFZBUklBTlRDTEVBUgogMTAgc3R1YiBWQVJJQU5UQ09QWQpkaWZmIC0tZ2l0IGEvaWYxNjMyL29sZTJubHMuc3BlYyBiL2lmMTYzMi9vbGUybmxzLnNwZWMKaW5kZXggYmFmYmM0Zi4uOWU3MDQ0NSAxMDA2NDQKLS0tIGEvaWYxNjMyL29sZTJubHMuc3BlYworKysgYi9pZjE2MzIvb2xlMm5scy5zcGVjCkBAIC04LDcgKzgsNyBAQAogNSBwYXNjYWwgR2V0TG9jYWxlSW5mb0EobG9uZyBsb25nIHB0ciB3b3JkKSBHZXRMb2NhbGVJbmZvQQogNiBzdHViIExDTUFQU1RSSU5HQQogNyBzdHViIEdFVFNUUklOR1RZUEVBCi04IHN0dWIgQ09NUEFSRVNUUklOR0EKKzggcGFzY2FsMTYgQ29tcGFyZVN0cmluZ0EobG9uZyBsb25nIHB0ciB3b3JkIHB0ciB3b3JkKSBDb21wYXJlU3RyaW5nQQogIzkgV0VQCiAxMCBzdHViIExJQk1BSU4KIDExIHN0dWIgTk9USUZZV0lORE9XUFJPQwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3NoZWxsLnNwZWMgYi9pZjE2MzIvc2hlbGwuc3BlYwppbmRleCBkYTZlNTcxLi44ZjAxZTAyIDEwMDY0NAotLS0gYS9pZjE2MzIvc2hlbGwuc3BlYworKysgYi9pZjE2MzIvc2hlbGwuc3BlYwpAQCAtNiwxMyArNiwxMyBAQAogIyAJCQlwcm9wZXIgcGFyYW1ldGVycy4gSXQncyBqdXN0IHRvIGhhdmUgc3R1YiBmb3IgUFJPR01BTi5FWEUgLi4uCiAjCiAKLSAgMSBwYXNjYWwgICBSZWdPcGVuS2V5KHdvcmQgcHRyIHB0cikgUmVnT3BlbktleQotICAyIHBhc2NhbCAgIFJlZ0NyZWF0ZUtleSh3b3JkIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleQotICAzIHBhc2NhbCAgIFJlZ0Nsb3NlS2V5KHdvcmQpIFJlZ0Nsb3NlS2V5Ci0gIDQgcGFzY2FsICAgUmVnRGVsZXRlS2V5KHdvcmQgcHRyKSBSZWdEZWxldGVLZXkKLSAgNSBwYXNjYWwgICBSZWdTZXRWYWx1ZSh3b3JkIHB0ciBsb25nIHB0ciBsb25nKSBSZWdTZXRWYWx1ZQotICA2IHBhc2NhbCAgIFJlZ1F1ZXJ5VmFsdWUod29yZCBwdHIgcHRyIHB0cikgUmVnUXVlcnlWYWx1ZQotICA3IHBhc2NhbCAgIFJlZ0VudW1LZXkod29yZCBsb25nIHB0ciBsb25nKSBSZWdFbnVtS2V5CisgIDEgcGFzY2FsICAgUmVnT3BlbktleShsb25nIHB0ciBwdHIpIFJlZ09wZW5LZXkKKyAgMiBwYXNjYWwgICBSZWdDcmVhdGVLZXkobG9uZyBwdHIgcHRyKSBSZWdDcmVhdGVLZXkKKyAgMyBwYXNjYWwgICBSZWdDbG9zZUtleShsb25nKSBSZWdDbG9zZUtleQorICA0IHBhc2NhbCAgIFJlZ0RlbGV0ZUtleShsb25nIHB0cikgUmVnRGVsZXRlS2V5CisgIDUgcGFzY2FsICAgUmVnU2V0VmFsdWUobG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWUKKyAgNiBwYXNjYWwgICBSZWdRdWVyeVZhbHVlKGxvbmcgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWUKKyAgNyBwYXNjYWwgICBSZWdFbnVtS2V5KGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnRW51bUtleQogICA5IHBhc2NhbDE2IERyYWdBY2NlcHRGaWxlcyh3b3JkIHdvcmQpIERyYWdBY2NlcHRGaWxlcwogIDExIHBhc2NhbDE2IERyYWdRdWVyeUZpbGUod29yZCBzX3dvcmQgcHRyIHNfd29yZCkgRHJhZ1F1ZXJ5RmlsZQogIDEyIHBhc2NhbDE2IERyYWdGaW5pc2god29yZCkgRHJhZ0ZpbmlzaApkaWZmIC0tZ2l0IGEvaWYxNjMyL3Rvb2xoZWxwLnNwZWMgYi9pZjE2MzIvdG9vbGhlbHAuc3BlYwppbmRleCAxZDZjMmYwLi4zYTQ1ZmRhIDEwMDY0NAotLS0gYS9pZjE2MzIvdG9vbGhlbHAuc3BlYworKysgYi9pZjE2MzIvdG9vbGhlbHAuc3BlYwpAQCAtMjYsOCArMjYsOCBAQAogNzIgcGFzY2FsMTYgTWVtTWFuSW5mbyhwdHIpIE1lbU1hbkluZm8KIDczIHN0dWIgTk9USUZZUkVHSVNURVIKIDc0IHN0dWIgTk9USUZZVU5SRUdJU1RFUgotNzUgc3R1YiBJTlRFUlJVUFRSRUdJU1RFUgotNzYgc3R1YiBJTlRFUlJVUFRVTlJFR0lTVEVSCis3NSByZXR1cm4gSU5URVJSVVBUUkVHSVNURVIgNiAwCis3NiByZXR1cm4gSU5URVJSVVBUVU5SRUdJU1RFUiAyIDAKIDc3IHN0dWIgVEVSTUlOQVRFQVBQCiA3OCBwYXNjYWwgICBNZW1vcnlSZWFkKHdvcmQgbG9uZyBwdHIgbG9uZykgTWVtb3J5UmVhZAogNzkgcGFzY2FsICAgTWVtb3J5V3JpdGUod29yZCBsb25nIHB0ciBsb25nKSBNZW1vcnlXcml0ZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYWxsYmFjay5oIGIvaW5jbHVkZS9jYWxsYmFjay5oCmluZGV4IDNhMmRiYTMuLmZhYzhjZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FsbGJhY2suaAorKysgYi9pbmNsdWRlL2NhbGxiYWNrLmgKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAoKmZ1bmMpKCBjb2RlLCB3UGFyYW0sIGxQYXJhbSApCiAjZGVmaW5lIENhbGxUaW1lRnVuY1Byb2MoIGZ1bmMsIGlkLCBtc2csIGR3VXNlciwgZHcxLCBkdzIgKSBcCiAgICAgKCpmdW5jKSggaWQsIG1zZywgZHdVc2VyLCBkdzEsIGR3MiApCi0jZGVmaW5lIENhbGxXbmRQcm9jKCBmdW5jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICkgXAorI2RlZmluZSBDYWxsV25kUHJvYyggZnVuYywgZHMsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKSBcCiAgICAgKCpmdW5jKSggaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApCiAKICNlbmRpZiAgLyogV0lORUxJQiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZWJ1Z2dlci5oIGIvaW5jbHVkZS9kZWJ1Z2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTU2MjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RlYnVnZ2VyLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIERlYnVnZ2VyIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2lmbmRlZiBERUJVR0dFUl9ICisjZGVmaW5lIERFQlVHR0VSX0gKKworI2luY2x1ZGUgImxkdC5oIgorI2luY2x1ZGUgInJlZ2lzdGVycy5oIgorI2luY2x1ZGUgIndpbmUuaCIKKworCitlbnVtIGRlYnVnX3JlZ3MKK3sKKyAgICBSRUdfRUFYLCBSRUdfRUJYLCBSRUdfRUNYLCBSRUdfRURYLCBSRUdfRVNJLAorICAgIFJFR19FREksIFJFR19FQlAsIFJFR19FRkwsIFJFR19FSVAsIFJFR19FU1AsCisgICAgUkVHX0FYLCBSRUdfQlgsIFJFR19DWCwgUkVHX0RYLCBSRUdfU0ksCisgICAgUkVHX0RJLCBSRUdfQlAsIFJFR19GTCwgUkVHX0lQLCBSRUdfU1AsCisgICAgUkVHX0NTLCBSRUdfRFMsIFJFR19FUywgUkVHX1NTCit9OworCisKK2VudW0gZXhlY19tb2RlCit7CisgICAgRVhFQ19DT05ULCAgICAgICAvKiBDb250aW51b3VzIGV4ZWN1dGlvbiAqLworICAgIEVYRUNfU1RFUF9PVkVSLCAgLyogU3RlcHBpbmcgb3ZlciBhIGNhbGwgKi8KKyAgICBFWEVDX1NURVBfSU5TVFIgIC8qIFNpbmdsZS1zdGVwcGluZyBhbiBpbnN0cnVjdGlvbiAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dDsgIC8qIGRlYnVnZ2VyL3JlZ2lzdGVycy5jICovCitleHRlcm4gdW5zaWduZWQgaW50IGRiZ19tb2RlOworCisgIC8qIGRlYnVnZ2VyL2JyZWFrLmMgKi8KK2V4dGVybiB2b2lkIERFQlVHX1NldEJyZWFrcG9pbnRzKCBCT09MIHNldCApOworZXh0ZXJuIGludCBERUJVR19GaW5kQnJlYWtwb2ludCggdW5zaWduZWQgaW50IHNlZ21lbnQsIHVuc2lnbmVkIGludCBhZGRyICk7CitleHRlcm4gdm9pZCBERUJVR19BZGRCcmVha3BvaW50KCB1bnNpZ25lZCBpbnQgc2VnbWVudCwgdW5zaWduZWQgaW50IGFkZHIgKTsKK2V4dGVybiB2b2lkIERFQlVHX0RlbEJyZWFrcG9pbnQoIGludCBudW0gKTsKK2V4dGVybiB2b2lkIERFQlVHX0VuYWJsZUJyZWFrcG9pbnQoIGludCBudW0sIEJPT0wgZW5hYmxlICk7CitleHRlcm4gdm9pZCBERUJVR19JbmZvQnJlYWtwb2ludHModm9pZCk7CitleHRlcm4gQk9PTCBERUJVR19IYW5kbGVUcmFwKCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQgKTsKK2V4dGVybiBCT09MIERFQlVHX1Nob3VsZENvbnRpbnVlKCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBleGVjX21vZGUgbW9kZSApOworZXh0ZXJuIHZvaWQgREVCVUdfUmVzdGFydEV4ZWN1dGlvbiggc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBleGVjX21vZGUgbW9kZSwgaW50IGluc3RyX2xlbiApOworCisgIC8qIGRlYnVnZ2VyL3JlZ2lzdGVycy5jICovCitleHRlcm4gdm9pZCBERUJVR19TZXRSZWdpc3RlciggZW51bSBkZWJ1Z19yZWdzIHJlZywgaW50IHZhbCApOworZXh0ZXJuIGludCBERUJVR19HZXRSZWdpc3RlciggZW51bSBkZWJ1Z19yZWdzIHJlZyApOworZXh0ZXJuIHZvaWQgREVCVUdfSW5mb1JlZ2lzdGVycyh2b2lkKTsKKworICAvKiBkZWJ1Z2dlci9zdGFjay5jICovCitleHRlcm4gdm9pZCBERUJVR19JbmZvU3RhY2sodm9pZCk7CitleHRlcm4gdm9pZCBERUJVR19CYWNrVHJhY2Uodm9pZCk7CisKKyAgLyogZGVidWdnZXIvZGJnLnkgKi8KK2V4dGVybiB2b2lkIHdpbmVfZGVidWcoIGludCBzaWduYWwsIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqIHJlZ3MgKTsKKworZXh0ZXJuIHZvaWQgcHJpbnRfYWRkcmVzcyggdW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGFkZHIsIGludCBhZGRybGVuICk7CitleHRlcm4gdW5zaWduZWQgaW50IGRiX2Rpc2FzbSggdW5zaWduZWQgaW50IHNlZ21lbnQsIHVuc2lnbmVkIGludCBsb2MgKTsKKworI2VuZGlmICAvKiBERUJVR0dFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZvbnQuaCBiL2luY2x1ZGUvZm9udC5oCmluZGV4IDNmOTBmOWEuLjZiMmY4YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZm9udC5oCisrKyBiL2luY2x1ZGUvZm9udC5oCkBAIC0yMCw2ICsyMCwyNSBAQAogICAgIExPR0ZPTlQgICAgIGxvZ2ZvbnQgV0lORV9QQUNLRUQ7CiB9IEZPTlRPQko7CiAKKy8qIG1heSBiZSBzd2l0Y2hlZC4uLiAqLworI2RlZmluZSBHR09fQklUTUFQCTB4NEY0RAorI2RlZmluZSBHR09fTkFUSVZFCTB4NEY1MAordHlwZWRlZiBzdHJ1Y3QKK3sKKwlVSU5UCWdtQmxhY2tCb3hYOworCVVJTlQJZ21CbGFja0JveFk7CisJUE9JTlQJZ21wdEdseXBoT3JpZ2luOworCWludAlnbUNlbGxJbmNYOworCWludAlnbUNlbGxJbmNZOworfSBHTFlQSE1FVFJJQ1MsKkxQR0xZUEhNRVRSSUNTOwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlEV09SRAllTTExOyAvKiBhbGwgdHlwZSBGSVhFRCBpbiBCb3JsYW5kcyBIYW5kYm9vayAqLworCURXT1JECWVNMTI7IAorCURXT1JECWVNMjE7CisJRFdPUkQJZU0yMjsKK30gTUFUMiwqTFBNQVQyOworCiAjaWZuZGVmIFdJTkVMSUIKICNwcmFnbWEgcGFjayg0KQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dkaS5oIGIvaW5jbHVkZS9nZGkuaAppbmRleCA1NjFlODgyLi4wNGEyMTg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2dkaS5oCisrKyBiL2luY2x1ZGUvZ2RpLmgKQEAgLTI0NSw3ICsyNDUsNyBAQAogCiAjaWZkZWYgV0lORUxJQgogCi0jZGVmaW5lIEdESV9IRUFQX0FMTE9DKGYsc2l6ZSkgICAgIExvY2FsQWxsb2MgKGYsc2l6ZSkKKyNkZWZpbmUgR0RJX0hFQVBfQUxMT0Moc2l6ZSkgICAgIExvY2FsQWxsb2MgKExNRU1fRklYRUQsc2l6ZSkKICNkZWZpbmUgR0RJX0hFQVBfTElOX0FERFIoaGFuZGxlKSAgTG9jYWxMb2NrIChoYW5kbGUpCiAjZGVmaW5lIEdESV9IRUFQX1NFR19BRERSKGhhbmRsZSkgIExvY2FsTG9jayAoaGFuZGxlKQogI2RlZmluZSBHRElfSEVBUF9GUkVFKGhhbmRsZSkgICAgICBMb2NhbEZyZWUgKGhhbmRsZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGR0LmggYi9pbmNsdWRlL2xkdC5oCmluZGV4IDVlZTNmYjkuLjZlN2M4NTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGR0LmgKKysrIGIvaW5jbHVkZS9sZHQuaApAQCAtNDcsMTkgKzQ3LDMzIEBACiAjZGVmaW5lIF9fQUhTSElGVCAgMwogI2RlZmluZSBfX0FISU5DUiAgICgxIDw8IF9fQUhTSElGVCkKIAorI2lmbmRlZiBXSU5FTElCCiAjZGVmaW5lIFNFTEVDVE9SX1RPX0VOVFJZKHNlbCkgICgoKGludCkoc2VsKSAmIDB4ZmZmZikgPj4gX19BSFNISUZUKQogI2RlZmluZSBFTlRSWV9UT19TRUxFQ1RPUihpKSAgICAoKGkpID8gKCgoaW50KShpKSA8PCBfX0FIU0hJRlQpIHwgNykgOiAwKQogI2RlZmluZSBJU19MRFRfRU5UUllfRlJFRShpKSAgICAoIShsZHRfY29weVsoaSldLmJhc2UgfHwgbGR0X2NvcHlbKGkpXS5saW1pdCkpCiAjZGVmaW5lIElTX1NFTEVDVE9SX0ZSRUUoc2VsKSAgIChJU19MRFRfRU5UUllfRlJFRShTRUxFQ1RPUl9UT19FTlRSWShzZWwpKSkKICNkZWZpbmUgR0VUX1NFTF9CQVNFKHNlbCkgICAgICAgKGxkdF9jb3B5W1NFTEVDVE9SX1RPX0VOVFJZKHNlbCldLmJhc2UpCiAjZGVmaW5lIEdFVF9TRUxfTElNSVQoc2VsKSAgICAgIChsZHRfY29weVtTRUxFQ1RPUl9UT19FTlRSWShzZWwpXS5saW1pdCkKKyNlbHNlCisvKiBDb21wbGFpbiBpZiB0aGVzZSBhcmUgdXNlZCBpbiBXaW5lTGliICovCisjZGVmaW5lIFNFTEVDVE9SX1RPX0VOVFJZKHNlbCkgIGVycm9yLmVycm9yCisjZGVmaW5lIEVOVFJZX1RPX1NFTEVDVE9SKGkpICAgIGVycm9yLmVycm9yCisjZGVmaW5lIElTX0xEVF9FTlRSWV9GUkVFKGkpICAgIGVycm9yLmVycm9yCisjZGVmaW5lIEdFVF9TRUxfQkFTRShzZWwpICAgICAgIGVycm9yLmVycm9yCisjZGVmaW5lIEdFVF9TRUxfTElNSVQoc2VsKSAgICAgIGVycm9yLmVycm9yCisjZW5kaWYKIAorI2lmbmRlZiBXSU5FTElCCiAgIC8qIENvbnZlcnQgYSBzZWdtZW50ZWQgcHRyICgxNjoxNikgdG8gYSBsaW5lYXIgKDMyKSBwb2ludGVyICovCiAjZGVmaW5lIFBUUl9TRUdfVE9fTElOKHB0cikgXAogICAgICAgICAgICAoKHZvaWQqKShHRVRfU0VMX0JBU0UoKGludCkocHRyKSA+PiAxNikgKyAoKGludCkocHRyKSAmIDB4ZmZmZikpKQogCiAjZGVmaW5lIFBUUl9TRUdfT0ZGX1RPX0xJTihzZWcsb2ZmKSBcCiAgICAgICAgICAgICgodm9pZCopKEdFVF9TRUxfQkFTRShzZWcpICsgKHVuc2lnbmVkIGludCkob2ZmKSkpCisjZWxzZQorI2RlZmluZSBQVFJfU0VHX1RPX0xJTihwdHIpCSgodm9pZCopKHB0cikpCisjZGVmaW5lIFBUUl9TRUdfT0ZGX1RPX0xJTihzZWcsb2ZmKQkoKHZvaWQqKShvZmYpKQorI2VuZGlmCiAKIAogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgbGR0X2ZsYWdzX2NvcHlbTERUX1NJWkVdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saXN0Ym94LmggYi9pbmNsdWRlL2xpc3Rib3guaAppbmRleCBmM2FiMjZmLi40OTFlZDIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpc3Rib3guaAorKysgYi9pbmNsdWRlL2xpc3Rib3guaApAQCAtMjgsNiArMjgsOCBAQAogCUhXTkQgICAgaFBhcmVudDsKIAlIRk9OVCAgIGhGb250OwogCUJPT0wgICAgYlJlZHJhd0ZsYWc7CisgICAgICAgIEJPT0wgICAgSGFzU3RyaW5nczsKKyAgICAgICAgQk9PTCAgICBPd25lckRyYXduOwogCVdPUkQgICAgaU51bVN0b3BzOwogCUxQSU5UICAgVGFiU3RvcHM7CiAJSEFORExFICBoRHJhd0l0ZW1TdHJ1Y3Q7CkBAIC00MSw5ICs0Myw2IEBACiAKIGV4dGVybiB2b2lkIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKExQSEVBRExJU1QgbHBobCxIV05EIGh3bmQsIFdPUkQgY29kZSk7CiAKLWV4dGVybiBCT09MIE9XTkVSX0RSQVdOKExQSEVBRExJU1QgbHBobCk7Ci1leHRlcm4gQk9PTCBIYXNTdHJpbmdzKExQSEVBRExJU1QgbHBobCk7Ci0KIGV4dGVybiBMUExJU1RTVFJVQ1QgTGlzdEJveEdldEl0ZW0oTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCk7CiBleHRlcm4gaW50IExpc3RNYXhGaXJzdFZpc2libGUoTFBIRUFETElTVCBscGhsKTsKIGV4dGVybiBpbnQgTGlzdEJveFNjcm9sbFRvRm9jdXMoTFBIRUFETElTVCBscGhsKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXNkb3MuaCBiL2luY2x1ZGUvbXNkb3MuaAppbmRleCBjNTM5MmFhLi4xYTk0YmNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21zZG9zLmgKKysrIGIvaW5jbHVkZS9tc2Rvcy5oCkBAIC0xNSw2ICsxNSw3IEBACiAJY2hhciBzZWFyY2hfYXR0cmlidXRlOwogCWxvbmcgZmlsZXNpemU7CiAJbG9uZyBmaWxldGltZTsKKyAgICAgICAgaW50IHRlbGxkaXJudW07CiAgICAgICAgIHNob3J0IGVudG51bTsgICAgICAgICAgIC8qIERpcmVjdG9yeSBlbnRyeSBudW1iZXIgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmVleGUuaCBiL2luY2x1ZGUvbmVleGUuaAppbmRleCBhZDU5NmZlLi5jMjRmMmY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25lZXhlLmgKKysrIGIvaW5jbHVkZS9uZWV4ZS5oCkBAIC0xMDIsNiArMTAyLDcgQEAKICNkZWZpbmUgTkVfU0VHRkxBR1NfREFUQQkweDAwMDEKICNkZWZpbmUgTkVfU0VHRkxBR1NfQUxMT0NBVEVECTB4MDAwMgogI2RlZmluZSBORV9TRUdGTEFHU19MT0FERUQJMHgwMDA0CisjZGVmaW5lIE5FX1NFR0ZMQUdTX0lURVJBVEVECTB4MDAwOAogI2RlZmluZSBORV9TRUdGTEFHU19NT1ZFQUJMRQkweDAwMTAKICNkZWZpbmUgTkVfU0VHRkxBR1NfU0hBUkVBQkxFCTB4MDAyMAogI2RlZmluZSBORV9TRUdGTEFHU19QUkVMT0FECTB4MDA0MApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcm90b3R5cGVzLmggYi9pbmNsdWRlL3Byb3RvdHlwZXMuaAppbmRleCBiMjI4OGM2Li41YzhkNjRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Byb3RvdHlwZXMuaAorKysgYi9pbmNsdWRlL3Byb3RvdHlwZXMuaApAQCAtMjAsNyArMjAsNiBAQAogLyogbG9hZGVyL3NpZ25hbC5jICovCiAKIGV4dGVybiB2b2lkIGluaXRfd2luZV9zaWduYWxzKHZvaWQpOwotZXh0ZXJuIHZvaWQgd2luZV9kZWJ1ZyhpbnQgc2lnbmFsLCBpbnQgKiByZWdzKTsKIAogLyogbG9hZGVyL3dpbmUuYyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JlZ2lzdGVycy5oIGIvaW5jbHVkZS9yZWdpc3RlcnMuaAppbmRleCBlZDMyM2Y5Li40YWYwNGJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3JlZ2lzdGVycy5oCisrKyBiL2luY2x1ZGUvcmVnaXN0ZXJzLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNkZWZpbmUgRURYIChjb250ZXh0LT5zY19lZHgpCiAjZGVmaW5lIEVTSSAoY29udGV4dC0+c2NfZXNpKQogI2RlZmluZSBFREkgKGNvbnRleHQtPnNjX2VkaSkKKyNkZWZpbmUgRUJQIChjb250ZXh0LT5zY19lYnApCiAKICNkZWZpbmUgQVggKCooV09SRCopJmNvbnRleHQtPnNjX2VheCkKICNkZWZpbmUgQlggKCooV09SRCopJmNvbnRleHQtPnNjX2VieCkKQEAgLTIwLDYgKzIxLDcgQEAKICNkZWZpbmUgRFggKCooV09SRCopJmNvbnRleHQtPnNjX2VkeCkKICNkZWZpbmUgU0kgKCooV09SRCopJmNvbnRleHQtPnNjX2VzaSkKICNkZWZpbmUgREkgKCooV09SRCopJmNvbnRleHQtPnNjX2VkaSkKKyNkZWZpbmUgQlAgKCooV09SRCopJmNvbnRleHQtPnNjX2VicCkKIAogI2RlZmluZSBBTCAoKihCWVRFKikmY29udGV4dC0+c2NfZWF4KQogI2RlZmluZSBBSCAoKigoKEJZVEUqKSZjb250ZXh0LT5zY19lYXgpKzEpKQpAQCAtMzcsOCArMzksMTAgQEAKIAogI2lmbmRlZiBfX0ZyZWVCU0RfXwogI2RlZmluZSBFRkwgKGNvbnRleHQtPnNjX2VmbGFncykKKyNkZWZpbmUgRkwgKCooV09SRCopJmNvbnRleHQtPnNjX2VmbGFncykKICNlbHNlCiAjZGVmaW5lIEVGTCAoY29udGV4dC0+c2NfZWZsKQorI2RlZmluZSBGTCAoKihXT1JEKikmY29udGV4dC0+c2NfZWZsKQogI2VuZGlmCiAKICNkZWZpbmUgRUlQIChjb250ZXh0LT5zY19laXApCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0YWNrZnJhbWUuaCBiL2luY2x1ZGUvc3RhY2tmcmFtZS5oCmluZGV4IDMyOTVlODMuLmVlMDE5NWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3RhY2tmcmFtZS5oCisrKyBiL2luY2x1ZGUvc3RhY2tmcmFtZS5oCkBAIC01Nyw2ICs1Nyw3IEBACiBleHRlcm4gU0VHUFRSIElGMTYzMl9TdGFjazMyX2Jhc2U7CiBleHRlcm4gRFdPUkQgSUYxNjMyX09yaWdpbmFsMzJfZXNwOwogCisjaWZuZGVmIFdJTkVMSUIKICNkZWZpbmUgQ1VSUkVOVF9TVEFDSzE2IFwKICAgICAoKFNUQUNLMTZGUkFNRSAqKVBUUl9TRUdfT0ZGX1RPX0xJTihJRjE2MzJfU2F2ZWQxNl9zcyxJRjE2MzJfU2F2ZWQxNl9zcCkpCiAKQEAgLTY3LDUgKzY4LDEwIEBACiAjZGVmaW5lIE1BS0VfU0VHUFRSKHB0cikgXAogICAgICAoKFNFR1BUUilJRjE2MzJfU3RhY2szMl9iYXNlICsgXAogICAgICAgKChEV09SRCkocHRyKSAtIChEV09SRClQVFJfU0VHX1RPX0xJTihJRjE2MzJfU3RhY2szMl9iYXNlKSkpCisjZWxzZQorI2RlZmluZSBDVVJSRU5UX1NUQUNLMTYJZXJyb3IuZXJyb3IKKyNkZWZpbmUgQ1VSUkVOVF9EUwkJMAorI2RlZmluZSBNQUtFX1NFR1BUUihwdHIpCShwdHIpCisjZW5kaWYKIAogI2VuZGlmIC8qIFdJTkVfU1RBQ0tGUkFNRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzZXIuaCBiL2luY2x1ZGUvdXNlci5oCmluZGV4IGFmMGVjZGYuLmY3NDkwMDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXNlci5oCisrKyBiL2luY2x1ZGUvdXNlci5oCkBAIC0xNCw4ICsxNCw4IEBACiAKICNpZmRlZiBXSU5FTElCCiAKLSNkZWZpbmUgVVNFUl9IRUFQX0FMTE9DKGYsc2l6ZSkgTG9jYWxBbGxvYyAoZiwgc2l6ZSkKLSNkZWZpbmUgVVNFUl9IRUFQX1JFQUxMT0MoaGFuZGxlLHNpemUsZikgTG9jYWxSZUFsbG9jIChoYW5kbGUsc2l6ZSxmKQorI2RlZmluZSBVU0VSX0hFQVBfQUxMT0Moc2l6ZSkgTG9jYWxBbGxvYyAoTE1FTV9GSVhFRCwgc2l6ZSkKKyNkZWZpbmUgVVNFUl9IRUFQX1JFQUxMT0MoaGFuZGxlLHNpemUpIExvY2FsUmVBbGxvYyAoaGFuZGxlLHNpemUsTE1FTV9GSVhFRCkKICNkZWZpbmUgVVNFUl9IRUFQX0xJTl9BRERSKGhhbmRsZSkgTG9jYWxMb2NrIChoYW5kbGUpCiAjZGVmaW5lIFVTRVJfSEVBUF9TRUdfQUREUihoYW5kbGUpIExvY2FsTG9jayAoaGFuZGxlKQogI2RlZmluZSBVU0VSX0hFQVBfRlJFRShoYW5kbGUpIExvY2FsRnJlZSAoaGFuZGxlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5ubHMuaCBiL2luY2x1ZGUvd2lubmxzLmgKaW5kZXggMmU1YzY1Mi4uNzdkMzg5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5ubHMuaAorKysgYi9pbmNsdWRlL3dpbm5scy5oCkBAIC05OCwzICs5OCw3IEBACiAjZGVmaW5lIExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMgICAgICAweDAwMDAwMDU2ICAgCiAjZGVmaW5lIExPQ0FMRV9JTkVHU0VQQllTUEFDRSAgICAgICAweDAwMDAwMDU3ICAgCiAKKyNkZWZpbmUgTk9STV9JR05PUkVDQVNFCQkJCTEKKyNkZWZpbmUgTk9STV9JR05PUkVOT05TUEFDRQkJCTIKKyNkZWZpbmUgTk9STV9JR05PUkVTWU1CT0xTCQkJNAorI2RlZmluZSBOT1JNX1NUUklOR1NPUlQJCQkJMHgxMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnBvcy5oIGIvaW5jbHVkZS93aW5wb3MuaAppbmRleCAxOWNhNWM3Li40MTA1ZWI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnBvcy5oCisrKyBiL2luY2x1ZGUvd2lucG9zLmgKQEAgLTIwLDcgKzIwLDYgQEAKIH0gRFdQOwogCiAKLWV4dGVybiBIV05EIFdJTlBPU19OZXh0V2luZG93RnJvbVBvaW50KCBIV05EIGh3bmQsIFBPSU5UIHB0ICk7CiBleHRlcm4gSFdORCBXSU5QT1NfQ2hhbmdlQWN0aXZlV2luZG93KCBIV05EIGh3bmQsIEJPT0wgbW91c2VNc2cgKTsKIGV4dGVybiBMT05HIFdJTlBPU19TZW5kTkNDYWxjU2l6ZSggSFdORCBod25kLCBCT09MIGNhbGNWYWxpZFJlY3QsCiAJCQkJICAgUkVDVCAqbmV3V2luZG93UmVjdCwgUkVDVCAqb2xkV2luZG93UmVjdCwKZGlmZiAtLWdpdCBhL2xvYWRlci9tYWluLmMgYi9sb2FkZXIvbWFpbi5jCmluZGV4IGU2YWQwM2UuLjdhMmQ0MzUgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tYWluLmMKKysrIGIvbG9hZGVyL21haW4uYwpAQCAtMTEsMTMgKzExLDEzIEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZGVidWdnZXIuaCIKICNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJkbGxzLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCi0jaW5jbHVkZSAid2luZW9wdHMuaCIKLSNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJwZV9pbWFnZS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKE9wdGlvbnMuZGVidWcpIHdpbmVfZGVidWcoMCwgTlVMTCk7CisgICAgaWYgKE9wdGlvbnMuZGVidWcpIERFQlVHX1NldEJyZWFrcG9pbnRzKCBUUlVFICk7ICAvKiBTZXR1cCBicmVha3BvaW50cyAqLwogCiAgICAgWWllbGQoKTsgIC8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrICovCiAgICAgZnByaW50Ziggc3RkZXJyLCAiV2luTWFpbjogU2hvdWxkIG5ldmVyIGhhcHBlbjogcmV0dXJuZWQgZnJvbSBZaWVsZCgpXG4iICk7CmRpZmYgLS1naXQgYS9sb2FkZXIvbmVfaW1hZ2UuYyBiL2xvYWRlci9uZV9pbWFnZS5jCmluZGV4IDk4ZWM4MjIuLjJhNGU5ZWEgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZV9pbWFnZS5jCisrKyBiL2xvYWRlci9uZV9pbWFnZS5jCkBAIC01MCw2ICs1MCwxOCBAQAogICAgIHBNb2R1bGVUYWJsZSA9IE5FX01PRFVMRV9UQUJMRSggcE1vZHVsZSApOwogCiAgICAgaWYgKCFwU2VnLT5maWxlcG9zKSByZXR1cm4gVFJVRTsgIC8qIE5vIGZpbGUgaW1hZ2UsIGp1c3QgcmV0dXJuICovCisJCisJaWYgKHBTZWctPmZsYWdzICYgTkVfU0VHRkxBR1NfSVRFUkFURUQpCisJeworCQlmcHJpbnRmKHN0ZGVyciwgIlNvcnJ5LCBpdGVyYXRlZCBzZWdtZW50cyBhcmUgbm90IHN1cHBvcnRlZFxuIgorCQkJIlBsZWFzZSByZXBvcnQgdGhhdCAlKi4qcywgc2VnbWVudCAlZCBpcyBzdWNoIGEgc2VnbWVudFxuIiwKKwkJCSooKEJZVEUqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwgCisJCQkqKChCWVRFKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksIAorCQkJKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSArIDEsCisJCQlzZWdudW0KKwkJKTsKKwkJZXhpdCgxKTsKKwl9CiAKICAgICBmZCA9IE1PRFVMRV9PcGVuRmlsZSggaE1vZHVsZSApOwogICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJMb2FkaW5nIHNlZ21lbnQgJWQsIHNlbGVjdG9yPSUwNHhcbiIsCkBAIC0yNzcsNiArMjg5LDkgQEAKICAqLwogdm9pZCBORV9GaXh1cFByb2xvZ3MoIEhNT0RVTEUgaE1vZHVsZSApCiB7CisjaWZkZWYgV0lORUxJQgorCWZwcmludGYoc3RkZXJyLCJORV9GaXh1cFByb2xvZ3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIGxpYndpbmVcbiIpOworI2Vsc2UKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlOwogICAgIFdPUkQgZGdyb3VwID0gMDsKQEAgLTM1Nyw2ICszNzIsNyBAQAogICAgICAgICAgICAgcCArPSAoc2VsID09IDB4ZmYpID8gNiA6IDM7ICAKICAgICAgICAgfQogICAgIH0KKyNlbmRpZgogfQogCiAKZGlmZiAtLWdpdCBhL2xvYWRlci9yZXNvdXJjZS5jIGIvbG9hZGVyL3Jlc291cmNlLmMKaW5kZXggMmEwMDhhYi4uNGNmNDRjZiAxMDA2NDQKLS0tIGEvbG9hZGVyL3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL3Jlc291cmNlLmMKQEAgLTM0MywxNCArMzQzLDE0IEBACiAgICAgaWYgKHJzY19tZW0gPT0gKEhBTkRMRSlOVUxMKSB7CiAJcHJpbnRmKCJMb2FkSWNvbiAvIEljb24gJTA4eCBub3QgRm91bmQgIVxuIiwgKGludCkgaWNvbl9uYW1lKTsKIAlyZXR1cm4gMDsKLQl9CisgICAgfQogICAgIGxwID0gKFdPUkQgKilMb2NrUmVzb3VyY2UocnNjX21lbSk7CiAgICAgbHBpY29kZXNjID0gKElDT05ERVNDUklQICopKGxwICsgMyk7CiAgICAgaEljb24gPSBHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFLCBzaXplb2YoSUNPTkFMTE9DKSArIDEwMjQpOwogICAgIGlmIChoSWNvbiA9PSAoSElDT04pTlVMTCkgewogICAgICAgICBGcmVlUmVzb3VyY2UoIHJzY19tZW0gKTsKIAlyZXR1cm4gMDsKLQl9CisgICAgfQogICAgIGxwaWNvID0gKElDT05BTExPQyAqKUdsb2JhbExvY2soaEljb24pOwogICAgIGxwaWNvLT5kZXNjcmlwdG9yID0gKmxwaWNvZGVzYzsKICAgICB3aWR0aCA9IGxwaWNvZGVzYy0+V2lkdGg7CkBAIC0zNzMsMjAgKzM3MywxNSBAQAogICAgIGxwaWNvLT5oQml0bWFwID0gQ3JlYXRlRElCaXRtYXAoIGhkYywgJnBJbmZvLT5ibWlIZWFkZXIsIENCTV9JTklULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWJtaSArIHNpemUsIHBJbmZvLCBESUJfUkdCX0NPTE9SUyApOwogCi0gICAgaWYgKGJpaC0+YmlTaXplSW1hZ2UgPT0gMCkKKyAgICBpZiAoYmloLT5iaUNvbXByZXNzaW9uICE9IEJJX1JHQikKICAgICB7Ci0JaWYgKGJpaC0+YmlDb21wcmVzc2lvbiAhPSBCSV9SR0IpCi0gICAgICAgIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIlVua25vd24gc2l6ZSBmb3IgY29tcHJlc3NlZCBJY29uIGJpdG1hcC5cbiIpOwotICAgICAgICAgICAgRnJlZVJlc291cmNlKCByc2NfbWVtICk7Ci0JICAgIFJlbGVhc2VEQyggMCwgaGRjKTsgCi0JICAgIHJldHVybiAwOwotICAgICAgICB9Ci0JYmloLT5iaVNpemVJbWFnZSA9IChESUJfR2V0SW1hZ2VXaWR0aEJ5dGVzKGJpaC0+YmlXaWR0aCxiaWgtPmJpQml0Q291bnQpICsKLSAgICAgICAgICAgICAgICAgICAgIERJQl9HZXRJbWFnZVdpZHRoQnl0ZXMoYmloLT5iaVdpZHRoLDEpKSAqIGJpaC0+YmlIZWlnaHQvMjsKKwlmcHJpbnRmKHN0ZGVyciwiVW5rbm93biBzaXplIGZvciBjb21wcmVzc2VkIEljb24gYml0bWFwLlxuIik7CisJRnJlZVJlc291cmNlKCByc2NfbWVtICk7CisJUmVsZWFzZURDKCAwLCBoZGMpOyAKKwlyZXR1cm4gMDsKICAgICB9CiAgICAgYml0cyA9IChjaGFyICopYm1pICsgc2l6ZSArCi0gICAgICAgICAgICAgYmloLT5iaVNpemVJbWFnZSAqIGJpaC0+YmlCaXRDb3VudCAvIChiaWgtPmJpQml0Q291bnQrMSk7CisgICAgICBESUJfR2V0SW1hZ2VXaWR0aEJ5dGVzKGJpaC0+YmlXaWR0aCxiaWgtPmJpQml0Q291bnQpICogYmloLT5iaUhlaWdodDsKICAgICBiaWgtPmJpQml0Q291bnQgPSAxOwogICAgIGJpaC0+YmlDbHJVc2VkID0gYmloLT5iaUNsckltcG9ydGFudCA9IDI7CiAgICAgcmdicSA9ICZwSW5mby0+Ym1pQ29sb3JzWzBdOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3NpZ25hbC5jIGIvbG9hZGVyL3NpZ25hbC5jCmluZGV4IDM3MTA5ZWNiYS4uZTdjODM4MSAxMDA2NDQKLS0tIGEvbG9hZGVyL3NpZ25hbC5jCisrKyBiL2xvYWRlci9zaWduYWwuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPHN5c2NhbGwuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAid2luZS5oIgorI2luY2x1ZGUgImRlYnVnZ2VyLmgiCiAjaW5jbHVkZSAicHJvdG90eXBlcy5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKQEAgLTUzLDM3ICs1MywyMCBAQAogc3RhdGljIHZvaWQgd2luX2ZhdWx0KGludCBzaWduYWwsIGludCBjb2RlLCBzdHJ1Y3Qgc2lnY29udGV4dCAqY29udGV4dCkKIHsKICNlbmRpZgotCi0jaWYgIShkZWZpbmVkIChsaW51eCkgfHwgZGVmaW5lZCAoX19OZXRCU0RfXykpCi0gICAgaW50IGksICpkdW1wOwotI2VuZGlmCi0KLSAgICBpZihzaWduYWwgPT0gU0lHVFJBUCkgRUlQLS07ICAgLyogQmFjayB1cCBvdmVyIHRoZSBpbnQzIGluc3RydWN0aW9uLiAqLwotICAgIGVsc2UgaWYgKENTID09IFdJTkVfQ09ERV9TRUxFQ1RPUikKKyAgICBpZiAoc2lnbmFsICE9IFNJR1RSQVApCiAgICAgewotCWZwcmludGYoc3RkZXJyLCAiU2VnbWVudGF0aW9uIGZhdWx0IGluIFdpbmUgcHJvZ3JhbSAoJXg6JWx4KS4iCi0JCSAgICAgICAgIiAgUGxlYXNlIGRlYnVnXG4iLCBDUywgRUlQICk7CisgICAgICAgIGlmIChDUyA9PSBXSU5FX0NPREVfU0VMRUNUT1IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2VnbWVudGF0aW9uIGZhdWx0IGluIFdpbmUgcHJvZ3JhbSAoJXg6JWx4KS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGxlYXNlIGRlYnVnXG4iLCBDUywgRUlQICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoSU5TVFJfRW11bGF0ZUluc3RydWN0aW9uKCBjb250ZXh0ICkpIHJldHVybjsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIkluIHdpbl9mYXVsdCAleDolbHhcbiIsIENTLCBFSVAgKTsKICAgICB9Ci0gICAgZWxzZSBpZiAoSU5TVFJfRW11bGF0ZUluc3RydWN0aW9uKCBjb250ZXh0ICkpIHJldHVybjsKLQogICAgIFhVbmdyYWJQb2ludGVyKGRpc3BsYXksIEN1cnJlbnRUaW1lKTsKICAgICBYVW5ncmFiU2VydmVyKGRpc3BsYXkpOwogICAgIFhGbHVzaChkaXNwbGF5KTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiSW4gd2luX2ZhdWx0ICV4OiVseFxuIiwgQ1MsIEVJUCApOwotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICB3aW5lX2RlYnVnKHNpZ25hbCwgKGludCAqKWNvbnRleHQpOyAgLyogRW50ZXIgb3VyIGRlYnVnZ2VyICovCi0jZWxzZQotICAgIGZwcmludGYoc3RkZXJyLCJTdGFjazogJXg6JXhcbiIsIFNTLCBFU1AgKTsKLSAgICBkdW1wID0gKGludCopIGNvbnRleHQ7Ci0gICAgZm9yKGk9MDsgaTwyMjsgaSsrKSAKLSAgICB7Ci0JZnByaW50ZihzdGRlcnIsIiAlOC44eCIsICpkdW1wKyspOwotCWlmICgoaSAlIDgpID09IDcpCi0JICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwotICAgIH0KLSAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLSAgICBleGl0KDEpOwotI2VuZGlmCisgICAgd2luZV9kZWJ1Zyggc2lnbmFsLCBjb250ZXh0ICk7ICAvKiBFbnRlciBvdXIgZGVidWdnZXIgKi8KIH0KIAogdm9pZCBpbml0X3dpbmVfc2lnbmFscyh2b2lkKQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggOWUzOTcwMC4uMjIyYmQwMSAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC0xMCwxNCArMTAsMTUgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAiZGVidWdnZXIuaCIKICNpbmNsdWRlICJnbG9iYWwuaCIKICNpbmNsdWRlICJpbnN0YW5jZS5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJuZWV4ZS5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJ0b29saGVscC5oIgotI2luY2x1ZGUgIndpbmUuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTIyMCw2ICsyMjEsNyBAQAogICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiU3RhcnRpbmcgbWFpbiBwcm9ncmFtOiBjczppcD0lMDR4OiUwNHggZHM9JTA0eCBzczpzcD0lMDR4OiUwNHhcbiIsCiAgICAgICAgICAgICAgICAgIGNzX3JlZywgaXBfcmVnLCBkc19yZWcsCiAgICAgICAgICAgICAgICAgIElGMTYzMl9TYXZlZDE2X3NzLCBJRjE2MzJfU2F2ZWQxNl9zcCk7CisKICAgICBDYWxsVG8xNl9yZWdzXyggKEZBUlBST0MpKGNzX3JlZyA8PCAxNiB8IGlwX3JlZyksIGRzX3JlZywKICAgICAgICAgICAgICAgICAgICBwVGFzay0+aFBEQiAvKmVzKi8sIDAgLypicCovLCAwIC8qYXgqLywKICAgICAgICAgICAgICAgICAgICBwTW9kdWxlLT5zdGFja19zaXplIC8qYngqLywgcE1vZHVsZS0+aGVhcF9zaXplIC8qY3gqLywKQEAgLTM2NSw2ICszNjcsMTQgQEAKICAgICAgICAgSUYxNjMyX1NhdmVkMTZfc3AgPSBwVGFzay0+c3A7CiAgICAgfQogCisgICAgICAvKiBBZGQgYSBicmVha3BvaW50IGF0IHRoZSBzdGFydCBvZiB0aGUgdGFzayAqLworCisgICAgaWYgKE9wdGlvbnMuZGVidWcpCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJUYXNrICclcyc6ICIsIG5hbWUgKTsKKyAgICAgICAgREVCVUdfQWRkQnJlYWtwb2ludCggcFNlZ1RhYmxlW3BNb2R1bGUtPmNzLTFdLnNlbGVjdG9yLCBwTW9kdWxlLT5pcCApOworICAgIH0KKwogICAgICAgLyogQWRkIHRoZSB0YXNrIHRvIHRoZSBsaW5rZWQgbGlzdCAqLwogCiAgICAgVEFTS19MaW5rVGFzayggaFRhc2sgKTsKQEAgLTg5MSw2ICs5MDEsNyBAQAogICAgICAgICAgICAgKHBUYXNrLT5oSW5zdGFuY2UgPT0gb3duZXIpIHx8CiAgICAgICAgICAgICAocFRhc2stPmhRdWV1ZSA9PSBvd25lcikgfHwKICAgICAgICAgICAgIChwVGFzay0+aFBEQiA9PSBvd25lcikpIHJldHVybiBwVGFzay0+aE1vZHVsZTsKKyAgICAgICAgaFRhc2sgPSBwVGFzay0+aE5leHQ7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbWVtb3J5L2dsb2JhbC5jIGIvbWVtb3J5L2dsb2JhbC5jCmluZGV4IDRhNTFiNWUuLmMxZjVhYjkgMTAwNjQ0Ci0tLSBhL21lbW9yeS9nbG9iYWwuYworKysgYi9tZW1vcnkvZ2xvYmFsLmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogCiAgICAgICAvKiBEaXNjYXJkIHRoZSBibG9jayBpZiByZXF1ZXN0ZWQgKi8KIAotICAgIGlmICgoc2l6ZSA9PSAwKSAmJiAoZmxhZ3MgJiBHTUVNX01PVkVBQkxFKSkKKyAgICBpZiAoKHNpemUgPT0gMCkgJiYgKGZsYWdzICYgR01FTV9NT1ZFQUJMRSkgJiYgIShmbGFncyAmIEdNRU1fTU9ESUZZKSkKICAgICB7CiAgICAgICAgIGlmICghKHBBcmVuYS0+ZmxhZ3MgJiBHQV9NT1ZFQUJMRSkgfHwKICAgICAgICAgICAgICEocEFyZW5hLT5mbGFncyAmIEdBX0RJU0NBUkRBQkxFKSB8fApkaWZmIC0tZ2l0IGEvbWVtb3J5L2xvY2FsLmMgYi9tZW1vcnkvbG9jYWwuYwppbmRleCBmNDJiOGQzLi5hMDI2NDQ3IDEwMDY0NAotLS0gYS9tZW1vcnkvbG9jYWwuYworKysgYi9tZW1vcnkvbG9jYWwuYwpAQCAtMTE1LDEzICsxMTUsMTMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMT0NBTF9BZGRGcmVlQmxvY2sKKyAqICAgICAgICAgICBMT0NBTF9NYWtlQmxvY2tGcmVlCiAgKgogICogTWFrZSBhIGJsb2NrIGZyZWUsIGluc2VydGluZyBpdCBpbiB0aGUgZnJlZS1saXN0LgogICogJ2Jsb2NrJyBpcyB0aGUgaGFuZGxlIG9mIHRoZSBibG9jayBhcmVuYTsgJ2Jhc2VwdHInIHBvaW50cyB0bwogICogdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSBzZWdtZW50IGNvbnRhaW5pbmcgdGhlIGhlYXAuCiAgKi8KLXN0YXRpYyB2b2lkIExPQ0FMX0FkZEZyZWVCbG9jayggY2hhciAqYmFzZXB0ciwgV09SRCBibG9jayApCitzdGF0aWMgdm9pZCBMT0NBTF9NYWtlQmxvY2tGcmVlKCBjaGFyICpiYXNlcHRyLCBXT1JEIGJsb2NrICkKIHsKICAgICBMT0NBTEFSRU5BICpwQXJlbmEsICpwTmV4dDsKICAgICBXT1JEIG5leHQ7CkBAIC0zMDgsNyArMzA4LDYgQEAKICAgICAgIGlmIChkZWJ1Z2dpbmdfbG9jYWwpIExPQ0FMX1ByaW50SGVhcChzZWxlY3Rvcik7CiAgICAgfQogCi0jaWYgMQogICAgIGlmIChzdGFydCA9PSAwKSB7CiAgICAgICAvKiBDaGVjayBpZiB0aGUgc2VnbWVudCBpcyB0aGUgREdST1VQIG9mIGEgbW9kdWxlICovCiAKQEAgLTMxNiw2ICszMTUsMTAgQEAKIAl7CiAJICAgIFNFR1RBQkxFRU5UUlkgKnBTZWcgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKSArIHBNb2R1bGUtPmRncm91cCAtIDE7CiAJICAgIGlmIChwTW9kdWxlLT5kZ3JvdXAgJiYgKHBTZWctPnNlbGVjdG9yID09IHNlbGVjdG9yKSkgeworCQkvKiBXZSBjYW4ndCBqdXN0IHVzZSB0aGUgc2ltcGxlIG1ldGhvZCBvZiB1c2luZyB0aGUgdmFsdWUKKyAgICAgICAgICAgICAgICAgKiBvZiBtaW5zaXplICsgc3RhY2tzaXplLCBzaW5jZSB0aGVyZSBhcmUgcHJvZ3JhbXMgdGhhdAorICAgICAgICAgICAgICAgICAqIHJlc2l6ZSB0aGUgZGF0YSBzZWdtZW50IGJlZm9yZSBjYWxsaW5nIEluaXRUYXNrKCkuIFNvLAorICAgICAgICAgICAgICAgICAqIHdlIG11c3QgcHV0IGl0IGF0IHRoZSBlbmQgb2YgdGhlIHNlZ21lbnQgKi8KIAkJc3RhcnQgPSBHbG9iYWxTaXplKCBHbG9iYWxIYW5kbGUoIHNlbGVjdG9yICkgKTsKIAkJc3RhcnQgLT0gZW5kOwogCQllbmQgKz0gc3RhcnQ7CkBAIC0zMjMsNyArMzI2LDYgQEAKIAkgICAgfQogCX0KICAgICB9Ci0jZW5kaWYKICAgICBwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIHNlbGVjdG9yLCAwICk7CiAKICAgICBzdGFydCA9IExBTElHTiggbWF4KCBzdGFydCwgc2l6ZW9mKElOU1RBTkNFREFUQSkgKSApOwpAQCAtNDg5LDkgKzQ5MSwxMCBAQAogCiAgICAgYXJlbmEgPSBwSW5mby0+Zmlyc3Q7CiAgICAgcEFyZW5hID0gQVJFTkFfUFRSKCBwdHIsIGFyZW5hICk7Ci0gICAgd2hpbGUgKGFyZW5hICE9IHBBcmVuYS0+ZnJlZV9uZXh0KSB7CisgICAgZm9yICg7OykgewogICAgICAgICBhcmVuYSA9IHBBcmVuYS0+ZnJlZV9uZXh0OwogICAgICAgICBwQXJlbmEgPSBBUkVOQV9QVFIoIHB0ciwgYXJlbmEgKTsKKwlpZiAoYXJlbmEgPT0gcEFyZW5hLT5mcmVlX25leHQpIGJyZWFrOwogICAgICAgICBpZiAocEFyZW5hLT5zaXplID49IHNpemUpIHJldHVybiBhcmVuYTsKICAgICB9CiAgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxfRmluZEZyZWVCbG9jazogbm90IGVub3VnaCBzcGFjZVxuIiApOwpAQCAtNTM5LDEzICs1NDIsMTQgQEAKIAlyZXR1cm4gMDsKICAgICB9CiAKLSAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMT0NBTF9HZXRCbG9jayBzaXplID0gJTA0eFxuIiwgc2l6ZSApOwogICAgICAgLyogTWFrZSBhIGJsb2NrIG91dCBvZiB0aGUgZnJlZSBhcmVuYSAqLwogICAgIHBBcmVuYSA9IEFSRU5BX1BUUiggcHRyLCBhcmVuYSApOworICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxPQ0FMX0dldEJsb2NrIHNpemUgPSAlMDR4LCBhcmVuYSBhdCAlMDR4IHNpemUgJTA0eFxuIiwgc2l6ZSwKKwkJICAgYXJlbmEsIHBBcmVuYS0+c2l6ZSApOwogICAgIGlmIChwQXJlbmEtPnNpemUgPiBzaXplICsgTEFMSUdOKHNpemVvZihMT0NBTEFSRU5BKSkpCiAgICAgewogICAgICAgICBMT0NBTF9BZGRCbG9jayggcHRyLCBhcmVuYSwgYXJlbmErc2l6ZSApOwotICAgICAgICBMT0NBTF9BZGRGcmVlQmxvY2soIHB0ciwgYXJlbmErc2l6ZSApOworICAgICAgICBMT0NBTF9NYWtlQmxvY2tGcmVlKCBwdHIsIGFyZW5hK3NpemUgKTsKICAgICAgICAgcEluZm8tPml0ZW1zKys7CiAgICAgfQogICAgIExPQ0FMX1JlbW92ZUZyZWVCbG9jayggcHRyLCBhcmVuYSApOwpAQCAtNjE4LDcgKzYyMiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMT0NBTF9GcmVlQXJlbmEKICAqLwotSExPQ0FMIExPQ0FMX0ZyZWVBcmVuYSggV09SRCBkcywgV09SRCBhcmVuYSApCitzdGF0aWMgSExPQ0FMIExPQ0FMX0ZyZWVBcmVuYSggV09SRCBkcywgV09SRCBhcmVuYSApCiB7CiAgICAgY2hhciAqcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKCBkcywgMCApOwogICAgIExPQ0FMSEVBUElORk8gKnBJbmZvOwpAQCAtNjQ4LDcgKzY1Miw3IEBACiAgICAgfQogICAgIGVsc2UgIC8qIE1ha2UgYSBuZXcgZnJlZSBibG9jayAqLwogICAgIHsKLSAgICAgICAgTE9DQUxfQWRkRnJlZUJsb2NrKCBwdHIsIGFyZW5hICk7CisgICAgICAgIExPQ0FMX01ha2VCbG9ja0ZyZWUoIHB0ciwgYXJlbmEgKTsKICAgICB9CiAKICAgICAgIC8qIENoZWNrIGlmIHdlIGNhbiBtZXJnZSB3aXRoIHRoZSBuZXh0IGJsb2NrICovCkBAIC03NjksNyArNzczLDcgQEAKIAkgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAic2l6ZSByZWR1Y3Rpb24sIG1ha2luZyBuZXcgZnJlZSBibG9ja1xuIik7CiAgICAgICAgICAgICAgIC8qIEl0IGlzIHdvcnRoIG1ha2luZyBhIG5ldyBmcmVlIGJsb2NrICovCiAgICAgICAgICAgICBMT0NBTF9BZGRCbG9jayggcHRyLCBhcmVuYSwgbmV4dGFyZW5hICk7Ci0gICAgICAgICAgICBMT0NBTF9BZGRGcmVlQmxvY2soIHB0ciwgbmV4dGFyZW5hICk7CisgICAgICAgICAgICBMT0NBTF9NYWtlQmxvY2tGcmVlKCBwdHIsIG5leHRhcmVuYSApOwogICAgICAgICAgICAgcEluZm8tPml0ZW1zKys7CiAgICAgICAgIH0KICAgICAgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxSZUFsbG9jOiByZXR1cm5pbmcgJTA0eFxuIiwgaGFuZGxlICk7CkBAIC03ODgsNyArNzkyLDcgQEAKIAkgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAic2l6ZSBpbmNyZWFzZSwgbWFraW5nIG5ldyBmcmVlIGJsb2NrXG4iKTsKICAgICAgICAgICAgICAgLyogSXQgaXMgd29ydGggbWFraW5nIGEgbmV3IGZyZWUgYmxvY2sgKi8KICAgICAgICAgICAgIExPQ0FMX0FkZEJsb2NrKCBwdHIsIGFyZW5hLCBuZXh0YXJlbmEgKTsKLSAgICAgICAgICAgIExPQ0FMX0FkZEZyZWVCbG9jayggcHRyLCBuZXh0YXJlbmEgKTsKKyAgICAgICAgICAgIExPQ0FMX01ha2VCbG9ja0ZyZWUoIHB0ciwgbmV4dGFyZW5hICk7CiAgICAgICAgICAgICBwSW5mby0+aXRlbXMrKzsKICAgICAgICAgfQogICAgICAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbFJlQWxsb2M6IHJldHVybmluZyAlMDR4XG4iLCBoYW5kbGUgKTsKZGlmZiAtLWdpdCBhL21pc2MvSW1ha2VmaWxlIGIvbWlzYy9JbWFrZWZpbGUKaW5kZXggYmJmOWIzMi4uOWU1MjYwOCAxMDA2NDQKLS0tIGEvbWlzYy9JbWFrZWZpbGUKKysrIGIvbWlzYy9JbWFrZWZpbGUKQEAgLTE4LDYgKzE4LDcgQEAKIAlsc3RyLmMgXAogCW1haW4uYyBcCiAJb2xlMi5jIFwKKwlvbGUyZGlzcC5jIFwKIAlvbGUybmxzLmMgXAogCW9sZWNsaS5jIFwKIAlvbGVzdnIuYyBcCmRpZmYgLS1naXQgYS9taXNjL2F0b20uYyBiL21pc2MvYXRvbS5jCmluZGV4IGYyMmQ5OWUuLmEzNGUwNjIgMTAwNjQ0Ci0tLSBhL21pc2MvYXRvbS5jCisrKyBiL21pc2MvYXRvbS5jCkBAIC00NSw3ICs0NSwxMCBAQAogCiAjZGVmaW5lIEdFVF9BVE9NX1RBQkxFKHNlbCkgICgoQVRPTVRBQkxFKilQVFJfU0VHX09GRl9UT19MSU4oc2VsLCBcCiAgICAgICAgICAgKChJTlNUQU5DRURBVEEqKVBUUl9TRUdfT0ZGX1RPX0xJTihzZWwsMCkpLT5hdG9tdGFibGUpKQotCisJCQorI2lmZGVmIFdJTkVMSUIKKyNkZWZpbmUgVVNFUl9IZWFwU2VsCTAKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBBVE9NX0luaXRUYWJsZQpkaWZmIC0tZ2l0IGEvbWlzYy9jb21tZGxnLmMgYi9taXNjL2NvbW1kbGcuYwppbmRleCAyMzgzMjI5Li5mNjYwNjc0IDEwMDY0NAotLS0gYS9taXNjL2NvbW1kbGcuYworKysgYi9taXNjL2NvbW1kbGcuYwpAQCAtNjQsMzggKzY0LDQ1IEBACiAgIEJPT0wgCSAgICBiUmV0OwogICBMUENTVFIgICAgZGxnVGVtcGxhdGU7CiAgIAotICBpZiAoIUZpbGVEbGdfSW5pdCgpKSByZXR1cm4gRkFMU0U7Ci0gICAgCi0gIGlmIChscG9mbiA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0gIGlmIChscG9mbi0+RmxhZ3MgJiBPRk5fRU5BQkxFVEVNUExBVEVIQU5ETEUpIHsKLSAgICBkbGdUZW1wbGF0ZSA9IEdsb2JhbExvY2sobHBvZm4tPmhJbnN0YW5jZSk7Ci0gICAgaWYgKCFkbGdUZW1wbGF0ZSkgewotICAgICAgQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0xPQURSRVNGQUlMVVJFOwotICAgICAgcmV0dXJuIEZBTFNFOworICBpZiAobHBvZm4gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghRmlsZURsZ19Jbml0KCkpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAobHBvZm4tPkZsYWdzICYgT0ZOX0VOQUJMRVRFTVBMQVRFSEFORExFKQorICAgIHsKKyAgICAgIGRsZ1RlbXBsYXRlID0gR2xvYmFsTG9jayhscG9mbi0+aEluc3RhbmNlKTsKKyAgICAgIGlmICghZGxnVGVtcGxhdGUpCisJeworCSAgQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0xPQURSRVNGQUlMVVJFOworCSAgcmV0dXJuIEZBTFNFOworCX0KICAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9FTkFCTEVURU1QTEFURSkgewotICAgICAgaEluc3QgPSBscG9mbi0+aEluc3RhbmNlOwotICAgICAgaFJlc0luZm8gPSBGaW5kUmVzb3VyY2UoaEluc3QsIGxwb2ZuLT5scFRlbXBsYXRlTmFtZSwgUlRfRElBTE9HKTsKLSAgICAgIGlmIChoUmVzSW5mbyA9PSAwKSB7Ci0JQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0ZJTkRSRVNGQUlMVVJFOwotCXJldHVybiBGQUxTRTsKLSAgICAgIH0KLSAgICAgIGhEbGdUbXBsID0gTG9hZFJlc291cmNlKGhJbnN0LCBoUmVzSW5mbyk7Ci0gICAgICBpZiAoaERsZ1RtcGwgPT0gMCkgewotCUNvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9MT0FEUkVTRkFJTFVSRTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB9Ci0gICAgICBkbGdUZW1wbGF0ZSA9IEdsb2JhbExvY2soaERsZ1RtcGwpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkbGdUZW1wbGF0ZSA9IHN5c3Jlc19ESUFMT0dfMzsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChscG9mbi0+RmxhZ3MgJiBPRk5fRU5BQkxFVEVNUExBVEUpCisJeworCSAgaEluc3QgPSBscG9mbi0+aEluc3RhbmNlOworCSAgaFJlc0luZm8gPSBGaW5kUmVzb3VyY2UoaEluc3QsIGxwb2ZuLT5scFRlbXBsYXRlTmFtZSwgUlRfRElBTE9HKTsKKwkgIGlmIChoUmVzSW5mbyA9PSAwKQorCSAgICB7CisJICAgICAgQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0ZJTkRSRVNGQUlMVVJFOworCSAgICAgIHJldHVybiBGQUxTRTsKKwkgICAgfQorCSAgaERsZ1RtcGwgPSBMb2FkUmVzb3VyY2UoaEluc3QsIGhSZXNJbmZvKTsKKwkgIGlmIChoRGxnVG1wbCA9PSAwKQorCSAgICB7CisJICAgICAgQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0xPQURSRVNGQUlMVVJFOworCSAgICAgIHJldHVybiBGQUxTRTsKKwkgICAgfQorCSAgZGxnVGVtcGxhdGUgPSBHbG9iYWxMb2NrKGhEbGdUbXBsKTsKKwl9CisgICAgICBlbHNlCisJZGxnVGVtcGxhdGUgPSBzeXNyZXNfRElBTE9HXzM7CiAgICAgfQotICB9CiAgIGhJbnN0ID0gR2V0V2luZG93V29yZChscG9mbi0+aHduZE93bmVyLCBHV1dfSElOU1RBTkNFKTsKICAgYlJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW1QdHIoaEluc3QsIGRsZ1RlbXBsYXRlLCBscG9mbi0+aHduZE93bmVyLAogCQkJCSAgIEdldFduZFByb2NFbnRyeTE2KCJGaWxlT3BlbkRsZ1Byb2MiKSwKIAkJCQkgICAoRFdPUkQpbHBvZm4pOwotICAKICAgcHJpbnRmKCJHZXRPcGVuRmlsZU5hbWUgLy8gcmV0dXJuIGxwc3RyRmlsZT0nJXMnICFcbiIsIAogCSAoTFBTVFIpUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyRmlsZSkpOwogICByZXR1cm4gYlJldDsKQEAgLTE4NywyMSArMTk0LDI4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQlGSUxFRExHX0dldEZpbGVUeXBlCQlbaW50ZXJuYWxdCiAgKi8KLXN0YXRpYyBMUFNUUiBGSUxFRExHX0dldEZpbGVUeXBlKExQU1RSIHB0ciwgV09SRCBpbmRleCkKKworc3RhdGljIExQU1RSIEZJTEVETEdfR2V0RmlsZVR5cGUoTFBTVFIgY2ZwdHIsIExQU1RSIGZwdHIsIFdPUkQgaW5kZXgpCiB7Ci0gICAgaW50IG4sIGk7Ci0gICAgCi0gICAgaWYJKHB0ciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgICAKLSAgICBmb3IgKGkgPSAxOztpKyspIHsKLQluID0gc3RybGVuKHB0cik7Ci0JaWYgKG4gPT0gMCkgYnJlYWs7Ci0JcHRyICs9IG4gKyAxOwotCWlmIChpID09IGluZGV4KSByZXR1cm4gcHRyOwotCW4gPSBzdHJsZW4ocHRyKTsKLQlwdHIgKz0gbiArIDE7CisgIGludCBuLCBpOworICBpID0gMDsKKyAgaWYgKGNmcHRyKQorICAgIGZvciAoIDsobiA9IHN0cmxlbihjZnB0cikpICE9IDA7IGkrKykgCisgICAgICB7CisJY2ZwdHIgKz0gbiArIDE7CisJaWYgKGkgPT0gaW5kZXgpCisJICByZXR1cm4gY2ZwdHI7CisJY2ZwdHIgKz0gc3RybGVuKGNmcHRyKSArIDE7CisgICAgICB9CisgIGlmIChmcHRyKQorICAgIGZvciAoIDsobiA9IHN0cmxlbihmcHRyKSkgIT0gMDsgaSsrKSAKKyAgICAgIHsKKwlmcHRyICs9IG4gKyAxOworCWlmIChpID09IGluZGV4KQorCSAgcmV0dXJuIGZwdHI7CisJZnB0ciArPSBzdHJsZW4oZnB0cikgKyAxOwogICAgIH0KLSAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzAxLDE5ICszMTUsMzMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFRExHX1dNSW5pdERpYWxvZyAgICAgICAgICAgIFtpbnRlcm5hbF0KICAqLworCiBzdGF0aWMgTE9ORyBGSUxFRExHX1dNSW5pdERpYWxvZyhIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkgCiB7Ci0gICAgaW50IG47Ci0gICAgTFBPUEVORklMRU5BTUUgbHBvZm47Ci0gICAgY2hhciB0bXBzdHJbNTEyXTsKLSAgICBMUFNUUiBwc3RyOwotICAgIAotICAgIFNldFdpbmRvd0xvbmcoaFduZCwgRFdMX1VTRVIsIGxQYXJhbSk7Ci0gICAgbHBvZm4gPSAoTFBPUEVORklMRU5BTUUpbFBhcmFtOwotICAgIAotICAgIC8qIHJlYWQgZmlsdGVyIGluZm9ybWF0aW9uICovCi0gICAgcHN0ciA9IChMUFNUUilQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWx0ZXIpOwotICAgIHdoaWxlKCpwc3RyKSB7CisgIGludCBuOworICBMUE9QRU5GSUxFTkFNRSBscG9mbjsKKyAgY2hhciB0bXBzdHJbNTEyXTsKKyAgTFBTVFIgcHN0cjsKKyAgU2V0V2luZG93TG9uZyhoV25kLCBEV0xfVVNFUiwgbFBhcmFtKTsKKyAgbHBvZm4gPSAoTFBPUEVORklMRU5BTUUpbFBhcmFtOworICAvKiByZWFkIGN1c3RvbSBmaWx0ZXIgaW5mb3JtYXRpb24gKi8KKyAgaWYgKGxwb2ZuLT5scHN0ckN1c3RvbUZpbHRlcikKKyAgICB7CisgICAgICBwc3RyID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckN1c3RvbUZpbHRlcik7CisgICAgICB3aGlsZSgqcHN0cikKKwl7CisJICBuID0gc3RybGVuKHBzdHIpOworCSAgc3RyY3B5KHRtcHN0ciwgcHN0cik7CisJICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgY21iMSwgQ0JfQUREU1RSSU5HLCAwLCBNQUtFX1NFR1BUUih0bXBzdHIpKTsKKwkgIHBzdHIgKz0gbiArIDE7CisJICBuID0gc3RybGVuKHBzdHIpOworCSAgcHN0ciArPSBuICsgMTsKKwl9CisgICAgfQorICAvKiByZWFkIGZpbHRlciBpbmZvcm1hdGlvbiAqLworICBwc3RyID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbHRlcik7CisgIHdoaWxlKCpwc3RyKQorICAgIHsKICAgICAgIG4gPSBzdHJsZW4ocHN0cik7CiAgICAgICBzdHJjcHkodG1wc3RyLCBwc3RyKTsKICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBjbWIxLCBDQl9BRERTVFJJTkcsIDAsIE1BS0VfU0VHUFRSKHRtcHN0cikpOwpAQCAtMzIxLDQ0ICszNDksMzQgQEAKICAgICAgIG4gPSBzdHJsZW4ocHN0cik7CiAgICAgICBwc3RyICs9IG4gKyAxOwogICAgIH0KLSAgICAgIAotICAgIC8qIHNldCBkZWZhdWx0IGZpbHRlciAqLwotICAgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBjbWIxLCBDQl9TRVRDVVJTRUwsCi0JCSAgICAgICBscG9mbi0+bkZpbHRlckluZGV4IC0gMSwgMCk7Ci0gICAgc3RyY3B5KHRtcHN0ciwgRklMRURMR19HZXRGaWxlVHlwZShQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWx0ZXIpLCAKLQkJCQkgICAgICAgbHBvZm4tPm5GaWx0ZXJJbmRleCkpOwotICAgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBlZHQxLCBXTV9TRVRURVhULCAwLCBNQUtFX1NFR1BUUih0bXBzdHIpKTsKLSAgICAgIAotICAgIC8qIGdldCBkcml2ZSBsaXN0ICovCi0gICAgc3RyY3B5KHRtcHN0ciwiIik7Ci0gICAgRGxnRGlyTGlzdENvbWJvQm94KGhXbmQsIE1BS0VfU0VHUFRSKHRtcHN0ciksIGNtYjIsIDAsIDB4QzAwMCk7Ci0KLSAgICAvKiByZWFkIGluaXRpYWwgZGlyZWN0b3J5ICovCi0gICAgaWYgKFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckluaXRpYWxEaXIpICE9IE5VTEwpIHsKLQlzdHJjcHkodG1wc3RyLCBQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJJbml0aWFsRGlyKSk7Ci0JaWYgKHN0cmxlbih0bXBzdHIpID4gMCAmJiB0bXBzdHJbc3RybGVuKHRtcHN0ciktMV0gIT0gJ1xcJyAKLQkgICAgJiYgdG1wc3RyW3N0cmxlbih0bXBzdHIpLTFdICE9ICc6JykKLQl7Ci0JICAgIHN0cmNhdCh0bXBzdHIsIlxcIik7Ci0JfQotICAgIH0gZWxzZSB7Ci0Jc3RyY3B5KHRtcHN0ciwiIik7CisgIC8qIHNldCBkZWZhdWx0IGZpbHRlciAqLworICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgY21iMSwgQ0JfU0VUQ1VSU0VMLCAwLCAwKTsgICAgCisgIHN0cmNweSh0bXBzdHIsIEZJTEVETEdfR2V0RmlsZVR5cGUoUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyQ3VzdG9tRmlsdGVyKSwKKwkJCQkgICAgIFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbHRlciksIDApKTsKKyAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGVkdDEsIFdNX1NFVFRFWFQsIDAsIE1BS0VfU0VHUFRSKHRtcHN0cikpOworICAvKiBnZXQgZHJpdmUgbGlzdCAqLworICAqdG1wc3RyID0gMDsKKyAgRGxnRGlyTGlzdENvbWJvQm94KGhXbmQsIE1BS0VfU0VHUFRSKHRtcHN0ciksIGNtYjIsIDAsIDB4QzAwMCk7CisgIC8qIHJlYWQgaW5pdGlhbCBkaXJlY3RvcnkgKi8KKyAgaWYgKFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckluaXRpYWxEaXIpICE9IE5VTEwpIAorICAgIHsKKyAgICAgIHN0cmNweSh0bXBzdHIsIFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckluaXRpYWxEaXIpKTsKKyAgICAgIGlmIChzdHJsZW4odG1wc3RyKSA+IDAgJiYgdG1wc3RyW3N0cmxlbih0bXBzdHIpLTFdICE9ICdcXCcgCisJICAmJiB0bXBzdHJbc3RybGVuKHRtcHN0ciktMV0gIT0gJzonKQorCXN0cmNhdCh0bXBzdHIsIlxcIik7CiAgICAgfQotICAgIGlmICghRklMRURMR19TY2FuRGlyKGhXbmQsIHRtcHN0cikpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkZpbGVEbGc6IGNvdWxkbid0IHJlYWQgaW5pdGlhbCBkaXJlY3RvcnkhXG4iKTsKLSAgICB9IAotCi0gICAgLyogc2VsZWN0IGN1cnJlbnQgZHJpdmUgaW4gY29tYm8gMiAqLwotICAgIG4gPSBET1NfR2V0RGVmYXVsdERyaXZlKCk7Ci0gICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGNtYjIsIENCX1NFVENVUlNFTCwgbiwgMCk7Ci0gICAgCi0gICAgaWYgKCEobHBvZm4tPkZsYWdzICYgT0ZOX1NIT1dIRUxQKSkgewotICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhXbmQsIHBzaEhlbHApLCBTV19ISURFKTsKLSAgICB9Ci0gICAgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9ISURFUkVBRE9OTFkpIHsKLSAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShoV25kLCBjaHgxKSwgU1dfSElERSk7IAotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgICp0bXBzdHIgPSAwOworICBpZiAoIUZJTEVETEdfU2NhbkRpcihoV25kLCB0bXBzdHIpKQorICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZURsZzogY291bGRuJ3QgcmVhZCBpbml0aWFsIGRpcmVjdG9yeSFcbiIpOworICAvKiBzZWxlY3QgY3VycmVudCBkcml2ZSBpbiBjb21ibyAyICovCisgIG4gPSBET1NfR2V0RGVmYXVsdERyaXZlKCk7CisgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBjbWIyLCBDQl9TRVRDVVJTRUwsIG4gLSAxLCAwKTsKKyAgaWYgKCEobHBvZm4tPkZsYWdzICYgT0ZOX1NIT1dIRUxQKSkKKyAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaFduZCwgcHNoSGVscCksIFNXX0hJREUpOworICBpZiAobHBvZm4tPkZsYWdzICYgT0ZOX0hJREVSRUFET05MWSkKKyAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaFduZCwgY2h4MSksIFNXX0hJREUpOyAKKyAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzY2LDE2NyArMzg0LDE4MyBAQAogICovCiBzdGF0aWMgTE9ORyBGSUxFRExHX1dNQ29tbWFuZChIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkgCiB7Ci0gICAgTE9ORyBsUmV0OwotICAgIExQT1BFTkZJTEVOQU1FIGxwb2ZuOwotICAgIGNoYXIgdG1wc3RyWzUxMl0sIHRtcHN0cjJbNTEyXTsKLSAgICBMUFNUUiBwc3RyLCBwc3RyMjsKKyAgTE9ORyBsUmV0OworICBMUE9QRU5GSUxFTkFNRSBscG9mbjsKKyAgY2hhciB0bXBzdHJbNTEyXSwgdG1wc3RyMls1MTJdOworICBMUFNUUiBwc3RyLCBwc3RyMjsKICAgICAKLSAgICBscG9mbiA9IChMUE9QRU5GSUxFTkFNRSlHZXRXaW5kb3dMb25nKGhXbmQsIERXTF9VU0VSKTsKLSAgICBzd2l0Y2ggKHdQYXJhbSkgewotICAgICBjYXNlIGxzdDE6Ci0JRklMRURMR19TdHJpcEVkaXRDb250cm9sKGhXbmQpOwotCWlmIChISVdPUkQobFBhcmFtKSA9PSBMQk5fREJMQ0xLKSB7Ci0JICAgIGxSZXQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgbHN0MSwgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKLQkgICAgaWYgKGxSZXQgPT0gTEJfRVJSKSByZXR1cm4gVFJVRTsKLQkgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGxzdDEsIExCX0dFVFRFWFQsIGxSZXQsIE1BS0VfU0VHUFRSKHRtcHN0cikpOwotCSAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgZWR0MSwgV01fU0VUVEVYVCwgMCwgTUFLRV9TRUdQVFIodG1wc3RyKSk7Ci0JICAgIHJldHVybiBTZW5kTWVzc2FnZShoV25kLCBXTV9DT01NQU5ELCBJRE9LLCAwKTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci0gICAgIGNhc2UgbHN0MjoKLQlGSUxFRExHX1N0cmlwRWRpdENvbnRyb2woaFduZCk7Ci0JaWYgKEhJV09SRChsUGFyYW0pID09IExCTl9EQkxDTEspIHsKLQkgICAgbFJldCA9IFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBsc3QyLCBMQl9HRVRDVVJTRUwsIDAsIDApOwotCSAgICBpZiAobFJldCA9PSBMQl9FUlIpIHJldHVybiBUUlVFOwotCSAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgbHN0MiwgTEJfR0VUVEVYVCwgbFJldCwgTUFLRV9TRUdQVFIodG1wc3RyKSk7Ci0JICAgIAotCSAgICBpZiAodG1wc3RyWzBdID09ICdbJykgewotCQl0bXBzdHJbc3RybGVuKHRtcHN0cikgLSAxXSA9IDA7Ci0JCXN0cmNweSh0bXBzdHIsdG1wc3RyKzEpOworICBscG9mbiA9IChMUE9QRU5GSUxFTkFNRSlHZXRXaW5kb3dMb25nKGhXbmQsIERXTF9VU0VSKTsKKyAgc3dpdGNoICh3UGFyYW0pCisgICAgeworICAgIGNhc2UgbHN0MTogLyogZmlsZSBsaXN0ICovCisgICAgICBGSUxFRExHX1N0cmlwRWRpdENvbnRyb2woaFduZCk7CisgICAgICBpZiAoSElXT1JEKGxQYXJhbSkgPT0gTEJOX0RCTENMSykKKwlnb3RvIGFsbW9zdF9vazsKKyAgICAgIGxSZXQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgbHN0MSwgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKKyAgICAgIGlmIChsUmV0ID09IExCX0VSUikgcmV0dXJuIFRSVUU7CisgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgbHN0MSwgTEJfR0VUVEVYVCwgbFJldCwKKwkJCSBNQUtFX1NFR1BUUih0bXBzdHIpKTsKKyAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBlZHQxLCBXTV9TRVRURVhULCAwLCBNQUtFX1NFR1BUUih0bXBzdHIpKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgbHN0MjogLyogZGlyZWN0b3J5IGxpc3QgKi8KKyAgICAgIEZJTEVETEdfU3RyaXBFZGl0Q29udHJvbChoV25kKTsKKyAgICAgIGlmIChISVdPUkQobFBhcmFtKSA9PSBMQk5fREJMQ0xLKQorCXsKKwkgIGxSZXQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgbHN0MiwgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKKwkgIGlmIChsUmV0ID09IExCX0VSUikgcmV0dXJuIFRSVUU7CisJICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgbHN0MiwgTEJfR0VUVEVYVCwgbFJldCwKKwkJCSAgICAgTUFLRV9TRUdQVFIodG1wc3RyKSk7CisJICBpZiAodG1wc3RyWzBdID09ICdbJykKKwkgICAgeworCSAgICAgIHRtcHN0cltzdHJsZW4odG1wc3RyKSAtIDFdID0gMDsKKwkgICAgICBzdHJjcHkodG1wc3RyLHRtcHN0cisxKTsKIAkgICAgfQotCSAgICBzdHJjYXQodG1wc3RyLCAiXFwiKTsKLQkgICAgRklMRURMR19TY2FuRGlyKGhXbmQsIHRtcHN0cik7CisJICBzdHJjYXQodG1wc3RyLCAiXFwiKTsKKwkgIGdvdG8gcmVzZXRfc2NhbjsKIAl9Ci0JcmV0dXJuIFRSVUU7Ci0JCi0gICAgIGNhc2UgY21iMToKLQlpZiAoSElXT1JEKGxQYXJhbSkgPT0gQ0JOX1NFTENIQU5HRSkgewotCSAgICBsUmV0ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGNtYjEsIENCX0dFVENVUlNFTCwgMCwgMCk7Ci0JICAgIGlmIChsUmV0ID09IExCX0VSUikgcmV0dXJuIFRSVUU7Ci0JICAgIHN0cmNweSh0bXBzdHIsIEZJTEVETEdfR2V0RmlsZVR5cGUoUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyRmlsdGVyKSwgCi0JCQkJCSAgICAgICBsUmV0ICsgMSkpOwotCSAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgZWR0MSwgV01fU0VUVEVYVCwgMCwgTUFLRV9TRUdQVFIodG1wc3RyKSk7Ci0JICAgIEZJTEVETEdfU2NhbkRpcihoV25kLCAiIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIGNtYjE6IC8qIGZpbGUgdHlwZSBkcm9wIGxpc3QgKi8KKyAgICAgIGlmIChISVdPUkQobFBhcmFtKSA9PSBDQk5fU0VMQ0hBTkdFKSAKKwl7CisJICAqdG1wc3RyID0gMDsKKwkgIGdvdG8gcmVzZXRfc2NhbjsKIAl9CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIGNtYjI6IC8qIGRpc2sgZHJvcCBsaXN0ICovCisgICAgICBGSUxFRExHX1N0cmlwRWRpdENvbnRyb2woaFduZCk7CisgICAgICBsUmV0ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGNtYjIsIENCX0dFVENVUlNFTCwgMCwgMEwpOworICAgICAgaWYgKGxSZXQgPT0gTEJfRVJSKSByZXR1cm4gMDsKKyAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBjbWIyLCBDQl9HRVRMQlRFWFQsIGxSZXQsIE1BS0VfU0VHUFRSKHRtcHN0cikpOworICAgICAgc3ByaW50Zih0bXBzdHIsICIlYzoiLCB0bXBzdHJbMl0pOworICAgIHJlc2V0X3NjYW46CisgICAgICBsUmV0ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGNtYjEsIENCX0dFVENVUlNFTCwgMCwgMCk7CisgICAgICBpZiAobFJldCA9PSBMQl9FUlIpCiAJcmV0dXJuIFRSVUU7Ci0JCi0gICAgIGNhc2UgY21iMjoKLQlGSUxFRExHX1N0cmlwRWRpdENvbnRyb2woaFduZCk7Ci0JbFJldCA9IFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBjbWIyLCBDQl9HRVRDVVJTRUwsIDAsIDBMKTsKLQlpZiAobFJldCA9PSBMQl9FUlIpIHJldHVybiAwOwotCVNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBjbWIyLCBDQl9HRVRMQlRFWFQsIGxSZXQsIE1BS0VfU0VHUFRSKHRtcHN0cikpOwotCXNwcmludGYodG1wc3RyLCAiJWM6IiwgdG1wc3RyWzJdKTsKLQlGSUxFRExHX1NjYW5EaXIoaFduZCwgdG1wc3RyKTsKLQlyZXR1cm4gVFJVRTsKLQkKLSAgICAgY2FzZSBjaHgxOgotCXJldHVybiBUUlVFOwotCQotICAgICBjYXNlIHBzaEhlbHA6Ci0JcmV0dXJuIFRSVUU7Ci0KLSAgICAgY2FzZSBJRE9LOgotCVNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBlZHQxLCBXTV9HRVRURVhULCA1MTEsIE1BS0VfU0VHUFRSKHRtcHN0cikpOwotCi0JcHN0ciA9IHN0cnJjaHIodG1wc3RyLCAnXFwnKTsKLQlpZiAocHN0ciA9PSBOVUxMKSBwc3RyID0gc3RycmNocih0bXBzdHIsICc6Jyk7Ci0JCi0JaWYgKHN0cmNocih0bXBzdHIsJyonKSAhPSBOVUxMIHx8IHN0cmNocih0bXBzdHIsJz8nKSAhPSBOVUxMKSB7Ci0JICAgIC8qIGVkaXQgY29udHJvbCBjb250YWlucyB3aWxkY2FyZHMgKi8KLQkgICAgaWYgKHBzdHIgIT0gTlVMTCkgewotCQlzdHJjcHkodG1wc3RyMiwgcHN0cisxKTsKLQkJKihwc3RyKzEpID0gMDsKLQkgICAgfSBlbHNlIHsKLQkJc3RyY3B5KHRtcHN0cjIsIHRtcHN0cik7Ci0JCXN0cmNweSh0bXBzdHIsICIiKTsKKyAgICAgIHBzdHIgPSBGSUxFRExHX0dldEZpbGVUeXBlKFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckN1c3RvbUZpbHRlciksCisJCQkJIFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbHRlciksCisJCQkJIGxSZXQpOworICAgICAgc3RyY3B5KHRtcHN0cjIsIHBzdHIpOyAKKyAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBlZHQxLCBXTV9TRVRURVhULCAwLCBNQUtFX1NFR1BUUih0bXBzdHIyKSk7CisgICAgICBGSUxFRExHX1NjYW5EaXIoaFduZCwgdG1wc3RyKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgY2h4MToKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgcHNoSGVscDoKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgSURPSzoKKyAgICBhbG1vc3Rfb2s6CisgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgZWR0MSwgV01fR0VUVEVYVCwgNTExLCBNQUtFX1NFR1BUUih0bXBzdHIpKTsKKyAgICAgIHBzdHIgPSBzdHJyY2hyKHRtcHN0ciwgJ1xcJyk7CisgICAgICBpZiAocHN0ciA9PSBOVUxMKQorCXBzdHIgPSBzdHJyY2hyKHRtcHN0ciwgJzonKTsKKyAgICAgIGlmIChzdHJjaHIodG1wc3RyLCcqJykgIT0gTlVMTCB8fCBzdHJjaHIodG1wc3RyLCc/JykgIT0gTlVMTCkKKwl7CisJICAvKiBlZGl0IGNvbnRyb2wgY29udGFpbnMgd2lsZGNhcmRzICovCisJICBpZiAocHN0ciAhPSBOVUxMKQorCSAgICB7CisJICAgICAgc3RyY3B5KHRtcHN0cjIsIHBzdHIrMSk7CisJICAgICAgKihwc3RyKzEpID0gMDsKIAkgICAgfQotCSAgICBwcmludGYoImNvbW1kbGc6ICVzLCAlc1xuIiwgdG1wc3RyLCB0bXBzdHIyKTsKLQkgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGVkdDEsIFdNX1NFVFRFWFQsIDAsIE1BS0VfU0VHUFRSKHRtcHN0cjIpKTsKLQkgICAgRklMRURMR19TY2FuRGlyKGhXbmQsIHRtcHN0cik7Ci0JICAgIHJldHVybiBUUlVFOworCSAgZWxzZQorCSAgICB7CisJICAgICAgc3RyY3B5KHRtcHN0cjIsIHRtcHN0cik7CisJICAgICAgc3RyY3B5KHRtcHN0ciwgIiIpOworCSAgICB9CisJICBwcmludGYoImNvbW1kbGc6ICVzLCAlc1xuIiwgdG1wc3RyLCB0bXBzdHIyKTsKKwkgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBlZHQxLCBXTV9TRVRURVhULCAwLCBNQUtFX1NFR1BUUih0bXBzdHIyKSk7CisJICBGSUxFRExHX1NjYW5EaXIoaFduZCwgdG1wc3RyKTsKKwkgIHJldHVybiBUUlVFOwogCX0KLQotCS8qIG5vIHdpbGRjYXJkcywgd2UgbWlnaHQgaGF2ZSBhIGRpcmVjdG9yeSBvciBhIGZpbGVuYW1lICovCi0JLyogdHJ5IGFwcGVuZGluZyBhIHdpbGRjYXJkIGFuZCByZWFkaW5nIHRoZSBkaXJlY3RvcnkgKi8KLQlwc3RyMiA9IHRtcHN0ciArIHN0cmxlbih0bXBzdHIpOwotCWlmIChwc3RyID09IE5VTEwgfHwgKihwc3RyKzEpICE9IDApIHsKLQkgICAgc3RyY2F0KHRtcHN0ciwgIlxcIik7CisgICAgICAvKiBubyB3aWxkY2FyZHMsIHdlIG1pZ2h0IGhhdmUgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlbmFtZSAqLworICAgICAgLyogdHJ5IGFwcGVuZGluZyBhIHdpbGRjYXJkIGFuZCByZWFkaW5nIHRoZSBkaXJlY3RvcnkgKi8KKyAgICAgIHBzdHIyID0gdG1wc3RyICsgc3RybGVuKHRtcHN0cik7CisgICAgICBpZiAocHN0ciA9PSBOVUxMIHx8ICoocHN0cisxKSAhPSAwKQorCXN0cmNhdCh0bXBzdHIsICJcXCIpOworICAgICAgbFJldCA9IFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBjbWIxLCBDQl9HRVRDVVJTRUwsIDAsIDApOworICAgICAgaWYgKGxSZXQgPT0gTEJfRVJSKSByZXR1cm4gVFJVRTsKKyAgICAgIHN0cmNweSh0bXBzdHIyLCAKKwkgICAgIEZJTEVETEdfR2V0RmlsZVR5cGUoUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyQ3VzdG9tRmlsdGVyKSwKKwkJCQkgUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyRmlsdGVyKSwKKwkJCQkgbFJldCkpOworICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGVkdDEsIFdNX1NFVFRFWFQsIDAsIE1BS0VfU0VHUFRSKHRtcHN0cjIpKTsKKyAgICAgIC8qIGlmIFNjYW5EaXIgc3VjY2VlZHMsIHdlIGhhdmUgY2hhbmdlZCB0aGUgZGlyZWN0b3J5ICovCisgICAgICBpZiAoRklMRURMR19TY2FuRGlyKGhXbmQsIHRtcHN0cikpIHJldHVybiBUUlVFOworICAgICAgLyogaWYgbm90LCB0aGlzIG11c3QgYmUgYSBmaWxlbmFtZSAqLworICAgICAgKnBzdHIyID0gMDsKKyAgICAgIGlmIChwc3RyICE9IE5VTEwpCisJeworCSAgLyogc3RyaXAgb2ZmIHRoZSBwYXRobmFtZSAqLworCSAgKnBzdHIgPSAwOworCSAgc3RyY3B5KHRtcHN0cjIsIHBzdHIrMSk7CisJICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgZWR0MSwgV01fU0VUVEVYVCwgMCwgTUFLRV9TRUdQVFIodG1wc3RyMikpOworCSAgLyogU2hvdWxkIHdlIE1lc3NhZ2VCb3goKSBpZiB0aGlzIGZhaWxzPyAqLworCSAgaWYgKCFGSUxFRExHX1NjYW5EaXIoaFduZCwgdG1wc3RyKSkgcmV0dXJuIFRSVUU7CisJICBzdHJjcHkodG1wc3RyLCB0bXBzdHIyKTsKIAl9Ci0JbFJldCA9IFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBjbWIxLCBDQl9HRVRDVVJTRUwsIDAsIDApOwotCWlmIChsUmV0ID09IExCX0VSUikgcmV0dXJuIFRSVUU7Ci0Jc3RyY3B5KHRtcHN0cjIsIEZJTEVETEdfR2V0RmlsZVR5cGUoUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyRmlsdGVyKSwKLQkJCQkJICAgIGxSZXQgKyAxKSk7Ci0JU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGVkdDEsIFdNX1NFVFRFWFQsIDAsIE1BS0VfU0VHUFRSKHRtcHN0cjIpKTsKLQkvKiBpZiBTY2FuRGlyIHN1Y2NlZWRzLCB3ZSBoYXZlIGNoYW5nZWQgdGhlIGRpcmVjdG9yeSAqLwotCWlmIChGSUxFRExHX1NjYW5EaXIoaFduZCwgdG1wc3RyKSkgcmV0dXJuIFRSVUU7Ci0JCi0JLyogaWYgbm90LCB0aGlzIG11c3QgYmUgYSBmaWxlbmFtZSAqLwotCSpwc3RyMiA9IDA7Ci0JCi0JaWYgKHBzdHIgIT0gTlVMTCkgewotCSAgICAvKiBzdHJpcCBvZmYgdGhlIHBhdGhuYW1lICovCi0JICAgICpwc3RyID0gMDsKLQkgICAgc3RyY3B5KHRtcHN0cjIsIHBzdHIrMSk7Ci0JICAgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBlZHQxLCBXTV9TRVRURVhULCAwLCBNQUtFX1NFR1BUUih0bXBzdHIyKSk7Ci0JICAgIC8qIFNob3VsZCB3ZSBNZXNzYWdlQm94KCkgaWYgdGhpcyBmYWlscz8gKi8KLQkgICAgaWYgKCFGSUxFRExHX1NjYW5EaXIoaFduZCwgdG1wc3RyKSkgcmV0dXJuIFRSVUU7Ci0JICAgIHN0cmNweSh0bXBzdHIsIHRtcHN0cjIpOwotCX0gZWxzZSB7Ci0JICAgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBlZHQxLCBXTV9TRVRURVhULCAwLCBNQUtFX1NFR1BUUih0bXBzdHIpKTsKKyAgICAgIGVsc2UgCisJU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGVkdDEsIFdNX1NFVFRFWFQsIDAsIE1BS0VfU0VHUFRSKHRtcHN0cikpOworICAgICAgU2hvd1dpbmRvdyhoV25kLCBTV19ISURFKTsKKyAgICAgIHsKKwlpbnQgZHJpdmU7CisJZHJpdmUgPSBET1NfR2V0RGVmYXVsdERyaXZlKCk7CisJdG1wc3RyMlswXSA9ICdBJysgZHJpdmU7CisJdG1wc3RyMlsxXSA9ICc6JzsKKwl0bXBzdHIyWzJdID0gJ1xcJzsKKwlzdHJjcHkodG1wc3RyMiArIDMsIERPU19HZXRDdXJyZW50RGlyKGRyaXZlKSk7CisJaWYgKHN0cmxlbih0bXBzdHIyKSA+IDMpCisJICBzdHJjYXQodG1wc3RyMiwgIlxcIik7CisJc3RyY2F0KHRtcHN0cjIsIHRtcHN0cik7CisJc3RyY3B5KFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbGUpLCB0bXBzdHIyKTsKKyAgICAgIH0KKyAgICAgIGxwb2ZuLT5uRmlsZU9mZnNldCA9IDA7CisgICAgICBscG9mbi0+bkZpbGVFeHRlbnNpb24gPSBzdHJsZW4oUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyRmlsZSkpIC0gMzsKKyAgICAgIGlmIChQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlVGl0bGUpICE9IE5VTEwpIAorCXsKKwkgIGxSZXQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgbHN0MSwgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKKwkgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBsc3QxLCBMQl9HRVRURVhULCBsUmV0LAorCQkJICAgICBNQUtFX1NFR1BUUih0bXBzdHIpKTsKKwkgIHN0cmNweShQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlVGl0bGUpLCB0bXBzdHIpOwogCX0KLQkKLQlTaG93V2luZG93KGhXbmQsIFNXX0hJREUpOwotCXN0cmNweShQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlKSwgdG1wc3RyKTsKLQlscG9mbi0+bkZpbGVPZmZzZXQgPSAwOwotCWxwb2ZuLT5uRmlsZUV4dGVuc2lvbiA9IHN0cmxlbihQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlKSkgLSAzOwotCWlmIChQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlVGl0bGUpICE9IE5VTEwpIHsKLQkgICAgbFJldCA9IFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBsc3QxLCBMQl9HRVRDVVJTRUwsIDAsIDApOwotCSAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgbHN0MSwgTEJfR0VUVEVYVCwgbFJldCwgTUFLRV9TRUdQVFIodG1wc3RyKSk7Ci0JICAgIHN0cmNweShQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlVGl0bGUpLCB0bXBzdHIpOwotCX0KLQlFbmREaWFsb2coaFduZCwgVFJVRSk7Ci0JcmV0dXJuIFRSVUU7Ci0gICAgIGNhc2UgSURDQU5DRUw6Ci0JRW5kRGlhbG9nKGhXbmQsIEZBTFNFKTsKLQlyZXR1cm4gVFJVRTsKKyAgICAgIEVuZERpYWxvZyhoV25kLCBUUlVFKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgSURDQU5DRUw6CisgICAgICBFbmREaWFsb2coaFduZCwgRkFMU0UpOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQlGaWxlT3BlbkRsZ1Byb2MJCQlbQ09NTURMRy42XQogICovCisKIEJPT0wgRmlsZU9wZW5EbGdQcm9jKEhXTkQgaFduZCwgV09SRCB3TXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7ICAKLSAgc3dpdGNoICh3TXNnKSB7Ci0gICBjYXNlIFdNX0lOSVRESUFMT0c6CisgIHN3aXRjaCAod01zZykKKyAgICB7CisgICAgY2FzZSBXTV9JTklURElBTE9HOgogICAgICAgcmV0dXJuIEZJTEVETEdfV01Jbml0RGlhbG9nKGhXbmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgIAotICAgY2FzZSBXTV9NRUFTVVJFSVRFTToKKyAgICBjYXNlIFdNX01FQVNVUkVJVEVNOgogICAgICAgcmV0dXJuIEZJTEVETEdfV01NZWFzdXJlSXRlbShoV25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgCi0gICBjYXNlIFdNX0RSQVdJVEVNOgorICAgIGNhc2UgV01fRFJBV0lURU06CiAgICAgICByZXR1cm4gRklMRURMR19XTURyYXdJdGVtKGhXbmQsIHdQYXJhbSwgbFBhcmFtKTsKLQotICAgY2FzZSBXTV9DT01NQU5EOgorICAgIGNhc2UgV01fQ09NTUFORDoKICAgICAgIHJldHVybiBGSUxFRExHX1dNQ29tbWFuZChoV25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gIH0KLSAgCi0gIC8qCi0gIGNhc2UgV01fQ1RMQ09MT1I6Ci0gICBTZXRCa0NvbG9yKChIREMpd1BhcmFtLCAweDAwQzBDMEMwKTsKLSAgIHN3aXRjaCAoSElXT1JEKGxQYXJhbSkpCi0gICB7Ci0gICAgY2FzZSBDVExDT0xPUl9CVE46Ci0gICAgIFNldFRleHRDb2xvcigoSERDKXdQYXJhbSwgMHgwMDAwMDAwMCk7Ci0gICAgIHJldHVybiBoR1JBWUJydXNoOwotICAgIGNhc2UgQ1RMQ09MT1JfU1RBVElDOgotICAgICBTZXRUZXh0Q29sb3IoKEhEQyl3UGFyYW0sIDB4MDAwMDAwMDApOwotICAgICByZXR1cm4gaEdSQVlCcnVzaDsKLSAgIH0KLSAgIHJldHVybiBGQUxTRTsKLSAgIAotICAgKi8KKyNpZiAwCisgICAgY2FzZSBXTV9DVExDT0xPUjoKKyAgICAgIFNldEJrQ29sb3IoKEhEQyl3UGFyYW0sIDB4MDBDMEMwQzApOworICAgICAgc3dpdGNoIChISVdPUkQobFBhcmFtKSkKKwl7CisJY2FzZSBDVExDT0xPUl9CVE46CisJICBTZXRUZXh0Q29sb3IoKEhEQyl3UGFyYW0sIDB4MDAwMDAwMDApOworCSAgcmV0dXJuIGhHUkFZQnJ1c2g7CisJY2FzZSBDVExDT0xPUl9TVEFUSUM6CisJICBTZXRUZXh0Q29sb3IoKEhEQyl3UGFyYW0sIDB4MDAwMDAwMDApOworCSAgcmV0dXJuIGhHUkFZQnJ1c2g7CisJfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CiAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtNTg5LDI0ICs2MjMsMjUgQEAKICAqLwogQk9PTCBDb2xvckRsZ1Byb2MoSFdORCBoV25kLCBXT1JEIHdNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLQlzd2l0Y2ggKHdNc2cpIHsKLQkJY2FzZSBXTV9JTklURElBTE9HOgotCQkJcHJpbnRmKCJDb2xvckRsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7Ci0JCQlTaG93V2luZG93KGhXbmQsIFNXX1NIT1dOT1JNQUwpOwotCQkJcmV0dXJuIChUUlVFKTsKLQotCQljYXNlIFdNX0NPTU1BTkQ6Ci0JCQlzd2l0Y2ggKHdQYXJhbSkgewotCQkJCWNhc2UgSURPSzoKLQkJCQkJRW5kRGlhbG9nKGhXbmQsIFRSVUUpOwotCQkJCQlyZXR1cm4oVFJVRSk7Ci0JCQkJY2FzZSBJRENBTkNFTDoKLQkJCQkJRW5kRGlhbG9nKGhXbmQsIEZBTFNFKTsKLQkJCQkJcmV0dXJuKFRSVUUpOwotCQkJCX0KLQkJCXJldHVybihGQUxTRSk7Ci0JCX0KLQlyZXR1cm4gRkFMU0U7CisgIHN3aXRjaCAod01zZykgCisgICAgeworICAgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICAgIHByaW50ZigiQ29sb3JEbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOworICAgICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTk9STUFMKTsKKyAgICAgIHJldHVybiAoVFJVRSk7CisgICAgY2FzZSBXTV9DT01NQU5EOgorICAgICAgc3dpdGNoICh3UGFyYW0pCisJeworCWNhc2UgSURPSzoKKwkgIEVuZERpYWxvZyhoV25kLCBUUlVFKTsKKwkgIHJldHVybihUUlVFKTsKKwljYXNlIElEQ0FOQ0VMOgorCSAgRW5kRGlhbG9nKGhXbmQsIEZBTFNFKTsKKwkgIHJldHVybihUUlVFKTsKKwl9CisgICAgICByZXR1cm4oRkFMU0UpOworICAgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCiAKQEAgLTY1MSwyMyArNjg2LDI0IEBACiAgKi8KIEJPT0wgRmluZFRleHREbGdQcm9jKEhXTkQgaFduZCwgV09SRCB3TXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0gIHN3aXRjaCAod01zZykgewotICAgY2FzZSBXTV9JTklURElBTE9HOgotICAgIHByaW50ZigiRmluZFRleHREbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOwotICAgIFNob3dXaW5kb3coaFduZCwgU1dfU0hPV05PUk1BTCk7Ci0gICAgcmV0dXJuIChUUlVFKTsKLSAgICAKLSAgIGNhc2UgV01fQ09NTUFORDoKLSAgICBzd2l0Y2ggKHdQYXJhbSkgewotICAgICBjYXNlIElET0s6Ci0gICAgICBFbmREaWFsb2coaFduZCwgVFJVRSk7Ci0gICAgICByZXR1cm4oVFJVRSk7Ci0gICAgIGNhc2UgSURDQU5DRUw6Ci0gICAgICBFbmREaWFsb2coaFduZCwgRkFMU0UpOwotICAgICAgcmV0dXJuKFRSVUUpOworICBzd2l0Y2ggKHdNc2cpCisgICAgeworICAgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICAgIHByaW50ZigiRmluZFRleHREbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOworICAgICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTk9STUFMKTsKKyAgICAgIHJldHVybiAoVFJVRSk7CisgICAgY2FzZSBXTV9DT01NQU5EOgorICAgICAgc3dpdGNoICh3UGFyYW0pCisJeworCWNhc2UgSURPSzoKKwkgIEVuZERpYWxvZyhoV25kLCBUUlVFKTsKKwkgIHJldHVybihUUlVFKTsKKwljYXNlIElEQ0FOQ0VMOgorCSAgRW5kRGlhbG9nKGhXbmQsIEZBTFNFKTsKKwkgIHJldHVybihUUlVFKTsKKwl9CisgICAgICByZXR1cm4oRkFMU0UpOwogICAgIH0KLSAgICByZXR1cm4oRkFMU0UpOwotICB9CiAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtNjc3LDIzICs3MTMsMjQgQEAKICAqLwogQk9PTCBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORCBoV25kLCBXT1JEIHdNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgc3dpdGNoICh3TXNnKSB7Ci0gICBjYXNlIFdNX0lOSVRESUFMT0c6Ci0gICAgcHJpbnRmKCJSZXBsYWNlVGV4dERsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7Ci0gICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTk9STUFMKTsKLSAgICByZXR1cm4gKFRSVUUpOwotICAgIAotICAgY2FzZSBXTV9DT01NQU5EOgotICAgIHN3aXRjaCAod1BhcmFtKSB7Ci0gICAgIGNhc2UgSURPSzoKLSAgICAgIEVuZERpYWxvZyhoV25kLCBUUlVFKTsKLSAgICAgIHJldHVybihUUlVFKTsKLSAgICAgY2FzZSBJRENBTkNFTDoKLSAgICAgIEVuZERpYWxvZyhoV25kLCBGQUxTRSk7Ci0gICAgICByZXR1cm4oVFJVRSk7CisgIHN3aXRjaCAod01zZykKKyAgICB7CisgICAgY2FzZSBXTV9JTklURElBTE9HOgorICAgICAgcHJpbnRmKCJSZXBsYWNlVGV4dERsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CisgICAgICBTaG93V2luZG93KGhXbmQsIFNXX1NIT1dOT1JNQUwpOworICAgICAgcmV0dXJuIChUUlVFKTsKKyAgICBjYXNlIFdNX0NPTU1BTkQ6CisgICAgICBzd2l0Y2ggKHdQYXJhbSkKKwl7CisJY2FzZSBJRE9LOgorCSAgRW5kRGlhbG9nKGhXbmQsIFRSVUUpOworCSAgcmV0dXJuKFRSVUUpOworCWNhc2UgSURDQU5DRUw6CisJICBFbmREaWFsb2coaFduZCwgRkFMU0UpOworCSAgcmV0dXJuKFRSVUUpOworCX0KKyAgICAgIHJldHVybihGQUxTRSk7CiAgICAgfQotICAgIHJldHVybihGQUxTRSk7Ci0gIH0KICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC03MzEsMjMgKzc2OCwyNCBAQAogICovCiBCT09MIFByaW50RGxnUHJvYyhIV05EIGhXbmQsIFdPUkQgd01zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICBzd2l0Y2ggKHdNc2cpIHsKLSAgIGNhc2UgV01fSU5JVERJQUxPRzoKLSAgICBwcmludGYoIlByaW50RGxnUHJvYyAvLyBXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKLSAgICBTaG93V2luZG93KGhXbmQsIFNXX1NIT1dOT1JNQUwpOwotICAgIHJldHVybiAoVFJVRSk7Ci0gICAgCi0gICBjYXNlIFdNX0NPTU1BTkQ6Ci0gICAgc3dpdGNoICh3UGFyYW0pIHsKLSAgICAgY2FzZSBJRE9LOgotICAgICAgRW5kRGlhbG9nKGhXbmQsIFRSVUUpOwotICAgICAgcmV0dXJuKFRSVUUpOwotICAgICBjYXNlIElEQ0FOQ0VMOgotICAgICAgRW5kRGlhbG9nKGhXbmQsIEZBTFNFKTsKLSAgICAgIHJldHVybihUUlVFKTsKKyAgc3dpdGNoICh3TXNnKQorICAgIHsKKyAgICBjYXNlIFdNX0lOSVRESUFMT0c6CisgICAgICBwcmludGYoIlByaW50RGxnUHJvYyAvLyBXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKKyAgICAgIFNob3dXaW5kb3coaFduZCwgU1dfU0hPV05PUk1BTCk7CisgICAgICByZXR1cm4gKFRSVUUpOworICAgIGNhc2UgV01fQ09NTUFORDoKKyAgICAgIHN3aXRjaCAod1BhcmFtKQorCXsKKwljYXNlIElET0s6CisJICBFbmREaWFsb2coaFduZCwgVFJVRSk7CisJICByZXR1cm4oVFJVRSk7CisJY2FzZSBJRENBTkNFTDoKKwkgIEVuZERpYWxvZyhoV25kLCBGQUxTRSk7CisJICByZXR1cm4oVFJVRSk7CisJfQorICAgICAgcmV0dXJuKEZBTFNFKTsKICAgICB9Ci0gICAgcmV0dXJuKEZBTFNFKTsKLSAgfQogICByZXR1cm4gRkFMU0U7CiB9CiAKQEAgLTc1NywyMyArNzk1LDIzIEBACiAgKi8KIEJPT0wgUHJpbnRTZXR1cERsZ1Byb2MoSFdORCBoV25kLCBXT1JEIHdNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgc3dpdGNoICh3TXNnKSB7Ci0gICBjYXNlIFdNX0lOSVRESUFMT0c6Ci0gICAgcHJpbnRmKCJQcmludFNldHVwRGxnUHJvYyAvLyBXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKLSAgICBTaG93V2luZG93KGhXbmQsIFNXX1NIT1dOT1JNQUwpOwotICAgIHJldHVybiAoVFJVRSk7Ci0gICAgCi0gICBjYXNlIFdNX0NPTU1BTkQ6Ci0gICAgc3dpdGNoICh3UGFyYW0pIHsKLSAgICAgY2FzZSBJRE9LOgotICAgICAgRW5kRGlhbG9nKGhXbmQsIFRSVUUpOwotICAgICAgcmV0dXJuKFRSVUUpOwotICAgICBjYXNlIElEQ0FOQ0VMOgotICAgICAgRW5kRGlhbG9nKGhXbmQsIEZBTFNFKTsKLSAgICAgIHJldHVybihUUlVFKTsKKyAgc3dpdGNoICh3TXNnKQorICAgIHsKKyAgICBjYXNlIFdNX0lOSVRESUFMT0c6CisgICAgICBwcmludGYoIlByaW50U2V0dXBEbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOworICAgICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTk9STUFMKTsKKyAgICAgIHJldHVybiAoVFJVRSk7CisgICAgY2FzZSBXTV9DT01NQU5EOgorICAgICAgc3dpdGNoICh3UGFyYW0pIHsKKyAgICAgIGNhc2UgSURPSzoKKwlFbmREaWFsb2coaFduZCwgVFJVRSk7CisJcmV0dXJuKFRSVUUpOworICAgICAgY2FzZSBJRENBTkNFTDoKKwlFbmREaWFsb2coaFduZCwgRkFMU0UpOworCXJldHVybihUUlVFKTsKKyAgICAgIH0KKyAgICAgIHJldHVybihGQUxTRSk7CiAgICAgfQotICAgIHJldHVybihGQUxTRSk7Ci0gIH0KICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC03ODMsNyArODIxLDcgQEAKICAqLwogRFdPUkQgQ29tbURsZ0V4dGVuZEVycm9yKHZvaWQpCiB7Ci0JcmV0dXJuIENvbW1EbGdMYXN0RXJyb3I7CisgIHJldHVybiBDb21tRGxnTGFzdEVycm9yOwogfQogCiAKQEAgLTc5MiwyNyArODMwLDI5IEBACiAgKi8KIGludCBHZXRGaWxlVGl0bGUoTFBDU1RSIGxwRmlsZSwgTFBTVFIgbHBUaXRsZSwgVUlOVCBjYkJ1ZikKIHsKLQlpbnQgICAgCWksIGxlbjsKLQlwcmludGYoIkdldEZpbGVUaXRsZSglcCAlcCAlZCk7IFxuIiwgbHBGaWxlLCBscFRpdGxlLCBjYkJ1Zik7Ci0JaWYgKGxwRmlsZSA9PSBOVUxMIHx8IGxwVGl0bGUgPT0gTlVMTCkgcmV0dXJuIC0xOwotCWxlbiA9IHN0cmxlbihscEZpbGUpOwotCWlmIChsZW4gPT0gMCkgcmV0dXJuIC0xOwotCWlmIChzdHJjaHIobHBGaWxlLCAnKicpICE9IE5VTEwpIHJldHVybiAtMTsKLQlpZiAoc3RyY2hyKGxwRmlsZSwgJ1snKSAhPSBOVUxMKSByZXR1cm4gLTE7Ci0JaWYgKHN0cmNocihscEZpbGUsICddJykgIT0gTlVMTCkgcmV0dXJuIC0xOwotCWxlbi0tOwotCWlmIChscEZpbGVbbGVuXSA9PSAnLycgfHwgbHBGaWxlW2xlbl0gPT0gJ1xcJyB8fCBscEZpbGVbbGVuXSA9PSAnOicpIHJldHVybiAtMTsKLQlmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0JICBpZiAobHBGaWxlW2ldID09ICcvJyB8fCAgbHBGaWxlW2ldID09ICdcXCcgfHwgIGxwRmlsZVtpXSA9PSAnOicpIHsKLQkgICAgaSsrOwotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0JcHJpbnRmKCJcbi0tLT4gJyVzJyAiLCAmbHBGaWxlW2ldKTsKLQlsZW4gPSBtaW4oY2JCdWYsIHN0cmxlbigmbHBGaWxlW2ldKSArIDEpOwotCXN0cm5jcHkobHBUaXRsZSwgJmxwRmlsZVtpXSwgbGVuICsgMSk7Ci0JaWYgKGxlbiAhPSBjYkJ1ZikKLQkJcmV0dXJuIGxlbjsKLQllbHNlCi0JCXJldHVybiAwOworICBpbnQgaSwgbGVuOworICBwcmludGYoIkdldEZpbGVUaXRsZSglcCAlcCAlZCk7IFxuIiwgbHBGaWxlLCBscFRpdGxlLCBjYkJ1Zik7CisgIGlmIChscEZpbGUgPT0gTlVMTCB8fCBscFRpdGxlID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBsZW4gPSBzdHJsZW4obHBGaWxlKTsKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiAtMTsKKyAgaWYgKHN0cnBicmsobHBGaWxlLCAiKltdIikpCisgICAgcmV0dXJuIC0xOworICBsZW4tLTsKKyAgaWYgKGxwRmlsZVtsZW5dID09ICcvJyB8fCBscEZpbGVbbGVuXSA9PSAnXFwnIHx8IGxwRmlsZVtsZW5dID09ICc6JykKKyAgICByZXR1cm4gLTE7CisgIGZvciAoaSA9IGxlbjsgaSA+PSAwOyBpLS0pCisgICAgaWYgKGxwRmlsZVtpXSA9PSAnLycgfHwgIGxwRmlsZVtpXSA9PSAnXFwnIHx8ICBscEZpbGVbaV0gPT0gJzonKQorICAgICAgeworCWkrKzsKKwlicmVhazsKKyAgICAgIH0KKyAgcHJpbnRmKCJcbi0tLT4gJyVzJyAiLCAmbHBGaWxlW2ldKTsKKyAgbGVuID0gbWluKGNiQnVmLCBzdHJsZW4oJmxwRmlsZVtpXSkgKyAxKTsKKyAgc3RybmNweShscFRpdGxlLCAmbHBGaWxlW2ldLCBsZW4gKyAxKTsKKyAgaWYgKGxlbiAhPSBjYkJ1ZikKKyAgICByZXR1cm4gbGVuOworICBlbHNlCisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9taXNjL2NvbXBvYmouYyBiL21pc2MvY29tcG9iai5jCmluZGV4IGI0YTBmOWYuLjAyNmI2ODEgMTAwNjQ0Ci0tLSBhL21pc2MvY29tcG9iai5jCisrKyBiL21pc2MvY29tcG9iai5jCkBAIC0xNCw2ICsxNCw4IEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCitEV09SRCBjdXJyZW50TWFsbG9jPTA7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENvQnVpbGRWZXJzaW9uIFtDT01QT0JKLjFdCiAgKi8KQEAgLTI1LDEwICsyNywxMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb0luaXRpYWxpemUJW0NPTVBPQkouMl0KKyAqIGxwUmVzZXJ2ZWQgaXMgYW4gSU1hbGxvYyBwb2ludGVyIGluIDE2Yml0IE9MRS4gV2UganVzdCBzdG9yZWQgaXQgYXMtaXMuCiAgKi8KLUhSRVNVTFQgV0lOQVBJIENvSW5pdGlhbGl6ZShMUFZPSUQgbHBSZXNlcnZlZCkKK0hSRVNVTFQgV0lOQVBJIENvSW5pdGlhbGl6ZShEV09SRCBscFJlc2VydmVkKQogewogCWRwcmludGZfb2xlKHN0ZG5pbXAsIkNvSW5pdGlhbGl6ZVxuIik7CisJLyogcmVtZW1iZXIgdGhlIExQTUFMTE9DLCBtYXliZSBzb21lYm9keSB3YW50cyB0byByZWFkIGl0IGxhdGVyIG9uICovCisJY3VycmVudE1hbGxvYyA9IGxwUmVzZXJ2ZWQ7CiAJcmV0dXJuIFNfT0s7CiB9CiAKQEAgLTQxLDYgKzQ2LDIxIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENvR2V0TWFsbG9jICAgIFtDT01QT0JKLjRdCisgKi8KK0hSRVNVTFQgV0lOQVBJIENvR2V0TWFsbG9jKERXT1JEIGR3TWVtQ29udGV4dCwgRFdPUkQgKiBscE1hbGxvYykKK3sKKwlpZihjdXJyZW50TWFsbG9jKQorCXsKKwkJKmxwTWFsbG9jID0gY3VycmVudE1hbGxvYzsKKwkJcmV0dXJuIFNfT0s7CisJfQorCSpscE1hbGxvYyA9IDA7CisJLyogMTYtYml0IEVfTk9USU1QTCAqLworCXJldHVybiAweDgwMDAwMDAxTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ29EaXNjb25uZWN0T2JqZWN0CiAgKi8KIE9MRVNUQVRVUyBXSU5BUEkgQ29EaXNjb25uZWN0T2JqZWN0KApkaWZmIC0tZ2l0IGEvbWlzYy9kb3NfZnMuYyBiL21pc2MvZG9zX2ZzLmMKaW5kZXggYzk4NjRjOC4uMDhkZTNjMCAxMDA2NDQKLS0tIGEvbWlzYy9kb3NfZnMuYworKysgYi9taXNjL2Rvc19mcy5jCkBAIC0zNSwxMyArMzUsMTMgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjZGVmaW5lIFdJTkVfSU5JX1VTRVIgIn4vLndpbmVyYyIKLSNkZWZpbmUgTUFYX09QRU5fRElSUyAxNgogI2RlZmluZSBNQVhfRE9TX0RSSVZFUwkyNgogCiBleHRlcm4gY2hhciBXaW5kb3dzRGlyZWN0b3J5WzI1Nl0sIFN5c3RlbURpcmVjdG9yeVsyNTZdLFRlbXBEaXJlY3RvcnlbMjU2XTsKIAogY2hhciBXaW5kb3dzUGF0aFsyNTZdOwogCitzdGF0aWMgaW50IG1heF9vcGVuX2RpcnMgPSAwOwogc3RhdGljIGludCBDdXJyZW50RHJpdmUgPSAyOwogCiBzdHJ1Y3QgRG9zRHJpdmVTdHJ1Y3QgewkJCS8qICBlZzogKi8KQEAgLTUzLDcgKzUzLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgRG9zRHJpdmVTdHJ1Y3QgRG9zRHJpdmVzW01BWF9ET1NfRFJJVkVTXTsKLXN0YXRpYyBzdHJ1Y3QgZG9zZGlyZW50IERvc0RpcnNbTUFYX09QRU5fRElSU107CitzdGF0aWMgc3RydWN0IGRvc2RpcmVudCAqRG9zRGlycz1OVUxMOwogCiBzdGF0aWMgdm9pZCBFeHBhbmRUaWxkZVN0cmluZyhjaGFyICpzKQogewpAQCAtMjIxLDcgKzIyMSw3IEBACiAJCX0KIAl9CiAKLQlmb3IgKHg9MDsgeCE9TUFYX09QRU5fRElSUyA7IHgrKykKKwlmb3IgKHg9MDsgeCE9bWF4X29wZW5fZGlycyA7IHgrKykKIAkJRG9zRGlyc1t4XS5pbnVzZSA9IDA7CiAKICAgICBkcHJpbnRmX2Rvc2ZzKHN0ZGRlYiwid2luZS5pbmkgPSAlc1xuIixXSU5FX0lOSSk7CkBAIC04NjksNiArODY5LDcgQEAKIAlpbnQgeCx5OwogCWNoYXIgKnVuaXhkaXJuYW1lOwogCWNoYXIgdGVtcFsyNTZdOworCURJUiAgKmRzOwogCQogCWlmICgodW5peGRpcm5hbWUgPSBET1NfR2V0VW5peEZpbGVOYW1lKGRvc2Rpcm5hbWUpKSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKQEAgLTg4NSwxMCArODg2LDE1IEBACiAJCX0KIAl9CiAKLSAgICAgICAgZm9yICh4PTA7IHggPD0gTUFYX09QRU5fRElSUzsgeCsrKSB7Ci0JICBpZiAoeCA9PSBNQVhfT1BFTl9ESVJTKSB7Ci0JICAgIGZwcmludGYoIHN0ZGVyciwgIkRPU19vcGVuZGlyKCk6IFRvbyBtYW55IG9wZW4gZGlyZWN0b3JpZXNcbiIpOwotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yICh4PTA7IHggPD0gbWF4X29wZW5fZGlyczsgeCsrKSB7CisJICBpZiAoeCA9PSBtYXhfb3Blbl9kaXJzKSB7CisJICAgIGlmIChEb3NEaXJzKSB7CisJICAgICAgRG9zRGlycz0oc3RydWN0IGRvc2RpcmVudCopcmVhbGxvYyhEb3NEaXJzLCgrK21heF9vcGVuX2RpcnMpKnNpemVvZihEb3NEaXJzWzBdKSk7CisJICAgIH0gZWxzZSB7CisJICAgICAgRG9zRGlycz0oc3RydWN0IGRvc2RpcmVudCopbWFsbG9jKHNpemVvZihEb3NEaXJzWzBdKSk7CisJICAgICAgbWF4X29wZW5fZGlycz0xOworCSAgICB9CisJICAgIGJyZWFrOyAvKiB0aGlzIG9uZSBpcyBkZWZpbml0ZWx5IG5vdCBpbiB1c2UgKi8KIAkgIH0KIAkgIGlmICghRG9zRGlyc1t4XS5pbnVzZSkgYnJlYWs7CiAJICBpZiAoc3RyY21wKERvc0RpcnNbeF0udW5peHBhdGgsdGVtcCkgPT0gMCkgYnJlYWs7CkBAIC05MDMsNyArOTA5LDEzIEBACiAJc3RyY3B5KERvc0RpcnNbeF0udW5peHBhdGgsIHRlbXApOwogICAgICAgICBEb3NEaXJzW3hdLmVudG51bSA9IDA7CiAKLQlpZiAoKERvc0RpcnNbeF0uZHMgPSBvcGVuZGlyKHRlbXApKSA9PSBOVUxMKQorCWlmICgoZHMgPSBvcGVuZGlyKHRlbXApKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoLTE9PShEb3NEaXJzW3hdLnRlbGxkaXJudW09dGVsbGRpcihkcykpKSB7CisJCWNsb3NlZGlyKGRzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgtMT09Y2xvc2VkaXIoZHMpKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiAmRG9zRGlyc1t4XTsKQEAgLTkxNSwxMyArOTI3LDE5IEBACiAJY2hhciB0ZW1wWzI1Nl07CiAJc3RydWN0IGRpcmVudCAqZDsKIAlzdHJ1Y3Qgc3RhdCBzdDsKKwlESVIJKmRzOwogCiAJaWYgKCFkZS0+aW51c2UpCiAJCXJldHVybiBOVUxMOwotCQorCWlmICgtMT09KGRzPW9wZW5kaXIoZGUtPnVuaXhwYXRoKSkpCisJCXJldHVybiBOVUxMOworCXNlZWtkaXIoZHMsZGUtPnRlbGxkaXJudW0pOyAvKiByZXR1cm5zIG5vIGVycm9yIHZhbHVlLiBzdHJhbmdlICovCiAJZG8gewotCQlpZiAoKGQgPSByZWFkZGlyKGRlLT5kcykpID09IE5VTEwpIAorCQlpZiAoKGQgPSByZWFkZGlyKGRzKSkgPT0gTlVMTCkgIHsKKwkJCWRlLT50ZWxsZGlybnVtPXRlbGxkaXIoZHMpOworCQkJY2xvc2VkaXIoZHMpOwogCQkJcmV0dXJuIE5VTEw7CisJCX0KIAogICAgICAgICAgICAgICAgIGRlLT5lbnRudW0rKzsgICAvKiBJbmNyZW1lbnQgdGhlIGRpcmVjdG9yeSBlbnRyeSBudW1iZXIgKi8KIAkJc3RyY3B5KGRlLT5maWxlbmFtZSwgZC0+ZF9uYW1lKTsKQEAgLTk0NCwxNiArOTYyLDE1IEBACiAJZGUtPmZpbGVzaXplID0gc3Quc3Rfc2l6ZTsKIAlkZS0+ZmlsZXRpbWUgPSBzdC5zdF9tdGltZTsKIAorCWRlLT50ZWxsZGlybnVtID0gdGVsbGRpcihkcyk7CisJY2xvc2VkaXIoZHMpOwogCXJldHVybiBkZTsKIH0KIAogdm9pZCBET1NfY2xvc2VkaXIoc3RydWN0IGRvc2RpcmVudCAqZGUpCiB7CiAJaWYgKGRlICYmIGRlLT5pbnVzZSkKLQl7Ci0JCWNsb3NlZGlyKGRlLT5kcyk7CiAJCWRlLT5pbnVzZSA9IDA7Ci0JfQogfQogCiBjaGFyICpET1NfR2V0UmVkaXJlY3RlZERpcihpbnQgZHJpdmUpCmRpZmYgLS1naXQgYS9taXNjL2ZpbGUuYyBiL21pc2MvZmlsZS5jCmluZGV4IDVjNWVlZTQuLmVmNDVlYzUgMTAwNjQ0Ci0tLSBhL21pc2MvZmlsZS5jCisrKyBiL21pc2MvZmlsZS5jCkBAIC03NSw3ICs3NSw3IEBACiAgIGRwcmludGZfZmlsZShzdGRkZWIsICJfbHJlYWQ6IGhhbmRsZSAlZCwgYnVmZmVyID0gJWxkLCBsZW5ndGggPSAlZFxuIiwKIAkgIAkJaEZpbGUsIChsb25nKSBscEJ1ZmZlciwgd0J5dGVzKTsKICAgCi0gIHJlc3VsdCA9IHJlYWQgKGhGaWxlLCBscEJ1ZmZlciwgd0J5dGVzKTsKKyAgcmVzdWx0ID0gd0J5dGVzID09IDAgPyAwIDogcmVhZCAoaEZpbGUsIGxwQnVmZmVyLCB3Qnl0ZXMpOwogCiAgIGlmIChyZXN1bHQgPT0gLTEpCiAgIAlyZXR1cm4gSEZJTEVfRVJST1I7CkBAIC05Myw3ICs5Myw3IEBACiAgICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIl9sd3JpdGU6IGhhbmRsZSAlZCwgYnVmZmVyID0gJWxkLCBsZW5ndGggPSAlZFxuIiwKIAkJIGhGaWxlLCAobG9uZykgbHBCdWZmZXIsIHdCeXRlcyk7CiAKLSAgICByZXN1bHQgPSB3cml0ZSAoaEZpbGUsIGxwQnVmZmVyLCB3Qnl0ZXMpOworICAgIHJlc3VsdCA9IHdCeXRlcyA9PSAwID8gMCA6IHdyaXRlIChoRmlsZSwgbHBCdWZmZXIsIHdCeXRlcyk7CiAKICAgICBpZiAocmVzdWx0ID09IC0xKQogICAgICAgICByZXR1cm4gSEZJTEVfRVJST1I7CkBAIC00MzgsMTIgKzQzOCwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIExPTkcgX2hyZWFkKElOVCBoZiwgTFBTVFIgaHB2QnVmZmVyLCBMT05HIGNiQnVmZmVyKQogewotCXJldHVybiByZWFkKGhmLCBocHZCdWZmZXIsIGNiQnVmZmVyKTsKKyAgICByZXR1cm4gY2JCdWZmZXIgPT0gMCA/IDAgOiByZWFkKGhmLCBocHZCdWZmZXIsIGNiQnVmZmVyKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBfaHdyaXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTE9ORyBfaHdyaXRlKElOVCBoZiwgTFBDU1RSIGhwdkJ1ZmZlciwgTE9ORyBjYkJ1ZmZlcikKIHsKLQlyZXR1cm4gd3JpdGUoaGYsIGhwdkJ1ZmZlciwgY2JCdWZmZXIpOworICAgIHJldHVybiBjYkJ1ZmZlciA9PSAwID8gMCA6IHdyaXRlKGhmLCBocHZCdWZmZXIsIGNiQnVmZmVyKTsKIH0KZGlmZiAtLWdpdCBhL21pc2MvbWFpbi5jIGIvbWlzYy9tYWluLmMKaW5kZXggNWFmNTVjMi4uZjVmODU0NCAxMDA2NDQKLS0tIGEvbWlzYy9tYWluLmMKKysrIGIvbWlzYy9tYWluLmMKQEAgLTIyNCw2ICsyMjQsNyBAQAogCiAjZW5kaWYKIAorI2lmbmRlZiBXSU5FTElCCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNQUlOX1BhcnNlRExMT3B0aW9ucwogICoKQEAgLTI1OCw2ICsyNTksNyBAQAogICBlbHNlCiAgICAgcmV0dXJuIFRSVUU7CiB9CisjZW5kaWYKIAogCiAKQEAgLTM0Nyw2ICszNDksNyBAQAogICAgICAgfQogCiAgICAgICBpZihNQUlOX0dldFJlc291cmNlKCBkYiwgIi5kbGwiLCAmdmFsdWUpKQorI2lmbmRlZiBXSU5FTElCCiAgICAgICAgaWYoTUFJTl9QYXJzZURMTE9wdGlvbnMoKGNoYXIqKXZhbHVlLmFkZHIpPT1GQUxTRSkKICAgICAgICB7CiAgICAgICAgICBpbnQgaTsKQEAgLTM1OSw2ICszNjIsOSBAQAogICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxuXG4iKTsKICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQorI2Vsc2UKKwkJZnByaW50ZihzdGRlcnIsIi1kbGwgbm90IHN1cHBvcnRlZCBpbiBsaWJ3aW5lXG4iKTsKKyNlbmRpZgogfQogCiAKQEAgLTU1OSw3ICs1NjUsNyBAQAogTE9ORyBHZXRXaW5GbGFncyh2b2lkKQogewogICBpZiAoT3B0aW9ucy5lbmhhbmNlZCkKLSAgICByZXR1cm4gKFdGX1NUQU5EQVJEIHwgV0ZfRU5IQU5DRUQgfCBXRl9DUFUyODYgfCBXRl9QTU9ERSB8IFdGXzgweDg3KTsKKyAgICByZXR1cm4gKFdGX1NUQU5EQVJEIHwgV0ZfRU5IQU5DRUQgfCBXRl9DUFUzODYgfCBXRl9QTU9ERSB8IFdGXzgweDg3KTsKICAgZWxzZQogICAgIHJldHVybiAoV0ZfU1RBTkRBUkQgfCBXRl9DUFUyODYgfCBXRl9QTU9ERSB8IFdGXzgweDg3KTsKIH0KZGlmZiAtLWdpdCBhL21pc2Mvb2xlMmRpc3AuYyBiL21pc2Mvb2xlMmRpc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmRiYTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzYy9vbGUyZGlzcC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICoJT0xFMkRJU1AgbGlicmFyeQorICoKKyAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCisgKi8KKworI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJvbGUyLmgiCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAibG9jYWwuaCIKKyNpbmNsdWRlICJsZHQuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKy8qIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEJTVFIgQVBJIGlzIDE2LWJpdCBvbmx5LiBJdAorICAgcmVwcmVzZW50cyBCU1RSIGFzIGEgMTY6MTYgZmFyIHBvaW50ZXIsIGFuZCB0aGUgc3RyaW5ncworICAgYXMgSVNPLTg4NTkgKi8KKwordHlwZWRlZiBEV09SRAlCU1RSOworSEdMT0JBTAlCU1RSaGVhcHNlbD0wOworI2RlZmluZSBCU1RSX0hFQVBfU0laRQk2NTUzNgorCitzdGF0aWMgQlNUUiBCU1RSX0FsbG9jQnl0ZXMoaW50IG4pCit7CisJSExPQ0FMIG1lbTsKKwlpZighQlNUUmhlYXBzZWwpCisJeworCQlCU1RSaGVhcHNlbD1HbG9iYWxBbGxvYyhHTUVNX0ZJWEVELEJTVFJfSEVBUF9TSVpFKTsKKwkJTG9jYWxJbml0KEJTVFJoZWFwc2VsLDAsQlNUUl9IRUFQX1NJWkUtMSk7CisJfQorCWlmKCFCU1RSaGVhcHNlbCkKKwkJcmV0dXJuIDA7CisJbWVtPUxPQ0FMX0FsbG9jKEJTVFJoZWFwc2VsLExNRU1fRklYRUQsbik7CisJcmV0dXJuIG1lbSA/IE1BS0VMT05HKG1lbSxCU1RSaGVhcHNlbCkgOiAwOworfQorCitzdGF0aWMgdm9pZCBCU1RSX0ZyZWUoQlNUUiBpbikKK3sKKwlMT0NBTF9GcmVlKEJTVFJoZWFwc2VsLCBMT1dPUkQoaW4pKTsKK30KKworc3RhdGljIHZvaWQqIEJTVFJfR2V0QWRkcihCU1RSIGluKQoreworCXJldHVybiBpbiA/IFBUUl9TRUdfVE9fTElOKGluKSA6IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFN5c0FsbG9jU3RyaW5nICAgICAgICAgW09MRTJESVNQLjJdCisgKi8KK0JTVFIgU3lzQWxsb2NTdHJpbmcoY2hhciAqaW4pCit7CisJQlNUUiBvdXQ9QlNUUl9BbGxvY0J5dGVzKHN0cmxlbihpbikrMSk7CisJaWYoIW91dClyZXR1cm4gMDsKKwlzdHJjcHkoQlNUUl9HZXRBZGRyKG91dCksaW4pOworCXJldHVybiBvdXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFN5c1JlQWxsb2NTdHJpbmcgICAgICAgW09MRTJESVNQLjNdCisgKi8KK2ludCBTeXNSZUFsbG9jU3RyaW5nKEJTVFIgKm9sZCxjaGFyICppbikKK3sKKwlCU1RSIG5ldz1TeXNBbGxvY1N0cmluZyhpbik7CisJQlNUUl9GcmVlKCpvbGQpOworCSpvbGQ9bmV3OworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTeXNBbGxvY1N0cmluZ0xlbiAgICAgIFtPTEUyRElTUC40XQorICovCitCU1RSIFN5c0FsbG9jU3RyaW5nTGVuKGNoYXIgKmluLCBpbnQgbGVuKQoreworCUJTVFIgb3V0PUJTVFJfQWxsb2NCeXRlcyhsZW4rMSk7CisJaWYoIW91dClyZXR1cm4gMDsKKwlzdHJjcHkoQlNUUl9HZXRBZGRyKG91dCksaW4pOworCXJldHVybiBvdXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFN5c1JlQWxsb2NTdHJpbmdMZW4gICAgW09MRTJESVNQLjVdCisgKi8KK2ludCBTeXNSZUFsbG9jU3RyaW5nTGVuKEJTVFIgKm9sZCxjaGFyICppbixpbnQgbGVuKQoreworCUJTVFIgbmV3PVN5c0FsbG9jU3RyaW5nTGVuKGluLGxlbik7CisJQlNUUl9GcmVlKCpvbGQpOworCSpvbGQ9bmV3OworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTeXNGcmVlU3RyaW5nICAgICAgICAgIFtPTEUyRElTUC42XQorICovCit2b2lkIFN5c0ZyZWVTdHJpbmcoQlNUUiBpbikKK3sKKwlCU1RSX0ZyZWUoaW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTeXNTdHJpbmdMZW4gICAgICAgICAgIFtPTEUyRElTUC43XQorICovCitpbnQgU3lzU3RyaW5nTGVuKEJTVFIgc3RyKQoreworCXJldHVybiBzdHJsZW4oQlNUUl9HZXRBZGRyKHN0cikpOworfQpkaWZmIC0tZ2l0IGEvbWlzYy9vbGUybmxzLmMgYi9taXNjL29sZTJubHMuYwppbmRleCBkZTc4NTA4Li4zZWNjYmQzIDEwMDY0NAotLS0gYS9taXNjL29sZTJubHMuYworKysgYi9taXNjL29sZTJubHMuYwpAQCAtMjM3LDcgKzIzNyw3IEBACiBMT0NWQUwoTE9DQUxFX1NEQVRFLCIuIikKIExPQ1ZBTChMT0NBTEVfU1RJTUUsIjoiKQogTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCJkZC5NTS55eXl5IikKLUxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFaSwiZGRkLCBkLiBNTU1NIHl5eXkiKQorTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsImRkZCwgZC4gTU1NTSB5eXl5IikKIC8qCiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKQogKi8KQEAgLTMyOSwzICszMjksMzUgQEAKIAlzdHJuY3B5KGJ1ZixyZXRTdHJpbmcsbGVuKTsKIAlyZXR1cm4gcmV0TGVuOwogfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENvbXBhcmVTdHJpbmdBICAgICAgIChPTEUyTkxTLjgpCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZSwgYW5kIHRydXN0cyBpbiBsaWJjCisgKi8KK2ludCBDb21wYXJlU3RyaW5nQShEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCisJY2hhciAqczEsIGludCBsMSwgY2hhciAqczIsaW50IGwyKQoreworCWludCBsZW4scmV0OworCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKKwl7CisJCWZwcmludGYoc3RkbmltcCwgIkNvbXBhcmVTdHJpbmdBOiBJR05PUkVOT05TUEFDRSBub3Qgc3VwcHJ0ZWRcbiIpOworCX0KKwlpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKKwkJZnByaW50ZihzdGRuaW1wLCAiQ29tcGFyZVN0cmluZ0E6IElHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CisJLyogSXMgc3RyY21wIGRlZmF1bHRpbmcgdG8gc3RyaW5nIHNvcnQgb3IgdG8gd29yZCBzb3J0Pz8gKi8KKwkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLworCWwxID0gKGwxPT0tMSk/c3RybGVuKHMxKTpsMTsKKwlsMiA9IChsMj09LTEpP3N0cmxlbihzMik6bDI7CisJbGVuID0gbDE8bDIgPyBsMTpsMjsKKwlyZXQgPSAoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRUNBU0UpID8KKwkJc3RybmNhc2VjbXAoczEsczIsbGVuKQk6CisJCXN0cm5jbXAoczEsczIsbGVuKTsKKwkvKiBub3QgZXF1YWwsIHJldHVybiAxIG9yIDMgKi8KKwlpZihyZXQhPTApcmV0dXJuIHJldCsyOworCS8qIHNhbWUgbGVuLCByZXR1cm4gMiAqLworCWlmKGwxPT1sMilyZXR1cm4gMjsKKwkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLworCXJldHVybiAobDE8bDIpPyAxIDogMzsKK30KKwpkaWZmIC0tZ2l0IGEvbWlzYy9wcm9maWxlLmMgYi9taXNjL3Byb2ZpbGUuYwppbmRleCA5Y2Y0YzUyLi43MWU1MzczIDEwMDY0NAotLS0gYS9taXNjL3Byb2ZpbGUuYworKysgYi9taXNjL3Byb2ZpbGUuYwpAQCAtMTg0LDYgKzE4NCw5IEBACiAJCXN0YXRlID0gSWdub3JlVG9FT0w7CiAJCWJyZWFrOwogCSAgICB9CisKKwkgICAgaWYgKGMgPT0gJ1xuJykKKwkgICAgICBicmVhazsKIAkgICAgCiAJICAgIGlmIChjID09ICc9JyB8fCBvdmVyZmxvdyl7CiAJCVRLZXlzICp0ZW1wOwpAQCAtMTk3LDggKzIwMCw5IEBACiAJCXN0YXRlID0gS2V5VmFsdWU7CiAJCW5leHQgPSBDaGFyQnVmZmVyOwogCQlkcHJpbnRmX3Byb2ZpbGUoc3RkZGViLCIlczogICBrZXkgJXNcbiIsIGZpbGUsIENoYXJCdWZmZXIpOwotCSAgICB9IGVsc2UKKwkgICAgfSBlbHNlIHsKIAkJKm5leHQrKyA9IGM7CisJICAgIH0KIAkgICAgYnJlYWs7CiAKIAljYXNlIEtleVZhbHVlOgpAQCAtMjkzLDYgKzI5Nyw3IEBACiAJICAgIH0KIAkgICAgUmV0dXJuZWRTdHJpbmcgW1NpemUtMV0gPSAwOwogCSAgICBzdHJuY3B5IChSZXR1cm5lZFN0cmluZywga2V5LT5WYWx1ZSwgU2l6ZS0xKTsKKwkgICAgZHByaW50Zl9wcm9maWxlKHN0ZGRlYiwiR2V0U2V0UHJvZmlsZSAvLyBSZXR1cm4gYGAlcycnXG4iLCBSZXR1cm5lZFN0cmluZyk7CiAJICAgIHJldHVybiAxOyAKIAl9CiAJLyogSWYgR2V0dGluZyB0aGUgaW5mb3JtYXRpb24sIHRoZW4gZG9uJ3Qgd3JpdGUgdGhlIGluZm9ybWF0aW9uCkBAIC0zMDMsNiArMzA4LDcgQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBSZXR1cm5lZFN0cmluZyBbU2l6ZS0xXSA9IDA7CiAgICAgICAgICAgICBzdHJuY3B5IChSZXR1cm5lZFN0cmluZywgRGVmYXVsdCwgU2l6ZS0xKTsKKwkgICAgZHByaW50Zl9wcm9maWxlKHN0ZGRlYiwiR2V0U2V0UHJvZmlsZSAvLyBLZXkgbm90IGZvdW5kXG4iKTsKIAl9CiAJcmV0dXJuIDE7CiAgICAgfQpAQCAtMzE4LDYgKzMyNCw3IEBACiAgICAgfSBlbHNlIHsKIAlSZXR1cm5lZFN0cmluZyBbU2l6ZS0xXSA9IDA7CiAJc3RybmNweSAoUmV0dXJuZWRTdHJpbmcsIERlZmF1bHQsIFNpemUtMSk7CisJZHByaW50Zl9wcm9maWxlKHN0ZGRlYiwiR2V0U2V0UHJvZmlsZSAvLyBTZWN0aW9uIG5vdCBmb3VuZFxuIik7CiAgICAgfQogICAgIHJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbC5jIGIvbWlzYy9zaGVsbC5jCmluZGV4IDVlZjY5MmMuLmViZGZkOTEgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGwuYworKysgYi9taXNjL3NoZWxsLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJkbGdzLmgiCiAjaW5jbHVkZSAiZGlhbG9nLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfUkVHICovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogTFBLRVlTVFJVQ1QJbHBoUm9vdEtleSA9IE5VTEwsbHBoVG9wS2V5ID0gTlVMTDsKQEAgLTE4NSw3ICsxODQsNyBAQAogTE9ORyBSZWdDbG9zZUtleShIS0VZIGhLZXkpCiB7CiAJZHByaW50Zl9yZWcoc3RkbmltcCwgIkVNUFRZIFNUVUIgISEhIFJlZ0Nsb3NlS2V5KCUwOGxYKTtcbiIsIGhLZXkpOwotCXJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKwlyZXR1cm4gRVJST1JfU1VDQ0VTUzsKIH0KIAogCkBAIC0xOTYsNyArMTk1LDcgQEAKIHsKIAlkcHJpbnRmX3JlZyhzdGRuaW1wLCAiRU1QVFkgU1RVQiAhISEgUmVnRGVsZXRlS2V5KCUwOGxYLCAnJXMnKTtcbiIsIAogCQkJCQkJCQkJCQkJaEtleSwgbHBTdWJLZXkpOwotCXJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKwlyZXR1cm4gRVJST1JfU1VDQ0VTUzsKIH0KIAogCkBAIC0yMDQsMjkgKzIwMywyOSBAQAogICoJCQkJUmVnU2V0VmFsdWUJCVtTSEVMTC41XQogICovCiBMT05HIFJlZ1NldFZhbHVlKEhLRVkgaEtleSwgTFBDU1RSIGxwU3ViS2V5LCBEV09SRCBkd1R5cGUsIAotCQkJCQlMUENTVFIgbHBWYWwsIERXT1JEIGR3SWdub3JlZCkKKwkJIExQQ1NUUiBscFZhbCwgRFdPUkQgZHdJZ25vcmVkKQogewotCUhLRVkJCWhSZXRLZXk7Ci0JTFBLRVlTVFJVQ1QJbHBLZXk7Ci0JTE9ORwkJZHdSZXQ7Ci0JZHByaW50Zl9yZWcoc3RkZGViLCAiUmVnU2V0VmFsdWUoJTA4bFgsICclcycsICUwOGxYLCAnJXMnLCAlMDhsWCk7XG4iLAotCQkJCQkJaEtleSwgbHBTdWJLZXksIGR3VHlwZSwgbHBWYWwsIGR3SWdub3JlZCk7Ci0JaWYgKGxwU3ViS2V5ID09IE5VTEwpIHJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLQlpZiAobHBWYWwgPT0gTlVMTCkgcmV0dXJuIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotCWlmICgoZHdSZXQgPSBSZWdPcGVuS2V5KGhLZXksIGxwU3ViS2V5LCAmaFJldEtleSkpICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkgICAgICAgIGRwcmludGZfcmVnKHN0ZGRlYiwgIlJlZ1NldFZhbHVlIC8vIGtleSBub3QgZm91bmQgLi4uIHNvIGNyZWF0ZSBpdCAhXG4iKTsKLQkJaWYgKChkd1JldCA9IFJlZ0NyZWF0ZUtleShoS2V5LCBscFN1YktleSwgJmhSZXRLZXkpKSAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlJlZ1NldFZhbHVlIC8vIGtleSBjcmVhdGlvbiBlcnJvciAlMDhsWCAhXG4iLCBkd1JldCk7Ci0JCQlyZXR1cm4gZHdSZXQ7Ci0JCQl9Ci0JCX0KLQlscEtleSA9IChMUEtFWVNUUlVDVClHbG9iYWxMb2NrKGhSZXRLZXkpOwotCWlmIChscEtleSA9PSBOVUxMKSByZXR1cm4gRVJST1JfQkFES0VZOwotCWlmIChscEtleS0+bHBWYWx1ZSAhPSBOVUxMKSBmcmVlKGxwS2V5LT5scFZhbHVlKTsKLQlscEtleS0+bHBWYWx1ZSA9IG1hbGxvYyhzdHJsZW4obHBWYWwpICsgMSk7Ci0Jc3RyY3B5KGxwS2V5LT5scFZhbHVlLCBscFZhbCk7Ci0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZSAvLyBzdWNjZXNzZnVsIGtleT0nJXMnIHZhbD0nJXMnICFcbiIsIGxwU3ViS2V5LCBscEtleS0+bHBWYWx1ZSk7Ci0JcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CisgICAgSEtFWSAgICAgICAJaFJldEtleTsKKyAgICBMUEtFWVNUUlVDVAlscEtleTsKKyAgICBMT05HICAgICAgIAlkd1JldDsKKyAgICBkcHJpbnRmX3JlZyhzdGRkZWIsICJSZWdTZXRWYWx1ZSglMDhsWCwgJyVzJywgJTA4bFgsICclcycsICUwOGxYKTtcbiIsCisJCWhLZXksIGxwU3ViS2V5LCBkd1R5cGUsIGxwVmFsLCBkd0lnbm9yZWQpOworICAgIGlmIChscFN1YktleSA9PSBOVUxMKSByZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgaWYgKGxwVmFsID09IE5VTEwpIHJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICBpZiAoKGR3UmV0ID0gUmVnT3BlbktleShoS2V5LCBscFN1YktleSwgJmhSZXRLZXkpKSAhPSBFUlJPUl9TVUNDRVNTKSB7CisJZHByaW50Zl9yZWcoc3RkZGViLCAiUmVnU2V0VmFsdWUgLy8ga2V5IG5vdCBmb3VuZCAuLi4gc28gY3JlYXRlIGl0ICFcbiIpOworCWlmICgoZHdSZXQgPSBSZWdDcmVhdGVLZXkoaEtleSwgbHBTdWJLZXksICZoUmV0S2V5KSkgIT0gRVJST1JfU1VDQ0VTUykgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIlJlZ1NldFZhbHVlIC8vIGtleSBjcmVhdGlvbiBlcnJvciAlMDhsWCAhXG4iLCBkd1JldCk7CisJICAgIHJldHVybiBkd1JldDsKKwl9CisgICAgfQorICAgIGxwS2V5ID0gKExQS0VZU1RSVUNUKUdsb2JhbExvY2soaFJldEtleSk7CisgICAgaWYgKGxwS2V5ID09IE5VTEwpIHJldHVybiBFUlJPUl9CQURLRVk7CisgICAgaWYgKGxwS2V5LT5scFZhbHVlICE9IE5VTEwpIGZyZWUobHBLZXktPmxwVmFsdWUpOworICAgIGxwS2V5LT5scFZhbHVlID0gbWFsbG9jKHN0cmxlbihscFZhbCkgKyAxKTsKKyAgICBzdHJjcHkobHBLZXktPmxwVmFsdWUsIGxwVmFsKTsKKyAgICBkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlIC8vIHN1Y2Nlc3NmdWwga2V5PSclcycgdmFsPSclcycgIVxuIiwgbHBTdWJLZXksIGxwS2V5LT5scFZhbHVlKTsKKyAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKIH0KIAogCkBAIC0yNDksNyArMjQ4LDcgQEAKIAlpZiAoKGR3UmV0ID0gUmVnT3BlbktleShoS2V5LCBscFN1YktleSwgJmhSZXRLZXkpKSAhPSBFUlJPUl9TVUNDRVNTKSB7CiAJCWZwcmludGYoc3RkZXJyLCAiUmVnUXVlcnlWYWx1ZSAvLyBrZXkgbm90IGZvdW5kICFcbiIpOwogCQlyZXR1cm4gZHdSZXQ7Ci0JCX0KKwl9CiAJbHBLZXkgPSAoTFBLRVlTVFJVQ1QpR2xvYmFsTG9jayhoUmV0S2V5KTsKIAlpZiAobHBLZXkgPT0gTlVMTCkgcmV0dXJuIEVSUk9SX0JBREtFWTsKIAlpZiAobHBLZXktPmxwVmFsdWUgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWlzYy91c2VyLmMgYi9taXNjL3VzZXIuYwppbmRleCA5ZTAzMzNmLi44NmEwOWY1IDEwMDY0NAotLS0gYS9taXNjL3VzZXIuYworKysgYi9taXNjL3VzZXIuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjZGVmaW5lIFVTRVJfSEVBUF9TSVpFICAgICAgICAgIDB4MTAwMDAKIAorI2lmbmRlZiBXSU5FTElCCiBMUFNUUiBVU0VSX0hlYXAgPSBOVUxMOwogV09SRCBVU0VSX0hlYXBTZWwgPSAwOwogCkBAIC03Myw3ICs3NCw2IEBACiB9CiAKIAotI2lmbmRlZiBXSU5FTElCCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBVU0VSX0hlYXBJbml0CiAgKi8KZGlmZiAtLWdpdCBhL21pc2NlbXUvaW5zdHIuYyBiL21pc2NlbXUvaW5zdHIuYwppbmRleCBiMmVmNjdiLi5iMDI1NDUyIDEwMDY0NAotLS0gYS9taXNjZW11L2luc3RyLmMKKysrIGIvbWlzY2VtdS9pbnN0ci5jCkBAIC05OCw2ICs5OCwxMCBAQAogICAgICAgICBjYXNlIDB4Njc6CiAgICAgICAgICAgICBsb25nX2FkZHIgPSAhbG9uZ19hZGRyOyAgLyogYWRkciBzaXplIHByZWZpeCAqLwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhmMDogIC8qIGxvY2sgKi8KKyAgICAgICAgY2FzZSAweGYyOiAgLyogcmVwbmUgKi8KKyAgICAgICAgY2FzZSAweGYzOiAgLyogcmVwZSAqLworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBwcmVmaXggPSAwOyAgLyogbm8gbW9yZSBwcmVmaXhlcyAqLwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTUsNiArMTE5LDcgQEAKICAgICB7CiAgICAgICBjYXNlIDB4Y2Q6IC8qIGludCA8WFg+ICovCiAgICAgICAgICAgICBpbnN0cisrOworICAgICAgICAgICAgLyogRklYTUU6IHNob3VsZCBjaGVjayBpZiBoYW5kbGVyIGhhcyBiZWVuIGNoYW5nZWQgKi8KIAkgICAgaWYgKCFkb19pbnQoKmluc3RyLCBjb250ZXh0KSkKICAgICAgICAgICAgIHsKIAkJZnByaW50ZihzdGRlcnIsIlVuZXhwZWN0ZWQgV2luZG93cyBpbnRlcnJ1cHQgJXhcbiIsICppbnN0cik7CmRpZmYgLS1naXQgYS9taXNjZW11L2ludDIxLmMgYi9taXNjZW11L2ludDIxLmMKaW5kZXggMTAyMjZiOC4uMDc4ZjM0ZSAxMDA2NDQKLS0tIGEvbWlzY2VtdS9pbnQyMS5jCisrKyBiL21pc2NlbXUvaW50MjEuYwpAQCAtNDM3LDcgKzQzNyw4IEBACiAJCWRyaXZlID0gQkwgLSAxOwogCiAJaWYgKCFET1NfVmFsaWREcml2ZShkcml2ZSkpIHsKLQkJQVggPSAweDAyOwkJCQkKKyAgICAgICAgICAgICAgICBFcnJvciggRmlsZU5vdEZvdW5kLCBFQ19Ob3RGb3VuZCwgRUxfRGlzayApOworICAgICAgICAgICAgICAgIEFYID0gRmlsZU5vdEZvdW5kOwogCQlTZXRDZmxhZzsKIAkJcmV0dXJuOwogCX0KQEAgLTUwMiw3ICs1MDMsNyBAQAogewogCUFYID0gRXh0ZW5kZWRFcnJvcjsKIAlCWCA9IChFcnJvckNsYXNzIDw8IDgpIHwgQWN0aW9uOwotCUNIID0gRXJyb3JMb2N1cyA8PCA4OworCUNIID0gRXJyb3JMb2N1czsKIH0KIAogc3RhdGljIHZvaWQgQ3JlYXRlRmlsZShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCkBAIC02NTYsMTUgKzY1NywxNyBAQAogCWRwcmludGZfaW50KHN0ZGRlYiwiaW50MjE6IG1ha2VkaXIgJXNcbiIsIChjaGFyICopUFRSX1NFR19PRkZfVE9fTElOKERTLERYKSApOwogCQogCWlmICgoZGlybmFtZSA9IERPU19HZXRVbml4RmlsZU5hbWUoIFBUUl9TRUdfT0ZGX1RPX0xJTihEUyxEWCkgKSk9PSBOVUxMKSB7Ci0JCUFYID0gQ2FuTm90TWFrZURpcjsKLQkJU2V0Q2ZsYWc7Ci0JCXJldHVybjsKKyAgICAgICAgICAgIEVycm9yKCBDYW5Ob3RNYWtlRGlyLCBFQ19BY2Nlc3NEZW5pZWQsIEVMX0Rpc2sgKTsKKyAgICAgICAgICAgIEFYID0gQ2FuTm90TWFrZURpcjsKKyAgICAgICAgICAgIFNldENmbGFnOworICAgICAgICAgICAgcmV0dXJuOwogCX0KIAogCWlmIChta2RpcihkaXJuYW1lLDApID09IC0xKSB7Ci0JCUFYID0gQ2FuTm90TWFrZURpcjsKLQkJU2V0Q2ZsYWc7Ci0JCXJldHVybjsKKyAgICAgICAgICAgIEVycm9yKCBDYW5Ob3RNYWtlRGlyLCBFQ19BY2Nlc3NEZW5pZWQsIEVMX0Rpc2sgKTsKKyAgICAgICAgICAgIEFYID0gQ2FuTm90TWFrZURpcjsKKyAgICAgICAgICAgIFNldENmbGFnOworICAgICAgICAgICAgcmV0dXJuOwogCX0KIAlSZXNldENmbGFnOwogfQpAQCAtNjkzLDkgKzY5NiwxMCBAQAogCWRwcmludGZfaW50KHN0ZGRlYiwiaW50MjE6IHJlbW92ZWRpciAlc1xuIiwgKGNoYXIgKilQVFJfU0VHX09GRl9UT19MSU4oRFMsRFgpICk7CiAKIAlpZiAoKGRpcm5hbWUgPSBET1NfR2V0VW5peEZpbGVOYW1lKCBQVFJfU0VHX09GRl9UT19MSU4oRFMsRFgpICkpPT0gTlVMTCkgewotCQlBWCA9IFBhdGhOb3RGb3VuZDsKLQkJU2V0Q2ZsYWc7Ci0JCXJldHVybjsKKyAgICAgICAgICAgIEVycm9yKCBQYXRoTm90Rm91bmQsIEVDX05vdEZvdW5kLCBFTF9EaXNrICk7CisgICAgICAgICAgICBBWCA9IFBhdGhOb3RGb3VuZDsKKyAgICAgICAgICAgIFNldENmbGFnOworICAgICAgICAgICAgcmV0dXJuOwogCX0KIAogLyoKQEAgLTcwNSw5ICs3MDksMTAgQEAKIAl9CiAqLwkKIAlpZiAocm1kaXIoZGlybmFtZSkgPT0gLTEpIHsKLQkJQVggPSBBY2Nlc3NEZW5pZWQ7Ci0JCVNldENmbGFnOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIEVycm9yKCBBY2Nlc3NEZW5pZWQsIEVDX0FjY2Vzc0RlbmllZCwgRUxfRGlzayApOworICAgICAgICAgICAgQVggPSBBY2Nlc3NEZW5pZWQ7CisgICAgICAgICAgICBTZXRDZmxhZzsKKyAgICAgICAgICAgIHJldHVybjsKIAl9IAogCVJlc2V0Q2ZsYWc7CiB9CkBAIC04MzksOSArODQ0LDEwIEBACiAJaGFuZGxlID0gb3BlbihET1NfR2V0VW5peEZpbGVOYW1lKHRlbXApLCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fUkRXUik7CiAKIAlpZiAoaGFuZGxlID09IC0xKSB7Ci0JCUFYID0gV3JpdGVQcm90ZWN0ZWQ7Ci0JCVNldENmbGFnOwotCQlyZXR1cm47CisgICAgICAgICAgICBFcnJvciggV3JpdGVQcm90ZWN0ZWQsIEVDX0FjY2Vzc0RlbmllZCwgRUxfRGlzayApOworICAgICAgICAgICAgQVggPSBXcml0ZVByb3RlY3RlZDsKKyAgICAgICAgICAgIFNldENmbGFnOworICAgICAgICAgICAgcmV0dXJuOwogCX0KIAogCXN0cmNweShQVFJfU0VHX09GRl9UT19MSU4oRFMsRFgpLCB0ZW1wKTsKQEAgLTg1NSw5ICs4NjEsMTAgQEAKIAlpbnQgaGFuZGxlOwogCQogCWlmICgoaGFuZGxlID0gb3BlbihET1NfR2V0VW5peEZpbGVOYW1lKCBQVFJfU0VHX09GRl9UT19MSU4oRFMsRFgpICksIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1JEV1IpKSA9PSAtMSkgewotCQlBWCA9IFdyaXRlUHJvdGVjdGVkOwotCQlTZXRDZmxhZzsKLQkJcmV0dXJuOworICAgICAgICAgICAgRXJyb3IoIFdyaXRlUHJvdGVjdGVkLCBFQ19BY2Nlc3NEZW5pZWQsIEVMX0Rpc2sgKTsKKyAgICAgICAgICAgIEFYID0gV3JpdGVQcm90ZWN0ZWQ7CisgICAgICAgICAgICBTZXRDZmxhZzsKKyAgICAgICAgICAgIHJldHVybjsKIAl9CiAKIAlBWCA9IGhhbmRsZTsKQEAgLTg3NCw5ICs4ODEsMTAgQEAKIAkJZHJpdmUgPSBETCAtIDE7CiAKIAlpZiAoIURPU19WYWxpZERyaXZlKGRyaXZlKSkgewotCQlBWCA9IEludmFsaWREcml2ZTsKLQkJU2V0Q2ZsYWc7Ci0JCXJldHVybjsKKyAgICAgICAgICAgIEVycm9yKCBJbnZhbGlkRHJpdmUsIEVDX05vdEZvdW5kLCBFTF9EaXNrICk7CisgICAgICAgICAgICBBWCA9IEludmFsaWREcml2ZTsKKyAgICAgICAgICAgIFNldENmbGFnOworICAgICAgICAgICAgcmV0dXJuOwogCX0KIAogCXN0cmNweShQVFJfU0VHX09GRl9UT19MSU4oRFMsU0kpLCBET1NfR2V0Q3VycmVudERpcihkcml2ZSkgKTsKQEAgLTg5NSw5ICs5MDMsMTAgQEAKIAkJZHJpdmUgPSBCTCAtIDE7CiAKIAlpZiAoIURPU19WYWxpZERyaXZlKGRyaXZlKSkgewotCQlBWCA9SW52YWxpZERyaXZlOwotCQlTZXRDZmxhZzsKLQkJcmV0dXJuOworICAgICAgICAgICAgRXJyb3IoIEludmFsaWREcml2ZSwgRUNfTm90Rm91bmQsIEVMX0Rpc2sgKTsKKyAgICAgICAgICAgIEFYID0gSW52YWxpZERyaXZlOworICAgICAgICAgICAgU2V0Q2ZsYWc7CisgICAgICAgICAgICByZXR1cm47CiAJfQogCiAJRE9TX0dldFNlcmlhbE51bWJlcihkcml2ZSwgJnNlcmlhbG51bWJlcik7CkBAIC05MjMsOSArOTMyLDEwIEBACiAJCWRyaXZlID0gQkwgLSAxOwogCiAJaWYgKCFET1NfVmFsaWREcml2ZShkcml2ZSkpIHsKLQkJQVggPSBJbnZhbGlkRHJpdmU7Ci0JCVNldENmbGFnOwotCQlyZXR1cm47CisgICAgICAgICAgICBFcnJvciggSW52YWxpZERyaXZlLCBFQ19Ob3RGb3VuZCwgRUxfRGlzayApOworICAgICAgICAgICAgQVggPSBJbnZhbGlkRHJpdmU7CisgICAgICAgICAgICBTZXRDZmxhZzsKKyAgICAgICAgICAgIHJldHVybjsKIAl9CiAKIAlzZXJpYWxudW1iZXIgPSBkYXRhcHRyWzFdICsgKGRhdGFwdHJbMl0gPDwgOCkgKyAoZGF0YXB0clszXSA8PCAxNikgKyAKQEAgLTE0NzcsOCArMTQ4Nyw5IEBACiAgICAgICAgICAgICAgICAgZHJpdmUgPSBCTCA/IChCTCAtIDEpIDogRE9TX0dldERlZmF1bHREcml2ZSgpOwogICAgICAgICAgICAgICAgIGlmKCFET1NfVmFsaWREcml2ZShkcml2ZSkpCiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFcnJvciggSW52YWxpZERyaXZlLCBFQ19Ob3RGb3VuZCwgRUxfRGlzayApOworICAgICAgICAgICAgICAgICAgICBBWCA9IEludmFsaWREcml2ZTsKICAgICAgICAgICAgICAgICAgICAgU2V0Q2ZsYWc7Ci0gICAgICAgICAgICAgICAgICAgIEFYID0gMHgwMDBGOyAgICAgICAgLyogQmFkIGRyaXZlIG51bWJlciAqLwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewpAQCAtMTQ5NCw4ICsxNTA1LDkgQEAKICAgICAgICAgICAgICAgICBkcml2ZSA9IEJMID8gKEJMIC0gMSkgOiBET1NfR2V0RGVmYXVsdERyaXZlKCk7CiAgICAgICAgICAgICAgICAgaWYoIURPU19WYWxpZERyaXZlKGRyaXZlKSkKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVycm9yKCBJbnZhbGlkRHJpdmUsIEVDX05vdEZvdW5kLCBFTF9EaXNrICk7CisgICAgICAgICAgICAgICAgICAgIEFYID0gSW52YWxpZERyaXZlOwogICAgICAgICAgICAgICAgICAgICBTZXRDZmxhZzsKLSAgICAgICAgICAgICAgICAgICAgQVggPSAweDAwMEY7ICAgICAgICAvKiBCYWQgZHJpdmUgbnVtYmVyICovCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9taXNjZW11L2ludDVjLmMgYi9taXNjZW11L2ludDVjLmMKaW5kZXggMDYwZGE3Ni4uMGJkMWZkMSAxMDA2NDQKLS0tIGEvbWlzY2VtdS9pbnQ1Yy5jCisrKyBiL21pc2NlbXUvaW50NWMuYwpAQCAtNCwxMiArNCwxMiBAQAogICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2luY2x1ZGUgIm1pc2NlbXUuaCIKLSNpbmNsdWRlICJyZWdpc3RlcnMuaCIKICNpbmNsdWRlICJ3aW5lLmgiCisjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX0lOVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9vYmplY3RzL2JpdGJsdC5jIGIvb2JqZWN0cy9iaXRibHQuYwppbmRleCAxMmY4MTY3Li4zODA3NGRiIDEwMDY0NAotLS0gYS9vYmplY3RzL2JpdGJsdC5jCisrKyBiL29iamVjdHMvYml0Ymx0LmMKQEAgLTEwMzQsNiArMTAzNCwxNiBAQAogICAgIHlEc3QgICAgICA9IGRjRHN0LT53LkRDT3JnWSArIFlMUFRPRFAoIGRjRHN0LCB5RHN0ICk7CiAgICAgd2lkdGhEc3QgID0gd2lkdGhEc3QgKiBkY0RzdC0+dy5WcG9ydEV4dFggLyBkY0RzdC0+dy5XbmRFeHRYOwogICAgIGhlaWdodERzdCA9IGhlaWdodERzdCAqIGRjRHN0LT53LlZwb3J0RXh0WSAvIGRjRHN0LT53LlduZEV4dFk7CisKKyAgICBkcHJpbnRmX2JpdGJsdCggc3RkZGViLCAiICAgIHZwb3J0ZHN0PSVkLCVkLSVkLCVkIHduZGRzdD0lZCwlZC0lZCwlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBkY0RzdC0+dy5WcG9ydE9yZ1gsIGRjRHN0LT53LlZwb3J0T3JnWSwKKyAgICAgICAgICAgICAgICAgICBkY0RzdC0+dy5WcG9ydEV4dFgsIGRjRHN0LT53LlZwb3J0RXh0WSwKKyAgICAgICAgICAgICAgICAgICBkY0RzdC0+dy5XbmRPcmdYLCBkY0RzdC0+dy5XbmRPcmdZLAorICAgICAgICAgICAgICAgICAgIGRjRHN0LT53LlduZEV4dFgsIGRjRHN0LT53LlduZEV4dFkgKTsKKyAgICBkcHJpbnRmX2JpdGJsdCggc3RkZGViLCAiICAgIHJlY3Rkc3Q9JWQsJWQtJWQsJWQgb3JnZHN0PSVkLCVkXG4iLAorICAgICAgICAgICAgICAgICAgICB4RHN0LCB5RHN0LCB3aWR0aERzdCwgaGVpZ2h0RHN0LAorICAgICAgICAgICAgICAgICAgICBkY0RzdC0+dy5EQ09yZ1gsIGRjRHN0LT53LkRDT3JnWSApOworCiAgICAgaWYgKHVzZVNyYykKICAgICB7CiAgICAgICAgIHhTcmMgICAgICA9IGRjU3JjLT53LkRDT3JnWCArIFhMUFRPRFAoIGRjU3JjLCB4U3JjICk7CkBAIC0xMDQxLDEwICsxMDUxLDIzIEBACiAgICAgICAgIHdpZHRoU3JjICA9IHdpZHRoU3JjICogZGNTcmMtPncuVnBvcnRFeHRYIC8gZGNTcmMtPncuV25kRXh0WDsKICAgICAgICAgaGVpZ2h0U3JjID0gaGVpZ2h0U3JjICogZGNTcmMtPncuVnBvcnRFeHRZIC8gZGNTcmMtPncuV25kRXh0WTsKICAgICAgICAgZlN0cmV0Y2ggID0gKHdpZHRoU3JjICE9IHdpZHRoRHN0KSB8fCAoaGVpZ2h0U3JjICE9IGhlaWdodERzdCk7CisgICAgICAgIGRwcmludGZfYml0Ymx0KCBzdGRkZWIsIiAgICB2cG9ydHNyYz0lZCwlZC0lZCwlZCB3bmRzcmM9JWQsJWQtJWQsJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkY1NyYy0+dy5WcG9ydE9yZ1gsIGRjU3JjLT53LlZwb3J0T3JnWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRjU3JjLT53LlZwb3J0RXh0WCwgZGNTcmMtPncuVnBvcnRFeHRZLAorICAgICAgICAgICAgICAgICAgICAgICAgZGNTcmMtPncuV25kT3JnWCwgZGNTcmMtPncuV25kT3JnWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRjU3JjLT53LlduZEV4dFgsIGRjU3JjLT53LlduZEV4dFkgKTsKKyAgICAgICAgZHByaW50Zl9iaXRibHQoIHN0ZGRlYiwgIiAgICByZWN0c3JjPSVkLCVkLSVkLCVkIG9yZ3NyYz0lZCwlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHhTcmMsIHlTcmMsIHdpZHRoU3JjLCBoZWlnaHRTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBkY1NyYy0+dy5EQ09yZ1gsIGRjU3JjLT53LkRDT3JnWSApOwogICAgICAgICBpZiAoIUJJVEJMVF9HZXRWaXNSZWN0YW5nbGVzKCBkY0RzdCwgeERzdCwgeURzdCwgd2lkdGhEc3QsIGhlaWdodERzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNTcmMsIHhTcmMsIHlTcmMsIHdpZHRoU3JjLCBoZWlnaHRTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aXNSZWN0U3JjLCAmdmlzUmVjdERzdCApKQogICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIGRwcmludGZfYml0Ymx0KCBzdGRkZWIsICIgICAgdmlzc3JjPSVkLCVkLSVkLCVkIHZpc2RzdD0lZCwlZC0lZCwlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpc1JlY3RTcmMubGVmdCwgdmlzUmVjdFNyYy50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLnJpZ2h0LCB2aXNSZWN0U3JjLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpc1JlY3REc3QubGVmdCwgdmlzUmVjdERzdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0RHN0LnJpZ2h0LCB2aXNSZWN0RHN0LmJvdHRvbSApOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMTA1Miw2ICsxMDc1LDkgQEAKICAgICAgICAgaWYgKCFCSVRCTFRfR2V0VmlzUmVjdGFuZ2xlcyggZGNEc3QsIHhEc3QsIHlEc3QsIHdpZHRoRHN0LCBoZWlnaHREc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwsICZ2aXNSZWN0RHN0ICkpCiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgZHByaW50Zl9iaXRibHQoIHN0ZGRlYiwgIiAgICB2aXNzcmM9bm9uZSB2aXNkc3Q9JWQsJWQtJWQsJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0RHN0LmxlZnQsIHZpc1JlY3REc3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdERzdC5yaWdodCwgdmlzUmVjdERzdC5ib3R0b20gKTsKICAgICB9CiAKICAgICB3aWR0aCAgPSB2aXNSZWN0RHN0LnJpZ2h0IC0gdmlzUmVjdERzdC5sZWZ0OwpAQCAtMTI0MCwxMiArMTI2Niw3IEBACiAgICAgICAgICAgICAgICAgIkJpdEJsdDogJTA0eCAlZCwlZCAlZCBicHAgLT4gJTA0eCAlZCwlZCAlZHglZHglZCByb3A9JTA2bHhcbiIsCiAgICAgICAgICAgICAgICAgaGRjU3JjLCB4U3JjLCB5U3JjLCBkY1NyYyA/IGRjU3JjLT53LmJpdHNQZXJQaXhlbCA6IDAsCiAgICAgICAgICAgICAgICAgaGRjRHN0LCB4RHN0LCB5RHN0LCB3aWR0aCwgaGVpZ2h0LCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwsIHJvcCk7Ci0gICAgaWYgKGRjU3JjICE9IE5VTEwpIHsKLQlkcHJpbnRmX2JpdGJsdChzdGRkZWIsIiAgICAgICAgc3JjIG9yZz0lZCwlZCIsCi0JCSAgICAgICBkY1NyYy0+dy5EQ09yZ1gsIGRjU3JjLT53LkRDT3JnWSk7Ci0gICAgfQotICAgIGRwcmludGZfYml0Ymx0KHN0ZGRlYiwiICBkc3Qgb3JnPSVkLCVkXG4iLCBkY0RzdC0+dy5EQ09yZ1gsIAotCQkgICBkY0RzdC0+dy5EQ09yZ1kpOworCiAgICAgcmV0dXJuIENhbGxUbzMyX0xhcmdlU3RhY2soIChpbnQoKikoKSlCSVRCTFRfSW50ZXJuYWxTdHJldGNoQmx0LCAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNEc3QsIHhEc3QsIHlEc3QsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjU3JjLCB4U3JjLCB5U3JjLCB3aWR0aCwgaGVpZ2h0LCByb3AgKTsKZGlmZiAtLWdpdCBhL29iamVjdHMvZGliLmMgYi9vYmplY3RzL2RpYi5jCmluZGV4IDM0YTIwMmYuLjc4YWIxZWUgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGliLmMKKysrIGIvb2JqZWN0cy9kaWIuYwpAQCAtNTQxLDkgKzU0MSwxOSBAQAogCVdPUkQgeFNyYywgV09SRCB5U3JjLCBXT1JEIHdTcmNXaWR0aCwgV09SRCB3U3JjSGVpZ2h0LAogCUxQU1RSIGJpdHMsIExQQklUTUFQSU5GTyBpbmZvLCBXT1JEIHdVc2FnZSwgRFdPUkQgZHdSb3AgKQogewotCXByaW50ZigiU3RyZXRjaERJQml0cyAvLyBjYWxsIFNldERJQml0c1RvRGV2aWNlIGZvciBub3cgISEhIVxuIik7Ci0JcmV0dXJuIFNldERJQml0c1RvRGV2aWNlKGhkYywgeERlc3QsIHlEZXN0LCB3RGVzdFdpZHRoLCB3RGVzdEhlaWdodCwKLQkJeFNyYywgeVNyYywgMSwgMSwgYml0cywgaW5mbywgd1VzYWdlKTsKKyAgICBIQklUTUFQIGhCaXRtYXAsIGhPbGRCaXRtYXA7CisgICAgSERDIGhkY01lbTsKKworICAgIGhCaXRtYXAgPSBDcmVhdGVESUJpdG1hcCggaGRjLCAmaW5mby0+Ym1pSGVhZGVyLCBDQk1fSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMsIGluZm8sIHdVc2FnZSApOworICAgIGhkY01lbSA9IENyZWF0ZUNvbXBhdGlibGVEQyggaGRjICk7CisgICAgaE9sZEJpdG1hcCA9IFNlbGVjdE9iamVjdCggaGRjTWVtLCBoQml0bWFwICk7CisgICAgU3RyZXRjaEJsdCggaGRjLCB4RGVzdCwgeURlc3QsIHdEZXN0V2lkdGgsIHdEZXN0SGVpZ2h0LAorICAgICAgICAgICAgICAgIGhkY01lbSwgeFNyYywgeVNyYywgd1NyY1dpZHRoLCB3U3JjSGVpZ2h0LCBkd1JvcCApOworICAgIFNlbGVjdE9iamVjdCggaGRjTWVtLCBoT2xkQml0bWFwICk7CisgICAgRGVsZXRlREMoIGhkY01lbSApOworICAgIERlbGV0ZU9iamVjdCggaEJpdG1hcCApOworICAgIHJldHVybiB3U3JjSGVpZ2h0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL29iamVjdHMvZm9udC5jIGIvb2JqZWN0cy9mb250LmMKaW5kZXggNTcwNzlmMC4uYmU5MjcwNyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9mb250LmMKKysrIGIvb2JqZWN0cy9mb250LmMKQEAgLTI1OSw2ICsyNTksMzQgQEAKICAgICBtZXRyaWNzLT50bUF2ZUNoYXJXaWR0aCA9IGF2ZXJhZ2U7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEdseXBoT3V0TGluZSAgICAoR0RJLjMwOSkKKyAqLworRFdPUkQgR2V0R2x5cGhPdXRMaW5lKAorCUhEQyBoZGMsIFVJTlQgdUNoYXIsIFVJTlQgZnVGb3JtYXQsIExQR0xZUEhNRVRSSUNTIGxwZ20sIAorCURXT1JEIGNiQnVmZmVyLCBMUFNUUiBscEJ1ZmZlciwgTFBNQVQyIGxwbWF0MgorKSB7CisJZHByaW50Zl9mb250KHN0ZG5pbXAsIkdldEdseXBoT3V0TGluZSgweCV4LCAnJWMnLCAweCV4LCAlcCwgJWQsICVwLCAlcCkgLy8gLSBlbXB0eSBzdHViIVxuIiwKKwkJaGRjLHVDaGFyLGZ1Rm9ybWF0LGxwZ20sY2JCdWZmZXIsbHBCdWZmZXIsbHBtYXQyCisJKTsKKwlyZXR1cm4gKERXT1JEKS0xOyAvKiBmYWlsdXJlICovCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZSAgICAoR0RJLjMxMCkKKyAqLworQk9PTCBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZSgKKwlVSU5UIGZIaWRkZW4sTFBTVFIgbHBzelJlc291cmNlRmlsZSwKKwlMUFNUUiBscHN6Rm9udEZpbGUsTFBTVFIgbHBzekN1cnJlbnRQYXRoCispIHsKKwkvKiBmSGlkZGVuPTEgLSBvbmx5IHZpc2libGUgZm9yIHRoZSBjYWxsaW5nIGFwcCwgcmVhZC1vbmx5LCBub3QKKwkgKiBlbnVtYmVyZWQgd2l0aCBFbnVtRm9udHMvRW51bUZvbnRGYW1pbGllcworCSAqIGxwc3pDdXJyZW50UGF0aCBjYW4gYmUgTlVMTAorCSAqLworCWRwcmludGZfZm9udChzdGRuaW1wLCJDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZSglZCwlcywlcywleCglcykpIC8vIGVtcHR5IHN0dWIhXG4iLAorCQlmSGlkZGVuLGxwc3pSZXNvdXJjZUZpbGUsbHBzekZvbnRGaWxlLGxwc3pDdXJyZW50UGF0aAorCSk7CisJcmV0dXJuIEZBTFNFOyAvKiBjcmVhdGUgZmFpbGVkICovCit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENyZWF0ZUZvbnRJbmRpcmVjdCAgICAoR0RJLjU3KQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9vZW1iaXRtYXAuYyBiL29iamVjdHMvb2VtYml0bWFwLmMKaW5kZXggODcwOTNmNi4uNmJiMjU4MSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9vZW1iaXRtYXAuYworKysgYi9vYmplY3RzL29lbWJpdG1hcC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8WDExL3hwbS5oPgogI2luY2x1ZGUgImdkaS5oIgogI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAiY29sb3IuaCIKICNpbmNsdWRlICJpY29uLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTI4MCw5ICsyODEsMTAgQEAKIAogICAgIGlmICghT0JNX0luaXRDb2xvclN5bWJvbHMoKSkgcmV0dXJuIDA7CiAgICAgCi0gICAgaWYgKCFPQk1fQ3JlYXRlQml0bWFwcyggT0JNX1BpeG1hcHNfRGF0YVtpZF0uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQk1fUGl4bWFwc19EYXRhW2lkXS5jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgJmhiaXRtYXAsICZoYml0bWFzayApKQorICAgIGlmICghQ2FsbFRvMzJfTGFyZ2VTdGFjayggKGludCgqKSgpKU9CTV9DcmVhdGVCaXRtYXBzLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JNX1BpeG1hcHNfRGF0YVtpZF0uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CTV9QaXhtYXBzX0RhdGFbaWRdLmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICZoYml0bWFwLCAmaGJpdG1hc2sgKSkKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkVycm9yIGNyZWF0aW5nIE9FTSBiaXRtYXAgJWRcbiIsIE9CTV9GSVJTVCtpZCApOwogICAgICAgICByZXR1cm4gMDsKQEAgLTMwOCw4ICszMTAsOSBAQAogICAgIGlmICghKGhpY29uID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEUsIHNpemVvZihJQ09OQUxMT0MpICkpKSByZXR1cm4gMDsKICAgICBwSWNvbiA9IChJQ09OQUxMT0MgKilHbG9iYWxMb2NrKCBoaWNvbiApOwogCi0gICAgaWYgKCFPQk1fQ3JlYXRlQml0bWFwcyggT0JNX0ljb25zX0RhdGFbaWRdLCBUUlVFLCBUUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSWNvbi0+aEJpdG1hcCwgJnBJY29uLT5oQml0TWFzayApKQorICAgIGlmICghQ2FsbFRvMzJfTGFyZ2VTdGFjayggKGludCgqKSgpKU9CTV9DcmVhdGVCaXRtYXBzLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JNX0ljb25zX0RhdGFbaWRdLCBUUlVFLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJY29uLT5oQml0bWFwLCAmcEljb24tPmhCaXRNYXNrICkpCiAgICAgewogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJFcnJvciBjcmVhdGluZyBPRU0gaWNvbiAlZFxuIiwgT0lDX0ZJUlNUK2lkICk7CiAgICAgICAgIEdsb2JhbEZyZWUoIGhpY29uICk7CmRpZmYgLS1naXQgYS9yYy9JbWFrZWZpbGUgYi9yYy9JbWFrZWZpbGUKaW5kZXggNTZmOWUxNC4uNDk4NGJhNCAxMDA2NDQKLS0tIGEvcmMvSW1ha2VmaWxlCisrKyBiL3JjL0ltYWtlZmlsZQpAQCAtNDksNiArNDksOCBAQAogCiBOb3JtYWxQcm9ncmFtVGFyZ2V0KHdpbmVyYywkKE9CSlMpLCQoREVQTElCUyksJChMT0NBTF9MSUJSQVJJRVMpLCkKIAorZGVwZW5kOjogeS50YWIuYyB5LnRhYi5oIGxleC55eS5jCisKIERlcGVuZFRhcmdldCgpCiAKIGNsZWFuOjoKZGlmZiAtLWdpdCBhL3JjL3dpbmVyYy5jIGIvcmMvd2luZXJjLmMKaW5kZXggNDVmZGUyMS4uMTRmM2FmMCAxMDA2NDQKLS0tIGEvcmMvd2luZXJjLmMKKysrIGIvcmMvd2luZXJjLmMKQEAgLTE2LDcgKzE2LDEzIEBACiAjaW5jbHVkZSAicGFyc2VyLmgiCiAjaW5jbHVkZSAieS50YWIuaCIKIAotY2hhciB1c2FnZVtdPSJ3aW5lcmMgLWR2YyAtcCBwcmVmaXggLW8gb3V0ZmlsZSA8IGluZmlsZSBcbiI7CitjaGFyIHVzYWdlW109IndpbmVyYyAtYmR2YyAtcCBwcmVmaXggLW8gb3V0ZmlsZSA8IGluZmlsZSBcbiIKKwkiICAgLWIgICAgICAgICAgICBDcmVhdGUgYSBDIGFycmF5IGZyb20gYSBiaW5hcnkgLnJlcyBmaWxlXG4iCisJIiAgIC1kICAgICAgICAgICAgT3V0cHV0IGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuIgorCSIgICAtcCBwcmVmaXggICAgIEdpdmUgYSBwcmVmaXggZm9yIHRoZSBnZW5lcmF0ZWQgbmFtZXNcbiIKKwkiICAgLXYgICAgICAgICAgICBTaG93IGVhY2ggcmVzb3VyY2UgYXMgaXQgaXMgcHJvY2Vzc2VkXG4iCisJIiAgIC1vIGZpbGUgICAgICAgT3V0cHV0IHRvIGZpbGUuYyBhbmQgZmlsZS5oXG4iOworCiAKIC8qbWlnaHQgYmUgb3ZlcndyaXR0ZW4gYnkgY29tbWFuZCBsaW5lKi8KIGNoYXIgKnByZWZpeD0iX1Jlc291cmNlIjsKQEAgLTI5LDE2ICszNSwxOCBAQAogeyAgCiAJZXh0ZXJuIGludCB5eWRlYnVnOwogCWV4dGVybiBjaGFyKiBvcHRhcmc7Ci0JaW50IG9wdGMsbG9zZSxyZXQ7Ci0JbG9zZT0wOworCWludCBvcHRjLGxvc2UscmV0LGJpbmFyeTsKKwlsb3NlPWJpbmFyeT0wOwogI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQl3aGlsZSgob3B0Yz1nZXRvcHQoYXJnYyxhcmd2LCJkcDp2bzoiKSkhPUVPRikKKwl3aGlsZSgob3B0Yz1nZXRvcHQoYXJnYyxhcmd2LCJiZHA6dm86IikpIT1FT0YpCiAjZWxzZQotCXdoaWxlKChvcHRjPWdldG9wdChhcmdjLGFyZ3YsImRwOnZvOiIsMCkpIT1FT0YpCisJd2hpbGUoKG9wdGM9Z2V0b3B0KGFyZ2MsYXJndiwiYmRwOnZvOiIsMCkpIT1FT0YpCiAjZW5kaWYKIAkJc3dpdGNoKG9wdGMpCiAJCXsKIAkJCS8qIGJpc29uIHdpbGwgcHJpbnQgc3RhdGUgdHJhbnNpdGlvbnMgb24gc3RkZXJyICovCisJCQljYXNlICdiJzpiaW5hcnk9MTsKKwkJCQkJIGJyZWFrOwogCQkJY2FzZSAnZCc6eXlkZWJ1Zz0xOwogCQkJCQkgc2V0YnVmKHN0ZG91dCwwKTsKIAkJCQkJIHNldGJ1ZihzdGRlcnIsMCk7CkBAIC01NCw3ICs2MiwxMCBAQAogCWlmKGxvc2UpcmV0dXJuIGZwcmludGYoc3RkZXJyLHVzYWdlKSwxOwogCWlmKCFoZWFkZXIpaGVhZGVyPXN0ZG91dDsKIAlpZighY29kZSljb2RlPXN0ZG91dDsKLQlyZXQ9eXlwYXJzZSgpOworCWlmKGJpbmFyeSkKKwkJcmV0PXRyYW5zZm9ybV9iaW5hcnlfZmlsZSgpOworCWVsc2UKKwkJcmV0PXl5cGFyc2UoKTsKIAlmY2xvc2UoaGVhZGVyKTsKIAlmY2xvc2UoY29kZSk7CiAJcmV0dXJuIHJldDsKQEAgLTY4LDYgKzc5LDIwIEBACiAJaGVhZGVyPWZvcGVuKGhuYW1lLCJ3Iik7CiB9CiAKK2ludCB0cmFuc2Zvcm1fYmluYXJ5X2ZpbGUoKQoreworCWludCBpLGM7CisJZnByaW50ZihoZWFkZXIsIiNkZWZpbmUgQVBQTElDQVRJT05fSEFTX1JFU09VUkNFUyAxXG4iKTsKKwlmcHJpbnRmKGNvZGUsImNoYXIgX0FwcGxpY2F0aW9uX3Jlc291cmNlc1tdPXsiKTsKKwlmb3IoaT0wOztpKyspCisJeworCQljPWdldGNoYXIoKTsKKwkJaWYoYz09LTEpYnJlYWs7CisJCWlmKGklMTY9PTApZnB1dGMoJ1xuJyxjb2RlKTsKKwkJZnByaW50Zihjb2RlLCIlM2QsIixjKTsKKwl9CisJZnByaW50Zihjb2RlLCJcbjB9XG5pbnQgX0FwbGljYXRpb25fcmVzb3VyY2VzX3NpemU9JWQ7XG4iLGkpOworfQogCiAvKiBTdW5PUycgbWVtY3B5IGlzIHdyb25nIGZvciBvdmVybGFwcGluZyBhcnJheXMgKi8KIGNoYXIgKnNhdmVfbWVtY3B5KGNoYXIgKmQsY2hhciogcyxpbnQgbCkKZGlmZiAtLWdpdCBhL3Rvb2xraXQvaGVhcC5jIGIvdG9vbGtpdC9oZWFwLmMKaW5kZXggZDIwYmU3Ni4uYzE1ODRjNyAxMDA2NDQKLS0tIGEvdG9vbGtpdC9oZWFwLmMKKysrIGIvdG9vbGtpdC9oZWFwLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgIHJldHVybiAxOwogfQogCi1jaGFyICpMb2NhbExvY2sgKEhBTkRMRSBoTWVtKQorV09SRCBMb2NhbExvY2sgKEhBTkRMRSBoTWVtKQogewogICAgIHZvaWQgKiptID0gSEVBUF9GaW5kU2xvdCAoaE1lbSk7CiAjaWZkZWYgREVCVUdfSEVBUApkaWZmIC0tZ2l0IGEvdG9vbGtpdC9zdXAuYyBiL3Rvb2xraXQvc3VwLmMKaW5kZXggZWY5NTEyMC4uMjVhYjlmMSAxMDA2NDQKLS0tIGEvdG9vbGtpdC9zdXAuYworKysgYi90b29sa2l0L3N1cC5jCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAid2luZS5oIgogI2luY2x1ZGUgImFyY2guaCIKKyNpbmNsdWRlICJuZWV4ZS5oIgogCiBMT05HIENhbGxXaW5kb3dQcm9jIChXTkRQUk9DIGZ1bmMsIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLAogCQkgICAgIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKQEAgLTI0LDkgKzI1LDggQEAKIHZvaWQgbG9hZF9tel9oZWFkZXIgKGludCBmZCwgc3RydWN0IG16X2hlYWRlcl9zICptel9oZWFkZXIpCiB7CiAjZGVmaW5lIFRBQiBtel9oZWFkZXIKLSAgICBMT0FEIChkb250X2NhcmUxKTsKLSAgICBMT0FEIChtdXN0X2JlXzB4NDApOwotICAgIExPQUQgKGRvbnRfY2FyZTIpOworCUxPQUQgKG16X21hZ2ljKTsKKyAgICBMT0FEIChkb250X2NhcmUpOwogICAgIExPQURTSE9SVCAobmVfb2Zmc2V0KTsKIH0KIApAQCAtMzQsNyArMzQsNyBAQAogewogI3VuZGVmIFRBQgogI2RlZmluZSBUQUIgbmVfaGVhZGVyCi0gICAgTE9BRCAoaGVhZGVyX3R5cGUpOworICAgIExPQUQgKG5lX21hZ2ljKTsKICAgICBMT0FEU0hPUlQgKGxpbmtlcl92ZXJzaW9uKTsKICAgICBMT0FEU0hPUlQgKGxpbmtlcl9yZXZpc2lvbik7CiAgICAgTE9BRFNIT1JUIChlbnRyeV90YWJfb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL3Rvb2xraXQvd2lubWFpbi5jIGIvdG9vbGtpdC93aW5tYWluLmMKaW5kZXggNDFkYTNhZS4uZjViZDIyNyAxMDA2NDQKLS0tIGEvdG9vbGtpdC93aW5tYWluLmMKKysrIGIvdG9vbGtpdC93aW5tYWluLmMKQEAgLTEwLDYgKzEwLDggQEAKICAgICBjaGFyIGZpbGVuYW1lIFs0MDk2XSwgKm1vZHVsZV9uYW1lLCAqcmVzb3VyY2VfZmlsZTsKICAgICBIQU5ETEUgaFRhc2tNYWluLCBoSW5zdGFuY2U7CiAgICAgCisJLyogVGhlIGxpYndpbmUgcmVzb3VyY2UgRExMIGlzIHRlbXBvcmFyaWx5IGRpc2FibGVkICovCisjaWYgMAogICAgIGlmICgobW9kdWxlX25hbWUgPSBzdHJjaHIgKGFyZ3YgWzBdLCAnLycpKSA9PSBOVUxMKXsKIAlwcmludGYgKCJFcnJvcjogQ2FuJ3QgZGV0ZXJtaW5lIGJhc2UgbmFtZSBmb3IgcmVzb3VyY2UgbG9hZGluZ1xuIik7CiAJcmV0dXJuIDA7CkBAIC0yMCw5ICsyMiwxMiBAQAogICAgIHN0cmNhdCAocmVzb3VyY2VfZmlsZSwgIi5kbGwiKTsKIAogICAgIGhJbnN0YW5jZSA9IExvYWRJbWFnZSAocmVzb3VyY2VfZmlsZSwgMCwgMCk7CisjZW5kaWYKICAgICAKICAgICBVU0VSX0luaXRBcHAoIGhJbnN0YW5jZSApOworI2lmIDAKICAgICBoVGFza01haW4gPSBDcmVhdGVOZXdUYXNrICgxKTsgLyogVGhpcyBpcyBub3QgY29ycmVjdCAqLworI2VuZGlmCiAgICAgcmV0X3ZhbCA9IFdpbk1haW4gKGhJbnN0YW5jZSwJLyogaEluc3RhbmNlICovCiAJCSAgICAgICAwLAkJLyogaFByZXZJbnN0YW5jZSAqLwogCQkgICAgICAgIiIsCQkvKiBscHN6Q21kUGFyYW0gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IGVlZTRhYWMuLmU4OGJiZDkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtMTU0NCw3ICsxNTQ0LDkgQEAKICAgICB7CiAgICAgICAgIC8qIFNldCBheCBlcXVhbCB0byBkcyBmb3Igd2luZG93IHByb2NlZHVyZXMgKi8KICAgICAgICAgcHJpbnRmKCAiXHRtb3Z3IDE2KCUlZWJ4KSwlJWF4XG4iICk7Ci0vKiAgICAgICAgcHJpbnRmKCAiXHRtb3Z3ICUlYXgsJSVkc1xuIiApOyAqLworCisgICAgICAgIC8qIFRoaXMgc2VlbXMgdG8gYmUgbmVlZGVkLCBhbHRob3VnaCBJIHN0aWxsIGRvbid0IHNlZSB3aHkuLi4gKi8KKyAgICAgICAgcHJpbnRmKCAiXHRtb3Z3ICUlYXgsJSVkc1xuIiApOwogICAgIH0KIAogICAgIC8qIEp1bXAgdG8gdGhlIGNhbGxlZCByb3V0aW5lICovCmRpZmYgLS1naXQgYS93aW5kb3dzL2dyYXBoaWNzLmMgYi93aW5kb3dzL2dyYXBoaWNzLmMKaW5kZXggMjZiYTdiMy4uYmJjNjc0YiAxMDA2NDQKLS0tIGEvd2luZG93cy9ncmFwaGljcy5jCisrKyBiL3dpbmRvd3MvZ3JhcGhpY3MuYwpAQCAtMzMyLDkgKzMzMiw4IEBACiAgKiAgICAgICAgICAgUm91bmRSZWN0ICAgIChHREkuMjgpCiAgKi8KIEJPT0wgUm91bmRSZWN0KCBIREMgaERDLCBzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20sCi0JCQkJCXNob3J0IGVsbF93aWR0aCwgc2hvcnQgZWxsX2hlaWdodCkKKyAgICAgICAgICAgICAgICBzaG9ydCBlbGxfd2lkdGgsIHNob3J0IGVsbF9oZWlnaHQgKQogewotICAgIGludAkJeDEsIHkxLCB4MiwgeTI7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKGhEQywgRENfTUFHSUMpOwogICAgIGlmICghZGMpIAogICAgIHsKQEAgLTM0Niw1OSArMzQ1LDEwMyBAQAogICAgIH0KICAgICBkcHJpbnRmX2dyYXBoaWNzKHN0ZGRlYiwgIlJvdW5kUmVjdCglZCAlZCAlZCAlZCAgJWQgJWRcbiIsIAogICAgIAlsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGVsbF93aWR0aCwgZWxsX2hlaWdodCk7Ci0gICAgeDEgPSBYTFBUT0RQKGRjLCBsZWZ0KTsKLSAgICB5MSA9IFlMUFRPRFAoZGMsIHRvcCk7Ci0gICAgeDIgPSBYTFBUT0RQKGRjLCByaWdodCAtIGVsbF93aWR0aCk7Ci0gICAgeTIgPSBZTFBUT0RQKGRjLCBib3R0b20gLSBlbGxfaGVpZ2h0KTsKKworICAgIGxlZnQgICA9IFhMUFRPRFAoIGRjLCBsZWZ0ICk7CisgICAgdG9wICAgID0gWUxQVE9EUCggZGMsIHRvcCApOworICAgIHJpZ2h0ICA9IFhMUFRPRFAoIGRjLCByaWdodCApOworICAgIGJvdHRvbSA9IFlMUFRPRFAoIGRjLCBib3R0b20gKTsKKyAgICBlbGxfd2lkdGggID0gYWJzKCBlbGxfd2lkdGggKiBkYy0+dy5WcG9ydEV4dFggLyBkYy0+dy5XbmRFeHRYICk7CisgICAgZWxsX2hlaWdodCA9IGFicyggZWxsX2hlaWdodCAqIGRjLT53LlZwb3J0RXh0WSAvIGRjLT53LlduZEV4dFkgKTsKKworICAgIC8qIEZpeCB0aGUgY29vcmRpbmF0ZXMgKi8KKworICAgIGlmIChsZWZ0ID4gcmlnaHQpIHsgc2hvcnQgdCA9IGxlZnQ7IGxlZnQgPSByaWdodDsgcmlnaHQgPSB0OyB9CisgICAgaWYgKHRvcCA+IGJvdHRvbSkgeyBzaG9ydCB0ID0gdG9wOyB0b3AgPSBib3R0b207IGJvdHRvbSA9IHQ7IH0KKyAgICBpZiAoZWxsX3dpZHRoID4gcmlnaHQgLSBsZWZ0KSBlbGxfd2lkdGggPSByaWdodCAtIGxlZnQ7CisgICAgaWYgKGVsbF9oZWlnaHQgPiBib3R0b20gLSB0b3ApIGVsbF9oZWlnaHQgPSBib3R0b20gLSB0b3A7CisKICAgICBpZiAoRENfU2V0dXBHQ0ZvckJydXNoKCBkYyApKQogICAgIHsKLQlYRmlsbEFyYyhkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotCQkgICAgICAgIGRjLT53LkRDT3JnWCArIHgxLCBkYy0+dy5EQ09yZ1kgKyB5MSwKLQkJICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDkwICogNjQsIDkwICogNjQpOwotCVhGaWxsQXJjKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgICAgICAgZGMtPncuRENPcmdYICsgeDEsIGRjLT53LkRDT3JnWSArIHkyLAotCQkgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMTgwICogNjQsIDkwICogNjQpOwotCVhGaWxsQXJjKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgICAgICAgZGMtPncuRENPcmdYICsgeDIsIGRjLT53LkRDT3JnWSArIHkyLAotCQkgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMjcwICogNjQsIDkwICogNjQpOwotCVhGaWxsQXJjKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgICAgICAgZGMtPncuRENPcmdYICsgeDIsIGRjLT53LkRDT3JnWSArIHkxLAotCQkgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMCwgOTAgKiA2NCk7Ci0JZWxsX3dpZHRoIC89IDI7ICBlbGxfaGVpZ2h0IC89IDI7Ci0JWEZpbGxSZWN0YW5nbGUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLQkJZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCwgZGMtPncuRENPcmdZICsgdG9wLAotCQlyaWdodCAtIGxlZnQgLSAyICogZWxsX3dpZHRoLCBib3R0b20gLSB0b3ApOwotCVhGaWxsUmVjdGFuZ2xlKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCWRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCArIGVsbF9oZWlnaHQsCi0JCWVsbF93aWR0aCwgYm90dG9tIC0gdG9wIC0gMiAqIGVsbF9oZWlnaHQpOwotCVhGaWxsUmVjdGFuZ2xlKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCWRjLT53LkRDT3JnWCArIHJpZ2h0IC0gZWxsX3dpZHRoLCBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0LAotCQllbGxfd2lkdGgsIGJvdHRvbSAtIHRvcCAtIDIgKiBlbGxfaGVpZ2h0KTsKLQllbGxfd2lkdGggKj0gMjsgIGVsbF9oZWlnaHQgKj0gMjsKLQl9ICAgIAkKLSAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbihkYykpIHsKLQlYRHJhd0FyYyhkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotCQkgICAgICAgIGRjLT53LkRDT3JnWCArIHgxLCBkYy0+dy5EQ09yZ1kgKyB5MSwKLQkJICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDkwICogNjQsIDkwICogNjQpOwotCVhEcmF3QXJjKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgICAgICAgZGMtPncuRENPcmdYICsgeDEsIGRjLT53LkRDT3JnWSArIHkyLAotCQkgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMTgwICogNjQsIDkwICogNjQpOwotCVhEcmF3QXJjKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgICAgICAgZGMtPncuRENPcmdYICsgeDIsIGRjLT53LkRDT3JnWSArIHkyLAotCQkgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMjcwICogNjQsIDkwICogNjQpOwotCVhEcmF3QXJjKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgICAgICAgZGMtPncuRENPcmdYICsgeDIsIGRjLT53LkRDT3JnWSArIHkxLAotCQkgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMCwgOTAgKiA2NCk7CisgICAgICAgIGlmIChlbGxfd2lkdGggJiYgZWxsX2hlaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgdG9wLAorICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgOTAgKiA2NCwgOTAgKiA2NCApOworICAgICAgICAgICAgWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDE4MCAqIDY0LCA5MCAqIDY0ICk7CisgICAgICAgICAgICBYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMjcwICogNjQsIDkwICogNjQgKTsKKyAgICAgICAgICAgIFhGaWxsQXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0IC0gZWxsX3dpZHRoLCBkYy0+dy5EQ09yZ1kgKyB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0LCAwLCA5MCAqIDY0ICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsbF93aWR0aCA8IHJpZ2h0IC0gbGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCAtIGVsbF93aWR0aCwgZWxsX2hlaWdodCAvIDIgKTsKKyAgICAgICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQgKyBlbGxfd2lkdGggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIGJvdHRvbSAtIChlbGxfaGVpZ2h0KzEpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtIGxlZnQgLSBlbGxfd2lkdGgsIChlbGxfaGVpZ2h0KzEpIC8gMiApOworICAgICAgICB9CisgICAgICAgIGlmICAoZWxsX2hlaWdodCA8IGJvdHRvbSAtIHRvcCkKKyAgICAgICAgeworICAgICAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCAtIGVsbF9oZWlnaHQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbihkYykpCisgICAgeworICAgICAgICBpZiAoZWxsX3dpZHRoICYmIGVsbF9oZWlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDkwICogNjQsIDkwICogNjQgKTsKKyAgICAgICAgICAgIFhEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIGJvdHRvbSAtIGVsbF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0LCAxODAgKiA2NCwgOTAgKiA2NCApOworICAgICAgICAgICAgWERyYXdBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDI3MCAqIDY0LCA5MCAqIDY0ICk7CisgICAgICAgICAgICBYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCwgZGMtPncuRENPcmdZICsgdG9wLAorICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMCwgOTAgKiA2NCApOwogCX0KLSAgICBlbGxfd2lkdGggLz0gMjsgIGVsbF9oZWlnaHQgLz0gMjsKLSAgICBNb3ZlVG8oaERDLCBsZWZ0LCB0b3AgKyBlbGxfaGVpZ2h0KTsKLSAgICBMaW5lVG8oaERDLCBsZWZ0LCBib3R0b20gLSBlbGxfaGVpZ2h0KTsKLSAgICBNb3ZlVG8oaERDLCBsZWZ0ICsgZWxsX3dpZHRoLCBib3R0b20pOwotICAgIExpbmVUbyhoREMsIHJpZ2h0IC0gZWxsX3dpZHRoLCBib3R0b20pOwotICAgIE1vdmVUbyhoREMsIHJpZ2h0LCBib3R0b20gLSBlbGxfaGVpZ2h0KTsKLSAgICBMaW5lVG8oaERDLCByaWdodCwgdG9wICsgZWxsX2hlaWdodCk7Ci0gICAgTW92ZVRvKGhEQywgcmlnaHQgLSBlbGxfd2lkdGgsIHRvcCk7Ci0gICAgTGluZVRvKGhEQywgbGVmdCArIGVsbF93aWR0aCwgdG9wKTsKKyAgICAgICAgaWYgKGVsbF93aWR0aCA8IHJpZ2h0IC0gbGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKTsKKyAgICAgICAgICAgIFhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQgKyBlbGxfd2lkdGggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0IC0gZWxsX3dpZHRoIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsbF9oZWlnaHQgPCBib3R0b20gLSB0b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIGJvdHRvbSAtIGVsbF9oZWlnaHQgLyAyICk7CisgICAgICAgICAgICBYRHJhd0xpbmUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAorICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCAvIDIgKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvd2luZG93cy9ob29rLmMgYi93aW5kb3dzL2hvb2suYwppbmRleCAyNTdiNzU0Li5kNGZlMmViIDEwMDY0NAotLS0gYS93aW5kb3dzL2hvb2suYworKysgYi93aW5kb3dzL2hvb2suYwpAQCAtMTUyLDYgKzE1Miw2IEBACiBEV09SRCBDYWxsTmV4dEhvb2tFeCggSEhPT0sgaGhvb2ssIHNob3J0IGNvZGUsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQogewogICAgIEhPT0tEQVRBICpkYXRhID0gKEhPT0tEQVRBICopUFRSX1NFR19UT19MSU4oaGhvb2spOwotICAgIGlmICghZGF0YS0+bmV4dCkgcmV0dXJuIDA7CisgICAgaWYgKGRhdGEgPT0gTlVMTCB8fCAhZGF0YS0+bmV4dCkgcmV0dXJuIDA7CiAgICAgZWxzZSByZXR1cm4gSU5URVJOQUxfQ0FMTF9IT09LKCBkYXRhLT5uZXh0LCBjb2RlLCB3UGFyYW0sIGxQYXJhbSApOwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZXNzYWdlLmMgYi93aW5kb3dzL21lc3NhZ2UuYwppbmRleCA4MTM1NzI0Li4zN2E4NjljIDEwMDY0NAotLS0gYS93aW5kb3dzL21lc3NhZ2UuYworKysgYi93aW5kb3dzL21lc3NhZ2UuYwpAQCAtMTgzLDYgKzE4Myw4MiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1TR19HZXRXaW5kb3dGb3JFdmVudAorICoKKyAqIEZpbmQgdGhlIHdpbmRvdyBhbmQgaGl0dGVzdCBmb3IgYSBtb3VzZSBldmVudC4KKyAqLworc3RhdGljIElOVCBNU0dfR2V0V2luZG93Rm9yRXZlbnQoIFBPSU5UIHB0LCBIV05EICpwaHduZCApCit7CisgICAgV05EICp3bmRQdHI7CisgICAgSFdORCBod25kOworICAgIElOVCBoaXR0ZXN0LCB4LCB5OworCisgICAgKnBod25kID0gaHduZCA9IEdldERlc2t0b3BXaW5kb3coKTsKKyAgICB4ID0gcHQueDsKKyAgICB5ID0gcHQueTsKKyAgICB3aGlsZSAoaHduZCkKKyAgICB7CisJICAvKiBJZiBwb2ludCBpcyBpbiB3aW5kb3csIGFuZCB3aW5kb3cgaXMgdmlzaWJsZSwgYW5kIGl0ICAqLworICAgICAgICAgIC8qIGlzIGVuYWJsZWQgKG9yIGl0J3MgYSB0b3AtbGV2ZWwgd2luZG93KSwgdGhlbiBleHBsb3JlICovCisJICAvKiBpdHMgY2hpbGRyZW4uIE90aGVyd2lzZSwgZ28gdG8gdGhlIG5leHQgd2luZG93LiAgICAgICAqLworCisJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKwlpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpICYmCisgICAgICAgICAgICAoISh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkgfHwKKyAgICAgICAgICAgICAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSkgJiYKKyAgICAgICAgICAgICh4ID49IHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0KSAmJgorICAgICAgICAgICAgKHggPCB3bmRQdHItPnJlY3RXaW5kb3cucmlnaHQpICYmCisJICAgICh5ID49IHduZFB0ci0+cmVjdFdpbmRvdy50b3ApICYmCisgICAgICAgICAgICAoeSA8IHduZFB0ci0+cmVjdFdpbmRvdy5ib3R0b20pKQorCXsKKwkgICAgKnBod25kID0gaHduZDsKKyAgICAgICAgICAgICAgLyogSWYgd2luZG93IGlzIG1pbmltaXplZCBvciBkaXNhYmxlZCwgaWdub3JlIGl0cyBjaGlsZHJlbiAqLworICAgICAgICAgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkgfHwKKyAgICAgICAgICAgICAgICAod25kUHRyLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpKSBicmVhazsKKwkgICAgeCAtPSB3bmRQdHItPnJlY3RDbGllbnQubGVmdDsKKwkgICAgeSAtPSB3bmRQdHItPnJlY3RDbGllbnQudG9wOworCSAgICBod25kID0gd25kUHRyLT5od25kQ2hpbGQ7CisJfQorCWVsc2UgaHduZCA9IHduZFB0ci0+aHduZE5leHQ7CisgICAgfQorCisKKyAgICAvKiBTZW5kIHRoZSBXTV9OQ0hJVFRFU1QgbWVzc2FnZSAqLworCisgICAgd2hpbGUgKCpwaHduZCkKKyAgICB7CisgICAgICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCAqcGh3bmQgKTsKKyAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKSBoaXR0ZXN0ID0gSFRFUlJPUjsKKyAgICAgICAgZWxzZSBoaXR0ZXN0ID0gKElOVClTZW5kTWVzc2FnZSggKnBod25kLCBXTV9OQ0hJVFRFU1QsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBwdC54LCBwdC55ICkgKTsKKyAgICAgICAgaWYgKGhpdHRlc3QgIT0gSFRUUkFOU1BBUkVOVCkgYnJlYWs7ICAvKiBGb3VuZCB0aGUgd2luZG93ICovCisgICAgICAgIGh3bmQgPSB3bmRQdHItPmh3bmROZXh0OworICAgICAgICB3aGlsZSAoaHduZCkKKyAgICAgICAgeworICAgICAgICAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICAgICAgICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgV1NfVklTSUJMRSkgJiYKKyAgICAgICAgICAgICAgICAoeCA+PSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCkgJiYKKyAgICAgICAgICAgICAgICAoeCA8IHduZFB0ci0+cmVjdFdpbmRvdy5yaWdodCkgJiYKKyAgICAgICAgICAgICAgICAoeSA+PSB3bmRQdHItPnJlY3RXaW5kb3cudG9wKSAmJgorICAgICAgICAgICAgICAgICh5IDwgd25kUHRyLT5yZWN0V2luZG93LmJvdHRvbSkpIGJyZWFrOworICAgICAgICAgICAgaHduZCA9IHduZFB0ci0+aHduZE5leHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGh3bmQpICpwaHduZCA9IGh3bmQ7IC8qIEZvdW5kIGEgc3VpdGFibGUgc2libGluZyAqLworICAgICAgICBlbHNlICAvKiBHbyBiYWNrIHRvIHRoZSBwYXJlbnQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKnBod25kID0gV0lOX0ZpbmRXbmRQdHIoICpwaHduZCApLT5od25kUGFyZW50OworICAgICAgICAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoICpwaHduZCApOworICAgICAgICAgICAgeCArPSB3bmRQdHItPnJlY3RDbGllbnQubGVmdDsKKyAgICAgICAgICAgIHkgKz0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghKnBod25kKSAqcGh3bmQgPSBHZXREZXNrdG9wV2luZG93KCk7CisgICAgcmV0dXJuIGhpdHRlc3Q7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTVNHX1RyYW5zbGF0ZU1vdXNlTXNnCiAgKgogICogVHJhbnNsYXRlIGFuIG1vdXNlIGhhcmR3YXJlIGV2ZW50IGludG8gYSByZWFsIG1vdXNlIG1lc3NhZ2UuCkBAIC0yMTgsMjAgKzI5NCw3IEBACiAJU2NyZWVuVG9DbGllbnQoIG1zZy0+aHduZCwgKExQUE9JTlQpJm1zZy0+bFBhcmFtICk7CiAJcmV0dXJuIFRSVUU7ICAvKiBObyBuZWVkIHRvIGZ1cnRoZXIgcHJvY2VzcyB0aGUgbWVzc2FnZSAqLwogICAgIH0KLSAgICBlbHNlIG1zZy0+aHduZCA9IFdpbmRvd0Zyb21Qb2ludCggbXNnLT5wdCApOwotCi0gICAgICAvKiBTZW5kIHRoZSBXTV9OQ0hJVFRFU1QgbWVzc2FnZSAqLwotCi0gICAgaGl0dGVzdF9yZXN1bHQgPSAoSU5UKVNlbmRNZXNzYWdlKCBtc2ctPmh3bmQsIFdNX05DSElUVEVTVCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBtc2ctPnB0LngsIG1zZy0+cHQueSApICk7Ci0gICAgd2hpbGUgKChoaXR0ZXN0X3Jlc3VsdCA9PSBIVFRSQU5TUEFSRU5UKSAmJiAobXNnLT5od25kKSkKLSAgICB7Ci0JbXNnLT5od25kID0gV0lOUE9TX05leHRXaW5kb3dGcm9tUG9pbnQoIG1zZy0+aHduZCwgbXNnLT5wdCApOwotCWlmIChtc2ctPmh3bmQpCi0JICAgIGhpdHRlc3RfcmVzdWx0ID0gKElOVClTZW5kTWVzc2FnZSggbXNnLT5od25kLCBXTV9OQ0hJVFRFU1QsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyggbXNnLT5wdC54LCBtc2ctPnB0LnkgKSk7Ci0gICAgfQotICAgIGlmICghbXNnLT5od25kKSBtc2ctPmh3bmQgPSBHZXREZXNrdG9wV2luZG93KCk7CisgICAgZWxzZSBoaXR0ZXN0X3Jlc3VsdCA9IE1TR19HZXRXaW5kb3dGb3JFdmVudCggbXNnLT5wdCwgJm1zZy0+aHduZCApOwogCiAgICAgICAvKiBTZW5kIHRoZSBXTV9QQVJFTlROT1RJRlkgbWVzc2FnZSAqLwogCmRpZmYgLS1naXQgYS93aW5kb3dzL3BhaW50aW5nLmMgYi93aW5kb3dzL3BhaW50aW5nLmMKaW5kZXggNzc0MDgxYS4uZTI5MDU2ZSAxMDA2NDQKLS0tIGEvd2luZG93cy9wYWludGluZy5jCisrKyBiL3dpbmRvd3MvcGFpbnRpbmcuYwpAQCAtMzksOCArMzksOCBAQAogCiAgICAgaWYgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkVFRFNfTkNQQUlOVCkKICAgICB7Ci0gICAgICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ1BBSU5ULCAwLCAwICk7CiAgICAgICAgIHduZFB0ci0+ZmxhZ3MgJj0gfldJTl9ORUVEU19OQ1BBSU5UOworICAgICAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fTkNQQUlOVCwgMCwgMCApOwogICAgIH0KIAogICAgIGxwcy0+aGRjID0gR2V0RENFeCggaHduZCwgaHJnblVwZGF0ZSwgRENYX0lOVEVSU0VDVFJHTiB8IERDWF9VU0VTVFlMRSApOwpAQCAtNTYsOCArNTYsOCBAQAogCiAgICAgaWYgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkVFRFNfRVJBU0VCS0dORCkKICAgICB7Ci0gICAgICAgIGxwcy0+ZkVyYXNlID0gIVNlbmRNZXNzYWdlKCBod25kLCBXTV9FUkFTRUJLR05ELCBscHMtPmhkYywgMCApOwogICAgICAgICB3bmRQdHItPmZsYWdzICY9IH5XSU5fTkVFRFNfRVJBU0VCS0dORDsKKyAgICAgICAgbHBzLT5mRXJhc2UgPSAhU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX0VSQVNFQktHTkQsIGxwcy0+aGRjLCAwICk7CiAgICAgfQogICAgIGVsc2UgbHBzLT5mRXJhc2UgPSBUUlVFOwogCkBAIC0yMjUsOCArMjI1LDggQEAKICAgICB7CiAgICAgICAgIGlmICh3bmRQdHItPmZsYWdzICYgV0lOX05FRURTX05DUEFJTlQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ1BBSU5ULCAwLCAwICk7CiAgICAgICAgICAgICB3bmRQdHItPmZsYWdzICY9IH5XSU5fTkVFRFNfTkNQQUlOVDsKKyAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ1BBSU5ULCAwLCAwICk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkVFRFNfRVJBU0VCS0dORCkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggNmFkZDg4YS4uYWFkMzU0NiAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC04OTIsMTEgKzg5MiwxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSXNXaW5kb3dWaXNpYmxlICAgKFVTRVIuNDkpCiAgKi8KLUJPT0wgSXNXaW5kb3dWaXNpYmxlKEhXTkQgaFduZCkKK0JPT0wgSXNXaW5kb3dWaXNpYmxlKCBIV05EIGh3bmQgKQogewotICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwotICAgIGlmICh3bmRQdHIgPT0gMCkgcmV0dXJuKEZBTFNFKTsKLSAgICBlbHNlIHJldHVybiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpICE9IDApOworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICB3aGlsZSAod25kUHRyICYmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkpCisgICAgeworICAgICAgICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBXU19WSVNJQkxFKSkgcmV0dXJuIEZBTFNFOworICAgICAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggd25kUHRyLT5od25kUGFyZW50ICk7CisgICAgfQorICAgIHJldHVybiAod25kUHRyICYmICh3bmRQdHItPmR3U3R5bGUgJiBXU19WSVNJQkxFKSk7CiB9CiAKICAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucG9zLmMgYi93aW5kb3dzL3dpbnBvcy5jCmluZGV4IGJhYjgxMTMuLmIyNDFhZmMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucG9zLmMKKysrIGIvd2luZG93cy93aW5wb3MuYwpAQCAtNTMxLDMyICs1MzEsNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIFdJTlBPU19OZXh0V2luZG93RnJvbVBvaW50Ci0gKgotICogIExvb2tzIGZvciBuZXh0IGVuYWJsZWQgd2luZG93IHRoYXQgaXMKLSAqICBhKSBzaWJsaW5nIG9mIGh3bmQsIGxhdGVyIGluIFotb3JkZXIgYW5kIGVuY2xvc2VzIHB0LCBvcgotICogIGIpIHBhcmVudCBvZiBod25kCi0gKi8KLUhXTkQgV0lOUE9TX05leHRXaW5kb3dGcm9tUG9pbnQoIEhXTkQgaHduZCwgUE9JTlQgcHQgKQotewotICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLQotICAgIGlmICghd25kUHRyLT5od25kUGFyZW50KSByZXR1cm4gaHduZDsgIC8qIGRlc2t0b3Agd2luZG93ICovCi0gICAgU2NyZWVuVG9DbGllbnQoIHduZFB0ci0+aHduZFBhcmVudCwgJnB0ICk7IC8qIG1ha2UgcHQgcmVsYXRpdmUgdG8gcGFyZW50ICovCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICAgIGlmICghd25kUHRyLT5od25kTmV4dCkgYnJlYWs7ICAvKiBObyBtb3JlIGNoaWxkcmVuICovCi0gICAgICAgIGh3bmQgPSB3bmRQdHItPmh3bmROZXh0OwotICAgICAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotICAgICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpICYmCi0gICAgICAgICAgICAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKSAmJgotICAgICAgICAgICAgUHRJblJlY3QoICZ3bmRQdHItPnJlY3RXaW5kb3csIHB0ICkpIHJldHVybiBod25kOwotICAgIH0KLSAgICByZXR1cm4gd25kUHRyLT5od25kUGFyZW50OwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIFdJTlBPU19DaGFuZ2VBY3RpdmVXaW5kb3cKICAqCiAgKiBDaGFuZ2UgdGhlIGFjdGl2ZSB3aW5kb3cgYW5kIHNlbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZXMuCg==