ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMGVkZTJlNi4uMjBiMGUzNSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTYgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzA1MjUgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NzA2MTYgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDUyNTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBNYW55IGZpeGVzIHRvIG11bHRpbWVkaWEgY29kZS4KLQktIEJldHRlciBtZW51cy4KK1dIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDYxNjogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBNb3JlIGltcHJvdmVtZW50cyB0byBtdWx0aW1lZGlhIGNvZGUuCisJLSBOZXcgZm9udCBtYXBwZXIuCisJLSBJY29uIHRpdGxlcy4KKwktIFByaW50IHNwb29saW5nLgorCS0gRGlyZWN0IEkvTyBwb3J0cyBhY2Nlc3MuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTYsMTAgKzE5LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDUyNS50YXIuZ3oKLSAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA1MjUudGFyLmd6Ci0gIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA1MjUudGFyLmd6Ci0gIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA1MjUudGFyLmd6CisgIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDYxNi50YXIuZ3oKKyAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA2MTYudGFyLmd6CisgIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA2MTYudGFyLmd6CisgIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA2MTYudGFyLmd6CiAKIEl0IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIGFueSBzaXRlIHRoYXQgbWlycm9ycyB0c3gtMTEgb3Igc3Vuc2l0ZS4KIApkaWZmIC0tZ2l0IGEvQlVHUyBiL0JVR1MKaW5kZXggMTI1MmQ4YS4uZjcwNmFjNiAxMDA2NDQKLS0tIGEvQlVHUworKysgYi9CVUdTCkBAIC01LDEyICs1LDExIEBACiBhZGQgbmV3IGVudHJpZXMgYW5kLCBtb3JlIGltcG9ydGFudGx5LCByZW1vdmUgdGhvc2UgZm9yIHRoZSAKIGJ1Z3MgeW91IGZpeGVkIDstKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BcyBvZiBNYXJjaCAxMCAxOTk3IC0KK0FzIG9mIEp1bmUgMTk5NyAtCiAKIEdlbmVyYWw6CiAKLSAqIEZvbnQgbWFwcGluZyBpcyB0b28gZ2VuZXJpYy4gTm8gc29mdCBmb250IGxvYWRpbmcsIG5vIHJvdGF0ZWQgCi0gICB0ZXh0IHN1cHBvcnQsIGluY29ycmVjdCBtZXRyaWNzLiBbYWxleEBhbWFkZXVzLnBoYXJtLnN1bnlzYi5lZHVdCisgKiBUcnVlVHlwZSwgLkZPTiByYXN0ZXJpemVyLgogCiAgKiBObyB0aHJlYWQvcHJvY2Vzcy9rZXJuZWwtb2JqZWN0IHN1cHBvcnQgaW4gV2luMzIgY29kZS4gCiAKQEAgLTMyLDIwICszMSwyMyBAQAogCSAgcHJvcGVydGllcy4KIAogICogTm8gbWFudWFsIHBhZ2VzIGRlc2NyaWJpbmcgdGhlIHZhcmlvdXMgV2luZG93cyBjYWxscy4KKwktIFlvdSBjYW4gZmluZCBpbmZvcm1hdGlvbiBhYm91dCBtb3N0IG9mIHRoZSBXaW4zMiBBUEkgY2FsbHMKKyAgICAgICAgICBvbiB0aGUgd3d3Lm1pY3Jvc29mdC5jb20gKGdvIHRvICdzZWFyY2gnKS4KIAogTWlzY2VsbGFuZW91czoKIAorICogTmV3IGZvbnQgbWFwcGluZyBzY2hlbWUgY2FuIGJlIGltcHJvdmVkLgorCiAgKiAiQ3Vyc29yIFhYWFggaGFzIG1vcmUgdGhhbiAxIGJwcCEiCiAKICAqIDMyLWJpdCBGcmVlY2VsbCBzZWdmYXVsdHMgd2hlbiBzdGFydGVkIGZyb20gdGhlIFByb2dtYW4gKGxvb2tzIGxpa2UKICAgIGEgcHJvYmxlbSB3aXRoIGNhcmRzLmRsbCkuCiAKLSAqIEVkaXQgY29udHJvbHMgYXJlIHByb25lIHRvIHNob3cgYmxhbmsgc3BhY2Ugd2hlbiwgaW4gZmFjdCwgdGhlcmUgaXMgYQotICAgdGV4dCB0aGVyZS4KKyAqIE1hcmdpbnMgaW4gZWRpdCBjb250cm9scyBhcmUgdG9vIHdpZGUuCiAKICAqIFNHSSB3aW5kb3cgbWFuYWdlciB0cmVhdHMgV2luZSB3aW5kb3dzIGFzIHRvcG1vc3QuCiAKLSAqIFdyaXRlIHNob3dzIGJsYW5rIHNwYWNlIGluc3RlYWQgb2YgUGFpbnRicnVzaCBPTEUxIG9iamVjdC4KKyAqIFdyaXRlIHNob3dzIGJsYW5rIHNwYWNlIGluc3RlYWQgb2YgUGFpbnRicnVzaCBPTEUxIG9iamVjdCAoIEdldERJQml0cygpPyApLgogCiAgKiBBbGxvY0NTVG9EU0FsaWFzKCkgc2hvdWxkbid0IGFsbG9jIGFsaWFzIGZvciB0aGUgc2FtZSBzZWdtZW50IG11bHRpcGxlCiAgICB0aW1lcy4KZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBlYmUzYTZlLi5mOGI4Yjk2IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDQgKzEsMTcxIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTYXQgSnVuIDE0IDEzOjA1OjIzIDE5OTcgIEFuZHJlYXMgTW9ociA8MTAwLjMwOTM2QGdlcm1hbnkubmV0PgorCisJKiBbaW5jbHVkZS9tbXN5c3RlbS5oXQorCUF2b2lkZWQgaW5maW5pdGUgbG9vcCBpbiBhdWRpbyBjb2RlIHdoZW4gYWNjZXNzaW5nCisgCVdBVkVPVVRDQVBTL1dBVkVJTkNBUFMvTUlESU9VVENBUFMvQVVYQ0FQUyB3aXRoIHJpZ2lkIHZhcmlhYmxlCisgCW9mZnNldHMgKEkgYXBwbGllZCBXSU5FX1BBQ0tFRCkuCisKKwkqIFsqLypdCisJQWRkZWQgIldBUk5JTkc6IiBhbmQgIkVSUk9SOiIgdG8gc29tZSBwcmludGYncy4KKwlKdXN0IGdyZXAgZm9yIHRoZW0gd2l0aCAnLWRlYnVnbXNnICthbGwnLgorCisJKiBbbXVsdGltZWRpYS9hdWRpby5jXSBbbXVsdGltZWRpYS9tbXN5c3RlbS5jXQorCUltcGxlbWVudGVkIHdhdmUgY2FsbGJhY2tzOiB3aW5kb3cgYW5kIGZ1bmN0aW9uIGNhbGxiYWNrLgorCUZpeGVkIHByb2JsZW0gd2l0aCBXQVZFX05vdGlmeUNsaWVudCgpLgorCU1pc2MgZml4ZXMuCisKKwkqIFt3aW5kb3dzL3dpbmhlbHAuY10KKwlGaXhlZCBwcm9ibGVtIHdpdGggd2luZG93cyBoZWxwIHRlbGxpbmcgIkhlbHAgdG9waWMgZG9lc24ndCBleGlzdCIuCisJQnV0IHRoaXMgcHJvYmxlbSBzdGlsbCByZW1haW5zIHdoZW4gdXNpbmcgV2lud29yZC4KKworV2VkIEp1biAxMSAwOToxNDoyMCAxOTk3ICBBbGV4IEtvcm9ia2EgPGFsZXhAdHJhbnRvci5waGFybS5zdW55c2IuZWR1PgorCisJKiBbd2luZS5pbmldCisJTmV3ICdmb250cycgc2VjdGlvbiBmb3JtYXQuIFJlYWQgZG9jdW1lbnRhdGlvbi9mb250cy4KKworCSogW2NvbnRyb2xzL2ljb250aXRsZS5jXSBbd2luZG93cy93aW5wb3MuY10gW3dpbmRvd3Mvbm9uY2xpZW50LmNdCisJICBbd2luZG93cy93aW4uY10gW2luY2x1ZGUvd2luLmhdCisJSW1wbGVtZW50ZWQgaWNvbiB0aXRsZXMuCisKKwkqIFtncmFwaGljcy94MTFkcnYveGZvbnQuY10gW29iamVjdHMvZm9udC5jXSBbb2JqZWN0cy9kYy5jXQorCSAgW2luY2x1ZGUveDExZHJ2LmhdIFtpbmNsdWRlL3gxMWZvbnQuaF0gW2RvY3VtZW50YXRpb24vZm9udHNdCisJUmV3cm90ZSBmb250IG1hcHBlciBmcm9tIHNjcmF0Y2guCisKKwkqIFt0b29scy9mbnQyYmRmLmNdCisJQnVnIGZpeGVzLiBSRVBMQUNFIEZPTlRTIENSRUFURUQgQlkgVEhFIFBSRVZJT1VTIFZFUlNJT05TLgorCisJKiBbd2luZG93cy9kZWZ3bmQuY10gW3dpbmRvd3Mvbm9uY2xpZW50LmNdCisJV29yZCBkb2N1bWVudCB3aW5kb3cgYWN0aXZhdGlvbiBmaXguCisKKwkqIFt3aW5kb3dzL21kaS5jXSBbd2luZG93cy93aW4uY10KKwlSZXBsYWNlZCBXQ0wgbGlzdHMgd2l0aCBXSU5fQnVpbGRXaW5BcnJheSgpLgorCitNb24gSnVuICA5IDIzOjUxOjE2IDE5OTcgIEFuZHJldyBUYXlsb3IgPGFuZHJld0ByaXNjYW4uY29tPgorCisJKiBbbWlzYy9lcnJvci5jXSBbaW5jbHVkZS93aW5kb3dzLmhdIFtpZjE2MzIva2VybmVsLnNwZWNdCisJSW1wbGVtZW50ZWQgTG9nUGFyYW1FcnJvciwgTG9nRXJyb3IgZnVuY3Rpb25zLgorCitUdWUgSnVuICAzIDIzOjQ2OjA0IDE5OTcgIE1pY2hpZWwgdmFuIExvb24gPG1mdmxAeHM0YWxsLm5sPgorCisJKiBbaW5jbHVkZS9tbXN5c3RlbS5oXSBbbXVsdGltZWRpYS9hdWRpby5jXQorCUNvbnN0YW50cyBmb3IgYXN5bmNocm9ub3VzIHBsYXkgYW5kIHJlY29yZC4KKworCSogW211bHRpbWVkaWEvdGltZS5jXQorCUZpbGxlZCBpbiBzb21lIGVtcHR5IGZ1bmN0aW9ucy4KKworCSogW211bHRpbWVkaWEvbW1zeXN0ZW0uY10KKwlGaXhlZCBidWdzIGluIHdhdmVPdXRPcGVuLgorCisJKiBbbXVsdGltZWRpYS9tbXN5c3RlbS5jXSBbbXVsdGltZWRpYS9hdWRpby5jXQorCUltcGxlbWVudGVkIFdpbmRvdyBDYWxsYmFjayBmb3Igd2F2ZSBvdXRwdXQgYXQgbGVhc3QuCisKKwkqIFtmaWxlcy9maWxlLmNdCisJQ29ycmVjdGVkIGJ1ZyBpbiBGaWxlRG9zU2V0RXJyb3IuCisJTlVMTCBwb2ludGVyIGNoZWNraW5nIGFkZGVkLgorCisJKiBbbWlzYy9zcHkuY10KKwlBZGRlZCBNdWx0aW1lZGlhIG1lc3NhZ2VzIHRvIFNQWV9HZXRNc2dOYW1lLgorCitUdWUgSnVuIDMgMjI6MzQ6MzAgMTk5NyAgTWFyY3VzIE1laXNzbmVyIDxtc21laXNzbkBjaXAuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisKKwkqIFtkZWJ1Z2dlci8qLmNdW2luY2x1ZGUvcGVleGUuaF1bbG9hZGVyLyouY11bdG9vbHMvYnVpbGQuY10KKwkgIFt0b29scy9mbnQyYmRmLmNdW2xpYnJhcnkvc3VwLmNdCisJSU1BR0VfKiBzdHJ1Y3RzL2RlZmluZXMgY2hhbmdlZCBmaXQgYmV0dGVyIHRvIFNESyBuYW1pbmcKKwlEb24ndCBsb2FkIG5vbi1pMzg2IFBFIGV4ZWN1dGFibGVzLgorCSVmcyBzaG91bGQgYWxyZWFkeSBiZSBpbml0aWFsaXNlZCBmb3IgdGhlIEZJUlNUIGxvYWRlZCBQRSBtb2R1bGUuCisKKwkqIFtpZjE2MzIvYWR2YXBpLnNwZWNdW3dpbjMyL2FkdmFwaS5jXQorCVNvbWUgc21hbGwgc3R1YnMgYWRkZWQgdG8gYnJpbmcgd2luMzIgc2V0dXAuZXhlIGEgYml0IGZhcnRoZXIuCisKKwkqIFtpZjE2MzIva2VybmVsMzIuc3BlY11bc2NoZWR1bGVyL3Byb2Nlc3MuY10KKwlBZGFwdGVkIHRvIG1hdGNoIHdpbjk1IGtlcm5lbDMyLmRsbCBvcmRpbmFscyAoTlQgZG9lc24ndCB1c2UKKyAJb3JkaW5hbCBpbXBvcnQpLCBzb21lIG9yZGluYWwgb25seSBleHBvcnRlZCBmdW5jdGlvbnMgYWRkZWQuCisKKwkqIFtpZjE2MzIvcmVsYXkuY10KKwlBZGRlZCBDYWxsUHJvYzMyVy4KKworCSogW21pc2MvbHpleHBhbmQuY10KKwlGaXhlZCByZXR1cm4gdmFsdWVzIG9mIEdldEV4cGFuZGVkTmFtZSogKHRoYW5rcyB0byBBbmRyZWFzIE1vaHIpLgorCisJKiBbb2JqZWN0cy9kaWIuY10KKwlFdmVyeXRoaW5nIHdpdGggbW9yZSB0aGFuIDggYml0IG9mIGNvbG9yIGlzIGEgdHJ1ZWNvbG9yIG1vZGUKKwlhbmQgZG9lc24ndCBoYXZlIGEgY29sb3JtYXAuCisKK1R1ZSBKdW4gIDMgMDk6MjQ6NTMgMTk5NyAgSm9obiBIYXJ2ZXkgPGpvaG5AZGl2aXNpb24uY28udWs+CisKKwkqIFtncmFwaGljcy93aW4xNmRydi9mb250LmNdIFtncmFwaGljcy93aW4xNmRydi9pbml0LmNdCisJICBbZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmNdIFtncmFwaGljcy93aW4xNmRydi90ZXh0LmNdCisJICBbaW5jbHVkZS93aW4xNmRydi5oXQorCUNoYW5nZWQgc29tZSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHBhc3NlZCB0byBhbmQgZnJvbSB0aGUgMTYgYml0CisgCWRyaXZlcnMgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZSBnbG9iYWwgaGVhcC4KKwlJbXBsZW1lbnRlZCBFc2NhcGUoQ29udHJvbCkgMHgxMDAgR2V0RXh0VGV4dERhdGEgcHJvcGVybHkgdG8KKwlzdG9wIHdvcmQgZnJvbSBjcmFzaGluZy4KKwlQb3N0c2NyaXB0IGRyaXZlciBub3cgcHJpbnRzIG9uIGNvbXBsZXRlIHBhZ2UgaW5zdGVhZCBvZiB0b3AKKwlsZWZ0IGNvcm5lci4KKwlQcmludCBzcG9vbGluZyBpbXBsZW1lbnRlZC4KKworCSogW2xvYWRlci9tb2R1bGUuY10KKwlNT0RVTEVfR2V0T3JkaW5hbCBjaGFuZ2VkIGNoYXIgYnVmZmVyIHRvIHVuc2lnbmVkIGNoYXIgdG8gc3RvcAorCWEgbG9vcCB0aGF0IHdhcyBoYXBwZW5pbmcgd2hlbiBydW5uaW5nIHRoZSBmb250IGNvbnRyb2wKKwlwcm9ncmFtIGZyb20gdGhlIGNvbnRyb2wgcGFuZWwuCisKK1N1biBKdW4gIDEgMTk6MDU6MDIgMTk5NyAgUGV0ZXIgU2NobGFpbGUgPHVwOW5AcnoudW5pLWthcmxzcnVoZS5kZT4KKworCSogW2luY2x1ZGUvbWlzY2VtdS5oXSBbbG9hZGVyL21haW4uY10gW21zZG9zL2lvcG9ydHMuY10KKwlBZGRlZCBzdXBwb3J0IGZvciBkaXJlY3QgaW8gcG9ydCBhY2Nlc3MuCisKK0ZyaSBNYXkgMzAgMTY6MTg6MzUgMTk5NyAgRGF2aWQgQS4gQ3V0aGJlcnQgPGRhY3V0QGRzc2MzMzUzLmVjZS5jbXUuZWR1PgorCisJKiBbbWlzYy92ZXIuY10KKwlJbXBsZW1lbnRlZCBWZXJGaW5kRmlsZTE2LgorCitUdWUgTWF5IDI3IDIyOjAwOjM5IDE5OTcgIFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4KKworCSogW21pc2MvY29tbS5jXQorCUZpeGVkIEdldENvbW1FcnJvciBhbmQgR2V0Q29tbUV2ZW50TWFzay4KKworVHVlIE1heSAyNyAgOToxMDo1MyAxOTk3ICBHZW9yZyBCZXllcmxlIDxnYmV5ZXJsZUBhd2ktcG90c2RhbS5kZT4KKworCSogW3NjaGVkdWxlci90aHJlYWQuY10KKwlNaW5vciBmaXggaW4gdGhyZWFkIGRhdGFiYXNlIGluaXRpYWxpemF0aW9uLgorCitNb24gTWF5IDI2IDE5OjQ2OjM0IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIFtvYmplY3RzL2RjLmNdCisJSW4gRENfU2V0dXBHQ0ZvclBlbiwgYXZvaWQgdG8gZHJhdyBpbiBHWHhvciBtb2RlIHdpdGggYSAwIG1hc2suCisKK01vbiBNYXkgMjYgMTU6MjI6NDIgMTk5NyAgQnJ1Y2UgTWlsbmVyIDxCcnVjZS5NaWxuZXJAZ2VuZXRpY3MudXRhaC5lZHU+CisKKwkqIFtsb2FkZXIvcGVfaW1hZ2UuY10KKwlBZGQgY29kZSBmb3IgbW9kdWxlcyB0aGF0IGNvLXJlZmVyZW5jZSBlYWNoIG90aGVyLiBQaG90b2RleCdzCisJYWdkcy5leGUgKGNwaWMzMikgaGFzIHR3byBkbGwncyB0aGF0IG1ha2UgY2FsbHMgaW50byBlYWNoIG90aGVyLgorCitNb24gTWF5IDI2IDEzOjM4OjE2IDE5OTcgIEpvZHkgR29sZGJlcmcgPGpvZHlnQGlkdC5uZXQ+CisKKwkqIFttZW1vcnkvdmlydHVhbC5jXQorCURvbnQgdXNlIHN0ZGlvIHdoZW4gcmVhZGluZyAvcHJvYy9zZWxmL21hcHMuICBJdCBjYXVzZXMgcHJvYmxlbXMKKwl3aXRoIGxpYmM2LgorCisJKiBbd2luZG93cy9kaWFsb2cuY10KKwlUcmFuc2xhdGUgbWVzc2FnZXMgaW4gSXNEaWFsb2dNZXNzYWdlIHdoZW4gRExHQ19XQU5UTUVTU0FHRQorCWlzIHVzZWQuCisKK1N1biBNYXkgMjUgMTc6MDI6MjEgMTk5NyAgSHV3IEQgTSBEYXZpZXMgPGguZGF2aWVzMUBwaHlzaWNzLm94Zm9yZC5hYy51az4KKworCSogW29iamVjdHMvbWV0YWZpbGUuY10KKwlSZXNvdXJjZSBjbGVhbnVwIGluIEVudW1NZXRhRmlsZSgpLiBUaGlzIHdhcyBvbmUgcmVhc29uIFdvcmQgd2FzCisJY3Jhc2hpbmcgYWZ0ZXIgbG9uZyBwZXJpb2RzIG9mIHVzZS4gKFRoYW5rcyB0byBDaHJpcyBVbmRlcmhpbGwgZm9yCisJdGhlIGxvZ3MpCisKK1N1biBNYXkgMjUgMTQ6NTk6MzMgMTk5NyAgSmltZW4gQ2hpbmcgIDxqY2hpbmdAZmxleC5jb20+CisKKwkqIFttdWx0aW1lZGlhL21jaXN0cmluZy5jXQorCUluaXRpYWwgc3VwcG9ydCBmb3IgY29tcG91bmQgTUNJIGNvbW1hbmRzLgorCVVzZSBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmUgZm9yICdhbGlhcycgYW5kICdlbGVtZW50JyBrZXl3b3Jkcy4KKwlGaXhlZCBwb2ludGVyIGNvcHkgb2YgYXJncyBrZXl3b3JkcyBhcnJheS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogVHVlIE1heSAyMCAxOToyMDoyMyAxOTk3ICBQYWJsbyBTYXJhdHhhZ2EgPHNydHhnQGxpbnV4LmNoYW5hZS5zdGJlbi5iZT4KIAogCSogW3Jlc291cmNlcy9zeXNyZXNfRXMucmNdCmRpZmYgLS1naXQgYS9ERVZFTE9QRVJTLUhJTlRTIGIvREVWRUxPUEVSUy1ISU5UUwppbmRleCBmMzc2YTIyLi4xNGI0N2UxIDEwMDY0NAotLS0gYS9ERVZFTE9QRVJTLUhJTlRTCisrKyBiL0RFVkVMT1BFUlMtSElOVFMKQEAgLTIzOSwzICsyMzksMTMgQEAKIFlvdSBoYXZlIHRvIHN0YXJ0IHRvb2xzL21ha2VfZGVidWcgb25seSBpZiB5b3UgaW50cm9kdWNlZCBhIG5ldyBtYWNybywKIGUuZy4gIGRwcmludGZfd2luMzJzIC0gbm90IGlmIHlvdSBqdXN0IGNoYW5nZWQgb25lIG9mIHRoZSAjZGVmaW5lCiBERUJVR19YWFgncyBpbiBpbmNsdWRlL3N0ZGRlYnVnLmggb3IgaW4gYSBzcGVjaWZpYyBmaWxlLgorCitNT1JFIElORk8KKz09PT09PT09PQorCisxLiBodHRwOi8vd3d3LnNvbmljLm5ldC9+dW5kb2MvYm9va3N0b3JlLmh0bWwKKworMi4gSW4gMTk5MyBEci4gRG9iYnMgSm91cm5hbCBwdWJsaXNoZWQgYSBjb2x1bW4gY2FsbGVkICJVbmRvY3VtZW50ZWQgQ29ybmVyIi4KKworMy4gWW91IG1pZ2h0IHdhbnQgdG8gY2hlY2sgb3V0IEJZVEUgZnJvbSBEZWNlbWJlciAxOTgzIGFzIHdlbGwgOi0pCisKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCA1ZGQ3YmE3Li4xN2JiOWVjIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC03NCw2ICs3NCw5IEBACiBIYXZlIGEgbmljZSBnYW1lIG9mIHNvbGl0YWlyZSwgYnV0IGJlIGNhcmVmdWwuICBFbXVsYXRpb24gaXNuJ3QgcGVyZmVjdC4KIFNvLCBvY2Nhc2lvbmFsbHkgaXQgbWF5IGNyYXNoLgogCitVUERBVEU6IFdpbmRvd3MgOTUgY29tcG9uZW50cyBhcmUga25vd24gdG8gY2F1c2UgbW9yZSBjcmFzaGVzIGNvbXBhcmVkCisgICAgICAgIHRvIHRoZSBlcXVpdmFsZW50IFdpbmRvd3MgMy4xIGxpYnJhcmllcy4KKwogCiA1LiBHRVRUSU5HIE1PUkUgSU5GT1JNQVRJT04KIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvTWFrZWZpbGUuaW4gYi9jb250cm9scy9NYWtlZmlsZS5pbgppbmRleCAwOTE4OGI1Li4zMzc5YjE4IDEwMDY0NAotLS0gYS9jb250cm9scy9NYWtlZmlsZS5pbgorKysgYi9jb250cm9scy9NYWtlZmlsZS5pbgpAQCAtMTAsNiArMTAsNyBAQAogCWNvbWJvLmMgXAogCWRlc2t0b3AuYyBcCiAJZWRpdC5jIFwKKwlpY29udGl0bGUuYyBcCiAJbGlzdGJveC5jIFwKIAltZW51LmMgXAogCXNjcm9sbC5jIFwKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWJvLmMgYi9jb250cm9scy9jb21iby5jCmluZGV4IGNkMWE2YjUuLjM3NzE5MzMgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWJvLmMKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtMTUyLDcgKzE1Miw4IEBACiAKICAgICAgICBpZiggbHBoYy0+aEZvbnQgKSBoUHJldkZvbnQgPSBTZWxlY3RPYmplY3QxNiggaERDLCBscGhjLT5oRm9udCApOwogICAgCi0gICAgICAgR2V0VGV4dEV4dGVudFBvaW50MTYoIGhEQywgIlgiLCAxLCAmc2l6ZSk7CisgICAgICAgR2V0VGV4dEV4dGVudFBvaW50MTYoIGhEQywgIjAiLCAxLCAmc2l6ZSk7CisKICAgICAgICBzaXplLmN5ICs9IHNpemUuY3kgLyA0ICsgNCAqIFNZU01FVFJJQ1NfQ1lCT1JERVI7CiAKICAgICAgICBpZiggaFByZXZGb250ICkgU2VsZWN0T2JqZWN0MTYoIGhEQywgaFByZXZGb250ICk7CmRpZmYgLS1naXQgYS9jb250cm9scy9pY29udGl0bGUuYyBiL2NvbnRyb2xzL2ljb250aXRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjQwODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cm9scy9pY29udGl0bGUuYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIEljb250aXRsZSB3aW5kb3cgY2xhc3MuCisgKgorICogQ29weXJpZ2h0IDE5OTcgQWxleCBLb3JvYmthCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKKyNpbmNsdWRlICJzeXNjb2xvci5oIgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImRlc2t0b3AuaCIKKyNpbmNsdWRlICJncmFwaGljcy5oIgorI2luY2x1ZGUgImhlYXAuaCIKKworc3RhdGljICBMUENTVFIJZW1wdHlUaXRsZVRleHQgPSAiPC4uLj4iOworCisJQk9PTDMyCWJNdWx0aUxpbmVUaXRsZTsKKwlIRk9OVDMyCWhJY29uVGl0bGVGb250OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJQ09OVElUTEVfSW5pdAorICovCitCT09MMzIgSUNPTlRJVExFX0luaXQodm9pZCkKK3sKKyAgICBMT0dGT05UMTYgbG9nRm9udDsKKworICAgIFN5c3RlbVBhcmFtZXRlcnNJbmZvMTYoIFNQSV9HRVRJQ09OVElUTEVMT0dGT05ULCAwLCAmbG9nRm9udCwgMCApOworICAgIFN5c3RlbVBhcmFtZXRlcnNJbmZvMTYoIFNQSV9HRVRJQ09OVElUTEVXUkFQLCAwLCAmYk11bHRpTGluZVRpdGxlLCAwICk7CisgICAgaEljb25UaXRsZUZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3QxNiggJmxvZ0ZvbnQgKTsKKyAgICByZXR1cm4gKGhJY29uVGl0bGVGb250KSA/IFRSVUUgOiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSUNPTlRJVExFX0NyZWF0ZQorICovCitIV05EMzIgSUNPTlRJVExFX0NyZWF0ZSggV05EKiB3bmQgKQoreworICAgIFdORCogd25kUHRyOworICAgIEhXTkQzMiBoV25kOworCisgICAgaWYoIHduZC0+ZHdTdHlsZSAmIFdTX0NISUxEICkKKwloV25kID0gQ3JlYXRlV2luZG93RXgzMkEoIDAsIElDT05USVRMRV9DTEFTU19BVE9NLCBOVUxMLAorCQkJCSAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MsIDAsIDAsIDEsIDEsCisJCQkJICB3bmQtPnBhcmVudC0+aHduZFNlbGYsIDAsIHduZC0+aEluc3RhbmNlLCBOVUxMICk7CisgICAgZWxzZQorCWhXbmQgPSBDcmVhdGVXaW5kb3dFeDMyQSggMCwgSUNPTlRJVExFX0NMQVNTX0FUT00sIE5VTEwsCisJCQkJICBXU19DTElQU0lCTElOR1MsIDAsIDAsIDEsIDEsCisJCQkJICB3bmQtPmh3bmRTZWxmLCAwLCB3bmQtPmhJbnN0YW5jZSwgTlVMTCApOworICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBoV25kICk7CisgICAgaWYoIHduZFB0ciApCisgICAgeworCXduZFB0ci0+b3duZXIgPSB3bmQ7CS8qIE1ESSBkZXBlbmRzIG9uIHRoaXMgKi8KKwl3bmRQdHItPmR3U3R5bGUgJj0gfihXU19DQVBUSU9OIHwgV1NfQk9SREVSKTsKKwlpZiggd25kLT5kd1N0eWxlICYgV1NfRElTQUJMRUQgKSB3bmRQdHItPmR3U3R5bGUgfD0gV1NfRElTQUJMRUQ7CisJcmV0dXJuIGhXbmQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJQ09OVElUTEVfR2V0VGl0bGVQb3MKKyAqLworc3RhdGljIEJPT0wzMiBJQ09OVElUTEVfR2V0VGl0bGVQb3MoIFdORCogd25kLCBMUFJFQ1QzMiBscFJlY3QgKQoreworICAgIExQU1RSIHN0cjsKKyAgICBpbnQgbGVuZ3RoID0gbHN0cmxlbjMyQSggd25kLT5vd25lci0+dGV4dCApOworCisgICAgaWYoIGxlbmd0aCApCisgICAgeworCXN0ciA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuZ3RoICsgMSApOworCWxzdHJjcHkzMkEoIHN0ciwgd25kLT5vd25lci0+dGV4dCApOworCXdoaWxlKCBzdHJbbGVuZ3RoIC0gMV0gPT0gJyAnICkgLyogcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcyAqLworCXsgCisJICAgIHN0clstLWxlbmd0aF0gPSAnXDAnOworCSAgICBpZiggIWxlbmd0aCApCisJICAgIHsKKwkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHN0ciApOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYoICFsZW5ndGggKSAKKyAgICB7CisJc3RyID0gKExQU1RSKWVtcHR5VGl0bGVUZXh0OworCWxlbmd0aCA9IGxzdHJsZW4zMkEoIHN0ciApOworICAgIH0KKworICAgIGlmKCBzdHIgKQorICAgIHsKKwlIREMzMiBoREMgPSBHZXREQzMyKCB3bmQtPmh3bmRTZWxmICk7CisJaWYoIGhEQyApCisJeworCSAgICBIRk9OVDMyIGhQcmV2Rm9udCA9IFNlbGVjdE9iamVjdDMyKCBoREMsIGhJY29uVGl0bGVGb250ICk7CisKKwkgICAgU2V0UmVjdDMyKCBscFJlY3QsIDAsIDAsIHN5c01ldHJpY3NbU01fQ1hJQ09OU1BBQ0lOR10gLQorCQkgICAgICAgU1lTTUVUUklDU19DWEJPUkRFUiAqIDIsIFNZU01FVFJJQ1NfQ1lCT1JERVIgKiAyICk7CisKKwkgICAgRHJhd1RleHQzMkEoIGhEQywgc3RyLCBsZW5ndGgsIGxwUmVjdCwgRFRfQ0FMQ1JFQ1QgfAorCQkJIERUX0NFTlRFUiB8IERUX05PUFJFRklYIHwgRFRfV09SREJSRUFLIHwKKwkJCSAoKCBiTXVsdGlMaW5lVGl0bGUgKSA/IDAgOiBEVF9TSU5HTEVMSU5FKSApOworCisJICAgIFNlbGVjdE9iamVjdDMyKCBoREMsIGhQcmV2Rm9udCApOworCSAgICBSZWxlYXNlREMzMiggd25kLT5od25kU2VsZiwgaERDICk7CisKKwkgICAgbHBSZWN0LT5yaWdodCArPSA0ICogU1lTTUVUUklDU19DWEJPUkRFUiAtIGxwUmVjdC0+bGVmdDsKKwkgICAgbHBSZWN0LT5sZWZ0ID0gd25kLT5vd25lci0+cmVjdFdpbmRvdy5sZWZ0ICsgU1lTTUVUUklDU19DWElDT04gLyAyIC0KKwkJCQkgICAgICAobHBSZWN0LT5yaWdodCAtIGxwUmVjdC0+bGVmdCkgLyAyOworCSAgICBscFJlY3QtPmJvdHRvbSAtPSBscFJlY3QtPnRvcDsKKwkgICAgbHBSZWN0LT50b3AgPSB3bmQtPm93bmVyLT5yZWN0V2luZG93LnRvcCArIFNZU01FVFJJQ1NfQ1lJQ09OOworCX0KKwlpZiggc3RyICE9IGVtcHR5VGl0bGVUZXh0ICkgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHN0ciApOworCXJldHVybiAoIGhEQyApID8gVFJVRSA6IEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIElDT05USVRMRV9QYWludAorICovCitzdGF0aWMgQk9PTDMyIElDT05USVRMRV9QYWludCggV05EKiB3bmQsIEhEQzMyIGhEQywgQk9PTDMyIGJBY3RpdmUgKQoreworICAgIEhGT05UMzIgaFByZXZGb250OworICAgIEhCUlVTSDMyIGhCcnVzaCA9IDA7CisgICAgQ09MT1JSRUYgdGV4dENvbG9yID0gMDsKKworICAgIGlmKCBiQWN0aXZlICkKKyAgICB7CisJaEJydXNoID0gc3lzQ29sb3JPYmplY3RzLmhicnVzaEFjdGl2ZUNhcHRpb247CisJdGV4dENvbG9yID0gR2V0U3lzQ29sb3IzMihDT0xPUl9DQVBUSU9OVEVYVCk7CisgICAgfQorICAgIGVsc2UgCisgICAgeworCWlmKCB3bmQtPmR3U3R5bGUgJiBXU19DSElMRCApIAorCXsgCisJICAgIGhCcnVzaCA9IHduZC0+cGFyZW50LT5jbGFzcy0+aGJyQmFja2dyb3VuZDsKKwkgICAgaWYoIGhCcnVzaCApCisJICAgIHsKKwkJSU5UMzIgbGV2ZWw7CisJCUxPR0JSVVNIMzIgbG9nQnJ1c2g7CisJCUdldE9iamVjdDMyQSggaEJydXNoLCBzaXplb2YobG9nQnJ1c2gpLCAmbG9nQnJ1c2ggKTsKKwkJbGV2ZWwgPSBHZXRSVmFsdWUobG9nQnJ1c2gubGJDb2xvcikgKworCQkJICAgR2V0R1ZhbHVlKGxvZ0JydXNoLmxiQ29sb3IpICsKKwkJCSAgICAgIEdldEJWYWx1ZShsb2dCcnVzaC5sYkNvbG9yKTsKKwkJaWYoIGxldmVsIDwgKDB4N0YgKiAzKSApCisJCSAgICB0ZXh0Q29sb3IgPSBSR0IoIDB4RkYsIDB4RkYsIDB4RkYgKTsKKwkgICAgfQorCSAgICBlbHNlCisJCWhCcnVzaCA9IEdldFN0b2NrT2JqZWN0MzIoIFdISVRFX0JSVVNIICk7CisJfQorCWVsc2UKKwl7CisJICAgIGhCcnVzaCA9IEdldFN0b2NrT2JqZWN0MzIoIEJMQUNLX0JSVVNIICk7CisJICAgIHRleHRDb2xvciA9IFJHQiggMHhGRiwgMHhGRiwgMHhGRiApOyAgICAKKwl9CisgICAgfQorCisgICAgRmlsbFdpbmRvdyggd25kLT5wYXJlbnQtPmh3bmRTZWxmLCB3bmQtPmh3bmRTZWxmLCBoREMsIGhCcnVzaCApOworCisgICAgaFByZXZGb250ID0gU2VsZWN0T2JqZWN0MzIoIGhEQywgaEljb25UaXRsZUZvbnQgKTsKKyAgICBpZiggaFByZXZGb250ICkKKyAgICB7CisgICAgICAgIFJFQ1QxNiAgcmVjdDsKKwlJTlQzMglsZW5ndGg7CisJY2hhcglidWZmZXJbODBdOworCisJcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOworCXJlY3QucmlnaHQgPSB3bmQtPnJlY3RXaW5kb3cucmlnaHQgLSB3bmQtPnJlY3RXaW5kb3cubGVmdDsKKwlyZWN0LmJvdHRvbSA9IHduZC0+cmVjdFdpbmRvdy5ib3R0b20gLSB3bmQtPnJlY3RXaW5kb3cudG9wOworCisJbGVuZ3RoID0gR2V0V2luZG93VGV4dDMyQSggd25kLT5vd25lci0+aHduZFNlbGYsIGJ1ZmZlciwgODAgKTsKKyAgICAgICAgU2V0VGV4dENvbG9yMzIoIGhEQywgdGV4dENvbG9yICk7CisgICAgICAgIFNldEJrTW9kZTMyKCBoREMsIFRSQU5TUEFSRU5UICk7CisJCisJRHJhd1RleHQxNiggaERDLCBidWZmZXIsIGxlbmd0aCwgJnJlY3QsIERUX0NFTlRFUiB8IERUX05PUFJFRklYIHwKKwkJICAgIERUX1dPUkRCUkVBSyB8ICgoYk11bHRpTGluZVRpdGxlKSA/IDAgOiBEVF9TSU5HTEVMSU5FKSApOyAKKworCVNlbGVjdE9iamVjdDMyKCBoREMsIGhQcmV2Rm9udCApOworICAgIH0KKyAgICByZXR1cm4gKCBoUHJldkZvbnQgKSA/IFRSVUUgOiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSWNvblRpdGxlV25kUHJvYworICovCitMUkVTVUxUIEljb25UaXRsZVduZFByb2MoIEhXTkQzMiBoV25kLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQoreworICAgIFdORCAqd25kID0gV0lOX0ZpbmRXbmRQdHIoIGhXbmQgKTsKKworICAgIHN3aXRjaCggbXNnICkKKyAgICB7CisJY2FzZSBXTV9OQ0hJVFRFU1Q6CisJICAgICByZXR1cm4gSFRDQVBUSU9OOworCisJY2FzZSBXTV9OQ01PVVNFTU9WRToKKwljYXNlIFdNX05DTEJVVFRPTkRCTENMSzoKKwkgICAgIHJldHVybiBTZW5kTWVzc2FnZTMyQSggd25kLT5vd25lci0+aHduZFNlbGYsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsJCisKKwljYXNlIFdNX0FDVElWQVRFOgorCSAgICAgaWYoIHdQYXJhbSApIFNldEFjdGl2ZVdpbmRvdzMyKCB3bmQtPm93bmVyLT5od25kU2VsZiApOworCSAgICAgLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIFdNX0NMT1NFOgorCSAgICAgcmV0dXJuIDA7CisKKwljYXNlIFdNX1NIT1dXSU5ET1c6CisJICAgICBpZiggd25kICYmIHdQYXJhbSApCisJICAgICB7CisJCSBSRUNUMzIgdGl0bGVSZWN0OworCisJCSBJQ09OVElUTEVfR2V0VGl0bGVQb3MoIHduZCwgJnRpdGxlUmVjdCApOworCQkgaWYoIHduZC0+b3duZXItPm5leHQgIT0gd25kICkJLyoga2VlcCBpY29uIHRpdGxlIGJlaGluZCB0aGUgb3duZXIgKi8KKwkJICAgICBTZXRXaW5kb3dQb3MzMiggaFduZCwgd25kLT5vd25lci0+aHduZFNlbGYsIAorCQkJCSAgICAgdGl0bGVSZWN0LmxlZnQsIHRpdGxlUmVjdC50b3AsCisJCQkJICAgICB0aXRsZVJlY3QucmlnaHQsIHRpdGxlUmVjdC5ib3R0b20sIFNXUF9OT0FDVElWQVRFICk7CisJCSBlbHNlCisJCSAgICAgU2V0V2luZG93UG9zMzIoIGhXbmQsIDAsIHRpdGxlUmVjdC5sZWZ0LCB0aXRsZVJlY3QudG9wLAorCQkJCSAgICAgdGl0bGVSZWN0LnJpZ2h0LCB0aXRsZVJlY3QuYm90dG9tLCAKKwkJCQkgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSICk7CisJICAgICB9CisJICAgICByZXR1cm4gMDsKKworCWNhc2UgV01fRVJBU0VCS0dORDoKKwkgICAgIGlmKCB3bmQgKQorCSAgICAgeworCQkgV05EKiBpY29uV25kID0gd25kLT5vd25lcjsKKworCQkgaWYoIGljb25XbmQtPmR3U3R5bGUgJiBXU19DSElMRCApCisJCSAgICAgbFBhcmFtID0gU2VuZE1lc3NhZ2UzMkEoIGljb25XbmQtPmh3bmRTZWxmLCBXTV9JU0FDVElWRUlDT04sIDAsIDAgKTsKKwkJIGVsc2UKKwkJICAgICBsUGFyYW0gPSAoaWNvblduZC0+aHduZFNlbGYgPT0gR2V0QWN0aXZlV2luZG93MTYoKSk7CisKKwkJIGlmKCBJQ09OVElUTEVfUGFpbnQoIHduZCwgKEhEQzMyKXdQYXJhbSwgKEJPT0wzMilsUGFyYW0gKSApCisJCSAgICAgVmFsaWRhdGVSZWN0MzIoIGhXbmQsIE5VTEwgKTsKKwkgICAgICAgICByZXR1cm4gMTsKKwkgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSggaFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworfQorCisKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2xpc3Rib3guYyBiL2NvbnRyb2xzL2xpc3Rib3guYwppbmRleCA0OGIxODFmLi41MTZmYjI0IDEwMDY0NAotLS0gYS9jb250cm9scy9saXN0Ym94LmMKKysrIGIvY29udHJvbHMvbGlzdGJveC5jCkBAIC0xNzMxLDEyICsxNzMxLDkgQEAKICAgICBpZiAoTElTVEJPWF9UaW1lciAhPSBMQl9USU1FUl9OT05FKQogICAgICAgICBLaWxsU3lzdGVtVGltZXIzMiggd25kLT5od25kU2VsZiwgTEJfVElNRVJfSUQgKTsKICAgICBMSVNUQk9YX1RpbWVyID0gTEJfVElNRVJfTk9ORTsKLSAgICBpZiAoR2V0Q2FwdHVyZTMyKCkgPT0gd25kLT5od25kU2VsZikgCi0gICAgewotCVJlbGVhc2VDYXB0dXJlKCk7Ci0gICAgICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTk9USUZZKQotICAgICAgICAgICAgU0VORF9OT1RJRklDQVRJT04oIHduZCwgZGVzY3IsIExCTl9TRUxDSEFOR0UgKTsKLSAgICB9CisgICAgaWYgKEdldENhcHR1cmUzMigpID09IHduZC0+aHduZFNlbGYpIFJlbGVhc2VDYXB0dXJlKCk7CisgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19OT1RJRlkpCisgICAgICAgIFNFTkRfTk9USUZJQ0FUSU9OKCB3bmQsIGRlc2NyLCBMQk5fU0VMQ0hBTkdFICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3dpZGdldHMuYyBiL2NvbnRyb2xzL3dpZGdldHMuYwppbmRleCA3MjliZDZkLi43ZWZjNzY1IDEwMDY0NAotLS0gYS9jb250cm9scy93aWRnZXRzLmMKKysrIGIvY29udHJvbHMvd2lkZ2V0cy5jCkBAIC0zMCw2ICszMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApOwogZXh0ZXJuIExSRVNVTFQgUG9wdXBNZW51V25kUHJvYyggSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKTsKK2V4dGVybiBMUkVTVUxUIEljb25UaXRsZVduZFByb2MoIEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sCisJCQkJIExQQVJBTSBsUGFyYW0gKTsKIAogLyogV2luMTYgY2xhc3MgaW5mbyAqLwogCkBAIC04NSw3ICs4NywxMCBAQAogICAgICAgMCwgMCwgSURDX0FSUk9XLCAwLCAwLCBERVNLVE9QX0NMQVNTX05BTUUgfSwKICAgICAvKiBCSUMzMl9ESUFMT0cgKi8KICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfU0FWRUJJVFMsIERlZkRsZ1Byb2MzMkEsIDAsIERMR1dJTkRPV0VYVFJBLAotICAgICAgMCwgMCwgSURDX0FSUk9XLCAwLCAwLCBESUFMT0dfQ0xBU1NfTkFNRSB9CisgICAgICAwLCAwLCBJRENfQVJST1csIDAsIDAsIERJQUxPR19DTEFTU19OQU1FIH0sCisgICAgLyogQklDMzJfSUNPTlRJVExFICovCisgICAgeyBDU19HTE9CQUxDTEFTUywgSWNvblRpdGxlV25kUHJvYywgMCwgMCwgCisgICAgICAwLCAwLCBJRENfQVJST1csIDAsIDAsIElDT05USVRMRV9DTEFTU19OQU1FIH0KIH07CiAKIHN0YXRpYyBBVE9NIGJpY0F0b21UYWJsZVtCSUMzMl9OQl9DTEFTU0VTXTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RiZy55IGIvZGVidWdnZXIvZGJnLnkKaW5kZXggYjkxM2M3MC4uY2M2ZDM1ZCAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZGJnLnkKKysrIGIvZGVidWdnZXIvZGJnLnkKQEAgLTU0Nyw2ICs1NDcsMTcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBEZWJ1Z0JyZWFrMzIgICAoS0VSTkVMMzIpCisgKi8KK3ZvaWQgRGVidWdCcmVhazMyKCBDT05URVhUICpyZWdzICkKK3sKKyAgICBjb25zdCBjaGFyICptb2R1bGUgPSBNT0RVTEVfR2V0TW9kdWxlTmFtZSggR2V0RXhlUHRyKEdldEN1cnJlbnRUYXNrKCkpICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiJXMgY2FsbGVkIERlYnVnQnJlYWtcbiIsIG1vZHVsZSA/IG1vZHVsZSA6ICI/Pz8iICk7CisgICAgREVCVUdfY29udGV4dCA9ICpyZWdzOworICAgIERFQlVHX01haW4oIFNJR1RSQVAgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRGVidWdCcmVhazE2ICAgKEtFUk5FTC4yMDMpCiAgKi8KIHZvaWQgRGVidWdCcmVhazE2KCBDT05URVhUICpyZWdzICkKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RiZ21haW4uYyBiL2RlYnVnZ2VyL2RiZ21haW4uYwppbmRleCA3YzE5OTJiLi4wNGNmN2FjIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYmdtYWluLmMKKysrIGIvZGVidWdnZXIvZGJnbWFpbi5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIAljaGFyCQkJCSogbW9kdWxlX25hbWU7CiAJY2hhcgkJCQkqIGRiZ19pbmZvOwogCWludAkJCQkgIGRiZ19zaXplOwotCXN0cnVjdCBQRV9EZWJ1Z19kaXIJCSogZGJnZGlyOworCUxQSU1BR0VfREVCVUdfRElSRUNUT1JZCQkgIGRiZ2RpcjsKIAlzdHJ1Y3QgcGVfZGF0YQkJCSogcGU7CiAgICAgICAgIExQSU1BR0VfU0VDVElPTl9IRUFERVIgICAgICAgICAgICBzZWN0cDsKIAlpbnQJCQkJICBuc2VjdDsKQEAgLTE4OSw3ICsxODksNyBAQAogdGVzdF9wZGJzdHVmZigpCiB7CiAgIHN0cnVjdCBkZWZlcnJlZF9kZWJ1Z19pbmZvIGRlZWZlcjsKLSAgc3RydWN0IFBFX0RlYnVnX2RpcglkaW5mbzsKKyAgSU1BR0VfREVCVUdfRElSRUNUT1JZIGRpbmZvOwogICBzdHJ1Y3QgQ29kZVZpZXdEZWJ1ZyBjZGVidWc7CiAgIElNQUdFX1NFQ1RJT05fSEVBREVSICBzZWN0c1sxMF07CiAKQEAgLTE5OSw3ICsxOTksNyBAQAogICBtZW1zZXQoJnNlY3RzLCAwLCBzaXplb2Yoc2VjdHMpKTsKIAogICBkZWVmZXIuZGJnX2luZm8gPSAoY2hhciAqKSAmY2RlYnVnOwotICBkaW5mby50aW1lc3RhbXAgPSA4MTI5MzIzOTU7CisgIGRpbmZvLlRpbWVTdGFtcCA9IDgxMjkzMjM5NTsKICAgY2RlYnVnLmN2X3RpbWVzdGFtcCA9IDgzMzM5MjEzNyAgLyogODQxOTUxMzk3ICovOwogICBkZWVmZXIuZGJnZGlyID0gJmRpbmZvOwogICBkZWVmZXIuc2VjdHAgPSBzZWN0czsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL21zYy5jIGIvZGVidWdnZXIvbXNjLmMKaW5kZXggMzY2ODg3Ny4uNjFiYWI1YSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvbXNjLmMKKysrIGIvZGVidWdnZXIvbXNjLmMKQEAgLTIxMzUsNyArMjEzNSw3IEBACiAgIGNoYXIJCQkgICAgICAqIGNvZGV2aWV3OwogICBzdHJ1Y3QgQ1Y0X0RpckhlYWQJICAgICAgKiBjb2Rldmlld19kaXI7CiAgIHN0cnVjdCBDVjRfRGlyRW50CSAgICAgICogY29kZXZpZXdfZGVudDsKLSAgc3RydWN0IFBFX0RlYnVnX2RpcgkgICAgICAqIGRiZ2hkcjsKKyAgTFBJTUFHRV9ERUJVR19ESVJFQ1RPUlkJZGJnaGRyOwogICBzdHJ1Y3QgZGVmZXJyZWRfZGVidWdfaW5mbyAgICBkZWVmZXIyOwogICBpbnQJCQkJZmQgPSAtMTsKICAgaW50CQkJCWk7CkBAIC0yMTg3LDcgKzIxODcsNyBAQAogCiAgIGZwcmludGYoc3RkZXJyLCAiUHJvY2Vzc2luZyBzeW1ib2xzIGZyb20gJXMuLi5cbiIsIGZpbGVuYW1lKTsKIAotICBkYmdoZHIgPSAoc3RydWN0IFBFX0RlYnVnX2RpciAqKSAoICBhZGRyICsgc2l6ZW9mKCpwZGJnKSAKKyAgZGJnaGRyID0gKExQSU1BR0VfREVCVUdfRElSRUNUT1JZKSAoICBhZGRyICsgc2l6ZW9mKCpwZGJnKSAKIAkJICsgcGRiZy0+TnVtYmVyT2ZTZWN0aW9ucyAqIHNpemVvZihJTUFHRV9TRUNUSU9OX0hFQURFUikgCiAJCSArIHBkYmctPkV4cG9ydGVkTmFtZXNTaXplKTsKIApAQCAtMjE5Niw3ICsyMTk2LDcgQEAKIAogICBmb3IoIGk9MDsgaSA8IHBkYmctPkRlYnVnRGlyZWN0b3J5U2l6ZSAvIHNpemVvZigqcGRiZyk7IGkrKywgZGJnaGRyKysgKQogICAgIHsKLSAgICAgIHN3aXRjaChkYmdoZHItPnR5cGUpCisgICAgICBzd2l0Y2goZGJnaGRyLT5UeXBlKQogCQl7CiAJCWNhc2UgSU1BR0VfREVCVUdfVFlQRV9DT0ZGOgogCQkgIC8qCkBAIC0yMjA0LDggKzIyMDQsOCBAQAogCQkgICAqIENPRkYgc3R1ZmYgZW1iZWRkZWQgd2l0aGluIHRoZSBEQkcgZmlsZS4KIAkJICAgKi8KIAkJICBtZW1zZXQoKGNoYXIgKikgJmRlZWZlcjIsIDAsIHNpemVvZihkZWVmZXIyKSk7Ci0JCSAgZGVlZmVyMi5kYmdfaW5mbyA9IChhZGRyICsgZGJnaGRyLT5kYmdvZmYpOwotCQkgIGRlZWZlcjIuZGJnX3NpemUgPSBkYmdoZHItPmRiZ3NpemU7CisJCSAgZGVlZmVyMi5kYmdfaW5mbyA9IChhZGRyICsgZGJnaGRyLT5Qb2ludGVyVG9SYXdEYXRhKTsKKwkJICBkZWVmZXIyLmRiZ19zaXplID0gZGJnaGRyLT5TaXplT2ZEYXRhOwogCQkgIGRlZWZlcjIubG9hZF9hZGRyID0gZGVlZmVyLT5sb2FkX2FkZHI7CiAKIAkJICBERUJVR19Qcm9jZXNzQ29mZigmZGVlZmVyMik7CkBAIC0yMjE4LDcgKzIyMTgsNyBAQAogCQkgICAqIGhhdmUgbG90cyBvZiBpbnRlcm5hbCBzaW1pbGFyaXRpZXMsIGJ1dCB0aGUgb3ZlcmFsbAogCQkgICAqIGZvcm1hdCBhbmQgc3RydWN0dXJlIGlzIHF1aXRlIGRpZmZlcmVudC4KIAkJICAgKi8KLQkJICBjb2RldmlldyA9IChhZGRyICsgZGJnaGRyLT5kYmdvZmYpOworCQkgIGNvZGV2aWV3ID0gKGFkZHIgKyBkYmdoZHItPlBvaW50ZXJUb1Jhd0RhdGEpOwogCiAJCSAgLyoKIAkJICAgKiBUaGUgZmlyc3QgdGhpbmcgaW4gdGhlIGNvZGV2aWV3IHNlY3Rpb24gc2hvdWxkIGJlCmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL2ZvbnRzIGIvZG9jdW1lbnRhdGlvbi9mb250cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjM3NjEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jdW1lbnRhdGlvbi9mb250cwpAQCAtMCwwICsxLDExMSBAQAorCitIb3cgVG8gQ29udmVydCBXaW5kb3dzIEZvbnRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0lmIHlvdSBoYXZlIGFjY2VzcyB0byBXaW5kb3dzIGluc3RhbGxhdGlvbiB5b3Ugc2hvdWxkIHVzZSAKK2ZudDJiZGYgdXRpbGl0eSAoZm91bmQgaW4gdGhlICd0b29scyknIGRpcmVjdG9yeSB0byBjb252ZXJ0CitiaXRtYXAgZm9udHMgKFNZU1RFTS5GT04sIFNTRVJJRkUuRk9OLCBhbmQgU0VSSUZFLkZPTikgaW50byAKK3RoZSBmb3JtYXQgdGhhdCBYIFdpbmRvdyBTeXN0ZW0gY2FuIHJlY29nbml6ZS4KKworU3RlcCAxLiBFeHRyYWN0IGJpdG1hcCBmb250cyB3aXRoICdmbnQyYmRmJy4KKworU3RlcCAyLiBDb252ZXJ0IC5iZGYgZmlsZXMgcHJvZHVjZWQgYnkgdGhlIFN0ZXAgMSBpbnRvCisJLnBjZiBmaWxlcyB3aXRoICdiZGZ0b3BjZicuCisKK1N0ZXAgMy4gQ29weSAucGNmIGZpbGVzIHRvIHRoZSBmb250IHNlcnZlciBkaXJlY3Rvcnkgd2hpY2gKKwlpcyB1c3VhbGx5IC91c3IvbGliL1gxMS9mb250cy9taXNjICh5b3Ugd2lsbCBwcm9iYWJseSAKKyAgICAgICAgbmVlZCBzdXBlcnVzZXIgcHJpdmlsZWdlcykuCisKK1N0ZXAgNC4gUnVuICdta2ZvbnRkaXInIGZvciB0aGUgZGlyZWN0b3J5IHlvdSBjb3BpZWQgZm9udHMgdG8uCisJSWYgeW91IGFyZSBhbHJlYWR5IGluIFggeW91IHNob3VsZCBydW4gJ3hzZXQgZnAgcmVoYXNoJyAKKyAgICAgICAgdG8gbWFrZSBYIHNlcnZlciBhd2FyZSBvZiB0aGUgbmV3IGZvbnRzLgorCitXaW5lIGNhbiBnZXQgYnkgd2l0aG91dCB0aGVzZSBmb250cyBidXQgJ3RoZSBsb29rIGFuZCBmZWVsJword2lsbCBiZSBxdWl0ZSBkaWZmZXJlbnQuIAorCitXaGF0IHRvIGRvIHdpdGggVHJ1ZVR5cGUgZm9udHM/IFRoZXJlIGFyZSBzZXZlcmFsIGNvbW1lcmNpYWwKK2ZvbnQgdG9vbHMgdGhhdCBjYW4gY29udmVydCB0aGVtIHRvIHRoZSBUeXBlMSBmb3JtYXQgYnV0IHRoZSAKK3F1YWxpdHkgb2YgdGhlIHJlc3VsdGluZyBmb250cyBpcyBmYXIgZnJvbSBzdGVsbGFyLiBUaGUgb3RoZXIKK3dheSB0byB1c2UgdGhlbSBpcyB0byBnZXQgYSBmb250IHNlcnZlciBjYXBhYmxlIG9mIHJlbmRlcmluZyAKK1RydWVUeXBlIChDYWxkZXJhIGhhcyBvbmUpLgorCitIb3dldmVyLCB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mIHRoZSBuYXRpdmUgVHJ1ZVR5cGUgc3VwcG9ydCAKK3ZpYSBGcmVlVHlwZSByZW5kZXJlciBpbiB0aGUgZnV0dXJlIChoaW50LCBoaW50IDotKQorCisKK1dJTkUuQ09ORiBBbmQgRm9udCBNYXBwZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworTWFueSBXaW5kb3dzIGFwcGxpY2F0aW9ucyBhc3N1bWUgdGhhdCBmb250cyBpbmNsdWRlZCBpbiBvcmlnaW5hbCBXaW5kb3dzIDMuMSAKK2Rpc3RyaWJ1dGlvbiAoQXJpYWwsIFRpbWVzIE5ldyBSb21hbiwgTVMgU2FucyBTZXJpZiwgZXRjLikgYXJlIGFsd2F5cyBwcmVzZW50LiAKK0luIG9yZGVyIHRvIG1ha2UgZm9udCBtYXBwZXIgY2hvb3NlIGEgY2xvc2VseSByZWxhdGVkIGZvbnQgeW91IGNhbiBhZGQgYWxpYXNlcwordG8gdGhlIFtmb250c10gc2VjdGlvbi4KKworQWxpYXNOID0gW1dpbmRvd3MgZm9udF0sIFtYIGZvbnRdIDwsIG9wdGlvbmFsICJtYXNrIFggZm9udCIgZmxhZz4KKworRXhhbXBsZToKKworQWxpYXMwID0gU3lzdGVtLCAtLWludGVybmF0aW9uYWwtLCBtYXNrCitBbGlhczEgPSBBcmlhbCwgLWFkb2JlLWhlbHZldGljYS0KK0FsaWFzMiA9IFRpbWVzIE5ldyBSb21hbiwgLWFkb2JlLXRpbWVzLQorLi4uCisKK0NvbW1lbnRzOgorICAgIFRoZXJlIG11c3QgYmUgbm8gZ2FwcyBpbiB0aGUgc2VxdWVuY2UgezAsIC4uLiwgTn0gb3RoZXJ3aXNlIGFsbCBhbGlhc2VzCisgICAgYWZ0ZXIgdGhlIGZpcnN0IGdhcCB3b24ndCBiZSByZWFkLgorCisgICAgVXN1YWxseSBmb250IG1hcHBlciB0cmFuc2xhdGVzIFggZm9udCBuYW1lcyBpbnRvIGZvbnQgbmFtZXMgdmlzaWJsZSB0bworICAgIFdpbmRvd3MgcHJvZ3JhbXMgaW4gdGhlIGZvbGxvd2luZyBmYXNoaW9uOgorCisgICAgWCBmb250CQkJQ29udmVydGVkIG5hbWUKKworICAgIC1hZG9iZS1oZWx2ZXRpY2EtLi4uCSJIZWx2ZXRpY2EiCisgICAgLWFkb2JlLXV0b3BpYS0uLi4JCSJVdG9waWEiCisgICAgLW1pc2MtZml4ZWQtLi4uCQkiRml4ZWQiCisgICAgLS4uLgorICAgIC1zb255LWZpeGVkLS4uLgkJIlNvbnkgRml4ZWQiICAoYWxyZWFkeSBoYXZlICJGaXhlZCIpCisgICAgLS4uLgorCisgICAgT25seSBjb252ZXJ0ZWQgbmFtZXMgYXBwZWFyIGluIHRoZSBmb250IHNlbGVjdGlvbiBkaWFsb2dzLiBIb3dldmVyLCAKKyAgICBpZiB0aGVyZSBpcyBhbiBhbGlhcyB3aXRoIHRoZSAibWFzayIgZmxhZyBzZXQgY29udmVydGVkIG5hbWUgd2lsbCBiZSAKKyAgICByZXBsYWNlZCBieSB0aGlzIGFsaWFzLgorCisgICAgLS1pbnRlcm5hdGlvbmFsLQkJIlN5c3RlbSIKKworICAgIE5vbm1hc2tpbmcgYWxpYXNlcyBhcmUgdHJhbnNsYXRlZCBvbmx5IHdoZW4gcHJvZ3JhbSBhc2tzIGZvciBhIGZvbnQKKyAgICB3aXRoIHRoZSBuYW1lIHRoYXQgbWF0Y2hlcyBhbiBhbGlhcy4KKworICAgIElmIHlvdSBkbyBub3QgaGF2ZSBhbiBhY2Nlc3MgdG8gV2luZG93cyBmb250cyBtZW50aW9uZWQgaW4gdGhlIGZpcnN0IAorICAgIHBhcmFncmFwaCB5b3Ugc2hvdWxkIHRyeSB0byBzdWJzdGl0dXRlIHRoZW0gd2l0aCBzaW1pbGFyIFggZm9udHMuCisKKyAgICBBbGlhcy4uID0gU3lzdGVtLCAuLi5ib2xkIGZvbnQgd2l0aG91dCBzZXJpZnMKKyAgICBBbGlhcy4uID0gTVMgU2FucyBTZXJpZiwgLi4uaGVsdmV0aWNhLWxpa2UgZm9udAorCitBbHNvLCBzb21lIFdpbmRvd3MgYXBwbGljYXRpb25zIHJlcXVlc3QgZm9udHMgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSAKK3R5cGVmYWNlIG5hbWUgb2YgdGhlIGZvbnQuIEZvbnQgdGFibGUgc3RhcnRzIHdpdGggQXJpYWwgaW4gbW9zdCBXaW5kb3dzIAoraW5zdGFsbGF0aW9ucywgaG93ZXZlciBYIGZvbnQgdGFibGUgc3RhcnRzIHdpdGggd2hhdGV2ZXIgaXMgdGhlIGZpcnN0IGxpbmUgCitpbiB0aGUgZm9udHMuZGlyLiAgVGhlcmVmb3JlIFdJTkUgdXNlcyB0aGUgZm9sbG93aW5nIGVudHJ5IHRvIGRldGVybWluZSAKK3doaWNoIGZvbnQgdG8gY2hlY2sgZmlyc3QuCisKK0RlZmF1bHQgPSAuLi4KKworQ29tbWVudHM6CisgICAgSXQgaXMgYmV0dGVyIHRvIGhhdmUgYSBzY2FsYWJsZSBmb250IGZhbWlseSAoYm9sZHMgYW5kIGl0YWxpY3MgaW5jbHVkZWQpIAorICAgIGFzIHRoZSBkZWZhdWx0IGNob2ljZSBiZWNhdXNlIG1hcHBlciBjaGVja3MgYWxsIGF2YWlsYWJsZSBmb250cyB1bnRpbCAKKyAgICByZXF1ZXN0ZWQgaGVpZ2h0IGFuZCBvdGhlciBhdHRyaWJ1dGVzIG1hdGNoIHBlcmZlY3RseSBvciB0aGUgZW5kIG9mIHRoZSAKKyAgICBmb250IHRhYmxlIGlzIHJlYWNoZWQuCisKKworQ2FjaGVkIEZvbnQgTWV0cmljcworPT09PT09PT09PT09PT09PT09PQorCitXSU5FIHN0b3JlcyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgZm9udHMgaW4gdGhlIH4vLndpbmUvLmNhY2hlZG1ldHJpY3MKK2ZpbGUuIFlvdSBjYW4gY29weSBpdCBlbHNld2hlcmUgYW5kIGFkZCB0aGlzIGVudHJ5IHRvIHRoZSBbZm9udHNdIHNlY3Rpb24gCitpbiB0aGUgV0lORS5DT05GOgorCitGb250TWV0cmljcyA9IDxmaWxlIHdpdGggbWV0cmljcz4KKworSWYgV0lORSBkZXRlY3RzIGNoYW5nZXMgaW4gdGhlIFggZm9udCBjb25maWd1cmF0aW9uIGl0IHdpbGwgcmVidWlsZCBmb250CittZXRyaWNzIGZyb20gc2NyYXRjaCBhbmQgdGhlbiBpdCB3aWxsIG92ZXJ3cml0ZSB+Ly53aW5lLy5jYWNoZWRtZXRyaWNzIHdpdGggCit0aGUgbmV3IGluZm9ybWF0aW9uLiBUaGlzIHByb2Nlc3MgY2FuIHRha2UgYSB3aGlsZS4KKwpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi91c2VyX21vZHVsZSBiL2RvY3VtZW50YXRpb24vaW50ZXJuYWxzCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGRvY3VtZW50YXRpb24vdXNlcl9tb2R1bGUKcmVuYW1lIHRvIGRvY3VtZW50YXRpb24vaW50ZXJuYWxzCmluZGV4IDhjZmY0Y2IuLjkzMDgwMzYgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vdXNlcl9tb2R1bGUKKysrIGIvZG9jdW1lbnRhdGlvbi9pbnRlcm5hbHMKQEAgLTEsMyArMSwxMyBAQAorS0VSTkVMIE1PRFVMRQorPT09PT09PT09PT09PQorCisuLi4KKworR0RJIE1PRFVMRQorPT09PT09PT09PQorCisuLi4KKwogVVNFUiBNT0RVTEUKID09PT09PT09PT09CiAKQEAgLTIwLDExICszMCwxMSBAQAogICAgYW5jZXN0b3IgbGluayAod25kLT5wYXJlbnQpIHBvaW50cyB0byB0aGUgZGVza3RvcCB3aW5kb3cuCiAKICAgIERlc2t0b3Agd2luZG93CQkJLSByb290IHdpbmRvdwotICAgIHwgICAgIFwgICAgICAnLS4KLSAgICB8ICAgICAgXCAgICAgICAgJy0uCisgICAgfCAgICAgXCAgICAgIGAtLgorICAgIHwgICAgICBcICAgICAgICBgLS4KICAgIHBvcHVwIC0+IHduZDEgIC0+ICB3bmQyCQktIHRvcCBsZXZlbCB3aW5kb3dzICAgIAotICAgIHwgICAgICAgXCAgICctLiAgICAgICctLgotICAgIHwgICAgICAgIFwgICAgICctLiAgICAgICctLgorICAgIHwgICAgICAgXCAgIGAtLiAgICAgIGAtLgorICAgIHwgICAgICAgIFwgICAgIGAtLiAgICAgIGAtLgogICAgY2hpbGQxICBjaGlsZDIgLT4gY2hpbGQzICBjaGlsZDQgICAgIC0gY2hpbGQgd2luZG93cwogICAKICAgIEhvcml6b250YWwgYXJyb3dzIGRlbm90ZSBzaWJsaW5nIHJlbGF0aW9uc2hpcCwgdmVydGljYWwgbGluZXMKQEAgLTM2LDcgKzQ2LDcgQEAKICAgIHNpYmxpbmcgbGlzdCAodGhleSBhcmUgbm90IHRvcG1vc3QpLiBDaGlsZCB3aW5kb3dzIGFyZSBjb25maW5lZCB0byB0aGUKICAgIGNsaWVudCBhcmVhIG9mIHRoZWlyIHBhcmVudCB3aW5kb3dzIChjbGllbnQgYXJlYSBpcyB3aGVyZSB3aW5kb3cgZ2V0cwogICAgdG8gZG8gaXRzIG93biBkcmF3aW5nLCBub24tY2xpZW50IGFyZWEgY29uc2lzdHMgb2YgY2FwdGlvbiwgbWVudSwgYm9yZGVycywKLSAgIGludHJpbnNpYyBzY3JvbGxiYXJzLCBhbmQgbWluaW1pemUvbWF4aW1pemUvY2xvc2UgYnV0dG9ucykuIAorICAgaW50cmluc2ljIHNjcm9sbGJhcnMsIGFuZCBtaW5pbWl6ZS9tYXhpbWl6ZS9jbG9zZS9oZWxwIGJ1dHRvbnMpLiAKICAgCiAgICBBbm90aGVyIGZhaXJseSBpbXBvcnRhbnQgY29uY2VwdCBpcyAiei1vcmRlciIuIEl0IGlzIGRlcml2ZWQgZnJvbQogICAgdGhlIGFuY2VzdG9yL2NoaWxkIGhpZXJhcmNoeSBhbmQgaXMgdXNlZCB0byBkZXRlcm1pbmUgImFib3ZlL2JlbG93IgpAQCAtNTAsNyArNjAsNyBAQAogCiAgICBXaW5lIHNwZWNpZmljczogaW4gZGVmYXVsdCBhbmQgbWFuYWdlZCBtb2RlIGVhY2ggdG9wLWxldmVsIHdpbmRvdwogICAgZ2V0cyBpdHMgb3duIFggY291bnRlcnBhcnQgd2l0aCBkZXNrdG9wIHdpbmRvdyBiZWluZyBiYXNpY2FsbHkgYSAKLSAgIGZha2Ugc3R1Yi4gSW4gZGVza3RvcCBtb2RlLCBob3dldmVyLCBvbmx5IGRlc2t0b3Agd2luZG93IGhhcyBYCisgICBmYWtlIHN0dWIuIEluIGRlc2t0b3AgbW9kZSwgaG93ZXZlciwgb25seSBkZXNrdG9wIHdpbmRvdyBoYXMgYW4gWAogICAgd2luZG93IGFzc29jaWF0ZWQgd2l0aCBpdC4KIAogMi4gTWVzc2FnaW5nIHN1YnN5c3RlbQpAQCAtMjE0LDMgKzIyNCw0IEBACiAgICAgICAgcXVldWUgZm9yIHNlbnQgbWVzc2FnZXMuIEFub3RoZXIgaXNzdWUgaXMgd2hhdCB0byBkbyB3aXRoIG1lc3NhZ2VzIAogICAgICAgIHNlbnQgdG8gdGhlIHNlbmRlciB3aGVuIGl0IGlzIGJsb2NrZWQgaW5zaWRlIGl0cyBvd24gU2VuZE1lc3NhZ2UuIAogCisKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vd2luZV9vczIudHh0IGIvZG9jdW1lbnRhdGlvbi93aW5lX29zMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jdW1lbnRhdGlvbi93aW5lX29zMi50eHQKcmVuYW1lIHRvIGRvY3VtZW50YXRpb24vd2luZV9vczIKZGlmZiAtLWdpdCBhL2ZpbGVzL2Rvc19mcy5jIGIvZmlsZXMvZG9zX2ZzLmMKaW5kZXggMzhhODRjOC4uNWJiOGIzNSAxMDA2NDQKLS0tIGEvZmlsZXMvZG9zX2ZzLmMKKysrIGIvZmlsZXMvZG9zX2ZzLmMKQEAgLTgwOSw2ICs4MDksOCBAQAogCiAgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiR2V0RnVsbFBhdGhOYW1lOiBjb252ZXJ0aW5nICVzXG4iLCBuYW1lICk7CiAKKyAgICBpZiAoIW5hbWUgfHwgIXJlc3VsdCkgcmV0dXJuIDA7CisKICAgICBpZiAoKGRyaXZlID0gRE9TRlNfR2V0UGF0aERyaXZlKCAmbmFtZSApKSA9PSAtMSkgcmV0dXJuIDA7CiAgICAgcCA9IGJ1ZmZlcjsKICAgICAqcCsrID0gJ0EnICsgZHJpdmU7CmRpZmYgLS1naXQgYS9maWxlcy9maWxlLmMgYi9maWxlcy9maWxlLmMKaW5kZXggMWZmNmMyMS4uMTYyNWYzOSAxMDA2NDQKLS0tIGEvZmlsZXMvZmlsZS5jCisrKyBiL2ZpbGVzL2ZpbGUuYwpAQCAtMTI5LDggKzEyOSwxMCBAQAogICovCiB2b2lkIEZJTEVfU2V0RG9zRXJyb3Iodm9pZCkKIHsKKyAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOyAvKiBlcnJubyBnZXRzIG92ZXJ3cml0dGVuIGJ5IHByaW50ZiAqLworCiAgICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIkZJTEVfU2V0RG9zRXJyb3I6IGVycm5vID0gJWRcbiIsIGVycm5vICk7Ci0gICAgc3dpdGNoIChlcnJubykKKyAgICBzd2l0Y2ggKHNhdmVfZXJybm8pCiAgICAgewogICAgIGNhc2UgRUFHQUlOOgogICAgICAgICBET1NfRVJST1IoIEVSX1NoYXJlVmlvbGF0aW9uLCBFQ19UZW1wb3JhcnksIFNBX1JldHJ5LCBFTF9EaXNrICk7CkBAIC0xNjcsNiArMTY5LDcgQEAKICAgICAgICAgRE9TX0VSUk9SKCBFUl9HZW5lcmFsRmFpbHVyZSwgRUNfU3lzdGVtRmFpbHVyZSwgU0FfQWJvcnQsIEVMX1Vua25vd24gKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIGVycm5vID0gc2F2ZV9lcnJubzsKIH0KIAogCkBAIC0yMzksNiArMjQyLDkgQEAKICAgICBjb25zdCBjaGFyICp1bml4TmFtZTsKIAogICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJGSUxFX09wZW46ICclcycgJTA0eFxuIiwgcGF0aCwgbW9kZSApOworCisgICAgaWYgKCFwYXRoKSByZXR1cm4gSEZJTEVfRVJST1IzMjsKKwogICAgIGlmICgodW5peE5hbWUgPSBET1NGU19Jc0RldmljZSggcGF0aCApKSAhPSBOVUxMKQogICAgIHsKICAgICAgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJGSUxFX09wZW46IG9wZW5pbmcgZGV2aWNlICclcydcbiIsIHVuaXhOYW1lICk7CkBAIC0yNzEsNiArMjc3LDggQEAKIAogICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJGSUxFX0NyZWF0ZTogJyVzJyAlMDR4ICVkXG4iLCBwYXRoLCBtb2RlLCB1bmlxdWUgKTsKIAorICAgIGlmICghcGF0aCkgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CisKICAgICBpZiAoKHVuaXhOYW1lID0gRE9TRlNfSXNEZXZpY2UoIHBhdGggKSkgIT0gTlVMTCkKICAgICB7CiAgICAgICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJGSUxFX0NyZWF0ZTogY3JlYXRpbmcgZGV2aWNlICclcychXG4iLCB1bml4TmFtZSk7CkBAIC0zMzgsNiArMzQ2LDggQEAKIHsKICAgICBzdHJ1Y3Qgc3RhdCBzdDsKIAorICAgIGlmICghdW5peE5hbWUgfHwgIWluZm8pIHJldHVybiBGQUxTRTsKKwogICAgIGlmIChzdGF0KCB1bml4TmFtZSwgJnN0ICkgPT0gLTEpCiAgICAgewogICAgICAgICBGSUxFX1NldERvc0Vycm9yKCk7CkBAIC0zNTgsNiArMzY4LDggQEAKICAgICBEV09SRCByZXQgPSAwOwogICAgIHN0cnVjdCBzdGF0IHN0OwogCisgICAgaWYgKCFpbmZvKSByZXR1cm4gMDsKKwogICAgIGlmICghKGZpbGUgPSBGSUxFX0dldEZpbGUoIGhGaWxlICkpKSByZXR1cm4gMDsKICAgICBpZiAoZnN0YXQoIGZpbGUtPnVuaXhfaGFuZGxlLCAmc3QgKSA9PSAtMSkgRklMRV9TZXREb3NFcnJvcigpOwogICAgIGVsc2UKQEAgLTM4Nyw2ICszOTksOCBAQAogICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGluZm87CiAKKyAgICBpZiAobmFtZSA9PSBOVUxMKSByZXR1cm4gLTE7CisKICAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBuYW1lLCBUUlVFLCAmZnVsbF9uYW1lICkpIHJldHVybiAtMTsKICAgICBpZiAoIUZJTEVfU3RhdCggZnVsbF9uYW1lLmxvbmdfbmFtZSwgJmluZm8gKSkgcmV0dXJuIC0xOwogICAgIHJldHVybiBpbmZvLmR3RmlsZUF0dHJpYnV0ZXM7CkBAIC00MzYsNiArNDUwLDggQEAKICAqLwogSU5UMzIgQ29tcGFyZUZpbGVUaW1lKCBMUEZJTEVUSU1FIHgsIExQRklMRVRJTUUgeSApCiB7CisgICAgICAgIGlmICgheCB8fCAheSkgcmV0dXJuIC0xOworCiAJaWYgKHgtPmR3SGlnaERhdGVUaW1lID4geS0+ZHdIaWdoRGF0ZVRpbWUpCiAJCXJldHVybiAxOwogCWlmICh4LT5kd0hpZ2hEYXRlVGltZSA8IHktPmR3SGlnaERhdGVUaW1lKQpAQCAtNTIxLDcgKzUzNyw4IEBACiAgICAgTFBTVFIgcDsKICAgICBVSU5UMzIgbnVtID0gdW5pcXVlID8gKHVuaXF1ZSAmIDB4ZmZmZikgOiB0aW1lKE5VTEwpICYgMHhmZmZmOwogCi0gICAgaWYgKCFwYXRoKSByZXR1cm4gMDsKKyAgICBpZiAoICFwYXRoIHx8ICFwcmVmaXggfHwgIWJ1ZmZlciApIHJldHVybiAwOworCiAgICAgc3RyY3B5KCBidWZmZXIsIHBhdGggKTsKICAgICBwID0gYnVmZmVyICsgc3RybGVuKGJ1ZmZlcik7CiAgICAgLyogYWRkIGEgXCwgaWYgdGhlcmUgaXNuJ3Qgb25lIC4uLiAqLwpAQCAtNjA0LDYgKzYyMSwxMyBAQAogICAgIGNoYXIgKnA7CiAgICAgaW50IHVuaXhNb2RlOwogCisgICAgaWYgKCFuYW1lIHx8ICFvZnMpIHJldHVybiBIRklMRV9FUlJPUjMyOworCisgICAgaWYgKCFuYW1lKSB7CisJZnByaW50ZihzdGRlcnIsICJFUlJPUjogRklMRV9Eb09wZW5GaWxlKCkgY2FsbGVkIHdpdGggYG5hbWUnIHNldCB0byBOVUxMICEgUGxlYXNlIGRlYnVnLlxuIik7CisgCisJcmV0dXJuIEhGSUxFX0VSUk9SMzI7CisgICAgfQogICAgIG9mcy0+Y0J5dGVzID0gc2l6ZW9mKE9GU1RSVUNUKTsKICAgICBvZnMtPm5FcnJDb2RlID0gMDsKICAgICBpZiAobW9kZSAmIE9GX1JFT1BFTikgbmFtZSA9IG9mcy0+c3pQYXRoTmFtZTsKZGlmZiAtLWdpdCBhL2ZpbGVzL3Byb2ZpbGUuYyBiL2ZpbGVzL3Byb2ZpbGUuYwppbmRleCAwNmI4YjcwLi5kNTM3YThlIDEwMDY0NAotLS0gYS9maWxlcy9wcm9maWxlLmMKKysrIGIvZmlsZXMvcHJvZmlsZS5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogICAgIGZvciAoIDsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCiAgICAgewotICAgICAgICBpZiAoc2VjdGlvbi0+bmFtZSkgZnByaW50ZiggZmlsZSwgIlslc11cclxuIiwgc2VjdGlvbi0+bmFtZSApOworICAgICAgICBpZiAoc2VjdGlvbi0+bmFtZSkgZnByaW50ZiggZmlsZSwgIlxyXG5bJXNdXHJcbiIsIHNlY3Rpb24tPm5hbWUgKTsKICAgICAgICAgZm9yIChrZXkgPSBzZWN0aW9uLT5rZXk7IGtleTsga2V5ID0ga2V5LT5uZXh0KQogICAgICAgICB7CiAgICAgICAgICAgICBmcHJpbnRmKCBmaWxlLCAiJXMiLCBrZXktPm5hbWUgKTsKQEAgLTIxMSw3ICsyMTEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGtleSA9IEhFQVBfeGFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoKmtleSkgKTsKICAgICAgICAga2V5LT5uYW1lICA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgcCApOwotICAgICAgICBrZXktPnZhbHVlID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBwMiApOworICAgICAgICBrZXktPnZhbHVlID0gcDIgPyBIRUFQX3N0cmR1cEEoIFN5c3RlbUhlYXAsIDAsIHAyICkgOiBOVUxMOwogICAgICAgICBrZXktPm5leHQgID0gTlVMTDsKICAgICAgICAgKnByZXZfa2V5ICA9IGtleTsKICAgICAgICAgcHJldl9rZXkgPSAma2V5LT5uZXh0OwpAQCAtNjQyLDYgKzY0MiwzMyBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFBST0ZJTEVfR2V0U3RyaW5nSXRlbQorICoKKyAqICBDb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IHR1cm5zIGEgc3RyaW5nICd4eHgsIHl5eSwgenp6JyBpbnRvIAorICogIHRoZSAneHh4XDAgeXl5LCB6enonIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgJ3l5eSwgenp6Jy4KKyAqLworY2hhciogUFJPRklMRV9HZXRTdHJpbmdJdGVtKCBjaGFyKiBzdGFydCApCit7CisgICAgY2hhciogbHBjaFgsICpscGNoOworCisgICAgZm9yIChscGNoWCA9IHN0YXJ0LCBscGNoID0gTlVMTDsgKmxwY2hYICE9ICdcMCc7IGxwY2hYKysgKQorICAgIHsKKyAgICAgICAgaWYoIGlzc3BhY2UoICpscGNoWCApICkgbHBjaCA9IGxwY2ggPyBscGNoIDogbHBjaFg7CisgICAgICAgIGVsc2UgbHBjaCA9IE5VTEw7CisKKyAgICAgICAgaWYoICpscGNoWCA9PSAnLCcgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbHBjaCApICpscGNoID0gJ1wwJzsgZWxzZSAqbHBjaFggPSAnXDAnOworICAgICAgICAgICAgd2hpbGUoICooKytscGNoWCkgKQorICAgICAgICAgICAgICAgIGlmKCAhaXNzcGFjZSgqbHBjaFgpICkgcmV0dXJuIGxwY2hYOworICAgICAgICB9CisgICAgfQorICAgIGlmKCBscGNoICkgKmxwY2ggPSAnXDAnOworICAgIHJldHVybiBOVUxMOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKiogQVBJIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3BhaW50aW5nLmMgYi9ncmFwaGljcy9wYWludGluZy5jCmluZGV4IGNlNmEzOTUuLmJhZDUxODIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BhaW50aW5nLmMKKysrIGIvZ3JhcGhpY3MvcGFpbnRpbmcuYwpAQCAtNDc4LDcgKzQ3OCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBEcmF3Rm9jdXNSZWN0MzIgICAgKFVTRVIzMi4xNTUpCiAgKgotICogRklYTUU6IHNob3VsZCB1c2UgUmVjdGFuZ2xlMzIhCisgKiBGSVhNRTogUGF0Qmx0KFBBVElOVkVSVCkgd2l0aCBiYWNrZ3JvdW5kIGJydXNoLgogICovCiB2b2lkIERyYXdGb2N1c1JlY3QzMiggSERDMzIgaGRjLCBjb25zdCBSRUNUMzIqIHJjICkKIHsKQEAgLTc0NywxMCArNzQ3LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgRHJhd0ZyYW1lQ29udHJvbDE2ICAoVVNFUi42NTYpCiAgKi8KLUJPT0wxNiBEcmF3RnJhbWVDb250cm9sMTYoIEhEQzE2IGhkYywgTFBSRUNUMTYgcmMsIFVJTlQxNiBlZGdlLCBVSU5UMTYgZmxhZ3MgKQorQk9PTDE2IERyYXdGcmFtZUNvbnRyb2wxNiggSERDMTYgaGRjLCBMUFJFQ1QxNiByYywgVUlOVDE2IHVUeXBlLCBVSU5UMTYgdVN0YXRlICkKIHsKICAgICBmcHJpbnRmKCBzdGRuaW1wLCJEcmF3RnJhbWVDb250cm9sMTYoJXgsJXAsJWQsJXgpLCBlbXB0eSBzdHViIVxuIiwKLSAgICAgICAgICAgICBoZGMscmMsZWRnZSxmbGFncyApOworICAgICAgICAgICAgIGhkYyxyYyx1VHlwZSx1U3RhdGUgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNzU4LDkgKzc1OCw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgRHJhd0ZyYW1lQ29udHJvbDMyICAoVVNFUjMyLjE1NykKICAqLwotQk9PTDMyIERyYXdGcmFtZUNvbnRyb2wzMiggSERDMzIgaGRjLCBMUFJFQ1QzMiByYywgVUlOVDMyIGVkZ2UsIFVJTlQzMiBmbGFncyApCitCT09MMzIgRHJhd0ZyYW1lQ29udHJvbDMyKCBIREMzMiBoZGMsIExQUkVDVDMyIHJjLCBVSU5UMzIgdVR5cGUsIFVJTlQzMiB1U3RhdGUgKQogewogICAgIGZwcmludGYoIHN0ZG5pbXAsIkRyYXdGcmFtZUNvbnRyb2wzMigleCwlcCwlZCwleCksIGVtcHR5IHN0dWIhXG4iLAotICAgICAgICAgICAgIGhkYyxyYyxlZGdlLGZsYWdzICk7CisgICAgICAgICAgICAgaGRjLHJjLHVUeXBlLHVTdGF0ZSApOwogICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jCmluZGV4IGRiNzYxZjEuLjg1ZWRmZjQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2ZvbnQuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9mb250LmMKQEAgLTE5LDExICsxOSw2IEBACiB7CiAgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CiAgICAgRFdPUkQgZHdSZXQ7Ci0gICAgZXh0ZXJuIERSQVdNT0RFIERyYXdNb2RlOwotICAgIExQRFJBV01PREUgbHBEcmF3TW9kZSA9ICZEcmF3TW9kZTsKLSAgICBURVhUWEZPUk0xNiBUZXh0WEZvcm07Ci0gICAgTFBURVhUWEZPUk0xNiBscFRleHRYRm9ybSA9ICZUZXh0WEZvcm07Ci0gICAgSW5pdFRleHRYRm9ybShscFRleHRYRm9ybSk7CiAgICAgCiAgICAgcHJpbnRmKCJMUEdESV9HZXRUZXh0RXh0UG9pbnQ6ICUwNHggJXMgJWQgJXBcbiIsIGRjLT5oU2VsZiwgc3RyLCBjb3VudCwgc2l6ZSk7CiAKQEAgLTM3LDggKzMyLDggQEAKIAogICAgIGR3UmV0ID0gUFJURFJWX0V4dFRleHRPdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwgMCwgMCwgCiAJCQkgICAgICBOVUxMLCBzdHIsIAotCQkJICAgICAgLWNvdW50LCAgcGh5c0Rldi0+c2VncHRyRm9udEluZm8sIGxwRHJhd01vZGUsIAotCQkJICAgICAgbHBUZXh0WEZvcm0sIE5VTEwsIE5VTEwsIDApOworCQkJICAgICAgLWNvdW50LCAgcGh5c0Rldi0+c2VncHRyRm9udEluZm8sIHdpbjE2ZHJ2X1NlZ1B0cl9EcmF3TW9kZSwgCisJCQkgICAgICB3aW4xNmRydl9TZWdQdHJfVGV4dFhGb3JtLCBOVUxMLCBOVUxMLCAwKTsKICAgICBwcmludGYoIkxQR0RJX0dldFRleHRFeHRQb2ludDogY3g9MHgleCwgY3k9MHgleCBSZXQgMHglbHhcbiIsIHNpemUtPmN4LCBzaXplLT5jeSwgZHdSZXQpOwogCiAgICAgcmV0dXJuIFRSVUU7CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9pbml0LmMgYi9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKaW5kZXggZGE5ZTYwYi4uZmY0ODA1OSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KQEAgLTI3LDE5ICsyOCwxOSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgU0hPUlQgblNpemU7Ci0gIExQVk9JRCBscGluZGF0YTsKLSAgTFBWT0lEIGxwRm9udDsKLSAgTFBWT0lEIGxwWEZvcm07Ci0gIExQVk9JRCBscERyYXdNb2RlOworICBTRUdQVFIgbHBpbmRhdGE7CisgIFNFR1BUUiBscEZvbnQ7CisgIFNFR1BUUiBscFhGb3JtOworICBTRUdQVFIgbHBEcmF3TW9kZTsKIH0gRVhUVEVYVERBVEEsICpMUEVYVFRFWFREQVRBOwogI3ByYWdtYSBwYWNrKDQpCiAKLSNpZiAwCi1zdGF0aWMgQk9PTDE2IHdpbmRydkV4dFRleHRPdXQxNiggREMgKmRjLCBJTlQxNiB4LCBJTlQxNiB5LCBVSU5UMTYgZmxhZ3MsIGNvbnN0IFJFQ1QxNiAqIGxwcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBzdHIsIFVJTlQxNiBjb3VudCwgY29uc3QgSU5UMTYgKmxwRHgpOwotI2VuZGlmCitTRUdQVFIJCXdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm07CitMUFRFWFRYRk9STTE2IAl3aW4xNmRydl9UZXh0WEZvcm1QOworU0VHUFRSCQl3aW4xNmRydl9TZWdQdHJfRHJhd01vZGU7CitMUERSQVdNT0RFIAl3aW4xNmRydl9EcmF3TW9kZVA7CiAKLURSQVdNT0RFIERyYXdNb2RlOworCiBzdGF0aWMgQk9PTDMyIFdJTjE2RFJWX0NyZWF0ZURDKCBEQyAqZGMsIExQQ1NUUiBkcml2ZXIsIExQQ1NUUiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgb3V0cHV0LCBjb25zdCBERVZNT0RFMTYqIGluaXREYXRhICk7CiBzdGF0aWMgSU5UMzIgV0lOMTZEUlZfRXNjYXBlKCBEQyAqZGMsIElOVDMyIG5Fc2NhcGUsIElOVDMyIGNiSW5wdXQsIApAQCAtMjIyLDEwICsyMjMsOCBAQAogICAgIGludCBuUERFVklDRXNpemU7CiAgICAgUERFVklDRV9IRUFERVIgKnBQREg7CiAgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldjsKLSAgICBMUERSQVdNT0RFIGxwRHJhd01vZGUgPSAmRHJhd01vZGU7CiAKICAgICAvKiBSZWFsaXppbmcgZm9udHMgKi8KLSAgICBURVhUWEZPUk0xNiBUZXh0WEZvcm07CiAgICAgaW50IG5TaXplOwogICAgIGNoYXIgcHJpbnRlckVuYWJsZWRbMjBdOwogICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggIndpbmUiLCAicHJpbnRlciIsICJvZmYiLApAQCAtMzM5LDIxICszMzgsMjQgQEAKIAkgICAmcExQRC0+cGFQcmludGVyRm9udHNbMF0udG0sIAogCSAgIHNpemVvZihURVhUTUVUUklDMTYpKTsKIAorICAgIHdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm0gPSBXSU4xNl9HbG9iYWxMb2NrMTYoR2xvYmFsQWxsb2MxNihHSE5ELCBzaXplb2YoVEVYVFhGT1JNMTYpKSk7CisgICAgd2luMTZkcnZfVGV4dFhGb3JtUCA9IFBUUl9TRUdfVE9fTElOKHdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm0pOworICAgIAorICAgIEluaXRUZXh0WEZvcm0od2luMTZkcnZfVGV4dFhGb3JtUCk7CiAjaWZkZWYgU1VQUE9SVF9SRUFMSVpFRF9GT05UUwogICAgIC8qIFRURCBzaG91bGQgY2FsY3VsYXRlIHRoaXMgKi8KLSAgICBJbml0VGV4dFhGb3JtKCZUZXh0WEZvcm0pOwogICAgIAogICAgIC8qIEZpcnN0IGdldCB0aGUgc2l6ZSBvZiB0aGUgcmVhbGl6ZWQgZm9udCAqLwogICAgIG5TaXplID0gUFJURFJWX1JlYWxpemVPYmplY3QocGh5c0Rldi0+c2VncHRyUERFVklDRSwgT0JKX0ZPTlQsCiAJCQkJICZwTFBELT5wYVByaW50ZXJGb250c1swXSwgTlVMTCwgCi0JCQkJIE5VTEwpOworCQkJCSAwKTsKICAgICAKICAgICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbyA9IFdJTjE2X0dsb2JhbExvY2sxNihHbG9iYWxBbGxvYzE2KEdITkQsIG5TaXplKSk7CiAgICAgLyogUmVhbGl6ZSB0aGUgZm9udCAqLwogICAgIFBSVERSVl9SZWFsaXplT2JqZWN0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIE9CSl9GT05ULAogCQkJICZwTFBELT5wYVByaW50ZXJGb250c1swXSwgCiAJCQkgKExQVk9JRClwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgCi0JCQkgJlRleHRYRm9ybSk7CisJCQkgd2luMTZkcnZfU2VnUHRyX1RleHRYRm9ybSk7CiAgICAgLyogUXVpY2sgbG9vayBhdCBzdHJ1Y3R1cmUgKi8KICAgICBpZiAocGh5c0Rldi0+c2VncHRyRm9udEluZm8pCiAgICAgeyAgCkBAIC0zNjgsNyArMzcwLDEwIEBACiAKICNlbmRpZgogICAgIC8qIFRURCBMb3RzIG1vcmUgdG8gZG8gaGVyZSAqLwotICAgIEluaXREcmF3TW9kZShscERyYXdNb2RlKTsKKyAgICB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUgPSBXSU4xNl9HbG9iYWxMb2NrMTYoR2xvYmFsQWxsb2MxNihHSE5ELCBzaXplb2YoRFJBV01PREUpKSk7CisgICAgd2luMTZkcnZfRHJhd01vZGVQID0gUFRSX1NFR19UT19MSU4od2luMTZkcnZfU2VnUHRyX0RyYXdNb2RlKTsKKyAgICAKKyAgICBJbml0RHJhd01vZGUod2luMTZkcnZfRHJhd01vZGVQKTsKIAogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMzg5LDIzICszOTQsMjkgQEAKICAgICB7CiAJc3dpdGNoKG5Fc2NhcGUpCiAJewotCSAgY2FzZSAweDk6CisJICBjYXNlIFNFVEFCT1JUUFJPQzoKIAkgICAgcHJpbnRmKCJFc2NhcGU6IFNldEFib3J0UHJvYyBpZ25vcmVkXG4iKTsKIAkgICAgYnJlYWs7Ci0JY2FzZSAweDEwMDoKKworCSAgY2FzZSBHRVRFWFRFTkRFRFRFWFRNRVRSSUNTOgogCSAgewotCSAgICBMUEVYVFRFWFREQVRBIHRleHREYXRhID0gIFBUUl9TRUdfVE9fTElOKGxwSW5EYXRhKTsKLQkgICAgcHJpbnRmKCJHb3QgaW4gZGF0YSAweCVseCB0ZXh0RGF0YSAweCVwXG4iLGxwSW5EYXRhLCB0ZXh0RGF0YSk7Ci0JICAgIHByaW50Zigic2l6ZSAlZCBpbiAweCVwOjB4JXAgZm9udCAweCVwOjB4JXAgeGZvcm0gMHglcDoweCVwIGRyYXdtIDB4JXA6MHglcFxuIiwKLQkJICAgdGV4dERhdGEtPm5TaXplLAotCQkgICB0ZXh0RGF0YS0+bHBpbmRhdGEsUFRSX1NFR19UT19MSU4odGV4dERhdGEtPmxwaW5kYXRhKSwKLQkJICAgdGV4dERhdGEtPmxwRm9udCxQVFJfU0VHX1RPX0xJTih0ZXh0RGF0YS0+bHBGb250KSwKLQkJICAgdGV4dERhdGEtPmxwWEZvcm0sUFRSX1NFR19UT19MSU4odGV4dERhdGEtPmxwWEZvcm0pLAotCQkgICB0ZXh0RGF0YS0+bHBEcmF3TW9kZSxQVFJfU0VHX1RPX0xJTih0ZXh0RGF0YS0+bHBEcmF3TW9kZSkpOworCSAgICBTRUdQVFIgbmV3SW5EYXRhID0gIFdJTjE2X0dsb2JhbExvY2sxNihHbG9iYWxBbGxvYzE2KEdITkQsIHNpemVvZihFWFRURVhUREFUQSkpKTsKKyAgICAgICAgICAgIEVYVFRFWFREQVRBICp0ZXh0RGF0YSA9IChFWFRURVhUREFUQSAqKShQVFJfU0VHX1RPX0xJTihuZXdJbkRhdGEpKTsKKworCSAgICB0ZXh0RGF0YS0+blNpemUgPSBjYklucHV0OworCSAgICB0ZXh0RGF0YS0+bHBpbmRhdGEgPSBscEluRGF0YTsKKwkgICAgdGV4dERhdGEtPmxwRm9udCA9IHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvOworCSAgICB0ZXh0RGF0YS0+bHBYRm9ybSA9IHdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm07CisJICAgIHRleHREYXRhLT5scERyYXdNb2RlID0gd2luMTZkcnZfU2VnUHRyX0RyYXdNb2RlOworCSAgICBuUmV0ID0gUFJURFJWX0NvbnRyb2wocGh5c0Rldi0+c2VncHRyUERFVklDRSwgbkVzY2FwZSwKKwkJCQkgIG5ld0luRGF0YSwgbHBPdXREYXRhKTsKKwkgICAgR2xvYmFsRnJlZTE2KG5ld0luRGF0YSk7CisgICAgICAgICAgICAKIAkgIH0KLQkgICAgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgICAgICAKIAkgIGRlZmF1bHQ6Ci0JICAgIG5SZXQgPSBQUlREUlZfQ29udHJvbChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCBuRXNjYXBlLCAKKwkgICAgblJldCA9IFBSVERSVl9Db250cm9sKHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIG5Fc2NhcGUsCiAJCQkJICBscEluRGF0YSwgbHBPdXREYXRhKTsKIAl9CiAgICAgfQpAQCAtNTQwLDE5ICs1NTEsNTggQEAKIC8qIFRURCBOZWVkIHRvIGRvIHNvbWUgRE9TLT5VTklYIGZpbGUgY29udmVyc2lvbiBoZXJlICovCiBzdGF0aWMgaW50IENyZWF0ZVNwb29sRmlsZShMUFNUUiBwc3pPdXRwdXQpCiB7Ci0gICAgaW50IGZkOwotICAgIGNoYXIgc3pTcG9vbEZpbGVbMzJdOworICAgIGludCBmZD0tMTsKKyAgICBjaGFyIHBzQ21kWzEwMjRdOworICAgIGNoYXIgKnBzQ21kUCA9IHBzQ21kOwogCiAgICAgLyogVFREIGNvbnZlcnQgdGhlICdvdXRwdXQgZGV2aWNlJyBpbnRvIGEgc3Bvb2wgZmlsZSBuYW1lICovCiAKICAgICBpZiAocHN6T3V0cHV0ID09IE5VTEwgfHwgKnBzek91dHB1dCA9PSAnXDAnKQotCXN0cmNweShzelNwb29sRmlsZSwibHAub3V0Iik7Ci0gICAgZWxzZQotCXN0cmNweShzelNwb29sRmlsZSwgcHN6T3V0cHV0KTsKKyAgICAgIHJldHVybiAtMTsKIAotICAgIGlmICgoZmQgPSBvcGVuKHN6U3Bvb2xGaWxlLCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fV1JPTkxZICwgMDYwMCkpIDwgMCkKKyAgICBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoICJzcG9vbGVyIiwgcHN6T3V0cHV0LCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQ21kLCBzaXplb2YocHNDbWQpICk7CisgICAgcHJpbnRmKCJHb3QgcHJpbnRlclNwb29sQ09tbWFuZCBcIiVzXCJcbiIscHNDbWQpOworICAgIGlmICghKnBzQ21kKQorICAgICAgICBwc0NtZFAgPSBwc3pPdXRwdXQ7CisgICAgZWxzZQogICAgIHsKLQlwcmludGYoIkZhaWxlZCB0byBjcmVhdGUgc3Bvb2wgZmlsZSAlcywgZXJybm8gPSAlZFxuIiwgc3pTcG9vbEZpbGUsIGVycm5vKTsKKyAgICAgICAgd2hpbGUgKCpwc0NtZFAgJiYgaXNzcGFjZSgqcHNDbWRQKSkKKyAgICAgICAgeworICAgICAgICAgICAgcHNDbWRQKys7CisgICAgICAgIH07CisgICAgICAgIGlmICghKnBzQ21kUCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCpwc0NtZFAgPT0gJ3wnKQorICAgIHsKKyAgICAgICAgaW50IGZkc1syXTsKKyAgICAgICAgaWYgKHBpcGUoZmRzKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGZvcmsoKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwc0NtZFArKzsKKworICAgICAgICAgICAgcHJpbnRmKCJJbiBjaGlsZCBuZWVkIHRvIGV4ZWMgJXNcbiIscHNDbWRQKTsKKyAgICAgICAgICAgIGNsb3NlKDApOworICAgICAgICAgICAgZHVwMihmZHNbMF0sMCk7CisgICAgICAgICAgICBjbG9zZSAoZmRzWzFdKTsKKyAgICAgICAgICAgIHN5c3RlbShwc0NtZFApOworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGNsb3NlIChmZHNbMF0pOworICAgICAgICBmZCA9IGZkc1sxXTsKKyAgICAgICAgcHJpbnRmKCJOZWVkIHRvIGV4ZWN1dCBhIGNvbW1hbmQgYW5kIHBpcGUgdGhlIG91dHB1dCB0byBpdFxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZigiSnVzdCBhc3N1bWUgaXRzIGEgZmlsZVxuIik7CisKKyAgICAgICAgaWYgKChmZCA9IG9wZW4ocHNDbWRQLCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fV1JPTkxZICwgMDYwMCkpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gY3JlYXRlIHNwb29sIGZpbGUgJXMsIGVycm5vID0gJWRcbiIsIHBzQ21kUCwgZXJybm8pOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmZDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKaW5kZXggMjg2NDc0Mi4uNjcyZGM4OSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKQEAgLTQzMyw4ICs0MzMsOCBAQAogICogUmVhbGl6ZU9iamVjdCAob3JkaW5hbCAxMCkKICAqLwogRFdPUkQgUFJURFJWX1JlYWxpemVPYmplY3QoTFBQREVWSUNFIGxwRGVzdERldiwgV09SRCB3U3R5bGUsIAotCQkgICAgTFBWT0lEIGxwSW5PYmosIExQVk9JRCBscE91dE9iaiwKLSAgICAgICAgICAgICAgICAgICAgTFBURVhUWEZPUk0xNiBscFRleHRYRm9ybSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEluT2JqLCBMUFZPSUQgbHBPdXRPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIgbHBUZXh0WEZvcm0pCiB7CiAgICAgV09SRCBkd1JldCA9IDA7CiAgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKQEAgLTQ3MywxNCArNDczLDcgQEAKIAkKIAlsUDQgPSAoTE9ORylscE91dE9iajsKIAotCWlmIChscFRleHRYRm9ybSAhPSBOVUxMKQotCXsKLQkgICAgbFA1ID0gU2VnUHRyOwotCSAgICBuU2l6ZSA9IHNpemVvZihURVhUWEZPUk0xNik7Ci0JICAgIEFkZERhdGEoJlNlZ1B0ciwgbHBUZXh0WEZvcm0sIG5TaXplLCBMaW1pdCk7CQotCX0KLQllbHNlCi0JICBsUDUgPSAwTDsKKyAgICAgICAgbFA1ID0gbHBUZXh0WEZvcm07CiAKIAlkd1JldCA9IENhbGxUbzE2X2xvbmdfbHdsbGwocExQRC0+Zm5bRlVOQ19SRUFMSVpFT0JKRUNUXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDEsIHdQMiwgbFAzLCBsUDQsIGxQNSk7CkBAIC00OTMsOCArNDg2LDggQEAKIAogRFdPUkQgUFJURFJWX0V4dFRleHRPdXQoTFBQREVWSUNFIGxwRGVzdERldiwgV09SRCB3RGVzdFhPcmcsIFdPUkQgd0Rlc3RZT3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgUkVDVDE2ICpscENsaXBSZWN0LCBMUENTVFIgbHBTdHJpbmcsIFdPUkQgd0NvdW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBscEZvbnRJbmZvLCBMUERSQVdNT0RFIGxwRHJhd01vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgTFBURVhUWEZPUk0xNiBscFRleHRYRm9ybSwgU0hPUlQgKmxwQ2hhcldpZHRocywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBscEZvbnRJbmZvLCBTRUdQVFIgbHBEcmF3TW9kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIgbHBUZXh0WEZvcm0sIFNIT1JUICpscENoYXJXaWR0aHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUMTYgKiAgICAgbHBPcGFxdWVSZWN0LCBXT1JEIHdPcHRpb25zKQogewogICAgIERXT1JEIGR3UmV0ID0gMDsKQEAgLTU1MCwyNyArNTQzLDggQEAKIAkKIAkvKiBUaGlzIHNob3VsZCBiZSByZWFsaXplZCBieSB0aGUgZHJpdmVyLCBzbyBpbiAxNmJpdCBkYXRhIGFyZWEgKi8KIAlsUDcgPSBscEZvbnRJbmZvOwotCQotCWlmIChscERyYXdNb2RlICE9IE5VTEwpCi0JewotCSAgICBsUDggPSBTZWdQdHI7Ci0JICAgIG5TaXplID0gc2l6ZW9mKERSQVdNT0RFKTsKLSAgICAgICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiYWRkaW5nIGxwRHJhd01vZGVcbiIpOwotICAgICAgICAgICAgCi0JICAgIEFkZERhdGEoJlNlZ1B0ciwgbHBEcmF3TW9kZSwgblNpemUsIExpbWl0KTsJCi0JfQotCWVsc2UKLQkgIGxQOCA9IDBMOwotCQotCWlmIChscFRleHRYRm9ybSAhPSBOVUxMKQotCXsKLQkgICAgbFA5ID0gU2VnUHRyOwotCSAgICBuU2l6ZSA9IHNpemVvZihURVhUWEZPUk0xNik7Ci0gICAgICAgICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkFkZGluZyBUZXh0WEZvcm1cbiIpOwotCSAgICBBZGREYXRhKCZTZWdQdHIsIGxwVGV4dFhGb3JtLCBuU2l6ZSwgTGltaXQpOwkKLQl9Ci0JZWxzZQotCSAgbFA5ID0gMEw7CisgICAgICAgIGxQOCA9IGxwRHJhd01vZGU7CisgICAgICAgIGxQOSA9IGxwVGV4dFhGb3JtOwogCQogCWlmIChscENoYXJXaWR0aHMgIT0gTlVMTCkgCiAJICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FeHRUZXh0T3V0OiBDaGFyIHdpZHRocyBub3Qgc3VwcG9ydGVkXG4iKTsKQEAgLTU5NSw5ICs1NjksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgd1AyLCB3UDMsIGxQNCwgCiAJCQkJCSAgIGxQNSwgaVA2LCBsUDcsIGxQOCwgbFA5LCBsUDEwLAogCQkJCQkgICBsUDExLCB3UDEyKTsKLSAgICAgICAgaWYgKGxwRHJhd01vZGUpCi0gICAgICAgICAgICBHZXRQYXJhbURhdGEobFA4LCBscERyYXdNb2RlLCBzaXplb2YoRFJBV01PREUpKTsKICAgICB9CiAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRXh0VGV4dE91dDogcmV0dXJuICVseFxuIiwgZHdSZXQpOwogICAgIHJldHVybiBkd1JldDsKIH0KKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMgYi9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMKaW5kZXggOTAzZDZjOC4uNmQxODc2ZSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvdGV4dC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3RleHQuYwpAQCAtMjIsMTQgKzIyLDkgQEAKIHsKICAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKICAgICBCT09MMzIgYlJldCA9IDE7Ci0gICAgZXh0ZXJuIERSQVdNT0RFIERyYXdNb2RlOwotICAgIExQRFJBV01PREUgbHBEcmF3TW9kZSA9ICZEcmF3TW9kZTsKLSAgICBURVhUWEZPUk0xNiBUZXh0WEZvcm07Ci0gICAgTFBURVhUWEZPUk0xNiBscFRleHRYRm9ybSA9ICZUZXh0WEZvcm07Ci0gICAgUkVDVDE2IHJjQ2xpcFJlY3Q7Ci0gICAgUkVDVDE2ICogbHBDbGlwUmVjdCA9ICZyY0NsaXBSZWN0OwotICAgIFJFQ1QxNiByY09wYXF1ZVJlY3Q7Ci0gICAgUkVDVDE2ICpscE9wYXF1ZVJlY3QgPSAmcmNPcGFxdWVSZWN0OworICAgIFJFQ1QxNgkgY2xpcFJlY3Q7CisgICAgUkVDVDE2IAkgb3BhcXVlUmVjdDsKKyAgICBSRUNUMTYgCSpscE9wYXF1ZVJlY3QgPSBOVUxMOyAKICAgICBXT1JEIHdPcHRpb25zID0gMDsKICAgICBXT1JEIHdDb3VudCA9IGNvdW50OwogCkBAIC00Myw3ICszOCw2IEBACiAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJXSU4xNkRSVl9FeHRUZXh0T3V0OiAlMDR4ICVkICVkICV4ICVwICUqcyAlcFxuIiwgZGMtPmhTZWxmLCB4LCB5LCAKIAkgICBmbGFncywgIGxwcmVjdCwgY291bnQgPiAwID8gY291bnQgOiA4LCBzdHIsIGxwRHgpOwogCi0gICAgSW5pdFRleHRYRm9ybShscFRleHRYRm9ybSk7CiAKICAgICBpZiAoYkluaXQgPT0gRkFMU0UpCiAgICAgewpAQCAtNTEsNTAgKzQ1LDMwIEBACiAKIAlkd1JldCA9IFBSVERSVl9FeHRUZXh0T3V0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIDAsIDAsIAogCQkJCSAgTlVMTCwgIiAiLCAKLQkJCQkgIC0xLCAgcGh5c0Rldi0+c2VncHRyRm9udEluZm8sIGxwRHJhd01vZGUsIAotCQkJCSAgbHBUZXh0WEZvcm0sIE5VTEwsIE5VTEwsIDApOworCQkJCSAgLTEsICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgd2luMTZkcnZfU2VnUHRyX0RyYXdNb2RlLCAKKwkJCQkgIHdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm0sIE5VTEwsIE5VTEwsIDApOwogCWJJbml0ID0gVFJVRTsKICAgICB9CiAKICAgICBpZiAoZGMgIT0gTlVMTCkgICAKICAgICB7CiAJRFdPUkQgZHdSZXQ7Ci0vKgotCWR3UmV0ID0gUFJURFJWX0V4dFRleHRPdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwgMCwgMCwgCi0JCQkJICBOVUxMLCAiMCIsIAotCQkJCSAgLTEsICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgbHBEcmF3TW9kZSwgCi0JCQkJICBscFRleHRYRm9ybSwgTlVMTCwgTlVMTCwgMCk7Ci0KLQlkd1JldCA9IFBSVERSVl9FeHRUZXh0T3V0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIDAsIDAsIAotCQkJCSAgTlVMTCwgc3RyLCAtd0NvdW50LAotCQkJCSAgcGh5c0Rldi0+c2VncHRyRm9udEluZm8sIGxwRHJhd01vZGUsIAotCQkJCSAgbHBUZXh0WEZvcm0sIE5VTEwsIE5VTEwsIDApOwotKi8KKwljbGlwUmVjdC5sZWZ0ID0gMDsKKwljbGlwUmVjdC50b3AgPSAwOworICAgICAgICAKKwljbGlwUmVjdC5yaWdodCA9IGRjLT53LmRldkNhcHMtPmhvcnpSZXM7CisJY2xpcFJlY3QuYm90dG9tID0gZGMtPncuZGV2Q2Fwcy0+dmVydFJlczsKKyAgICAgICAgaWYgKGxwcmVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgb3BhcXVlUmVjdC5sZWZ0ID0gbHByZWN0LT5sZWZ0OworICAgICAgICAgICAgb3BhcXVlUmVjdC50b3AgPSBscHJlY3QtPnRvcDsKKyAgICAgICAgICAgIG9wYXF1ZVJlY3QucmlnaHQgPSBscHJlY3QtPnJpZ2h0OworICAgICAgICAgICAgb3BhcXVlUmVjdC5ib3R0b20gPSBscHJlY3QtPmJvdHRvbTsKKyAgICAgICAgICAgIGxwT3BhcXVlUmVjdCA9ICZvcGFxdWVSZWN0OworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCiAjaWZkZWYgTk9UREVGCi0JbHBDbGlwUmVjdC0+bGVmdCA9IGxwcmVjdC0+bGVmdCA7Ci0JbHBDbGlwUmVjdC0+dG9wID0gbHByZWN0LT50b3A7Ci0JbHBDbGlwUmVjdC0+cmlnaHQgPSBscHJlY3QtPnJpZ2h0OwotCWxwQ2xpcFJlY3QtPmJvdHRvbSA9IGxwcmVjdC0+Ym90dG9tOwotICAgICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIldJTjE2RFJWX0V4dFRleHRPdXQgQ2xpcCByZWN0IGxlZnQgJWQgdG9wICVkIHJpZ3QgJWQgYm90dG9tICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xpcFJlY3QtPmxlZnQsbHBDbGlwUmVjdC0+dG9wLGxwQ2xpcFJlY3QtPnJpZ2h0LGxwQ2xpcFJlY3QtPmJvdHRvbSk7Ci0jZW5kaWYKLQlscENsaXBSZWN0LT5sZWZ0ID0gMDsKLQlscENsaXBSZWN0LT50b3AgPSAwOwotCWxwQ2xpcFJlY3QtPnJpZ2h0ID0gMHgzZmM7Ci0JbHBDbGlwUmVjdC0+Ym90dG9tID0gMHg2MzA7Ci0gICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiV0lOMTZEUlZfRXh0VGV4dE91dCBDbGlwIHJlY3QgbGVmdCAlZCB0b3AgJWQgcmlndCAlZCBib3R0b20gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbHBDbGlwUmVjdC0+bGVmdCxscENsaXBSZWN0LT50b3AsbHBDbGlwUmVjdC0+cmlnaHQsbHBDbGlwUmVjdC0+Ym90dG9tKTsKLQlscE9wYXF1ZVJlY3QtPmxlZnQgPSB4OwotCWxwT3BhcXVlUmVjdC0+dG9wID0geTsKLQlscE9wYXF1ZVJlY3QtPnJpZ2h0ID0gMHgzYTE7Ci0JbHBPcGFxdWVSZWN0LT5ib3R0b20gPSAweDAxOwotICAgICAgICBwcmludGYoImRyYXdtb2RlIHJvcHQgMHgleCBia01vZGUgMHgleCBia0NvbG9yIDB4JWx4IHRleHRDb2xvciAweCVseCB0YmJyZWFrRXh0cmEgMHgleCBicmVha2V4dHJhIDB4JXhcbiIsCi0gICAgICAgICAgICAgICBscERyYXdNb2RlLT5Sb3AyLCAgICBscERyYXdNb2RlLT5ia01vZGUsICAgIGxwRHJhd01vZGUtPmJrQ29sb3IsCi0gICAgICAgICAgICAgICBscERyYXdNb2RlLT5UZXh0Q29sb3IsICAgIGxwRHJhd01vZGUtPlRCcmVha0V4dHJhLCAgICBscERyYXdNb2RlLT5CcmVha0V4dHJhKTsKLSAgICAgICAgcHJpbnRmKCJicmVha2VyciAweCV4IGJyZWFrcmVtIDB4JXggYnJlYWtjb3VudCAweCV4IGNoZXh0cmEgMHgleCBsYmtjb2xvciAweCVseCBsdGV4dGNvbG9yIDB4JWx4XG4iLAotICAgICAgICAgICAgICAgbHBEcmF3TW9kZS0+QnJlYWtFcnIsICAgIGxwRHJhd01vZGUtPkJyZWFrUmVtLCAgICBscERyYXdNb2RlLT5CcmVha0NvdW50LAotICAgICAgICAgICAgICAgbHBEcmF3TW9kZS0+Q2hhckV4dHJhLAkgICBscERyYXdNb2RlLT5MYmtDb2xvciwgICAgbHBEcmF3TW9kZS0+TFRleHRDb2xvcik7Ci0KICAgICB7CiAgICAgICAgIFJFQ1QxNiByY1BhZ2VTaXplOwogCUZPTlRJTkZPMTYgKnAgPSAoRk9OVElORk8xNiAqKVBUUl9TRUdfVE9fTElOKHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvKTsKQEAgLTEyMSwxOCArOTUsMTIgQEAKICAgICAgICAgfQogICAgICAgICAKICAgICB9Ci0gICAgICAgIAorI2VuZGlmICAgICAgICAKIAogCWR3UmV0ID0gUFJURFJWX0V4dFRleHRPdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwgeCwgeSwgCi0JCQkJICBscENsaXBSZWN0LCBzdHIsIAotCQkJCSAgd0NvdW50LCAgcGh5c0Rldi0+c2VncHRyRm9udEluZm8sIGxwRHJhd01vZGUsIAotCQkJCSAgbHBUZXh0WEZvcm0sIE5VTEwsIE5VTEwsIHdPcHRpb25zKTsKLS8qCi0JZHdSZXQgPSBQUlREUlZfRXh0VGV4dE91dChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCB4LCB5LCAKLQkJCQkgIGxwQ2xpcFJlY3QsIHN0ciwgCi0JCQkJICB3Q291bnQsICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgbHBEcmF3TW9kZSwgCi0JCQkJICBscFRleHRYRm9ybSwgbHBEeCwgTlVMTCwgZmxhZ3MpOwotKi8KKwkJCQkgICZjbGlwUmVjdCwgc3RyLCAKKwkJCQkgIHdDb3VudCwgIHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvLCB3aW4xNmRydl9TZWdQdHJfRHJhd01vZGUsIAorCQkJCSAgd2luMTZkcnZfU2VnUHRyX1RleHRYRm9ybSwgTlVMTCwgbHBPcGFxdWVSZWN0LCB3T3B0aW9ucyk7CiAgICAgfQogICAgIHJldHVybiBiUmV0OwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L01ha2VmaWxlLmluIGIvZ3JhcGhpY3MveDExZHJ2L01ha2VmaWxlLmluCmluZGV4IGRhYTg2MGMuLmQ3ZmMxZmQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9NYWtlZmlsZS5pbgorKysgYi9ncmFwaGljcy94MTFkcnYvTWFrZWZpbGUuaW4KQEAgLTEwLDcgKzEwLDcgQEAKIAliaXRtYXAuYyBcCiAJYnJ1c2guYyBcCiAJY2xpcHBpbmcuYyBcCi0JZm9udC5jIFwKKwl4Zm9udC5jIFwKIAlncmFwaGljcy5jIFwKIAlpbml0LmMgXAogCW9iamVjdHMuYyBcCmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvZm9udC5jIGIvZ3JhcGhpY3MveDExZHJ2L2ZvbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyNmRiNi4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy94MTFkcnYvZm9udC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8qCi0gKiBYMTEgZHJpdmVyIGZvbnQgZnVuY3Rpb25zCi0gKgotICogQ29weXJpZ2h0IDE5OTYgQWxleGFuZHJlIEp1bGxpYXJkCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8WDExL1hhdG9tLmg+Ci0jaW5jbHVkZSAiZm9udC5oIgotI2luY2x1ZGUgImhlYXAuaCIKLSNpbmNsdWRlICJtZXRhZmlsZS5oIgotI2luY2x1ZGUgIm9wdGlvbnMuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0KLXN0cnVjdCBGb250U3RydWN0dXJlIHsKLQljaGFyICp3aW5kb3c7Ci0JY2hhciAqeDExOwotfSBGb250TmFtZXNbMzJdOwotaW50IEZvbnRTaXplOwotCi0jZGVmaW5lIENJX05PTkVYSVNUQ0hBUihjcykgKCgoY3MpLT53aWR0aCA9PSAwKSAmJiBcCi0JCQkgICAgICgoKGNzKS0+cmJlYXJpbmd8KGNzKS0+bGJlYXJpbmd8IFwKLQkJCSAgICAgICAoY3MpLT5hc2NlbnR8KGNzKS0+ZGVzY2VudCkgPT0gMCkpCi0KLS8qIAotICogQ0lfR0VUX0NIQVJfSU5GTyAtIHJldHVybiB0aGUgY2hhcmluZm8gc3RydWN0IGZvciB0aGUgaW5kaWNhdGVkIDhiaXQKLSAqIGNoYXJhY3Rlci4gIElmIHRoZSBjaGFyYWN0ZXIgaXMgaW4gdGhlIGNvbHVtbiBhbmQgZXhpc3RzLCB0aGVuIHJldHVybiB0aGUKLSAqIGFwcHJvcHJpYXRlIG1ldHJpY3MgKG5vdGUgdGhhdCBmb250cyB3aXRoIGNvbW1vbiBwZXItY2hhcmFjdGVyIG1ldHJpY3Mgd2lsbAotICogcmV0dXJuIG1pbl9ib3VuZHMpLiAgSWYgbm9uZSBvZiB0aGVzZSBob2xkIHRydWUsIHRyeSBhZ2FpbiB3aXRoIHRoZSBkZWZhdWx0Ci0gKiBjaGFyLgotICovCi0jZGVmaW5lIENJX0dFVF9DSEFSX0lORk8oZnMsY29sLGRlZixjcykgXAoteyBcCi0gICAgY3MgPSBkZWY7IFwKLSAgICBpZiAoY29sID49IGZzLT5taW5fY2hhcl9vcl9ieXRlMiAmJiBjb2wgPD0gZnMtPm1heF9jaGFyX29yX2J5dGUyKSB7IFwKLQlpZiAoZnMtPnBlcl9jaGFyID09IE5VTEwpIHsgXAotCSAgICBjcyA9ICZmcy0+bWluX2JvdW5kczsgXAotCX0gZWxzZSB7IFwKLQkgICAgY3MgPSAmZnMtPnBlcl9jaGFyWyhjb2wgLSBmcy0+bWluX2NoYXJfb3JfYnl0ZTIpXTsgXAotCSAgICBpZiAoQ0lfTk9ORVhJU1RDSEFSKGNzKSkgY3MgPSBkZWY7IFwKLQl9IFwKLSAgICB9IFwKLX0KLQotI2RlZmluZSBDSV9HRVRfREVGQVVMVF9JTkZPKGZzLGNzKSBcCi0gIENJX0dFVF9DSEFSX0lORk8oZnMsIGZzLT5kZWZhdWx0X2NoYXIsIE5VTEwsIGNzKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFgxMURSVl9GT05UX0luaXQKLSAqLwotQk9PTDMyIFgxMURSVl9GT05UX0luaXQoIHZvaWQgKQotewotICBjaGFyICB0ZW1wWzEwMjRdOwotICBMUFNUUiBwdHI7Ci0gIGludCBpOwotCi0gIGlmIChQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoICJmb250cyIsIE5VTEwsICIqIiwgdGVtcCwgc2l6ZW9mKHRlbXApICkgPiAyICkKLSAgewotICAgIGZvciggcHRyID0gdGVtcCwgaSA9IDE7IHN0cmxlbihwdHIpICE9IDA7IHB0ciArPSBzdHJsZW4ocHRyKSArIDEgKQotICAgICAgaWYoIHN0cmNtcCggcHRyLCAiZGVmYXVsdCIgKSApCi0JRm9udE5hbWVzW2krK10ud2luZG93ID0geHN0cmR1cCggcHRyICk7Ci0gICAgRm9udFNpemUgPSBpOwotCi0gICAgZm9yKCBpID0gMTsgaSA8IEZvbnRTaXplOyBpKysgKQotICAgIHsKLSAgICAgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAiZm9udHMiLCBGb250TmFtZXNbaV0ud2luZG93LCAiKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCwgc2l6ZW9mKHRlbXApICk7Ci0gICAgICAgIEZvbnROYW1lc1tpXS54MTEgPSB4c3RyZHVwKCB0ZW1wICk7Ci0gICAgfQotICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggImZvbnRzIiwgImRlZmF1bHQiLCAiKiIsIHRlbXAsIHNpemVvZih0ZW1wKSApOwotICAgIEZvbnROYW1lc1swXS54MTEgPSB4c3RyZHVwKCB0ZW1wICk7Ci0KLSAgfSBlbHNlIHsKLSAgICBGb250TmFtZXNbMF0ud2luZG93ID0gTlVMTDsgRm9udE5hbWVzWzBdLngxMSA9ICIqLWhlbHZldGljYSI7Ci0gICAgRm9udE5hbWVzWzFdLndpbmRvdyA9ICJtcyBzYW5zIHNlcmlmIjsgRm9udE5hbWVzWzFdLngxMSA9ICIqLWhlbHZldGljYSI7Ci0gICAgRm9udE5hbWVzWzJdLndpbmRvdyA9ICJtcyBzZXJpZiI7IEZvbnROYW1lc1syXS54MTEgPSAiKi10aW1lcyI7Ci0gICAgRm9udE5hbWVzWzNdLndpbmRvdyA9ICJmaXhlZHN5cyI7IEZvbnROYW1lc1szXS54MTEgPSAiKi1maXhlZCI7Ci0gICAgRm9udE5hbWVzWzRdLndpbmRvdyA9ICJhcmlhbCI7IEZvbnROYW1lc1s0XS54MTEgPSAiKi1oZWx2ZXRpY2EiOwotICAgIEZvbnROYW1lc1s1XS53aW5kb3cgPSAiaGVsdiI7IEZvbnROYW1lc1s1XS54MTEgPSAiKi1oZWx2ZXRpY2EiOwotICAgIEZvbnROYW1lc1s2XS53aW5kb3cgPSAicm9tYW4iOyBGb250TmFtZXNbNl0ueDExID0gIiotdGltZXMiOwotICAgIEZvbnROYW1lc1s3XS53aW5kb3cgPSAic3lzdGVtIjsgRm9udE5hbWVzWzddLngxMSA9ICIqLWhlbHZldGljYSI7Ci0gICAgRm9udFNpemUgPSA4OwotICB9Ci0gIHJldHVybiBUUlVFOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRk9OVF9DaGtYMTFGYW1pbHkKLSAqCi0gKiByZXR1cm5zIGEgdmFsaWQgWDExIGVxdWl2YWxlbnQgaWYgYSBXaW5kb3dzIGZhY2UgbmFtZSAKLSAqIGlzIGxpa2UgYSBYMTEgZmFtaWx5ICAtIG9yIE5VTEwgaWYgdHJhbnNsYXRpb24gaXMgbmVlZGVkCi0gKi8KLXN0YXRpYyBjaGFyICpGT05UX0Noa1gxMUZhbWlseShjaGFyICp3aW5GYWNlTmFtZSApCi17Ci0gIHN0YXRpYyBjaGFyIHgxMWZhbVszMisyXTsgICAvKiB3aWxsIGJlIHJldHVybmVkICovCi0gIGludCBpOwotCi0gIGZvcihpID0gMDsgbHBMb2dGb250TGlzdFtpXSAhPSBOVUxMOyBpKyspCi0gICAgaWYoICFsc3RyY21waTMyQSh3aW5GYWNlTmFtZSwgbHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZSkgKQotICAgIHsKLQlzdHJjcHkoeDExZmFtLCIqLSIpOwotCXJldHVybiBzdHJjYXQoeDExZmFtLHdpbkZhY2VOYW1lKTsKLSAgICB9ICAgIAotICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAvKiBhIEZPTlRfVHJhbnNsYXRlTmFtZSgpIGNhbGwgaXMgbmVlZGVkICovCi19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBGT05UX1RyYW5zbGF0ZU5hbWUKLSAqCi0gKiBUcmFuc2xhdGUgYSBXaW5kb3dzIGZhY2UgbmFtZSB0byBpdHMgWDExIGVxdWl2YWxlbnQuCi0gKiBUaGlzIHdpbGwgcHJvYmFibHkgaGF2ZSB0byBiZSBjdXN0b21pemFibGUuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpGT05UX1RyYW5zbGF0ZU5hbWUoIGNoYXIgKndpbkZhY2VOYW1lICkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMTsgaSA8IEZvbnRTaXplOyBpICsrKQotICAgIGlmKCAhbHN0cmNtcGkzMkEoIHdpbkZhY2VOYW1lLCBGb250TmFtZXNbaV0ud2luZG93ICkgKSB7Ci0gICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCAiLS0tLSBNYXBwZWQgJXMgdG8gJXNcbiIsIHdpbkZhY2VOYW1lLCBGb250TmFtZXNbaV0ueDExICk7Ci0gICAgICByZXR1cm4gRm9udE5hbWVzW2ldLngxMTsKLSAgICB9Ci0gIHJldHVybiBGb250TmFtZXNbMF0ueDExOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEZPTlRfTWF0Y2hGb250Ci0gKgotICogRmluZCBhIFggZm9udCBtYXRjaGluZyB0aGUgbG9naWNhbCBmb250LgotICovCi1zdGF0aWMgWEZvbnRTdHJ1Y3QgKiBGT05UX01hdGNoRm9udCggTE9HRk9OVDE2ICogZm9udCwgREMgKiBkYyApCi17Ci0gICAgY2hhciBwYXR0ZXJuWzEwMF07Ci0gICAgY29uc3QgY2hhciAqZmFtaWx5LCAqd2VpZ2h0LCAqY2hhcnNldDsKLSAgICBjaGFyICoqbmFtZXM7Ci0gICAgY2hhciBzbGFudCwgb2xkc3BhY2luZywgc3BhY2luZzsKLSAgICBpbnQgd2lkdGgsIGhlaWdodCwgb2xkaGVpZ2h0LCBjb3VudDsKLSAgICBYRm9udFN0cnVjdCAqIGZvbnRTdHJ1Y3Q7Ci0gICAgCi0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwKLQkiRk9OVF9NYXRjaEZvbnQoSCxXID0gJWQsJWQ7IFdlaWdodCA9ICVkOyBJdGFsaWMgPSAlZDsgRmFjZU5hbWUgPSAnJXMnXG4iLAotCWZvbnQtPmxmSGVpZ2h0LCBmb250LT5sZldpZHRoLCBmb250LT5sZldlaWdodCwgZm9udC0+bGZJdGFsaWMsIGZvbnQtPmxmRmFjZU5hbWUpOwotICAgIHdlaWdodCA9IChmb250LT5sZldlaWdodCA+IDU1MCkgPyAiYm9sZCIgOiAibWVkaXVtIjsKLSAgICBzbGFudCA9IGZvbnQtPmxmSXRhbGljID8gJ2knIDogJ3InOwotICAgIGlmIChmb250LT5sZkhlaWdodCA9PSAtMSkKLQloZWlnaHQgPSAwOwotICAgIGVsc2UKLQloZWlnaHQgPSBmb250LT5sZkhlaWdodCAqIGRjLT52cG9ydEV4dFggLyBkYy0+d25kRXh0WDsKLSAgICBpZiAoaGVpZ2h0ID09IDApIGhlaWdodCA9IDEyMDsgIC8qIERlZmF1bHQgaGVpZ2h0ID0gMTIgKi8KLSAgICBlbHNlIGlmIChoZWlnaHQgPCAwKQotICAgIHsKLSAgICAgICAgLyogSWYgaGVpZ2h0IGlzIG5lZ2F0aXZlLCBpdCBtZWFucyB0aGUgaGVpZ2h0IG9mIHRoZSBjaGFyYWN0ZXJzICovCi0gICAgICAgIC8qICp3aXRob3V0KiB0aGUgaW50ZXJuYWwgbGVhZGluZy4gU28gd2UgYWRqdXN0IGl0IGEgYml0IHRvICAgICAqLwotICAgICAgICAvKiBjb21wZW5zYXRlLiA1LzQgc2VlbXMgdG8gZ2l2ZSBnb29kIHJlc3VsdHMgZm9yIHNtYWxsIGZvbnRzLiAgKi8KLQkvKiAKLSAgICAgICAgICogSi5NLjogVGhpcyBjYXVzZXMgd3JvbmcgZm9udCBzaXplIGZvciBiaWdnZXIgZm9udHMgZS5nLiBpbiBXaW53b3JkICYgV3JpdGUgCi0gICAgICAgIGhlaWdodCA9IDEwICogKC1oZWlnaHQgKiA5IC8gOCk7Ci0JICogbWF5IGJlIHdlIGhhdmUgdG8gdXNlIGFuIG5vbiBsaW5lYXIgZnVuY3Rpb24KLQkqLwotCS8qIGFzc3VtZSBpbnRlcm5hbCBsZWFkaW5nIGlzIDIgcGl4ZWxzLiBFbHNlIHNtYWxsIGZvbnRzIHdpbGwgYmVjb21lCi0gICAgICAgICAqIHZlcnkgc21hbGwuICovCi0gICAgICAgIGhlaWdodCA9IChoZWlnaHQtMikgKiAtMTA7IAotICAgIH0KLSAgICBlbHNlIGhlaWdodCAqPSAxMDsKLSAgICB3aWR0aCAgPSAxMCAqIChmb250LT5sZldpZHRoICogZGMtPnZwb3J0RXh0WSAvIGRjLT53bmRFeHRZKTsKLSAgICBpZiAod2lkdGggPCAwKSB7Ci0JZHByaW50Zl9mb250KCBzdGRkZWIsICJGT05UX01hdGNoRm9udDogbmVnYXRpdmUgd2lkdGggJWQoJWQpXG4iLAotCQkgICAgICB3aWR0aCwgZm9udC0+bGZXaWR0aCApOwotCXdpZHRoID0gLXdpZHRoOwotICAgIH0KLQotICAgIHNwYWNpbmcgPSAoZm9udC0+bGZQaXRjaEFuZEZhbWlseSAmIEZJWEVEX1BJVENIKSA/ICdtJyA6Ci0JICAgICAgKGZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgJiBWQVJJQUJMRV9QSVRDSCkgPyAncCcgOiAnKic7Ci0gICAgCi0gIAotICAgIGNoYXJzZXQgPSAoZm9udC0+bGZDaGFyU2V0ID09IEFOU0lfQ0hBUlNFVCkgPyAiaXNvODg1OS0xIiA6ICIqLSoiOwotICAgIGlmICgqZm9udC0+bGZGYWNlTmFtZSkgewotCWZhbWlseSA9IEZPTlRfQ2hrWDExRmFtaWx5KGZvbnQtPmxmRmFjZU5hbWUpOwotCS8qLS1kbyBfbm90XyB0cmFuc2xhdGUgaWYgbGZGYWNlTmFtZSBpcyBmYW1pbHkgZnJvbSBYMTEgIEEuSy4qLwotCWlmICghZmFtaWx5KSAKLQkgIGZhbWlseSA9IEZPTlRfVHJhbnNsYXRlTmFtZSggZm9udC0+bGZGYWNlTmFtZSApOwotCS8qIEZJWCBNRTogSSBkb24ndCBpZiB0aGF0J3MgY29ycmVjdCBidXQgaXQgd29ya3MgSi5NLiAqLwotCXNwYWNpbmcgPSAnKic7Ci0JfQotICAgIGVsc2Ugc3dpdGNoKGZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgJiAweGYwKQotICAgIHsKLSAgICBjYXNlIEZGX1JPTUFOOgotICAgICAgZmFtaWx5ID0gRk9OVF9UcmFuc2xhdGVOYW1lKCAicm9tYW4iICk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZGX1NXSVNTOgotICAgICAgZmFtaWx5ID0gRk9OVF9UcmFuc2xhdGVOYW1lKCAic3dpc3MiICk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZGX01PREVSTjoKLSAgICAgIGZhbWlseSA9IEZPTlRfVHJhbnNsYXRlTmFtZSggIm1vZGVybiIgKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRkZfU0NSSVBUOgotICAgICAgZmFtaWx5ID0gRk9OVF9UcmFuc2xhdGVOYW1lKCAic2NyaXB0IiApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGRl9ERUNPUkFUSVZFOgotICAgICAgZmFtaWx5ID0gRk9OVF9UcmFuc2xhdGVOYW1lKCAiZGVjb3JhdGl2ZSIgKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmYW1pbHkgPSAiKi0qIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzcHJpbnRmKCBwYXR0ZXJuLCAiLSVzLSVzLSotbm9ybWFsLSotKi0qLSotKi0qLSotJXMiLAotCSAgICBmYW1pbHksIHdlaWdodCwgY2hhcnNldCk7Ci0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIkZPTlRfTWF0Y2hGb250OiAnJXMnXG4iLCBwYXR0ZXJuICk7Ci0gICAgbmFtZXMgPSBYTGlzdEZvbnRzKCBkaXNwbGF5LCBwYXR0ZXJuLCAxLCAmY291bnQgKTsKLSAgICBpZiAobmFtZXMpIFhGcmVlRm9udE5hbWVzKCBuYW1lcyApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChzdHJjbXAoZmFtaWx5LCAiKi0qIikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGT05UX01hdGNoRm9udCglcykgOiByZXR1cm5pbmcgTlVMTFxuIiwgcGF0dGVybik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGZhbWlseSA9ICIqLSoiOwotICAgIH0KLSAgICBvbGRoZWlnaHQgPSBoZWlnaHQ7Ci0gICAgb2xkc3BhY2luZyA9IHNwYWNpbmc7Ci0gICAgd2hpbGUgKFRSVUUpIHsKLQkgICAgLyogV2lkdGg9PTAgc2VlbXMgbm90IHRvIGJlIGEgdmFsaWQgd2lsZGNhcmQgb24gU0dJJ3MsIHVzaW5nICogaW5zdGVhZCAqLwotCSAgICBpZiAoIHdpZHRoID09IDAgKQotCSAgICAgIHNwcmludGYoIHBhdHRlcm4sICItJXMtJXMtJWMtbm9ybWFsLSotKi0lZC0qLSotJWMtKi0lcyIsCi0JCSAgICAgIGZhbWlseSwgd2VpZ2h0LCBzbGFudCwgaGVpZ2h0LCBzcGFjaW5nLCBjaGFyc2V0KTsKLQkgICAgZWxzZQotCSAgICAgIHNwcmludGYoIHBhdHRlcm4sICItJXMtJXMtJWMtbm9ybWFsLSotKi0lZC0qLSotJWMtJWQtJXMiLAotCQkgICAgICBmYW1pbHksIHdlaWdodCwgc2xhbnQsIGhlaWdodCwgc3BhY2luZywgd2lkdGgsIGNoYXJzZXQpOwotCSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCAiRk9OVF9NYXRjaEZvbnQ6ICclcydcbiIsIHBhdHRlcm4gKTsKLQkgICAgbmFtZXMgPSBYTGlzdEZvbnRzKCBkaXNwbGF5LCBwYXR0ZXJuLCAxLCAmY291bnQgKTsKLQkgICAgaWYgKGNvdW50ID4gMCkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoc3BhY2luZyA9PSAnbScpIC8qIHRyeSAnYycgaWYgbm8gJ20nIGZvdW5kICovIHsKLQotICAgICAgICAgICAgICAgIHNwYWNpbmcgPSAnYyc7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNwYWNpbmcgPT0gJ3AnKSAvKiB0cnkgJyonIGlmIG5vICdwJyBmb3VuZCAqLyB7Ci0gICAgICAgICAgICAgICAgc3BhY2luZyA9ICcqJzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwYWNpbmcgPSBvbGRzcGFjaW5nOwotICAgICAgICAgICAgaGVpZ2h0IC09IDEwOwkJCi0gICAgICAgICAgICBpZiAoaGVpZ2h0IDwgMTApIHsKLSAgICAgICAgICAgICAgICBpZiAoc2xhbnQgPT0gJ2knKSB7Ci0JCSAgICAvKiB0cnkgb2JsaXF1ZSBpZiBubyBpdGFsaWMgZm9udCAqLwotCQkgICAgc2xhbnQgPSAnbyc7Ci0JCSAgICBoZWlnaHQgPSBvbGRoZWlnaHQ7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCQlpZiAoc3BhY2luZyA9PSAnbScgJiYgc3RyY21wKGZhbWlseSwgIiotKiIpICE9IDApIHsKLQkJICAgIC8qIElmIGEgZml4ZWQgc3BhY2luZyBmb250IGNvdWxkIG5vdCBiZSBmb3VuZCwgaWdub3JlCi0JCSAgICAgKiB0aGUgZmFtaWx5ICovCi0JCSAgICBmYW1pbHkgPSAiKi0qIjsKLQkJICAgIGhlaWdodCA9IG9sZGhlaWdodDsKLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGT05UX01hdGNoRm9udCglcykgOiByZXR1cm5pbmcgTlVMTFxuIiwgcGF0dGVybik7Ci0JCXJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgIH0KLSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCIgICAgICAgIEZvdW5kICclcydcbiIsICpuYW1lcyApOwotICAgIGlmICghKmZvbnQtPmxmRmFjZU5hbWUpCi0gICAgICAgIEZPTlRfUGFyc2VGb250UGFybXMoKm5hbWVzLCAyLCBmb250LT5sZkZhY2VOYW1lICwgTEZfRkFDRVNJWkUtMSk7Ci0gICAgLyogd2UgbmVlZCBhIGZvbnQgbmFtZSBmb3IgZnVuY3Rpb24gR2V0VGV4dEZhY2UoKSBldmVuIGlmIHRoZXJlIGlzbid0IG9uZSA7LSkgKi8gIAotCi0gICAgZm9udFN0cnVjdCA9IFhMb2FkUXVlcnlGb250KCBkaXNwbGF5LCAqbmFtZXMgKTsKLSAgICBYRnJlZUZvbnROYW1lcyggbmFtZXMgKTsKLSAgICByZXR1cm4gZm9udFN0cnVjdDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBYMTFEUlZfR2V0VGV4dEV4dGVudFBvaW50Ci0gKi8KLUJPT0wzMiBYMTFEUlZfR2V0VGV4dEV4dGVudFBvaW50KCBEQyAqZGMsIExQQ1NUUiBzdHIsIElOVDMyIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0laRTMyIHNpemUgKQotewotICAgIGludCBkaXIsIGFzY2VudCwgZGVzY2VudDsKLSAgICBYQ2hhclN0cnVjdCBpbmZvOwotCi0gICAgWFRleHRFeHRlbnRzKCBkYy0+dS54LmZvbnQuZnN0cnVjdCwgc3RyLCBjb3VudCwgJmRpciwKLQkJICAmYXNjZW50LCAmZGVzY2VudCwgJmluZm8gKTsKLSAgICBzaXplLT5jeCA9IGFicygoaW5mby53aWR0aCArIGRjLT53LmJyZWFrUmVtICsgY291bnQgKiBkYy0+dy5jaGFyRXh0cmEpCi0JCSAgICAqIGRjLT53bmRFeHRYIC8gZGMtPnZwb3J0RXh0WCk7Ci0gICAgc2l6ZS0+Y3kgPSBhYnMoKGRjLT51LnguZm9udC5mc3RydWN0LT5hc2NlbnQrZGMtPnUueC5mb250LmZzdHJ1Y3QtPmRlc2NlbnQpCi0JCSAgICAqIGRjLT53bmRFeHRZIC8gZGMtPnZwb3J0RXh0WSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUJPT0wzMiBYMTFEUlZfR2V0VGV4dE1ldHJpY3MoREMgKmRjLCBURVhUTUVUUklDMzJBICptZXRyaWNzKQotewotICAgIAotICAgIG1ldHJpY3MtPnRtV2VpZ2h0ICAgICAgICAgICA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtV2VpZ2h0OwotICAgIG1ldHJpY3MtPnRtT3ZlcmhhbmcgICAgICAgICA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtT3Zlcmhhbmc7Ci0gICAgbWV0cmljcy0+dG1EaWdpdGl6ZWRBc3BlY3RYID0gZGMtPnUueC5mb250Lm1ldHJpY3MudG1EaWdpdGl6ZWRBc3BlY3RYOwotICAgIG1ldHJpY3MtPnRtRGlnaXRpemVkQXNwZWN0WSA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtRGlnaXRpemVkQXNwZWN0WTsKLSAgICBtZXRyaWNzLT50bUZpcnN0Q2hhciAgICAgICAgPSBkYy0+dS54LmZvbnQubWV0cmljcy50bUZpcnN0Q2hhcjsKLSAgICBtZXRyaWNzLT50bUxhc3RDaGFyICAgICAgICAgPSBkYy0+dS54LmZvbnQubWV0cmljcy50bUxhc3RDaGFyOwotICAgIG1ldHJpY3MtPnRtRGVmYXVsdENoYXIgICAgICA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtRGVmYXVsdENoYXI7Ci0gICAgbWV0cmljcy0+dG1CcmVha0NoYXIgICAgICAgID0gZGMtPnUueC5mb250Lm1ldHJpY3MudG1CcmVha0NoYXI7Ci0gICAgbWV0cmljcy0+dG1JdGFsaWMgICAgICAgICAgID0gZGMtPnUueC5mb250Lm1ldHJpY3MudG1JdGFsaWM7Ci0gICAgbWV0cmljcy0+dG1VbmRlcmxpbmVkICAgICAgID0gZGMtPnUueC5mb250Lm1ldHJpY3MudG1VbmRlcmxpbmVkOwotICAgIG1ldHJpY3MtPnRtU3RydWNrT3V0ICAgICAgICA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtU3RydWNrT3V0OwotICAgIG1ldHJpY3MtPnRtUGl0Y2hBbmRGYW1pbHkgICA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtUGl0Y2hBbmRGYW1pbHk7Ci0gICAgbWV0cmljcy0+dG1DaGFyU2V0ICAgICAgICAgID0gZGMtPnUueC5mb250Lm1ldHJpY3MudG1DaGFyU2V0OwotCi0gICAgbWV0cmljcy0+dG1Bc2NlbnQgID0gYWJzKCBkYy0+dS54LmZvbnQubWV0cmljcy50bUFzY2VudAotCQkJICAgICAgKiBkYy0+d25kRXh0WSAvIGRjLT52cG9ydEV4dFkgKTsKLSAgICBtZXRyaWNzLT50bURlc2NlbnQgPSBhYnMoIGRjLT51LnguZm9udC5tZXRyaWNzLnRtRGVzY2VudAotCQkJICAgICAgKiBkYy0+d25kRXh0WSAvIGRjLT52cG9ydEV4dFkgKTsKLSAgICBtZXRyaWNzLT50bUhlaWdodCAgPSBkYy0+dS54LmZvbnQubWV0cmljcy50bUFzY2VudCArIGRjLT51LnguZm9udC5tZXRyaWNzLnRtRGVzY2VudDsKLSAgICBtZXRyaWNzLT50bUludGVybmFsTGVhZGluZyA9IGFicyggZGMtPnUueC5mb250Lm1ldHJpY3MudG1JbnRlcm5hbExlYWRpbmcKLQkJCQkgICAgICAqIGRjLT53bmRFeHRZIC8gZGMtPnZwb3J0RXh0WSApOwotICAgIG1ldHJpY3MtPnRtRXh0ZXJuYWxMZWFkaW5nID0gYWJzKCBkYy0+dS54LmZvbnQubWV0cmljcy50bUV4dGVybmFsTGVhZGluZwotCQkJCSAgICAgICogZGMtPnduZEV4dFkgLyBkYy0+dnBvcnRFeHRZICk7Ci0gICAgbWV0cmljcy0+dG1NYXhDaGFyV2lkdGggICAgPSBhYnMoIGRjLT51LnguZm9udC5tZXRyaWNzLnRtTWF4Q2hhcldpZHRoIAotCQkJCSAgICAgICogZGMtPnduZEV4dFggLyBkYy0+dnBvcnRFeHRYICk7Ci0gICAgbWV0cmljcy0+dG1BdmVDaGFyV2lkdGggICAgPSBhYnMoIGRjLT51LnguZm9udC5tZXRyaWNzLnRtQXZlQ2hhcldpZHRoCi0JCQkJICAgICAgKiBkYy0+d25kRXh0WCAvIGRjLT52cG9ydEV4dFggKTsKLQotICAgIHJldHVybiBUUlVFOwotICAgIAotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFgxMURSVl9GT05UX1NlbGVjdE9iamVjdAotICoKLSAqIEZJWE1FOiB0aGUgZm9udHMgc2hvdWxkIG5vdCBiZSBjYWNoZWQgYnkgaGZvbnQgb25seSwgYmVjYXVzZQotICogbWV0cmljcyBtYXkgYmUgZGlmZmVyZW50IGluIGFuIG90aGVyIERDLgotICovCi1IRk9OVDMyIFgxMURSVl9GT05UX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEZPTlQzMiBoZm9udCwgRk9OVE9CSiAqIGZvbnQgKQotewotICAgIHN0YXRpYyBYX1BIWVNGT05UIHN0b2NrRm9udHNbTEFTVF9TVE9DS19GT05ULUZJUlNUX1NUT0NLX0ZPTlQrMV07Ci0KLSAgICBzdGF0aWMgc3RydWN0IHsKLQkJSEZPTlQzMgkJaWQ7Ci0JCUxPR0ZPTlQxNglsb2dmb250OwotCQlpbnQJCWFjY2VzczsKLQkJaW50CQl1c2VkOwotCQlYX1BIWVNGT05UCWNhY2hlRm9udDsgfSBjYWNoZUZvbnRzW0ZPTlRDQUNIRV0sICpjYWNoZUZvbnRzTWluOwotICAgIGludCAJaTsKLQotICAgIFhfUEhZU0ZPTlQgKiBzdG9ja1B0cjsKLSAgICBIRk9OVDMyIHByZXZIYW5kbGUgPSBkYy0+dy5oRm9udDsKLSAgICBYRm9udFN0cnVjdCAqIGZvbnRTdHJ1Y3Q7Ci0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwiRk9OVF9TZWxlY3RPYmplY3QoJXAsICUwNHgsICVwKVxuIiwgZGMsIGhmb250LCBmb250KTsKLQotI2lmIDAgLyogRnJvbSB0aGUgY29kZSBpbiBTZWxlY3RPYmplY3QsIHRoaXMgY2FuIG5vdCBoYXBwZW4gKi8KLSAgICAgIC8qIExvYWQgZm9udCBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAoIWZvbnQpCi0gICAgewotCUhGT05UMTYgaG5ld2ZvbnQ7Ci0KLQlobmV3Zm9udCA9IENyZWF0ZUZvbnQxNigxMCwgNywgMCwgMCwgRldfRE9OVENBUkUsCi0JCQkgICAgICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBERUZBVUxUX0NIQVJTRVQsIDAsIDAsCi0JCQkgICAgICBERUZBVUxUX1FVQUxJVFksIEZGX0RPTlRDQVJFLCAiKiIgKTsKLQlmb250ID0gKEZPTlRPQkogKikgR0RJX0hFQVBfTElOX0FERFIoIGhuZXdmb250ICk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoKGhmb250ID49IEZJUlNUX1NUT0NLX0ZPTlQpICYmIChoZm9udCA8PSBMQVNUX1NUT0NLX0ZPTlQpKQotCXN0b2NrUHRyID0gJnN0b2NrRm9udHNbaGZvbnQgLSBGSVJTVF9TVE9DS19GT05UXTsKLSAgICBlbHNlIHsKLQlzdG9ja1B0ciA9IE5VTEw7Ci0JLyoKLQkgKiBPaywgSXQncyBub3QgYSBzdG9jayBmb250IGJ1dCAKLQkgKiBtYXkgYmUgaXQncyBjYWNoZWQgaW4gZHluYW1pYyBjYWNoZQotCSAqLwotCWZvcihpPTA7IGk8Rk9OVENBQ0hFOyBpKyspIC8qIHNlYXJjaCBmb3Igc2FtZSBoYW5kbGUgKi8KLQkgICAgIGlmIChjYWNoZUZvbnRzW2ldLmlkPT1oZm9udCkgeyAvKiBHb3QgdGhlIGhhbmRsZSAqLwotCQkvKgotCQkgKiBDaGVjayBpZiBIYW5kbGUgbWF0Y2hlcyB0aGUgZm9udCAKLQkJICovCi0JCWlmKG1lbWNtcCgmY2FjaGVGb250c1tpXS5sb2dmb250LCYoZm9udC0+bG9nZm9udCksIHNpemVvZihMT0dGT05UMTYpKSkgewotCQkJLyogTm86IHJlbW92ZSBoYW5kbGUgaWQgZnJvbSBkeW5hbWljIGZvbnQgY2FjaGUgKi8KLQkJCWNhY2hlRm9udHNbaV0uYWNjZXNzPTA7Ci0JCQljYWNoZUZvbnRzW2ldLnVzZWQ9MDsKLQkJCWNhY2hlRm9udHNbaV0uaWQ9MDsKLQkJCS8qIG1heSBiZSB0aGVyZSBpcyBhbiB1bnVzZWQgaGFuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBmb250ICovCi0JCQlmb3IoaT0wOyBpPEZPTlRDQUNIRTsgaSsrKSB7Ci0JCQkJaWYoKGNhY2hlRm9udHNbaV0udXNlZCA9PSAwKSAmJgotCQkJCSAgKG1lbWNtcCgmY2FjaGVGb250c1tpXS5sb2dmb250LCYoZm9udC0+bG9nZm9udCksIHNpemVvZihMT0dGT05UMTYpKSk9PSAwKSB7Ci0JCQkJCS8qIGdvdCBpdCBsb2FkIGZyb20gY2FjaGUgYW5kIHNldCBuZXcgaGFuZGxlIGlkICovCi0JCQkJCXN0b2NrUHRyID0gJmNhY2hlRm9udHNbaV0uY2FjaGVGb250OwotCQkJCQljYWNoZUZvbnRzW2ldLmFjY2Vzcz0xOwotCQkJCQljYWNoZUZvbnRzW2ldLnVzZWQ9MTsKLQkJCQkJY2FjaGVGb250c1tpXS5pZD1oZm9udDsKLQkJCQkJZHByaW50Zl9mb250KHN0ZGRlYiwiRk9OVF9TZWxlY3RPYmplY3Q6IGdvdCBmb250IGZyb20gdW51c2VkIGhhbmRsZVxuIik7Ci0JCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJfQotCQllbHNlIHsKLQkJCS8qIFllczogbG9hZCBmcm9tIGR5bmFtaWMgZm9udCBjYWNoZSAqLwotCQkJc3RvY2tQdHIgPSAmY2FjaGVGb250c1tpXS5jYWNoZUZvbnQ7Ci0JCQljYWNoZUZvbnRzW2ldLmFjY2VzcysrOwotCQkJY2FjaGVGb250c1tpXS51c2VkKys7Ci0JCQl9Ci0JCWJyZWFrOwotCQl9Ci0JfQotICAgIGlmICghc3RvY2tQdHIgfHwgIXN0b2NrUHRyLT5mc3RydWN0KQotICAgIHsKLQlpZiAoIShmb250U3RydWN0ID0gRk9OVF9NYXRjaEZvbnQoICZmb250LT5sb2dmb250LCBkYyApKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAvKiBJZiBpdCBpcyBub3QgYSBzdG9jayBmb250LCB3ZSBjYW4gc2ltcGx5IHJldHVybiAwICovCi0gICAgICAgICAgICBpZiAoIXN0b2NrUHRyKSByZXR1cm4gMDsKLSAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIHdlIG11c3QgdHJ5IHRvIGZpbmQgYSBzdWJzdGl0dXRlICovCi0gICAgICAgICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJMb2FkaW5nIGZvbnQgJ2ZpeGVkJyBmb3IgJTA0eFxuIiwgaGZvbnQgKTsKLSAgICAgICAgICAgIGZvbnQtPmxvZ2ZvbnQubGZQaXRjaEFuZEZhbWlseSAmPSB+VkFSSUFCTEVfUElUQ0g7Ci0gICAgICAgICAgICBmb250LT5sb2dmb250LmxmUGl0Y2hBbmRGYW1pbHkgfD0gRklYRURfUElUQ0g7Ci0gICAgICAgICAgICBmb250U3RydWN0ID0gWExvYWRRdWVyeUZvbnQoIGRpc3BsYXksICJmaXhlZCIgKTsKLSAgICAgICAgICAgIGlmICghZm9udFN0cnVjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJObyBzeXN0ZW0gZm9udCBjb3VsZCBiZSBmb3VuZC4gUGxlYXNlIGNoZWNrIHlvdXIgZm9udCBwYXRoLlxuIiApOwotICAgICAgICAgICAgICAgIGV4aXQoIDEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWZvbnRTdHJ1Y3QgPSBzdG9ja1B0ci0+ZnN0cnVjdDsKLQlkcHJpbnRmX2ZvbnQoc3RkZGViLAotICAgICAgICAgICAgICAgICAgICAgIkZPTlRfU2VsZWN0T2JqZWN0OiBMb2FkZWQgZm9udCBmcm9tIGNhY2hlICUwNHggJXBcbiIsCi0JCSAgICAgaGZvbnQsIGZvbnRTdHJ1Y3QgKTsKLSAgICB9CQotCi0gICAgICAvKiBVbnVzZSBwcmV2aW91cyBmb250ICovCi0JZm9yIChpPTA7IGkgPCBGT05UQ0FDSEU7IGkrKykgewotCQlpZiAoY2FjaGVGb250c1tpXS5pZCA9PSBwcmV2SGFuZGxlKSB7Ci0JCQlpZihjYWNoZUZvbnRzW2ldLnVzZWQgPT0gMCkKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyB0byBkZWNyZW1lbnQgYSB1c2UgY291bnQgb2YgMC5cbiIpOwotCQkJZWxzZSAKLQkJCQljYWNoZUZvbnRzW2ldLnVzZWQtLTsKLQkJfQotCX0KLQotICAgICAgLyogU3RvcmUgZm9udCAqLwotICAgIGRjLT53LmhGb250ID0gaGZvbnQ7Ci0gICAgaWYgKHN0b2NrUHRyKQotICAgIHsKLQlpZiAoIXN0b2NrUHRyLT5mc3RydWN0KQotCXsKLQkgICAgc3RvY2tQdHItPmZzdHJ1Y3QgPSBmb250U3RydWN0OwotCSAgICBGT05UX0dldE1ldHJpY3MoICZmb250LT5sb2dmb250LCBmb250U3RydWN0LCAmc3RvY2tQdHItPm1ldHJpY3MgKTsKLQl9Ci0JbWVtY3B5KCAmZGMtPnUueC5mb250LCBzdG9ja1B0ciwgc2l6ZW9mKCpzdG9ja1B0cikgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkvKiAKLQkgKiBDaGVjayBpbiBjYWNoZUZvbnQKLQkgKi8KLQljYWNoZUZvbnRzTWluPU5VTEw7Ci0JZm9yIChpPTA7IGkgPCBGT05UQ0FDSEU7IGkrKykgewotCQlpZiAoY2FjaGVGb250c1tpXS51c2VkPT0wKSAKLQkJCWlmICgoIWNhY2hlRm9udHNNaW4pIHx8ICgoY2FjaGVGb250c01pbikgJiYgKGNhY2hlRm9udHNNaW4tPmFjY2VzcyA+IGNhY2hlRm9udHNbaV0uYWNjZXNzKSkpCi0JCQkJY2FjaGVGb250c01pbj0mY2FjaGVGb250c1tpXTsKLQkJfQotCWlmICghY2FjaGVGb250c01pbikgewotCQlmcHJpbnRmKHN0ZGVyciwiTm8gdW51c2VkIGZvbnQgY2FjaGUgZW50cnkgISEhIVxuIiApOwotCQlyZXR1cm4gcHJldkhhbmRsZTsKLQl9Ci0JaWYgKGNhY2hlRm9udHNNaW4tPmlkIT0wKSB7Ci0JCWRwcmludGZfZm9udChzdGRkZWIsCi0JCQkiRk9OVF9TZWxlY3RPYmplY3Q6IEZyZWVpbmcgJTA0eCBcbiIsY2FjaGVGb250c01pbi0+aWQgKTsKLQkJWEZyZWVGb250KCBkaXNwbGF5LCBjYWNoZUZvbnRzTWluLT5jYWNoZUZvbnQuZnN0cnVjdCApOwotCQl9Ci0JY2FjaGVGb250c01pbi0+Y2FjaGVGb250LmZzdHJ1Y3QgPSBmb250U3RydWN0OwotCUZPTlRfR2V0TWV0cmljcyggJmZvbnQtPmxvZ2ZvbnQsIGZvbnRTdHJ1Y3QsICZjYWNoZUZvbnRzTWluLT5jYWNoZUZvbnQubWV0cmljcyApOwotCWNhY2hlRm9udHNNaW4tPmFjY2Vzcz0xOwotCWNhY2hlRm9udHNNaW4tPnVzZWQ9MTsKLQljYWNoZUZvbnRzTWluLT5pZD1oZm9udDsKLQltZW1jcHkoICZkYy0+dS54LmZvbnQsICYoY2FjaGVGb250c01pbi0+Y2FjaGVGb250KSwgc2l6ZW9mKGNhY2hlRm9udHNNaW4tPmNhY2hlRm9udCkgKTsKLQltZW1jcHkoJmNhY2hlRm9udHNNaW4tPmxvZ2ZvbnQsJihmb250LT5sb2dmb250KSwgc2l6ZW9mKExPR0ZPTlQxNikpOwotCi0gICAgfQotICAgIHJldHVybiBwcmV2SGFuZGxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDaGFyV2lkdGgzMkEgICAgKEdESTMyLjE1NSkKLSAqLwotQk9PTDMyIFgxMURSVl9HZXRDaGFyV2lkdGgoIERDICpkYywgVUlOVDMyIGZpcnN0Q2hhciwgVUlOVDMyIGxhc3RDaGFyLAotCQkJICAgIExQSU5UMzIgYnVmZmVyICkKLXsKLSAgICBpbnQgaSwgd2lkdGg7Ci0gICAgWEZvbnRTdHJ1Y3QgKnhmb250OwotICAgIFhDaGFyU3RydWN0ICpjcywgKmRlZjsKLQotICAgIHhmb250ID0gZGMtPnUueC5mb250LmZzdHJ1Y3Q7Ci0gICAgCi0gICAgLyogZml4ZWQgZm9udD8gKi8KLSAgICBpZiAoeGZvbnQtPnBlcl9jaGFyID09IE5VTEwpCi0gICAgewotCWZvciAoaSA9IGZpcnN0Q2hhcjsgaSA8PSBsYXN0Q2hhcjsgaSsrKQotCSAgICAqYnVmZmVyKysgPSB4Zm9udC0+bWF4X2JvdW5kcy53aWR0aDsKLQlyZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICBDSV9HRVRfREVGQVVMVF9JTkZPKHhmb250LCBkZWYpOwotCQotICAgIGZvciAoaSA9IGZpcnN0Q2hhcjsgaSA8PSBsYXN0Q2hhcjsgaSsrKQotICAgIHsKLQlDSV9HRVRfQ0hBUl9JTkZPKCB4Zm9udCwgaSwgZGVmLCBjcyApOwotICAgICAgICB3aWR0aCA9IGNzID8gY3MtPndpZHRoIDogeGZvbnQtPm1heF9ib3VuZHMud2lkdGg7Ci0gICAgICAgICpidWZmZXIrKyA9IE1BWCggd2lkdGgsIDAgKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvaW5pdC5jIGIvZ3JhcGhpY3MveDExZHJ2L2luaXQuYwppbmRleCBiY2VlYjEwLi4wZDc0OTZmIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvaW5pdC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9pbml0LmMKQEAgLTYsMTQgKzYsMTYgQEAKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIngxMWRydi5oIgorI2luY2x1ZGUgImNvbG9yLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCi0jaW5jbHVkZSAiZ2RpLmgiCi0KIAogc3RhdGljIEJPT0wzMiBYMTFEUlZfQ3JlYXRlREMoIERDICpkYywgTFBDU1RSIGRyaXZlciwgTFBDU1RSIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgb3V0cHV0LCBjb25zdCBERVZNT0RFMTYqIGluaXREYXRhICk7CiBzdGF0aWMgQk9PTDMyIFgxMURSVl9EZWxldGVEQyggREMgKmRjICk7CiAKK3N0YXRpYyBJTlQzMiBYMTFEUlZfRXNjYXBlKCBEQyAqZGMsIElOVDMyIG5Fc2NhcGUsIElOVDMyIGNiSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSIGxwSW5EYXRhLCBTRUdQVFIgbHBPdXREYXRhICk7CisKIHN0YXRpYyBjb25zdCBEQ19GVU5DVElPTlMgWDExRFJWX0Z1bmNzID0KIHsKICAgICBYMTFEUlZfQXJjLCAgICAgICAgICAgICAgICAgICAgICAvKiBwQXJjICovCkBAIC0yMywxMyArMjUsMTMgQEAKICAgICBYMTFEUlZfRGVsZXRlREMsICAgICAgICAgICAgICAgICAvKiBwRGVsZXRlREMgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRGVsZXRlT2JqZWN0ICovCiAgICAgWDExRFJWX0VsbGlwc2UsICAgICAgICAgICAgICAgICAgLyogcEVsbGlwc2UgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRW51bURldmljZUZvbnRzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEVzY2FwZSAqLworICAgIFgxMURSVl9FbnVtRGV2aWNlRm9udHMsICAgICAgICAgIC8qIHBFbnVtRGV2aWNlRm9udHMgKi8KKyAgICBYMTFEUlZfRXNjYXBlLCAgICAgICAgICAgICAgICAgICAvKiBwRXNjYXBlICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEV4Y2x1ZGVDbGlwUmVjdCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBFeGNsdWRlVmlzUmVjdCAqLwogICAgIFgxMURSVl9FeHRGbG9vZEZpbGwsICAgICAgICAgICAgIC8qIHBFeHRGbG9vZEZpbGwgKi8KICAgICBYMTFEUlZfRXh0VGV4dE91dCwgICAgICAgICAgICAgICAvKiBwRXh0VGV4dE91dCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBHZXRDaGFyV2lkdGggKi8KKyAgICBYMTFEUlZfR2V0Q2hhcldpZHRoLCAgICAgICAgICAgICAvKiBwR2V0Q2hhcldpZHRoICovCiAgICAgWDExRFJWX0dldFBpeGVsLCAgICAgICAgICAgICAgICAgLyogcEdldFBpeGVsICovCiAgICAgWDExRFJWX0dldFRleHRFeHRlbnRQb2ludCwgICAgICAgLyogcEdldFRleHRFeHRlbnRQb2ludCAqLwogICAgIFgxMURSVl9HZXRUZXh0TWV0cmljcywgICAgICAgICAgIC8qIHBHZXRUZXh0TWV0cmljcyAqLwpAQCAtNzksMTMgKzgxLDY1IEBACiAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFN0cmV0Y2hESUJpdHMgKi8KIH07CiAKLXN0YXRpYyBEZXZpY2VDYXBzIFgxMURSVl9EZXZDYXBzOworc3RhdGljIERldmljZUNhcHMgWDExRFJWX0RldkNhcHMgPSB7CisvKiB2ZXJzaW9uICovCQkwLCAKKy8qIHRlY2hub2xvZ3kgKi8JRFRfUkFTRElTUExBWSwKKy8qIHNpemUsIHJlc29sdXRpb24gKi8JMCwgMCwgMCwgMCwgMCwgCisvKiBkZXZpY2Ugb2JqZWN0cyAqLwkxLCAxNiArIDYsIDE2LCAwLCAwLCAxMDAsIDAsCQorLyogY3VydmUgY2FwcyAqLwlDQ19DSVJDTEVTIHwgQ0NfUElFIHwgQ0NfQ0hPUkQgfCBDQ19FTExJUFNFUyB8CisJCQlDQ19XSURFIHwgQ0NfU1RZTEVEIHwgQ0NfV0lERVNUWUxFRCB8IENDX0lOVEVSSU9SUyB8IENDX1JPVU5EUkVDVCwKKy8qIGxpbmUgY2FwcyAqLwkJTENfUE9MWUxJTkUgfCBMQ19NQVJLRVIgfCBMQ19QT0xZTUFSS0VSIHwgTENfV0lERSB8CisJCQlMQ19TVFlMRUQgfCBMQ19XSURFU1RZTEVEIHwgTENfSU5URVJJT1JTLAorLyogcG9seWdvbiBjYXBzICovCVBDX1BPTFlHT04gfCBQQ19SRUNUQU5HTEUgfCBQQ19XSU5EUE9MWUdPTiB8CisJCQlQQ19TQ0FOTElORSB8IFBDX1dJREUgfCBQQ19TVFlMRUQgfCBQQ19XSURFU1RZTEVEIHwgUENfSU5URVJJT1JTLAorLyogdGV4dCBjYXBzICovCQkwLAorLyogcmVnaW9ucyAqLwkJQ1BfUkVHSU9OLAorLyogcmFzdGVyIGNhcHMgKi8JUkNfQklUQkxUIHwgUkNfQkFORElORyB8IFJDX1NDQUxJTkcgfCBSQ19CSVRNQVA2NCB8CisJCQlSQ19ESV9CSVRNQVAgfCBSQ19ESUJUT0RFViB8IFJDX0JJR0ZPTlQgfCBSQ19TVFJFVENIQkxUIHwgUkNfU1RSRVRDSERJQiB8IFJDX0RFVkJJVFMsCisvKiBhc3BlY3RzICovCQkzNiwgMzYsIDUxLAorLyogcGFkMSAqLwkJeyAwIH0sCisvKiBsb2cgcGl4ZWxzICovCTAsIDAsIAorLyogcGFkMiAqLwkJeyAwIH0sCisvKiBwYWxldHRlIHNpemUgKi8JMCwKKy8qIC4uZXRjICovCQkwLCAwIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgIFgxMURSVl9Jbml0CiAgKi8KIEJPT0wzMiBYMTFEUlZfSW5pdCh2b2lkKQogeworICAgIGV4dGVybiBCT09MMzIgQ09MT1JfSW5pdCgpOworCisgICAgLyogRklYTUU6IGNvbG9ybWFwIG1hbmFnZW1lbnQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBYMTFEUlYgKi8KKworICAgIGlmKCAhQ09MT1JfSW5pdCgpICkgcmV0dXJuIEZBTFNFOworCisgICAgLyogRmluaXNoIHVwIGRldmljZSBjYXBzICovCisKKyNpZiAwCisgICAgcHJpbnRmKCJEaXNwbGF5OlxuSGVpZ2h0ID0gJS00aSBweGwsICUtNGkgbW1cbldpZHRoICA9ICUtNGkgcHhsLCAlLTRpIG1tXG4iLAorCSAgICBIZWlnaHRPZlNjcmVlbihzY3JlZW4pLCBIZWlnaHRNTU9mU2NyZWVuKHNjcmVlbiksCisJICAgIFdpZHRoT2ZTY3JlZW4oc2NyZWVuKSwgV2lkdGhNTU9mU2NyZWVuKHNjcmVlbikgKTsKKyNlbmRpZgorCisgICAgWDExRFJWX0RldkNhcHMudmVyc2lvbiA9IDB4MzAwOworICAgIFgxMURSVl9EZXZDYXBzLmhvcnpTaXplID0gV2lkdGhNTU9mU2NyZWVuKHNjcmVlbikgKiBzY3JlZW5XaWR0aCAvIFdpZHRoT2ZTY3JlZW4oc2NyZWVuKTsKKyAgICBYMTFEUlZfRGV2Q2Fwcy52ZXJ0U2l6ZSA9IEhlaWdodE1NT2ZTY3JlZW4oc2NyZWVuKSAqIHNjcmVlbkhlaWdodCAvIEhlaWdodE9mU2NyZWVuKHNjcmVlbik7CisgICAgWDExRFJWX0RldkNhcHMuaG9yelJlcyA9IHNjcmVlbldpZHRoOworICAgIFgxMURSVl9EZXZDYXBzLnZlcnRSZXMgPSBzY3JlZW5IZWlnaHQ7CisgICAgWDExRFJWX0RldkNhcHMuYml0c1BpeGVsID0gc2NyZWVuRGVwdGg7CisKKyAgICBpZiggQ09MT1JfR2V0U3lzdGVtUGFsZXR0ZUZsYWdzKCkgJiBDT0xPUl9WSVJUVUFMICkgCisJWDExRFJWX0RldkNhcHMuc2l6ZVBhbGV0dGUgPSAwOworICAgIGVsc2UKKyAgICB7CisJWDExRFJWX0RldkNhcHMucmFzdGVyQ2FwcyB8PSBSQ19QQUxFVFRFOworCVgxMURSVl9EZXZDYXBzLnNpemVQYWxldHRlID0gRGVmYXVsdFZpc3VhbChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSkpLT5tYXBfZW50cmllczsKKyAgICB9CisKKyAgICBYMTFEUlZfRGV2Q2Fwcy5sb2dQaXhlbHNYID0gKGludCkoWDExRFJWX0RldkNhcHMuaG9yelJlcyAqIDI1LjQgLyBYMTFEUlZfRGV2Q2Fwcy5ob3J6U2l6ZSk7CisgICAgWDExRFJWX0RldkNhcHMubG9nUGl4ZWxzWSA9IChpbnQpKFgxMURSVl9EZXZDYXBzLnZlcnRSZXMgKiAyNS40IC8gWDExRFJWX0RldkNhcHMudmVydFNpemUpOworCiAgICAgLyogQ3JlYXRlIGRlZmF1bHQgYml0bWFwICovCiAKICAgICBpZiAoIVgxMURSVl9CSVRNQVBfSW5pdCgpKSByZXR1cm4gRkFMU0U7CkBAIC05NCwxNCArMTQ4LDEzIEBACiAKICAgICBpZiAoIVgxMURSVl9CUlVTSF9Jbml0KCkpIHJldHVybiBGQUxTRTsKIAotICAgIC8qIEluaXRpYWxpemUgZm9udHMgKi8KKyAgICAvKiBJbml0aWFsaXplIGZvbnRzIGFuZCB0ZXh0IGNhcHMgKi8KIAotICAgIGlmICghWDExRFJWX0ZPTlRfSW5pdCgpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFYMTFEUlZfRk9OVF9Jbml0KCAmWDExRFJWX0RldkNhcHMgKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgcmV0dXJuIERSSVZFUl9SZWdpc3RlckRyaXZlciggIkRJU1BMQVkiLCAmWDExRFJWX0Z1bmNzICk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICAgWDExRFJWX0NyZWF0ZURDCiAgKi8KQEAgLTExMCw4ICsxNjMsNiBAQAogewogICAgIFgxMURSVl9QREVWSUNFICpwaHlzRGV2OwogCi0gICAgaWYgKCFYMTFEUlZfRGV2Q2Fwcy52ZXJzaW9uKSBEQ19GaWxsRGV2Q2FwcyggJlgxMURSVl9EZXZDYXBzICk7Ci0KICAgICBwaHlzRGV2ID0gJmRjLT51Lng7ICAvKiBmb3Igbm93ICovCiAKICAgICBtZW1zZXQoIHBoeXNEZXYsIDAsIHNpemVvZigqcGh5c0RldikgKTsKQEAgLTE1NywzICsyMDgsMjQgQEAKICAgICBYRnJlZUdDKCBkaXNwbGF5LCBwaHlzRGV2LT5nYyApOwogICAgIHJldHVybiBUUlVFOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFgxMURSVl9Fc2NhcGUKKyAqLworc3RhdGljIElOVDMyIFgxMURSVl9Fc2NhcGUoIERDICpkYywgSU5UMzIgbkVzY2FwZSwgSU5UMzIgY2JJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIgbHBJbkRhdGEsIFNFR1BUUiBscE91dERhdGEgKQoreworICAgIHN3aXRjaCggbkVzY2FwZSApCisgICAgeworCWNhc2UgR0VUU0NBTElOR0ZBQ1RPUjoKKwkgICAgIGlmKCBscE91dERhdGEgKQorCSAgICAgeworCQkgTFBQT0lOVDE2IGxwcHQgPSAoTFBQT0lOVDE2KVBUUl9TRUdfVE9fTElOKGxwT3V0RGF0YSk7CisJCSBscHB0LT54ID0gbHBwdC0+eSA9IDA7CS8qIG5vIGRldmljZSBzY2FsaW5nICovCisJCSByZXR1cm4gMTsKKwkgICAgIH0KKwkgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3RleHQuYyBiL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMKaW5kZXggNTYxY2I1ZS4uY2M3MjQ5ZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L3RleHQuYworKysgYi9ncmFwaGljcy94MTFkcnYvdGV4dC5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSAiZ2RpLmgiCiAvKiNpbmNsdWRlICJjYWxsYmFjay5oIiovCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgIngxMWRydi5oIgorI2luY2x1ZGUgIngxMWZvbnQuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19URVhUICovCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTMyLDIxICszMiwyOSBAQAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFQ1QzMiAqbHByZWN0LCBMUENTVFIgc3RyLCBVSU5UMzIgY291bnQsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UMzIgKmxwRHggKQogewotICAgIEhSR04zMgloUmduQ2xpcCA9IDA7Ci0gICAgaW50IAlkaXIsIGFzY2VudCwgZGVzY2VudCwgaTsKLSAgICBYQ2hhclN0cnVjdCBpbmZvOwotICAgIFhGb250U3RydWN0ICpmb250OwotICAgIFJFQ1QzMiAJcmVjdDsKKyAgICBIUkdOMzIJCWhSZ25DbGlwID0gMDsKKyAgICBpbnQgCQlkaXIsIGFzY2VudCwgZGVzY2VudCwgaTsKKyAgICBmb250T2JqZWN0KgkJcGZvOworICAgIFhDaGFyU3RydWN0IAlpbmZvOworICAgIFhGb250U3RydWN0Kglmb250OworICAgIFJFQ1QzMiAJCXJlY3Q7CisgICAgY2hhcgkJZGZCcmVha0NoYXIsIGxmVW5kZXJsaW5lLCBsZlN0cmlrZU91dDsKIAogICAgIGlmICghRENfU2V0dXBHQ0ZvclRleHQoIGRjICkpIHJldHVybiBUUlVFOwotICAgIGZvbnQgPSBkYy0+dS54LmZvbnQuZnN0cnVjdDsKIAotICAgIGRwcmludGZfdGV4dChzdGRkZWIsIkV4dFRleHRPdXQ6IGhkYz0lMDR4ICVkLCVkICclLipzJywgJWQgIGZsYWdzPSVkXG4iLAotICAgICAgICAgICAgICAgICBkYy0+aFNlbGYsIHgsIHksIChpbnQpY291bnQsIHN0ciwgY291bnQsIGZsYWdzKTsKKyAgICBwZm8gPSBYRk9OVF9HZXRGb250T2JqZWN0KCBkYy0+dS54LmZvbnQgKTsKKyAgICBmb250ID0gcGZvLT5mczsKKworICAgIGRmQnJlYWtDaGFyID0gKGNoYXIpcGZvLT5maS0+ZGYuZGZCcmVha0NoYXI7CisgICAgbGZVbmRlcmxpbmUgPSAocGZvLT5mb19mbGFncyAmIEZPX1NZTlRIX1VOREVSTElORSkgPyAxIDogMDsKKyAgICBsZlN0cmlrZU91dCA9IChwZm8tPmZvX2ZsYWdzICYgRk9fU1lOVEhfU1RSSUtFT1VUKSA/IDEgOiAwOworCisgICAgZHByaW50Zl90ZXh0KHN0ZGRlYiwiRXh0VGV4dE91dDogaGRjPSUwNHggZGY9JTA0eCAlZCwlZCAnJS4qcycsICVkICBmbGFncz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgZGMtPmhTZWxmLCAoVUlOVDE2KShkYy0+dS54LmZvbnQpLCB4LCB5LCAoaW50KWNvdW50LCBzdHIsIGNvdW50LCBmbGFncyk7CisKICAgICBpZiAobHByZWN0ICE9IE5VTEwpIGRwcmludGZfdGV4dChzdGRkZWIsICJcdHJlY3Q9KCVkLCVkLSAlZCwlZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHByZWN0LT5sZWZ0LCBscHJlY3QtPnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHJlY3QtPnJpZ2h0LCBscHJlY3QtPmJvdHRvbSApOwotCiAgICAgICAvKiBTZXR1cCBjb29yZGluYXRlcyAqLwogCiAgICAgaWYgKGRjLT53LnRleHRBbGlnbiAmIFRBX1VQREFURUNQKQpAQCAtMTA2LDcgKzExNCw3IEBACiAJLyogc3VtIGxwRHggYXJyYXkgYW5kIGFkZCB0aGUgd2lkdGggb2YgbGFzdCBjaGFyYWN0ZXIgKi8KIAogICAgICAgICBpbmZvLndpZHRoID0gWFRleHRXaWR0aCggZm9udCwgc3RyICsgY291bnQgLSAxLCAxKSArIGRjLT53LmNoYXJFeHRyYTsKLSAgICAgICAgaWYgKHN0cltjb3VudC0xXSA9PSAoY2hhcilkYy0+dS54LmZvbnQubWV0cmljcy50bUJyZWFrQ2hhcikKKyAgICAgICAgaWYgKHN0cltjb3VudC0xXSA9PSBkZkJyZWFrQ2hhcikKICAgICAgICAgICAgIGluZm8ud2lkdGggKz0gZGMtPncuYnJlYWtFeHRyYTsKIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgaW5mby53aWR0aCArPSBscER4W2ldOwpAQCAtMjExLDcgKzIxOSw3IEBACiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKz0gZGMtPncuY2hhckV4dHJhOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09IChjaGFyKWRjLT51LnguZm9udC5tZXRyaWNzLnRtQnJlYWtDaGFyKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09IChjaGFyKWRmQnJlYWtDaGFyKQogICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKz0gZGMtPncuYnJlYWtFeHRyYTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcGl0ZW0tPm5jaGFycysrOwpAQCAtMjI3LDkgKzIzNSwxMCBAQAogCiAgICAgICAvKiBEcmF3IHVuZGVybGluZSBhbmQgc3RyaWtlLW91dCBpZiBuZWVkZWQgKi8KIAotICAgIGlmIChkYy0+dS54LmZvbnQubWV0cmljcy50bVVuZGVybGluZWQpCisgICAgaWYgKGxmVW5kZXJsaW5lKQogICAgIHsKIAlsb25nIGxpbmVQb3MsIGxpbmVXaWR0aDsgICAgICAgCisKIAlpZiAoIVhHZXRGb250UHJvcGVydHkoIGZvbnQsIFhBX1VOREVSTElORV9QT1NJVElPTiwgJmxpbmVQb3MgKSkKIAkgICAgbGluZVBvcyA9IGZvbnQtPmRlc2NlbnQtMTsKIAlpZiAoIVhHZXRGb250UHJvcGVydHkoIGZvbnQsIFhBX1VOREVSTElORV9USElDS05FU1MsICZsaW5lV2lkdGggKSkKQEAgLTI0MSw3ICsyNTAsNyBAQAogCQkgICBkYy0+dy5EQ09yZ1ggKyB4LCBkYy0+dy5EQ09yZ1kgKyB5ICsgbGluZVBvcywKIAkJICAgZGMtPncuRENPcmdYICsgeCArIGluZm8ud2lkdGgsIGRjLT53LkRDT3JnWSArIHkgKyBsaW5lUG9zICk7CiAgICAgfQotICAgIGlmIChkYy0+dS54LmZvbnQubWV0cmljcy50bVN0cnVja091dCkKKyAgICBpZiAobGZTdHJpa2VPdXQpCiAgICAgewogCWxvbmcgbGluZUFzY2VudCwgbGluZURlc2NlbnQ7CiAJaWYgKCFYR2V0Rm9udFByb3BlcnR5KCBmb250LCBYQV9TVFJJS0VPVVRfQVNDRU5ULCAmbGluZUFzY2VudCApKQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGFhODJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMKQEAgLTAsMCArMSwyMDI0IEBACisvKgorICogWDExIHBoeXNpY2FsIGZvbnQgb2JqZWN0cworICoKKyAqIENvcHlyaWdodCAxOTk3IEFsZXggS29yb2JrYQorICoKKyAqIFRPRE86IE1hcHBpbmcgYWxnb3JpdGhtIHR3ZWFrcywgRk9fU1lOVEhfLi4uIGZsYWdzIChFeHRUZXh0T3V0KCkgd2lsbAorICoJIGhhdmUgdG8gYmUgY2hhbmdlZCBmb3IgdGhhdCksIGR5bmFtaWMgZm9udCBsb2FkaW5nIChGcmVlVHlwZSkuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWGF0b20uaD4KKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgIngxMWZvbnQuaCIKKyNpbmNsdWRlICJmb250LmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisjZGVmaW5lIERFQlVHX0ZPTlRfSU5JVAkJMQorCisjZGVmaW5lIFhfUEZPTlRfTUFHSUMJCSgweEZBREUwMDAwKQorI2RlZmluZSBYX0ZNQ19NQUdJQwkJKDB4MDAwMENBRkUpCisKKyNkZWZpbmUgTUFYX0ZPTlRfRkFNSUxJRVMJNjQKKyNkZWZpbmUgTUFYX0xGRF9MRU5HVEgJCTEyOAorCisjZGVmaW5lIFJFTU9WRV9TVUJTRVRTCQkxCisjZGVmaW5lIFVOTUFSS19TVUJTRVRTCQkwCisKKyNkZWZpbmUgREVGX1NDQUxBQkxFX0hFSUdIVAkyNAorI2RlZmluZSBERUZfU0NBTEFCTEVfRFAJCTI0MAorCisjZGVmaW5lIEZGX0ZBTUlMWSAgICAgICAoRkZfTU9ERVJOIHwgRkZfU1dJU1MgfCBGRl9ST01BTiB8IEZGX0RFQ09SQVRJVkUgfCBGRl9TQ1JJUFQpCisKK3R5cGVkZWYgc3RydWN0IF9fZm9udEFsaWFzCit7CisgIExQU1RSCQkJZmFUeXBlRmFjZTsKKyAgTFBTVFIJCQlmYUFsaWFzOworICBzdHJ1Y3QgX19mb250QWxpYXMqCW5leHQ7Cit9IGZvbnRBbGlhczsKKworc3RhdGljIGZvbnRBbGlhcyBhbGlhc1RhYmxlWzJdID0geyAKKwkJCXsgIkhlbHZldGljYSIsICJIZWx2IiwgJmFsaWFzVGFibGVbMV0gfSwKKwkJCXsgIlRpbWVzIiwgIlRtcyBSbW4iLCBOVUxMIH0gCisJCQl9OworCitVSU5UMTYJCQlYVGV4dENhcHMgPSBUQ19PUF9DSEFSQUNURVIgfCBUQ19PUF9TVFJPS0UgfCBUQ19DUF9TVFJPS0UgfAorCQkJCSAgICBUQ19TQV9ET1VCTEUgfCBUQ19TQV9JTlRFR0VSIHwgVENfU0FfQ09OVElOIHwKKwkJCSAJICAgIFRDX1VBX0FCTEUgfCBUQ19TT19BQkxFIHwgVENfUkFfQUJMRTsKKworCQkJLyogWDExUjYgYWRkcyBUQ19TRl9YX1lJTkRFUCwgbWF5YmUgbW9yZS4uLiAqLworCitzdGF0aWMgY29uc3QgY2hhcioJSU5JV2luZVByZWZpeCA9ICIvLndpbmUiOworc3RhdGljIGNvbnN0IGNoYXIqCUlOSUZvbnRNZXRyaWNzID0gIi8uY2FjaGVkbWV0cmljcyI7CitzdGF0aWMgY29uc3QgY2hhcioJSU5JRm9udFNlY3Rpb24gPSAiZm9udHMiOworc3RhdGljIGNvbnN0IGNoYXIqCUlOSVN1YlNlY3Rpb24gPSAiQWxpYXMiOworc3RhdGljIGNvbnN0IGNoYXIqCUlOSURlZmF1bHQgPSAiRGVmYXVsdCI7CisKK3N0YXRpYyBjb25zdCBjaGFyKglMRkRTZXBhcmF0b3IgPSAiKi0iOworc3RhdGljIGNvbnN0IGNoYXIqCWlzbzg4NTlFbmNvZGluZyA9ICJpc284ODU5LSI7CitzdGF0aWMgY29uc3QgY2hhcioJaXNvNjQ2RW5jb2RpbmcgPSAiaXNvNjQ2LjE5OTEtIjsKK3N0YXRpYyBjb25zdCBjaGFyKglhbnNpRW5jb2RpbmcgPSAiYW5zaS0iOworc3RhdGljIGZvbnRSZXNvdXJjZSoJZm9udExpc3QgPSBOVUxMOyAJCitzdGF0aWMgdW5zaWduZWQJCURlZlJlc29sdXRpb24gPSAwOworCitzdGF0aWMgZm9udE9iamVjdCogICAgICBmb250Q2FjaGUgPSBOVUxMOwkJLyogYXJyYXkgKi8KK3N0YXRpYyBpbnQJCWZvbnRDYWNoZVNpemUgPSBGT05UQ0FDSEU7CitzdGF0aWMgaW50CQlmb250TEYgPSAtMSwgZm9udE1SVSA9IC0xOwkvKiBsYXN0IGZyZWUsIG1vc3QgcmVjZW50bHkgdXNlZCAqLworCisjZGVmaW5lIF9fUEZPTlQocEZvbnQpICAgICAoIGZvbnRDYWNoZSArICgoVUlOVDMyKShwRm9udCkgJiAweDAwMDBGRkZGKSApCisjZGVmaW5lIENIRUNLX1BGT05UKHBGb250KSAoICgoKFVJTlQzMikocEZvbnQpICYgMHhGRkZGMDAwMCkgPT0gWF9QRk9OVF9NQUdJQykgJiZcCisJCQkgICAgICgoKFVJTlQzMikocEZvbnQpICYgMHgwMDAwRkZGRikgPCBmb250Q2FjaGVTaXplKSApCisKK3N0YXRpYyBJTlQzMiBYRk9OVF9Jc1N1YnNldChmb250SW5mbyosIGZvbnRJbmZvKik7CitzdGF0aWMgdm9pZCAgWEZPTlRfQ2hlY2tGSUxpc3QoZm9udFJlc291cmNlKiwgZm9udEluZm8qLCBpbnQgc3Vic2V0X2FjdGlvbik7CitzdGF0aWMgdm9pZCAgWEZPTlRfR3Jvd0ZyZWVMaXN0KGludCBzdGFydCwgaW50IGVuZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEhlbHBlciBtYWNyb3MgZnJvbSBYIGRpc3RyaWJ1dGlvbgorICovCisKKyNkZWZpbmUgQ0lfTk9ORVhJU1RDSEFSKGNzKSAoKChjcyktPndpZHRoID09IDApICYmIFwKKwkJCSAgICAgKCgoY3MpLT5yYmVhcmluZ3woY3MpLT5sYmVhcmluZ3wgXAorCQkJICAgICAgIChjcyktPmFzY2VudHwoY3MpLT5kZXNjZW50KSA9PSAwKSkKKworI2RlZmluZSBDSV9HRVRfQ0hBUl9JTkZPKGZzLGNvbCxkZWYsY3MpIFwKK3sgXAorICAgIGNzID0gZGVmOyBcCisgICAgaWYgKGNvbCA+PSBmcy0+bWluX2NoYXJfb3JfYnl0ZTIgJiYgY29sIDw9IGZzLT5tYXhfY2hhcl9vcl9ieXRlMikgeyBcCisJaWYgKGZzLT5wZXJfY2hhciA9PSBOVUxMKSB7IFwKKwkgICAgY3MgPSAmZnMtPm1pbl9ib3VuZHM7IFwKKwl9IGVsc2UgeyBcCisJICAgIGNzID0gJmZzLT5wZXJfY2hhclsoY29sIC0gZnMtPm1pbl9jaGFyX29yX2J5dGUyKV07IFwKKwkgICAgaWYgKENJX05PTkVYSVNUQ0hBUihjcykpIGNzID0gZGVmOyBcCisJfSBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgQ0lfR0VUX0RFRkFVTFRfSU5GTyhmcyxjcykgXAorICBDSV9HRVRfQ0hBUl9JTkZPKGZzLCBmcy0+ZGVmYXVsdF9jaGFyLCBOVUxMLCBjcykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ2hlY2tzdW1zCisgKi8KK3N0YXRpYyBVSU5UMTYgICBfX2xmQ2hlY2tTdW0oIExQTE9HRk9OVDE2IHBsZiApCit7CisgICAgQ0hBUiAgICAgICAgZm9udFtMRl9GQUNFU0laRV07CisgICAgVUlOVDE2ICAgICAgY2hlY2tzdW0gPSAwOworICAgIFVJTlQxNiAgICAgIGk7CisKKyNkZWZpbmUgcHRyICgoVUlOVDE2KilwbGYpCisgICBmb3IoIGkgPSAwOyBpIDwgOTsgaSsrICkgY2hlY2tzdW0gXj0gKnB0cisrOworI3VuZGVmIHB0cgorICAgaSA9IDA7CisjZGVmaW5lIHB0ciAoKENIQVIqKXBsZikKKyAgIGRvIHsgZm9udFtpKytdID0gdG9sb3dlcigqcHRyKTsgfSB3aGlsZSAoKnB0cisrKTsKKyAgIGZvciggcHRyID0gZm9udCwgaSA+Pj0gMTsgaSA+IDA7IGktLSApIAorI3VuZGVmIHB0cgorI2RlZmluZSBwdHIgKChVSU5UMTYqKXBsZikKKyAgICAgICAgY2hlY2tzdW0gXj0gKnB0cisrOworI3VuZGVmIHB0cgorICAgcmV0dXJuIGNoZWNrc3VtOworfQorCitzdGF0aWMgVUlOVDE2ICAgX19nZW5lcmljQ2hlY2tTdW0oIFVJTlQxNiogcHRyLCBpbnQgc2l6ZSApCit7CisgICBVSU5UMTYJY2hlY2tzdW0gPSAwOworICAgdW5zaWduZWQJaTsKKworICAgZm9yKCBpID0gMCwgc2l6ZSA+Pj0gMTsgaSA8IHNpemU7IGkrKyApIGNoZWNrc3VtIF49ICpwdHIrKzsKKyAgIHJldHVybiBjaGVja3N1bTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMRkQgcGFyc2UvY29tcG9zZSByb3V0aW5lcworICovCitzdGF0aWMgY2hhciogTEZEX0FkdmFuY2UoTFBTVFIgbHBGb250LCBVSU5UMTYgdVBhcm1zTm8pCit7CisgIGludCAJaiA9IDA7CisgIGNoYXIqCWxwY2ggPSBscEZvbnQ7CisKKyAgZm9yKCA7IGogPCB1UGFybXNObyAmJiAqbHBjaDsgbHBjaCsrICkgaWYoICpscGNoID09IExGRFNlcGFyYXRvclsxXSApIGorKzsKKyAgcmV0dXJuIGxwY2g7Cit9CisKK3N0YXRpYyB2b2lkIExGRF9HZXRXZWlnaHQoIGZvbnRJbmZvKiBmaSwgTFBTVFIgbHBTdHIsIGludCBqKQoreworICBpZiggaiA9PSAxICYmICpscFN0ciA9PSAnMCcgKQorICAgICAgZmktPmZpX2ZsYWdzIHw9IEZJX1BPTFlXRUlHSFQ7CisgIGVsc2UgaWYoIGogPT0gNCApCisgICAgICAgeworICAgICAgICAgaWYoICFsc3RybmNtcGkzMkEoICJib2xkIiwgbHBTdHIsIDQpICkKKyAgICAgICAgICAgZmktPmRmLmRmV2VpZ2h0ID0gRldfQk9MRDsgCisJIGVsc2UgaWYoICFsc3RybmNtcGkzMkEoICJkZW1pIiwgbHBTdHIsIDQpICkKKwkgeworCSAgIGZpLT5maV9mbGFncyB8PSBGSV9GV19ERU1JOworCSAgIGZpLT5kZi5kZldlaWdodCA9IEZXX0RFTUlCT0xEOworCSB9CisJIGVsc2UgaWYoICFsc3RybmNtcGkzMkEoICJib29rIiwgbHBTdHIsIDQpICkKKwkgeworCSAgIGZpLT5maV9mbGFncyB8PSBGSV9GV19CT09LOworCSAgIGZpLT5kZi5kZldlaWdodCA9IEZXX1JFR1VMQVI7CisJIH0KKyAgICAgICB9CisgIGVsc2UgaWYoIGogPT0gNSApCisgICAgICAgeworICAgICAgICAgaWYoICFsc3RybmNtcGkzMkEoICJsaWdodCIsIGxwU3RyLCA1KSApCisJICAgZmktPmRmLmRmV2VpZ2h0ID0gRldfTElHSFQ7CisgICAgICAgICBlbHNlIGlmKCAhbHN0cm5jbXBpMzJBKCAiYmxhY2siLCBscFN0ciwgNSkgKQorCSAgIGZpLT5kZi5kZldlaWdodCA9IEZXX0JMQUNLOworICAgICAgIH0KKyAgZWxzZSBpZiggaiA9PSA2ICYmICFsc3RybmNtcGkzMkEoICJtZWRpdW0iLCBscFN0ciwgNikgKQorICAgICAgZmktPmRmLmRmV2VpZ2h0ID0gRldfUkVHVUxBUjsgCisgIGVsc2UgaWYoIGogPT0gOCAmJiAhbHN0cm5jbXBpMzJBKCAiZGVtaWJvbGQiLCBscFN0ciwgOCkgKQorICAgICAgZmktPmRmLmRmV2VpZ2h0ID0gRldfREVNSUJPTEQ7IAorICBlbHNlCisgICAgICBmaS0+ZGYuZGZXZWlnaHQgPSBGV19ET05UQ0FSRTsgLyogRklYTUU6IHRyeSB0byBnZXQgc29tZXRoaW5nCisJCQkJICAgICAgKiBmcm9tIHRoZSB3ZWlnaHQgcHJvcGVydHkgKi8KK30KKworc3RhdGljIGludCBMRkRfR2V0U2xhbnQoIGZvbnRJbmZvKiBmaSwgTFBTVFIgbHBTdHIsIGludCBsKQoreworICAgIGlmKCBsID09IDEgKQorICAgIHsKKwlzd2l0Y2goIHRvbG93ZXIoICpscFN0ciApICkKKwl7CisJICAgIGNhc2UgJzAnOiAgZmktPmZpX2ZsYWdzIHw9IEZJX1BPTFlTTEFOVDsJLyogaGF2ZW4ndCBzZWVuIHRoaXMgb25lIHlldCAqLworCSAgICBkZWZhdWx0OgorCSAgICBjYXNlICdyJzogIGZpLT5kZi5kZkl0YWxpYyA9IDA7CisJCSAgICAgICBicmVhazsKKwkgICAgY2FzZSAnbyc6CisJCSAgICAgICBmaS0+ZmlfZmxhZ3MgfD0gRklfT0JMSVFVRTsKKwkgICAgY2FzZSAnaSc6ICBmaS0+ZGYuZGZJdGFsaWMgPSAxOworCQkgICAgICAgYnJlYWs7CisJfQorCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMRkRfSW5pdEZvbnRJbmZvCisgKgorICogRmlsbCBpbiBzb21lIGZpZWxkcyBpbiB0aGUgZm9udEluZm8gc3RydWN0LgorICovCitzdGF0aWMgaW50IExGRF9Jbml0Rm9udEluZm8oIGZvbnRJbmZvKiBmaSwgTFBTVFIgbHBzdHIgKQoreworICAgTFBTVFIJbHBjaDsKKyAgIGludCAgICAJaSwgaiwgZGVjX3N0eWxlX2NoZWNrLCBzY2FsYWJpbGl0eTsKKyAgIFVJTlQxNiAJdG1wWzNdOworCisgICBtZW1zZXQoZmksIDAsIHNpemVvZihmb250SW5mbykgKTsKKworLyogd2VpZ2h0IG5hbWUgLSAqLworICAgbHBjaCA9IExGRF9BZHZhbmNlKCBscHN0ciwgMSk7CisgICBpZiggISpscGNoICkgcmV0dXJuIEZBTFNFOworICAgaiA9IGxwY2ggLSBscHN0ciAtIDE7CisgICBMRkRfR2V0V2VpZ2h0KCBmaSwgbHBzdHIsIGogKTsKKworLyogc2xhbnQgLSAqLworICAgbHBjaCA9IExGRF9BZHZhbmNlKCBscHN0ciA9IGxwY2gsIDEpOworICAgaWYoICEqbHBjaCApIHJldHVybiBGQUxTRTsKKyAgIGogPSBscGNoIC0gbHBzdHIgLSAxOworICAgZGVjX3N0eWxlX2NoZWNrID0gTEZEX0dldFNsYW50KCBmaSwgbHBzdHIsIGogKTsKKworLyogd2lkdGggbmFtZSAtICovCisgICBscGNoID0gTEZEX0FkdmFuY2UoIGxwc3RyID0gbHBjaCwgMSk7CisgICBpZiggISpscGNoICkgcmV0dXJuIEZBTFNFOworICAgaWYoIGxzdHJuY21waTMyQSggIm5vcm1hbCIsIGxwc3RyLCA2KSApCS8qIFhYWCAnbmFycm93JywgJ2NvbmRlbnNlZCcsIGV0Yy4uLiAqLworICAgICAgIGRlY19zdHlsZV9jaGVjayA9IFRSVUU7CisgICBlbHNlCisgICAgICAgZmktPmZpX2ZsYWdzIHw9IEZJX05PUk1BTDsKKworLyogc3R5bGUgLSAqLworICAgbHBjaCA9IExGRF9BZHZhbmNlKCBscHN0ciA9IGxwY2gsIDEpOworICAgaWYoICEqbHBjaCApIHJldHVybiBGQUxTRTsKKyAgIGogPSBscGNoIC0gbHBzdHIgLSAxOworICAgaWYoIGogPiAzICkJLyogZmluZCBvdXQgaXMgdGhlcmUgInNhbnMiIG9yICJzY3JpcHQiICovCisgICB7CisJaiA9IDA7CisJKihscGNoIC0gMSkgPSAnXDAnOworCisJaWYoIHN0cnN0cihscHN0ciwgInNhbnMiKSApIAorCXsgCisJICAgIGZpLT5kZi5kZlBpdGNoQW5kRmFtaWx5IHw9IEZGX1NXSVNTOyAKKwkgICAgaiA9IDE7IAorCX0KKwlpZiggc3Ryc3RyKGxwc3RyLCAic2NyaXB0IikgKSAKKwl7IAorCSAgICBmaS0+ZGYuZGZQaXRjaEFuZEZhbWlseSB8PSBGRl9TQ1JJUFQ7IAorCSAgICBqID0gMTsgCisJfQorCWlmKCAhaiAmJiBkZWNfc3R5bGVfY2hlY2sgKSAKKwkgICAgZmktPmRmLmRmUGl0Y2hBbmRGYW1pbHkgfD0gRkZfREVDT1JBVElWRTsKKwkqKGxwY2ggLSAxKSA9IExGRFNlcGFyYXRvclsxXTsKKyAgIH0KKworLyogcGl4ZWwgaGVpZ2h0LCBkZWNpcG9pbnQgaGVpZ2h0LCBhbmQgcmVzX3ggKi8KKworICAgZm9yKCBpID0gc2NhbGFiaWxpdHkgPSAwOyBpIDwgMzsgaSsrICkKKyAgIHsKKyAgICAgbHBjaCA9IExGRF9BZHZhbmNlKCBscHN0ciA9IGxwY2gsIDEpOworICAgICBpZiggISpscGNoICkgcmV0dXJuIEZBTFNFOworICAgICBpZiggbHBjaCAtIGxwc3RyID09IDEgfHwgbHBjaCAtIGxwc3RyID4gNCApIHJldHVybiBGQUxTRTsgLyogcmlkaWN1bG91cyAqLworCisgICAgKihscGNoIC0gMSkgPSAnXDAnOworICAgICBpZiggISh0bXBbaV0gPSBhdG9pKGxwc3RyKSkgKSBzY2FsYWJpbGl0eSsrOworICAgICoobHBjaCAtIDEpID0gTEZEU2VwYXJhdG9yWzFdOworICAgfQorICAgaWYoIHNjYWxhYmlsaXR5ID09IDMgKSAJLyogVHlwZTEgKi8KKyAgIHsKKyAgICAgZmktPmZpX2ZsYWdzIHw9IEZJX1NDQUxBQkxFOworICAgICBmaS0+bGZkX2hlaWdodCA9IERFRl9TQ0FMQUJMRV9IRUlHSFQ7IGZpLT5sZmRfZGVjaXBvaW50cyA9IERFRl9TQ0FMQUJMRV9EUDsKKyAgICAgZmktPmxmZF9yZXNvbHV0aW9uID0gRGVmUmVzb2x1dGlvbjsKKyAgIH0KKyAgIGVsc2UgaWYoIHNjYWxhYmlsaXR5ID09IDAgKQkvKiBCaXRtYXAgKi8KKyAgIHsKKyAgICAgZmktPmxmZF9oZWlnaHQgPSB0bXBbMF07IGZpLT5sZmRfZGVjaXBvaW50cyA9IHRtcFsxXTsgCisgICAgIGZpLT5sZmRfcmVzb2x1dGlvbiA9IHRtcFsyXTsKKyAgIH0KKyAgIGVsc2UgcmV0dXJuIEZBTFNFOyAvKiAjJCVeISEhIFgxMVI2IG11dGFudCBnYXJiYWdlICovCisKKy8qIHJlc195IC0gc2tpcCwgc3BhY2luZyAtICovCisgICBscHN0ciA9IExGRF9BZHZhbmNlKCBscGNoLCAxKTsKKyAgIHN3aXRjaCggKmxwc3RyICkKKyAgIHsKKyAgICAgY2FzZSAnXDAnOiByZXR1cm4gRkFMU0U7CisKKyAgICAgY2FzZSAncCc6IGZpLT5maV9mbGFncyB8PSBGSV9WQVJJQUJMRVBJVENIOworCSAgICAgICBicmVhazsKKyAgICAgY2FzZSAnYyc6IGZpLT5kZi5kZlBpdGNoQW5kRmFtaWx5IHw9IEZGX01PREVSTjsKKwkgICAgICAgZmktPmZpX2ZsYWdzIHw9IEZJX0ZJWEVERVg7CisJICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICBjYXNlICdtJzogZmktPmZpX2ZsYWdzIHw9IEZJX0ZJWEVEUElUQ0g7CisJICAgICAgIGJyZWFrOworICAgICBkZWZhdWx0OgorCSAgICAgICBmaS0+ZGYuZGZQaXRjaEFuZEZhbWlseSB8PSBERUZBVUxUX1BJVENIIHwgRkZfRE9OVENBUkU7CisgICB9CisgICBscHN0ciA9IExGRF9BZHZhbmNlKGxwc3RyLCAxKTsKKyAgIGlmKCAhKmxwc3RyICkgcmV0dXJuIEZBTFNFOworCisvKiBhdmVyYWdlIHdpZHRoIC0gKi8KKyAgIGxwY2ggPSBMRkRfQWR2YW5jZSggbHBzdHIsIDEpOworICAgaWYoICEqbHBjaCApIHJldHVybiBGQUxTRTsKKyAgIGlmKCBscGNoIC0gbHBzdHIgPT0gMSB8fCBscGNoIC0gbHBzdHIgPiA0ICkgcmV0dXJuIEZBTFNFOyAvKiByaWRpY3Vsb3VzICovCisgICoobHBjaCAtIDEpID0gJ1wwJzsgCisgICBpZiggIShmaS0+bGZkX3dpZHRoID0gYXRvaShscHN0cikpICYmICFzY2FsYWJpbGl0eSApIHJldHVybiBGQUxTRTsKKyAgKihscGNoIC0gMSkgPSBMRkRTZXBhcmF0b3JbMV07CisKKy8qIGNoYXJzZXQgcmVnaXN0cnksIGNoYXJzZXQgZW5jb2RpbmcgLSAqLworICAgaWYoIHN0cnN0cihscGNoLCAiamlzeCIpIHx8IHN0cnN0cihscGNoLCAia3NjIikgKSByZXR1cm4gRkFMU0U7CS8qIDItYnl0ZSBzdHVmZiAqLworCisgICBpZiggc3Ryc3RyKGxwY2gsIGlzbzg4NTlFbmNvZGluZykgKQorICAgeworICAgICBmaS0+ZmlfZmxhZ3MgfD0gRklfRU5DX0lTTzg4NTk7CisgICAgIGZpLT5kZi5kZkNoYXJTZXQgPSBBTlNJX0NIQVJTRVQ7CisgICB9CisgICBlbHNlIGlmKCBzdHJzdHIobHBjaCwgaXNvNjQ2RW5jb2RpbmcpICkKKyAgIHsKKyAgICAgZmktPmZpX2ZsYWdzIHw9IEZJX0VOQ19JU082NDY7CisgICAgIGZpLT5kZi5kZkNoYXJTZXQgPSBBTlNJX0NIQVJTRVQ7CisgICB9CisgICBlbHNlIGlmKCBzdHJzdHIobHBjaCwgYW5zaUVuY29kaW5nKSApCS8qIGZvbnQyYmRmIHByb2R1Y2VzIC1hbnNpLTAgTEZEICovCisgICB7CisgICAgIGZpLT5maV9mbGFncyB8PSBGSV9FTkNfQU5TSTsKKyAgICAgZmktPmRmLmRmQ2hhclNldCA9IEFOU0lfQ0hBUlNFVDsKKyAgIH0KKyAgIGVsc2UgaWYoIHN0cnN0cihscGNoLCAiZm9udHNwZWNpZmljIikgKQorICAgICBmaS0+ZGYuZGZDaGFyU2V0ID0gU1lNQk9MX0NIQVJTRVQ7CisgICBlbHNlCisgICAgIGZpLT5kZi5kZkNoYXJTZXQgPSBPRU1fQ0hBUlNFVDsJCS8qIEZJWE1FOiAtY3AxMjYtLi4gZnJvbSBmbnQyYmRmICovCisgICAKKyAgIHJldHVybiBUUlVFOwkJCQkJCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTEZEX0NvbXBvc2VMRkQKKyAqLworc3RhdGljIEJPT0wzMiAgTEZEX0NvbXBvc2VMRkQoIGZvbnRPYmplY3QqIGZvLCAKKwkJCSAgICAgICBJTlQzMiBoZWlnaHQsIExQU1RSIGxwTEZELCBVSU5UMzIgdVJlbGF4ICkKK3sKKyAgIGludAkJaCwgdywgY2gsIHBvaW50ID0gMDsKKyAgIGNoYXIqCWxwY2g7IAorICAgY29uc3QgY2hhciogIGxwRW5jb2RpbmcgPSBOVUxMOworCisgICBsc3RyY3B5MzJBKCBscExGRCwgZm8tPmZyLT5yZXNvdXJjZSApOworCisvKiBhZGQgd2VpZ2h0ICovCisgICBzd2l0Y2goIGZvLT5maS0+ZGYuZGZXZWlnaHQgKQorICAgeworCWNhc2UgRldfQk9MRDoKKwkJc3RyY2F0KCBscExGRCwgImJvbGQiICk7IGJyZWFrOworCWNhc2UgRldfUkVHVUxBUjoKKwkJaWYoIGZvLT5maS0+ZmlfZmxhZ3MgJiBGSV9GV19CT09LICkKKwkJICAgIHN0cmNhdCggbHBMRkQsICJib29rIiApOworCQllbHNlCisJCSAgICBzdHJjYXQoIGxwTEZELCAibWVkaXVtIiApOworCQlicmVhazsKKwljYXNlIEZXX0RFTUlCT0xEOgorCQlzdHJjYXQoIGxwTEZELCAiZGVtaSIgKTsKKwkJaWYoICEoIGZvLT5maS0+ZmlfZmxhZ3MgJiBGSV9GV19ERU1JKSApCisJCSAgICAgc3RyY2F0ICggbHBMRkQsICJib2xkIiApOworCQlicmVhazsKKwljYXNlIEZXX0JMQUNLOgorCQlzdHJjYXQoIGxwTEZELCAiYmxhY2siICk7IGJyZWFrOworCWNhc2UgRldfTElHSFQ6CisJCXN0cmNhdCggbHBMRkQsICJsaWdodCIgKTsgYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RyY2F0KCBscExGRCwgIioiICk7CisgICB9CisKKy8qIGFkZCBzbGFudCAqLworICAgaWYoIGZvLT5maS0+ZGYuZGZJdGFsaWMgKQorICAgICAgIGlmKCBmby0+ZmktPmZpX2ZsYWdzICYgRklfT0JMSVFVRSApCisJICAgc3RyY2F0KCBscExGRCwgIi1vIiApOworICAgICAgIGVsc2UKKwkgICBzdHJjYXQoIGxwTEZELCAiLWkiICk7CisgICBlbHNlIAorICAgICAgIHN0cmNhdCggbHBMRkQsICh1UmVsYXggPCA0KSA/ICItciIgOiAiLSoiICk7CisKKy8qIGFkZCB3aWR0aCBzdHlsZSBhbmQgc2tpcCBzZXJpZnMgKi8KKyAgIGlmKCBmby0+ZmktPmZpX2ZsYWdzICYgRklfTk9STUFMICkKKyAgICAgICBzdHJjYXQoIGxwTEZELCAiLW5vcm1hbC0qLSIpOworICAgZWxzZQorICAgICAgIHN0cmNhdCggbHBMRkQsICItKi0qLSIgKTsKKworLyogYWRkIHBpeGVsaGVpZ2h0LCBwb2ludGhlaWdodCwgYW5kIHJlc29sdXRpb24gCisgKgorICogRklYTUU6IGZpbGwgaW4gbHBYRm9ybSBhbmQgbHBQaXhtYXAgZm9yIHJvdGF0ZWQgZm9udHMKKyAqLworICAgaWYoIGZvLT5mb19mbGFncyAmIEZPX1NZTlRIX0hFSUdIVCApIGggPSBmby0+ZmktPmxmZF9oZWlnaHQ7CisgICBlbHNlIGggPSAoZm8tPmZpLT5sZmRfaGVpZ2h0ICogaGVpZ2h0KSAvIGZvLT5maS0+ZGYuZGZQaXhIZWlnaHQ7CisKKyAgIGlmKCBmby0+bGYubGZXaWR0aCAmJiAoWFRleHRDYXBzICYgVENfU0ZfWF9ZSU5ERVApIAorCSAgICAgICAgICAgICAgJiYgIShmby0+Zm9fZmxhZ3MgJiBGT19TWU5USF9XSURUSCkgKQorICAgICAgIHBvaW50ID0gKGZvLT5maS0+bGZkX2RlY2lwb2ludHMgKiBmby0+bGYubGZXaWR0aCkgLyBmby0+ZmktPmRmLmRmQXZnV2lkdGg7CisKKy8qIHNwYWNpbmcgYW5kIHdpZHRoICovCisKKyAgIGlmKCBmby0+ZmktPmZpX2ZsYWdzICYgRklfRklYRURQSVRDSCApIAorICAgICAgIHcgPSAoIGZvLT5maS0+ZmlfZmxhZ3MgJiBGSV9GSVhFREVYICkgPyAnYycgOiAnbSc7CisgICBlbHNlIAorICAgICAgIHcgPSAoIGZvLT5maS0+ZmlfZmxhZ3MgJiBGSV9WQVJJQUJMRVBJVENIICkgPyAncCcgOiBMRkRTZXBhcmF0b3JbMF07IAorCisvKiBlbmNvZGluZywgbm90IHF1aXRlIHRoZXJlIHlldCAqLworCisgICBpZiggZm8tPmZpLT5kZi5kZkNoYXJTZXQgPT0gQU5TSV9DSEFSU0VUICkKKyAgIHsKKwlpZiggZm8tPmZpLT5maV9mbGFncyAmIEZJX0VOQ19JU084ODU5ICkKKwkgICAgIGxwRW5jb2RpbmcgPSBpc284ODU5RW5jb2Rpbmc7CisJZWxzZSBpZiggZm8tPmZpLT5maV9mbGFncyAmIEZJX0VOQ19JU082NDYgKQorCSAgICAgbHBFbmNvZGluZyA9IGlzbzY0NkVuY29kaW5nOworCWVsc2UgbHBFbmNvZGluZyA9IGFuc2lFbmNvZGluZzsKKyAgIH0gZWxzZSAgICBscEVuY29kaW5nID0gTEZEU2VwYXJhdG9yOworCisgICBscGNoID0gbHBMRkQgKyBsc3RybGVuMzJBKGxwTEZEKTsKKyAgIGNoID0gKGZvLT5maS0+ZmlfZmxhZ3MgJiBGSV9TQ0FMQUJMRSkgPyAnMCcgOiBMRkRTZXBhcmF0b3JbMF07CisKKyAgIHN3aXRjaCggdVJlbGF4ICkKKyAgIHsKKyAgICAgICAvKiBSZWFsaXplRm9udCgpIHdpbGwgY2FsbCB1cyByZXBlYXRlZGx5IHdpdGggaW5jcmVhc2luZyB1UmVsYXggCisJKiB1bnRpbCBYTG9hZEZvbnQoKSBzdWNjZWVkcy4gKi8KKworICAgICAgIGNhc2UgMDogCisJICAgIGlmKCBwb2ludCApCisJICAgIHsKKwkgICAgICAgIHNwcmludGYoIGxwY2gsICIlaS0laS0laS0lYy0lYy0qLSVzKiIsIGgsIHBvaW50LCAKKwkJCSBmby0+ZmktPmxmZF9yZXNvbHV0aW9uLCBjaCwgdywgbHBFbmNvZGluZyApOworCSAgICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgLyogZmFsbCB0aHJvdWdoICovCisKKyAgICAgICBjYXNlIDE6IAorCSAgICBzcHJpbnRmKCBscGNoLCAiJWktKi0laS0lYy0lYy0qLSVzKiIsIGgsIAorCQkJZm8tPmZpLT5sZmRfcmVzb2x1dGlvbiwgY2gsIHcsIGxwRW5jb2RpbmcgKTsKKwkgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIDI6CisJICAgIHNwcmludGYoIGxwY2gsICIlaS0qLSVpLSVjLSotKi0lcyoiLAorCQkJaCwgZm8tPmZpLT5sZmRfcmVzb2x1dGlvbiwgY2gsIGxwRW5jb2RpbmcgKTsKKwkgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIDM6CisJICAgIHNwcmludGYoIGxwY2gsICIlaS0qLSVpLSVjLSotKi0lcyoiLCBmby0+ZmktPmxmZF9oZWlnaHQsCisJCQlmby0+ZmktPmxmZF9yZXNvbHV0aW9uLCBjaCwgbHBFbmNvZGluZyApOworCSAgICBicmVhazsKKworICAgICAgIGRlZmF1bHQ6CisJICAgIHNwcmludGYoIGxwY2gsICIlaS0qLSotKi0qLSotJXMqIiwgZm8tPmZpLT5sZmRfaGVpZ2h0LCBscEVuY29kaW5nICk7CisgICB9CisKKyAgIGRwcmludGZfZm9udChzdGRkZWIsIlx0TEZEOiAlc1xuIiwgbHBMRkQgKTsKKyAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVggRm9udCBSZXNvdXJjZXMKKyAqCisgKiBmb250IGluZm8JCS0gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2tiL2FydGljbGVzL3E2NS8xLzIzLmh0bQorICogV2luZG93cyBmb250IG1ldHJpY3MJLSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20va2IvYXJ0aWNsZXMvcTMyLzYvNjcuaHRtCisgKi8KK3N0YXRpYyBCT09MMzIgWEZPTlRfR2V0TGVhZGluZyggTFBJRk9OVElORk8xNiBwRkksIFhGb250U3RydWN0KiB4X2ZzLCBJTlQzMiogcElMLCBJTlQzMiogcEVMICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGhlaWdodDsKKyAgICB1bnNpZ25lZCBtaW4gPSAodW5zaWduZWQgY2hhcilwRkktPmRmRmlyc3RDaGFyOworICAgIHVuc2lnbmVkIG1heCA9ICh1bnNpZ25lZCBjaGFyKXBGSS0+ZGZMYXN0Q2hhcjsKKyAgICBCT09MMzIgYkhhdmVDYXBIZWlnaHQgPSAocEZJLT5kZkNoYXJTZXQgPT0gQU5TSV9DSEFSU0VUICYmICdYJyA+PSBtaW4gJiYgJ1gnIDw9IG1heCApOworCisgICAgaWYoIHBFTCApICpwRUwgPSAwOworICAgIGlmKCBYR2V0Rm9udFByb3BlcnR5KHhfZnMsIFhBX0NBUF9IRUlHSFQsICZoZWlnaHQpID09IEZhbHNlICkKKyAgICB7CisJaWYoIHhfZnMtPnBlcl9jaGFyICkKKwkgICAgaWYoIGJIYXZlQ2FwSGVpZ2h0ICkKKwkJaGVpZ2h0ID0geF9mcy0+cGVyX2NoYXJbJ1gnIC0gbWluXS5hc2NlbnQ7CisJICAgIGVsc2UKKwkJaWYgKHhfZnMtPmFzY2VudCA+PSB4X2ZzLT5tYXhfYm91bmRzLmFzY2VudCkKKwkJICAgIGhlaWdodCA9IHhfZnMtPm1heF9ib3VuZHMuYXNjZW50OworCQllbHNlCisJCXsKKwkJICAgIGhlaWdodCA9IHhfZnMtPmFzY2VudDsKKwkJICAgIGlmKCBwRUwgKQorCQkJKnBFTCA9IHhfZnMtPm1heF9ib3VuZHMuYXNjZW50IC0gaGVpZ2h0OworCQl9CisJZWxzZSAKKwkgICAgaGVpZ2h0ID0geF9mcy0+bWluX2JvdW5kcy5hc2NlbnQ7CisgICAgfQorCisgICAqcElMID0geF9mcy0+YXNjZW50IC0gaGVpZ2h0OworICAgIHJldHVybiAoYkhhdmVDYXBIZWlnaHQgJiYgeF9mcy0+cGVyX2NoYXIpOworfQorCitzdGF0aWMgSU5UMzIgWEZPTlRfR2V0QXZnQ2hhcldpZHRoKCBMUElGT05USU5GTzE2IHBGSSwgWEZvbnRTdHJ1Y3QqIHhfZnMpCit7CisgICAgdW5zaWduZWQgbWluID0gKHVuc2lnbmVkIGNoYXIpcEZJLT5kZkZpcnN0Q2hhcjsKKyAgICB1bnNpZ25lZCBtYXggPSAodW5zaWduZWQgY2hhcilwRkktPmRmTGFzdENoYXI7CisKKyAgICBpZiggeF9mcy0+cGVyX2NoYXIgKQorICAgIHsKKwlpbnQgIHdpZHRoLCBjaGFycywgajsKKwlmb3IoIGogPSAwLCB3aWR0aCA9IDAsIGNoYXJzID0gMCwgbWF4IC09IG1pbjsgaiA8PSBtYXg7IGorKyApCisgICAgICAgICAgICBpZiggIUNJX05PTkVYSVNUQ0hBUih4X2ZzLT5wZXJfY2hhciArIGopICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aWR0aCArPSB4X2ZzLT5wZXJfY2hhcltqXS53aWR0aDsKKyAgICAgICAgICAgICAgICBjaGFycysrOworICAgICAgICAgICAgfQorCXJldHVybiAod2lkdGggLyBjaGFycyk7CisgICAgfQorICAgIC8qIHVuaWZvcm0gd2lkdGggKi8KKyAgICByZXR1cm4geF9mcy0+bWluX2JvdW5kcy53aWR0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgWEZPTlRfU2V0Rm9udE1ldHJpYworICoKKyAqIEluaXRpYWxpemVzIElGT05USU5GTzE2LiBkZkhvcml6UmVzIGFuZCBkZlZlcnRSZXMgbXVzdCBiZSBhbHJlYWR5IHNldC4KKyAqLworc3RhdGljIHZvaWQgWEZPTlRfU2V0Rm9udE1ldHJpYyhmb250SW5mbyogZmksIGZvbnRSZXNvdXJjZSogZnIsIFhGb250U3RydWN0KiB4ZnMpCit7CisgICAgdW5zaWduZWQJIG1pbiwgbWF4OworICAgIElOVDMyCSBlbCwgaWw7CisKKyAgICBmaS0+ZGYuZGZGaXJzdENoYXIgPSAoQllURSkobWluID0geGZzLT5taW5fY2hhcl9vcl9ieXRlMik7CisgICAgZmktPmRmLmRmTGFzdENoYXIgPSAoQllURSkobWF4ID0geGZzLT5tYXhfY2hhcl9vcl9ieXRlMik7CisKKyAgICBmaS0+ZGYuZGZEZWZhdWx0Q2hhciA9IChCWVRFKXhmcy0+ZGVmYXVsdF9jaGFyOworICAgIGZpLT5kZi5kZkJyZWFrQ2hhciA9IChCWVRFKSgoICcgJyA8IG1pbiB8fCAnICcgPiBtYXgpID8geGZzLT5kZWZhdWx0X2NoYXI6ICcgJyk7CisKKyAgICBmaS0+ZGYuZGZQaXhIZWlnaHQgPSAoSU5UMTYpKChmaS0+ZGYuZGZBc2NlbnQgPSAoSU5UMTYpeGZzLT5hc2NlbnQpICsgeGZzLT5kZXNjZW50KTsKKyAgICBmaS0+ZGYuZGZQaXhXaWR0aCA9ICh4ZnMtPnBlcl9jaGFyKSA/IDAgOiB4ZnMtPm1pbl9ib3VuZHMud2lkdGg7CisgICAgZmktPmRmLmRmTWF4V2lkdGggPSAoSU5UMTYpYWJzKHhmcy0+bWF4X2JvdW5kcy53aWR0aCk7CisKKyAgICBpZiggWEZPTlRfR2V0TGVhZGluZyggJmZpLT5kZiwgeGZzLCAmaWwsICZlbCApICkKKyAgICAgICAgZmktPmRmLmRmQXZnV2lkdGggPSAoSU5UMTYpeGZzLT5wZXJfY2hhclsnWCcgLSBtaW5dLndpZHRoOworICAgIGVsc2UKKyAgICAgICAgZmktPmRmLmRmQXZnV2lkdGggPSAoSU5UMTYpWEZPTlRfR2V0QXZnQ2hhcldpZHRoKCAmZmktPmRmLCB4ZnMpOworCisgICAgZmktPmRmLmRmSW50ZXJuYWxMZWFkaW5nID0gKElOVDE2KWlsOworICAgIGZpLT5kZi5kZkV4dGVybmFsTGVhZGluZyA9IChJTlQxNillbDsKKworICAgIGZpLT5kZi5kZlBvaW50cyA9IChJTlQxNikoKChJTlQzMikoZmktPmRmLmRmUGl4SGVpZ2h0IC0gCisJCQkJICAgICAgIGZpLT5kZi5kZkludGVybmFsTGVhZGluZykgKiA3MikgLyBmaS0+ZGYuZGZWZXJ0UmVzKTsKKworICAgIGlmKCB4ZnMtPm1pbl9ib3VuZHMud2lkdGggIT0geGZzLT5tYXhfYm91bmRzLndpZHRoICkKKyAgICAgICAgZmktPmRmLmRmUGl0Y2hBbmRGYW1pbHkgfD0gVE1QRl9GSVhFRF9QSVRDSDsgLyogYXUgY29udHJhaXJlISAqLworICAgIGlmKCBmaS0+ZmlfZmxhZ3MgJiBGSV9TQ0FMQUJMRSApIAorICAgIHsKKwlmaS0+ZGYuZGZUeXBlID0gREVWSUNFX0ZPTlRUWVBFOworICAgICAgICBmaS0+ZGYuZGZQaXRjaEFuZEZhbWlseSB8PSBUTVBGX0RFVklDRTsKKyAgICB9IAorICAgIGVsc2UgaWYoIGZpLT5maV9mbGFncyAmIEZJX1RSVUVUWVBFICkKKwlmaS0+ZGYuZGZUeXBlID0gVFJVRVRZUEVfRk9OVFRZUEU7CisgICAgZWxzZQorCWZpLT5kZi5kZlR5cGUgPSBSQVNURVJfRk9OVFRZUEU7CisKKyAgICBmaS0+ZGYuZGZGYWNlID0gZnItPmxmRmFjZU5hbWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIFhGT05UX0dldFRleHRNZXRyaWMKKyAqLworc3RhdGljIHZvaWQgWEZPTlRfR2V0VGV4dE1ldHJpYyggZm9udE9iamVjdCogcGZvLCBMUFRFWFRNRVRSSUMzMkEgcFRNICkKK3sKKyAgICBMUElGT05USU5GTzE2IHBkZiA9ICZwZm8tPmZpLT5kZjsKKworICAgIHBUTS0+dG1Bc2NlbnQgPSBwZm8tPmZzLT5hc2NlbnQ7CisgICAgcFRNLT50bURlc2NlbnQgPSBwZm8tPmZzLT5kZXNjZW50OworICAgIHBUTS0+dG1IZWlnaHQgPSBwVE0tPnRtQXNjZW50ICsgcFRNLT50bURlc2NlbnQ7CisKKyAgICBwVE0tPnRtQXZlQ2hhcldpZHRoID0gcGZvLT5mb0F2Z0NoYXJXaWR0aDsKKyAgICBwVE0tPnRtTWF4Q2hhcldpZHRoID0gYWJzKHBmby0+ZnMtPm1heF9ib3VuZHMud2lkdGgpOworCisgICAgcFRNLT50bUludGVybmFsTGVhZGluZyA9IHBmby0+Zm9JbnRlcm5hbExlYWRpbmc7CisgICAgcFRNLT50bUV4dGVybmFsTGVhZGluZyA9IHBkZi0+ZGZFeHRlcm5hbExlYWRpbmc7CisKKyAgICBwVE0tPnRtU3RydWNrT3V0ID0gKHBmby0+Zm9fZmxhZ3MgJiBGT19TWU5USF9TVFJJS0VPVVQgKQorCQkJPyAxIDogcGRmLT5kZlN0cmlrZU91dDsKKyAgICBwVE0tPnRtVW5kZXJsaW5lZCA9IChwZm8tPmZvX2ZsYWdzICYgRk9fU1lOVEhfVU5ERVJMSU5FICkKKwkJCT8gMSA6IHBkZi0+ZGZVbmRlcmxpbmU7CisKKyAgICBwVE0tPnRtT3ZlcmhhbmcgPSAwOworICAgIGlmKCBwZm8tPmZvX2ZsYWdzICYgRk9fU1lOVEhfSVRBTElDICkgCisgICAgeworCXBUTS0+dG1PdmVyaGFuZyArPSBwVE0tPnRtSGVpZ2h0LzM7CisJcFRNLT50bUl0YWxpYyA9IDE7CisgICAgfSBlbHNlIAorCXBUTS0+dG1JdGFsaWMgPSBwZGYtPmRmSXRhbGljOworCisgICAgcFRNLT50bVdlaWdodCA9IHBkZi0+ZGZXZWlnaHQ7CisgICAgaWYoIHBmby0+Zm9fZmxhZ3MgJiBGT19TWU5USF9CT0xEICkgCisgICAgeworCXBUTS0+dG1PdmVyaGFuZysrOyAKKwlwVE0tPnRtV2VpZ2h0ICs9IDEwMDsKKyAgICB9IAorCisgICAgKihJTlQzMiopJnBUTS0+dG1GaXJzdENoYXIgPSAqKElOVDMyKikmcGRmLT5kZkZpcnN0Q2hhcjsKKworICAgIHBUTS0+dG1DaGFyU2V0ID0gcGRmLT5kZkNoYXJTZXQ7CisgICAgcFRNLT50bVBpdGNoQW5kRmFtaWx5ID0gcGRmLT5kZlBpdGNoQW5kRmFtaWx5OworICAgIHBUTS0+dG1EaWdpdGl6ZWRBc3BlY3RYID0gcGRmLT5kZkhvcml6UmVzOworICAgIHBUTS0+dG1EaWdpdGl6ZWRBc3BlY3RZID0gcGRmLT5kZlZlcnRSZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIFhGT05UX0dldEZvbnRNZXRyaWMKKyAqCisgKiBSZXRyaWV2ZSBmb250IG1ldHJpYyBpbmZvIChlbnVtZXJhdGlvbikuCisgKi8KK3N0YXRpYyBVSU5UMzIgWEZPTlRfR2V0Rm9udE1ldHJpYyggZm9udEluZm8qIHBmaSwgTFBFTlVNTE9HRk9OVEVYMTYgcExGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE5FV1RFWFRNRVRSSUMxNiBwVE0gKQoreworICAgIG1lbXNldCggcExGLCAwLCBzaXplb2YoKnBMRikgKTsKKyAgICBtZW1zZXQoIHBUTSwgMCwgc2l6ZW9mKCpwVE0pICk7CisKKyNkZWZpbmUgcGxmICgoTFBMT0dGT05UMTYpcExGKQorICAgIHBsZi0+bGZIZWlnaHQgICAgPSBwVE0tPnRtSGVpZ2h0ICAgICAgID0gcGZpLT5kZi5kZlBpeEhlaWdodDsKKyAgICBwbGYtPmxmV2lkdGggICAgID0gcFRNLT50bUF2ZUNoYXJXaWR0aCA9IHBmaS0+ZGYuZGZBdmdXaWR0aDsKKyAgICBwbGYtPmxmV2VpZ2h0ICAgID0gcFRNLT50bVdlaWdodCAgICAgICA9IHBmaS0+ZGYuZGZXZWlnaHQ7CisgICAgcGxmLT5sZkl0YWxpYyAgICA9IHBUTS0+dG1JdGFsaWMgICAgICAgPSBwZmktPmRmLmRmSXRhbGljOworICAgIHBsZi0+bGZVbmRlcmxpbmUgPSBwVE0tPnRtVW5kZXJsaW5lZCAgID0gcGZpLT5kZi5kZlVuZGVybGluZTsKKyAgICBwbGYtPmxmU3RyaWtlT3V0ID0gcFRNLT50bVN0cnVja091dCAgICA9IHBmaS0+ZGYuZGZTdHJpa2VPdXQ7CisgICAgcGxmLT5sZkNoYXJTZXQgICA9IHBUTS0+dG1DaGFyU2V0ICAgICAgPSBwZmktPmRmLmRmQ2hhclNldDsKKworICAgIC8qIGNvbnZlcnQgcGl0Y2ggdmFsdWVzICovCisKKyAgICBwVE0tPnRtUGl0Y2hBbmRGYW1pbHkgPSBwZmktPmRmLmRmUGl0Y2hBbmRGYW1pbHk7CisgICAgcGxmLT5sZlBpdGNoQW5kRmFtaWx5ID0gKHBmaS0+ZGYuZGZQaXRjaEFuZEZhbWlseSAmIDB4RjEpICsgMTsKKworICAgIGxzdHJjcHluMzJBKCBwbGYtPmxmRmFjZU5hbWUsIHBmaS0+ZGYuZGZGYWNlLCBMRl9GQUNFU0laRSApOworI3VuZGVmIHBsZgorCisgICAgcFRNLT50bUFzY2VudCA9IHBmaS0+ZGYuZGZBc2NlbnQ7CisgICAgcFRNLT50bURlc2NlbnQgPSBwVE0tPnRtSGVpZ2h0IC0gcFRNLT50bUFzY2VudDsKKyAgICBwVE0tPnRtSW50ZXJuYWxMZWFkaW5nID0gcGZpLT5kZi5kZkludGVybmFsTGVhZGluZzsKKyAgICBwVE0tPnRtTWF4Q2hhcldpZHRoID0gcGZpLT5kZi5kZk1heFdpZHRoOworICAgIHBUTS0+dG1EaWdpdGl6ZWRBc3BlY3RYID0gcGZpLT5kZi5kZkhvcml6UmVzOworICAgIHBUTS0+dG1EaWdpdGl6ZWRBc3BlY3RZID0gcGZpLT5kZi5kZlZlcnRSZXM7CisKKyAgICAqKElOVDMyKikmcFRNLT50bUZpcnN0Q2hhciA9ICooSU5UMzIqKSZwZmktPmRmLmRmRmlyc3RDaGFyOworCisgICAgLyogcmV0dXJuIGZvbnQgdHlwZSAqLworCisgICAgcmV0dXJuIHBmaS0+ZGYuZGZUeXBlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFhGT05UX0ZpeHVwRmxhZ3MKKyAqIAorICogZGZQaXRjaEFuZEZhbWlseSBmbGFncyBmb3Igc29tZSBjb21tb24gdHlwZWZhY2VzLgorICovCitzdGF0aWMgQllURSBYRk9OVF9GaXh1cEZsYWdzKCBMUENTVFIgbGZGYWNlTmFtZSApCit7CisgICBzd2l0Y2goIGxmRmFjZU5hbWVbMF0gKQorICAgeworICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgY2FzZSAnSCc6IGlmKCFsc3RyY21waTMyQShsZkZhY2VOYW1lLCAiSGVsdmV0aWNhIikgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkZfU1dJU1M7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYyc6CisgICAgICAgIGNhc2UgJ0MnOiBpZighbHN0cmNtcGkzMkEobGZGYWNlTmFtZSwgIkNvdXJpZXIiKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGRl9ST01BTjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgY2FzZSAnUCc6IGlmKCAhbHN0cmNtcGkzMkEobGZGYWNlTmFtZSwiUGFsYXRpbm8iKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGRl9ST01BTjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgY2FzZSAnVCc6IGlmKCFsc3RybmNtcGkzMkEobGZGYWNlTmFtZSwgIlRpbWVzIiwgNSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkZfUk9NQU47CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgIGNhc2UgJ1UnOiBpZighbHN0cmNtcGkzMkEobGZGYWNlTmFtZSwgIlV0b3BpYSIpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZGX1JPTUFOOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3onOgorICAgICAgICBjYXNlICdaJzogaWYoIWxzdHJjbXBpMzJBKGxmRmFjZU5hbWUsICJaYXBmIERpbmdiYXRzIikgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkZfREVDT1JBVElWRTsKKyAgIH0KKyAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFhGT05UX1dpbmRvd3NOYW1lcworICoKKyAqIEJ1aWxkIGdlbmVyaWMgV2luZG93cyBhbGlhc2VzIGZvciBYIGZvbnQgbmFtZXMuCisgKgorICogLW1pc2MtZml4ZWQtIC0+ICJGaXhlZCIKKyAqIC1zb255LWZpeGVkLSAtPiAiU29ueSBGaXhlZCIsIGV0Yy4uLgorICovCitzdGF0aWMgdm9pZCBYRk9OVF9XaW5kb3dzTmFtZXMoIGNoYXIqIGJ1ZmZlciApCit7CisgICAgZm9udFJlc291cmNlKiBmciwgKnBmcjsKKyAgICBjaGFyKiAJbHBzdHIsICpscGNoOworICAgIGludAkJaSwgdXA7CisgICAgQllURQliRmFtaWx5U3R5bGU7CisKKyAgICBmb3IoIGZyID0gZm9udExpc3Q7IGZyIDsgZnIgPSBmci0+bmV4dCApCisgICAgeworCWlmKCBmci0+ZnJfZmxhZ3MgJiBGUl9OQU1FU0VUICkgY29udGludWU7ICAgICAvKiBza2lwIGFscmVhZHkgYXNzaWduZWQgKi8KKworCWxwc3RyID0gTEZEX0FkdmFuY2UoZnItPnJlc291cmNlLCAyKTsKKwlpID0gbHBzdHIgLSBMRkRfQWR2YW5jZSggbHBzdHIsIDEgKTsKKworCWZvciggcGZyID0gZm9udExpc3Q7IHBmciAhPSBmciA7IHBmciA9IHBmci0+bmV4dCApCisJICAgIGlmKCBwZnItPmZyX2ZsYWdzICYgRlJfTkFNRVNFVCApCisJICAgIHsKKwkJbHBjaCA9IExGRF9BZHZhbmNlKHBmci0+cmVzb3VyY2UsIDIpOworCisJCS8qIGNoZWNrIGlmIGFscmVhZHkgaGF2ZSB0aGUgc2FtZSBmYWNlIG5hbWUgKi8KKworCQlpZiggIWxzdHJuY21wMzJBKGxwY2gsIGxwc3RyLCBpKSApIGJyZWFrOworCSAgICB9CisJaWYoIHBmciAhPSBmciApICAvKiBwcmVwZW5kIHZlbmRvciBuYW1lICovCisJICAgIGxwc3RyID0gZnItPnJlc291cmNlICsgMTsKKworCWZvciggaSA9IDAsIHVwID0gMSwgbHBjaCA9IGZyLT5sZkZhY2VOYW1lOyAqbHBzdHIgJiYgaSA8IDMyOworCQkJCQkgICAgICAgIGxwY2grKywgbHBzdHIrKywgaSsrICkKKwl7CisJICAgIGlmKCAqbHBzdHIgPT0gTEZEU2VwYXJhdG9yWzFdIHx8ICpscHN0ciA9PSAnICcgKSAKKwkgICAgeyAKKwkJKmxwY2ggPSAnICc7IAorCQl1cCA9IDE7IGNvbnRpbnVlOyAKKwkgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggaXNhbHBoYSgqbHBzdHIpICYmIHVwICkKKwkgICAgeyAKKwkJKmxwY2ggPSB0b3VwcGVyKCpscHN0cik7IAorCQl1cCA9IDA7IGNvbnRpbnVlOyAKKwkgICAgfQorCSAgICAqbHBjaCA9ICpscHN0cjsKKwl9CisJd2hpbGUgKCoobHBjaCAtIDEpID09ICcgJykgKigtLWxwY2gpID0gJ1wwJzsKKworCWlmKCAoYkZhbWlseVN0eWxlID0gWEZPTlRfRml4dXBGbGFncyggZnItPmxmRmFjZU5hbWUgKSkgKQorCXsKKwkgICAgZm9udEluZm8qIGZpOworCSAgICBmb3IoIGZpID0gZnItPmZpIDsgZmkgOyBmaSA9IGZpLT5uZXh0ICkKKwkJZmktPmRmLmRmUGl0Y2hBbmRGYW1pbHkgfD0gYkZhbWlseVN0eWxlOworCX0KKworI2lmZGVmIERFQlVHX0ZPTlRfSU5JVAorCWRwcmludGZfZm9udChzdGRkZWIsInR5cGVmYWNlIFwnJXNcJ1xuIiwgZnItPmxmRmFjZU5hbWUpOworI2VuZGlmCisJZnItPmZyX2ZsYWdzIHw9IEZSX05BTUVTRVQ7CisgICAgfQorCisgICAgaWYoIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggSU5JRm9udFNlY3Rpb24sIElOSURlZmF1bHQsICIiLCBidWZmZXIsIDEyOCApICkKKyAgICB7CisJd2hpbGUoICpidWZmZXIgJiYgaXNzcGFjZSgqYnVmZmVyKSApIGJ1ZmZlcisrOworCWZvciggZnIgPSBOVUxMLCBwZnIgPSBmb250TGlzdDsgcGZyOyBwZnIgPSBwZnItPm5leHQgKQorCXsKKwkgICAgIGkgPSBsc3RybGVuMzJBKCBwZnItPnJlc291cmNlICk7CisJICAgICBpZiggIWxzdHJuY21waTMyQSggcGZyLT5yZXNvdXJjZSwgYnVmZmVyLCBpKSApCisJICAgICB7CisJCSBpZiggZnIgKQorCQkgeworCQkgICAgIGZyLT5uZXh0ID0gcGZyLT5uZXh0OworCQkgICAgIHBmci0+bmV4dCA9IGZvbnRMaXN0OworCQkgICAgIGZvbnRMaXN0ID0gcGZyOworCQkgfQorCQkgYnJlYWs7CisJICAgICB9CisJICAgICBmciA9IHBmcjsKKwl9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYRk9OVF9DcmVhdGVBbGlhcworICovCitzdGF0aWMgZm9udEFsaWFzKiBYRk9OVF9DcmVhdGVBbGlhcyggTFBDU1RSIGxwVHlwZUZhY2UsIExQQ1NUUiBscEFsaWFzICkKK3sKKyAgICBmb250QWxpYXMqIHBmYSA9IGFsaWFzVGFibGU7CisgICAgaW50IGogPSBsc3RybGVuMzJBKGxwVHlwZUZhY2UpICsgMTsKKworICAgIHdoaWxlKCBwZmEtPm5leHQgKSBwZmEgPSBwZmEtPm5leHQ7CisgICAgcGZhLT5uZXh0ID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoZm9udEFsaWFzKSArCisJCQkJCSAgaiArIGxzdHJsZW4zMkEobHBBbGlhcykgKyAxICk7CisgICAgaWYoKHBmYSA9IHBmYS0+bmV4dCkpCisgICAgeworCXBmYS0+bmV4dCA9IE5VTEw7CisJcGZhLT5mYVR5cGVGYWNlID0gKExQU1RSKShwZmEgKyAxKTsKKwlsc3RyY3B5MzJBKCBwZmEtPmZhVHlwZUZhY2UsIGxwVHlwZUZhY2UgKTsKKyAgICAgICAgcGZhLT5mYUFsaWFzID0gcGZhLT5mYVR5cGVGYWNlICsgajsKKyAgICAgICAgbHN0cmNweTMyQSggcGZhLT5mYUFsaWFzLCBscEFsaWFzICk7CisKKyNpZmRlZiBERUJVR19GT05UX0lOSVQKKyAgICAgICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIlx0YWRkZWQgYWxpYXMgJyVzJyBmb3IgJXNcbiIsIGxwQWxpYXMsIGxwVHlwZUZhY2UgKTsKKyNlbmRpZgorCXJldHVybiBwZmE7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYRk9OVF9Mb2FkQWxpYXNlcworICoKKyAqIFJlYWQgdXNlci1kZWZpbmVkIGFsaWFzZXMgZnJvbSB3aW5lLmNvbmYuIEZvcm1hdCBpcyBhcyBmb2xsb3dzCisgKgorICogQWxpYXMjID0gW1dpbmRvd3MgZm9udCBuYW1lXSxbTEZEIGZvbnQgbmFtZV0sIDxzdWJzdGl0dXRlIG9yaWdpbmFsIG5hbWU+CisgKgorICogRXhhbXBsZToKKyAqICAgQWxpYXMwID0gQXJpYWwsIC1hZG9iZS1oZWx2ZXRpY2EtIAorICogICBBbGlhczEgPSBUaW1lcyBOZXcgUm9tYW4sIC1iaXRzdHJlYW0tY291cmllci0sIDEKKyAqICAgLi4uCisgKi8KK3N0YXRpYyB2b2lkIFhGT05UX0xvYWRBbGlhc2VzKCBjaGFyKiogYnVmZmVyLCBpbnQgYnVmX3NpemUgKQoreworICAgIGNoYXIgIHN1YnNlY3Rpb25bMzJdOworICAgIGludAkgIGkgPSAwOworCisgICAgaWYoIGJ1Zl9zaXplIDwgMTI4ICkKKwkqYnVmZmVyID0gSGVhcFJlQWxsb2MoU3lzdGVtSGVhcCwgMCwgKmJ1ZmZlciwgMjU2ICk7CisgICAgZG8KKyAgICB7CisJd3NwcmludGYzMkEoIHN1YnNlY3Rpb24sICIlcyVpIiwgSU5JU3ViU2VjdGlvbiwgaSsrICk7CisKKwlpZiggUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCBJTklGb250U2VjdGlvbiwgc3Vic2VjdGlvbiwgIiIsICpidWZmZXIsIDEyOCApICkKKwl7CisJICAgIGNoYXIqIGxwY2hYLCAqbHBjaFcgPSAqYnVmZmVyOworCisJICAgIHdoaWxlKCBpc3NwYWNlKCpscGNoVykgKSBscGNoVysrOworCSAgICBscGNoWCA9IFBST0ZJTEVfR2V0U3RyaW5nSXRlbSggbHBjaFcgKTsKKworCSAgICBpZiggbHBjaFggKQorCSAgICB7CisJCWZvbnRSZXNvdXJjZSogZnI7CisKKwkJZm9yIChmciA9IGZvbnRMaXN0OyBmciA7IGZyID0gZnItPm5leHQpCisJCXsKKwkJICAgIGludCBqOworCisJCSAgICBqID0gbHN0cmxlbjMyQSggZnItPnJlc291cmNlICk7CisKKwkJICAgIGlmKCAhbHN0cm5jbXBpMzJBKCBmci0+cmVzb3VyY2UsIGxwY2hYLCBqKSApCisJCSAgICB7CisJCQljaGFyKiBscGNoID0gUFJPRklMRV9HZXRTdHJpbmdJdGVtKCBscGNoWCApOworCisJCQlpZiggbHBjaCApCisJCQl7CisjaWZkZWYgREVCVUdfRk9OVF9JTklUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIlx0c3Vic3RpdHV0ZWQgJyVzJyB3aXRoICVzXG4iLAorCQkJCQkJCWZyLT5sZkZhY2VOYW1lLCBscGNoVyApOworI2VuZGlmCisJCQkgICAgbHN0cmNweW4zMkEoIGZyLT5sZkZhY2VOYW1lLCBscGNoVywgTEZfRkFDRVNJWkUgKTsKKwkJCSAgICBmci0+ZnJfZmxhZ3MgfD0gRlJfTkFNRVNFVDsKKwkJCX0KKwkJICAgICAgICBlbHNlCisJCQl7CisJCQkgICAgLyogY3JlYXRlIG5ldyBlbnRyeSBpbiB0aGUgYWxpYXMgdGFibGUgKi8KKwkJCSAgICBYRk9OVF9DcmVhdGVBbGlhcyhmci0+bGZGYWNlTmFtZSwgbHBjaFcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBlbHNlIGZwcmludGYoc3RkZXJyLCAiWEZPTlRfSW5pdDogbWFsZm9ybWVkIGZvbnQgYWxpYXMgJyVzJ1xuIiwgKmJ1ZmZlciApOworCX0KKwllbHNlIGJyZWFrOworICAgIH0gd2hpbGUoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFhGT05UX1VzZXJNZXRyaWNzQ2FjaGUKKyAqIAorICogUmV0dXJucyBleHBhbmRlZCBuYW1lIGZvciB0aGUgfi8ud2luZS8uY2FjaGVkbWV0cmljcyBmaWxlLgorICovCitzdGF0aWMgY2hhciogWEZPTlRfVXNlck1ldHJpY3NDYWNoZSggY2hhciogYnVmZmVyLCBpbnQqIGJ1Zl9zaXplICkKK3sKKyAgICBzdHJ1Y3QgcGFzc3dkKiBwd2Q7CisKKyAgICBwd2QgPSBnZXRwd3VpZChnZXR1aWQoKSk7CisgICAgaWYoIHB3ZCAmJiBwd2QtPnB3X2RpciApCisgICAgeworCWludCBpID0gbHN0cmxlbjMyQSggcHdkLT5wd19kaXIgKSArIGxzdHJsZW4zMkEoIElOSVdpbmVQcmVmaXggKSArIGxzdHJsZW4zMkEoIElOSUZvbnRNZXRyaWNzICkgKyAyOworCWlmKCBpID4gKmJ1Zl9zaXplICkgYnVmZmVyID0gKGNoYXIqKSBIZWFwUmVBbGxvYyggU3lzdGVtSGVhcCwgMCwgYnVmZmVyLCAqYnVmX3NpemUgPSBpICk7CisJbHN0cmNweTMyQSggYnVmZmVyLCBwd2QtPnB3X2RpciApOworCXN0cmNhdCggYnVmZmVyLCBJTklXaW5lUHJlZml4ICk7CisJc3RyY2F0KCBidWZmZXIsIElOSUZvbnRNZXRyaWNzICk7CisgICAgfSBlbHNlIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYRk9OVF9SZWFkQ2FjaGVkTWV0cmljcworICovCitzdGF0aWMgQk9PTDMyIFhGT05UX1JlYWRDYWNoZWRNZXRyaWNzKCBpbnQgZmQsIHVuc2lnbmVkIHhfY2hlY2tzdW0sIGludCB4X2NvdW50ICkKK3sKKyAgICBpZiggZmQgPj0gMCApCisgICAgeworCXVuc2lnbmVkIHU7CisJaW50IGksIGo7CisKKwkvKiByZWFkIGNoZWNrc3VtcyAqLworCXJlYWQoIGZkLCAmdSwgc2l6ZW9mKHVuc2lnbmVkKSApOworCXJlYWQoIGZkLCAmaSwgc2l6ZW9mKGludCkgKTsKKworCWlmKCB1ID09IHhfY2hlY2tzdW0gJiYgaSA9PSB4X2NvdW50ICkKKwl7CisJICAgIG9mZl90IGxlbmd0aCwgb2Zmc2V0ID0gMyAqIHNpemVvZihpbnQpOworCisgICAgICAgICAgICAvKiByZWFkIHRvdGFsIHNpemUgKi8KKwkgICAgcmVhZCggZmQsICZpLCBzaXplb2YoaW50KSApOworCSAgICBsZW5ndGggPSBsc2VlayggZmQsIDAsIFNFRUtfRU5EICk7CisKKwkgICAgaWYoIGxlbmd0aCA9PSAoaSArIG9mZnNldCkgKQorCSAgICB7CisJCWxzZWVrKCBmZCwgb2Zmc2V0LCBTRUVLX1NFVCApOworCQlmb250TGlzdCA9IChmb250UmVzb3VyY2UqKUhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgaSk7CisJCWlmKCBmb250TGlzdCApCisJCXsKKwkJICAgIGZvbnRSZXNvdXJjZSogCXBmciA9IGZvbnRMaXN0OworCQkgICAgZm9udEluZm8qIAkJcGZpID0gTlVMTDsKKworCQkgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiUmVhZGluZyBjYWNoZWQgZm9udCBtZXRyaWNzOlxuIik7CisKKwkJICAgIHJlYWQoIGZkLCBmb250TGlzdCwgaSk7IC8qIHJlYWQgYWxsIG1ldHJpY3MgYXQgb25jZSAqLworCQkgICAgd2hpbGUoIG9mZnNldCA8IGxlbmd0aCApCisJCSAgICB7CisJCQlvZmZzZXQgKz0gc2l6ZW9mKGZvbnRSZXNvdXJjZSkgKyBzaXplb2YoZm9udEluZm8pOworCQkJcGZyLT5maSA9IHBmaSA9IChmb250SW5mbyopKHBmciArIDEpOworCQkJaiA9IDE7CisJCQl3aGlsZSggVFJVRSApCisJCQl7CisJCQkgICBpZiggb2Zmc2V0ID4gbGVuZ3RoIHx8CisJCQkgICAgICAoaW50KShwZmktPm5leHQpICE9IGorKyApIGdvdG8gZmFpbDsKKworCQkJICAgcGZpLT5kZi5kZkZhY2UgPSBwZnItPmxmRmFjZU5hbWU7CisJCQkgICBwZmktPm5leHQgPSBwZmkgKyAxOworCisJCQkgICBpZiggaiA+IHBmci0+Y291bnQgKSBicmVhazsKKworCQkJICAgcGZpID0gcGZpLT5uZXh0OworCQkJICAgb2Zmc2V0ICs9IHNpemVvZihmb250SW5mbyk7CisJCQl9CisJCQlwZmktPm5leHQgPSBOVUxMOworCQkJaWYoIHBmci0+bmV4dCApCisJCQl7CisJCQkgICAgcGZyLT5uZXh0ID0gKGZvbnRSZXNvdXJjZSopKHBmaSArIDEpOworCQkJICAgIHBmciA9IHBmci0+bmV4dDsKKwkJCX0gCisJCQllbHNlIGJyZWFrOworCQkgICAgfQorCQkgICAgaWYoIHBmci0+bmV4dCA9PSBOVUxMICYmCisJCQkqKGludCopKHBmaSArIDEpID09IFhfRk1DX01BR0lDICkKKwkJICAgIHsKKwkJCS8qIHJlYWQgTEZEIHN0dWJzICovCisJCQljaGFyKiBscGNoID0gKGNoYXIqKSgoaW50KikocGZpICsgMSkgKyAxKTsKKwkJCW9mZnNldCArPSBzaXplb2YoaW50KTsKKwkJCWZvciggcGZyID0gZm9udExpc3Q7IHBmcjsgcGZyID0gcGZyLT5uZXh0ICkKKwkJCXsKKwkJCSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJcdCVzLCAlaSBpbnN0YW5jZXNcbiIsIGxwY2gsIHBmci0+Y291bnQgKTsKKwkJCSAgICBwZnItPnJlc291cmNlID0gbHBjaDsKKwkJCSAgICB3aGlsZSggVFJVRSApCisJCQkgICAgeyAKKwkJCQlpZiggKytvZmZzZXQgPiBsZW5ndGggKSBnb3RvIGZhaWw7CisJCQkJaWYoICEqbHBjaCsrICkgYnJlYWs7CisJCQkgICAgfQorCQkJfQorCQkJY2xvc2UoIGZkICk7CisJCQlyZXR1cm4gVFJVRTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorZmFpbDoKKwlpZiggZm9udExpc3QgKSBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgZm9udExpc3QgKTsKKwlmb250TGlzdCA9IE5VTEw7CisJY2xvc2UoIGZkICk7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgWEZPTlRfV3JpdGVDYWNoZWRNZXRyaWNzCisgKi8KK3N0YXRpYyBCT09MMzIgWEZPTlRfV3JpdGVDYWNoZWRNZXRyaWNzKCBpbnQgZmQsIHVuc2lnbmVkIHhfY2hlY2tzdW0sIGludCB4X2NvdW50LCBpbnQgbl9mZiApCit7CisgICAgZm9udFJlc291cmNlKiBwZnI7CisgICAgZm9udEluZm8qIHBmaTsKKworICAgIGlmKCBmZCA+PSAwICkKKyAgICB7CisgICAgICAgIGludCAgaSwgaiwgazsKKworICAgICAgICAvKiBmb250IG1ldHJpY3MgZmlsZToKKyAgICAgICAgICoKKyAgICAgICAgICogKzAwMDAgeF9jaGVja3N1bQorICAgICAgICAgKiArMDAwNCB4X2NvdW50CisgICAgICAgICAqICswMDA4IHRvdGFsIHNpemUgdG8gbG9hZAorICAgICAgICAgKiArMDAwQyBwcmVwYWNrYWdlZCBmb250IG1ldHJpY3MKKwkgKiAuLi4KKwkgKiArLi4ueCAJWF9GTUNfTUFHSUMKKwkgKiArLi4ueCArIDQgCUxGRCBzdHVicworICAgICAgICAgKi8KKworCXdyaXRlKCBmZCwgJnhfY2hlY2tzdW0sIHNpemVvZih1bnNpZ25lZCkgKTsKKwl3cml0ZSggZmQsICZ4X2NvdW50LCBzaXplb2YoaW50KSApOworCisJZm9yKCBqID0gaSA9IDAsIHBmciA9IGZvbnRMaXN0OyBwZnI7IHBmciA9IHBmci0+bmV4dCApIAorCXsKKwkgICAgaSArPSBsc3RybGVuMzJBKCBwZnItPnJlc291cmNlICkgKyAxOworCSAgICBqICs9IHBmci0+Y291bnQ7CisJfQorICAgICAgICBpICs9IG5fZmYgKiBzaXplb2YoZm9udFJlc291cmNlKSArIGogKiBzaXplb2YoZm9udEluZm8pICsgc2l6ZW9mKGludCk7CisJd3JpdGUoIGZkLCAmaSwgc2l6ZW9mKGludCkgKTsKKworCWRwcmludGZfZm9udChzdGRkZWIsIldyaXRpbmcgZm9udCBjYWNoZTpcbiIpOworCisJZm9yKCBwZnIgPSBmb250TGlzdDsgcGZyOyBwZnIgPSBwZnItPm5leHQgKQorCXsKKwkgICAgZm9udEluZm8gZmk7CisKKwkgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiXHQlcywgJWkgaW5zdGFuY2VzXG4iLCBwZnItPnJlc291cmNlLCBwZnItPmNvdW50ICk7CisKKwkgICAgaSA9IHdyaXRlKCBmZCwgcGZyLCBzaXplb2YoZm9udFJlc291cmNlKSApOworCSAgICBpZiggaSA9PSBzaXplb2YoZm9udFJlc291cmNlKSApIAorCSAgICB7CisJCWZvciggayA9IDEsIHBmaSA9IHBmci0+Zmk7IHBmaTsgcGZpID0gcGZpLT5uZXh0ICkKKwkJeworCQkgICAgbWVtY3B5KCAmZmksIHBmaSwgc2l6ZW9mKGZpKSApOworCisJCSAgICBmaS5kZi5kZkZhY2UgPSBOVUxMOworCQkgICAgZmkubmV4dCA9IChmb250SW5mbyopazsJLyogbG9hZGVyIGNoZWNrcyB0aGlzICovCisKKwkJICAgIGogPSB3cml0ZSggZmQsICZmaSwgc2l6ZW9mKGZpKSApOworCQkgICAgaysrOworCQl9CisJICAgICAgICBpZiggaiA9PSBzaXplb2YoZm9udEluZm8pICkgY29udGludWU7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgICAgICBpZiggaSA9PSBzaXplb2YoZm9udFJlc291cmNlKSAmJiBqID09IHNpemVvZihmb250SW5mbykgKQorCXsKKwkgICAgaSA9IGogPSBYX0ZNQ19NQUdJQzsKKwkgICAgd3JpdGUoIGZkLCAmaSwgc2l6ZW9mKGludCkgKTsKKwkgICAgZm9yKCBwZnIgPSBmb250TGlzdDsgcGZyICYmIGkgPT0gajsgcGZyID0gcGZyLT5uZXh0ICkKKwkgICAgeworCSAgICAgICAgaSA9IGxzdHJsZW4zMkEoIHBmci0+cmVzb3VyY2UgKSArIDE7CisJCWogPSB3cml0ZSggZmQsIHBmci0+cmVzb3VyY2UsIGkgKTsKKwkgICAgfQorCX0KKwljbG9zZSggZmQgKTsKKwlyZXR1cm4gKCBpID09IGogKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFgxMURSVl9GT05UX0luaXQKKyAqCisgKiBJbml0aWFsaXplIGZvbnQgcmVzb3VyY2UgbGlzdCBhbmQgYWxsb2NhdGUgZm9udCBjYWNoZS4KKyAqLworQk9PTDMyIFgxMURSVl9GT05UX0luaXQoIERldmljZUNhcHMqIHBEZXZDYXBzICkKK3sKKyAgWEZvbnRTdHJ1Y3QqCXhfZnM7CisgIGZvbnRSZXNvdXJjZSogZnIsICpwZnI7CisgIGZvbnRJbmZvKglmaSwgKnBmaTsKKyAgdW5zaWduZWQJeF9jaGVja3N1bTsKKyAgaW50CQlpLCBqLCBrLCB4X2NvdW50LCBmZCA9IC0xLCBidWZfc2l6ZSA9IDA7CisgIGNoYXIqCQlscHN0ciwgKmxwY2gsICpscG1ldHJpY3MsICpidWZmZXI7CisgIGNoYXIqKgl4X3BhdHRlcm47CisKKyAgRGVmUmVzb2x1dGlvbiA9IFBST0ZJTEVfR2V0V2luZUluaUludCggSU5JRm9udFNlY3Rpb24sICJSZXNvbHV0aW9uIiwgMCApOworICBpZiggIURlZlJlc29sdXRpb24gKSBEZWZSZXNvbHV0aW9uID0gcERldkNhcHMtPmxvZ1BpeGVsc1k7CisKKyAgaSA9IGFicyhEZWZSZXNvbHV0aW9uIC0gNzIpOworICBqID0gYWJzKERlZlJlc29sdXRpb24gLSA3NSk7CisgIGsgPSBhYnMoRGVmUmVzb2x1dGlvbiAtIDEwMCk7CisKKyAgaWYoIGkgPCBqICkgRGVmUmVzb2x1dGlvbiA9ICggaSA8IGsgKSA/IDcyIDogMTAwOworICBlbHNlIERlZlJlc29sdXRpb24gPSAoIGogPCBrICkgPyA3NSA6IDEwMDsKKyAgICAgIAorICB4X3BhdHRlcm4gPSBYTGlzdEZvbnRzKGRpc3BsYXksICIqIiwgTUFYX0ZPTlRfRkFNSUxJRVMgKiAxNiwgJnhfY291bnQgKTsKKworICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJGb250IE1hcHBlcjogaW5pdGlhbGl6aW5nICVpIGZvbnRzIFtMUFk9JWksIERSPSVpXVxuIiwgCisJCQkJICAgIHhfY291bnQsIHBEZXZDYXBzLT5sb2dQaXhlbHNZLCBEZWZSZXNvbHV0aW9uKTsKKyAgZm9yKCBpID0geF9jaGVja3N1bSA9IDA7IGkgPCB4X2NvdW50OyBpKysgKQorICB7CisjaWYgMAorICAgICBwcmludGYoIiVpXHQ6ICVzXG4iLCBpLCB4X3BhdHRlcm5baV0gKTsKKyNlbmRpZgorCisgICAgIGogPSBsc3RybGVuMzJBKCB4X3BhdHRlcm5baV0gKTsKKyAgICAgaWYoIGogKSB4X2NoZWNrc3VtIF49IF9fZ2VuZXJpY0NoZWNrU3VtKCAoVUlOVDE2KikoeF9wYXR0ZXJuW2ldKSwgaiApOworICB9CisgIHhfY2hlY2tzdW0gfD0gWF9QRk9OVF9NQUdJQzsKKworICBidWZfc2l6ZSA9IDEyODsKKyAgYnVmZmVyID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBidWZfc2l6ZSApOworICBscG1ldHJpY3MgPSBOVUxMOworCisgIC8qIGRlYWwgd2l0aCBzeXN0ZW13aWRlIGZvbnQgbWV0cmljcyBjYWNoZSAqLworCisgIGlmKCBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoIElOSUZvbnRTZWN0aW9uLCAiRm9udE1ldHJpY3MiLCAiIiwgYnVmZmVyLCAxMjggKSApCisgICAgICBmZCA9IG9wZW4oIGJ1ZmZlciwgT19SRE9OTFkgKTsKKworICBpZiggWEZPTlRfUmVhZENhY2hlZE1ldHJpY3MoZmQsIHhfY2hlY2tzdW0sIHhfY291bnQpID09IEZBTFNFICkKKyAgeworICAgICAgLyogdHJ5IHBlci11c2VyICovCisgICAgICBidWZmZXIgPSBYRk9OVF9Vc2VyTWV0cmljc0NhY2hlKCBidWZmZXIsICZidWZfc2l6ZSApOworICAgICAgaWYoIGJ1ZmZlclswXSApCisgICAgICB7CisJICBmZCA9IG9wZW4oIGJ1ZmZlciwgT19SRE9OTFkgKTsKKwkgIGlmKCBYRk9OVF9SZWFkQ2FjaGVkTWV0cmljcyhmZCwgeF9jaGVja3N1bSwgeF9jb3VudCkgPT0gRkFMU0UgKQorCSAgICAgIGxwbWV0cmljcyA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgYnVmZmVyICk7IC8qIHVwZGF0ZSBsYXRlciBvbiAqLworICAgICAgfQorICB9CisKKyAgZmkgPSBOVUxMOworICBpZiggZm9udExpc3QgPT0gTlVMTCApCS8qIGJ1aWxkIG1ldHJpY3MgZnJvbSBzY3JhdGNoICovCisgIHsKKyAgICAgaW50IG5fZmY7CisgICAgIGNoYXIqIHR5cGVmYWNlOworCisgICAgIGZvciggaSA9IG5fZmYgPSAwOyBpIDwgeF9jb3VudDsgaSsrICkKKyAgICAgeworCXR5cGVmYWNlID0gbHBjaCA9IHhfcGF0dGVybltpXTsKKworCWxwY2ggPSBMRkRfQWR2YW5jZSh0eXBlZmFjZSwgMyk7IC8qIGV4dHJhICctJyBpbiB0aGUgYmVnaW5uaW5nICovCisJaWYoICEqbHBjaCApIGNvbnRpbnVlOworCisJbHBzdHIgPSBscGNoOyAKKwlqID0gbHBjaCAtIHR5cGVmYWNlOwkvKiByZXNvdXJjZSBuYW1lIGxlbmd0aCAqLworCisJLyogZmluZCBhIGZhbWlseSB0byBpbnNlcnQgaW50byAqLworCisJZm9yKCBwZnIgPSBOVUxMLCBmciA9IGZvbnRMaXN0OyBmcjsgZnIgPSBmci0+bmV4dCApCisJeworCSAgIGlmKCAhbHN0cm5jbXBpMzJBKGZyLT5yZXNvdXJjZSwgdHlwZWZhY2UsIGopICYmIAorCSAgICAgICBsc3RybGVuMzJBKGZyLT5yZXNvdXJjZSkgPT0gaiApIGJyZWFrOworCSAgIHBmciA9IGZyOworCX0gIAorCisJaWYoICFmaSApIGZpID0gKGZvbnRJbmZvKikgSGVhcEFsbG9jKFN5c3RlbUhlYXAsIDAsIHNpemVvZihmb250SW5mbykpOworCisJaWYoICFmciApIC8qIGFkZCBuZXcgZmFtaWx5ICovCisJeworCSAgIGlmKCBuX2ZmKysgPiBNQVhfRk9OVF9GQU1JTElFUyApIGJyZWFrOworCisJICAgaWYoICFMRkRfSW5pdEZvbnRJbmZvKCBmaSwgbHBzdHIpICkgY29udGludWU7CisKKwkgICBmciA9IChmb250UmVzb3VyY2UqKSBIZWFwQWxsb2MoU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKGZvbnRSZXNvdXJjZSkpOyAKKwkgICBtZW1zZXQoZnIsIDAsIHNpemVvZihmb250UmVzb3VyY2UpKTsKKwkgICBmci0+cmVzb3VyY2UgPSAoY2hhciopIEhlYXBBbGxvYyhTeXN0ZW1IZWFwLCAwLCBqICsgMSApOworCSAgIGxzdHJjcHluMzJBKCBmci0+cmVzb3VyY2UsIHR5cGVmYWNlLCBqICsgMSApOworCisjaWZkZWYgREVCVUdfRk9OVF9JTklUCisJICAgZHByaW50Zl9mb250KHN0ZGRlYiwiICAgIGZhbWlseTogJXNcbiIsIGZyLT5yZXNvdXJjZSApOworI2VuZGlmCisKKwkgICBpZiggcGZyICkgcGZyLT5uZXh0ID0gZnI7CisJICAgZWxzZSBmb250TGlzdCA9IGZyOworCX0KKwllbHNlIGlmKCAhTEZEX0luaXRGb250SW5mbyggZmksIGxwc3RyKSApIGNvbnRpbnVlOworCisJLyogY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHNvbWV0aGluZyBiZXR0ZXIgdGhhbiAiZmkiICovCisKKwlmb3IoIHBmaSA9IGZyLT5maSwgaiA9IDA7IHBmaSAmJiBqIDw9IDA7IHBmaSA9IHBmaS0+bmV4dCApIAorICAgICAgICAgICBpZiggKGogPSBYRk9OVF9Jc1N1YnNldCggcGZpLCBmaSApKSA8IDAgKSAKKwkgICAgICAgcGZpLT5maV9mbGFncyB8PSBGSV9TVUJTRVQ7IC8qIHN1cGVyc2VkZWQgYnkgImZpIiAqLworCWlmKCBqID4gMCApIGNvbnRpbnVlOworCisJLyogYWRkIG5ldyBmb250IGluc3RhbmNlICJmaSIgdG8gdGhlICJmciIgZm9udCByZXNvdXJjZSAqLworCisJaWYoIGZpLT5maV9mbGFncyAmIEZJX1NDQUxBQkxFICkKKwl7CisJICAgIC8qIHNldCBzY2FsYWJsZSBmb250IGhlaWdodCB0byAyNCB0byBnZXQgYW4gb3JpZ2luIGZvciBleHRyYXBvbGF0aW9uICovCisKKwkgICBqID0gbHN0cmxlbjMyQSh0eXBlZmFjZSk7ICBqICs9IDB4MTA7CisJICAgaWYoIGogPiBidWZfc2l6ZSApIAorCSAgICAgICBidWZmZXIgPSAoY2hhciopSGVhcFJlQWxsb2MoIFN5c3RlbUhlYXAsIDAsIGJ1ZmZlciwgYnVmX3NpemUgPSBqICk7CisKKwkgICBscGNoID0gTEZEX0FkdmFuY2UodHlwZWZhY2UsIDcpOworCSAgIG1lbWNweSggYnVmZmVyLCB0eXBlZmFjZSwgKGogPSBscGNoIC0gdHlwZWZhY2UpICk7CisJICAgbHBjaCA9IExGRF9BZHZhbmNlKGxwY2gsIDQpOworCSAgIHNwcmludGYoIGJ1ZmZlciArIGosICIlZC0lZC0lZC0qLSVjLSotIiwgZmktPmxmZF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmktPmxmZF9kZWNpcG9pbnRzLCBmaS0+bGZkX3Jlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpscGNoID09ICctJyk/JyonOipscGNoICk7CisJICAgbHBjaCA9IExGRF9BZHZhbmNlKGxwY2gsIDIpOworCSAgIHN0cmNhdCggbHBzdHIgPSBidWZmZXIsIGxwY2gpOworCX0KKwllbHNlIGxwc3RyID0gdHlwZWZhY2U7CisKKwlpZiggKHhfZnMgPSBYTG9hZFF1ZXJ5Rm9udChkaXNwbGF5LCBscHN0cikpICkKKwl7CisJICAgZmktPmRmLmRmSG9yaXpSZXMgPSBwRGV2Q2Fwcy0+bG9nUGl4ZWxzWDsKKyAgICAgICAgICAgZmktPmRmLmRmVmVydFJlcyA9IHBEZXZDYXBzLT5sb2dQaXhlbHNZOworCisJICAgWEZPTlRfU2V0Rm9udE1ldHJpYyggZmksIGZyLCB4X2ZzICk7CisgICAgICAgICAgIFhGcmVlRm9udCggZGlzcGxheSwgeF9mcyApOworCisjaWZkZWYgREVCVUdfRk9OVF9JTklUCisJICAgZHByaW50Zl9mb250KHN0ZGRlYiwiXHRbJSAyaXB0XSAnJXMnXG4iLCBmaS0+ZGYuZGZQb2ludHMsIHR5cGVmYWNlICk7CisjZW5kaWYKKwkgICBYRk9OVF9DaGVja0ZJTGlzdCggZnIsIGZpLCBSRU1PVkVfU1VCU0VUUyApOworCSAgIGZpID0gTlVMTDsJLyogcHJldmVudGluZyByZXVzZSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZPTlRfSW5pdDogZmFpbGVkIHRvIGxvYWQgJXNcbiIsIGxwc3RyICk7CisKKyAgICAgICAgICAgWEZPTlRfQ2hlY2tGSUxpc3QoIGZyLCBmaSwgVU5NQVJLX1NVQlNFVFMgKTsKKyAgICAgICAgfQorICAgICB9CisKKyAgICAgaWYoIGxwbWV0cmljcyApCSAvKiB1cGRhdGUgY2FjaGVkIG1ldHJpY3MgKi8KKyAgICAgeworCSBmZCA9IG9wZW4oIGxwbWV0cmljcywgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1JEV1IsIDA2NDQgKTsgLyogLXJ3LXItLXItLSAqLworCSBpZiggWEZPTlRfV3JpdGVDYWNoZWRNZXRyaWNzKCBmZCwgeF9jaGVja3N1bSwgeF9jb3VudCwgbl9mZiApID09IEZBTFNFICkKKwkgICAgIGlmKCBmZCApIHJlbW92ZSggbHBtZXRyaWNzICk7CS8qIGNvdWxkbid0IHdyaXRlIGVudGlyZSBmaWxlICovCisJIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBscG1ldHJpY3MgKTsKKyAgICAgfQorICB9CisKKyAgaWYoIGZpICkgSGVhcEZyZWUoU3lzdGVtSGVhcCwgMCwgZmkpOworICBYRnJlZUZvbnROYW1lcyh4X3BhdHRlcm4pOworCisgIC8qIGNoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBYMTEgUjYgc2VydmVyICovCisKKyAgbHN0cmNweTMyQShidWZmZXIsICItKi0qLSotKi1ub3JtYWwtKi1bMTIgMCAwIDEyXS0qLTcyLSotKi0qLWlzbzg4NTktMSIpOworICBpZiggKHhfZnMgPSBYTG9hZFF1ZXJ5Rm9udChkaXNwbGF5LCBidWZmZXIpKSApCisgIHsKKyAgICAgICBYVGV4dENhcHMgfD0gVENfU0ZfWF9ZSU5ERVA7CisgICAgICAgWEZyZWVGb250KGRpc3BsYXksIHhfZnMpOworICB9CisKKyAgWEZPTlRfV2luZG93c05hbWVzKCBidWZmZXIgKTsKKyAgWEZPTlRfTG9hZEFsaWFzZXMoICZidWZmZXIsIGJ1Zl9zaXplICk7CisgIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIGJ1ZmZlcik7CisKKworICAvKiBmb250TGlzdCBpbml0aWFsaXphdGlvbiBpcyBvdmVyLCBhbGxvY2F0ZSBYIGZvbnQgY2FjaGUgKi8KKworICBmb250Q2FjaGUgPSAoZm9udE9iamVjdCopIEhlYXBBbGxvYyhTeXN0ZW1IZWFwLCAwLCBmb250Q2FjaGVTaXplICogc2l6ZW9mKGZvbnRPYmplY3QpKTsKKyAgWEZPTlRfR3Jvd0ZyZWVMaXN0KDAsIGZvbnRDYWNoZVNpemUgLSAxKTsKKworI2lmZGVmIERFQlVHX0ZPTlRfSU5JVAorICAgICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJkb25lIVxuIik7CisjZW5kaWYKKworICAvKiB1cGRhdGUgdGV4dCBjYXBzIHBhcmFtZXRlciAqLworCisgIHBEZXZDYXBzLT50ZXh0Q2FwcyA9IFhUZXh0Q2FwczsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgWCBGb250IE1hdGNoaW5nCisgKgorICogQ29tcGFyZSB0d28gZm9udHMgKG9ubHkgcGFyYW1ldGVycyBzZXQgYnkgdGhlIFhGT05UX0luaXRGb250SW5mbygpKS4KKyAqLworc3RhdGljIElOVDMyIFhGT05UX0lzU3Vic2V0KGZvbnRJbmZvKiBtYXRjaCwgZm9udEluZm8qIGZpKQoreworICBJTlQzMiAgICAgICAgICAgbTsKKworICAvKiAwIC0ga2VlcCBib3RoLCAxIC0ga2VlcCBtYXRjaCwgLTEgLSBrZWVwIGZpICovCisKKyAgbSA9IChCWVRFKikmZmktPmRmLmRmUGl4V2lkdGggLSAoQllURSopJmZpLT5kZi5kZkl0YWxpYzsKKyAgaWYoIG1lbWNtcCgmbWF0Y2gtPmRmLmRmSXRhbGljLCAmZmktPmRmLmRmSXRhbGljLCBtICkpIHJldHVybiAwOworCisgIGlmKCAoISgoZmktPmZpX2ZsYWdzICYgRklfU0NBTEFCTEUpICsgKG1hdGNoLT5maV9mbGFncyAmIEZJX1NDQUxBQkxFKSkKKyAgICAgICAmJiBmaS0+bGZkX2hlaWdodCAhPSBtYXRjaC0+bGZkX2hlaWdodCkgfHwKKyAgICAgICghKChmaS0+ZmlfZmxhZ3MgJiBGSV9QT0xZV0VJR0hUKSArIChtYXRjaC0+ZmlfZmxhZ3MgJiBGSV9QT0xZV0VJR0hUKSkKKyAgICAgICAmJiBmaS0+ZGYuZGZXZWlnaHQgIT0gbWF0Y2gtPmRmLmRmV2VpZ2h0KSApIHJldHVybiAwOworCisgIG0gPSAoaW50KShtYXRjaC0+ZmlfZmxhZ3MgJiAoRklfUE9MWVdFSUdIVCB8IEZJX1NDQUxBQkxFKSkgLQorICAgICAgKGludCkoZmktPmZpX2ZsYWdzICYgKEZJX1NDQUxBQkxFIHwgRklfUE9MWVdFSUdIVCkpOworCisgIGlmKCBtID09IChGSV9QT0xZV0VJR0hUIC0gRklfU0NBTEFCTEUpIHx8CisgICAgICBtID09IChGSV9TQ0FMQUJMRSAtIEZJX1BPTFlXRUlHSFQpICkgcmV0dXJuIDA7CS8qIGtlZXAgYm90aCAqLworICBlbHNlIGlmKCBtID49IDAgKSByZXR1cm4gMTsJLyogJ21hdGNoJyBpcyBiZXR0ZXIgKi8KKworICByZXR1cm4gLTE7CQkJLyogJ2ZpJyBpcyBiZXR0ZXIgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIFhGT05UX01hdGNoCisgKgorICogQ29tcHV0ZSB0aGUgbWF0Y2hpbmcgc2NvcmUgYmV0d2VlbiB0aGUgbG9naWNhbCBmb250IGFuZCB0aGUgZGV2aWNlIGZvbnQuCisgKgorICogY29udHJpYnV0aW9ucyBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0OgorICogICAgICBjaGFyc2V0CisgKiAgICAgIGZpeGVkIHBpdGNoCisgKiAgICAgIGhlaWdodAorICogICAgICBmYW1pbHkgZmxhZ3MgKG9ubHkgd2hlbiB0aGUgZmFjZW5hbWUgaXMgbm90IHByZXNlbnQpCisgKiAgICAgIHdpZHRoCisgKiAgICAgIHdlaWdodCwgaXRhbGljcywgdW5kZXJsaW5lcywgc3RyaWtlb3V0cworICoKKyAqIE5PVEU6IHlvdSBjYW4gZXhwZXJpbWVudCB3aXRoIGRpZmZlcmVudCBwZW5hbHR5IHdlaWdodHMgdG8gc2VlIHdoYXQgaGFwcGVucy4KKyAqIGh0dHA6Ly9wcmVtaXVtLm1pY3Jvc29mdC5jb20vbXNkbi9saWJyYXJ5L3RlY2hhcnQvZjMwL2YzNC9mNDAvZDRkL3NhOGJmLmh0bQorICovCitzdGF0aWMgVUlOVDMyIFhGT05UX01hdGNoKCBmb250TWF0Y2gqIHBmbSApCit7CisgICBmb250SW5mbyogICAgcGZpID0gcGZtLT5wZmk7ICAgICAgICAgLyogZGV2aWNlIGZvbnQgdG8gbWF0Y2ggKi8KKyAgIExQTE9HRk9OVDE2ICBwbGYgPSBwZm0tPnBsZjsgICAgICAgICAvKiB3YW50ZWQgbG9naWNhbCBmb250ICovCisgICBVSU5UMzIgICAgICAgcGVuYWx0eSA9IDA7CisgICBCT09MMzIgICAgICAgYlI2ID0gcGZtLT5mbGFncyAmIEZPX01BVENIX1hZSU5ERVA7ICAgIC8qIGZyb20gVGV4dENhcHMgKi8KKyAgIEJPT0wzMiAgICAgICBiU2NhbGUgPSBwZmktPmZpX2ZsYWdzICYgRklfU0NBTEFCTEU7CisgICBJTlQzMiAgICAgICAgZCwgaDsKKworICAgZHByaW50Zl9mb250KCBzdGRkZWIsIlx0WyAlLTJpcHQgaD0lLTNpIHc9JS0zaSAlcyVzXSIsIHBmaS0+ZGYuZGZQb2ludHMsCisJCSBwZmktPmRmLmRmUGl4SGVpZ2h0LCBwZmktPmRmLmRmQXZnV2lkdGgsCisJCShwZmktPmRmLmRmV2VpZ2h0ID4gNDAwKSA/ICJCb2xkICIgOiAiTm9ybWFsICIsCisJCShwZmktPmRmLmRmSXRhbGljKSA/ICJJdGFsaWMiIDogIiIgKTsKKworICAgcGZtLT5mbGFncyA9IDA7CisKKyAgIGlmKCBwbGYtPmxmQ2hhclNldCAhPSBERUZBVUxUX0NIQVJTRVQgJiYKKyAgICAgICBwbGYtPmxmQ2hhclNldCAhPSBwZmktPmRmLmRmQ2hhclNldCApIHBlbmFsdHkgKz0gMHgyMDA7CisKKyAgIC8qIFRNUEZfRklYRURfUElUQ0ggbWVhbnMgZXhhY3RseSB0aGUgb3Bwb3NpdGUgKi8KKworICAgaWYoIHBsZi0+bGZQaXRjaEFuZEZhbWlseSAmIEZJWEVEX1BJVENIICkgCisgICB7CisgICAgICBpZiggcGZpLT5kZi5kZlBpdGNoQW5kRmFtaWx5ICYgVE1QRl9GSVhFRF9QSVRDSCApIHBlbmFsdHkgKz0gMHgxMDA7CisgICB9CisgICBlbHNlIGlmKCAhKHBmaS0+ZGYuZGZQaXRjaEFuZEZhbWlseSAmIFRNUEZfRklYRURfUElUQ0gpICkgcGVuYWx0eSArPSAweDI7CisKKyAgIGlmKCBwbGYtPmxmSGVpZ2h0ID4gMCApCisgICAgICAgZCA9IChoID0gcGZpLT5kZi5kZlBpeEhlaWdodCkgLSBwbGYtPmxmSGVpZ2h0OworICAgZWxzZSBpZiggcGxmLT5sZkhlaWdodCA8IC0xICkKKyAgICAgICBkID0gKGggPSBwZmktPmRmLmRmUG9pbnRzKSArIHBsZi0+bGZIZWlnaHQ7CisgICBlbHNlIGQgPSBoID0gMDsJCisKKyAgIGlmKCBkICYmIHBsZi0+bGZIZWlnaHQgKQorICAgeworICAgICAgIFVJTlQxNgloZWlnaHQgPSAoIHBsZi0+bGZIZWlnaHQgPiAwICkgPyBwbGYtPmxmSGVpZ2h0CisJCQkgOiAoKC1wbGYtPmxmSGVpZ2h0ICogcGZpLT5kZi5kZlBpeEhlaWdodCkgLyBoKTsKKyAgICAgICBpZiggYlNjYWxlICkgcGZtLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgZWxzZSBpZiggKHBsZi0+bGZRdWFsaXR5ICE9IFBST09GX1FVQUxJVFkpICYmIGJSNiApCisgICAgICAgeworCSAgIGlmKCBkID4gMCApIAkvKiBkbyBub3Qgc2hyaW5rIHJhc3RlciBmb250cyAqLworCSAgIHsKKwkgICAgICAgcGZtLT5oZWlnaHQgPSBwZmktPmRmLmRmUGl4SGVpZ2h0OworCSAgICAgICBwZW5hbHR5ICs9IChwZmktPmRmLmRmUGl4SGVpZ2h0IC0gaGVpZ2h0KSAqIDB4NDsKKwkgICB9CisJICAgZWxzZSAJLyogZXhwYW5kIG9ubHkgaW4gaW50ZWdlciBtdWx0aXBsZXMgKi8KKwkgICB7CisJICAgICAgIHBmbS0+aGVpZ2h0ID0gaGVpZ2h0IC0gaGVpZ2h0JXBmaS0+ZGYuZGZQaXhIZWlnaHQ7CisJICAgICAgIHBlbmFsdHkgKz0gKGhlaWdodCAtIHBmbS0+aGVpZ2h0KSAqIHBmbS0+aGVpZ2h0IC8gaGVpZ2h0OworCSAgIH0KKyAgICAgICB9CisgICAgICAgZWxzZSAvKiBjYW4ndCBiZSBzY2FsZWQgYXQgYWxsICovCisgICAgICAgeworICAgICAgICAgICBpZiggcGxmLT5sZlF1YWxpdHkgIT0gUFJPT0ZfUVVBTElUWSkgcGZtLT5mbGFncyB8PSBGT19TWU5USF9IRUlHSFQ7CisgICAgICAgICAgIHBmbS0+aGVpZ2h0ID0gcGZpLT5kZi5kZlBpeEhlaWdodDsKKyAgICAgICAgICAgcGVuYWx0eSArPSAoZCA+IDApPyBkICogMHg4IDogLWQgKiAweDEwOworICAgICAgIH0KKyAgIH0gZWxzZSBwZm0tPmhlaWdodCA9IHBmaS0+ZGYuZGZQaXhIZWlnaHQ7CisKKyAgIGlmKChwZm0tPmZsYWdzICYgRk9fTUFUQ0hfUEFGKSAmJgorICAgICAgKHBsZi0+bGZQaXRjaEFuZEZhbWlseSAmIEZGX0ZBTUlMWSkgIT0gKHBmaS0+ZGYuZGZQaXRjaEFuZEZhbWlseSAmIEZGX0ZBTUlMWSkgKQorICAgICAgIHBlbmFsdHkgKz0gMHgxMDsKKworICAgaWYoIHBsZi0+bGZXaWR0aCApCisgICB7CisgICAgICAgaWYoIGJSNiAmJiBiU2NhbGUgKSBoID0gMDsgCisgICAgICAgZWxzZQorICAgICAgIHsKKwkgICAvKiBGSVhNRTogbm90IGNvbXBsZXRlICovCisKKwkgICBwZm0tPmZsYWdzIHw9IEZPX1NZTlRIX1dJRFRIOworCSAgIGggPSBhYnMocGxmLT5sZldpZHRoIC0gKHBmbS0+aGVpZ2h0ICogcGZpLT5kZi5kZkF2Z1dpZHRoKS9wZmktPmRmLmRmUGl4SGVpZ2h0KTsKKyAgICAgICB9CisgICAgICAgcGVuYWx0eSArPSBoICogKCBkICkgPyAweDIgOiAweDEgOworICAgfQorICAgZWxzZSBpZiggIShwZmktPmZpX2ZsYWdzICYgRklfTk9STUFMKSApIHBlbmFsdHkrKzsKKworICAgaWYoIHBmaS0+bGZkX3Jlc29sdXRpb24gIT0gRGVmUmVzb2x1dGlvbiApIHBlbmFsdHkrKzsKKworICAgaWYoIHBsZi0+bGZXZWlnaHQgIT0gRldfRE9OVENBUkUgKQorICAgeworICAgICAgIHBlbmFsdHkgKz0gYWJzKHBsZi0+bGZXZWlnaHQgLSBwZmktPmRmLmRmV2VpZ2h0KSAvIDQwOworICAgICAgIGlmKCBwbGYtPmxmV2VpZ2h0ID4gcGZpLT5kZi5kZldlaWdodCApIHBmbS0+ZmxhZ3MgfD0gRk9fU1lOVEhfQk9MRDsKKyAgIH0gZWxzZSBpZiggcGZpLT5kZi5kZldlaWdodCA+PSBGV19CT0xEICkgcGVuYWx0eSsrOwkvKiBjaG9vc2Ugbm9ybWFsIGJ5IGRlZmF1bHQgKi8KKworICAgaWYoIHBsZi0+bGZJdGFsaWMgIT0gcGZpLT5kZi5kZkl0YWxpYyApCisgICB7CisgICAgICAgcGVuYWx0eSArPSAweDQ7CisgICAgICAgcGZtLT5mbGFncyB8PSBGT19TWU5USF9JVEFMSUM7CisgICB9CisKKyAgIGlmKCBwbGYtPmxmVW5kZXJsaW5lICkgcGZtLT5mbGFncyB8PSBGT19TWU5USF9VTkRFUkxJTkU7CisgICBpZiggcGxmLT5sZlN0cmlrZU91dCApIHBmbS0+ZmxhZ3MgfD0gRk9fU1lOVEhfU1RSSUtFT1VUOworCisgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCItPiAlaVxuIiwgcGVuYWx0eSApOworCisgICByZXR1cm4gcGVuYWx0eTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIFhGT05UX01hdGNoRklMaXN0CisgKgorICogU2NhbiBhIHBhcnRpY3VsYXIgZm9udCByZXNvdXJjZSBmb3IgdGhlIGJlc3QgbWF0Y2guCisgKi8KK3N0YXRpYyBVSU5UMzIgWEZPTlRfTWF0Y2hGSUxpc3QoIGZvbnRNYXRjaCogcGZtICkKK3sKKyAgQk9PTDMyICAgICAgICBza2lwUmFzdGVyID0gKHBmbS0+ZmxhZ3MgJiBGT19NQVRDSF9OT1JBU1RFUik7CisgIFVJTlQzMiAgICAgICAgY3VycmVudF9zY29yZSwgc2NvcmUgPSAoVUlOVDMyKSgtMSk7CisgIGZvbnRNYXRjaCAgICAgZm0gPSAqcGZtOworCisgIGZvciggZm0ucGZpID0gcGZtLT5wZnItPmZpOyBmbS5wZmkgJiYgc2NvcmU7IGZtLnBmaSA9IGZtLnBmaS0+bmV4dCApCisgIHsKKyAgICAgaWYoIHNraXBSYXN0ZXIgJiYgIShmbS5wZmktPmZpX2ZsYWdzICYgRklfU0NBTEFCTEUpICkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgIGN1cnJlbnRfc2NvcmUgPSBYRk9OVF9NYXRjaCggJmZtICk7CisgICAgIGlmKCBzY29yZSA+IGN1cnJlbnRfc2NvcmUgKQorICAgICB7CisgICAgICAgIG1lbWNweSggcGZtLCAmZm0sIHNpemVvZihmb250TWF0Y2gpICk7CisgICAgICAgIHNjb3JlID0gY3VycmVudF9zY29yZTsKKyAgICAgfQorICB9CisgIHJldHVybiBzY29yZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIFhGT05UX0NoZWNrQWxpYXNUYWJsZQorICovCitzdGF0aWMgTFBTVFIgWEZPTlRfQ2hlY2tBbGlhc1RhYmxlKCBMUFNUUiBscEFsaWFzICkKK3sKKyAgICBmb250QWxpYXMqIGZhOworCisgICAgZm9yKCBmYSA9IGFsaWFzVGFibGU7IGZhOyBmYSA9IGZhLT5uZXh0ICkKKwlpZiggIWxzdHJjbXBpMzJBKCBmYS0+ZmFBbGlhcywgbHBBbGlhcyApICkgcmV0dXJuIGZhLT5mYVR5cGVGYWNlOworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgWEZPTlRfQ2hlY2tGSUxpc3QKKyAqCisgKiBSRU1PVkVfU1VCU0VUUyAtIGF0dGFjaCBuZXcgZmkgYW5kIHB1cmdlIHN1YnNldHMKKyAqIFVOTUFSS19TVUJTRVRTIC0gcmVtb3ZlIHN1YnNldCBmbGFncyBmcm9tIGFsbCBmaSBlbnRyaWVzCisgKi8KK3N0YXRpYyB2b2lkIFhGT05UX0NoZWNrRklMaXN0KCBmb250UmVzb3VyY2UqIGZyLCBmb250SW5mbyogZmksIGludCBhY3Rpb24pCit7CisgIGludAkJaSA9IDA7CisgIGZvbnRJbmZvKiAgICAgcGZpLCAqcHJldjsKKworICBmb3IoIHByZXYgPSBOVUxMLCBwZmkgPSBmci0+Zmk7IHBmaTsgKQorICB7CisgICAgaWYoIGFjdGlvbiA9PSBSRU1PVkVfU1VCU0VUUyApCisgICAgeworICAgICAgICBpZiggcGZpLT5maV9mbGFncyAmIEZJX1NVQlNFVCApCisgICAgICAgIHsKKwkgICAgZm9udEluZm8qIHN1YnNldCA9IHBmaTsKKworCSAgICBpKys7CisJICAgIGZyLT5jb3VudC0tOworICAgICAgICAgICAgaWYoIHByZXYgKSBwcmV2LT5uZXh0ID0gcGZpID0gcGZpLT5uZXh0OworICAgICAgICAgICAgZWxzZSBmci0+ZmkgPSBwZmkgPSBwZmktPm5leHQ7CisJICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBzdWJzZXQgKTsKKwkgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBwZmktPmZpX2ZsYWdzICY9IH5GSV9TVUJTRVQ7CisKKyAgICBwcmV2ID0gcGZpOyAKKyAgICBwZmkgPSBwZmktPm5leHQ7CisgIH0KKworICBpZiggYWN0aW9uID09IFJFTU9WRV9TVUJTRVRTICkJLyogYWxzbyBhZGQgdGhlIHN1cGVyc2V0ICovCisgIHsKKyAgICBpZiggZmktPmZpX2ZsYWdzICYgRklfU0NBTEFCTEUgKQorICAgIHsKKyAgICAgICAgZmktPm5leHQgPSBmci0+Zmk7CisgICAgICAgIGZyLT5maSA9IGZpOworICAgIH0KKyAgICBlbHNlIGlmKCBwcmV2ICkgcHJldi0+bmV4dCA9IGZpOyBlbHNlIGZyLT5maSA9IGZpOworICAgIGZyLT5jb3VudCsrOworICB9CisKKyNpZmRlZiBERUJVR19GT05UX0lOSVQKKyAgaWYoIGkgKSBkcHJpbnRmX2ZvbnQoc3RkZGViLCJcdCAgICBwdXJnZWQgJWkgc3Vic2V0cyBbJWldXG4iLCBpICwgZnItPmNvdW50KTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgWEZPTlRfRmluZEZJTGlzdAorICovCitzdGF0aWMgZm9udFJlc291cmNlKiBYRk9OVF9GaW5kRklMaXN0KCBmb250UmVzb3VyY2UqIHBmciwgY29uc3QgY2hhciogcFR5cGVGYWNlICkKK3sKKyAgd2hpbGUoIHBmciApCisgIHsKKyAgICBpZiggIWxzdHJjbXBpMzJBKCBwZnItPmxmRmFjZU5hbWUsIHBUeXBlRmFjZSApICkgYnJlYWs7CisgICAgcGZyID0gcGZyLT5uZXh0OworICB9CisgIHJldHVybiBwZnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgWEZPTlRfTWF0Y2hEZXZpY2VGb250CisgKgorICogU2NhbiBmb250IHJlc291cmNlIHRyZWUuCisgKi8KK3N0YXRpYyBCT09MMzIgWEZPTlRfTWF0Y2hEZXZpY2VGb250KCBmb250UmVzb3VyY2UqIHN0YXJ0LCBmb250TWF0Y2gqIHBmbSApCit7CisgICAgZm9udE1hdGNoICAgICAgICAgICBmbSA9ICpwZm07CisKKyAgICBwZm0tPnBmaSA9IE5VTEw7CisgICAgaWYoIGZtLnBsZi0+bGZGYWNlTmFtZVswXSApCisgICAgeworCUxQU1RSIHN0ciA9IFhGT05UX0NoZWNrQWxpYXNUYWJsZSggZm0ucGxmLT5sZkZhY2VOYW1lICk7CisgICAgICAgIGZtLnBmciA9IFhGT05UX0ZpbmRGSUxpc3QoIHN0YXJ0LCBzdHIgPyBzdHIgOiBmbS5wbGYtPmxmRmFjZU5hbWUgKTsKKyAgICB9CisKKyAgICBpZiggZm0ucGZyICkgICAgICAgIC8qIG1hdGNoIGZhbWlseSAqLworICAgIHsKKwlkcHJpbnRmX2ZvbnQoc3RkZGViLCAiJXNcbiIsIGZtLnBmci0+bGZGYWNlTmFtZSApOworCisgICAgICAgIFhGT05UX01hdGNoRklMaXN0KCAmZm0gKTsKKyAgICAgICAgKnBmbSA9IGZtOworICAgIH0KKworICAgIGlmKCAhcGZtLT5wZmkgKSAgICAgIC8qIG1hdGNoIGFsbCBhdmFpbGFibGUgZm9udHMgKi8KKyAgICB7CisgICAgICAgIFVJTlQzMiAgICAgICAgICBjdXJyZW50X3Njb3JlLCBzY29yZSA9IChVSU5UMzIpKC0xKTsKKworICAgICAgICBmbS5mbGFncyB8PSBGT19NQVRDSF9QQUY7CisgICAgICAgIGZvciggc3RhcnQgPSBmb250TGlzdDsgc3RhcnQgJiYgc2NvcmU7IHN0YXJ0ID0gc3RhcnQtPm5leHQgKQorICAgICAgICB7CisgICAgICAgICAgICBmbS5wZnIgPSBzdGFydDsKKwkgICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIiVzXG4iLCBmbS5wZnItPmxmRmFjZU5hbWUgKTsKKworICAgICAgICAgICAgY3VycmVudF9zY29yZSA9IFhGT05UX01hdGNoRklMaXN0KCAmZm0gKTsKKyAgICAgICAgICAgIGlmKCBjdXJyZW50X3Njb3JlIDwgc2NvcmUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjb3JlID0gY3VycmVudF9zY29yZTsKKyAgICAgICAgICAgICAgICAqcGZtID0gZm07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgWCBGb250IENhY2hlCisgKi8KK3N0YXRpYyB2b2lkIFhGT05UX0dyb3dGcmVlTGlzdChpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICAvKiBhZGQgYWxsIGVudHJpZXMgZnJvbSAnc3RhcnQnIHVwIHRvIGFuZCBpbmNsdWRpbmcgJ2VuZCcgKi8KKworICAgbWVtc2V0KCBmb250Q2FjaGUgKyBzdGFydCwgMCwgKGVuZCAtIHN0YXJ0ICsgMSkgKiBzaXplb2YoZm9udE9iamVjdCkgKTsKKworICAgZm9udENhY2hlW2VuZF0ubHJ1ID0gZm9udExGOworICAgZm9udENhY2hlW2VuZF0uY291bnQgPSAtMTsKKyAgIGZvbnRMRiA9IHN0YXJ0OworICAgd2hpbGUoIHN0YXJ0IDwgZW5kICkKKyAgIHsKKwlmb250Q2FjaGVbc3RhcnRdLmNvdW50ID0gLTE7CisJZm9udENhY2hlW3N0YXJ0XS5scnUgPSBzdGFydCArIDE7CisJc3RhcnQrKzsKKyAgIH0gCit9CisKK3N0YXRpYyBmb250T2JqZWN0KiBYRk9OVF9Mb29rdXBDYWNoZWRGb250KCBMUExPR0ZPTlQxNiBwbGYsIFVJTlQxNiogY2hlY2tzdW0gKQoreworICAgIFVJTlQxNgljcyA9IF9fbGZDaGVja1N1bSggcGxmICk7CisgICAgaW50CQlpID0gZm9udE1SVSwgcHJldiA9IC0xOworICAgCisgICAqY2hlY2tzdW0gPSBjczsKKyAgICB3aGlsZSggaSA+PSAwICkKKyAgICB7CisJaWYoIGZvbnRDYWNoZVtpXS5sZmNoZWNrc3VtID09IGNzICYmCisJICAhKGZvbnRDYWNoZVtpXS5mb19mbGFncyAmIEZPX1JFTU9WRUQpICkKKwl7CisJICAgIC8qIEZJWE1FOiBzb21ldGhpbmcgbW9yZSBpbnRlbGxpZ2VudCBoZXJlICovCisKKwkgICAgaWYoICFtZW1jbXAoIHBsZiwgJmZvbnRDYWNoZVtpXS5sZiwKKwkJCSBzaXplb2YoTE9HRk9OVDE2KSAtIExGX0ZBQ0VTSVpFICkgJiYKKwkJIWxzdHJuY21waTMyQSggcGxmLT5sZkZhY2VOYW1lLCBmb250Q2FjaGVbaV0ubGYubGZGYWNlTmFtZSwgCisJCQkJCQkJICAgIExGX0ZBQ0VTSVpFICkgKQorCSAgICB7CisJCS8qIHJlbW92ZSB0ZW1wb3JhcmlseSBmcm9tIHRoZSBscnUgbGlzdCAqLworCisJCWlmKCBwcmV2ID49IDAgKQorCQkgICAgZm9udENhY2hlW3ByZXZdLmxydSA9IGZvbnRDYWNoZVtpXS5scnU7CisJCWVsc2UgCisJCSAgICBmb250TVJVID0gKElOVDE2KWZvbnRDYWNoZVtpXS5scnU7CisJCXJldHVybiAoZm9udENhY2hlICsgaSk7CisJICAgIH0KKwl9CisJcHJldiA9IGk7CisJaSA9IChJTlQxNilmb250Q2FjaGVbaV0ubHJ1OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGZvbnRPYmplY3QqIFhGT05UX0dldENhY2hlRW50cnkoKQoreworICAgIGludAkJaTsKKworICAgIGlmKCBmb250TEYgPT0gLTEgKQorICAgIHsKKwlpbnQJcHJldl9pLCBwcmV2X2osIGo7CisKKwlkcHJpbnRmX2ZvbnQoc3RkZGViLCJmb250IGNhY2hlIGlzIGZ1bGxcbiIpOworCisJLyogbG9va3VwIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGZvbnQgKi8KKworCWZvciggcHJldl9pID0gcHJldl9qID0gaiA9IC0xLCBpID0gZm9udE1SVTsgaSA+PSAwOyBpID0gKElOVDE2KWZvbnRDYWNoZVtpXS5scnUgKQorCXsKKwkgICAgaWYoIGZvbnRDYWNoZVtpXS5jb3VudCA8PSAwICYmCisJICAgICAgIShmb250Q2FjaGVbaV0uZm9fZmxhZ3MgJiBGT19TWVNURU0pICkKKwkgICAgeworCQlwcmV2X2ogPSBwcmV2X2k7CisJCWogPSBpOworCSAgICB9CisJICAgIHByZXZfaSA9IGk7CisJfQorCisJaWYoIGogPj0gMCApCS8qIHVubG9hZCBmb250ICovCisJeworCSAgICAvKiBkZXRhY2ggZnJvbSB0aGUgbHJ1IGxpc3QgKi8KKworCSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJcdGZyZWVpbmcgZW50cnkgJWlcbiIsIGogKTsKKworCSAgICBpZiggcHJldl9qID49IDAgKQorCQlmb250Q2FjaGVbcHJldl9qXS5scnUgPSBmb250Q2FjaGVbal0ubHJ1OworCSAgICBlbHNlIGZvbnRNUlUgPSAoSU5UMTYpZm9udENhY2hlW2pdLmxydTsKKworCSAgICAvKiBGSVhNRTogbHBYRm9ybSwgbHBQaXhtYXAgKi8KKwkgICAgWEZyZWVGb250KCBkaXNwbGF5LCBmb250Q2FjaGVbal0uZnMgKTsKKworCSAgICBtZW1zZXQoIGZvbnRDYWNoZSArIGosIDAsIHNpemVvZihmb250T2JqZWN0KSApOworCSAgICByZXR1cm4gKGZvbnRDYWNoZSArIGopOworCX0KKwllbHNlCQkvKiBleHBhbmQgY2FjaGUgKi8KKwl7CisJICAgIGZvbnRPYmplY3QqCW5ld0NhY2hlOworCisJICAgIHByZXZfaSA9IGZvbnRDYWNoZVNpemUgKyBGT05UQ0FDSEU7CisKKwkgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiXHRncm93aW5nIGZvbnQgY2FjaGUgZnJvbSAlaSB0byAlaVxuIiwgZm9udENhY2hlU2l6ZSwgcHJldl9pICk7CisKKwkgICAgaWYoIChuZXdDYWNoZSA9IChmb250T2JqZWN0KilIZWFwUmVBbGxvYyhTeXN0ZW1IZWFwLCAwLCAgCisJCQkJCQkgICAgIGZvbnRDYWNoZSwgcHJldl9pKSkgKQorCSAgICB7CisJCWkgPSBmb250Q2FjaGVTaXplOworCQlmb250Q2FjaGVTaXplICA9IHByZXZfaTsKKwkJZm9udENhY2hlID0gbmV3Q2FjaGU7CisJCVhGT05UX0dyb3dGcmVlTGlzdCggaSwgZm9udENhY2hlU2l6ZSAtIDEpOworCSAgICB9IAorCSAgICBlbHNlIHJldHVybiBOVUxMOworCX0KKyAgICB9CisKKyAgICAvKiBkZXRhY2ggZnJvbSB0aGUgZnJlZSBsaXN0ICovCisKKyAgICBpID0gZm9udExGOworICAgIGZvbnRMRiA9IChJTlQxNilmb250Q2FjaGVbaV0ubHJ1OworICAgIGZvbnRDYWNoZVtpXS5jb3VudCA9IDA7CisgICAgcmV0dXJuIChmb250Q2FjaGUgKyBpKTsKK30KKworc3RhdGljIGludCBYRk9OVF9SZWxlYXNlQ2FjaGVFbnRyeShmb250T2JqZWN0KiBwZm8pCit7CisgICAgVUlOVDMyCXUgPSAoVUlOVDMyKShwZm8gLSBmb250Q2FjaGUpOworCisgICAgaWYoIHUgPCBmb250Q2FjaGVTaXplICkgcmV0dXJuICgtLWZvbnRDYWNoZVt1XS5jb3VudCk7CisgICAgcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYIERldmljZSBGb250IE9iamVjdHMKKyAqLworc3RhdGljIFhfUEhZU0ZPTlQgWEZPTlRfUmVhbGl6ZUZvbnQoIExQTE9HRk9OVDE2IHBsZiApCit7CisgICAgVUlOVDE2CWNoZWNrc3VtOworICAgIGZvbnRPYmplY3QqIHBmbyA9IFhGT05UX0xvb2t1cENhY2hlZEZvbnQoIHBsZiwgJmNoZWNrc3VtICk7CisKKyAgICBpZiggIXBmbyApCisgICAgeworCWZvbnRNYXRjaAlmbSA9IHsgTlVMTCwgTlVMTCwgMCwgMCwgcGxmfTsKKwlJTlQzMgkJaSwgaW5kZXg7CisKKwlpZiggWFRleHRDYXBzICYgVENfU0ZfWF9ZSU5ERVAgKSBmbS5mbGFncyA9IEZPX01BVENIX1hZSU5ERVA7CisKKwkvKiBhbGxvY2F0ZSBuZXcgZm9udCBjYWNoZSBlbnRyeSAqLworCisJaWYoIChwZm8gPSBYRk9OVF9HZXRDYWNoZUVudHJ5KCkpICkKKwl7CisJICAgIExQU1RSCWxwTEZEID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBNQVhfTEZEX0xFTkdUSCApOworCSAgICAKKwkgICAgaWYoIGxwTEZEICkgLyogaW5pdGlhbGl6ZSBlbnRyeSBhbmQgbG9hZCBmb250ICovCisJICAgIHsKKwkJVUlOVDMyCXVSZWxheExldmVsID0gMDsKKworCQlkcHJpbnRmX2ZvbnQoc3RkZGViLCJYUmVhbGl6ZUZvbnQ6ICgldSkgJyVzJyBoPSVpIHdlaWdodD0laSAlc1xuIiwKKwkJCQkgICAgIHBsZi0+bGZDaGFyU2V0LCBwbGYtPmxmRmFjZU5hbWUsIHBsZi0+bGZIZWlnaHQsIAorCQkJCSAgICAgcGxmLT5sZldlaWdodCwgKHBsZi0+bGZJdGFsaWMpID8gIkl0YWxpYyIgOiAiIiApOworCisJCVhGT05UX01hdGNoRGV2aWNlRm9udCggZm9udExpc3QsICZmbSApOworCisJCXBmby0+ZnIgPSBmbS5wZnI7CisJCXBmby0+ZmkgPSBmbS5wZmk7CisJCXBmby0+Zm9fZmxhZ3MgPSBmbS5mbGFncyAmIH5GT19NQVRDSF9NQVNLOworCisJCW1lbWNweSggJnBmby0+bGYsIHBsZiwgc2l6ZW9mKExPR0ZPTlQxNikgKTsKKwkJcGZvLT5sZmNoZWNrc3VtID0gY2hlY2tzdW07CisKKwkJZG8KKwkJeworCQkgICAgTEZEX0NvbXBvc2VMRkQoIHBmbywgZm0uaGVpZ2h0LCBscExGRCwgdVJlbGF4TGV2ZWwrKyApOworCQkgICAgaWYoIChwZm8tPmZzID0gWExvYWRRdWVyeUZvbnQoIGRpc3BsYXksIGxwTEZEICkpICkgYnJlYWs7CisJCX0gd2hpbGUoIHVSZWxheExldmVsICk7CisKKwkJaWYoIFhGT05UX0dldExlYWRpbmcoICZwZm8tPmZpLT5kZiwgcGZvLT5mcywgJmksIE5VTEwgKSApCisJCSAgICBwZm8tPmZvQXZnQ2hhcldpZHRoID0gKElOVDE2KXBmby0+ZnMtPnBlcl9jaGFyWydYJyAtIHBmby0+ZnMtPm1pbl9jaGFyX29yX2J5dGUyXS53aWR0aDsKKwkJZWxzZQorCQkgICAgcGZvLT5mb0F2Z0NoYXJXaWR0aCA9IChJTlQxNilYRk9OVF9HZXRBdmdDaGFyV2lkdGgoICZwZm8tPmZpLT5kZiwgcGZvLT5mcyApOworCQlwZm8tPmZvSW50ZXJuYWxMZWFkaW5nID0gKElOVDE2KWk7CisKKwkJLyogRklYTUU6IElmIHdlJ3ZlIGdvdCBhIHNvZnQgZm9udCBvcgorCQkgKiB0aGVyZSBhcmUgRk9fU1lOVEhfLi4uIGZsYWdzIGZvciB0aGUKKwkJICogbm9uIFBST09GX1FVQUxJVFkgcmVxdWVzdCwgdGhlIGVuZ2luZQorCQkgKiBzaG91bGQgcmFzdGVyaXplIGNoYXJhY3RlcnMgaW50byBtb25vCisJCSAqIHBpeG1hcHMgYW5kIHN0b3JlIHRoZW0gaW4gdGhlIHBmby0+bHBQaXhtYXAKKwkJICogYXJyYXkgKHBmby0+ZnMgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgd2VsbCkuCisJCSAqIFgxMURSVl9FeHRUZXh0T3V0KCkgbXVzdCBiZSBoZWF2aWx5IG1vZGlmaWVkIAorCQkgKiB0byBzdXBwb3J0IHBpeG1hcCBibGl0dGluZyBhbmQgRk9fU1lOVEhfLi4uCisJCSAqIHN0eWxlcy4KKwkJICovCisKKwkJcGZvLT5scFhGb3JtID0gTlVMTDsKKwkJcGZvLT5scFBpeG1hcCA9IE5VTEw7CisKKwkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwTEZEICk7CisJICAgIH0gCisJICAgIGVsc2UgLyogYXR0YWNoIGJhY2sgdG8gdGhlIGZyZWUgbGlzdCAqLworCSAgICB7CisJCXBmby0+Y291bnQgPSAtMTsKKwkJcGZvLT5scnUgPSBmb250TEY7CisJCWZvbnRMRiA9IChwZm8gLSBmb250Q2FjaGUpOworCQlwZm8gPSBOVUxMOworCSAgICB9CisJfQorCisJaWYoICFwZm8gKSAvKiBjb3VsZG4ndCBnZXQgYSBuZXcgZW50cnksIGdldCBvbmUgb2YgdGhlIGNhY2hlZCBmb250cyAqLworCXsKKwkgICAgVUlOVDMyCQljdXJyZW50X3Njb3JlLCBzY29yZSA9IChVSU5UMzIpKC0xKTsKKworCSAgICBpID0gaW5kZXggPSBmb250TVJVOyAKKwkgICAgZm0uZmxhZ3MgfD0gRk9fTUFUQ0hfUEFGOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKwkJcGZvID0gZm9udENhY2hlICsgaTsKKwkJZm0ucGZyID0gcGZvLT5mcjsgZm0ucGZpID0gcGZvLT5maTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRfc2NvcmUgPSBYRk9OVF9NYXRjaCggJmZtICk7CisgICAgICAgICAgICAgICAgaWYoIGN1cnJlbnRfc2NvcmUgPCBzY29yZSApIGluZGV4ID0gaTsKKworCSAgICAgICAgaSA9ICBwZm8tPmxydTsKKyAgICAgICAgICAgIH0gd2hpbGUoIGkgPj0gMCApOworCSAgICBwZm8gPSBmb250Q2FjaGUgKyBpbmRleDsKKwkgICAgcGZvLT5jb3VudCsrOworCSAgICByZXR1cm4gKFhfUEhZU0ZPTlQpKFhfUEZPTlRfTUFHSUMgfCBpbmRleCk7CisJfQorICAgIH0KKyAKKyAgICAvKiBhdHRhY2ggYXQgdGhlIGhlYWQgb2YgdGhlIGxydSBsaXN0ICovCisKKyAgICBwZm8tPmNvdW50Kys7CisgICAgcGZvLT5scnUgPSBmb250TVJVOworICAgIGZvbnRNUlUgPSAocGZvIC0gZm9udENhY2hlKTsKKworICAgIGRwcmludGZfZm9udChzdGRkZWIsInBoeXNmb250ICVpXG4iLCBmb250TVJVKTsKKworICAgIHJldHVybiAoWF9QSFlTRk9OVCkoWF9QRk9OVF9NQUdJQyB8IGZvbnRNUlUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYRk9OVF9HZXRGb250T2JqZWN0CisgKi8KK2ZvbnRPYmplY3QqIFhGT05UX0dldEZvbnRPYmplY3QoIFhfUEhZU0ZPTlQgcEZvbnQgKQoreworICAgIGlmKCBDSEVDS19QRk9OVChwRm9udCkgKSByZXR1cm4gX19QRk9OVChwRm9udCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFhGT05UX0dldEZvbnRTdHJ1Y3QKKyAqLworWEZvbnRTdHJ1Y3QqIFhGT05UX0dldEZvbnRTdHJ1Y3QoIFhfUEhZU0ZPTlQgcEZvbnQgKQoreworICAgIGlmKCBDSEVDS19QRk9OVChwRm9udCkgKSByZXR1cm4gX19QRk9OVChwRm9udCktPmZzOworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYRk9OVF9HZXRGb250SW5mbworICovCitMUElGT05USU5GTzE2IFhGT05UX0dldEZvbnRJbmZvKCBYX1BIWVNGT05UIHBGb250ICkKK3sKKyAgICBpZiggQ0hFQ0tfUEZPTlQocEZvbnQpICkgcmV0dXJuICYoX19QRk9OVChwRm9udCktPmZpLT5kZik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworCisvKiBYMTFEUlYgSW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhwb3NlZCB2aWEgdGhlIGRjLT5mdW5jcyBkaXNwYXRjaCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFgxMURSVl9GT05UX1NlbGVjdE9iamVjdAorICovCitIRk9OVDMyIFgxMURSVl9GT05UX1NlbGVjdE9iamVjdCggREMqIGRjLCBIRk9OVDMyIGhmb250LCBGT05UT0JKKiBmb250ICkKK3sKKyAgICBIRk9OVDMyIGhQcmV2Rm9udCA9IDA7CisKKyAgICBpZiggQ0hFQ0tfUEZPTlQoZGMtPnUueC5mb250KSApIAorICAgICAgICBYRk9OVF9SZWxlYXNlQ2FjaGVFbnRyeSggX19QRk9OVChkYy0+dS54LmZvbnQpICk7CisKKyAgICBkYy0+dS54LmZvbnQgPSBYRk9OVF9SZWFsaXplRm9udCggJmZvbnQtPmxvZ2ZvbnQgKTsKKyAgICBoUHJldkZvbnQgPSBkYy0+dy5oRm9udDsKKyAgICBkYy0+dy5oRm9udCA9IGhmb250OworCisgICAgcmV0dXJuIGhQcmV2Rm9udDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgICAgICAgWDExRFJWX0VudW1EZXZpY2VGb250cworICovCitCT09MMzIJWDExRFJWX0VudW1EZXZpY2VGb250cyggREMqIGRjLCBMUExPR0ZPTlQxNiBwbGYsIAorCQkJCSAgICAgICAgREVWSUNFRk9OVEVOVU1QUk9DIHByb2MsIExQQVJBTSBscCApCit7CisgICAgRU5VTUxPR0ZPTlRFWDE2CWxmOworICAgIE5FV1RFWFRNRVRSSUMxNgl0bTsKKyAgICBmb250UmVzb3VyY2UqIAlwZnIgPSBmb250TGlzdDsKKyAgICBCT09MMzIJICAJYiwgYlJldCA9IDA7CisKKyAgICBpZiggcGxmLT5sZkZhY2VOYW1lWzBdICkKKyAgICB7CisJcGZyID0gWEZPTlRfRmluZEZJTGlzdCggcGZyLCBwbGYtPmxmRmFjZU5hbWUgKTsKKwlpZiggcGZyICkKKwl7CisJICAgIGZvbnRJbmZvKglwZmk7CisJICAgIGZvciggcGZpID0gcGZyLT5maTsgcGZpOyBwZmkgPSBwZmktPm5leHQgKQorCQlpZiggKGIgPSAoKnByb2MpKCAoTFBFTlVNTE9HRk9OVDE2KSZsZiwgJnRtLCAKKwkJCVhGT05UX0dldEZvbnRNZXRyaWMoIHBmaSwgJmxmLCAmdG0gKSwgbHAgKSkgKQorCQkgICAgIGJSZXQgPSBiOworCQllbHNlIGJyZWFrOworCX0KKyAgICB9CisgICAgZWxzZQorCWZvciggOyBwZnIgOyBwZnIgPSBwZnItPm5leHQgKQorCSAgICBpZiggKGIgPSAoKnByb2MpKCAoTFBFTlVNTE9HRk9OVDE2KSZsZiwgJnRtLCAKKwkJICAgICAgIFhGT05UX0dldEZvbnRNZXRyaWMoIHBmci0+ZmksICZsZiwgJnRtICksIGxwICkpICkKKwkJIGJSZXQgPSBiOworCSAgICBlbHNlIGJyZWFrOworCisgICAgcmV0dXJuIGJSZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgWDExRFJWX0dldFRleHRFeHRlbnRQb2ludAorICovCitCT09MMzIgWDExRFJWX0dldFRleHRFeHRlbnRQb2ludCggREMgKmRjLCBMUENTVFIgc3RyLCBJTlQzMiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNJWkUzMiBzaXplICkKK3sKKyAgICBYRm9udFN0cnVjdCogcGZzID0gWEZPTlRfR2V0Rm9udFN0cnVjdCggZGMtPnUueC5mb250ICk7CisgICAgaWYoIHBmcyApCisgICAgeworCWludCBkaXIsIGFzY2VudCwgZGVzY2VudDsKKwlYQ2hhclN0cnVjdCBpbmZvOworCisJWFRleHRFeHRlbnRzKCBwZnMsIHN0ciwgY291bnQsICZkaXIsICZhc2NlbnQsICZkZXNjZW50LCAmaW5mbyApOworCXNpemUtPmN4ID0gYWJzKChpbmZvLndpZHRoICsgZGMtPncuYnJlYWtSZW0gKyBjb3VudCAqIGRjLT53LmNoYXJFeHRyYSkKKwkJCQkJCSogZGMtPnduZEV4dFggLyBkYy0+dnBvcnRFeHRYKTsKKwlzaXplLT5jeSA9IGFicygocGZzLT5hc2NlbnQgKyBwZnMtPmRlc2NlbnQpICogZGMtPnduZEV4dFkgLyBkYy0+dnBvcnRFeHRZKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFgxMURSVl9HZXRUZXh0TWV0cmljcworICovCitCT09MMzIgWDExRFJWX0dldFRleHRNZXRyaWNzKERDICpkYywgVEVYVE1FVFJJQzMyQSAqbWV0cmljcykKK3sKKyAgICBpZiggQ0hFQ0tfUEZPTlQoZGMtPnUueC5mb250KSApCisgICAgeworCWZvbnRPYmplY3QqIHBmbyA9IF9fUEZPTlQoZGMtPnUueC5mb250KTsKKwlYRk9OVF9HZXRUZXh0TWV0cmljKCBwZm8sIG1ldHJpY3MgKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFgxMURSVl9HZXRDaGFyV2lkdGgKKyAqLworQk9PTDMyIFgxMURSVl9HZXRDaGFyV2lkdGgoIERDICpkYywgVUlOVDMyIGZpcnN0Q2hhciwgVUlOVDMyIGxhc3RDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQSU5UMzIgYnVmZmVyICkKK3sKKyAgICBYRm9udFN0cnVjdCogeGZzID0gWEZPTlRfR2V0Rm9udFN0cnVjdCggZGMtPnUueC5mb250ICk7CisKKyAgICBpZiggeGZzICkKKyAgICB7CisJaW50IGk7CisKKwlpZiAoeGZzLT5wZXJfY2hhciA9PSBOVUxMKQorCSAgICBmb3IgKGkgPSBmaXJzdENoYXI7IGkgPD0gbGFzdENoYXI7IGkrKykKKwkJKmJ1ZmZlcisrID0geGZzLT5taW5fYm91bmRzLndpZHRoOworCWVsc2UKKwl7CisJICAgIFhDaGFyU3RydWN0ICpjcywgKmRlZjsKKwkgICAgc3RhdGljIFhDaGFyU3RydWN0CV9fbnVsbF9jaGFyID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisKKwkgICAgQ0lfR0VUX0NIQVJfSU5GTyh4ZnMsIHhmcy0+ZGVmYXVsdF9jaGFyLCAmX19udWxsX2NoYXIsIGRlZik7CisKKwkgICAgZm9yIChpID0gZmlyc3RDaGFyOyBpIDw9IGxhc3RDaGFyOyBpKyspCisJICAgIHsKKwkJaWYgKGkgPj0geGZzLT5taW5fY2hhcl9vcl9ieXRlMiAmJiBpIDw9IHhmcy0+bWF4X2NoYXJfb3JfYnl0ZTIpCisJCXsKKwkJICAgIGNzID0gJnhmcy0+cGVyX2NoYXJbKGkgLSB4ZnMtPm1pbl9jaGFyX29yX2J5dGUyKV07IAorCQkgICAgaWYgKENJX05PTkVYSVNUQ0hBUihjcykpIGNzID0gZGVmOyAKKyAgCQl9IGVsc2UgY3MgPSBkZWY7CisJCSpidWZmZXIrKyA9IE1BWCggY3MtPndpZHRoLCAwICk7CisJICAgIH0KKwl9CisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJCQkJICAgICAgICoKKyAqICAgICAgICAgICBGb250IFJlc291cmNlIEFQSQkJCQkJICAgICAgICoKKyAqCQkJCQkJCQkgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQWRkRm9udFJlc291cmNlMTYgICAgKEdESS4xMTkpCisgKgorICogIENhbiBiZSBlaXRoZXIgLkZPTiwgb3IgLkZOVCwgb3IgLlRURiwgb3IgLkZPVCBmb250IGZpbGUuCisgKgorICogIEZJWE1FOiBMb2FkIGhlYWRlciBhbmQgZmluZCB0aGUgYmVzdC1tYXRjaGluZyBmb250IGluIHRoZSBmb250TGlzdDsKKyAqIAkgICBmaXh1cCBkZlBvaW50cyBpZiBhbGwgbWV0cmljcyBhcmUgaWRlbnRpY2FsLCBvdGhlcndpc2UgY3JlYXRlCisgKgkgICBuZXcgZm9udEFsaWFzLiBXaGVuIHNvZnQgZm9udCBzdXBwb3J0IGlzIHJlYWR5IHRoaXMgd2lsbAorICoJICAgc2ltcGx5IGNyZWF0ZSBhIG5ldyBmb250UmVzb3VyY2UgKCdmaWxlbmFtZScgd2lsbCBnbyBpbnRvCisgKgkgICB0aGUgcGZyLT5yZXNvdXJjZSBmaWVsZCkgd2l0aCBGUl9TT0ZURk9OVC9GUl9TT0ZUUkVTT1VSQ0UgCisgKgkgICBmbGFnIHNldC4gCisgKi8KK0lOVDE2IEFkZEZvbnRSZXNvdXJjZTE2KCBMUENTVFIgZmlsZW5hbWUgKQoreworICAgIHJldHVybiBBZGRGb250UmVzb3VyY2UzMkEoIGZpbGVuYW1lICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQWRkRm9udFJlc291cmNlMzJBICAgIChHREkzMi4yKQorICovCitJTlQzMiBBZGRGb250UmVzb3VyY2UzMkEoIExQQ1NUUiBzdHIgKQoreworICAgIGlmIChISVdPUkQoc3RyKSkJLyogZm9udCBmaWxlICovCisgICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBBZGRGb250UmVzb3VyY2UoJyVzJylcbiIsIHN0ciApOworICAgIGVsc2UJCS8qIGZvbnQgcmVzb3VyY2UgaGFuZGxlICovCisgICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBBZGRGb250UmVzb3VyY2UoJTA0eClcbiIsIExPV09SRChzdHIpICk7CisgICAgcmV0dXJuIDE7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQWRkRm9udFJlc291cmNlMzJXICAgIChHREkzMi40KQorICovCitJTlQzMiBBZGRGb250UmVzb3VyY2UzMlcoIExQQ1dTVFIgc3RyICkKK3sKKyAgICBmcHJpbnRmKCBzdGRuaW1wLCAiU1RVQjogQWRkRm9udFJlc291cmNlMzJXKCVwKVxuIiwgc3RyICk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJlbW92ZUZvbnRSZXNvdXJjZTE2ICAgIChHREkuMTM2KQorICovCitCT09MMTYgUmVtb3ZlRm9udFJlc291cmNlMTYoIExQQ1NUUiBzdHIgKQoreworICAgIHJldHVybiBSZW1vdmVGb250UmVzb3VyY2UzMkEoIHN0ciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJlbW92ZUZvbnRSZXNvdXJjZTMyQSAgICAoR0RJMzIuMjg0KQorICovCitCT09MMzIgUmVtb3ZlRm9udFJlc291cmNlMzJBKCBMUENTVFIgc3RyICkKK3sKKyAgICBpZiAoSElXT1JEKHN0cikpCisgICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBSZW1vdmVGb250UmVzb3VyY2UoJyVzJylcbiIsIHN0ciApOworICAgIGVsc2UKKyAgICAgICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IFJlbW92ZUZvbnRSZXNvdXJjZSglMDR4KVxuIiwgTE9XT1JEKHN0cikgKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZW1vdmVGb250UmVzb3VyY2UzMlcgICAgKEdESTMyLjI4NikKKyAqLworQk9PTDMyIFJlbW92ZUZvbnRSZXNvdXJjZTMyVyggTFBDV1NUUiBzdHIgKQoreworICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBSZW1vdmVGb250UmVzb3VyY2UzMlcoJXApXG4iLCBzdHIgKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCmRpZmYgLS1naXQgYS9pZjE2MzIvYWR2YXBpMzIuc3BlYyBiL2lmMTYzMi9hZHZhcGkzMi5zcGVjCmluZGV4IGZiNTg0ZTQuLjRhODg2NDEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9hZHZhcGkzMi5zcGVjCisrKyBiL2lmMTYzMi9hZHZhcGkzMi5zcGVjCkBAIC0xLDYgKzEsNiBAQAogbmFtZQlhZHZhcGkzMgogdHlwZQl3aW4zMgotYmFzZQkxCitiYXNlCTAKIAogMDAwMCBzdHViIEFib3J0U3lzdGVtU2h1dGRvd25BCiAwMDAxIHN0dWIgQWJvcnRTeXN0ZW1TaHV0ZG93blcKQEAgLTE0LDcgKzE0LDcgQEAKIDAwMDkgc3R1YiBBZGp1c3RUb2tlbkdyb3VwcwogMDAxMCBzdHViIEFkanVzdFRva2VuUHJpdmlsZWdlcwogMDAxMSBzdGRjYWxsIEFsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZChwdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBBbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQKLTAwMTIgc3R1YiBBbGxvY2F0ZUxvY2FsbHlVbmlxdWVJZAorMDAxMiBzdGRjYWxsIEFsbG9jYXRlTG9jYWxseVVuaXF1ZUlkKHB0cikgQWxsb2NhdGVMb2NhbGx5VW5pcXVlSWQKIDAwMTMgc3R1YiBBcmVBbGxBY2Nlc3Nlc0dyYW50ZWQKIDAwMTQgc3R1YiBBcmVBbnlBY2Nlc3Nlc0dyYW50ZWQKIDAwMTUgc3R1YiBCYWNrdXBFdmVudExvZ0EKQEAgLTY4LDcgKzY4LDcgQEAKIDAwNjMgc3RkY2FsbCBHZXRTaWRMZW5ndGhSZXF1aXJlZChsb25nKSBHZXRTaWRMZW5ndGhSZXF1aXJlZAogMDA2NCBzdGRjYWxsIEdldFNpZFN1YkF1dGhvcml0eShwdHIgbG9uZykgR2V0U2lkU3ViQXV0aG9yaXR5CiAwMDY1IHN0ZGNhbGwgR2V0U2lkU3ViQXV0aG9yaXR5Q291bnQocHRyKSBHZXRTaWRTdWJBdXRob3JpdHlDb3VudAotMDA2NiBzdHViIEdldFRva2VuSW5mb3JtYXRpb24KKzAwNjYgc3RkY2FsbCBHZXRUb2tlbkluZm9ybWF0aW9uKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIpIEdldFRva2VuSW5mb3JtYXRpb24KIDAwNjcgc3RkY2FsbCBHZXRVc2VyTmFtZUEocHRyIHB0cikgR2V0VXNlck5hbWUzMkEKIDAwNjggc3RkY2FsbCBHZXRVc2VyTmFtZVcocHRyIHB0cikgR2V0VXNlck5hbWUzMlcKIDAwNjkgc3R1YiBJbXBlcnNvbmF0ZUxvZ2dlZE9uVXNlcgpAQCAtMTEyLDExICsxMTIsMTEgQEAKIDAxMDcgc3R1YiBPcGVuRXZlbnRMb2dBCiAwMTA4IHN0dWIgT3BlbkV2ZW50TG9nVwogMDEwOSBzdGRjYWxsIE9wZW5Qcm9jZXNzVG9rZW4obG9uZyBsb25nIHB0cikgT3BlblByb2Nlc3NUb2tlbgotMDExMCBzdHViIE9wZW5TQ01hbmFnZXJBCi0wMTExIHN0dWIgT3BlblNDTWFuYWdlclcKKzAxMTAgc3RkY2FsbCBPcGVuU0NNYW5hZ2VyQShwdHIgcHRyIGxvbmcpIE9wZW5TQ01hbmFnZXJBCiswMTExIHN0ZGNhbGwgT3BlblNDTWFuYWdlclcocHRyIHB0ciBsb25nKSBPcGVuU0NNYW5hZ2VyVwogMDExMiBzdHViIE9wZW5TZXJ2aWNlQQogMDExMyBzdHViIE9wZW5TZXJ2aWNlVwotMDExNCBzdHViIE9wZW5UaHJlYWRUb2tlbgorMDExNCBzdGRjYWxsIE9wZW5UaHJlYWRUb2tlbihsb25nIGxvbmcgbG9uZyBwdHIpIE9wZW5UaHJlYWRUb2tlbgogMDExNSBzdHViIFByaXZpbGVnZUNoZWNrCiAwMTE2IHN0dWIgUHJpdmlsZWdlZFNlcnZpY2VBdWRpdEFsYXJtQQogMDExNyBzdHViIFByaXZpbGVnZWRTZXJ2aWNlQXVkaXRBbGFybVcKQEAgLTE4OCw3ICsxODgsNyBAQAogMDE4MyBzdHViIFNldEZpbGVTZWN1cml0eVcKIDAxODQgc3R1YiBTZXRLZXJuZWxPYmplY3RTZWN1cml0eQogMDE4NSBzdHViIFNldFByaXZhdGVPYmplY3RTZWN1cml0eQotMDE4NiBzdHViIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2wKKzAxODYgc3RkY2FsbCBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKHB0ciBsb25nIHB0ciBsb25nKSBSdGxTZXREYWNsU2VjdXJpdHlEZXNjcmlwdG9yCiAwMTg3IHN0dWIgU2V0U2VjdXJpdHlEZXNjcmlwdG9yR3JvdXAKIDAxODggc3R1YiBTZXRTZWN1cml0eURlc2NyaXB0b3JPd25lcgogMDE4OSBzdHViIFNldFNlY3VyaXR5RGVzY3JpcHRvclNhY2wKZGlmZiAtLWdpdCBhL2lmMTYzMi9idWlsdGluLmMgYi9pZjE2MzIvYnVpbHRpbi5jCmluZGV4IDQ0Yjg2ZWUuLjI4OGUzNjMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9idWlsdGluLmMKKysrIGIvaWYxNjMyL2J1aWx0aW4uYwpAQCAtMTQ4LDkgKzE0OCw5IEBACiAgICAgLyogV2luMzIgRExMcyAqLwogICAgIHsgJkFEVkFQSTMyX0Rlc2NyaXB0b3IsIDAgfSwKICAgICB7ICZDT01DVEwzMl9EZXNjcmlwdG9yLCBETExfRkxBR19OT1RfVVNFRCB9LAotICAgIHsgJkNPTURMRzMyX0Rlc2NyaXB0b3IsIDAgfSwKKyAgICB7ICZDT01ETEczMl9EZXNjcmlwdG9yLCBETExfRkxBR19OT1RfVVNFRCB9LAogICAgIHsgJkNSVERMTF9EZXNjcmlwdG9yLCAgIDAgfSwKLSAgICB7ICZPTEUzMl9EZXNjcmlwdG9yLCAgICAwIH0sCisgICAgeyAmT0xFMzJfRGVzY3JpcHRvciwgICAgRExMX0ZMQUdfTk9UX1VTRUQgfSwKICAgICB7ICZHREkzMl9EZXNjcmlwdG9yLCAgICAwIH0sCiAgICAgeyAmS0VSTkVMMzJfRGVzY3JpcHRvciwgRExMX0ZMQUdfQUxXQVlTX1VTRUQgfSwKICAgICB7ICZMWjMyX0Rlc2NyaXB0b3IsICAgICAwIH0sCmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpMzIuc3BlYyBiL2lmMTYzMi9nZGkzMi5zcGVjCmluZGV4IDkwYjUwMmMuLjdlNjEzMWUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkzMi5zcGVjCisrKyBiL2lmMTYzMi9nZGkzMi5zcGVjCkBAIC0xNDQsNyArMTQ0LDcgQEAKIDAxMzYgc3R1YiBHZGlQbGF5U2NyaXB0CiAwMTM3IHN0dWIgR2RpUmVsZWFzZUxvY2FsREMKIDAxMzggc3R1YiBHZGlTZXRBdHRycwotMDEzOSBzdHViIEdkaVNldEJhdGNoTGltaXQKKzAxMzkgcmV0dXJuIEdkaVNldEJhdGNoTGltaXQgNCAxCiAwMTQwIHN0dWIgR2RpU2V0U2VydmVyQXR0cgogMDE0MSBzdHViIEdldEFyY0RpcmVjdGlvbgogMDE0MiBzdHViIEdldEFzcGVjdFJhdGlvRmlsdGVyRXgKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwuc3BlYyBiL2lmMTYzMi9rZXJuZWwuc3BlYwppbmRleCAzNzIxNzM3Li5hZjM3NjFjIDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbC5zcGVjCkBAIC0yMjUsNyArMjI1LDcgQEAKIDIyNyBwYXNjYWwgICBSZWdGbHVzaEtleShsb25nKSBSZWdGbHVzaEtleQogMjI4IHN0dWIgSzIyOAogMjI5IHN0dWIgSzIyOQotMjMwIHN0dWIgR2xvYmFsU21hcnRQYWdlTG9jaworMjMwIHBhc2NhbCBHbG9iYWxTbWFydFBhZ2VMb2NrKHdvcmQpIEdsb2JhbFBhZ2VMb2NrICM/CiAyMzEgc3R1YiBHbG9iYWxTbWFydFBhZ2VVbmxvY2sKIDIzMiBzdHViIFJlZ0xvYWRLZXkKIDIzMyBzdHViIFJlZ1VubG9hZEtleQpAQCAtMjQzLDggKzI0Myw4IEBACiAzMTkgc3R1YiBGbHVzaENhY2hlZEZpbGVIYW5kbGUKIDMyMCBwYXNjYWwxNiBJc1Rhc2sod29yZCkgSXNUYXNrCiAzMjMgcmV0dXJuIElzUm9tTW9kdWxlIDIgMAotMzI0IHN0dWIgTG9nRXJyb3IKLTMyNSBzdHViIExvZ1BhcmFtRXJyb3IKKzMyNCBwYXNjYWwxNiBMb2dFcnJvcih3b3JkIHB0cikgTG9nRXJyb3IKKzMyNSBwYXNjYWwxNiBMb2dQYXJhbUVycm9yKHdvcmQgcHRyIHB0cikgTG9nUGFyYW1FcnJvcgogMzI2IHJldHVybiBJc1JvbUZpbGUgMiAwCiAzMjcgc3R1YiBLRVJORUxfMzI3CiAzMjggc3R1YiBfRGVidWdPdXRwdXQKQEAgLTMyMCw3ICszMjAsNyBAQAogNTE0IHN0dWIgRnJlZUxpYnJhcnkzMlcKIDUxNSBwYXNjYWwgR2V0UHJvY0FkZHJlc3MzMlcobG9uZyBwdHIpIEdldFByb2NBZGRyZXNzMzIKIDUxNiBzdHViIEdldFZETVBvaW50ZXIzMlcKLTUxNyBzdHViIENhbGxQcm9jMzJXCis1MTcgcGFzY2FsIENhbGxQcm9jMzJXKCkgV0lOMTZfQ2FsbFByb2MzMlcKIDUxOCBzdHViIENhbGxQcm9jRXgzMlcKIDUxOSBzdHViIEtFUk5FTF81MTkKIDUyMiBzdHViIEtFUk5FTF81MjIKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwzMi5zcGVjIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKaW5kZXggMjNkNGYzMS4uYTA4MDY3MCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKQEAgLTIsNjg3ICsyLDg0MSBAQAogdHlwZQl3aW4zMgogYmFzZQkxCiAKLTAwMDAgc3RkY2FsbCBBZGRBdG9tQShwdHIpIEFkZEF0b20zMkEKLTAwMDEgc3RkY2FsbCBBZGRBdG9tVyhwdHIpIEFkZEF0b20zMlcKLTAwMDIgc3R1YiBBZGRDb25zb2xlQWxpYXNBCi0wMDAzIHN0dWIgQWRkQ29uc29sZUFsaWFzVwotMDAwNCBzdHViIEFsbG9jQ29uc29sZQotMDAwNSBzdGRjYWxsIEFyZUZpbGVBcGlzQU5TSSgpIEFyZUZpbGVBcGlzQU5TSQotMDAwNiBzdHViIEJhY2t1cFJlYWQKLTAwMDcgc3R1YiBCYWNrdXBTZWVrCi0wMDA4IHN0dWIgQmFja3VwV3JpdGUKLTAwMDkgc3R1YiBCYXNlQXR0YWNoQ29tcGxldGVUaHVuawotMDAxMCBzdHViIEJhc2VwRGVidWdEdW1wCi0wMDExIHN0ZGNhbGwgQmVlcChsb25nIGxvbmcpIEJlZXAKLTAwMTIgc3R1YiBCZWdpblVwZGF0ZVJlc291cmNlQQotMDAxMyBzdHViIEJlZ2luVXBkYXRlUmVzb3VyY2VXCi0wMDE0IHN0ZGNhbGwgQnVpbGRDb21tRENCQShwdHIgcHRyKSBCdWlsZENvbW1EQ0IzMkEKLTAwMTUgc3RkY2FsbCBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EocHRyIHB0ciBwdHIpIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzMzJBCi0wMDE2IHN0ZGNhbGwgQnVpbGRDb21tRENCQW5kVGltZW91dHNXKHB0ciBwdHIgcHRyKSBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0czMyVwotMDAxNyBzdGRjYWxsIEJ1aWxkQ29tbURDQlcocHRyIHB0cikgQnVpbGRDb21tRENCMzJXCi0wMDE4IHN0dWIgQ2FsbE5hbWVkUGlwZUEKLTAwMTkgc3R1YiBDYWxsTmFtZWRQaXBlVwotMDAyMCBzdGRjYWxsIENsZWFyQ29tbUJyZWFrKGxvbmcpIENsZWFyQ29tbUJyZWFrMzIKLTAwMjEgc3RkY2FsbCBDbGVhckNvbW1FcnJvcihsb25nIHB0ciBwdHIpIENsZWFyQ29tbUVycm9yCi0wMDIyIHN0dWIgQ2xvc2VDb25zb2xlSGFuZGxlCi0wMDIzIHN0ZGNhbGwgQ2xvc2VIYW5kbGUobG9uZykgQ2xvc2VIYW5kbGUKLTAwMjQgc3R1YiBDbG9zZVByb2ZpbGVVc2VyTWFwcGluZwotMDAyNSBzdHViIENtZEJhdE5vdGlmaWNhdGlvbgotMDAyNiBzdHViIENvbW1Db25maWdEaWFsb2dBCi0wMDI3IHN0dWIgQ29tbUNvbmZpZ0RpYWxvZ1cKLTAwMjggc3RkY2FsbCBDb21wYXJlRmlsZVRpbWUocHRyIHB0cikgQ29tcGFyZUZpbGVUaW1lCi0wMDI5IHN0ZGNhbGwgQ29tcGFyZVN0cmluZ0EobG9uZyBsb25nIHB0ciBsb25nIHB0ciBsb25nKSBDb21wYXJlU3RyaW5nMzJBCi0wMDMwIHN0ZGNhbGwgQ29tcGFyZVN0cmluZ1cobG9uZyBsb25nIHB0ciBsb25nIHB0ciBsb25nKSBDb21wYXJlU3RyaW5nMzJXCi0wMDMxIHN0dWIgQ29ubmVjdE5hbWVkUGlwZQotMDAzMiBzdHViIENvbnNvbGVNZW51Q29udHJvbAotMDAzMyBzdHViIENvbnNvbGVTdWJzdAotMDAzNCBzdHViIENvbnRpbnVlRGVidWdFdmVudAotMDAzNSBzdHViIENvbnZlcnREZWZhdWx0TG9jYWxlCi0wMDM2IHN0ZGNhbGwgQ29weUZpbGVBKHB0ciBwdHIgbG9uZykgQ29weUZpbGUzMkEKLTAwMzcgc3RkY2FsbCBDb3B5RmlsZVcocHRyIHB0ciBsb25nKSBDb3B5RmlsZTMyVwotMDAzOCBzdHViIENyZWF0ZUNvbnNvbGVTY3JlZW5CdWZmZXIKLTAwMzkgc3RkY2FsbCBDcmVhdGVEaXJlY3RvcnlBKHB0ciBwdHIpIENyZWF0ZURpcmVjdG9yeTMyQQotMDA0MCBzdGRjYWxsIENyZWF0ZURpcmVjdG9yeUV4QShwdHIgcHRyIHB0cikgQ3JlYXRlRGlyZWN0b3J5RXgzMkEKLTAwNDEgc3RkY2FsbCBDcmVhdGVEaXJlY3RvcnlFeFcocHRyIHB0ciBwdHIpIENyZWF0ZURpcmVjdG9yeUV4MzJXCi0wMDQyIHN0ZGNhbGwgQ3JlYXRlRGlyZWN0b3J5VyhwdHIgcHRyKSBDcmVhdGVEaXJlY3RvcnkzMlcKLTAwNDMgc3RkY2FsbCBDcmVhdGVFdmVudEEocHRyIGxvbmcgbG9uZyBwdHIpIENyZWF0ZUV2ZW50MzJBCi0wMDQ0IHN0ZGNhbGwgQ3JlYXRlRXZlbnRXKHB0ciBsb25nIGxvbmcgcHRyKSBDcmVhdGVFdmVudDMyVwotMDA0NSBzdGRjYWxsIENyZWF0ZUZpbGVBKHB0ciBsb25nIGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nKSBDcmVhdGVGaWxlMzJBCi0wMDQ2IHN0ZGNhbGwgQ3JlYXRlRmlsZU1hcHBpbmdBKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nIHB0cikgQ3JlYXRlRmlsZU1hcHBpbmczMkEKLTAwNDcgc3RkY2FsbCBDcmVhdGVGaWxlTWFwcGluZ1cobG9uZyBwdHIgbG9uZyBsb25nIGxvbmcgcHRyKSBDcmVhdGVGaWxlTWFwcGluZzMyVwotMDA0OCBzdGRjYWxsIENyZWF0ZUZpbGVXKHB0ciBsb25nIGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nKSBDcmVhdGVGaWxlMzJXCi0wMDQ5IHN0dWIgQ3JlYXRlSW9Db21wbGV0aW9uUG9ydAotMDA1MCBzdHViIENyZWF0ZU1haWxzbG90QQotMDA1MSBzdHViIENyZWF0ZU1haWxzbG90VwotMDA1MiBzdGRjYWxsIENyZWF0ZU11dGV4QShwdHIgbG9uZyBwdHIpIENyZWF0ZU11dGV4MzJBCi0wMDUzIHN0ZGNhbGwgQ3JlYXRlTXV0ZXhXKHB0ciBsb25nIHB0cikgQ3JlYXRlTXV0ZXgzMlcKLTAwNTQgc3R1YiBDcmVhdGVOYW1lZFBpcGVBCi0wMDU1IHN0dWIgQ3JlYXRlTmFtZWRQaXBlVwotMDA1NiBzdHViIENyZWF0ZVBpcGUKLTAwNTcgc3RkY2FsbCBDcmVhdGVQcm9jZXNzQShwdHIgcHRyIHB0ciBwdHIgbG9uZyBsb25nIHB0ciBwdHIgcHRyIHB0cikgQ3JlYXRlUHJvY2VzczMyQQotMDA1OCBzdHViIENyZWF0ZVByb2Nlc3NXCi0wMDU5IHN0dWIgQ3JlYXRlUmVtb3RlVGhyZWFkCi0wMDYwIHN0ZGNhbGwgQ3JlYXRlU2VtYXBob3JlQShwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlU2VtYXBob3JlMzJBCi0wMDYxIHN0ZGNhbGwgQ3JlYXRlU2VtYXBob3JlVyhwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlU2VtYXBob3JlMzJXCi0wMDYyIHN0dWIgQ3JlYXRlVGFwZVBhcnRpdGlvbgotMDA2MyBzdGRjYWxsIENyZWF0ZVRocmVhZChwdHIgbG9uZyBwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlVGhyZWFkCi0wMDY0IHN0dWIgQ3JlYXRlVmlydHVhbEJ1ZmZlcgotMDA2NSBzdHViIERlYnVnQWN0aXZlUHJvY2VzcwotMDA2NiBzdHViIERlYnVnQnJlYWsKLTAwNjcgc3R1YiBEZWZpbmVEb3NEZXZpY2VBCi0wMDY4IHN0dWIgRGVmaW5lRG9zRGV2aWNlVwotMDA2OSBzdGRjYWxsIERlbGV0ZUF0b20obG9uZykgRGVsZXRlQXRvbTMyCi0wMDcwIHN0ZGNhbGwgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKHB0cikJRGVsZXRlQ3JpdGljYWxTZWN0aW9uCi0wMDcxIHN0ZGNhbGwgRGVsZXRlRmlsZUEocHRyKSBEZWxldGVGaWxlMzJBCi0wMDcyIHN0ZGNhbGwgRGVsZXRlRmlsZVcocHRyKSBEZWxldGVGaWxlMzJXCi0wMDczIHN0dWIgRGV2aWNlSW9Db250cm9sCi0wMDc0IHN0ZGNhbGwgRGlzYWJsZVRocmVhZExpYnJhcnlDYWxscyhsb25nKSBEaXNhYmxlVGhyZWFkTGlicmFyeUNhbGxzCi0wMDc1IHN0dWIgRGlzY29ubmVjdE5hbWVkUGlwZQotMDA3NiBzdGRjYWxsIERvc0RhdGVUaW1lVG9GaWxlVGltZShsb25nIGxvbmcgcHRyKSBEb3NEYXRlVGltZVRvRmlsZVRpbWUKLTAwNzcgc3R1YiBEdXBsaWNhdGVDb25zb2xlSGFuZGxlCi0wMDc4IAlzdGRjYWxsIER1cGxpY2F0ZUhhbmRsZShsb25nIGxvbmcgbG9uZyBwdHIgbG9uZyBsb25nIGxvbmcpIER1cGxpY2F0ZUhhbmRsZQotMDA3OSBzdHViIEVuZFVwZGF0ZVJlc291cmNlQQotMDA4MCBzdHViIEVuZFVwZGF0ZVJlc291cmNlVwotMDA4MSBzdGRjYWxsIEVudGVyQ3JpdGljYWxTZWN0aW9uKHB0cikJRW50ZXJDcml0aWNhbFNlY3Rpb24KLTAwODIgc3R1YiBFbnVtQ2FsZW5kYXJJbmZvQQotMDA4MyBzdHViIEVudW1DYWxlbmRhckluZm9XCi0wMDg0IHN0dWIgRW51bURhdGVGb3JtYXRzQQotMDA4NSBzdHViIEVudW1EYXRlRm9ybWF0c1cKLTAwODYgc3RkY2FsbCBFbnVtUmVzb3VyY2VMYW5ndWFnZXNBKGxvbmcgcHRyIHB0ciBwdHIgbG9uZykgVEhVTktfRW51bVJlc291cmNlTGFuZ3VhZ2VzMzJBCi0wMDg3IHN0ZGNhbGwgRW51bVJlc291cmNlTGFuZ3VhZ2VzVyhsb25nIHB0ciBwdHIgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyVwotMDA4OCBzdGRjYWxsIEVudW1SZXNvdXJjZU5hbWVzQShsb25nIHB0ciBwdHIgbG9uZykgVEhVTktfRW51bVJlc291cmNlTmFtZXMzMkEKLTAwODkgc3RkY2FsbCBFbnVtUmVzb3VyY2VOYW1lc1cobG9uZyBwdHIgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZU5hbWVzMzJXCi0wMDkwIHN0ZGNhbGwgRW51bVJlc291cmNlVHlwZXNBKGxvbmcgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZVR5cGVzMzJBCi0wMDkxIHN0ZGNhbGwgRW51bVJlc291cmNlVHlwZXNXKGxvbmcgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZVR5cGVzMzJXCi0wMDkyIHN0ZGNhbGwgRW51bVN5c3RlbUNvZGVQYWdlc0EocHRyIGxvbmcpIFRIVU5LX0VudW1TeXN0ZW1Db2RlUGFnZXMzMkEKLTAwOTMgc3RkY2FsbCBFbnVtU3lzdGVtQ29kZVBhZ2VzVyhwdHIgbG9uZykgVEhVTktfRW51bVN5c3RlbUNvZGVQYWdlczMyVwotMDA5NCBzdGRjYWxsIEVudW1TeXN0ZW1Mb2NhbGVzQShwdHIgbG9uZykgVEhVTktfRW51bVN5c3RlbUxvY2FsZXMzMkEKLTAwOTUgc3RkY2FsbCBFbnVtU3lzdGVtTG9jYWxlc1cocHRyIGxvbmcpIFRIVU5LX0VudW1TeXN0ZW1Mb2NhbGVzMzJXCi0wMDk2IHN0dWIgRW51bVRpbWVGb3JtYXRzQQotMDA5NyBzdHViIEVudW1UaW1lRm9ybWF0c1cKLTAwOTggc3R1YiBFcmFzZVRhcGUKLTAwOTkgc3RkY2FsbCBFc2NhcGVDb21tRnVuY3Rpb24obG9uZyBsb25nKSBFc2NhcGVDb21tRnVuY3Rpb24zMgotMDEwMCBzdGRjYWxsIEV4aXRQcm9jZXNzKGxvbmcpIEV4aXRQcm9jZXNzCi0wMTAxIHN0dWIgRXhpdFRocmVhZAotMDEwMiBzdHViIEV4aXRWRE0KLTAxMDMgc3RkY2FsbCBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NBKHB0ciBwdHIgbG9uZykgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzMzJBCi0wMTA0IHN0ZGNhbGwgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzVyhwdHIgcHRyIGxvbmcpIEV4cGFuZEVudmlyb25tZW50U3RyaW5nczMyVwotMDEwNSBzdHViIEV4cHVuZ2VDb25zb2xlQ29tbWFuZEhpc3RvcnlBCi0wMTA2IHN0dWIgRXhwdW5nZUNvbnNvbGVDb21tYW5kSGlzdG9yeVcKLTAxMDcgc3R1YiBFeHRlbmRWaXJ0dWFsQnVmZmVyCi0wMTA4IHN0ZGNhbGwgRmF0YWxBcHBFeGl0QShsb25nIHB0cikgRmF0YWxBcHBFeGl0MzJBCi0wMTA5IHN0ZGNhbGwgRmF0YWxBcHBFeGl0Vyhsb25nIHB0cikgRmF0YWxBcHBFeGl0MzJXCi0wMTEwIHN0dWIgRmF0YWxFeGl0Ci0wMTExIHN0ZGNhbGwgRmlsZVRpbWVUb0Rvc0RhdGVUaW1lKHB0ciBwdHIgcHRyKSBGaWxlVGltZVRvRG9zRGF0ZVRpbWUKLTAxMTIgc3RkY2FsbCBGaWxlVGltZVRvTG9jYWxGaWxlVGltZShwdHIgcHRyKSBGaWxlVGltZVRvTG9jYWxGaWxlVGltZQotMDExMyBzdGRjYWxsIEZpbGVUaW1lVG9TeXN0ZW1UaW1lKHB0ciBwdHIpIEZpbGVUaW1lVG9TeXN0ZW1UaW1lCi0wMTE0IHN0dWIgRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUKLTAxMTUgc3R1YiBGaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEKLTAxMTYgc3R1YiBGaWxsQ29uc29sZU91dHB1dENoYXJhY3RlclcKLTAxMTcgc3RkY2FsbCBGaW5kQXRvbUEocHRyKSBGaW5kQXRvbTMyQQotMDExOCBzdGRjYWxsIEZpbmRBdG9tVyhwdHIpIEZpbmRBdG9tMzJXCi0wMTE5IHN0ZGNhbGwgRmluZENsb3NlKGxvbmcpIEZpbmRDbG9zZTMyCi0wMTIwIHN0dWIgRmluZENsb3NlQ2hhbmdlTm90aWZpY2F0aW9uCi0wMTIxIHN0dWIgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uQQotMDEyMiBzdHViIEZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvblcKLTAxMjMgc3RkY2FsbCBGaW5kRmlyc3RGaWxlQShwdHIgcHRyKSBGaW5kRmlyc3RGaWxlMzJBCi0wMTI0IHN0ZGNhbGwgRmluZEZpcnN0RmlsZVcocHRyIHB0cikgRmluZEZpcnN0RmlsZTMyVwotMDEyNSBzdHViIEZpbmROZXh0Q2hhbmdlTm90aWZpY2F0aW9uCi0wMTI2IHN0ZGNhbGwgRmluZE5leHRGaWxlQShsb25nIHB0cikgRmluZE5leHRGaWxlMzJBCi0wMTI3IHN0ZGNhbGwgRmluZE5leHRGaWxlVyhsb25nIHB0cikgRmluZE5leHRGaWxlMzJXCi0wMTI4IHN0ZGNhbGwgRmluZFJlc291cmNlQShsb25nIHB0ciBwdHIpIEZpbmRSZXNvdXJjZTMyQQotMDEyOSBzdGRjYWxsIEZpbmRSZXNvdXJjZUV4QShsb25nIHB0ciBwdHIgbG9uZykgRmluZFJlc291cmNlRXgzMkEKLTAxMzAgc3RkY2FsbCBGaW5kUmVzb3VyY2VFeFcobG9uZyBwdHIgcHRyIGxvbmcpIEZpbmRSZXNvdXJjZUV4MzJXCi0wMTMxIHN0ZGNhbGwgRmluZFJlc291cmNlVyhsb25nIHB0ciBwdHIpIEZpbmRSZXNvdXJjZTMyVwotMDEzMiBzdGRjYWxsIEZsdXNoQ29uc29sZUlucHV0QnVmZmVyKGxvbmcpIEZsdXNoQ29uc29sZUlucHV0QnVmZmVyCi0wMTMzIHN0ZGNhbGwgRmx1c2hGaWxlQnVmZmVycyhsb25nKSBGbHVzaEZpbGVCdWZmZXJzCi0wMTM0IHN0dWIgRmx1c2hJbnN0cnVjdGlvbkNhY2hlCi0wMTM1IHN0dWIgRmx1c2hWaWV3T2ZGaWxlCi0wMTM2IHN0dWIgRm9sZFN0cmluZ0EKLTAxMzcgc3R1YiBGb2xkU3RyaW5nVwotMDEzOCBzdGRjYWxsIEZvcm1hdE1lc3NhZ2VBKCkgV0lOMzJfRm9ybWF0TWVzc2FnZTMyQQotMDEzOSBzdGRjYWxsIEZvcm1hdE1lc3NhZ2VXKCkgV0lOMzJfRm9ybWF0TWVzc2FnZTMyVwotMDE0MCBzdHViIEZyZWVDb25zb2xlCi0wMTQxIHN0ZGNhbGwgRnJlZUVudmlyb25tZW50U3RyaW5nc0EocHRyKSBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJBCi0wMTQyIHN0ZGNhbGwgRnJlZUVudmlyb25tZW50U3RyaW5nc1cocHRyKSBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJXCi0wMTQzIHN0ZGNhbGwgRnJlZUxpYnJhcnkobG9uZykgRnJlZUxpYnJhcnkzMgotMDE0NCBzdHViIEZyZWVMaWJyYXJ5QW5kRXhpdFRocmVhZAotMDE0NSBzdGRjYWxsIEZyZWVSZXNvdXJjZShsb25nKSBGcmVlUmVzb3VyY2UzMgotMDE0NiBzdHViIEZyZWVWaXJ0dWFsQnVmZmVyCi0wMTQ3IHN0dWIgR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50Ci0wMTQ4ICAgIHN0ZGNhbGwgR2V0QUNQKCkgR2V0QUNQCi0wMTQ5IHN0ZGNhbGwgR2V0QXRvbU5hbWVBKGxvbmcgcHRyIGxvbmcpIEdldEF0b21OYW1lMzJBCi0wMTUwIHN0ZGNhbGwgR2V0QXRvbU5hbWVXKGxvbmcgcHRyIGxvbmcpIEdldEF0b21OYW1lMzJXCi0wMTUxIHN0dWIgR2V0QmluYXJ5VHlwZQotMDE1MiBzdHViIEdldEJpbmFyeVR5cGVBCi0wMTUzIHN0dWIgR2V0QmluYXJ5VHlwZVcKLTAxNTQgc3RkY2FsbCBHZXRDUEluZm8obG9uZyBwdHIpIEdldENQSW5mbwotMDE1NSBzdHViIEdldENvbW1Db25maWcKLTAxNTYgc3RkY2FsbCBHZXRDb21tTWFzayhsb25nIHB0cikgR2V0Q29tbU1hc2sKLTAxNTcgc3R1YiBHZXRDb21tTW9kZW1TdGF0dXMKLTAxNTggc3R1YiBHZXRDb21tUHJvcGVydGllcwotMDE1OSBzdGRjYWxsIEdldENvbW1TdGF0ZShsb25nIHB0cikgR2V0Q29tbVN0YXRlMzIKLTAxNjAgc3RkY2FsbCBHZXRDb21tVGltZW91dHMobG9uZyBwdHIpIEdldENvbW1UaW1lb3V0cwotMDE2MSBzdGRjYWxsIEdldENvbW1hbmRMaW5lQSgpIEdldENvbW1hbmRMaW5lMzJBCi0wMTYyIHN0ZGNhbGwgR2V0Q29tbWFuZExpbmVXKCkgR2V0Q29tbWFuZExpbmUzMlcKLTAxNjMgc3R1YiBHZXRDb21wcmVzc2VkRmlsZVNpemVBCi0wMTY0IHN0dWIgR2V0Q29tcHJlc3NlZEZpbGVTaXplVwotMDE2NSBzdGRjYWxsIEdldENvbXB1dGVyTmFtZUEocHRyIHB0cikgR2V0Q29tcHV0ZXJOYW1lMzJBCi0wMTY2IHN0ZGNhbGwgR2V0Q29tcHV0ZXJOYW1lVyhwdHIgcHRyKSBHZXRDb21wdXRlck5hbWUzMlcKLTAxNjcgc3R1YiBHZXRDb25zb2xlQWxpYXNBCi0wMTY4IHN0dWIgR2V0Q29uc29sZUFsaWFzRXhlc0EKLTAxNjkgc3R1YiBHZXRDb25zb2xlQWxpYXNFeGVzTGVuZ3RoQQotMDE3MCBzdHViIEdldENvbnNvbGVBbGlhc0V4ZXNMZW5ndGhXCi0wMTcxIHN0dWIgR2V0Q29uc29sZUFsaWFzRXhlc1cKLTAxNzIgc3R1YiBHZXRDb25zb2xlQWxpYXNXCi0wMTczIHN0dWIgR2V0Q29uc29sZUFsaWFzZXNBCi0wMTc0IHN0dWIgR2V0Q29uc29sZUFsaWFzZXNMZW5ndGhBCi0wMTc1IHN0dWIgR2V0Q29uc29sZUFsaWFzZXNMZW5ndGhXCi0wMTc2IHN0dWIgR2V0Q29uc29sZUFsaWFzZXNXCi0wMTc3IHN0ZGNhbGwgR2V0Q29uc29sZUNQKCkgR2V0Q29uc29sZUNQCi0wMTc4IHN0dWIgR2V0Q29uc29sZUNvbW1hbmRIaXN0b3J5QQotMDE3OSBzdHViIEdldENvbnNvbGVDb21tYW5kSGlzdG9yeUxlbmd0aEEKLTAxODAgc3R1YiBHZXRDb25zb2xlQ29tbWFuZEhpc3RvcnlMZW5ndGhXCi0wMTgxIHN0dWIgR2V0Q29uc29sZUNvbW1hbmRIaXN0b3J5VwotMDE4MiBzdHViIEdldENvbnNvbGVDdXJzb3JJbmZvCi0wMTgzIHN0dWIgR2V0Q29uc29sZURpc3BsYXlNb2RlCi0wMTg0IHN0dWIgR2V0Q29uc29sZUZvbnRJbmZvCi0wMTg1IHN0dWIgR2V0Q29uc29sZUZvbnRTaXplCi0wMTg2IHN0dWIgR2V0Q29uc29sZUhhcmR3YXJlU3RhdGUKLTAxODcgc3R1YiBHZXRDb25zb2xlSW5wdXRXYWl0SGFuZGxlCi0wMTg4IHN0ZGNhbGwgR2V0Q29uc29sZU1vZGUobG9uZyBwdHIpIEdldENvbnNvbGVNb2RlCi0wMTg5IHN0ZGNhbGwgR2V0Q29uc29sZU91dHB1dENQKCkgR2V0Q29uc29sZU91dHB1dENQCi0wMTkwIHN0ZGNhbGwgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8obG9uZyBwdHIpIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvCi0wMTkxIHN0ZGNhbGwgR2V0Q29uc29sZVRpdGxlQShwdHIgbG9uZykgR2V0Q29uc29sZVRpdGxlMzJBCi0wMTkyIHN0ZGNhbGwgR2V0Q29uc29sZVRpdGxlVyhwdHIgbG9uZykgR2V0Q29uc29sZVRpdGxlMzJXCi0wMTkzIHN0dWIgR2V0Q3VycmVuY3lGb3JtYXRBCi0wMTk0IHN0dWIgR2V0Q3VycmVuY3lGb3JtYXRXCi0wMTk1IHN0dWIgR2V0Q3VycmVudENvbnNvbGVGb250Ci0wMTk2IHN0ZGNhbGwgR2V0Q3VycmVudERpcmVjdG9yeUEobG9uZyBwdHIpIEdldEN1cnJlbnREaXJlY3RvcnkzMkEKLTAxOTcgc3RkY2FsbCBHZXRDdXJyZW50RGlyZWN0b3J5Vyhsb25nIHB0cikgR2V0Q3VycmVudERpcmVjdG9yeTMyVwotMDE5OCBzdGRjYWxsIEdldEN1cnJlbnRQcm9jZXNzKCkgR2V0Q3VycmVudFByb2Nlc3MKLTAxOTkgc3RkY2FsbCBHZXRDdXJyZW50UHJvY2Vzc0lkKCkgR2V0Q3VycmVudFByb2Nlc3NJZAotMDIwMCBzdGRjYWxsIEdldEN1cnJlbnRUaHJlYWQoKSBHZXRDdXJyZW50VGhyZWFkCi0wMjAxIHN0ZGNhbGwgR2V0Q3VycmVudFRocmVhZElkKCkgR2V0Q3VycmVudFRocmVhZElkCi0wMjAyIHN0dWIgR2V0RGF0ZUZvcm1hdEEKLTAyMDMgc3R1YiBHZXREYXRlRm9ybWF0VwotMDIwNCBzdHViIEdldERlZmF1bHRDb21tQ29uZmlnQQotMDIwNSBzdHViIEdldERlZmF1bHRDb21tQ29uZmlnVwotMDIwNiAJc3RkY2FsbCBHZXREaXNrRnJlZVNwYWNlQShwdHIgcHRyIHB0ciBwdHIgcHRyKSBHZXREaXNrRnJlZVNwYWNlMzJBCi0wMjA3IAlzdGRjYWxsIEdldERpc2tGcmVlU3BhY2VXKHB0ciBwdHIgcHRyIHB0ciBwdHIpIEdldERpc2tGcmVlU3BhY2UzMlcKLTAyMDggc3RkY2FsbCBHZXREcml2ZVR5cGVBKHB0cikgR2V0RHJpdmVUeXBlMzJBCi0wMjA5IHN0ZGNhbGwgR2V0RHJpdmVUeXBlVyhwdHIpIEdldERyaXZlVHlwZTMyVwotMDIxMCBzdGRjYWxsIEdldEVudmlyb25tZW50U3RyaW5ncygpIEdldEVudmlyb25tZW50U3RyaW5nczMyQQotMDIxMSBzdGRjYWxsIEdldEVudmlyb25tZW50U3RyaW5nc0EoKSBHZXRFbnZpcm9ubWVudFN0cmluZ3MzMkEKLTAyMTIgc3RkY2FsbCBHZXRFbnZpcm9ubWVudFN0cmluZ3NXKCkgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJXCi0wMjEzIHN0ZGNhbGwgR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEocHRyIHB0ciBsb25nKSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBCi0wMjE0IHN0ZGNhbGwgR2V0RW52aXJvbm1lbnRWYXJpYWJsZVcocHRyIHB0ciBsb25nKSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXCi0wMjE1IHN0dWIgR2V0RXhpdENvZGVQcm9jZXNzCi0wMjE2IHN0dWIgR2V0RXhpdENvZGVUaHJlYWQKLTAyMTcgc3RkY2FsbCBHZXRGaWxlQXR0cmlidXRlc0EocHRyKSBHZXRGaWxlQXR0cmlidXRlczMyQQotMDIxOCBzdGRjYWxsIEdldEZpbGVBdHRyaWJ1dGVzVyhwdHIpIEdldEZpbGVBdHRyaWJ1dGVzMzJXCi0wMjE5IHN0ZGNhbGwgR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUobG9uZyBwdHIpIEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlCi0wMjIwIHN0ZGNhbGwgR2V0RmlsZVNpemUobG9uZyBwdHIpIEdldEZpbGVTaXplCi0wMjIxIHN0ZGNhbGwgR2V0RmlsZVRpbWUobG9uZyBwdHIgcHRyIHB0cikgR2V0RmlsZVRpbWUKLTAyMjIgc3RkY2FsbCBHZXRGaWxlVHlwZShsb25nKSBHZXRGaWxlVHlwZQotMDIyMyBzdGRjYWxsIEdldEZ1bGxQYXRoTmFtZUEocHRyIGxvbmcgcHRyIHB0cikgR2V0RnVsbFBhdGhOYW1lMzJBCi0wMjI0IHN0ZGNhbGwgR2V0RnVsbFBhdGhOYW1lVyhwdHIgbG9uZyBwdHIgcHRyKSBHZXRGdWxsUGF0aE5hbWUzMlcKLTAyMjUgc3R1YiBHZXRIYW5kbGVJbmZvcm1hdGlvbgotMDIyNiBzdGRjYWxsIEdldExhcmdlc3RDb25zb2xlV2luZG93U2l6ZShsb25nKSBHZXRMYXJnZXN0Q29uc29sZVdpbmRvd1NpemUKLTAyMjcgc3RkY2FsbCBHZXRMYXN0RXJyb3IoKSBHZXRMYXN0RXJyb3IKLTAyMjggc3RkY2FsbCBHZXRMb2NhbFRpbWUocHRyKSBHZXRMb2NhbFRpbWUKLTAyMjkgc3RkY2FsbCBHZXRMb2NhbGVJbmZvQShsb25nIGxvbmcgcHRyIGxvbmcpIEdldExvY2FsZUluZm9BCi0wMjMwIHN0ZGNhbGwgR2V0TG9jYWxlSW5mb1cobG9uZyBsb25nIHB0ciBsb25nKSBHZXRMb2NhbGVJbmZvMzJXCi0wMjMxIHN0ZGNhbGwgR2V0TG9naWNhbERyaXZlU3RyaW5nc0EobG9uZyBwdHIpIEdldExvZ2ljYWxEcml2ZVN0cmluZ3MzMkEKLTAyMzIgc3RkY2FsbCBHZXRMb2dpY2FsRHJpdmVTdHJpbmdzVyhsb25nIHB0cikgR2V0TG9naWNhbERyaXZlU3RyaW5nczMyVwotMDIzMyBzdGRjYWxsIEdldExvZ2ljYWxEcml2ZXMoKSBHZXRMb2dpY2FsRHJpdmVzCi0wMjM0IHN0dWIgR2V0TWFpbHNsb3RJbmZvCi0wMjM1IHN0ZGNhbGwgR2V0TW9kdWxlRmlsZU5hbWVBKGxvbmcgcHRyIGxvbmcpIEdldE1vZHVsZUZpbGVOYW1lMzJBCi0wMjM2IHN0ZGNhbGwgR2V0TW9kdWxlRmlsZU5hbWVXKGxvbmcgcHRyIGxvbmcpIEdldE1vZHVsZUZpbGVOYW1lMzJXCi0wMjM3IHN0ZGNhbGwgR2V0TW9kdWxlSGFuZGxlQShwdHIpIFdJTjMyX0dldE1vZHVsZUhhbmRsZUEKLTAyMzggc3RkY2FsbCBHZXRNb2R1bGVIYW5kbGVXKHB0cikgV0lOMzJfR2V0TW9kdWxlSGFuZGxlVwotMDIzOSBzdHViIEdldE5hbWVkUGlwZUhhbmRsZVN0YXRlQQotMDI0MCBzdHViIEdldE5hbWVkUGlwZUhhbmRsZVN0YXRlVwotMDI0MSBzdHViIEdldE5hbWVkUGlwZUluZm8KLTAyNDIgc3R1YiBHZXROZXh0VkRNQ29tbWFuZAotMDI0MyBzdHViIEdldE51bWJlckZvcm1hdEEKLTAyNDQgc3R1YiBHZXROdW1iZXJGb3JtYXRXCi0wMjQ1IHN0dWIgR2V0TnVtYmVyT2ZDb25zb2xlRm9udHMKLTAyNDYgc3R1YiBHZXROdW1iZXJPZkNvbnNvbGVJbnB1dEV2ZW50cwotMDI0NyBzdHViIEdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9ucwotMDI0OCAgICBzdGRjYWxsIEdldE9FTUNQKCkgR2V0T0VNQ1AKLTAyNDkgc3R1YiBHZXRPdmVybGFwcGVkUmVzdWx0Ci0wMjUwIHN0ZGNhbGwgR2V0UHJpb3JpdHlDbGFzcyhsb25nKSBHZXRQcmlvcml0eUNsYXNzCi0wMjUxIHN0ZGNhbGwgR2V0UHJpdmF0ZVByb2ZpbGVJbnRBKHB0ciBwdHIgbG9uZyBwdHIpIEdldFByaXZhdGVQcm9maWxlSW50MzJBCi0wMjUyIHN0ZGNhbGwgR2V0UHJpdmF0ZVByb2ZpbGVJbnRXKHB0ciBwdHIgbG9uZyBwdHIpIEdldFByaXZhdGVQcm9maWxlSW50MzJXCi0wMjUzIHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uQQotMDI1NCBzdHViIEdldFByaXZhdGVQcm9maWxlU2VjdGlvblcKLTAyNTUgc3RkY2FsbCBHZXRQcml2YXRlUHJvZmlsZVN0cmluZ0EocHRyIHB0ciBwdHIgcHRyIGxvbmcgcHRyKSBHZXRQcml2YXRlUHJvZmlsZVN0cmluZzMyQQotMDI1NiBzdGRjYWxsIEdldFByaXZhdGVQcm9maWxlU3RyaW5nVyhwdHIgcHRyIHB0ciBwdHIgbG9uZyBwdHIpIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJXCi0wMjU3IHN0ZGNhbGwgR2V0UHJvY0FkZHJlc3MobG9uZyBwdHIpIEdldFByb2NBZGRyZXNzMzIKLTAyNTggc3RkY2FsbCBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKGxvbmcgcHRyIHB0cikJR2V0UHJvY2Vzc0FmZmluaXR5TWFzawotMDI1OSBzdGRjYWxsIEdldFByb2Nlc3NIZWFwKCkgR2V0UHJvY2Vzc0hlYXAKLTAyNjAgc3R1YiBHZXRQcm9jZXNzSGVhcHMKLTAyNjEgc3R1YiBHZXRQcm9jZXNzU2h1dGRvd25QYXJhbWV0ZXJzCi0wMjYyIHN0ZGNhbGwgR2V0UHJvY2Vzc1RpbWVzKGxvbmcgcHRyIHB0ciBwdHIgcHRyKSBHZXRQcm9jZXNzVGltZXMKLTAyNjMgc3R1YiBHZXRQcm9jZXNzV29ya2luZ1NldFNpemUKLTAyNjQgc3RkY2FsbCBHZXRQcm9maWxlSW50QShwdHIgcHRyIGxvbmcpIEdldFByb2ZpbGVJbnQzMkEKLTAyNjUgc3RkY2FsbCBHZXRQcm9maWxlSW50VyhwdHIgcHRyIGxvbmcpIEdldFByb2ZpbGVJbnQzMlcKLTAyNjYgc3R1YiBHZXRQcm9maWxlU2VjdGlvbkEKLTAyNjcgc3R1YiBHZXRQcm9maWxlU2VjdGlvblcKLTAyNjggc3RkY2FsbCBHZXRQcm9maWxlU3RyaW5nQShwdHIgcHRyIHB0ciBwdHIgbG9uZykgR2V0UHJvZmlsZVN0cmluZzMyQQotMDI2OSBzdGRjYWxsIEdldFByb2ZpbGVTdHJpbmdXKHB0ciBwdHIgcHRyIHB0ciBsb25nKSBHZXRQcm9maWxlU3RyaW5nMzJXCi0wMjcwIHN0dWIgR2V0UXVldWVkQ29tcGxldGlvblN0YXR1cwotMDI3MSBzdGRjYWxsIEdldFNob3J0UGF0aE5hbWVBKHB0ciBwdHIgbG9uZykgR2V0U2hvcnRQYXRoTmFtZTMyQQotMDI3MiBzdGRjYWxsIEdldFNob3J0UGF0aE5hbWVXKHB0ciBwdHIgbG9uZykgR2V0U2hvcnRQYXRoTmFtZTMyVwotMDI3MyBzdGRjYWxsIEdldFN0YXJ0dXBJbmZvQShwdHIpIEdldFN0YXJ0dXBJbmZvMzJBCi0wMjc0IHN0ZGNhbGwgR2V0U3RhcnR1cEluZm9XKHB0cikgR2V0U3RhcnR1cEluZm8zMlcKLTAyNzUgc3RkY2FsbCBHZXRTdGRIYW5kbGUobG9uZykJR2V0U3RkSGFuZGxlCi0wMjc2IHN0ZGNhbGwgR2V0U3RyaW5nVHlwZUEobG9uZyBsb25nIHB0ciBsb25nIHB0cikgR2V0U3RyaW5nVHlwZTMyQQotMDI3NyBzdGRjYWxsIEdldFN0cmluZ1R5cGVFeEEobG9uZyBsb25nIHB0ciBsb25nIHB0cikgR2V0U3RyaW5nVHlwZUV4MzJBCi0wMjc4IHN0ZGNhbGwgR2V0U3RyaW5nVHlwZUV4Vyhsb25nIGxvbmcgcHRyIGxvbmcgcHRyKSBHZXRTdHJpbmdUeXBlRXgzMlcKLTAyNzkgc3RkY2FsbCBHZXRTdHJpbmdUeXBlVyhsb25nIHB0ciBsb25nIHB0cikgR2V0U3RyaW5nVHlwZTMyVwotMDI4MCBzdGRjYWxsIEdldFN5c3RlbURlZmF1bHRMQ0lEKCkgR2V0U3lzdGVtRGVmYXVsdExDSUQKLTAyODEgc3RkY2FsbCBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkgR2V0U3lzdGVtRGVmYXVsdExhbmdJRAotMDI4MiBzdGRjYWxsIEdldFN5c3RlbURpcmVjdG9yeUEocHRyIGxvbmcpIEdldFN5c3RlbURpcmVjdG9yeTMyQQotMDI4MyBzdGRjYWxsIEdldFN5c3RlbURpcmVjdG9yeVcocHRyIGxvbmcpIEdldFN5c3RlbURpcmVjdG9yeTMyVwotMDI4NCBzdGRjYWxsIEdldFN5c3RlbUluZm8ocHRyKSBHZXRTeXN0ZW1JbmZvCi0wMjg1IAlzdGRjYWxsIEdldFN5c3RlbVRpbWUocHRyKSBHZXRTeXN0ZW1UaW1lCi0wMjg2IHN0dWIgR2V0U3lzdGVtVGltZUFkanVzdG1lbnQKLTAyODcgc3R1YiBHZXRUYXBlUGFyYW1ldGVycwotMDI4OCBzdHViIEdldFRhcGVQb3NpdGlvbgotMDI4OSBzdHViIEdldFRhcGVTdGF0dXMKLTAyOTAgc3RkY2FsbCBHZXRUZW1wRmlsZU5hbWVBKHB0ciBwdHIgbG9uZyBwdHIpIEdldFRlbXBGaWxlTmFtZTMyQQotMDI5MSBzdGRjYWxsIEdldFRlbXBGaWxlTmFtZVcocHRyIHB0ciBsb25nIHB0cikgR2V0VGVtcEZpbGVOYW1lMzJXCi0wMjkyIHN0ZGNhbGwgR2V0VGVtcFBhdGhBKGxvbmcgcHRyKSBHZXRUZW1wUGF0aDMyQQotMDI5MyBzdGRjYWxsIEdldFRlbXBQYXRoVyhsb25nIHB0cikgR2V0VGVtcFBhdGgzMlcKLTAyOTQgc3RkY2FsbCBHZXRUaHJlYWRDb250ZXh0KGxvbmcgcHRyKSBHZXRUaHJlYWRDb250ZXh0Ci0wMjk1IHN0ZGNhbGwgR2V0VGhyZWFkTG9jYWxlKCkgR2V0VGhyZWFkTG9jYWxlCi0wMjk2IHN0ZGNhbGwgR2V0VGhyZWFkUHJpb3JpdHkobG9uZykgR2V0VGhyZWFkUHJpb3JpdHkKLTAyOTcgc3R1YiBHZXRUaHJlYWRTZWxlY3RvckVudHJ5Ci0wMjk4IHN0dWIgR2V0VGhyZWFkVGltZXMKLTAyOTkgc3RkY2FsbCBHZXRUaWNrQ291bnQoKSBHZXRUaWNrQ291bnQKLTAzMDAgc3R1YiBHZXRUaW1lRm9ybWF0QQotMDMwMSBzdHViIEdldFRpbWVGb3JtYXRXCi0wMzAyICAgIHN0ZGNhbGwgR2V0VGltZVpvbmVJbmZvcm1hdGlvbihwdHIpIEdldFRpbWVab25lSW5mb3JtYXRpb24KLTAzMDMgc3RkY2FsbCBHZXRVc2VyRGVmYXVsdExDSUQoKSBHZXRVc2VyRGVmYXVsdExDSUQKLTAzMDQgc3RkY2FsbCBHZXRVc2VyRGVmYXVsdExhbmdJRCgpIEdldFVzZXJEZWZhdWx0TGFuZ0lECi0wMzA1IHN0dWIgR2V0VkRNQ3VycmVudERpcmVjdG9yaWVzCi0wMzA2IHN0ZGNhbGwgR2V0VmVyc2lvbigpIEdldFZlcnNpb24zMgotMDMwNyBzdGRjYWxsIEdldFZlcnNpb25FeEEocHRyKSBHZXRWZXJzaW9uRXgzMkEKLTAzMDggc3RkY2FsbCBHZXRWZXJzaW9uRXhXKHB0cikgR2V0VmVyc2lvbkV4MzJXCi0wMzA5IHN0ZGNhbGwgR2V0Vm9sdW1lSW5mb3JtYXRpb25BKHB0ciBwdHIgbG9uZyBwdHIgcHRyIHB0ciBwdHIgbG9uZykgR2V0Vm9sdW1lSW5mb3JtYXRpb24zMkEKLTAzMTAgc3RkY2FsbCBHZXRWb2x1bWVJbmZvcm1hdGlvblcocHRyIHB0ciBsb25nIHB0ciBwdHIgcHRyIHB0ciBsb25nKSBHZXRWb2x1bWVJbmZvcm1hdGlvbjMyVwotMDMxMSBzdGRjYWxsIEdldFdpbmRvd3NEaXJlY3RvcnlBKHB0ciBsb25nKSBHZXRXaW5kb3dzRGlyZWN0b3J5MzJBCi0wMzEyIHN0ZGNhbGwgR2V0V2luZG93c0RpcmVjdG9yeVcocHRyIGxvbmcpIEdldFdpbmRvd3NEaXJlY3RvcnkzMlcKLTAzMTMgc3RkY2FsbCBHbG9iYWxBZGRBdG9tQShwdHIpIEdsb2JhbEFkZEF0b20zMkEKLTAzMTQgc3RkY2FsbCBHbG9iYWxBZGRBdG9tVyhwdHIpIEdsb2JhbEFkZEF0b20zMlcKLTAzMTUgc3RkY2FsbCBHbG9iYWxBbGxvYyhsb25nIGxvbmcpIEdsb2JhbEFsbG9jMzIKLTAzMTYgc3RkY2FsbCBHbG9iYWxDb21wYWN0KGxvbmcpIEdsb2JhbENvbXBhY3QzMgotMDMxNyBzdGRjYWxsIEdsb2JhbERlbGV0ZUF0b20obG9uZykgR2xvYmFsRGVsZXRlQXRvbQotMDMxOCBzdGRjYWxsIEdsb2JhbEZpbmRBdG9tQShwdHIpIEdsb2JhbEZpbmRBdG9tMzJBCi0wMzE5IHN0ZGNhbGwgR2xvYmFsRmluZEF0b21XKHB0cikgR2xvYmFsRmluZEF0b20zMlcKLTAzMjAgc3RkY2FsbCBHbG9iYWxGaXgobG9uZykgR2xvYmFsRml4MzIKLTAzMjEgc3RkY2FsbCBHbG9iYWxGbGFncyhsb25nKSBHbG9iYWxGbGFnczMyCi0wMzIyIHN0ZGNhbGwgR2xvYmFsRnJlZShsb25nKSBHbG9iYWxGcmVlMzIKLTAzMjMgc3RkY2FsbCBHbG9iYWxHZXRBdG9tTmFtZUEobG9uZyBwdHIgbG9uZykgR2xvYmFsR2V0QXRvbU5hbWUzMkEKLTAzMjQgc3RkY2FsbCBHbG9iYWxHZXRBdG9tTmFtZVcobG9uZyBwdHIgbG9uZykgR2xvYmFsR2V0QXRvbU5hbWUzMlcKLTAzMjUgc3RkY2FsbCBHbG9iYWxIYW5kbGUocHRyKSBHbG9iYWxIYW5kbGUzMgotMDMyNiBzdGRjYWxsIEdsb2JhbExvY2sobG9uZykgR2xvYmFsTG9jazMyCi0wMzI3IHN0ZGNhbGwgR2xvYmFsTWVtb3J5U3RhdHVzKHB0cikgR2xvYmFsTWVtb3J5U3RhdHVzCi0wMzI4IHN0ZGNhbGwgR2xvYmFsUmVBbGxvYyhsb25nIGxvbmcgbG9uZykgR2xvYmFsUmVBbGxvYzMyCi0wMzI5IHN0ZGNhbGwgR2xvYmFsU2l6ZShsb25nKSBHbG9iYWxTaXplMzIKLTAzMzAgc3RkY2FsbCBHbG9iYWxVbldpcmUobG9uZykgR2xvYmFsVW5XaXJlMzIKLTAzMzEgc3RkY2FsbCBHbG9iYWxVbmZpeChsb25nKSBHbG9iYWxVbmZpeDMyCi0wMzMyIHN0ZGNhbGwgR2xvYmFsVW5sb2NrKGxvbmcpIEdsb2JhbFVubG9jazMyCi0wMzMzIHN0ZGNhbGwgR2xvYmFsV2lyZShsb25nKSBHbG9iYWxXaXJlMzIKLTAzMzQgc3RkY2FsbCBIZWFwQWxsb2MobG9uZyBsb25nIGxvbmcpIEhlYXBBbGxvYwotMDMzNSBzdGRjYWxsIEhlYXBDb21wYWN0KGxvbmcgbG9uZykgSGVhcENvbXBhY3QKLTAzMzYgc3RkY2FsbCBIZWFwQ3JlYXRlKGxvbmcgbG9uZyBsb25nKQlIZWFwQ3JlYXRlCi0wMzM3IHN0ZGNhbGwgSGVhcERlc3Ryb3kobG9uZykgSGVhcERlc3Ryb3kKLTAzMzggc3RkY2FsbCBIZWFwRnJlZShsb25nIGxvbmcgcHRyKSBIZWFwRnJlZQotMDMzOSBzdGRjYWxsIEhlYXBMb2NrKGxvbmcpIEhlYXBMb2NrCi0wMzQwIHN0ZGNhbGwgSGVhcFJlQWxsb2MobG9uZyBsb25nIHB0ciBsb25nKSBIZWFwUmVBbGxvYwotMDM0MSBzdGRjYWxsIEhlYXBTaXplKGxvbmcgbG9uZyBwdHIpIEhlYXBTaXplCi0wMzQyIHN0ZGNhbGwgSGVhcFVubG9jayhsb25nKSBIZWFwVW5sb2NrCi0wMzQzIHN0ZGNhbGwgSGVhcFZhbGlkYXRlKGxvbmcgbG9uZyBwdHIpIEhlYXBWYWxpZGF0ZQotMDM0NCBzdGRjYWxsIEhlYXBXYWxrKGxvbmcgcHRyKSBIZWFwV2FsawotMDM0NSBzdHViIEluaXRBdG9tVGFibGUKLTAzNDYgc3RkY2FsbCBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKHB0cikgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbgotMDM0NyBzdGRjYWxsIEludGVybG9ja2VkRGVjcmVtZW50KHB0cikgSW50ZXJsb2NrZWREZWNyZW1lbnQKLTAzNDggc3RkY2FsbCBJbnRlcmxvY2tlZEV4Y2hhbmdlKHB0cikgSW50ZXJsb2NrZWRFeGNoYW5nZQotMDM0OSBzdGRjYWxsIEludGVybG9ja2VkSW5jcmVtZW50KHB0cikgSW50ZXJsb2NrZWRJbmNyZW1lbnQKLTAzNTAgc3R1YiBJbnZhbGlkYXRlQ29uc29sZURJQml0cwotMDM1MSBzdGRjYWxsIElzQmFkQ29kZVB0cihwdHIgbG9uZykgSXNCYWRDb2RlUHRyMzIKLTAzNTIgc3RkY2FsbCBJc0JhZEh1Z2VSZWFkUHRyKHB0ciBsb25nKSBJc0JhZEh1Z2VSZWFkUHRyMzIKLTAzNTMgc3RkY2FsbCBJc0JhZEh1Z2VXcml0ZVB0cihwdHIgbG9uZykgSXNCYWRIdWdlV3JpdGVQdHIzMgotMDM1NCBzdGRjYWxsIElzQmFkUmVhZFB0cihwdHIgbG9uZykgSXNCYWRSZWFkUHRyMzIKLTAzNTUgc3RkY2FsbCBJc0JhZFN0cmluZ1B0ckEocHRyIGxvbmcpIElzQmFkU3RyaW5nUHRyMzJBCi0wMzU2IHN0ZGNhbGwgSXNCYWRTdHJpbmdQdHJXKHB0ciBsb25nKSBJc0JhZFN0cmluZ1B0cjMyVwotMDM1NyBzdGRjYWxsIElzQmFkV3JpdGVQdHIocHRyIGxvbmcpIElzQmFkV3JpdGVQdHIzMgotMDM1OCBzdGRjYWxsIElzREJDU0xlYWRCeXRlKGxvbmcpIElzREJDU0xlYWRCeXRlMzIKLTAzNTkgc3RkY2FsbCBJc0RCQ1NMZWFkQnl0ZUV4KGxvbmcgbG9uZykgSXNEQkNTTGVhZEJ5dGVFeAotMDM2MCBzdGRjYWxsIElzVmFsaWRDb2RlUGFnZShsb25nKSBJc1ZhbGlkQ29kZVBhZ2UKLTAzNjEgc3RkY2FsbCBJc1ZhbGlkTG9jYWxlKGxvbmcgbG9uZykgSXNWYWxpZExvY2FsZQotMDM2MiBzdHViIExDTWFwU3RyaW5nQQotMDM2MyBzdHViIExDTWFwU3RyaW5nVwotMDM2NCBzdGRjYWxsIExlYXZlQ3JpdGljYWxTZWN0aW9uKHB0cikJTGVhdmVDcml0aWNhbFNlY3Rpb24KLTAzNjUgc3RkY2FsbCBMb2FkTGlicmFyeUEocHRyKSBMb2FkTGlicmFyeTMyQQotMDM2NiBzdHViIExvYWRMaWJyYXJ5RXhBCi0wMzY3IHN0dWIgTG9hZExpYnJhcnlFeFcKLTAzNjggc3RkY2FsbCBMb2FkTGlicmFyeVcocHRyKSBMb2FkTGlicmFyeTMyVwotMDM2OSBzdHViIExvYWRNb2R1bGUKLTAzNzAgc3RkY2FsbCBMb2FkUmVzb3VyY2UobG9uZyBsb25nKSBMb2FkUmVzb3VyY2UzMgotMDM3MSBzdGRjYWxsIExvY2FsQWxsb2MobG9uZyBsb25nKSBMb2NhbEFsbG9jMzIKLTAzNzIgc3RkY2FsbCBMb2NhbENvbXBhY3QobG9uZykgTG9jYWxDb21wYWN0MzIKLTAzNzMgc3RkY2FsbCBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZShwdHIgcHRyKSBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZQotMDM3NCBzdGRjYWxsIExvY2FsRmxhZ3MobG9uZykgTG9jYWxGbGFnczMyCi0wMzc1IHN0ZGNhbGwgTG9jYWxGcmVlKGxvbmcpIExvY2FsRnJlZTMyCi0wMzc2IHN0ZGNhbGwgTG9jYWxIYW5kbGUocHRyKSBMb2NhbEhhbmRsZTMyCi0wMzc3IHN0ZGNhbGwgTG9jYWxMb2NrKGxvbmcpIExvY2FsTG9jazMyCi0wMzc4IHN0ZGNhbGwgTG9jYWxSZUFsbG9jKGxvbmcgbG9uZyBsb25nKSBMb2NhbFJlQWxsb2MzMgotMDM3OSBzdGRjYWxsIExvY2FsU2hyaW5rKGxvbmcgbG9uZykgTG9jYWxTaHJpbmszMgotMDM4MCBzdGRjYWxsIExvY2FsU2l6ZShsb25nKSBMb2NhbFNpemUzMgotMDM4MSBzdGRjYWxsIExvY2FsVW5sb2NrKGxvbmcpIExvY2FsVW5sb2NrMzIKLTAzODIgc3RkY2FsbCBMb2NrRmlsZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIExvY2tGaWxlCi0wMzgzIHN0dWIgTG9ja0ZpbGVFeAotMDM4NCBzdGRjYWxsIExvY2tSZXNvdXJjZShsb25nKSBMb2NrUmVzb3VyY2UzMgotMDM4NSBzdGRjYWxsIE1hcFZpZXdPZkZpbGUobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBNYXBWaWV3T2ZGaWxlCi0wMzg2IHN0ZGNhbGwgTWFwVmlld09mRmlsZUV4KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBwdHIpIE1hcFZpZXdPZkZpbGVFeAotMDM4NyBzdGRjYWxsIE1vdmVGaWxlQShwdHIgcHRyKSBNb3ZlRmlsZTMyQQotMDM4OCBzdHViIE1vdmVGaWxlRXhBCi0wMzg5IHN0dWIgTW92ZUZpbGVFeFcKLTAzOTAgc3RkY2FsbCBNb3ZlRmlsZVcocHRyIHB0cikgTW92ZUZpbGUzMlcKLTAzOTEgc3RkY2FsbCBNdWxEaXYobG9uZyBsb25nIGxvbmcpIE11bERpdjMyCi0wMzkyIHN0ZGNhbGwgTXVsdGlCeXRlVG9XaWRlQ2hhcihsb25nIGxvbmcgcHRyIGxvbmcgcHRyIGxvbmcpIE11bHRpQnl0ZVRvV2lkZUNoYXIKLTAzOTMgc3R1YiBPcGVuQ29uc29sZVcKLTAzOTQgc3RkY2FsbCBPcGVuRXZlbnRBKGxvbmcgbG9uZyBwdHIpIE9wZW5FdmVudDMyQQotMDM5NSBzdGRjYWxsIE9wZW5FdmVudFcobG9uZyBsb25nIHB0cikgT3BlbkV2ZW50MzJXCi0wMzk2IHN0ZGNhbGwgT3BlbkZpbGUocHRyIHB0ciBsb25nKSBPcGVuRmlsZTMyCi0wMzk3IHN0ZGNhbGwgT3BlbkZpbGVNYXBwaW5nQShsb25nIGxvbmcgcHRyKSBPcGVuRmlsZU1hcHBpbmczMkEKLTAzOTggc3RkY2FsbCBPcGVuRmlsZU1hcHBpbmdXKGxvbmcgbG9uZyBwdHIpIE9wZW5GaWxlTWFwcGluZzMyVwotMDM5OSBzdGRjYWxsIE9wZW5NdXRleEEobG9uZyBsb25nIHB0cikgT3Blbk11dGV4MzJBCi0wNDAwIHN0ZGNhbGwgT3Blbk11dGV4Vyhsb25nIGxvbmcgcHRyKSBPcGVuTXV0ZXgzMlcKLTA0MDEgc3R1YiBPcGVuUHJvY2VzcwotMDQwMiBzdHViIE9wZW5Qcm9maWxlVXNlck1hcHBpbmcKLTA0MDMgc3RkY2FsbCBPcGVuU2VtYXBob3JlQShsb25nIGxvbmcgcHRyKSBPcGVuU2VtYXBob3JlMzJBCi0wNDA0IHN0ZGNhbGwgT3BlblNlbWFwaG9yZVcobG9uZyBsb25nIHB0cikgT3BlblNlbWFwaG9yZTMyVwotMDQwNSBzdGRjYWxsIE91dHB1dERlYnVnU3RyaW5nQShwdHIpIE91dHB1dERlYnVnU3RyaW5nMzJBCi0wNDA2IHN0dWIgT3V0cHV0RGVidWdTdHJpbmdXCi0wNDA3IHN0dWIgUGVla0NvbnNvbGVJbnB1dEEKLTA0MDggc3R1YiBQZWVrQ29uc29sZUlucHV0VwotMDQwOSBzdHViIFBlZWtOYW1lZFBpcGUKLTA0MTAgc3R1YiBQcmVwYXJlVGFwZQotMDQxMSBzdHViIFB1bHNlRXZlbnQKLTA0MTIgc3R1YiBQdXJnZUNvbW0KLTA0MTMgc3RkY2FsbCBRdWVyeURvc0RldmljZUEocHRyIHB0ciBsb25nKSBRdWVyeURvc0RldmljZTMyQQotMDQxNCBzdGRjYWxsIFF1ZXJ5RG9zRGV2aWNlVyhwdHIgcHRyIGxvbmcpIFF1ZXJ5RG9zRGV2aWNlMzJXCi0wNDE1IHN0ZGNhbGwgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIocHRyKSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgotMDQxNiBzdHViIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3kKLTA0MTcgc3R1YiBRdWVyeVdpbjMxSW5pRmlsZXNNYXBwZWRUb1JlZ2lzdHJ5Ci0wNDE4IHJlZ2lzdGVyIFJhaXNlRXhjZXB0aW9uKGxvbmcgbG9uZyBsb25nIHB0cikgUmFpc2VFeGNlcHRpb24KLTA0MTkgc3RkY2FsbCBSZWFkQ29uc29sZUEobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBSZWFkQ29uc29sZTMyQQotMDQyMCBzdHViIFJlYWRDb25zb2xlSW5wdXRBCi0wNDIxIHN0dWIgUmVhZENvbnNvbGVJbnB1dFcKLTA0MjIgc3R1YiBSZWFkQ29uc29sZU91dHB1dEEKLTA0MjMgc3R1YiBSZWFkQ29uc29sZU91dHB1dEF0dHJpYnV0ZQotMDQyNCBzdHViIFJlYWRDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQQotMDQyNSBzdHViIFJlYWRDb25zb2xlT3V0cHV0Q2hhcmFjdGVyVwotMDQyNiBzdHViIFJlYWRDb25zb2xlT3V0cHV0VwotMDQyNyBzdGRjYWxsIFJlYWRDb25zb2xlVyhsb25nIHB0ciBsb25nIHB0ciBwdHIpIFJlYWRDb25zb2xlMzJXCi0wNDI4IHN0ZGNhbGwgUmVhZEZpbGUobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBSZWFkRmlsZQotMDQyOSBzdHViIFJlYWRGaWxlRXgKLTA0MzAgc3R1YiBSZWFkUHJvY2Vzc01lbW9yeQotMDQzMSBzdHViIFJlZ2lzdGVyQ29uc29sZVZETQotMDQzMiBzdHViIFJlZ2lzdGVyV2FpdEZvcklucHV0SWRsZQotMDQzMyBzdHViIFJlZ2lzdGVyV293QmFzZUhhbmRsZXJzCi0wNDM0IHN0dWIgUmVnaXN0ZXJXb3dFeGVjCi0wNDM1IAlzdGRjYWxsIFJlbGVhc2VNdXRleChsb25nKSBSZWxlYXNlTXV0ZXgKLTA0MzYgc3RkY2FsbCBSZWxlYXNlU2VtYXBob3JlKGxvbmcgbG9uZyBwdHIpIFJlbGVhc2VTZW1hcGhvcmUKLTA0Mzcgc3RkY2FsbCBSZW1vdmVEaXJlY3RvcnlBKHB0cikgUmVtb3ZlRGlyZWN0b3J5MzJBCi0wNDM4IHN0ZGNhbGwgUmVtb3ZlRGlyZWN0b3J5VyhwdHIpIFJlbW92ZURpcmVjdG9yeTMyVwotMDQzOSAJc3RkY2FsbCBSZXNldEV2ZW50KGxvbmcpIFJlc2V0RXZlbnQKLTA0NDAgc3R1YiBSZXN1bWVUaHJlYWQKLTA0NDEgc3RkY2FsbCBSdGxGaWxsTWVtb3J5KHB0ciBsb25nIGxvbmcpIFJ0bEZpbGxNZW1vcnkKLTA0NDIgc3RkY2FsbCBSdGxNb3ZlTWVtb3J5KHB0ciBwdHIgbG9uZykgUnRsTW92ZU1lbW9yeQotMDQ0MyByZWdpc3RlciBSdGxVbndpbmQocHRyIGxvbmcgcHRyIGxvbmcpIFJ0bFVud2luZAotMDQ0NCBzdGRjYWxsIFJ0bFplcm9NZW1vcnkocHRyIGxvbmcpIFJ0bFplcm9NZW1vcnkKLTA0NDUgc3R1YiBTY3JvbGxDb25zb2xlU2NyZWVuQnVmZmVyQQotMDQ0NiBzdHViIFNjcm9sbENvbnNvbGVTY3JlZW5CdWZmZXJXCi0wNDQ3IHN0ZGNhbGwgU2VhcmNoUGF0aEEocHRyIHB0ciBwdHIgbG9uZyBwdHIgcHRyKSBTZWFyY2hQYXRoMzJBCi0wNDQ4IHN0ZGNhbGwgU2VhcmNoUGF0aFcocHRyIHB0ciBwdHIgbG9uZyBwdHIgcHRyKSBTZWFyY2hQYXRoMzJXCi0wNDQ5IHN0ZGNhbGwgU2V0Q29tbUJyZWFrKGxvbmcpIFNldENvbW1CcmVhazMyCi0wNDUwIHN0dWIgU2V0Q29tbUNvbmZpZwotMDQ1MSBzdGRjYWxsIFNldENvbW1NYXNrKGxvbmcgcHRyKSBTZXRDb21tTWFzawotMDQ1MiBzdGRjYWxsIFNldENvbW1TdGF0ZShsb25nIHB0cikgU2V0Q29tbVN0YXRlMzIKLTA0NTMgc3RkY2FsbCBTZXRDb21tVGltZW91dHMobG9uZyBwdHIpIFNldENvbW1UaW1lb3V0cwotMDQ1NCBzdHViIFNldENvbXB1dGVyTmFtZUEKLTA0NTUgc3R1YiBTZXRDb21wdXRlck5hbWVXCi0wNDU2IHN0dWIgU2V0Q29uc29sZUFjdGl2ZVNjcmVlbkJ1ZmZlcgotMDQ1NyBzdHViIFNldENvbnNvbGVDUAotMDQ1OCBzdHViIFNldENvbnNvbGVDb21tYW5kSGlzdG9yeU1vZGUKLTA0NTkgc3RkY2FsbCBTZXRDb25zb2xlQ3RybEhhbmRsZXIocHRyIGxvbmcpIFNldENvbnNvbGVDdHJsSGFuZGxlcgotMDQ2MCBzdHViIFNldENvbnNvbGVDdXJzb3IKLTA0NjEgc3R1YiBTZXRDb25zb2xlQ3Vyc29ySW5mbwotMDQ2MiBzdHViIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbgotMDQ2MyBzdHViIFNldENvbnNvbGVEaXNwbGF5TW9kZQotMDQ2NCBzdHViIFNldENvbnNvbGVGb250Ci0wNDY1IHN0dWIgU2V0Q29uc29sZUhhcmR3YXJlU3RhdGUKLTA0NjYgc3R1YiBTZXRDb25zb2xlS2V5U2hvcnRjdXRzCi0wNDY3IHN0dWIgU2V0Q29uc29sZU1heGltdW1XaW5kb3dTaXplCi0wNDY4IHN0dWIgU2V0Q29uc29sZU1lbnVDbG9zZQotMDQ2OSBzdGRjYWxsIFNldENvbnNvbGVNb2RlKGxvbmcgbG9uZykgU2V0Q29uc29sZU1vZGUKLTA0NzAgc3R1YiBTZXRDb25zb2xlTnVtYmVyT2ZDb21tYW5kc0EKLTA0NzEgc3R1YiBTZXRDb25zb2xlTnVtYmVyT2ZDb21tYW5kc1cKLTA0NzIgc3R1YiBTZXRDb25zb2xlT3V0cHV0Q1AKLTA0NzMgc3R1YiBTZXRDb25zb2xlUGFsZXR0ZQotMDQ3NCBzdHViIFNldENvbnNvbGVTY3JlZW5CdWZmZXJTaXplCi0wNDc1IHN0dWIgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUKLTA0NzYgc3RkY2FsbCBTZXRDb25zb2xlVGl0bGVBKHB0cikgU2V0Q29uc29sZVRpdGxlMzJBCi0wNDc3IHN0ZGNhbGwgU2V0Q29uc29sZVRpdGxlVyhwdHIpIFNldENvbnNvbGVUaXRsZTMyVwotMDQ3OCBzdHViIFNldENvbnNvbGVXaW5kb3dJbmZvCi0wNDc5IHN0ZGNhbGwgU2V0Q3VycmVudERpcmVjdG9yeUEocHRyKSBTZXRDdXJyZW50RGlyZWN0b3J5MzJBCi0wNDgwIHN0ZGNhbGwgU2V0Q3VycmVudERpcmVjdG9yeVcocHRyKSBTZXRDdXJyZW50RGlyZWN0b3J5MzJXCi0wNDgxIHN0dWIgU2V0RGVmYXVsdENvbW1Db25maWdBCi0wNDgyIHN0dWIgU2V0RGVmYXVsdENvbW1Db25maWdXCi0wNDgzIHN0ZGNhbGwgU2V0RW5kT2ZGaWxlKGxvbmcpIFNldEVuZE9mRmlsZQotMDQ4NCBzdGRjYWxsIFNldEVudmlyb25tZW50VmFyaWFibGVBKHB0ciBwdHIpIFNldEVudmlyb25tZW50VmFyaWFibGUzMkEKLTA0ODUgc3RkY2FsbCBTZXRFbnZpcm9ubWVudFZhcmlhYmxlVyhwdHIgcHRyKSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXCi0wNDg2IHN0ZGNhbGwgU2V0RXJyb3JNb2RlKGxvbmcpIFNldEVycm9yTW9kZTMyCi0wNDg3IAlzdGRjYWxsCVNldEV2ZW50KGxvbmcpIFNldEV2ZW50Ci0wNDg4IHN0ZGNhbGwgU2V0RmlsZUFwaXNUb0FOU0koKSBTZXRGaWxlQXBpc1RvQU5TSQotMDQ4OSBzdGRjYWxsIFNldEZpbGVBcGlzVG9PRU0oKSBTZXRGaWxlQXBpc1RvT0VNCi0wNDkwIHN0ZGNhbGwgU2V0RmlsZUF0dHJpYnV0ZXNBKHB0ciBsb25nKSBTZXRGaWxlQXR0cmlidXRlczMyQQotMDQ5MSBzdGRjYWxsIFNldEZpbGVBdHRyaWJ1dGVzVyhwdHIgbG9uZykgU2V0RmlsZUF0dHJpYnV0ZXMzMlcKLTA0OTIgc3RkY2FsbCBTZXRGaWxlUG9pbnRlcihsb25nIGxvbmcgcHRyIGxvbmcpIFNldEZpbGVQb2ludGVyCi0wNDkzIHN0ZGNhbGwgU2V0RmlsZVRpbWUobG9uZyBwdHIgcHRyIHB0cikgU2V0RmlsZVRpbWUKLTA0OTQgc3RkY2FsbCBTZXRIYW5kbGVDb3VudChsb25nKSBTZXRIYW5kbGVDb3VudDMyCi0wNDk1IHN0dWIgU2V0SGFuZGxlSW5mb3JtYXRpb24KLTA0OTYgc3R1YiBTZXRMYXN0Q29uc29sZUV2ZW50QWN0aXZlCi0wNDk3IHN0ZGNhbGwgU2V0TGFzdEVycm9yKGxvbmcpIFNldExhc3RFcnJvcgotMDQ5OCBzdHViIFNldExvY2FsVGltZQotMDQ5OSBzdGRjYWxsIFNldExvY2FsZUluZm9BKGxvbmcgbG9uZyBwdHIpIFNldExvY2FsZUluZm9BCi0wNTAwIHN0dWIgU2V0TG9jYWxlSW5mb1cKLTA1MDEgc3R1YiBTZXRNYWlsc2xvdEluZm8KLTA1MDIgc3R1YiBTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZQotMDUwMyBzdGRjYWxsIFNldFByaW9yaXR5Q2xhc3MobG9uZyBsb25nKSBTZXRQcmlvcml0eUNsYXNzCi0wNTA0IHN0dWIgU2V0UHJvY2Vzc1NodXRkb3duUGFyYW1ldGVycwotMDUwNSBzdHViIFNldFByb2Nlc3NXb3JraW5nU2V0U2l6ZQotMDUwNiBzdGRjYWxsIFNldFN0ZEhhbmRsZShsb25nIGxvbmcpIFNldFN0ZEhhbmRsZQotMDUwNyBzdGRjYWxsIFNldFN5c3RlbVRpbWUocHRyKSBTZXRTeXN0ZW1UaW1lCi0wNTA4IHN0dWIgU2V0U3lzdGVtVGltZUFkanVzdG1lbnQKLTA1MDkgc3R1YiBTZXRUYXBlUGFyYW1ldGVycwotMDUxMCBzdHViIFNldFRhcGVQb3NpdGlvbgotMDUxMSBzdGRjYWxsIFNldFRocmVhZEFmZmluaXR5TWFzayhsb25nIGxvbmcpCVNldFRocmVhZEFmZmluaXR5TWFzawotMDUxMiBzdHViIFNldFRocmVhZENvbnRleHQKLTA1MTMgc3R1YiBTZXRUaHJlYWRMb2NhbGUKLTA1MTQgc3RkY2FsbCBTZXRUaHJlYWRQcmlvcml0eShsb25nIGxvbmcpIFNldFRocmVhZFByaW9yaXR5Ci0wNTE1IHN0ZGNhbGwgU2V0VGltZVpvbmVJbmZvcm1hdGlvbihwdHIpIFNldFRpbWVab25lSW5mb3JtYXRpb24KLTA1MTYgc3RkY2FsbCBTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIocHRyKSBUSFVOS19TZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIKLTA1MTcgc3R1YiBTZXRWRE1DdXJyZW50RGlyZWN0b3JpZXMKLTA1MTggc3R1YiBTZXRWb2x1bWVMYWJlbEEKLTA1MTkgc3R1YiBTZXRWb2x1bWVMYWJlbFcKLTA1MjAgc3R1YiBTZXR1cENvbW0KLTA1MjEgc3R1YiBTaG93Q29uc29sZUN1cnNvcgotMDUyMiBzdGRjYWxsIFNpemVvZlJlc291cmNlKGxvbmcgbG9uZykgU2l6ZW9mUmVzb3VyY2UzMgotMDUyMyAJc3RkY2FsbCBTbGVlcChsb25nKSBTbGVlcAotMDUyNCBzdHViIFNsZWVwRXgKLTA1MjUgc3R1YiBTdXNwZW5kVGhyZWFkCi0wNTI2IHN0ZGNhbGwgU3lzdGVtVGltZVRvRmlsZVRpbWUocHRyIHB0cikgU3lzdGVtVGltZVRvRmlsZVRpbWUKLTA1Mjcgc3R1YiBTeXN0ZW1UaW1lVG9UelNwZWNpZmljTG9jYWxUaW1lCi0wNTI4IHN0dWIgVGVybWluYXRlUHJvY2VzcwotMDUyOSBzdHViIFRlcm1pbmF0ZVRocmVhZAotMDUzMCBzdGRjYWxsIFRsc0FsbG9jKCkJVGxzQWxsb2MKLTA1MzEgc3RkY2FsbCBUbHNGcmVlKGxvbmcpIFRsc0ZyZWUKLTA1MzIgc3RkY2FsbCBUbHNHZXRWYWx1ZShsb25nKSBUbHNHZXRWYWx1ZQotMDUzMyBzdGRjYWxsIFRsc1NldFZhbHVlKGxvbmcgcHRyKSBUbHNTZXRWYWx1ZQotMDUzNCBzdHViIFRyYW5zYWN0TmFtZWRQaXBlCi0wNTM1IHN0ZGNhbGwgVHJhbnNtaXRDb21tQ2hhcihsb25nIGxvbmcpIFRyYW5zbWl0Q29tbUNoYXIzMgotMDUzNiBzdHViIFRyaW1WaXJ0dWFsQnVmZmVyCi0wNTM3IHN0ZGNhbGwgVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKHB0cikgVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCi0wNTM4IHN0ZGNhbGwgVW5sb2NrRmlsZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIFVubG9ja0ZpbGUKLTA1Mzkgc3R1YiBVbmxvY2tGaWxlRXgKLTA1NDAgc3RkY2FsbCBVbm1hcFZpZXdPZkZpbGUocHRyKSBVbm1hcFZpZXdPZkZpbGUKLTA1NDEgc3R1YiBVcGRhdGVSZXNvdXJjZUEKLTA1NDIgc3R1YiBVcGRhdGVSZXNvdXJjZVcKLTA1NDMgc3R1YiBWRE1Db25zb2xlT3BlcmF0aW9uCi0wNTQ0IHN0dWIgVkRNT3BlcmF0aW9uU3RhcnRlZAotMDU0NSBzdHViIFZlckxhbmd1YWdlTmFtZUEKLTA1NDYgc3R1YiBWZXJMYW5ndWFnZU5hbWVXCi0wNTQ3IHN0dWIgVmVyaWZ5Q29uc29sZUlvSGFuZGxlCi0wNTQ4IHN0ZGNhbGwgVmlydHVhbEFsbG9jKHB0ciBsb25nIGxvbmcgbG9uZykgVmlydHVhbEFsbG9jCi0wNTQ5IHN0dWIgVmlydHVhbEJ1ZmZlckV4Y2VwdGlvbkhhbmRsZXIKLTA1NTAgc3RkY2FsbCBWaXJ0dWFsRnJlZShwdHIgbG9uZyBsb25nKSBWaXJ0dWFsRnJlZQotMDU1MSBzdGRjYWxsIFZpcnR1YWxMb2NrKHB0ciBsb25nKSBWaXJ0dWFsTG9jawotMDU1MiBzdGRjYWxsIFZpcnR1YWxQcm90ZWN0KHB0ciBsb25nIGxvbmcgcHRyKSBWaXJ0dWFsUHJvdGVjdAotMDU1MyBzdGRjYWxsIFZpcnR1YWxQcm90ZWN0RXgobG9uZyBwdHIgbG9uZyBsb25nIHB0cikgVmlydHVhbFByb3RlY3RFeAotMDU1NCBzdGRjYWxsIFZpcnR1YWxRdWVyeShwdHIgcHRyIGxvbmcpIFZpcnR1YWxRdWVyeQotMDU1NSBzdGRjYWxsIFZpcnR1YWxRdWVyeUV4KGxvbmcgcHRyIHB0ciBsb25nKSBWaXJ0dWFsUXVlcnlFeAotMDU1NiBzdGRjYWxsIFZpcnR1YWxVbmxvY2socHRyIGxvbmcpIFZpcnR1YWxVbmxvY2sKLTA1NTcgc3R1YiBXYWl0Q29tbUV2ZW50Ci0wNTU4IHN0dWIgV2FpdEZvckRlYnVnRXZlbnQKLTA1NTkgc3R1YiBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzCi0wNTYwIHN0dWIgV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4Ci0wNTYxIAlzdGRjYWxsIFdhaXRGb3JTaW5nbGVPYmplY3QobG9uZyBsb25nKSBXYWl0Rm9yU2luZ2xlT2JqZWN0Ci0wNTYyIHN0dWIgV2FpdEZvclNpbmdsZU9iamVjdEV4Ci0wNTYzIHN0dWIgV2FpdE5hbWVkUGlwZUEKLTA1NjQgc3R1YiBXYWl0TmFtZWRQaXBlVwotMDU2NSBzdGRjYWxsIFdpZGVDaGFyVG9NdWx0aUJ5dGUobG9uZyBsb25nIHB0ciBsb25nIHB0ciBsb25nIHB0ciBwdHIpCVdpZGVDaGFyVG9NdWx0aUJ5dGUKLTA1NjYgc3RkY2FsbCBXaW5FeGVjKHB0ciBsb25nKSBXaW5FeGVjMzIKLTA1Njcgc3RkY2FsbCBXcml0ZUNvbnNvbGVBKGxvbmcgcHRyIGxvbmcgcHRyIHB0cikgV3JpdGVDb25zb2xlMzJBCi0wNTY4IHN0dWIgV3JpdGVDb25zb2xlSW5wdXRBCi0wNTY5IHN0dWIgV3JpdGVDb25zb2xlSW5wdXRWRE1BCi0wNTcwIHN0dWIgV3JpdGVDb25zb2xlSW5wdXRWRE1XCi0wNTcxIHN0dWIgV3JpdGVDb25zb2xlSW5wdXRXCi0wNTcyIHN0dWIgV3JpdGVDb25zb2xlT3V0cHV0QQotMDU3MyBzdHViIFdyaXRlQ29uc29sZU91dHB1dEF0dHJpYnV0ZQotMDU3NCBzdHViIFdyaXRlQ29uc29sZU91dHB1dENoYXJhY3RlckEKLTA1NzUgc3R1YiBXcml0ZUNvbnNvbGVPdXRwdXRDaGFyYWN0ZXJXCi0wNTc2IHN0dWIgV3JpdGVDb25zb2xlT3V0cHV0VwotMDU3NyBzdGRjYWxsIFdyaXRlQ29uc29sZVcobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBXcml0ZUNvbnNvbGUzMlcKLTA1Nzggc3RkY2FsbCBXcml0ZUZpbGUobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBXcml0ZUZpbGUKLTA1Nzkgc3R1YiBXcml0ZUZpbGVFeAotMDU4MCBzdHViIFdyaXRlUHJpdmF0ZVByb2ZpbGVTZWN0aW9uQQotMDU4MSBzdHViIFdyaXRlUHJpdmF0ZVByb2ZpbGVTZWN0aW9uVwotMDU4MiBzdGRjYWxsIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmdBKHB0ciBwdHIgcHRyIHB0cikgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZzMyQQotMDU4MyBzdGRjYWxsIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmdXKHB0ciBwdHIgcHRyIHB0cikgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZzMyVwotMDU4NCBzdHViIFdyaXRlUHJvY2Vzc01lbW9yeQotMDU4NSBzdHViIFdyaXRlUHJvZmlsZVNlY3Rpb25BCi0wNTg2IHN0dWIgV3JpdGVQcm9maWxlU2VjdGlvblcKLTA1ODcgc3RkY2FsbCBXcml0ZVByb2ZpbGVTdHJpbmdBKHB0ciBwdHIgcHRyKSBXcml0ZVByb2ZpbGVTdHJpbmczMkEKLTA1ODggc3RkY2FsbCBXcml0ZVByb2ZpbGVTdHJpbmdXKHB0ciBwdHIgcHRyKSBXcml0ZVByb2ZpbGVTdHJpbmczMlcKLTA1ODkgc3R1YiBXcml0ZVRhcGVtYXJrCi0wNTkwIHN0ZGNhbGwgX2hyZWFkKGxvbmcgcHRyIGxvbmcpIF9ocmVhZDMyCi0wNTkxIHN0ZGNhbGwgX2h3cml0ZShsb25nIHB0ciBsb25nKSBfaHdyaXRlMzIKLTA1OTIgc3RkY2FsbCBfbGNsb3NlKGxvbmcpIF9sY2xvc2UzMgotMDU5MyBzdGRjYWxsIF9sY3JlYXQocHRyIGxvbmcpIF9sY3JlYXQzMgotMDU5NCBzdGRjYWxsIF9sbHNlZWsobG9uZyBsb25nIGxvbmcpIF9sbHNlZWszMgotMDU5NSBzdGRjYWxsIF9sb3BlbihwdHIgbG9uZykgX2xvcGVuMzIKLTA1OTYgc3RkY2FsbCBfbHJlYWQobG9uZyBwdHIgbG9uZykgX2xyZWFkMzIKLTA1OTcgc3RkY2FsbCBfbHdyaXRlKGxvbmcgcHRyIGxvbmcpIF9sd3JpdGUzMgotMDU5OCBzdGRjYWxsIGxzdHJjYXQocHRyIHB0cikgbHN0cmNhdDMyQQotMDU5OSBzdGRjYWxsIGxzdHJjYXRBKHB0ciBwdHIpIGxzdHJjYXQzMkEKLTA2MDAgc3RkY2FsbCBsc3RyY2F0VyhwdHIgcHRyKSBsc3RyY2F0MzJXCi0wNjAxIHN0ZGNhbGwgbHN0cmNtcChwdHIgcHRyKSBsc3RyY21wMzJBCi0wNjAyIHN0ZGNhbGwgbHN0cmNtcEEocHRyIHB0cikgbHN0cmNtcDMyQQotMDYwMyBzdGRjYWxsIGxzdHJjbXBXKHB0ciBwdHIpIGxzdHJjbXAzMlcKLTA2MDQgc3RkY2FsbCBsc3RyY21waShwdHIgcHRyKSBsc3RyY21waTMyQQotMDYwNSBzdGRjYWxsIGxzdHJjbXBpQShwdHIgcHRyKSBsc3RyY21waTMyQQotMDYwNiBzdGRjYWxsIGxzdHJjbXBpVyhwdHIgcHRyKSBsc3RyY21waTMyVwotMDYwNyBzdGRjYWxsIGxzdHJjcHkocHRyIHB0cikgbHN0cmNweTMyQQotMDYwOCBzdGRjYWxsIGxzdHJjcHlBKHB0ciBwdHIpIGxzdHJjcHkzMkEKLTA2MDkgc3RkY2FsbCBsc3RyY3B5VyhwdHIgcHRyKSBsc3RyY3B5MzJXCi0wNjEwIHN0ZGNhbGwgbHN0cmNweW4ocHRyIHB0ciBsb25nKSBsc3RyY3B5bjMyQQotMDYxMSBzdGRjYWxsIGxzdHJjcHluQShwdHIgcHRyIGxvbmcpIGxzdHJjcHluMzJBCi0wNjEyIHN0ZGNhbGwgbHN0cmNweW5XKHB0ciBwdHIgbG9uZykgbHN0cmNweW4zMlcKLTA2MTMgc3RkY2FsbCBsc3RybGVuKHB0cikgbHN0cmxlbjMyQQotMDYxNCBzdGRjYWxsIGxzdHJsZW5BKHB0cikgbHN0cmxlbjMyQQotMDYxNSBzdGRjYWxsIGxzdHJsZW5XKHB0cikgbHN0cmxlbjMyVwotI2xhdGUgYWRkaXRpb25zCi0wNjE2IHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uTmFtZXNBCi0wNjE3IHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uTmFtZXNXCi0wNjE4IHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTdHJ1Y3RBCi0wNjE5IHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTdHJ1Y3RXCi0wNjIwIHN0dWIgR2V0UHJvY2Vzc1ZlcnNpb24KLTA2MjEgICAgc3RkY2FsbCBHZXRTeXN0ZW1Qb3dlclN0YXR1cyhwdHIpIEdldFN5c3RlbVBvd2VyU3RhdHVzCi0wNjIyIHN0dWIgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUKLTA2MjMgc3R1YiBIZWFwQ3JlYXRlVGFnc1cKLTA2MjQgc3R1YiBIZWFwRXh0ZW5kCi0wNjI1IHN0dWIgSGVhcFF1ZXJ5VGFnVwotMDYyNiBzdHViIEhlYXBTdW1tYXJ5Ci0wNjI3IHN0dWIgSGVhcFVzYWdlCi0wNjI4IHN0dWIgSXNEZWJ1Z2dlclByZXNlbnQKLTA2Mjkgc3R1YiBQb3N0UXVldWVkQ29tcGxldGlvblN0YXR1cwotMDYzMCAgICBzdGRjYWxsIFNldFN5c3RlbVBvd2VyU3RhdGUobG9uZyBsb25nKSBTZXRTeXN0ZW1Qb3dlclN0YXRlCi0wNjMxIHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVN0cnVjdEEKLTA2MzIgc3R1YiBXcml0ZVByaXZhdGVQcm9maWxlU3RydWN0VwotMDYzMyBzdGRjYWxsIE1ha2VDcml0aWNhbFNlY3Rpb25HbG9iYWwocHRyKSBNYWtlQ3JpdGljYWxTZWN0aW9uR2xvYmFsCi0jZXh0cmEgbGF0ZSBhZGRpdGlvbnMKLTA2MzQgc3RkY2FsbCBUaHVua0Nvbm5lY3QzMihwdHIgcHRyIHB0ciBwdHIgcHRyIHB0cikgVGh1bmtDb25uZWN0MzIKLTA2MzYgc3R1YiBTVW5NYXBMUwotMDYzNyBzdHViIFNNYXBMUwotMDYzOCBzdGRjYWxsIFJlaW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihwdHIpIFJlaW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbgotMDYzOSBzdHViIEZUX1RodW5rCi0wNjQwIHN0dWIgRlRfRXhpdDIwCi0wNjQxIHN0dWIgU01hcExTX0lQX0VCUF8xMgotMDY0MiBzdHViIFNVbk1hcExTX0lQX0VCUF8xMgotMDY0MyBzdHViIE1hcFNMRml4Ci0wNjQ0IHN0dWIgVW5NYXBTTEZpeEFycmF5Ci0wNjQ1IHN0dWIgZHByaW50ZgotMDY0NiBzdHViIENyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdAotMDY0NyBzdHViIE1vZHVsZTMyRmlyc3QKLTA2NDggc3R1YiBNb2R1bGUzMk5leHQKLTA2NDkgc3R1YiBQcm9jZXNzMzJGaXJzdAotMDY1MCBzdHViIFByb2Nlc3MzMk5leHQKLTA2NTEgc3R1YiBUaHJlYWQzMkZpcnN0Ci0wNjUyIHN0dWIgVGhyZWFkMzJOZXh0Ci0wNjUzIHN0dWIgUmVnaXN0ZXJTZXJ2aWNlUHJvY2VzcwotMDY1NCBzdHViIFF1ZXVlVXNlckFQQwotMDY1NSBzdHViIENvbnZlcnRUb0dsb2JhbEhhbmRsZQotMDY1NiBzdHViIFNNYXBMU19JUF9FQlBfOAotMDY1NyBzdHViIFNNYXBMU19JUF9FQlBfMTYKLTA2NTggc3R1YiBTTWFwTFNfSVBfRUJQXzIwCi0wNjU5IHN0dWIgU1VuTWFwTFNfSVBfRUJQXzgKLTA2NjAgc3R1YiBTVW5NYXBMU19JUF9FQlBfMTYKLTA2NjEgc3R1YiBTVW5NYXBMU19JUF9FQlBfMjAKLTA2NjIgc3RkY2FsbCBNYXBTTChsb25nKSBNYXBTTAotMDY2MyBzdHViIEszMlRoazE2MzJFcGlsb2cKLTA2NjQgc3R1YiBLMzJUaGsxNjMyUHJvbG9nCi0wNjY1IHN0dWIgR2V0UHJvY2Vzc0ZsYWdzCi0wNjY2IHN0dWIgU01hcExTX0lQX0VCUF8yNAotMDY2NyBzdHViIFNVbk1hcExTX0lQX0VCUF8yNAotMDY2OCBzdHViIFNNYXBMU19JUF9FQlBfMzIKLTA2Njkgc3R1YiBTVW5NYXBMU19JUF9FQlBfMzIKLTA2NzAgc3R1YiBTTWFwTFNfSVBfRUJQXzI4Ci0wNjcxIHN0dWIgU1VuTWFwTFNfSVBfRUJQXzI4Ci0wNjcyIHN0dWIgU01hcExTX0lQX0VCUF80MAotMDY3MyBzdHViIFNVbk1hcExTX0lQX0VCUF80MAotMDY3NCBzdHViIEZyZWVTTENhbGxiYWNrCi0wNjc1IHN0dWIgQWxsb2NTTENhbGxiYWNrCi0wNjc2IHN0dWIgQ2FsbGJhY2syOAotMDY3NyBzdHViIFVuaW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbgotMDY3OCBzdHViIEZUX0V4aXQ0Ci0wNjc5IHN0ZGNhbGwgTWFwTFMocHRyKSBNYXBMUwotMDY4MCBzdGRjYWxsIFVuTWFwTFMobG9uZykgVW5NYXBMUwotMDY4MSBzdHViIE9wZW5WeERIYW5kbGUKLTA2ODIgc3R1YiBGVF9FeGl0MTIKKyMgRnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZSBXaW45NSBrZXJuZWwzMi5kbGwgCisjICh0aGVzZSBuZWVkIHRvIGhhdmUgdGhlc2UgZXhhY3Qgb3JkaW5hbHMsIGZvciBzb21lIHdpbjk1IGRsbHMgCisjICBpbXBvcnQga2VybmVsMzIuZGxsIGJ5IG9yZGluYWwpCisjIHRoZSBiYXNlIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGVzZSBvcmRpbmFscworCisjIHVuZG9jdW1lbnRlZCBvcmRpbmFsIG9ubHkgY2FsbHMgKG5hbWVzIHRha2VuIGZyb20gazMyZXhwLmggYnkgQW5kcmV3CisjIFNjaHVsbWFuLgorMCAgc3R1YiBWeERDYWxsMAorMSAgc3R1YiBWeERDYWxsMAorMiAgc3R1YiBWeERDYWxsMAorMyAgc3R1YiBWeERDYWxsMAorNCAgc3R1YiBWeERDYWxsMAorNSAgc3R1YiBWeERDYWxsMAorNiAgc3R1YiBWeERDYWxsMAorNyAgc3R1YiBWeERDYWxsMAorOCAgc3R1YiBWeERDYWxsMAorIAorOSAgc3R1YiBfS0VSTkVMMzJfc3RyaW5nY29udjEgI2Fuc2kyb2VtIG9yIHJldmVyc2U/CisgCisxNyAgc3RkY2FsbCBfS0VSTkVMMzJfMTgobG9uZyBsb25nKSBfS0VSTkVMMzJfMTgKKzE4ICBzdHViIF9LRVJORUwzMl9nZXRoZWFwc2VnbWVudAorIAorMzAgIHN0dWIgX0tFUk5FTDMyXzMxCisgCiszNCAgc3R1YiBMb2FkTGlicmFyeTE2CiszNSAgc3R1YiBGcmVlTGlicmFyeTE2CiszNiAgc3R1YiBHZXRQcm9jQWRkcmVzczE2CisgCiszOSAgc3R1YiBfS0VSTkVMMzJfNDAKKworNDIgIHJldHVybiBfS0VSTkVMMzJfNDMgMjAgMAorNDQgIHN0dWIgX0tFUk5FTDMyXzQ1CisgCis0OSAgc3RkY2FsbCBBZGRBdG9tQShwdHIpIEFkZEF0b20zMkEKKworNTEgIHJlZ2lzdGVyIF9LRVJORUwzMl81Mihsb25nKSBfS0VSTkVMMzJfNTIKKworIyBXT1cgY2FsbHMKKzUzICBzdHViIFdPV0NhbGxiYWNrMTYKKzU0ICBzdHViIFdPV0NhbGxiYWNrMTZFeAorNTUgIHN0dWIgV09XR2V0VkRNUG9pbnRlcgorNTYgIHN0dWIgV09XSGFuZGxlMzIKKzU3ICBzdHViIFdPV0hhbmRsZTE2Cis1OCAgc3R1YiBXT1dHbG9iYWxBbGxvYzE2Cis1OSAgc3R1YiBXT1dHbG9iYWxMb2NrMTYKKzYwICBzdHViIFdPV0dsb2JhbFVubG9jazE2Cis2MSAgc3R1YiBXT1dHbG9iYWxGcmVlMTYKKzYyICBzdHViIFdPV0dsb2JhbEFsbG9jTG9jazE2Cis2MyAgc3R1YiBXT1dHbG9iYWxVbmxvY2tGcmVlMTYKKzY0ICBzdHViIFdPV0dsb2JhbExvY2tTaXplMTYKKzY1ICBzdHViIFdPV1lpZWxkMTYKKzY2ICBzdHViIFdPV0RpcmVjdGVkWWllbGQxNgorNjcgIHN0dWIgV09XR2V0VkRNUG9pbnRlckZpeAorNjggIHN0dWIgV09XR2V0VkRNUG9pbnRlclVuZml4Cis2OSAgc3R1YiBXT1czMl8xCisgCis3MSAgc3R1YiBSdGxMYXJnZUludGVnZXJBZGQKKzcyICBzdHViIFJ0bEVubGFyZ2VkSW50ZWdlck11bHRpcGx5Cis3MyAgc3R1YiBSdGxFbmxhcmdlZFVuc2lnbmVkTXVsdGlwbHkKKzc0ICBzdHViIFJ0bEVubGFyZ2VkVW5zaWduZWREaXZpZGUKKzc1ICBzdHViIFJ0bEV4dGVuZGVkTGFyZ2VJbnRlZ2VyRGl2aWRlCis3NiAgc3R1YiBSdGxFeHRlbmRlZE1hZ2ljRGl2aWRlCis3NyAgc3R1YiBSdGxFeHRlbmRlZEludGVnZXJNdWx0aXBseQorNzggIHN0dWIgUnRsTGFyZ2VJbnRlZ2VyU2hpZnRMZWZ0Cis3OSAgc3R1YiBSdGxMYXJnZUludGVnZXJTaGlmdFJpZ2h0Cis4MCAgc3R1YiBSdGxMYXJnZUludGVnZXJBcml0aG1ldGljU2hpZnQKKzgxICBzdHViIFJ0bExhcmdlSW50ZWdlck5lZ2F0ZQorODIgIHN0dWIgUnRsTGFyZ2VJbnRlZ2VyU3VidHJhY3QKKzgzICBzdHViIFJ0bENvbnZlcnRMb25nVG9MYXJnZUludGVnZXIKKzg0ICBzdHViIFJ0bENvbnZlcnRVbG9uZ1RvTGFyZ2VJbnRlZ2VyCisKKzg2ICBzdHViIF9LRVJORUwzMl84NworODcgIHN0dWIgX0tFUk5FTDMyXzg4CisKKzkwICBzdHViIF9LRVJORUwzMl85MAorOTEgIHN0dWIgX0tFUk5FTDMyXzkxCis5MiAgc3RkY2FsbCBHRVRQV0lOMTZMT0NLKHB0cikgR2V0UFdpbkxvY2sKKzk2ICBzdHViIEVOVEVSU1lTTEVWRUwKKzk3ICBzdHViIExFQVZFU1lTTEVWRUwKKzk4ICBzdHViIF9LRVJORUwzMl85OAorOTkgIHN0dWIgX0tFUk5FTDMyXzk5CisxMDAgc3R1YiBfS0VSTkVMMzJfMTAwCisKKworMTAxICAgc3RkY2FsbCBBZGRBdG9tVyhwdHIpIEFkZEF0b20zMlcKKzEwMiAgIHN0dWIgQWxsb2NDb25zb2xlCisxMDMgICBzdHViIEFsbG9jTFNDYWxsYmFjaworMTA0ICAgc3R1YiBBbGxvY1NMQ2FsbGJhY2sKKzEwNSAgIHN0ZGNhbGwgQXJlRmlsZUFwaXNBTlNJKCkgQXJlRmlsZUFwaXNBTlNJCisxMDYgICBzdHViIEJhY2t1cFJlYWQKKzEwNyAgIHN0dWIgQmFja3VwU2VlaworMTA4ICAgc3R1YiBCYWNrdXBXcml0ZQorMTA5ICAgc3RkY2FsbCBCZWVwKGxvbmcgbG9uZykgQmVlcAorMTEwICAgc3R1YiBCZWdpblVwZGF0ZVJlc291cmNlQQorMTExICAgc3R1YiBCZWdpblVwZGF0ZVJlc291cmNlVworMTEyICAgc3RkY2FsbCBCdWlsZENvbW1EQ0JBKHB0ciBwdHIpIEJ1aWxkQ29tbURDQjMyQQorMTEzICAgc3RkY2FsbCBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EocHRyIHB0ciBwdHIpIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzMzJBCisxMTQgICBzdGRjYWxsIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVyhwdHIgcHRyIHB0cikgQnVpbGRDb21tRENCQW5kVGltZW91dHMzMlcKKzExNSAgIHN0ZGNhbGwgQnVpbGRDb21tRENCVyhwdHIgcHRyKSBCdWlsZENvbW1EQ0IzMlcKKzExNiAgIHN0dWIgQ2FsbE5hbWVkUGlwZUEKKzExNyAgIHN0dWIgQ2FsbE5hbWVkUGlwZVcKKzExOCAgIHN0dWIgQ2FsbGJhY2sxMgorMTE5ICAgc3R1YiBDYWxsYmFjazE2CisxMjAgICBzdHViIENhbGxiYWNrMjAKKzEyMSAgIHN0dWIgQ2FsbGJhY2syNAorMTIyICAgc3R1YiBDYWxsYmFjazI4CisxMjMgICBzdHViIENhbGxiYWNrMzIKKzEyNCAgIHN0dWIgQ2FsbGJhY2szNgorMTI1ICAgc3R1YiBDYWxsYmFjazQwCisxMjYgICBzdHViIENhbGxiYWNrNDQKKzEyNyAgIHN0dWIgQ2FsbGJhY2s0OAorMTI4ICAgc3R1YiBDYWxsYmFjazQKKzEyOSAgIHN0dWIgQ2FsbGJhY2s1MgorMTMwICAgc3R1YiBDYWxsYmFjazU2CisxMzEgICBzdHViIENhbGxiYWNrNjAKKzEzMiAgIHN0dWIgQ2FsbGJhY2s2NAorMTMzICAgc3R1YiBDYWxsYmFjazgKKzEzNCAgIHN0ZGNhbGwgQ2xlYXJDb21tQnJlYWsobG9uZykgQ2xlYXJDb21tQnJlYWszMgorMTM1ICAgc3RkY2FsbCBDbGVhckNvbW1FcnJvcihsb25nIHB0ciBwdHIpIENsZWFyQ29tbUVycm9yCisxMzYgICBzdGRjYWxsIENsb3NlSGFuZGxlKGxvbmcpIENsb3NlSGFuZGxlCisxMzcgICBzdHViIENsb3NlUHJvZmlsZVVzZXJNYXBwaW5nCisxMzggICBzdHViIENsb3NlU3lzdGVtSGFuZGxlCisxMzkgICBzdHViIENvbW1Db25maWdEaWFsb2dBCisxNDAgICBzdHViIENvbW1Db25maWdEaWFsb2dXCisxNDEgICBzdGRjYWxsIENvbXBhcmVGaWxlVGltZShwdHIgcHRyKSBDb21wYXJlRmlsZVRpbWUKKzE0MiAgIHN0ZGNhbGwgQ29tcGFyZVN0cmluZ0EobG9uZyBsb25nIHB0ciBsb25nIHB0ciBsb25nKSBDb21wYXJlU3RyaW5nMzJBCisxNDMgICBzdGRjYWxsIENvbXBhcmVTdHJpbmdXKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgQ29tcGFyZVN0cmluZzMyVworMTQ0ICAgc3R1YiBDb25uZWN0TmFtZWRQaXBlCisxNDUgICBzdGRjYWxsIENvbnRpbnVlRGVidWdFdmVudChsb25nIGxvbmcgbG9uZykgQ29udGludWVEZWJ1Z0V2ZW50CisxNDYgICBzdHViIENvbnZlcnREZWZhdWx0TG9jYWxlCisxNDcgICBzdHViIENvbnZlcnRUb0dsb2JhbEhhbmRsZQorMTQ4ICAgc3RkY2FsbCBDb3B5RmlsZUEocHRyIHB0ciBsb25nKSBDb3B5RmlsZTMyQQorMTQ5ICAgc3RkY2FsbCBDb3B5RmlsZVcocHRyIHB0ciBsb25nKSBDb3B5RmlsZTMyVworMTUwICAgc3R1YiBDcmVhdGVDb25zb2xlU2NyZWVuQnVmZmVyCisxNTEgICBzdGRjYWxsIENyZWF0ZURpcmVjdG9yeUEocHRyIHB0cikgQ3JlYXRlRGlyZWN0b3J5MzJBCisxNTIgICBzdGRjYWxsIENyZWF0ZURpcmVjdG9yeUV4QShwdHIgcHRyIHB0cikgQ3JlYXRlRGlyZWN0b3J5RXgzMkEKKzE1MyAgIHN0ZGNhbGwgQ3JlYXRlRGlyZWN0b3J5RXhXKHB0ciBwdHIgcHRyKSBDcmVhdGVEaXJlY3RvcnlFeDMyVworMTU0ICAgc3RkY2FsbCBDcmVhdGVEaXJlY3RvcnlXKHB0ciBwdHIpIENyZWF0ZURpcmVjdG9yeTMyVworMTU1ICAgc3RkY2FsbCBDcmVhdGVFdmVudEEocHRyIGxvbmcgbG9uZyBwdHIpIENyZWF0ZUV2ZW50MzJBCisxNTYgICBzdGRjYWxsIENyZWF0ZUV2ZW50VyhwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlRXZlbnQzMlcKKzE1NyAgIHN0ZGNhbGwgQ3JlYXRlRmlsZUEocHRyIGxvbmcgbG9uZyBwdHIgbG9uZyBsb25nIGxvbmcpIENyZWF0ZUZpbGUzMkEKKzE1OCAgIHN0ZGNhbGwgQ3JlYXRlRmlsZU1hcHBpbmdBKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nIHB0cikgQ3JlYXRlRmlsZU1hcHBpbmczMkEKKzE1OSAgIHN0ZGNhbGwgQ3JlYXRlRmlsZU1hcHBpbmdXKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nIHB0cikgQ3JlYXRlRmlsZU1hcHBpbmczMlcKKzE2MCAgIHN0ZGNhbGwgQ3JlYXRlRmlsZVcocHRyIGxvbmcgbG9uZyBwdHIgbG9uZyBsb25nIGxvbmcpIENyZWF0ZUZpbGUzMlcKKzE2MSAgIHN0dWIgQ3JlYXRlSW9Db21wbGV0aW9uUG9ydAorMTYyICAgc3R1YiBDcmVhdGVLZXJuZWxUaHJlYWQKKzE2MyAgIHN0dWIgQ3JlYXRlTWFpbHNsb3RBCisxNjQgICBzdHViIENyZWF0ZU1haWxzbG90VworMTY1ICAgc3RkY2FsbCBDcmVhdGVNdXRleEEocHRyIGxvbmcgcHRyKSBDcmVhdGVNdXRleDMyQQorMTY2ICAgc3RkY2FsbCBDcmVhdGVNdXRleFcocHRyIGxvbmcgcHRyKSBDcmVhdGVNdXRleDMyVworMTY3ICAgc3R1YiBDcmVhdGVOYW1lZFBpcGVBCisxNjggICBzdHViIENyZWF0ZU5hbWVkUGlwZVcKKzE2OSAgIHN0dWIgQ3JlYXRlUGlwZQorMTcwICAgc3RkY2FsbCBDcmVhdGVQcm9jZXNzQShwdHIgcHRyIHB0ciBwdHIgbG9uZyBsb25nIHB0ciBwdHIgcHRyIHB0cikgQ3JlYXRlUHJvY2VzczMyQQorMTcxICAgc3R1YiBDcmVhdGVQcm9jZXNzVworMTcyICAgc3R1YiBDcmVhdGVSZW1vdGVUaHJlYWQKKzE3MyAgIHN0ZGNhbGwgQ3JlYXRlU2VtYXBob3JlQShwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlU2VtYXBob3JlMzJBCisxNzQgICBzdGRjYWxsIENyZWF0ZVNlbWFwaG9yZVcocHRyIGxvbmcgbG9uZyBwdHIpIENyZWF0ZVNlbWFwaG9yZTMyVworMTc1ICAgc3R1YiBDcmVhdGVTb2NrZXRIYW5kbGUKKzE3NiAgIHN0dWIgQ3JlYXRlVGFwZVBhcnRpdGlvbgorMTc3ICAgc3RkY2FsbCBDcmVhdGVUaHJlYWQocHRyIGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIpIENyZWF0ZVRocmVhZAorMTc4ICAgc3R1YiBDcmVhdGVUb29saGVscDMyU25hcHNob3QKKzE3OSAgIHN0dWIgRGVidWdBY3RpdmVQcm9jZXNzCisxODAgICBzdGRjYWxsIERlYnVnQnJlYWsoKSBEZWJ1Z0JyZWFrMzIKKzE4MSAgIHN0dWIgRGVmaW5lRG9zRGV2aWNlQQorMTgyICAgc3R1YiBEZWZpbmVEb3NEZXZpY2VXCisxODMgICBzdGRjYWxsIERlbGV0ZUF0b20obG9uZykgRGVsZXRlQXRvbTMyCisxODQgICBzdGRjYWxsIERlbGV0ZUNyaXRpY2FsU2VjdGlvbihwdHIpCURlbGV0ZUNyaXRpY2FsU2VjdGlvbgorMTg1ICAgc3RkY2FsbCBEZWxldGVGaWxlQShwdHIpIERlbGV0ZUZpbGUzMkEKKzE4NiAgIHN0ZGNhbGwgRGVsZXRlRmlsZVcocHRyKSBEZWxldGVGaWxlMzJXCisxODcgICBzdHViIERldmljZUlvQ29udHJvbAorMTg4ICAgc3RkY2FsbCBEaXNhYmxlVGhyZWFkTGlicmFyeUNhbGxzKGxvbmcpIERpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMKKzE4OSAgIHN0dWIgRGlzY29ubmVjdE5hbWVkUGlwZQorMTkwICAgc3RkY2FsbCBEb3NEYXRlVGltZVRvRmlsZVRpbWUobG9uZyBsb25nIHB0cikgRG9zRGF0ZVRpbWVUb0ZpbGVUaW1lCisxOTEgICBzdGRjYWxsIER1cGxpY2F0ZUhhbmRsZShsb25nIGxvbmcgbG9uZyBwdHIgbG9uZyBsb25nIGxvbmcpIER1cGxpY2F0ZUhhbmRsZQorMTkyICAgc3R1YiBFbmRVcGRhdGVSZXNvdXJjZUEKKzE5MyAgIHN0dWIgRW5kVXBkYXRlUmVzb3VyY2VXCisxOTQgICBzdGRjYWxsIEVudGVyQ3JpdGljYWxTZWN0aW9uKHB0cikJRW50ZXJDcml0aWNhbFNlY3Rpb24KKzE5NSAgIHN0dWIgRW51bUNhbGVuZGFySW5mb0EKKzE5NiAgIHN0dWIgRW51bUNhbGVuZGFySW5mb1cKKzE5NyAgIHN0dWIgRW51bURhdGVGb3JtYXRzQQorMTk4ICAgc3R1YiBFbnVtRGF0ZUZvcm1hdHNXCisxOTkgICBzdGRjYWxsIEVudW1SZXNvdXJjZUxhbmd1YWdlc0EobG9uZyBwdHIgcHRyIHB0ciBsb25nKSBUSFVOS19FbnVtUmVzb3VyY2VMYW5ndWFnZXMzMkEKKzIwMCAgIHN0ZGNhbGwgRW51bVJlc291cmNlTGFuZ3VhZ2VzVyhsb25nIHB0ciBwdHIgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyVworMjAxICAgc3RkY2FsbCBFbnVtUmVzb3VyY2VOYW1lc0EobG9uZyBwdHIgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZU5hbWVzMzJBCisyMDIgICBzdGRjYWxsIEVudW1SZXNvdXJjZU5hbWVzVyhsb25nIHB0ciBwdHIgbG9uZykgVEhVTktfRW51bVJlc291cmNlTmFtZXMzMlcKKzIwMyAgIHN0ZGNhbGwgRW51bVJlc291cmNlVHlwZXNBKGxvbmcgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZVR5cGVzMzJBCisyMDQgICBzdGRjYWxsIEVudW1SZXNvdXJjZVR5cGVzVyhsb25nIHB0ciBsb25nKSBUSFVOS19FbnVtUmVzb3VyY2VUeXBlczMyVworMjA1ICAgc3RkY2FsbCBFbnVtU3lzdGVtQ29kZVBhZ2VzQShwdHIgbG9uZykgVEhVTktfRW51bVN5c3RlbUNvZGVQYWdlczMyQQorMjA2ICAgc3RkY2FsbCBFbnVtU3lzdGVtQ29kZVBhZ2VzVyhwdHIgbG9uZykgVEhVTktfRW51bVN5c3RlbUNvZGVQYWdlczMyVworMjA3ICAgc3RkY2FsbCBFbnVtU3lzdGVtTG9jYWxlc0EocHRyIGxvbmcpIFRIVU5LX0VudW1TeXN0ZW1Mb2NhbGVzMzJBCisyMDggICBzdGRjYWxsIEVudW1TeXN0ZW1Mb2NhbGVzVyhwdHIgbG9uZykgVEhVTktfRW51bVN5c3RlbUxvY2FsZXMzMlcKKzIwOSAgIHN0dWIgRW51bVRpbWVGb3JtYXRzQQorMjEwICAgc3R1YiBFbnVtVGltZUZvcm1hdHNXCisyMTEgICBzdHViIEVyYXNlVGFwZQorMjEyICAgc3RkY2FsbCBFc2NhcGVDb21tRnVuY3Rpb24obG9uZyBsb25nKSBFc2NhcGVDb21tRnVuY3Rpb24zMgorMjEzICAgc3RkY2FsbCBFeGl0UHJvY2Vzcyhsb25nKSBFeGl0UHJvY2VzcworMjE0ICAgc3R1YiBFeGl0VGhyZWFkCisyMTUgICBzdGRjYWxsIEV4cGFuZEVudmlyb25tZW50U3RyaW5nc0EocHRyIHB0ciBsb25nKSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MzMkEKKzIxNiAgIHN0ZGNhbGwgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzVyhwdHIgcHRyIGxvbmcpIEV4cGFuZEVudmlyb25tZW50U3RyaW5nczMyVworMjE3ICAgc3R1YiBGVF9FeGl0MAorMjE4ICAgc3R1YiBGVF9FeGl0MTIKKzIxOSAgIHN0dWIgRlRfRXhpdDE2CisyMjAgICBzdHViIEZUX0V4aXQyMAorMjIxICAgc3R1YiBGVF9FeGl0MjQKKzIyMiAgIHN0dWIgRlRfRXhpdDI4CisyMjMgICBzdHViIEZUX0V4aXQzMgorMjI0ICAgc3R1YiBGVF9FeGl0MzYKKzIyNiAgIHN0dWIgRlRfRXhpdDQwCisyMjcgICBzdHViIEZUX0V4aXQ0NAorMjI4ICAgc3R1YiBGVF9FeGl0NDgKKzIyNSAgIHN0dWIgRlRfRXhpdDQKKzIyOSAgIHN0dWIgRlRfRXhpdDUyCisyMzAgICBzdHViIEZUX0V4aXQ1NgorMjMxICAgc3R1YiBGVF9FeGl0OAorMjMyICAgc3R1YiBGVF9Qcm9sb2cKKzIzMyAgIHN0dWIgRlRfVGh1bmsKKzIzNCAgIHN0ZGNhbGwgRmF0YWxBcHBFeGl0QShsb25nIHB0cikgRmF0YWxBcHBFeGl0MzJBCisyMzUgICBzdGRjYWxsIEZhdGFsQXBwRXhpdFcobG9uZyBwdHIpIEZhdGFsQXBwRXhpdDMyVworMjM2ICAgc3R1YiBGYXRhbEV4aXQKKzIzNyAgIHN0ZGNhbGwgRmlsZVRpbWVUb0Rvc0RhdGVUaW1lKHB0ciBwdHIgcHRyKSBGaWxlVGltZVRvRG9zRGF0ZVRpbWUKKzIzOCAgIHN0ZGNhbGwgRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUocHRyIHB0cikgRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUKKzIzOSAgIHN0ZGNhbGwgRmlsZVRpbWVUb1N5c3RlbVRpbWUocHRyIHB0cikgRmlsZVRpbWVUb1N5c3RlbVRpbWUKKzI0MCAgIHN0dWIgRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUKKzI0MSAgIHN0dWIgRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJBCisyNDIgICBzdHViIEZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyVworMjQzICAgc3RkY2FsbCBGaW5kQXRvbUEocHRyKSBGaW5kQXRvbTMyQQorMjQ0ICAgc3RkY2FsbCBGaW5kQXRvbVcocHRyKSBGaW5kQXRvbTMyVworMjQ2ICAgc3R1YiBGaW5kQ2xvc2VDaGFuZ2VOb3RpZmljYXRpb24KKzI0NSAgIHN0ZGNhbGwgRmluZENsb3NlKGxvbmcpIEZpbmRDbG9zZTMyCisyNDcgICBzdHViIEZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvbkEKKzI0OCAgIHN0dWIgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uVworMjQ5ICAgc3RkY2FsbCBGaW5kRmlyc3RGaWxlQShwdHIgcHRyKSBGaW5kRmlyc3RGaWxlMzJBCisyNTAgICBzdGRjYWxsIEZpbmRGaXJzdEZpbGVXKHB0ciBwdHIpIEZpbmRGaXJzdEZpbGUzMlcKKzI1MSAgIHN0dWIgRmluZE5leHRDaGFuZ2VOb3RpZmljYXRpb24KKzI1MiAgIHN0ZGNhbGwgRmluZE5leHRGaWxlQShsb25nIHB0cikgRmluZE5leHRGaWxlMzJBCisyNTMgICBzdGRjYWxsIEZpbmROZXh0RmlsZVcobG9uZyBwdHIpIEZpbmROZXh0RmlsZTMyVworMjU0ICAgc3RkY2FsbCBGaW5kUmVzb3VyY2VBKGxvbmcgcHRyIHB0cikgRmluZFJlc291cmNlMzJBCisyNTUgICBzdGRjYWxsIEZpbmRSZXNvdXJjZUV4QShsb25nIHB0ciBwdHIgbG9uZykgRmluZFJlc291cmNlRXgzMkEKKzI1NiAgIHN0ZGNhbGwgRmluZFJlc291cmNlRXhXKGxvbmcgcHRyIHB0ciBsb25nKSBGaW5kUmVzb3VyY2VFeDMyVworMjU3ICAgc3RkY2FsbCBGaW5kUmVzb3VyY2VXKGxvbmcgcHRyIHB0cikgRmluZFJlc291cmNlMzJXCisyNTggICBzdGRjYWxsIEZsdXNoQ29uc29sZUlucHV0QnVmZmVyKGxvbmcpIEZsdXNoQ29uc29sZUlucHV0QnVmZmVyCisyNTkgICBzdGRjYWxsIEZsdXNoRmlsZUJ1ZmZlcnMobG9uZykgRmx1c2hGaWxlQnVmZmVycworMjYwICAgc3R1YiBGbHVzaEluc3RydWN0aW9uQ2FjaGUKKzI2MSAgIHN0dWIgRmx1c2hWaWV3T2ZGaWxlCisyNjIgICBzdHViIEZvbGRTdHJpbmdBCisyNjMgICBzdHViIEZvbGRTdHJpbmdXCisyNjQgICBzdGRjYWxsIEZvcm1hdE1lc3NhZ2VBKCkgV0lOMzJfRm9ybWF0TWVzc2FnZTMyQQorMjY1ICAgc3RkY2FsbCBGb3JtYXRNZXNzYWdlVygpIFdJTjMyX0Zvcm1hdE1lc3NhZ2UzMlcKKzI2NiAgIHN0dWIgRnJlZUNvbnNvbGUKKzI2NyAgIHN0ZGNhbGwgRnJlZUVudmlyb25tZW50U3RyaW5nc0EocHRyKSBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJBCisyNjggICBzdGRjYWxsIEZyZWVFbnZpcm9ubWVudFN0cmluZ3NXKHB0cikgRnJlZUVudmlyb25tZW50U3RyaW5nczMyVworMjY5ICAgc3R1YiBGcmVlTFNDYWxsYmFjaworMjcxICAgc3R1YiBGcmVlTGlicmFyeUFuZEV4aXRUaHJlYWQKKzI3MCAgIHN0ZGNhbGwgRnJlZUxpYnJhcnkobG9uZykgRnJlZUxpYnJhcnkzMgorMjcyICAgc3RkY2FsbCBGcmVlUmVzb3VyY2UobG9uZykgRnJlZVJlc291cmNlMzIKKzI3MyAgIHN0dWIgRnJlZVNMQ2FsbGJhY2sKKzI3NCAgIHN0dWIgR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50CisyNzUgICBzdGRjYWxsIEdldEFDUCgpIEdldEFDUAorMjc2ICAgc3RkY2FsbCBHZXRBdG9tTmFtZUEobG9uZyBwdHIgbG9uZykgR2V0QXRvbU5hbWUzMkEKKzI3NyAgIHN0ZGNhbGwgR2V0QXRvbU5hbWVXKGxvbmcgcHRyIGxvbmcpIEdldEF0b21OYW1lMzJXCisyNzggICBzdHViIEdldEJpbmFyeVR5cGUKKzI3OSAgIHN0dWIgR2V0QmluYXJ5VHlwZUEKKzI4MCAgIHN0dWIgR2V0QmluYXJ5VHlwZVcKKzI4MSAgIHN0ZGNhbGwgR2V0Q1BJbmZvKGxvbmcgcHRyKSBHZXRDUEluZm8KKzI4MiAgIHN0dWIgR2V0Q29tbUNvbmZpZworMjgzICAgc3RkY2FsbCBHZXRDb21tTWFzayhsb25nIHB0cikgR2V0Q29tbU1hc2sKKzI4NCAgIHN0dWIgR2V0Q29tbU1vZGVtU3RhdHVzCisyODUgICBzdHViIEdldENvbW1Qcm9wZXJ0aWVzCisyODYgICBzdGRjYWxsIEdldENvbW1TdGF0ZShsb25nIHB0cikgR2V0Q29tbVN0YXRlMzIKKzI4NyAgIHN0ZGNhbGwgR2V0Q29tbVRpbWVvdXRzKGxvbmcgcHRyKSBHZXRDb21tVGltZW91dHMKKzI4OCAgIHN0ZGNhbGwgR2V0Q29tbWFuZExpbmVBKCkgR2V0Q29tbWFuZExpbmUzMkEKKzI4OSAgIHN0ZGNhbGwgR2V0Q29tbWFuZExpbmVXKCkgR2V0Q29tbWFuZExpbmUzMlcKKzI5MCAgIHN0dWIgR2V0Q29tcHJlc3NlZEZpbGVTaXplQQorMjkxICAgc3R1YiBHZXRDb21wcmVzc2VkRmlsZVNpemVXCisyOTIgICBzdGRjYWxsIEdldENvbXB1dGVyTmFtZUEocHRyIHB0cikgR2V0Q29tcHV0ZXJOYW1lMzJBCisyOTMgICBzdGRjYWxsIEdldENvbXB1dGVyTmFtZVcocHRyIHB0cikgR2V0Q29tcHV0ZXJOYW1lMzJXCisyOTQgICBzdGRjYWxsIEdldENvbnNvbGVDUCgpIEdldENvbnNvbGVDUAorMjk2ICAgc3RkY2FsbCBHZXRDb25zb2xlTW9kZShsb25nIHB0cikgR2V0Q29uc29sZU1vZGUKKzI5NyAgIHN0ZGNhbGwgR2V0Q29uc29sZU91dHB1dENQKCkgR2V0Q29uc29sZU91dHB1dENQCisyOTggICBzdGRjYWxsIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGxvbmcgcHRyKSBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbworMjk5ICAgc3RkY2FsbCBHZXRDb25zb2xlVGl0bGVBKHB0ciBsb25nKSBHZXRDb25zb2xlVGl0bGUzMkEKKzMwMCAgIHN0ZGNhbGwgR2V0Q29uc29sZVRpdGxlVyhwdHIgbG9uZykgR2V0Q29uc29sZVRpdGxlMzJXCiszMDEgICBzdHViIEdldEN1cnJlbmN5Rm9ybWF0QQorMzAyICAgc3R1YiBHZXRDdXJyZW5jeUZvcm1hdFcKKzMwMyAgIHN0ZGNhbGwgR2V0Q3VycmVudERpcmVjdG9yeUEobG9uZyBwdHIpIEdldEN1cnJlbnREaXJlY3RvcnkzMkEKKzMwNCAgIHN0ZGNhbGwgR2V0Q3VycmVudERpcmVjdG9yeVcobG9uZyBwdHIpIEdldEN1cnJlbnREaXJlY3RvcnkzMlcKKzMwNSAgIHN0ZGNhbGwgR2V0Q3VycmVudFByb2Nlc3MoKSBHZXRDdXJyZW50UHJvY2VzcworMzA2ICAgc3RkY2FsbCBHZXRDdXJyZW50UHJvY2Vzc0lkKCkgR2V0Q3VycmVudFByb2Nlc3NJZAorMzA3ICAgc3RkY2FsbCBHZXRDdXJyZW50VGhyZWFkKCkgR2V0Q3VycmVudFRocmVhZAorMzA4ICAgc3RkY2FsbCBHZXRDdXJyZW50VGhyZWFkSWQoKSBHZXRDdXJyZW50VGhyZWFkSWQKKzMwOSAgIHN0dWIgR2V0RGF0ZUZvcm1hdEEKKzMxMCAgIHN0dWIgR2V0RGF0ZUZvcm1hdFcKKzMxMSAgIHN0dWIgR2V0RGF5bGlnaHRGbGFnCiszMTIgICBzdHViIEdldERlZmF1bHRDb21tQ29uZmlnQQorMzEzICAgc3R1YiBHZXREZWZhdWx0Q29tbUNvbmZpZ1cKKzMxNCAgIHN0ZGNhbGwgR2V0RGlza0ZyZWVTcGFjZUEocHRyIHB0ciBwdHIgcHRyIHB0cikgR2V0RGlza0ZyZWVTcGFjZTMyQQorMzE1ICAgc3RkY2FsbCBHZXREaXNrRnJlZVNwYWNlVyhwdHIgcHRyIHB0ciBwdHIgcHRyKSBHZXREaXNrRnJlZVNwYWNlMzJXCiszMTYgICBzdGRjYWxsIEdldERyaXZlVHlwZUEocHRyKSBHZXREcml2ZVR5cGUzMkEKKzMxNyAgIHN0ZGNhbGwgR2V0RHJpdmVUeXBlVyhwdHIpIEdldERyaXZlVHlwZTMyVworMzE5ICAgc3RkY2FsbCBHZXRFbnZpcm9ubWVudFN0cmluZ3NBKCkgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJBCiszMjAgICBzdGRjYWxsIEdldEVudmlyb25tZW50U3RyaW5nc1coKSBHZXRFbnZpcm9ubWVudFN0cmluZ3MzMlcKKzMxOCAgIHN0ZGNhbGwgR2V0RW52aXJvbm1lbnRTdHJpbmdzKCkgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJBCiszMjEgICBzdGRjYWxsIEdldEVudmlyb25tZW50VmFyaWFibGVBKHB0ciBwdHIgbG9uZykgR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQQorMzIyICAgc3RkY2FsbCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlVyhwdHIgcHRyIGxvbmcpIEdldEVudmlyb25tZW50VmFyaWFibGUzMlcKKzMyMyAgIHN0dWIgR2V0RXJyb3JNb2RlCiszMjQgICBzdHViIEdldEV4aXRDb2RlUHJvY2VzcworMzI1ICAgc3R1YiBHZXRFeGl0Q29kZVRocmVhZAorMzI2ICAgc3RkY2FsbCBHZXRGaWxlQXR0cmlidXRlc0EocHRyKSBHZXRGaWxlQXR0cmlidXRlczMyQQorMzI3ICAgc3RkY2FsbCBHZXRGaWxlQXR0cmlidXRlc1cocHRyKSBHZXRGaWxlQXR0cmlidXRlczMyVworMzI4ICAgc3RkY2FsbCBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZShsb25nIHB0cikgR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUKKzMyOSAgIHN0ZGNhbGwgR2V0RmlsZVNpemUobG9uZyBwdHIpIEdldEZpbGVTaXplCiszMzAgICBzdGRjYWxsIEdldEZpbGVUaW1lKGxvbmcgcHRyIHB0ciBwdHIpIEdldEZpbGVUaW1lCiszMzEgICBzdGRjYWxsIEdldEZpbGVUeXBlKGxvbmcpIEdldEZpbGVUeXBlCiszMzIgICBzdGRjYWxsIEdldEZ1bGxQYXRoTmFtZUEocHRyIGxvbmcgcHRyIHB0cikgR2V0RnVsbFBhdGhOYW1lMzJBCiszMzMgICBzdGRjYWxsIEdldEZ1bGxQYXRoTmFtZVcocHRyIGxvbmcgcHRyIHB0cikgR2V0RnVsbFBhdGhOYW1lMzJXCiszMzQgICBzdHViIEdldEhhbmRsZUNvbnRleHQKKzMzNSAgIHN0dWIgR2V0SGFuZGxlSW5mb3JtYXRpb24KKzMzNiAgIHN0dWIgR2V0TFNDYWxsYmFja1RhcmdldAorMzM3ICAgc3R1YiBHZXRMU0NhbGxiYWNrVGVtcGxhdGUKKzMzOCAgIHN0ZGNhbGwgR2V0TGFyZ2VzdENvbnNvbGVXaW5kb3dTaXplKGxvbmcpIEdldExhcmdlc3RDb25zb2xlV2luZG93U2l6ZQorMzM5ICAgc3RkY2FsbCBHZXRMYXN0RXJyb3IoKSBHZXRMYXN0RXJyb3IKKzM0MCAgIHN0ZGNhbGwgR2V0TG9jYWxUaW1lKHB0cikgR2V0TG9jYWxUaW1lCiszNDEgICBzdGRjYWxsIEdldExvY2FsZUluZm9BKGxvbmcgbG9uZyBwdHIgbG9uZykgR2V0TG9jYWxlSW5mb0EKKzM0MiAgIHN0ZGNhbGwgR2V0TG9jYWxlSW5mb1cobG9uZyBsb25nIHB0ciBsb25nKSBHZXRMb2NhbGVJbmZvMzJXCiszNDMgICBzdGRjYWxsIEdldExvZ2ljYWxEcml2ZVN0cmluZ3NBKGxvbmcgcHRyKSBHZXRMb2dpY2FsRHJpdmVTdHJpbmdzMzJBCiszNDQgICBzdGRjYWxsIEdldExvZ2ljYWxEcml2ZVN0cmluZ3NXKGxvbmcgcHRyKSBHZXRMb2dpY2FsRHJpdmVTdHJpbmdzMzJXCiszNDUgICBzdGRjYWxsIEdldExvZ2ljYWxEcml2ZXMoKSBHZXRMb2dpY2FsRHJpdmVzCiszNDYgICBzdHViIEdldE1haWxzbG90SW5mbworMzQ3ICAgc3RkY2FsbCBHZXRNb2R1bGVGaWxlTmFtZUEobG9uZyBwdHIgbG9uZykgR2V0TW9kdWxlRmlsZU5hbWUzMkEKKzM0OCAgIHN0ZGNhbGwgR2V0TW9kdWxlRmlsZU5hbWVXKGxvbmcgcHRyIGxvbmcpIEdldE1vZHVsZUZpbGVOYW1lMzJXCiszNDkgICBzdGRjYWxsIEdldE1vZHVsZUhhbmRsZUEocHRyKSBXSU4zMl9HZXRNb2R1bGVIYW5kbGVBCiszNTAgICBzdGRjYWxsIEdldE1vZHVsZUhhbmRsZVcocHRyKSBXSU4zMl9HZXRNb2R1bGVIYW5kbGVXCiszNTEgICBzdHViIEdldE5hbWVkUGlwZUhhbmRsZVN0YXRlQQorMzUyICAgc3R1YiBHZXROYW1lZFBpcGVIYW5kbGVTdGF0ZVcKKzM1MyAgIHN0dWIgR2V0TmFtZWRQaXBlSW5mbworMzU0ICAgc3R1YiBHZXROdW1iZXJGb3JtYXRBCiszNTUgICBzdHViIEdldE51bWJlckZvcm1hdFcKKzM1NiAgIHN0ZGNhbGwgR2V0TnVtYmVyT2ZDb25zb2xlSW5wdXRFdmVudHMobG9uZyBwdHIpIEdldE51bWJlck9mQ29uc29sZUlucHV0RXZlbnRzCiszNTcgICBzdHViIEdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9ucworMzU4ICAgc3RkY2FsbCBHZXRPRU1DUCgpIEdldE9FTUNQCiszNTkgICBzdHViIEdldE92ZXJsYXBwZWRSZXN1bHQKKzM2MCAgIHN0ZGNhbGwgR2V0UHJpb3JpdHlDbGFzcyhsb25nKSBHZXRQcmlvcml0eUNsYXNzCiszNjEgICBzdGRjYWxsIEdldFByaXZhdGVQcm9maWxlSW50QShwdHIgcHRyIGxvbmcgcHRyKSBHZXRQcml2YXRlUHJvZmlsZUludDMyQQorMzYyICAgc3RkY2FsbCBHZXRQcml2YXRlUHJvZmlsZUludFcocHRyIHB0ciBsb25nIHB0cikgR2V0UHJpdmF0ZVByb2ZpbGVJbnQzMlcKKzM2MyAgIHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uQQorMzY0ICAgc3R1YiBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25OYW1lc0EKKzM2NSAgIHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uTmFtZXNXCiszNjYgICBzdHViIEdldFByaXZhdGVQcm9maWxlU2VjdGlvblcKKzM2NyAgIHN0ZGNhbGwgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmdBKHB0ciBwdHIgcHRyIHB0ciBsb25nIHB0cikgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmczMkEKKzM2OCAgIHN0ZGNhbGwgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmdXKHB0ciBwdHIgcHRyIHB0ciBsb25nIHB0cikgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmczMlcKKzM2OSAgIHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTdHJ1Y3RBCiszNzAgICBzdHViIEdldFByaXZhdGVQcm9maWxlU3RydWN0VworMzcxICAgc3RkY2FsbCBHZXRQcm9jQWRkcmVzcyhsb25nIHB0cikgR2V0UHJvY0FkZHJlc3MzMgorMzcyICAgc3RkY2FsbCBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKGxvbmcgcHRyIHB0cikJR2V0UHJvY2Vzc0FmZmluaXR5TWFzaworMzczICAgc3R1YiBHZXRQcm9jZXNzRmxhZ3MKKzM3NCAgIHN0ZGNhbGwgR2V0UHJvY2Vzc0hlYXAoKSBHZXRQcm9jZXNzSGVhcAorMzc1ICAgc3R1YiBHZXRQcm9jZXNzSGVhcHMKKzM3NiAgIHN0dWIgR2V0UHJvY2Vzc1NodXRkb3duUGFyYW1ldGVycworMzc3ICAgc3RkY2FsbCBHZXRQcm9jZXNzVGltZXMobG9uZyBwdHIgcHRyIHB0ciBwdHIpIEdldFByb2Nlc3NUaW1lcworMzc4ICAgc3RkY2FsbCBHZXRQcm9jZXNzVmVyc2lvbihsb25nKSBHZXRQcm9jZXNzVmVyc2lvbgorMzc5ICAgc3R1YiBHZXRQcm9jZXNzV29ya2luZ1NldFNpemUKKzM4MCAgIHN0dWIgR2V0UHJvZHVjdE5hbWUKKzM4MSAgIHN0ZGNhbGwgR2V0UHJvZmlsZUludEEocHRyIHB0ciBsb25nKSBHZXRQcm9maWxlSW50MzJBCiszODIgICBzdGRjYWxsIEdldFByb2ZpbGVJbnRXKHB0ciBwdHIgbG9uZykgR2V0UHJvZmlsZUludDMyVworMzgzICAgc3R1YiBHZXRQcm9maWxlU2VjdGlvbkEKKzM4NCAgIHN0dWIgR2V0UHJvZmlsZVNlY3Rpb25XCiszODUgICBzdGRjYWxsIEdldFByb2ZpbGVTdHJpbmdBKHB0ciBwdHIgcHRyIHB0ciBsb25nKSBHZXRQcm9maWxlU3RyaW5nMzJBCiszODYgICBzdGRjYWxsIEdldFByb2ZpbGVTdHJpbmdXKHB0ciBwdHIgcHRyIHB0ciBsb25nKSBHZXRQcm9maWxlU3RyaW5nMzJXCiszODcgICBzdHViIEdldFF1ZXVlZENvbXBsZXRpb25TdGF0dXMKKzM4OCAgIHN0dWIgR2V0U0xDYWxsYmFja1RhcmdldAorMzg5ICAgc3R1YiBHZXRTTENhbGxiYWNrVGVtcGxhdGUKKzM5MCAgIHN0ZGNhbGwgR2V0U2hvcnRQYXRoTmFtZUEocHRyIHB0ciBsb25nKSBHZXRTaG9ydFBhdGhOYW1lMzJBCiszOTEgICBzdGRjYWxsIEdldFNob3J0UGF0aE5hbWVXKHB0ciBwdHIgbG9uZykgR2V0U2hvcnRQYXRoTmFtZTMyVworMzkyICAgc3RkY2FsbCBHZXRTdGFydHVwSW5mb0EocHRyKSBHZXRTdGFydHVwSW5mbzMyQQorMzkzICAgc3RkY2FsbCBHZXRTdGFydHVwSW5mb1cocHRyKSBHZXRTdGFydHVwSW5mbzMyVworMzk0ICAgc3RkY2FsbCBHZXRTdGRIYW5kbGUobG9uZykJR2V0U3RkSGFuZGxlCiszOTUgICBzdGRjYWxsIEdldFN0cmluZ1R5cGVBKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIpIEdldFN0cmluZ1R5cGUzMkEKKzM5NiAgIHN0ZGNhbGwgR2V0U3RyaW5nVHlwZUV4QShsb25nIGxvbmcgcHRyIGxvbmcgcHRyKSBHZXRTdHJpbmdUeXBlRXgzMkEKKzM5NyAgIHN0ZGNhbGwgR2V0U3RyaW5nVHlwZUV4Vyhsb25nIGxvbmcgcHRyIGxvbmcgcHRyKSBHZXRTdHJpbmdUeXBlRXgzMlcKKzM5OCAgIHN0ZGNhbGwgR2V0U3RyaW5nVHlwZVcobG9uZyBwdHIgbG9uZyBwdHIpIEdldFN0cmluZ1R5cGUzMlcKKzM5OSAgIHN0ZGNhbGwgR2V0U3lzdGVtRGVmYXVsdExDSUQoKSBHZXRTeXN0ZW1EZWZhdWx0TENJRAorNDAwICAgc3RkY2FsbCBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkgR2V0U3lzdGVtRGVmYXVsdExhbmdJRAorNDAxICAgc3RkY2FsbCBHZXRTeXN0ZW1EaXJlY3RvcnlBKHB0ciBsb25nKSBHZXRTeXN0ZW1EaXJlY3RvcnkzMkEKKzQwMiAgIHN0ZGNhbGwgR2V0U3lzdGVtRGlyZWN0b3J5VyhwdHIgbG9uZykgR2V0U3lzdGVtRGlyZWN0b3J5MzJXCis0MDMgICBzdGRjYWxsIEdldFN5c3RlbUluZm8ocHRyKSBHZXRTeXN0ZW1JbmZvCis0MDQgICBzdGRjYWxsIEdldFN5c3RlbVBvd2VyU3RhdHVzKHB0cikgR2V0U3lzdGVtUG93ZXJTdGF0dXMKKzQwNSAgIHN0ZGNhbGwgR2V0U3lzdGVtVGltZShwdHIpIEdldFN5c3RlbVRpbWUKKzQwNiAgIHN0dWIgR2V0U3lzdGVtVGltZUFkanVzdG1lbnQKKzQwNyAgIHN0dWIgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUKKzQwOCAgIHN0dWIgR2V0VGFwZVBhcmFtZXRlcnMKKzQwOSAgIHN0dWIgR2V0VGFwZVBvc2l0aW9uCis0MTAgICBzdHViIEdldFRhcGVTdGF0dXMKKzQxMSAgIHN0ZGNhbGwgR2V0VGVtcEZpbGVOYW1lQShwdHIgcHRyIGxvbmcgcHRyKSBHZXRUZW1wRmlsZU5hbWUzMkEKKzQxMiAgIHN0ZGNhbGwgR2V0VGVtcEZpbGVOYW1lVyhwdHIgcHRyIGxvbmcgcHRyKSBHZXRUZW1wRmlsZU5hbWUzMlcKKzQxMyAgIHN0ZGNhbGwgR2V0VGVtcFBhdGhBKGxvbmcgcHRyKSBHZXRUZW1wUGF0aDMyQQorNDE0ICAgc3RkY2FsbCBHZXRUZW1wUGF0aFcobG9uZyBwdHIpIEdldFRlbXBQYXRoMzJXCis0MTUgICBzdGRjYWxsIEdldFRocmVhZENvbnRleHQobG9uZyBwdHIpIEdldFRocmVhZENvbnRleHQKKzQxNiAgIHN0ZGNhbGwgR2V0VGhyZWFkTG9jYWxlKCkgR2V0VGhyZWFkTG9jYWxlCis0MTcgICBzdGRjYWxsIEdldFRocmVhZFByaW9yaXR5KGxvbmcpIEdldFRocmVhZFByaW9yaXR5Cis0MTggICBzdHViIEdldFRocmVhZFNlbGVjdG9yRW50cnkKKzQxOSAgIHN0dWIgR2V0VGhyZWFkVGltZXMKKzQyMCAgIHN0ZGNhbGwgR2V0VGlja0NvdW50KCkgR2V0VGlja0NvdW50Cis0MjEgICBzdHViIEdldFRpbWVGb3JtYXRBCis0MjIgICBzdHViIEdldFRpbWVGb3JtYXRXCis0MjMgICBzdGRjYWxsIEdldFRpbWVab25lSW5mb3JtYXRpb24ocHRyKSBHZXRUaW1lWm9uZUluZm9ybWF0aW9uCis0MjQgICBzdGRjYWxsIEdldFVzZXJEZWZhdWx0TENJRCgpIEdldFVzZXJEZWZhdWx0TENJRAorNDI1ICAgc3RkY2FsbCBHZXRVc2VyRGVmYXVsdExhbmdJRCgpIEdldFVzZXJEZWZhdWx0TGFuZ0lECis0MjYgICBzdGRjYWxsIEdldFZlcnNpb24oKSBHZXRWZXJzaW9uMzIKKzQyNyAgIHN0ZGNhbGwgR2V0VmVyc2lvbkV4QShwdHIpIEdldFZlcnNpb25FeDMyQQorNDI4ICAgc3RkY2FsbCBHZXRWZXJzaW9uRXhXKHB0cikgR2V0VmVyc2lvbkV4MzJXCis0MjkgICBzdGRjYWxsIEdldFZvbHVtZUluZm9ybWF0aW9uQShwdHIgcHRyIGxvbmcgcHRyIHB0ciBwdHIgcHRyIGxvbmcpIEdldFZvbHVtZUluZm9ybWF0aW9uMzJBCis0MzAgICBzdGRjYWxsIEdldFZvbHVtZUluZm9ybWF0aW9uVyhwdHIgcHRyIGxvbmcgcHRyIHB0ciBwdHIgcHRyIGxvbmcpIEdldFZvbHVtZUluZm9ybWF0aW9uMzJXCis0MzEgICBzdGRjYWxsIEdldFdpbmRvd3NEaXJlY3RvcnlBKHB0ciBsb25nKSBHZXRXaW5kb3dzRGlyZWN0b3J5MzJBCis0MzIgICBzdGRjYWxsIEdldFdpbmRvd3NEaXJlY3RvcnlXKHB0ciBsb25nKSBHZXRXaW5kb3dzRGlyZWN0b3J5MzJXCis0MzMgICBzdGRjYWxsIEdsb2JhbEFkZEF0b21BKHB0cikgR2xvYmFsQWRkQXRvbTMyQQorNDM0ICAgc3RkY2FsbCBHbG9iYWxBZGRBdG9tVyhwdHIpIEdsb2JhbEFkZEF0b20zMlcKKzQzNSAgIHN0ZGNhbGwgR2xvYmFsQWxsb2MobG9uZyBsb25nKSBHbG9iYWxBbGxvYzMyCis0MzYgICBzdGRjYWxsIEdsb2JhbENvbXBhY3QobG9uZykgR2xvYmFsQ29tcGFjdDMyCis0MzcgICBzdGRjYWxsIEdsb2JhbERlbGV0ZUF0b20obG9uZykgR2xvYmFsRGVsZXRlQXRvbQorNDM4ICAgc3RkY2FsbCBHbG9iYWxGaW5kQXRvbUEocHRyKSBHbG9iYWxGaW5kQXRvbTMyQQorNDM5ICAgc3RkY2FsbCBHbG9iYWxGaW5kQXRvbVcocHRyKSBHbG9iYWxGaW5kQXRvbTMyVworNDQwICAgc3RkY2FsbCBHbG9iYWxGaXgobG9uZykgR2xvYmFsRml4MzIKKzQ0MSAgIHN0ZGNhbGwgR2xvYmFsRmxhZ3MobG9uZykgR2xvYmFsRmxhZ3MzMgorNDQyICAgc3RkY2FsbCBHbG9iYWxGcmVlKGxvbmcpIEdsb2JhbEZyZWUzMgorNDQzICAgc3RkY2FsbCBHbG9iYWxHZXRBdG9tTmFtZUEobG9uZyBwdHIgbG9uZykgR2xvYmFsR2V0QXRvbU5hbWUzMkEKKzQ0NCAgIHN0ZGNhbGwgR2xvYmFsR2V0QXRvbU5hbWVXKGxvbmcgcHRyIGxvbmcpIEdsb2JhbEdldEF0b21OYW1lMzJXCis0NDUgICBzdGRjYWxsIEdsb2JhbEhhbmRsZShwdHIpIEdsb2JhbEhhbmRsZTMyCis0NDYgICBzdGRjYWxsIEdsb2JhbExvY2sobG9uZykgR2xvYmFsTG9jazMyCis0NDcgICBzdGRjYWxsIEdsb2JhbE1lbW9yeVN0YXR1cyhwdHIpIEdsb2JhbE1lbW9yeVN0YXR1cworNDQ4ICAgc3RkY2FsbCBHbG9iYWxSZUFsbG9jKGxvbmcgbG9uZyBsb25nKSBHbG9iYWxSZUFsbG9jMzIKKzQ0OSAgIHN0ZGNhbGwgR2xvYmFsU2l6ZShsb25nKSBHbG9iYWxTaXplMzIKKzQ1MCAgIHN0ZGNhbGwgR2xvYmFsVW5XaXJlKGxvbmcpIEdsb2JhbFVuV2lyZTMyCis0NTEgICBzdGRjYWxsIEdsb2JhbFVuZml4KGxvbmcpIEdsb2JhbFVuZml4MzIKKzQ1MiAgIHN0ZGNhbGwgR2xvYmFsVW5sb2NrKGxvbmcpIEdsb2JhbFVubG9jazMyCis0NTMgICBzdGRjYWxsIEdsb2JhbFdpcmUobG9uZykgR2xvYmFsV2lyZTMyCis0NTQgICBzdHViIEhlYXAzMkZpcnN0Cis0NTUgICBzdHViIEhlYXAzMkxpc3RGaXJzdAorNDU2ICAgc3R1YiBIZWFwMzJMaXN0TmV4dAorNDU3ICAgc3R1YiBIZWFwMzJOZXh0Cis0NTggICBzdGRjYWxsIEhlYXBBbGxvYyhsb25nIGxvbmcgbG9uZykgSGVhcEFsbG9jCis0NTkgICBzdGRjYWxsIEhlYXBDb21wYWN0KGxvbmcgbG9uZykgSGVhcENvbXBhY3QKKzQ2MCAgIHN0ZGNhbGwgSGVhcENyZWF0ZShsb25nIGxvbmcgbG9uZykJSGVhcENyZWF0ZQorNDYxICAgc3RkY2FsbCBIZWFwRGVzdHJveShsb25nKSBIZWFwRGVzdHJveQorNDYyICAgc3RkY2FsbCBIZWFwRnJlZShsb25nIGxvbmcgcHRyKSBIZWFwRnJlZQorNDYzICAgc3RkY2FsbCBIZWFwTG9jayhsb25nKSBIZWFwTG9jaworNDY0ICAgc3RkY2FsbCBIZWFwUmVBbGxvYyhsb25nIGxvbmcgcHRyIGxvbmcpIEhlYXBSZUFsbG9jCis0NjYgICBzdGRjYWxsIEhlYXBTaXplKGxvbmcgbG9uZyBwdHIpIEhlYXBTaXplCis0NjcgICBzdGRjYWxsIEhlYXBVbmxvY2sobG9uZykgSGVhcFVubG9jaworNDY4ICAgc3RkY2FsbCBIZWFwVmFsaWRhdGUobG9uZyBsb25nIHB0cikgSGVhcFZhbGlkYXRlCis0NjkgICBzdGRjYWxsIEhlYXBXYWxrKGxvbmcgcHRyKSBIZWFwV2FsaworNDcwICAgc3R1YiBJbml0QXRvbVRhYmxlCis0NzEgICBzdGRjYWxsIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24ocHRyKSBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uCis0NzIgICBzdGRjYWxsIEludGVybG9ja2VkRGVjcmVtZW50KHB0cikgSW50ZXJsb2NrZWREZWNyZW1lbnQKKzQ3MyAgIHN0ZGNhbGwgSW50ZXJsb2NrZWRFeGNoYW5nZShwdHIpIEludGVybG9ja2VkRXhjaGFuZ2UKKzQ3NCAgIHN0ZGNhbGwgSW50ZXJsb2NrZWRJbmNyZW1lbnQocHRyKSBJbnRlcmxvY2tlZEluY3JlbWVudAorNDc1ICAgc3R1YiBJbnZhbGlkYXRlTkxTQ2FjaGUKKzQ3NiAgIHN0ZGNhbGwgSXNCYWRDb2RlUHRyKHB0ciBsb25nKSBJc0JhZENvZGVQdHIzMgorNDc3ICAgc3RkY2FsbCBJc0JhZEh1Z2VSZWFkUHRyKHB0ciBsb25nKSBJc0JhZEh1Z2VSZWFkUHRyMzIKKzQ3OCAgIHN0ZGNhbGwgSXNCYWRIdWdlV3JpdGVQdHIocHRyIGxvbmcpIElzQmFkSHVnZVdyaXRlUHRyMzIKKzQ3OSAgIHN0ZGNhbGwgSXNCYWRSZWFkUHRyKHB0ciBsb25nKSBJc0JhZFJlYWRQdHIzMgorNDgwICAgc3RkY2FsbCBJc0JhZFN0cmluZ1B0ckEocHRyIGxvbmcpIElzQmFkU3RyaW5nUHRyMzJBCis0ODEgICBzdGRjYWxsIElzQmFkU3RyaW5nUHRyVyhwdHIgbG9uZykgSXNCYWRTdHJpbmdQdHIzMlcKKzQ4MiAgIHN0ZGNhbGwgSXNCYWRXcml0ZVB0cihwdHIgbG9uZykgSXNCYWRXcml0ZVB0cjMyCis0ODMgICBzdGRjYWxsIElzREJDU0xlYWRCeXRlKGxvbmcpIElzREJDU0xlYWRCeXRlMzIKKzQ4NCAgIHN0ZGNhbGwgSXNEQkNTTGVhZEJ5dGVFeChsb25nIGxvbmcpIElzREJDU0xlYWRCeXRlRXgKKzQ4NSAgIHN0dWIgSXNMU0NhbGxiYWNrCis0ODYgICBzdHViIElzU0xDYWxsYmFjaworNDg3ICAgc3RkY2FsbCBJc1ZhbGlkQ29kZVBhZ2UobG9uZykgSXNWYWxpZENvZGVQYWdlCis0ODggICBzdGRjYWxsIElzVmFsaWRMb2NhbGUobG9uZyBsb25nKSBJc1ZhbGlkTG9jYWxlCis0ODkgICBzdHViIEszMlRoazE2MzJFcGlsb2cKKzQ5MCAgIHN0dWIgSzMyVGhrMTYzMlByb2xvZworNDkxICAgc3R1YiBMQ01hcFN0cmluZ0EKKzQ5MiAgIHN0dWIgTENNYXBTdHJpbmdXCis0OTMgICBzdGRjYWxsIExlYXZlQ3JpdGljYWxTZWN0aW9uKHB0cikJTGVhdmVDcml0aWNhbFNlY3Rpb24KKzQ5NCAgIHN0ZGNhbGwgTG9hZExpYnJhcnlBKHB0cikgTG9hZExpYnJhcnkzMkEKKzQ5NSAgIHN0dWIgTG9hZExpYnJhcnlFeEEKKzQ5NiAgIHN0dWIgTG9hZExpYnJhcnlFeFcKKzQ5NyAgIHN0ZGNhbGwgTG9hZExpYnJhcnlXKHB0cikgTG9hZExpYnJhcnkzMlcKKzQ5OCAgIHN0dWIgTG9hZE1vZHVsZQorNDk5ICAgc3RkY2FsbCBMb2FkUmVzb3VyY2UobG9uZyBsb25nKSBMb2FkUmVzb3VyY2UzMgorNTAwICAgc3RkY2FsbCBMb2NhbEFsbG9jKGxvbmcgbG9uZykgTG9jYWxBbGxvYzMyCis1MDEgICBzdGRjYWxsIExvY2FsQ29tcGFjdChsb25nKSBMb2NhbENvbXBhY3QzMgorNTAyICAgc3RkY2FsbCBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZShwdHIgcHRyKSBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZQorNTAzICAgc3RkY2FsbCBMb2NhbEZsYWdzKGxvbmcpIExvY2FsRmxhZ3MzMgorNTA0ICAgc3RkY2FsbCBMb2NhbEZyZWUobG9uZykgTG9jYWxGcmVlMzIKKzUwNSAgIHN0ZGNhbGwgTG9jYWxIYW5kbGUocHRyKSBMb2NhbEhhbmRsZTMyCis1MDYgICBzdGRjYWxsIExvY2FsTG9jayhsb25nKSBMb2NhbExvY2szMgorNTA3ICAgc3RkY2FsbCBMb2NhbFJlQWxsb2MobG9uZyBsb25nIGxvbmcpIExvY2FsUmVBbGxvYzMyCis1MDggICBzdGRjYWxsIExvY2FsU2hyaW5rKGxvbmcgbG9uZykgTG9jYWxTaHJpbmszMgorNTA5ICAgc3RkY2FsbCBMb2NhbFNpemUobG9uZykgTG9jYWxTaXplMzIKKzUxMCAgIHN0ZGNhbGwgTG9jYWxVbmxvY2sobG9uZykgTG9jYWxVbmxvY2szMgorNTExICAgc3RkY2FsbCBMb2NrRmlsZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIExvY2tGaWxlCis1MTIgICBzdHViIExvY2tGaWxlRXgKKzUxMyAgIHN0ZGNhbGwgTG9ja1Jlc291cmNlKGxvbmcpIExvY2tSZXNvdXJjZTMyCis1MTQgICBzdGRjYWxsIE1ha2VDcml0aWNhbFNlY3Rpb25HbG9iYWwocHRyKSBNYWtlQ3JpdGljYWxTZWN0aW9uR2xvYmFsCis1MTUgICBzdHViIE1hcEhJbnN0TFMKKzUxNiAgIHN0dWIgTWFwSEluc3RMU19QTgorNTE3ICAgc3R1YiBNYXBISW5zdFNMCis1MTggICBzdHViIE1hcEhJbnN0U0xfUE4KKzUxOSAgIHN0dWIgTWFwSE1vZHVsZUxTCis1MjAgICBzdHViIE1hcEhNb2R1bGVTTAorNTIxICAgc3RkY2FsbCBNYXBMUyhwdHIpIE1hcExTCis2NDMgICBzdGRjYWxsIE1hcFNMKGxvbmcpIE1hcFNMCis1MjMgICBzdHViIE1hcFNMRml4Cis1MjIgICBzdHViIE1hcFNMCis1MjQgICBzdGRjYWxsIE1hcFZpZXdPZkZpbGUobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBNYXBWaWV3T2ZGaWxlCis1MjUgICBzdGRjYWxsIE1hcFZpZXdPZkZpbGVFeChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBNYXBWaWV3T2ZGaWxlRXgKKzUyNiAgIHN0dWIgTW9kdWxlMzJGaXJzdAorNTI3ICAgc3R1YiBNb2R1bGUzMk5leHQKKzUyOCAgIHN0ZGNhbGwgTW92ZUZpbGVBKHB0ciBwdHIpIE1vdmVGaWxlMzJBCis1MjkgICBzdHViIE1vdmVGaWxlRXhBCis1MzAgICBzdHViIE1vdmVGaWxlRXhXCis1MzEgICBzdGRjYWxsIE1vdmVGaWxlVyhwdHIgcHRyKSBNb3ZlRmlsZTMyVworNTMyICAgc3RkY2FsbCBNdWxEaXYobG9uZyBsb25nIGxvbmcpIE11bERpdjMyCis1MzMgICBzdGRjYWxsIE11bHRpQnl0ZVRvV2lkZUNoYXIobG9uZyBsb25nIHB0ciBsb25nIHB0ciBsb25nKSBNdWx0aUJ5dGVUb1dpZGVDaGFyCis1MzUgICBzdGRjYWxsIE9wZW5FdmVudEEobG9uZyBsb25nIHB0cikgT3BlbkV2ZW50MzJBCis1MzYgICBzdGRjYWxsIE9wZW5FdmVudFcobG9uZyBsb25nIHB0cikgT3BlbkV2ZW50MzJXCis1MzcgICBzdGRjYWxsIE9wZW5GaWxlKHB0ciBwdHIgbG9uZykgT3BlbkZpbGUzMgorNTM4ICAgc3RkY2FsbCBPcGVuRmlsZU1hcHBpbmdBKGxvbmcgbG9uZyBwdHIpIE9wZW5GaWxlTWFwcGluZzMyQQorNTM5ICAgc3RkY2FsbCBPcGVuRmlsZU1hcHBpbmdXKGxvbmcgbG9uZyBwdHIpIE9wZW5GaWxlTWFwcGluZzMyVworNTQwICAgc3RkY2FsbCBPcGVuTXV0ZXhBKGxvbmcgbG9uZyBwdHIpIE9wZW5NdXRleDMyQQorNTQxICAgc3RkY2FsbCBPcGVuTXV0ZXhXKGxvbmcgbG9uZyBwdHIpIE9wZW5NdXRleDMyVworNTQyICAgc3R1YiBPcGVuUHJvY2VzcworNTQzICAgc3R1YiBPcGVuUHJvZmlsZVVzZXJNYXBwaW5nCis1NDQgICBzdGRjYWxsIE9wZW5TZW1hcGhvcmVBKGxvbmcgbG9uZyBwdHIpIE9wZW5TZW1hcGhvcmUzMkEKKzU0NSAgIHN0ZGNhbGwgT3BlblNlbWFwaG9yZVcobG9uZyBsb25nIHB0cikgT3BlblNlbWFwaG9yZTMyVworNTQ2ICAgc3R1YiBPcGVuVnhESGFuZGxlCis1NDcgICBzdGRjYWxsIE91dHB1dERlYnVnU3RyaW5nQShwdHIpIE91dHB1dERlYnVnU3RyaW5nMzJBCis1NDggICBzdGRjYWxsIE91dHB1dERlYnVnU3RyaW5nVyhwdHIpIE91dHB1dERlYnVnU3RyaW5nMzJXCis1NDkgICBzdHViIFBlZWtDb25zb2xlSW5wdXRBCis1NTAgICBzdHViIFBlZWtDb25zb2xlSW5wdXRXCis1NTEgICBzdHViIFBlZWtOYW1lZFBpcGUKKzU1MiAgIHN0dWIgUG9zdFF1ZXVlZENvbXBsZXRpb25TdGF0dXMKKzU1MyAgIHN0dWIgUHJlcGFyZVRhcGUKKzU1NCAgIHN0dWIgUHJvY2VzczMyRmlyc3QKKzU1NSAgIHN0dWIgUHJvY2VzczMyTmV4dAorNTU2ICAgc3R1YiBQdWxzZUV2ZW50Cis1NTcgICBzdHViIFB1cmdlQ29tbQorNTU4ICAgc3R1YiBRVF9UaHVuaworNTU5ICAgc3RkY2FsbCBRdWVyeURvc0RldmljZUEocHRyIHB0ciBsb25nKSBRdWVyeURvc0RldmljZTMyQQorNTYwICAgc3RkY2FsbCBRdWVyeURvc0RldmljZVcocHRyIHB0ciBsb25nKSBRdWVyeURvc0RldmljZTMyVworNTYxICAgc3R1YiBRdWVyeU51bWJlck9mRXZlbnRMb2dSZWNvcmRzCis1NjIgICBzdHViIFF1ZXJ5T2xkZXN0RXZlbnRMb2dSZWNvcmQKKzU2MyAgIHN0ZGNhbGwgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIocHRyKSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgorNTY0ICAgc3R1YiBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5Cis1NjUgICBzdHViIFF1ZXVlVXNlckFQQworNTY2ICAgcmVnaXN0ZXIgUmFpc2VFeGNlcHRpb24obG9uZyBsb25nIGxvbmcgcHRyKSBSYWlzZUV4Y2VwdGlvbgorNTY3ICAgc3RkY2FsbCBSZWFkQ29uc29sZUEobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBSZWFkQ29uc29sZTMyQQorNTY4ICAgc3R1YiBSZWFkQ29uc29sZUlucHV0QQorNTY5ICAgc3R1YiBSZWFkQ29uc29sZUlucHV0VworNTcwICAgc3R1YiBSZWFkQ29uc29sZU91dHB1dEEKKzU3MSAgIHN0dWIgUmVhZENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUKKzU3MiAgIHN0dWIgUmVhZENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJBCis1NzMgICBzdHViIFJlYWRDb25zb2xlT3V0cHV0Q2hhcmFjdGVyVworNTc0ICAgc3R1YiBSZWFkQ29uc29sZU91dHB1dFcKKzU3NSAgIHN0ZGNhbGwgUmVhZENvbnNvbGVXKGxvbmcgcHRyIGxvbmcgcHRyIHB0cikgUmVhZENvbnNvbGUzMlcKKzU3NiAgIHN0ZGNhbGwgUmVhZEZpbGUobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBSZWFkRmlsZQorNTc3ICAgc3R1YiBSZWFkRmlsZUV4Cis1NzggICBzdHViIFJlYWRQcm9jZXNzTWVtb3J5Cis1NzkgICBzdHViIFJlZ2lzdGVyU2VydmljZVByb2Nlc3MKKzU4MCAgIHN0ZGNhbGwgUmVpbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKHB0cikgUmVpbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uCis1ODEgICBzdGRjYWxsIFJlbGVhc2VNdXRleChsb25nKSBSZWxlYXNlTXV0ZXgKKzU4MiAgIHN0ZGNhbGwgUmVsZWFzZVNlbWFwaG9yZShsb25nIGxvbmcgcHRyKSBSZWxlYXNlU2VtYXBob3JlCis1ODMgICBzdGRjYWxsIFJlbW92ZURpcmVjdG9yeUEocHRyKSBSZW1vdmVEaXJlY3RvcnkzMkEKKzU4NCAgIHN0ZGNhbGwgUmVtb3ZlRGlyZWN0b3J5VyhwdHIpIFJlbW92ZURpcmVjdG9yeTMyVworNTg1ICAgc3RkY2FsbCBSZXNldEV2ZW50KGxvbmcpIFJlc2V0RXZlbnQKKzU4NiAgIHN0dWIgUmVzdW1lVGhyZWFkCis1ODcgICBzdGRjYWxsIFJ0bEZpbGxNZW1vcnkocHRyIGxvbmcgbG9uZykgUnRsRmlsbE1lbW9yeQorNTg4ICAgc3RkY2FsbCBSdGxNb3ZlTWVtb3J5KHB0ciBwdHIgbG9uZykgUnRsTW92ZU1lbW9yeQorNTg5ICAgcmVnaXN0ZXIgUnRsVW53aW5kKHB0ciBsb25nIHB0ciBsb25nKSBSdGxVbndpbmQKKzU5MCAgIHN0ZGNhbGwgUnRsWmVyb01lbW9yeShwdHIgbG9uZykgUnRsWmVyb01lbW9yeQorNTkxICAgc3R1YiBTTWFwTFMKKzU5MiAgIHN0dWIgU01hcExTX0lQX0VCUF8xMgorNTkzICAgc3R1YiBTTWFwTFNfSVBfRUJQXzE2Cis1OTQgICBzdHViIFNNYXBMU19JUF9FQlBfMjAKKzU5NSAgIHN0dWIgU01hcExTX0lQX0VCUF8yNAorNTk2ICAgc3R1YiBTTWFwTFNfSVBfRUJQXzI4Cis1OTcgICBzdHViIFNNYXBMU19JUF9FQlBfMzIKKzU5OCAgIHN0dWIgU01hcExTX0lQX0VCUF8zNgorNTk5ICAgc3R1YiBTTWFwTFNfSVBfRUJQXzQwCis2MDAgICBzdHViIFNNYXBMU19JUF9FQlBfOAorNjAxICAgc3R1YiBTVW5NYXBMUworNjAyICAgc3R1YiBTVW5NYXBMU19JUF9FQlBfMTIKKzYwMyAgIHN0dWIgU1VuTWFwTFNfSVBfRUJQXzE2Cis2MDQgICBzdHViIFNVbk1hcExTX0lQX0VCUF8yMAorNjA1ICAgc3R1YiBTVW5NYXBMU19JUF9FQlBfMjQKKzYwNiAgIHN0dWIgU1VuTWFwTFNfSVBfRUJQXzI4Cis2MDcgICBzdHViIFNVbk1hcExTX0lQX0VCUF8zMgorNjA4ICAgc3R1YiBTVW5NYXBMU19JUF9FQlBfMzYKKzYwOSAgIHN0dWIgU1VuTWFwTFNfSVBfRUJQXzQwCis2MTAgICBzdHViIFNVbk1hcExTX0lQX0VCUF84Cis2MTEgICBzdHViIFNjcm9sbENvbnNvbGVTY3JlZW5CdWZmZXJBCis2MTIgICBzdHViIFNjcm9sbENvbnNvbGVTY3JlZW5CdWZmZXJXCis2MTMgICBzdGRjYWxsIFNlYXJjaFBhdGhBKHB0ciBwdHIgcHRyIGxvbmcgcHRyIHB0cikgU2VhcmNoUGF0aDMyQQorNjE0ICAgc3RkY2FsbCBTZWFyY2hQYXRoVyhwdHIgcHRyIHB0ciBsb25nIHB0ciBwdHIpIFNlYXJjaFBhdGgzMlcKKzYxNSAgIHN0ZGNhbGwgU2V0Q29tbUJyZWFrKGxvbmcpIFNldENvbW1CcmVhazMyCis2MTYgICBzdHViIFNldENvbW1Db25maWcKKzYxNyAgIHN0ZGNhbGwgU2V0Q29tbU1hc2sobG9uZyBwdHIpIFNldENvbW1NYXNrCis2MTggICBzdGRjYWxsIFNldENvbW1TdGF0ZShsb25nIHB0cikgU2V0Q29tbVN0YXRlMzIKKzYxOSAgIHN0ZGNhbGwgU2V0Q29tbVRpbWVvdXRzKGxvbmcgcHRyKSBTZXRDb21tVGltZW91dHMKKzYyMCAgIHN0dWIgU2V0Q29tcHV0ZXJOYW1lQQorNjIxICAgc3R1YiBTZXRDb21wdXRlck5hbWVXCis2MjIgICBzdHViIFNldENvbnNvbGVBY3RpdmVTY3JlZW5CdWZmZXIKKzYyMyAgIHN0dWIgU2V0Q29uc29sZUNQCis2MjQgICBzdGRjYWxsIFNldENvbnNvbGVDdHJsSGFuZGxlcihwdHIgbG9uZykgU2V0Q29uc29sZUN0cmxIYW5kbGVyCis2MjUgICBzdHViIFNldENvbnNvbGVDdXJzb3JJbmZvCis2MjYgICBzdGRjYWxsIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihsb25nIGxvbmcpIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbgorNjI3ICAgc3RkY2FsbCBTZXRDb25zb2xlTW9kZShsb25nIGxvbmcpIFNldENvbnNvbGVNb2RlCis2MjggICBzdHViIFNldENvbnNvbGVPdXRwdXRDUAorNjI5ICAgc3R1YiBTZXRDb25zb2xlU2NyZWVuQnVmZmVyU2l6ZQorNjMwICAgc3R1YiBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZQorNjMxICAgc3RkY2FsbCBTZXRDb25zb2xlVGl0bGVBKHB0cikgU2V0Q29uc29sZVRpdGxlMzJBCis2MzIgICBzdGRjYWxsIFNldENvbnNvbGVUaXRsZVcocHRyKSBTZXRDb25zb2xlVGl0bGUzMlcKKzYzMyAgIHN0dWIgU2V0Q29uc29sZVdpbmRvd0luZm8KKzYzNCAgIHN0ZGNhbGwgU2V0Q3VycmVudERpcmVjdG9yeUEocHRyKSBTZXRDdXJyZW50RGlyZWN0b3J5MzJBCis2MzUgICBzdGRjYWxsIFNldEN1cnJlbnREaXJlY3RvcnlXKHB0cikgU2V0Q3VycmVudERpcmVjdG9yeTMyVworNjM2ICAgc3R1YiBTZXREYXlsaWdodEZsYWcKKzYzNyAgIHN0dWIgU2V0RGVmYXVsdENvbW1Db25maWdBCis2MzggICBzdHViIFNldERlZmF1bHRDb21tQ29uZmlnVworNjM5ICAgc3RkY2FsbCBTZXRFbmRPZkZpbGUobG9uZykgU2V0RW5kT2ZGaWxlCis2NDAgICBzdGRjYWxsIFNldEVudmlyb25tZW50VmFyaWFibGVBKHB0ciBwdHIpIFNldEVudmlyb25tZW50VmFyaWFibGUzMkEKKzY0MSAgIHN0ZGNhbGwgU2V0RW52aXJvbm1lbnRWYXJpYWJsZVcocHRyIHB0cikgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyVworNjQyICAgc3RkY2FsbCBTZXRFcnJvck1vZGUobG9uZykgU2V0RXJyb3JNb2RlMzIKKzY0MyAgIHN0ZGNhbGwJU2V0RXZlbnQobG9uZykgU2V0RXZlbnQKKzY0NCAgIHN0ZGNhbGwgU2V0RmlsZUFwaXNUb0FOU0koKSBTZXRGaWxlQXBpc1RvQU5TSQorNjQ1ICAgc3RkY2FsbCBTZXRGaWxlQXBpc1RvT0VNKCkgU2V0RmlsZUFwaXNUb09FTQorNjQ2ICAgc3RkY2FsbCBTZXRGaWxlQXR0cmlidXRlc0EocHRyIGxvbmcpIFNldEZpbGVBdHRyaWJ1dGVzMzJBCis2NDcgICBzdGRjYWxsIFNldEZpbGVBdHRyaWJ1dGVzVyhwdHIgbG9uZykgU2V0RmlsZUF0dHJpYnV0ZXMzMlcKKzY0OCAgIHN0ZGNhbGwgU2V0RmlsZVBvaW50ZXIobG9uZyBsb25nIHB0ciBsb25nKSBTZXRGaWxlUG9pbnRlcgorNjQ5ICAgc3RkY2FsbCBTZXRGaWxlVGltZShsb25nIHB0ciBwdHIgcHRyKSBTZXRGaWxlVGltZQorNjUwICAgc3R1YiBTZXRIYW5kbGVDb250ZXh0Cis2NTEgICBzdGRjYWxsIFNldEhhbmRsZUNvdW50KGxvbmcpIFNldEhhbmRsZUNvdW50MzIKKzY1MiAgIHN0dWIgU2V0SGFuZGxlSW5mb3JtYXRpb24KKzY1MyAgIHN0ZGNhbGwgU2V0TGFzdEVycm9yKGxvbmcpIFNldExhc3RFcnJvcgorNjU0ICAgc3R1YiBTZXRMb2NhbFRpbWUKKzY1NSAgIHN0ZGNhbGwgU2V0TG9jYWxlSW5mb0EobG9uZyBsb25nIHB0cikgU2V0TG9jYWxlSW5mb0EKKzY1NiAgIHN0dWIgU2V0TG9jYWxlSW5mb1cKKzY1NyAgIHN0dWIgU2V0TWFpbHNsb3RJbmZvCis2NTggICBzdHViIFNldE5hbWVkUGlwZUhhbmRsZVN0YXRlCis2NTkgICBzdGRjYWxsIFNldFByaW9yaXR5Q2xhc3MobG9uZyBsb25nKSBTZXRQcmlvcml0eUNsYXNzCis2NjAgICBzdHViIFNldFByb2Nlc3NTaHV0ZG93blBhcmFtZXRlcnMKKzY2MSAgIHN0dWIgU2V0UHJvY2Vzc1dvcmtpbmdTZXRTaXplCis2NjIgICBzdGRjYWxsIFNldFN0ZEhhbmRsZShsb25nIGxvbmcpIFNldFN0ZEhhbmRsZQorNjYzICAgc3RkY2FsbCBTZXRTeXN0ZW1Qb3dlclN0YXRlKGxvbmcgbG9uZykgU2V0U3lzdGVtUG93ZXJTdGF0ZQorNjY0ICAgc3RkY2FsbCBTZXRTeXN0ZW1UaW1lKHB0cikgU2V0U3lzdGVtVGltZQorNjY1ICAgc3R1YiBTZXRTeXN0ZW1UaW1lQWRqdXN0bWVudAorNjY2ICAgc3R1YiBTZXRUYXBlUGFyYW1ldGVycworNjY3ICAgc3R1YiBTZXRUYXBlUG9zaXRpb24KKzY2OCAgIHN0ZGNhbGwgU2V0VGhyZWFkQWZmaW5pdHlNYXNrKGxvbmcgbG9uZykJU2V0VGhyZWFkQWZmaW5pdHlNYXNrCis2NjkgICBzdHViIFNldFRocmVhZENvbnRleHQKKzY3MCAgIHN0dWIgU2V0VGhyZWFkTG9jYWxlCis2NzEgICBzdGRjYWxsIFNldFRocmVhZFByaW9yaXR5KGxvbmcgbG9uZykgU2V0VGhyZWFkUHJpb3JpdHkKKzY3MiAgIHN0ZGNhbGwgU2V0VGltZVpvbmVJbmZvcm1hdGlvbihwdHIpIFNldFRpbWVab25lSW5mb3JtYXRpb24KKzY3MyAgIHN0ZGNhbGwgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKHB0cikgVEhVTktfU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCis2NzQgICBzdHViIFNldFZvbHVtZUxhYmVsQQorNjc1ICAgc3R1YiBTZXRWb2x1bWVMYWJlbFcKKzY3NiAgIHN0dWIgU2V0dXBDb21tCis2NzcgICBzdGRjYWxsIFNpemVvZlJlc291cmNlKGxvbmcgbG9uZykgU2l6ZW9mUmVzb3VyY2UzMgorNjc4ICAgc3RkY2FsbCBTbGVlcChsb25nKSBTbGVlcAorNjc5ICAgc3R1YiBTbGVlcEV4Cis2ODAgICBzdHViIFN1c3BlbmRUaHJlYWQKKzY4MSAgIHN0ZGNhbGwgU3lzdGVtVGltZVRvRmlsZVRpbWUocHRyIHB0cikgU3lzdGVtVGltZVRvRmlsZVRpbWUKKzY4MiAgIHN0dWIgU3lzdGVtVGltZVRvVHpTcGVjaWZpY0xvY2FsVGltZQorNjgzICAgc3R1YiBUZXJtaW5hdGVQcm9jZXNzCis2ODQgICBzdHViIFRlcm1pbmF0ZVRocmVhZAorNjg1ICAgc3R1YiBUaHJlYWQzMkZpcnN0Cis2ODYgICBzdHViIFRocmVhZDMyTmV4dAorNjg3ICAgc3RkY2FsbCBUaHVua0Nvbm5lY3QzMihwdHIgcHRyIHB0ciBwdHIgcHRyIHB0cikgVGh1bmtDb25uZWN0MzIKKzY4OCAgIHN0ZGNhbGwgVGxzQWxsb2MoKQlUbHNBbGxvYworNjkwICAgc3RkY2FsbCBUbHNGcmVlKGxvbmcpIFRsc0ZyZWUKKzY5MSAgIHN0dWIgVGxzRnJlZUludGVybmFsCis2OTIgICBzdGRjYWxsIFRsc0dldFZhbHVlKGxvbmcpIFRsc0dldFZhbHVlCis2OTMgICBzdGRjYWxsIFRsc1NldFZhbHVlKGxvbmcgcHRyKSBUbHNTZXRWYWx1ZQorNjk0ICAgc3R1YiBUb29saGVscDMyUmVhZFByb2Nlc3NNZW1vcnkKKzY5NSAgIHN0dWIgVHJhbnNhY3ROYW1lZFBpcGUKKzY5NiAgIHN0ZGNhbGwgVHJhbnNtaXRDb21tQ2hhcihsb25nIGxvbmcpIFRyYW5zbWl0Q29tbUNoYXIzMgorNjk3ICAgc3R1YiBVVFJlZ2lzdGVyCis2OTggICBzdHViIFVUVW5SZWdpc3RlcgorNjk5ICAgc3RkY2FsbCBVbk1hcExTKGxvbmcpIFVuTWFwTFMKKzcwMCAgIHN0dWIgVW5NYXBTTEZpeEFycmF5Cis3MDEgICBzdGRjYWxsIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcihwdHIpIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgorNzAyICAgc3R1YiBVbmluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24KKzcwMyAgIHN0ZGNhbGwgVW5sb2NrRmlsZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIFVubG9ja0ZpbGUKKzcwNCAgIHN0dWIgVW5sb2NrRmlsZUV4Cis3MDUgICBzdGRjYWxsIFVubWFwVmlld09mRmlsZShwdHIpIFVubWFwVmlld09mRmlsZQorNzA2ICAgc3R1YiBVcGRhdGVSZXNvdXJjZUEKKzcwNyAgIHN0dWIgVXBkYXRlUmVzb3VyY2VXCis3MDggICBzdHViIFZlckxhbmd1YWdlTmFtZUEKKzcwOSAgIHN0dWIgVmVyTGFuZ3VhZ2VOYW1lVworNzEwICAgc3RkY2FsbCBWaXJ0dWFsQWxsb2MocHRyIGxvbmcgbG9uZyBsb25nKSBWaXJ0dWFsQWxsb2MKKzcxMSAgIHN0ZGNhbGwgVmlydHVhbEZyZWUocHRyIGxvbmcgbG9uZykgVmlydHVhbEZyZWUKKzcxMiAgIHN0ZGNhbGwgVmlydHVhbExvY2socHRyIGxvbmcpIFZpcnR1YWxMb2NrCis3MTMgICBzdGRjYWxsIFZpcnR1YWxQcm90ZWN0KHB0ciBsb25nIGxvbmcgcHRyKSBWaXJ0dWFsUHJvdGVjdAorNzE0ICAgc3RkY2FsbCBWaXJ0dWFsUHJvdGVjdEV4KGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIpIFZpcnR1YWxQcm90ZWN0RXgKKzcxNSAgIHN0ZGNhbGwgVmlydHVhbFF1ZXJ5KHB0ciBwdHIgbG9uZykgVmlydHVhbFF1ZXJ5Cis3MTYgICBzdGRjYWxsIFZpcnR1YWxRdWVyeUV4KGxvbmcgcHRyIHB0ciBsb25nKSBWaXJ0dWFsUXVlcnlFeAorNzE3ICAgc3RkY2FsbCBWaXJ0dWFsVW5sb2NrKHB0ciBsb25nKSBWaXJ0dWFsVW5sb2NrCis3MTggICBzdHViIFdhaXRDb21tRXZlbnQKKzcxOSAgIHN0dWIgV2FpdEZvckRlYnVnRXZlbnQKKzcyMCAgIHN0dWIgV2FpdEZvck11bHRpcGxlT2JqZWN0cworNzIxICAgc3R1YiBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXgKKzcyMiAgIHN0ZGNhbGwgV2FpdEZvclNpbmdsZU9iamVjdChsb25nIGxvbmcpIFdhaXRGb3JTaW5nbGVPYmplY3QKKzcyMyAgIHN0dWIgV2FpdEZvclNpbmdsZU9iamVjdEV4Cis3MjQgICBzdHViIFdhaXROYW1lZFBpcGVBCis3MjUgICBzdHViIFdhaXROYW1lZFBpcGVXCis3MjYgICBzdGRjYWxsIFdpZGVDaGFyVG9NdWx0aUJ5dGUobG9uZyBsb25nIHB0ciBsb25nIHB0ciBsb25nIHB0ciBwdHIpCVdpZGVDaGFyVG9NdWx0aUJ5dGUKKzcyNyAgIHN0ZGNhbGwgV2luRXhlYyhwdHIgbG9uZykgV2luRXhlYzMyCis3MjggICBzdGRjYWxsIFdyaXRlQ29uc29sZUEobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBXcml0ZUNvbnNvbGUzMkEKKzcyOSAgIHN0dWIgV3JpdGVDb25zb2xlSW5wdXRBCis3MzAgICBzdHViIFdyaXRlQ29uc29sZUlucHV0VworNzMxICAgc3R1YiBXcml0ZUNvbnNvbGVPdXRwdXRBCis3MzIgICBzdHViIFdyaXRlQ29uc29sZU91dHB1dEF0dHJpYnV0ZQorNzMzICAgc3R1YiBXcml0ZUNvbnNvbGVPdXRwdXRDaGFyYWN0ZXJBCis3MzQgICBzdHViIFdyaXRlQ29uc29sZU91dHB1dENoYXJhY3RlclcKKzczNSAgIHN0dWIgV3JpdGVDb25zb2xlT3V0cHV0VworNzM2ICAgc3RkY2FsbCBXcml0ZUNvbnNvbGVXKGxvbmcgcHRyIGxvbmcgcHRyIHB0cikgV3JpdGVDb25zb2xlMzJXCis3MzcgICBzdGRjYWxsIFdyaXRlRmlsZShsb25nIHB0ciBsb25nIHB0ciBwdHIpIFdyaXRlRmlsZQorNzM4ICAgc3R1YiBXcml0ZUZpbGVFeAorNzM5ICAgc3R1YiBXcml0ZVByaXZhdGVQcm9maWxlU2VjdGlvbkEKKzc0MCAgIHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb25XCis3NDEgICBzdGRjYWxsIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmdBKHB0ciBwdHIgcHRyIHB0cikgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZzMyQQorNzQyICAgc3RkY2FsbCBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nVyhwdHIgcHRyIHB0ciBwdHIpIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmczMlcKKzc0MyAgIHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVN0cnVjdEEKKzc0NCAgIHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVN0cnVjdFcKKzc0NSAgIHN0dWIgV3JpdGVQcm9jZXNzTWVtb3J5Cis3NDYgICBzdHViIFdyaXRlUHJvZmlsZVNlY3Rpb25BCis3NDcgICBzdHViIFdyaXRlUHJvZmlsZVNlY3Rpb25XCis3NDggICBzdGRjYWxsIFdyaXRlUHJvZmlsZVN0cmluZ0EocHRyIHB0ciBwdHIpIFdyaXRlUHJvZmlsZVN0cmluZzMyQQorNzQ5ICAgc3RkY2FsbCBXcml0ZVByb2ZpbGVTdHJpbmdXKHB0ciBwdHIgcHRyKSBXcml0ZVByb2ZpbGVTdHJpbmczMlcKKzc1MCAgIHN0dWIgV3JpdGVUYXBlbWFyaworNzUxICAgc3R1YiBfRGVidWdPdXQKKzc1MiAgIHN0dWIgX0RlYnVnUHJpbnRmCis3NTMgICBzdGRjYWxsIF9ocmVhZChsb25nIHB0ciBsb25nKSBfaHJlYWQzMgorNzU0ICAgc3RkY2FsbCBfaHdyaXRlKGxvbmcgcHRyIGxvbmcpIF9od3JpdGUzMgorNzU1ICAgc3RkY2FsbCBfbGNsb3NlKGxvbmcpIF9sY2xvc2UzMgorNzU2ICAgc3RkY2FsbCBfbGNyZWF0KHB0ciBsb25nKSBfbGNyZWF0MzIKKzc1NyAgIHN0ZGNhbGwgX2xsc2Vlayhsb25nIGxvbmcgbG9uZykgX2xsc2VlazMyCis3NTggICBzdGRjYWxsIF9sb3BlbihwdHIgbG9uZykgX2xvcGVuMzIKKzc1OSAgIHN0ZGNhbGwgX2xyZWFkKGxvbmcgcHRyIGxvbmcpIF9scmVhZDMyCis3NjAgICBzdGRjYWxsIF9sd3JpdGUobG9uZyBwdHIgbG9uZykgX2x3cml0ZTMyCis3NjEgICBzdHViIGRwcmludGYKKzc2MiAgIHN0ZGNhbGwgbHN0cmNhdChwdHIgcHRyKSBsc3RyY2F0MzJBCis3NjMgICBzdGRjYWxsIGxzdHJjYXRBKHB0ciBwdHIpIGxzdHJjYXQzMkEKKzc2NCAgIHN0ZGNhbGwgbHN0cmNhdFcocHRyIHB0cikgbHN0cmNhdDMyVworNzY1ICAgc3RkY2FsbCBsc3RyY21wKHB0ciBwdHIpIGxzdHJjbXAzMkEKKzc2NiAgIHN0ZGNhbGwgbHN0cmNtcEEocHRyIHB0cikgbHN0cmNtcDMyQQorNzY3ICAgc3RkY2FsbCBsc3RyY21wVyhwdHIgcHRyKSBsc3RyY21wMzJXCis3NjggICBzdGRjYWxsIGxzdHJjbXBpKHB0ciBwdHIpIGxzdHJjbXBpMzJBCis3NjkgICBzdGRjYWxsIGxzdHJjbXBpQShwdHIgcHRyKSBsc3RyY21waTMyQQorNzcwICAgc3RkY2FsbCBsc3RyY21waVcocHRyIHB0cikgbHN0cmNtcGkzMlcKKzc3MSAgIHN0ZGNhbGwgbHN0cmNweShwdHIgcHRyKSBsc3RyY3B5MzJBCis3NzIgICBzdGRjYWxsIGxzdHJjcHlBKHB0ciBwdHIpIGxzdHJjcHkzMkEKKzc3MyAgIHN0ZGNhbGwgbHN0cmNweVcocHRyIHB0cikgbHN0cmNweTMyVworNzc0ICAgc3RkY2FsbCBsc3RyY3B5bihwdHIgcHRyIGxvbmcpIGxzdHJjcHluMzJBCis3NzUgICBzdGRjYWxsIGxzdHJjcHluQShwdHIgcHRyIGxvbmcpIGxzdHJjcHluMzJBCis3NzYgICBzdGRjYWxsIGxzdHJjcHluVyhwdHIgcHRyIGxvbmcpIGxzdHJjcHluMzJXCis3NzcgICBzdGRjYWxsIGxzdHJsZW4ocHRyKSBsc3RybGVuMzJBCis3NzggICBzdGRjYWxsIGxzdHJsZW5BKHB0cikgbHN0cmxlbjMyQQorNzc5ICAgc3RkY2FsbCBsc3RybGVuVyhwdHIpIGxzdHJsZW4zMlcKKyMgCisjIEZ1bmN0aW9ucyBleHBvcnRlZCBieSBrZXJuZWwzMi5kbGwgaW4gTlQgMy41MQorIyAKKzc4MCAgIHN0dWIgQWRkQ29uc29sZUFsaWFzQQorNzgxICAgc3R1YiBBZGRDb25zb2xlQWxpYXNXCis3ODIgICBzdHViIEJhc2VBdHRhY2hDb21wbGV0ZVRodW5rCis3ODMgICBzdHViIEJhc2VwRGVidWdEdW1wCis3ODQgICBzdHViIENsb3NlQ29uc29sZUhhbmRsZQorNzg1ICAgc3R1YiBDbWRCYXROb3RpZmljYXRpb24KKzc4NiAgIHN0dWIgQ29uc29sZU1lbnVDb250cm9sCis3ODcgICBzdHViIENvbnNvbGVTdWJzdAorNzg4ICAgc3R1YiBDcmVhdGVWaXJ0dWFsQnVmZmVyCis3ODkgICBzdHViIEV4aXRWRE0KKzc5MCAgIHN0dWIgRXhwdW5nZUNvbnNvbGVDb21tYW5kSGlzdG9yeUEKKzc5MSAgIHN0dWIgRXhwdW5nZUNvbnNvbGVDb21tYW5kSGlzdG9yeVcKKzc5MiAgIHN0dWIgRXh0ZW5kVmlydHVhbEJ1ZmZlcgorNzkzICAgc3R1YiBGcmVlVmlydHVhbEJ1ZmZlcgorNzk0ICAgc3R1YiBHZXRDb25zb2xlQWxpYXNBCis3OTUgICBzdHViIEdldENvbnNvbGVBbGlhc0V4ZXNBCis3OTYgICBzdHViIEdldENvbnNvbGVBbGlhc0V4ZXNMZW5ndGhBCis3OTcgICBzdHViIEdldENvbnNvbGVBbGlhc0V4ZXNMZW5ndGhXCis3OTggICBzdHViIEdldENvbnNvbGVBbGlhc0V4ZXNXCis3OTkgICBzdHViIEdldENvbnNvbGVBbGlhc1cKKzgwMCAgIHN0dWIgR2V0Q29uc29sZUFsaWFzZXNBCis4MDEgICBzdHViIEdldENvbnNvbGVBbGlhc2VzTGVuZ3RoQQorODAyICAgc3R1YiBHZXRDb25zb2xlQWxpYXNlc0xlbmd0aFcKKzgwMyAgIHN0dWIgR2V0Q29uc29sZUFsaWFzZXNXCis4MDQgICBzdHViIEdldENvbnNvbGVDb21tYW5kSGlzdG9yeUEKKzgwNSAgIHN0dWIgR2V0Q29uc29sZUNvbW1hbmRIaXN0b3J5TGVuZ3RoQQorODA2ICAgc3R1YiBHZXRDb25zb2xlQ29tbWFuZEhpc3RvcnlMZW5ndGhXCis4MDcgICBzdHViIEdldENvbnNvbGVDb21tYW5kSGlzdG9yeVcKKzgwOCAgIHN0dWIgR2V0Q29uc29sZUN1cnNvckluZm8KKzgwOSAgIHN0dWIgR2V0Q29uc29sZUN1cnNvckluZm8KKzgxMCAgIHN0dWIgR2V0Q29uc29sZURpc3BsYXlNb2RlCis4MTEgICBzdHViIEdldENvbnNvbGVGb250SW5mbworODEyICAgc3R1YiBHZXRDb25zb2xlRm9udFNpemUKKzgxMyAgIHN0dWIgR2V0Q29uc29sZUhhcmR3YXJlU3RhdGUKKzgxNCAgIHN0dWIgR2V0Q29uc29sZUlucHV0V2FpdEhhbmRsZQorODE1ICAgc3R1YiBHZXRDdXJyZW50Q29uc29sZUZvbnQKKzgxNiAgIHN0dWIgR2V0TmV4dFZETUNvbW1hbmQKKzgxNyAgIHN0dWIgR2V0TnVtYmVyT2ZDb25zb2xlRm9udHMKKzgxOCAgIHN0dWIgR2V0VkRNQ3VycmVudERpcmVjdG9yaWVzCis4MTkgICBzdHViIEhlYXBDcmVhdGVUYWdzVworODIwICAgc3R1YiBIZWFwRXh0ZW5kCis4MjEgICBzdHViIEhlYXBRdWVyeVRhZ1cKKzgyMiAgIHN0dWIgSGVhcFNldEZsYWdzCis4MjMgICBzdHViIEhlYXBTdW1tYXJ5Cis4MjQgICBzdHViIEhlYXBVc2FnZQorODI1ICAgc3R1YiBJbnZhbGlkYXRlQ29uc29sZURJQml0cworODI2ICAgc3R1YiBJc0RlYnVnZ2VyUHJlc2VudAorODI3ICAgc3R1YiBOb3RpZnlOTFNVc2VyQ2FjaGUKKzgyOCAgIHN0dWIgT3BlbkNvbnNvbGVXCis4MjkgICBzdHViIFF1ZXJ5V2luMzFJbmlGaWxlc01hcHBlZFRvUmVnaXN0cnkKKzgzMCAgIHN0dWIgUmVnaXN0ZXJDb25zb2xlVkRNCis4MzEgICBzdHViIFJlZ2lzdGVyV2FpdEZvcklucHV0SWRsZQorODMyICAgc3R1YiBSZWdpc3Rlcldvd0Jhc2VIYW5kbGVycworODMzICAgc3R1YiBSZWdpc3Rlcldvd0V4ZWMKKzgzNCAgIHN0dWIgU2V0Q29uc29sZUNvbW1hbmRIaXN0b3J5TW9kZQorODM1ICAgc3R1YiBTZXRDb25zb2xlQ3Vyc29yCis4MzYgICBzdHViIFNldENvbnNvbGVEaXNwbGF5TW9kZQorODM3ICAgc3R1YiBTZXRDb25zb2xlRm9udAorODM4ICAgc3R1YiBTZXRDb25zb2xlSGFyZHdhcmVTdGF0ZQorODM5ICAgc3R1YiBTZXRDb25zb2xlS2V5U2hvcnRjdXRzCis4NDAgICBzdHViIFNldENvbnNvbGVNYXhpbXVtV2luZG93U2l6ZQorODQxICAgc3R1YiBTZXRDb25zb2xlTWVudUNsb3NlCis4NDIgICBzdHViIFNldENvbnNvbGVOdW1iZXJPZkNvbW1hbmRzQQorODQzICAgc3R1YiBTZXRDb25zb2xlTnVtYmVyT2ZDb21tYW5kc1cKKzg0NCAgIHN0dWIgU2V0Q29uc29sZVBhbGV0dGUKKzg0NSAgIHN0dWIgU2V0TGFzdENvbnNvbGVFdmVudEFjdGl2ZQorODQ2ICAgc3R1YiBTZXRWRE1DdXJyZW50RGlyZWN0b3JpZXMKKzg0NyAgIHN0dWIgU2hvd0NvbnNvbGVDdXJzb3IKKzg0OCAgIHN0dWIgVHJpbVZpcnR1YWxCdWZmZXIKKzg0OSAgIHN0dWIgVkRNQ29uc29sZU9wZXJhdGlvbgorODUwICAgc3R1YiBWRE1PcGVyYXRpb25TdGFydGVkCis4NTEgICBzdHViIFZlcmlmeUNvbnNvbGVJb0hhbmRsZQorODUyICAgc3R1YiBWaXJ0dWFsQnVmZmVyRXhjZXB0aW9uSGFuZGxlcgorODUzICAgc3R1YiBXcml0ZUNvbnNvbGVJbnB1dFZETUEKKzg1NCAgIHN0dWIgV3JpdGVDb25zb2xlSW5wdXRWRE1XCmRpZmYgLS1naXQgYS9pZjE2MzIvbXByLnNwZWMgYi9pZjE2MzIvbXByLnNwZWMKaW5kZXggMTVhNzVhMC4uM2FjYmE1OSAxMDA2NDQKLS0tIGEvaWYxNjMyL21wci5zcGVjCisrKyBiL2lmMTYzMi9tcHIuc3BlYwpAQCAtMyw3ICszLDcgQEAKIAogMDAwOSBzdHViIERsbENhblVubG9hZE5vdwogMDAxMCBzdHViIERsbEdldENsYXNzT2JqZWN0Ci0wMDI1IHN0dWIgTXVsdGluZXRHZXRDb25uZWN0aW9uUGVyZm9ybWFuY2VBCiswMDI1IHN0ZGNhbGwgTXVsdGluZXRHZXRDb25uZWN0aW9uUGVyZm9ybWFuY2VBKHB0ciBwdHIpIE11bHRpbmV0R2V0Q29ubmVjdGlvblBlcmZvcm1hbmNlMzJBCiAwMDI2IHN0dWIgTXVsdGluZXRHZXRDb25uZWN0aW9uUGVyZm9ybWFuY2VXCiAwMDI3IHN0dWIgTXVsdGluZXRHZXRFcnJvclRleHRBCiAwMDI4IHN0dWIgTXVsdGluZXRHZXRFcnJvclRleHRXCmRpZmYgLS1naXQgYS9pZjE2MzIvbnRkbGwuc3BlYyBiL2lmMTYzMi9udGRsbC5zcGVjCmluZGV4IDQyZDllZjIuLmVlZWUxMzQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9udGRsbC5zcGVjCisrKyBiL2lmMTYzMi9udGRsbC5zcGVjCkBAIC04ODYsNyArODg2LDcgQEAKIDg4MiBzdHViIF93Y3N1cHIKIDg4MyBzdHViIGFicwogODg0IHN0dWIgYXRhbgotODg1IHN0dWIgYXRvaQorODg1IHN0ZGNhbGwgYXRvaShwdHIpIENSVERMTF9hdG9pCiA4ODYgc3R1YiBhdG9sCiA4ODcgc3R1YiBjZWlsCiA4ODggc3R1YiBjb3MKZGlmZiAtLWdpdCBhL2lmMTYzMi9yZWxheS5jIGIvaWYxNjMyL3JlbGF5LmMKaW5kZXggOGU4YTE1Zi4uN2Y0NzhmMSAxMDA2NDQKLS0tIGEvaWYxNjMyL3JlbGF5LmMKKysrIGIvaWYxNjMyL3JlbGF5LmMKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX1JFTEFZICovCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTM3MywzICszNzUsNTEgQEAKICAgICB9CiAgICAgcmV0dXJuIHJldHZhbDsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgQ2FsbFByb2MzMlcgICAgKEtFUk5FTC41NikKKyAqLworRFdPUkQKK1dJTjE2X0NhbGxQcm9jMzJXKCkgeworCURXT1JEICp3aW5fc3RhY2sgPSAoRFdPUkQgKilDVVJSRU5UX1NUQUNLMTYtPmFyZ3M7CisJRFdPUkQJbnJvZmFyZ3MgPSB3aW5fc3RhY2tbMF07CisJRFdPUkQJYXJnY29udm1hc2sgPSB3aW5fc3RhY2tbMV07CisJRkFSUFJPQzMyCXByb2MzMiA9IChGQVJQUk9DMzIpd2luX3N0YWNrWzJdOworCURXT1JECSphcmdzLHJldDsKKwlpbnQJaTsKKworCWZwcmludGYoc3RkZXJyLCJDYWxsUHJvYzMyVyglbGQsJWxkLCVwLGFyZ3NbIixucm9mYXJncyxhcmdjb252bWFzayxwcm9jMzIpOworCWFyZ3MgPSAoRFdPUkQqKXhtYWxsb2Moc2l6ZW9mKERXT1JEKSpucm9mYXJncyk7CisJZm9yIChpPW5yb2ZhcmdzO2ktLTspIHsKKwkJaWYgKGFyZ2NvbnZtYXNrICYgKDE8PGkpKSB7CisJCQlhcmdzW25yb2ZhcmdzLWldID0gKERXT1JEKVBUUl9TRUdfVE9fTElOKHdpbl9zdGFja1szK2ldKTsKKwkJCWZwcmludGYoc3RkZXJyLCIlMDhseCglcCksIix3aW5fc3RhY2tbMytpXSxQVFJfU0VHX1RPX0xJTih3aW5fc3RhY2tbMytpXSkpOworCQl9IGVsc2UgeworCQkJYXJnc1tucm9mYXJncy1pXSA9IHdpbl9zdGFja1szK2ldOworCQkJZnByaW50ZihzdGRlcnIsIiVsZCwiLHdpbl9zdGFja1szK2ldKTsKKwkJfQorCX0KKwlmcHJpbnRmKHN0ZGVyciwiXSkgLSAiKTsKKwlzd2l0Y2ggKG5yb2ZhcmdzKSB7CisJY2FzZSAwOiByZXQgPSBDYWxsVG8zMl8wKHByb2MzMik7CisJCWJyZWFrOworCWNhc2UgMToJcmV0ID0gQ2FsbFRvMzJfMShwcm9jMzIsYXJnc1swXSk7CisJCWJyZWFrOworCWNhc2UgMjoJcmV0ID0gQ2FsbFRvMzJfMihwcm9jMzIsYXJnc1swXSxhcmdzWzFdKTsKKwkJYnJlYWs7CisJY2FzZSAzOglyZXQgPSBDYWxsVG8zMl8zKHByb2MzMixhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSk7CisJCWJyZWFrOworCWNhc2UgNDoJcmV0ID0gQ2FsbFRvMzJfNChwcm9jMzIsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7CisJCWJyZWFrOworCWNhc2UgNToJcmV0ID0gQ2FsbFRvMzJfNShwcm9jMzIsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogRklYTUU6IHNob3VsZCBnbyB1cCB0byAzMiAgYXJndW1lbnRzICovCisJCWZwcmludGYoc3RkZXJyLCJDYWxsUHJvYzMyVzogdW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAlbGQsIHBsZWFzZSByZXBvcnQuXG4iLG5yb2ZhcmdzKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCWZwcmludGYoc3RkZXJyLCJyZXR1cm5zICUwOGx4XG4iLHJldCk7CisJZnJlZShhcmdzKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dpbnNvY2suc3BlYyBiL2lmMTYzMi93aW5zb2NrLnNwZWMKaW5kZXggMzk2MWVkNy4uMzdjZTkzMiAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbnNvY2suc3BlYworKysgYi9pZjE2MzIvd2luc29jay5zcGVjCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgICAgICAgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lCiAxMDggcGFzY2FsMTYgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0KHdvcmQpIFdTQUNhbmNlbEFzeW5jUmVxdWVzdAogMTA5IHBhc2NhbDE2IFdTQVNldEJsb2NraW5nSG9vayhzZWdwdHIpIFdTQVNldEJsb2NraW5nSG9vazE2Ci0xMTAgcGFzY2FsMTYgV1NBVW5ob29rQmxvY2tpbmdIb29rKCkgV1NBVW5ob29rQmxvY2tpbmdIb29rCisxMTAgcGFzY2FsMTYgV1NBVW5ob29rQmxvY2tpbmdIb29rKCkgV1NBVW5ob29rQmxvY2tpbmdIb29rMTYKIDExMSBwYXNjYWwxNiBXU0FHZXRMYXN0RXJyb3IoKSBXU0FHZXRMYXN0RXJyb3IKIDExMiBwYXNjYWwgICBXU0FTZXRMYXN0RXJyb3Iod29yZCkgV1NBU2V0TGFzdEVycm9yCiAxMTMgcGFzY2FsMTYgV1NBQ2FuY2VsQmxvY2tpbmdDYWxsKCkgV1NBQ2FuY2VsQmxvY2tpbmdDYWxsCmRpZmYgLS1naXQgYS9pZjE2MzIvd3NvY2szMi5zcGVjIGIvaWYxNjMyL3dzb2NrMzIuc3BlYwppbmRleCBjNzU5N2UyLi43OThlMDFjIDEwMDY0NAotLS0gYS9pZjE2MzIvd3NvY2szMi5zcGVjCisrKyBiL2lmMTYzMi93c29jazMyLnNwZWMKQEAgLTQxLDcgKzQxLDcgQEAKIDEwNyBzdHViIFdTQUFzeW5jR2V0U2VydkJ5TmFtZQogMTA4IHN0dWIgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0CiAxMDkgc3RkY2FsbCBXU0FTZXRCbG9ja2luZ0hvb2socHRyKSBXU0FTZXRCbG9ja2luZ0hvb2szMgotMTEwIHN0dWIgV1NBVW5ob29rQmxvY2tpbmdIb29rCisxMTAgc3RkY2FsbCBXU0FVbmhvb2tCbG9ja2luZ0hvb2soKSBXU0FVbmhvb2tCbG9ja2luZ0hvb2szMgogMTExIHN0dWIgV1NBR2V0TGFzdEVycm9yCiAxMTIgc3R1YiBXU0FTZXRMYXN0RXJyb3IKIDExMyBzdHViIFdTQUNhbmNlbEJsb2NraW5nQ2FsbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2xvci5oIGIvaW5jbHVkZS9jb2xvci5oCmluZGV4IDk0YmU2ZjMuLjk4NWM4NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29sb3IuaAorKysgYi9pbmNsdWRlL2NvbG9yLmgKQEAgLTE0LDcgKzE0LDYgQEAKICNkZWZpbmUgUENfU1lTX1JFU0VSVkVEIDB4NDAJCS8qIHN5c3RlbSBwYWxlbnRyeSBpcyBub3QgdG8gYmUgbWFwcGVkIHRvICovCiAjZGVmaW5lIFBDX1NZU19NQVBQRUQgICAweDEwCQkvKiBsb2dpY2FsIHBhbGVudHJ5IGlzIGEgZGlyZWN0IGFsaWFzIGZvciBzeXN0ZW0gcGFsZW50cnkgKi8KIAotZXh0ZXJuIEhQQUxFVFRFMTYgQ09MT1JfSW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkCSAgQ09MT1JfQ2xlYW51cCh2b2lkKTsKIGV4dGVybiBDT0xPUlJFRgkgIENPTE9SX1RvTG9naWNhbChpbnQgcGl4ZWwpOwogZXh0ZXJuIGludCAJICBDT0xPUl9Ub1BoeXNpY2FsKCBEQyAqZGMsIENPTE9SUkVGIGNvbG9yICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZvbnQuaCBiL2luY2x1ZGUvZm9udC5oCmluZGV4IDUyOGZkNjYuLmNhZTQxMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZm9udC5oCisrKyBiL2luY2x1ZGUvZm9udC5oCkBAIC0yMSwxNSArMjEsOSBAQAogI3ByYWdtYSBwYWNrKDQpCiAKICNkZWZpbmUgRk9OVENBQ0hFIAkzMgkvKiBkeW5hbWljIGZvbnQgY2FjaGUgc2l6ZSAqLwotI2RlZmluZSBNQVhfRk9OVFMJMjU2Ci1leHRlcm4gTFBMT0dGT05UMTYgbHBMb2dGb250TGlzdFtNQVhfRk9OVFMrMV07CiAKLWV4dGVybiBCT09MMzIgRk9OVF9Jbml0KCB2b2lkICk7Ci1leHRlcm4gSU5UMTYgRk9OVF9HZXRPYmplY3QxNiggRk9OVE9CSiAqIGZvbnQsIElOVDE2IGNvdW50LCBMUFNUUiBidWZmZXIgKTsKLWV4dGVybiBJTlQzMiBGT05UX0dldE9iamVjdDMyQSggRk9OVE9CSiAqIGZvbnQsIElOVDMyIGNvdW50LCBMUFNUUiBidWZmZXIgKTsKLWV4dGVybiBpbnQgRk9OVF9QYXJzZUZvbnRQYXJtcyhMUFNUUiBscEZvbnQsIFdPUkQgd1Bhcm1zTm8sIExQU1RSIGxwUmV0U3RyLCBXT1JEIHdNYXhTaXopOwotZXh0ZXJuIHZvaWQgRk9OVF9HZXRNZXRyaWNzKCBMT0dGT05UMTYgKiBsb2dmb250LCBYRm9udFN0cnVjdCAqIHhmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFRNRVRSSUMxNiAqIG1ldHJpY3MgKTsKLQorZXh0ZXJuIEJPT0wzMiBGT05UX0luaXQoIFVJTlQxNiogcFRleHRDYXBzICk7CitleHRlcm4gSU5UMTYgIEZPTlRfR2V0T2JqZWN0MTYoIEZPTlRPQkogKiBmb250LCBJTlQxNiBjb3VudCwgTFBTVFIgYnVmZmVyICk7CitleHRlcm4gSU5UMzIgIEZPTlRfR2V0T2JqZWN0MzJBKCBGT05UT0JKICogZm9udCwgSU5UMzIgY291bnQsIExQU1RSIGJ1ZmZlciApOwogCiAjZW5kaWYgLyogX19XSU5FX0ZPTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nZGkuaCBiL2luY2x1ZGUvZ2RpLmgKaW5kZXggNWIzZGNiMzA0Li40MmQ2NmNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2dkaS5oCisrKyBiL2luY2x1ZGUvZ2RpLmgKQEAgLTM0LDcgKzM0LDcgQEAKIH0gR0RJT0JKSERSOwogCiAKLXR5cGVkZWYgc3RydWN0Cit0eXBlZGVmIHN0cnVjdCB0YWdEZXZpY2VDYXBzCiB7CiAgICAgV09SRCAgIHZlcnNpb247ICAgICAgIC8qICAgMDogZHJpdmVyIHZlcnNpb24gKi8KICAgICBXT1JEICAgdGVjaG5vbG9neTsgICAgLyogICAyOiBkZXZpY2UgdGVjaG5vbG9neSAqLwpAQCAtMTUzLDcgKzE1Myw3IEBACiAgICAgQk9PTDMyICAgICAoKnBEZWxldGVEQykoREMqKTsKICAgICBCT09MMzIgICAgICgqcERlbGV0ZU9iamVjdCkoSEdESU9CSjE2KTsKICAgICBCT09MMzIgICAgICgqcEVsbGlwc2UpKERDKixJTlQzMixJTlQzMixJTlQzMixJTlQzMik7Ci0gICAgQk9PTDMyICAgICAoKnBFbnVtRGV2aWNlRm9udHMpKERDKixMUExPR0ZPTlQzMkEsRk9OVEVOVU1QUk9DRVgzMkEsTFBBUkFNKTsKKyAgICBCT09MMzIgICAgICgqcEVudW1EZXZpY2VGb250cykoREMqLExQTE9HRk9OVDE2LERFVklDRUZPTlRFTlVNUFJPQyxMUEFSQU0pOwogICAgIElOVDMyICAgICAgKCpwRXNjYXBlKShEQyosSU5UMzIsSU5UMzIsU0VHUFRSLFNFR1BUUik7CiAgICAgSU5UMzIgICAgICAoKnBFeGNsdWRlQ2xpcFJlY3QpKERDKixJTlQzMixJTlQzMixJTlQzMixJTlQzMik7CiAgICAgSU5UMzIgICAgICAoKnBFeGNsdWRlVmlzUmVjdCkoREMqLElOVDMyLElOVDMyLElOVDMyLElOVDMyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWRpLmggYi9pbmNsdWRlL21kaS5oCmluZGV4IDQ5MTU3MzAuLjgxMjU4MGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWRpLmgKKysrIGIvaW5jbHVkZS9tZGkuaApAQCAtMjMsMTIgKzIzLDYgQEAKIGV4dGVybiBMUkVTVUxUIE1ESUNsaWVudFduZFByb2MoSFdORDE2IGh3bmQsIFVJTlQxNiBtZXNzYWdlLCAKIAkJCQlXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOyAvKiBtZGkuYyAqLwogCi10eXBlZGVmIHN0cnVjdCB0YWdNRElXQ0wKLXsKLSAgSFdORDE2CSAJIGhDaGlsZDsKLSAgc3RydWN0IHRhZ01ESVdDTAkqcHJldjsKLX0gTURJV0NMOwotCiB0eXBlZGVmIHN0cnVjdCAKIHsKICAgICBVSU5UMTYgICAJbkFjdGl2ZUNoaWxkcmVuOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9taXNjZW11LmggYi9pbmNsdWRlL21pc2NlbXUuaAppbmRleCA1MzI2ODFmLi5kYmE3Y2ZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21pc2NlbXUuaAorKysgYi9pbmNsdWRlL21pc2NlbXUuaApAQCAtMzIsNiArMzIsNyBAQAogZXh0ZXJuIHZvaWQgSU5UX1NldEhhbmRsZXIoIEJZVEUgaW50bnVtLCBGQVJQUk9DMTYgaGFuZGxlciApOwogCiAvKiBtc2Rvcy9pb3BvcnRzLmMgKi8KK2V4dGVybiB2b2lkIElPX3BvcnRfaW5pdCAodm9pZCk7CiBleHRlcm4gRFdPUkQgSU9faW5wb3J0KCBpbnQgcG9ydCwgaW50IGNvdW50ICk7CiBleHRlcm4gdm9pZCBJT19vdXRwb3J0KCBpbnQgcG9ydCwgaW50IGNvdW50LCBEV09SRCB2YWx1ZSApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21tc3lzdGVtLmggYi9pbmNsdWRlL21tc3lzdGVtLmgKaW5kZXggY2MxMzhmZS4uMjljYjhlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tbXN5c3RlbS5oCisrKyBiL2luY2x1ZGUvbW1zeXN0ZW0uaApAQCAtMTg2LDkgKzE4Niw5IEBACiAgICAgVUlOVDE2ICAgIHdQaWQ7ICAgICAgICAgICAgICAgICAgLyogcHJvZHVjdCBJRCAqLwogICAgIFZFUlNJT04gdkRyaXZlclZlcnNpb247ICAgICAgICAvKiB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgKi8KICAgICBjaGFyICAgIHN6UG5hbWVbTUFYUE5BTUVMRU5dOyAgLyogcHJvZHVjdCBuYW1lIChOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nKSAqLwotICAgIERXT1JEICAgZHdGb3JtYXRzOyAgICAgICAgICAgICAvKiBmb3JtYXRzIHN1cHBvcnRlZCAqLworICAgIERXT1JEICAgZHdGb3JtYXRzIFdJTkVfUEFDS0VEOyAgICAgICAgICAgICAvKiBmb3JtYXRzIHN1cHBvcnRlZCAqLwogICAgIFVJTlQxNiAgICB3Q2hhbm5lbHM7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzb3VyY2VzIHN1cHBvcnRlZCAqLwotICAgIERXT1JEICAgZHdTdXBwb3J0OyAgICAgICAgICAgICAvKiBmdW5jdGlvbmFsaXR5IHN1cHBvcnRlZCBieSBkcml2ZXIgKi8KKyAgICBEV09SRCAgIGR3U3VwcG9ydCBXSU5FX1BBQ0tFRDsgICAgICAgICAgICAgLyogZnVuY3Rpb25hbGl0eSBzdXBwb3J0ZWQgYnkgZHJpdmVyICovCiB9IFdBVkVPVVRDQVBTLCAqTFBXQVZFT1VUQ0FQUzsKIAogI2RlZmluZSBXQVZFQ0FQU19QSVRDSCAgICAgICAgICAweDAwMDEgICAvKiBzdXBwb3J0cyBwaXRjaCBjb250cm9sICovCkBAIC0yMDIsNyArMjAyLDcgQEAKICAgICBVSU5UMTYgICAgd1BpZDsgICAgICAgICAgICAgICAgICAgIC8qIHByb2R1Y3QgSUQgKi8KICAgICBWRVJTSU9OIHZEcml2ZXJWZXJzaW9uOyAgICAgICAgICAvKiB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgKi8KICAgICBjaGFyICAgIHN6UG5hbWVbTUFYUE5BTUVMRU5dOyAgICAvKiBwcm9kdWN0IG5hbWUgKE5VTEwgdGVybWluYXRlZCBzdHJpbmcpICovCi0gICAgRFdPUkQgICBkd0Zvcm1hdHM7ICAgICAgICAgICAgICAgLyogZm9ybWF0cyBzdXBwb3J0ZWQgKi8KKyAgICBEV09SRCAgIGR3Rm9ybWF0cyBXSU5FX1BBQ0tFRDsgICAgICAgICAgICAgICAvKiBmb3JtYXRzIHN1cHBvcnRlZCAqLwogICAgIFVJTlQxNiAgICB3Q2hhbm5lbHM7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCAqLwogfSBXQVZFSU5DQVBTLCAqTFBXQVZFSU5DQVBTOwogCkBAIC0zMzUsNyArMzM1LDcgQEAKICAgICBVSU5UMTYgICAgd1ZvaWNlczsgICAgICAgICAgICAgICAvKiAjIG9mIHZvaWNlcyAoaW50ZXJuYWwgc3ludGggb25seSkgKi8KICAgICBVSU5UMTYgICAgd05vdGVzOyAgICAgICAgICAgICAgICAvKiBtYXggIyBvZiBub3RlcyAoaW50ZXJuYWwgc3ludGggb25seSkgKi8KICAgICBVSU5UMTYgICAgd0NoYW5uZWxNYXNrOyAgICAgICAgICAvKiBjaGFubmVscyB1c2VkIChpbnRlcm5hbCBzeW50aCBvbmx5KSAqLwotICAgIERXT1JEICAgZHdTdXBwb3J0OyAgICAgICAgICAgICAvKiBmdW5jdGlvbmFsaXR5IHN1cHBvcnRlZCBieSBkcml2ZXIgKi8KKyAgICBEV09SRCAgIGR3U3VwcG9ydCBXSU5FX1BBQ0tFRDsgICAgICAgICAgICAgLyogZnVuY3Rpb25hbGl0eSBzdXBwb3J0ZWQgYnkgZHJpdmVyICovCiB9IE1JRElPVVRDQVBTLCAqTFBNSURJT1VUQ0FQUzsKIAogI2RlZmluZSBNT0RfTUlESVBPUlQgICAgMSAgLyogb3V0cHV0IHBvcnQgKi8KQEAgLTQyMyw3ICs0MjMsNyBAQAogICAgIFZFUlNJT04gdkRyaXZlclZlcnNpb247ICAgICAgICAvKiB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgKi8KICAgICBjaGFyICAgIHN6UG5hbWVbTUFYUE5BTUVMRU5dOyAgLyogcHJvZHVjdCBuYW1lIChOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nKSAqLwogICAgIFVJTlQxNiAgICB3VGVjaG5vbG9neTsgICAgICAgICAgIC8qIHR5cGUgb2YgZGV2aWNlICovCi0gICAgRFdPUkQgICBkd1N1cHBvcnQ7ICAgICAgICAgICAgIC8qIGZ1bmN0aW9uYWxpdHkgc3VwcG9ydGVkIGJ5IGRyaXZlciAqLworICAgIERXT1JEICAgZHdTdXBwb3J0IFdJTkVfUEFDS0VEOyAgICAgICAgICAgICAvKiBmdW5jdGlvbmFsaXR5IHN1cHBvcnRlZCBieSBkcml2ZXIgKi8KIH0gQVVYQ0FQUywgKkxQQVVYQ0FQUzsKIAogI2RlZmluZSBBVVhDQVBTX0NEQVVESU8gICAgMSAgICAgICAvKiBhdWRpbyBmcm9tIGludGVybmFsIENELVJPTSBkcml2ZSAqLwpAQCAtMTM2NCw2ICsxMzY0LDcgQEAKICNkZWZpbmUgV09ETV9HRVRQTEFZQkFDS1JBVEUgIDE4CiAjZGVmaW5lIFdPRE1fU0VUUExBWUJBQ0tSQVRFICAxOQogI2RlZmluZSBXT0RNX0JSRUFLTE9PUCAgICAgICAgMjAKKyNkZWZpbmUgV09ETV9TVE9QICAgICAgICAgICAgIDIxCiAKICNkZWZpbmUgV0lETV9HRVROVU1ERVZTICA1MAogI2RlZmluZSBXSURNX0dFVERFVkNBUFMgIDUxCkBAIC0xMzc2LDYgKzEzNzcsNyBAQAogI2RlZmluZSBXSURNX1NUT1AgICAgICAgIDU4CiAjZGVmaW5lIFdJRE1fUkVTRVQgICAgICAgNTkKICNkZWZpbmUgV0lETV9HRVRQT1MgICAgICA2MAorI2RlZmluZSBXSURNX1BBVVNFICAgICAgIDYxCiAKICNkZWZpbmUgTU9ETV9HRVROVU1ERVZTCQkxCiAjZGVmaW5lIE1PRE1fR0VUREVWQ0FQUwkJMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZWV4ZS5oIGIvaW5jbHVkZS9uZWV4ZS5oCmluZGV4IGU0MjU1NzMuLjc1N2I0NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmVleGUuaAorKysgYi9pbmNsdWRlL25lZXhlLmgKQEAgLTcsMjIgKzcsNDQgQEAKICNpbmNsdWRlICJ3aW50eXBlcy5oIgogCiAvKgotICogT2xkIE1aIGhlYWRlciBmb3IgRE9TIHByb2dyYW1zLiAgQWN0dWFsbHkganVzdCBhIGNvdXBsZSBvZiBmaWVsZHMKLSAqIGZyb20gaXQsIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBORSBoZWFkZXIuCisgKiBPbGQgTVogaGVhZGVyIGZvciBET1MgcHJvZ3JhbXMuCisgKiBXZSBjaGVjayBvbmx5IHRoZSBtYWdpYyBhbmQgdGhlIGVfbGZhbmV3IG9mZnNldCB0byB0aGUgbmV3IGV4ZWN1dGFibGUKKyAqIGhlYWRlci4KICAqLwotc3RydWN0IG16X2hlYWRlcl9zCit0eXBlZGVmIHN0cnVjdAogewotICAgIFdPUkQgbXpfbWFnaWM7ICAgICAgICAgLyogTVogSGVhZGVyIHNpZ25hdHVyZSAqLwotICAgIEJZVEUgIGRvbnRfY2FyZVsweDNhXTsgIC8qIE1aIEhlYWRlciBzdHVmZiAqLwotICAgIFdPUkQgbmVfb2Zmc2V0OyAgICAgICAgLyogT2Zmc2V0IHRvIGV4dGVuZGVkIGhlYWRlciAqLwotfTsKKwlXT1JECWVfbWFnaWM7CS8qIE1aIEhlYWRlciBzaWduYXR1cmUgKi8KKwlXT1JECWVfY2JscDsJCS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlICovCisJV09SRAllX2NwOwkJLyogUGFnZXMgaW4gZmlsZSAqLworCVdPUkQJZV9jcmxjOwkJLyogUmVsb2NhdGlvbnMgKi8KKwlXT1JECWVfY3BhcmhkcjsJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocyAqLworCVdPUkQJZV9taW5hbGxvYzsJLyogTWluaW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCAqLworCVdPUkQJZV9tYXhhbGxvYzsJLyogTWF4aW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCAqLworCVdPUkQJZV9zczsJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSAqLworCVdPUkQJZV9zcDsJCS8qIEluaXRpYWwgU1AgdmFsdWUgKi8KKwlXT1JECWVfY3N1bTsJCS8qIENoZWNrc3VtICovCisJV09SRAllX2lwOwkJLyogSW5pdGlhbCBJUCB2YWx1ZSAqLworCVdPUkQJZV9jczsJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBDUyB2YWx1ZSAqLworCVdPUkQJZV9sZmFybGM7CS8qIEZpbGUgYWRkcmVzcyBvZiByZWxvY2F0aW9uIHRhYmxlICovCisJV09SRAllX292bm87CQkvKiBPdmVybGF5IG51bWJlciAqLworCVdPUkQJZV9yZXNbNF07CS8qIFJlc2VydmVkIHdvcmRzICovCisJV09SRAllX29lbWlkOwkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbykgKi8KKwlXT1JECWVfb2VtaW5mbzsJLyogT0VNIGluZm9ybWF0aW9uOyBlX29lbWlkIHNwZWNpZmljICovCisJV09SRAllX3JlczJbMTBdOwkvKiBSZXNlcnZlZCB3b3JkcyAqLworCVdPUkQJZV9sZmFuZXc7CS8qIE9mZnNldCB0byBleHRlbmRlZCBoZWFkZXIgKi8KK30gSU1BR0VfRE9TX0hFQURFUiwqTFBJTUFHRV9ET1NfSEVBREVSOwogCi0jZGVmaW5lIE1aX1NJR05BVFVSRSAgKCdNJyB8ICgnWicgPDwgOCkpCisjZGVmaW5lCUlNQUdFX0RPU19TSUdOQVRVUkUJMHg1QTRECQkvKiBNWiAqLworI2RlZmluZQlJTUFHRV9PUzJfU0lHTkFUVVJFCTB4NDU0RQkJLyogTkUgKi8KKyNkZWZpbmUJSU1BR0VfT1MyX1NJR05BVFVSRV9MRQkweDQ1NEMJCS8qIExFICovCisjZGVmaW5lCUlNQUdFX1ZYRF9TSUdOQVRVUkUJMHg0NTRDCQkvKiBMRSAqLworI2RlZmluZQlJTUFHRV9OVF9TSUdOQVRVUkUJMHgwMDAwNDU1MAkvKiBQRTAwICovCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgKE5FKSBoZWFkZXIuCisgKiB0aGUgbmFtZSBJTUFHRV9PUzJfSEVBREVSIGlzIG1pc2xlYWRpbmcsIGJ1dCBpbiB0aGUgU0RLIHRoaXMgd2F5LgogICovCi1zdHJ1Y3QgbmVfaGVhZGVyX3MKK3R5cGVkZWYgc3RydWN0IAogewogICAgIFdPUkQgIG5lX21hZ2ljOyAgICAgICAgICAgICAvKiAwMCBORSBzaWduYXR1cmUgJ05FJyAqLwogICAgIEJZVEUgIGxpbmtlcl92ZXJzaW9uOwkvKiAwMiBMaW5rZXIgdmVyc2lvbiBudW1iZXIgKi8KQEAgLTU2LDEwICs3OCw3IEBACiAgICAgV09SRCAgZmFzdGxvYWRfbGVuZ3RoOwkvKiAzYSBMZW5ndGggb2YgZmFzdCBsb2FkIGFyZWEgKi8KICAgICBXT1JEICByZXNlcnZlZDI7CQkvKiAzYyBSZXNlcnZlZCBieSBNaWNyb3NvZnQgKi8KICAgICBXT1JEICBleHBlY3RfdmVyc2lvbjsJLyogM2UgRXhwZWN0ZWQgV2luZG93cyB2ZXJzaW9uIG51bWJlciAqLwotfTsKLQotI2RlZmluZSBORV9TSUdOQVRVUkUgICgnTicgfCAoJ0UnIDw8IDgpKQotI2RlZmluZSBQRV9TSUdOQVRVUkUgICgnUCcgfCAoJ0UnIDw8IDgpKQorfSBJTUFHRV9PUzJfSEVBREVSLCpMUElNQUdFX09TMl9IRUFERVI7CiAKIC8qCiAgKiBORSBIZWFkZXIgRk9STUFUIEZMQUdTCmRpZmYgLS1naXQgYS9pbmNsdWRlL25vbmNsaWVudC5oIGIvaW5jbHVkZS9ub25jbGllbnQuaAppbmRleCA2NGI4ZGExLi42M2ZlMTE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25vbmNsaWVudC5oCisrKyBiL2luY2x1ZGUvbm9uY2xpZW50LmgKQEAgLTksOSArOSw2IEBACiAKICNpbmNsdWRlICJ3aW4uaCIKIAotZXh0ZXJuIHZvaWQgTkNfR2V0TWluTWF4SW5mbyggV05EICpwV25kLCBQT0lOVDE2ICptYXhTaXplLCBQT0lOVDE2ICptYXhQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0lOVDE2ICptaW5UcmFjaywgUE9JTlQxNiAqbWF4VHJhY2sgKTsKLWV4dGVybiB2b2lkIE5DX0RvTkNQYWludCggSFdORDMyIGh3bmQsIEhSR04zMiBjbGlwLCBCT09MMzIgc3VwcHJlc3NfbWVudXBhaW50KTsKIGV4dGVybiBMT05HIE5DX0hhbmRsZU5DUGFpbnQoIEhXTkQzMiBod25kICwgSFJHTjMyIGNsaXApOwogZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNBY3RpdmF0ZSggV05EICpwd25kLCBXUEFSQU0xNiB3UGFyYW0gKTsKIGV4dGVybiBMT05HIE5DX0hhbmRsZU5DQ2FsY1NpemUoIFdORCAqcFduZCwgUkVDVDE2ICp3aW5SZWN0ICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wdGlvbnMuaCBiL2luY2x1ZGUvb3B0aW9ucy5oCmluZGV4IDM2YmZiNWMuLjIxZjlkN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvb3B0aW9ucy5oCisrKyBiL2luY2x1ZGUvb3B0aW9ucy5oCkBAIC03Miw1ICs3Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVmLCBjaGFyICpidWZmZXIsIGludCBsZW4gKTsKIGV4dGVybiBpbnQgUFJPRklMRV9HZXRXaW5lSW5pSW50KCBjb25zdCBjaGFyICpzZWN0aW9uLCBjb25zdCBjaGFyICprZXlfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmICk7CitleHRlcm4gY2hhciogUFJPRklMRV9HZXRTdHJpbmdJdGVtKCBjaGFyKiApOwogCiAjZW5kaWYgIC8qIF9fV0lORV9PUFRJT05TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGFsZXR0ZS5oIGIvaW5jbHVkZS9wYWxldHRlLmgKaW5kZXggNzcyOWY5My4uYzkxM2ZkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wYWxldHRlLmgKKysrIGIvaW5jbHVkZS9wYWxldHRlLmgKQEAgLTksNiArOSw4IEBACiAKICNpbmNsdWRlICJnZGkuaCIKIAorI2RlZmluZSBOQl9SRVNFUlZFRF9DT0xPUlMgICAgICAgICAgICAgIDIwIC8qIG51bWJlciBvZiBmaXhlZCBjb2xvcnMgaW4gc3lzdGVtIHBhbGV0dGUgKi8KKwogICAvKiBHREkgbG9naWNhbCBwYWxldHRlIG9iamVjdCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTE3LDYgKzE5LDcgQEAKICAgICBMT0dQQUxFVFRFICBsb2dwYWxldHRlOyAvKiBfTVVTVF8gYmUgdGhlIGxhc3QgZmllbGQgKi8KIH0gUEFMRVRURU9CSjsKIAorZXh0ZXJuIEhQQUxFVFRFMTYgUEFMRVRURV9Jbml0KCk7CiBleHRlcm4gaW50IFBBTEVUVEVfR2V0T2JqZWN0KCBQQUxFVFRFT0JKICogcGFsZXR0ZSwgaW50IGNvdW50LCBMUFNUUiBidWZmZXIgKTsKIGV4dGVybiBCT09MMzIgUEFMRVRURV9EZWxldGVPYmplY3QoIEhQQUxFVFRFMTYgaHBhbGV0dGUsIFBBTEVUVEVPQkogKnBhbGV0dGUgKTsKIGV4dGVybiBCT09MMzIgUEFMRVRURV9VbnJlYWxpemVPYmplY3QoIEhQQUxFVFRFMTYgaHBhbGV0dGUsIFBBTEVUVEVPQkogKnBhbGV0dGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wZWV4ZS5oIGIvaW5jbHVkZS9wZWV4ZS5oCmluZGV4IGQ2MGFmZmMuLmM3MTZmNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGVleGUuaAorKysgYi9pbmNsdWRlL3BlZXhlLmgKQEAgLTUsMTUgKzUsMTYgQEAKICNkZWZpbmUgX19XSU5FX1BFRVhFX0gKIAogI2luY2x1ZGUgIndpbnR5cGVzLmgiCisjaW5jbHVkZSAibmVleGUuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0ZJTEVfSEVBREVSIHsKLQlXT1JECU1hY2hpbmU7Ci0JV09SRAlOdW1iZXJPZlNlY3Rpb25zOwotCURXT1JECVRpbWVEYXRlU3RhbXA7Ci0JRFdPUkQJUG9pbnRlclRvU3ltYm9sVGFibGU7Ci0JRFdPUkQJTnVtYmVyT2ZTeW1ib2xzOwotCVdPUkQJU2l6ZU9mT3B0aW9uYWxIZWFkZXI7Ci0JV09SRAlDaGFyYWN0ZXJpc3RpY3M7CisJV09SRAlNYWNoaW5lOwkJCS8qIDAwICovCisJV09SRAlOdW1iZXJPZlNlY3Rpb25zOwkJLyogMDIgKi8KKwlEV09SRAlUaW1lRGF0ZVN0YW1wOwkJCS8qIDA0ICovCisJRFdPUkQJUG9pbnRlclRvU3ltYm9sVGFibGU7CQkvKiAwOCAqLworCURXT1JECU51bWJlck9mU3ltYm9sczsJCS8qIDBjICovCisJV09SRAlTaXplT2ZPcHRpb25hbEhlYWRlcjsJCS8qIDEwICovCisJV09SRAlDaGFyYWN0ZXJpc3RpY3M7CQkvKiAxMiAqLwogfSBJTUFHRV9GSUxFX0hFQURFUiwqTFBJTUFHRV9GSUxFX0hFQURFUjsKIAogI2RlZmluZQlJTUFHRV9TSVpFT0ZfRklMRV9IRUFERVIJMjAKQEAgLTMyOCwxNyArMzI5LDYgQEAKIAlXT1JECVR5cGVPZmZzZXRbMV07CiB9IElNQUdFX0JBU0VfUkVMT0NBVElPTiwqTFBJTUFHRV9CQVNFX1JFTE9DQVRJT047CiAKLXR5cGVkZWYgc3RydWN0IF9JTUFHRV9ERUJVR19ESVJFQ1RPUlkgewotCURXT1JECUNoYXJhY3RlcmlzdGljczsKLQlEV09SRAlUaW1lRGF0ZVN0YW1wOwotCVdPUkQJTWFqb3JWZXJzaW9uOwotCVdPUkQJTWlub3JWZXJzaW9uOwotCURXT1JECVR5cGU7Ci0JRFdPUkQJU2l6ZU9mRGF0YTsKLQlEV09SRAlBZGRyZXNzT2ZSYXdEYXRhOwotCURXT1JECVBvaW50ZXJUb1Jhd0RhdGE7Ci19IElNQUdFX0RFQlVHX0RJUkVDVE9SWSwqTFBJTUFHRV9ERUJVR19ESVJFQ1RPUlk7Ci0KIHR5cGVkZWYgc3RydWN0IF9JTUFHRV9MT0FEX0NPTkZJR19ESVJFQ1RPUlkgewogCURXT1JECUNoYXJhY3RlcmlzdGljczsKIAlEV09SRAlUaW1lRGF0ZVN0YW1wOwpAQCAtMzczLDE3ICszNjMsMTYgQEAKICAqIFRoZSBJTUFHRV9ERUJVR19ESVJFQ1RPUlkgZGF0YSBkaXJlY3RvcnkgcG9pbnRzIHRvIGFuIGFycmF5IG9mCiAgKiB0aGVzZSBzdHJ1Y3R1cmVzLgogICovCi1zdHJ1Y3QgUEVfRGVidWdfZGlyCi17Ci0JdV9sb25nCQlmbGFnczsKLQl1X2xvbmcJCXRpbWVzdGFtcDsKLQl1X3Nob3J0CQltYWpvcjsKLQl1X3Nob3J0CQltaW5vcjsKLQl1X2xvbmcJCXR5cGU7Ci0JdV9sb25nCQlkYmdzaXplOwotCXVfbG9uZwkJZGJncHRyOwotCXVfbG9uZwkJZGJnb2ZmOwotfTsKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9ERUJVR19ESVJFQ1RPUlkgeworCURXT1JECUNoYXJhY3RlcmlzdGljczsKKwlEV09SRAlUaW1lRGF0ZVN0YW1wOworCVdPUkQJTWFqb3JWZXJzaW9uOworCVdPUkQJTWlub3JWZXJzaW9uOworCURXT1JECVR5cGU7CisJRFdPUkQJU2l6ZU9mRGF0YTsKKwlEV09SRAlBZGRyZXNzT2ZSYXdEYXRhOworCURXT1JECVBvaW50ZXJUb1Jhd0RhdGE7Cit9IElNQUdFX0RFQlVHX0RJUkVDVE9SWSwqTFBJTUFHRV9ERUJVR19ESVJFQ1RPUlk7CiAKIC8qCiAgKiBUaGUgdHlwZSBmaWVsZCBhYm92ZSBjYW4gdGFrZSB0aGVzZSAocGx1cyBhIGZldyBvdGhlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9xdWV1ZS5oIGIvaW5jbHVkZS9xdWV1ZS5oCmluZGV4IDgwZmU3N2QuLmRlODhiZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcXVldWUuaAorKysgYi9pbmNsdWRlL3F1ZXVlLmgKQEAgLTk1LDYgKzk1LDUgQEAKIGV4dGVybiB2b2lkIFFVRVVFX1JlbW92ZU1zZyggTUVTU0FHRVFVRVVFICogbXNnUXVldWUsIGludCBwb3MgKTsKIGV4dGVybiB2b2lkIGhhcmR3YXJlX2V2ZW50KCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSwKIAkJCSAgICBpbnQgeFBvcywgaW50IHlQb3MsIERXT1JEIHRpbWUsIERXT1JEIGV4dHJhSW5mbyApOwotZXh0ZXJuIHZvaWQgUVVFVUVfRmx1c2hNZXNzYWdlcyggSFFVRVVFMTYgaFF1ZXVlICk7CiAKICNlbmRpZiAgLyogX19XSU5FX1FVRVVFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3lzbWV0cmljcy5oIGIvaW5jbHVkZS9zeXNtZXRyaWNzLmgKaW5kZXggNGQ1ZGUyZi4uMzcxZDA1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zeXNtZXRyaWNzLmgKKysrIGIvaW5jbHVkZS9zeXNtZXRyaWNzLmgKQEAgLTUzLDEzICs1Myw5IEBACiAjaWZkZWYgV0lOXzk1X0xPT0sKICNkZWZpbmUgU1lTTUVUUklDU19DWE1JTlRSQUNLICAgICAgIDExMgogI2RlZmluZSBTWVNNRVRSSUNTX0NZTUlOVFJBQ0sgICAgICAgIDI3Ci0jZGVmaW5lIFNZU01FVFJJQ1NfQ1hJQ09OU1BBQ0lORyAgICAgNzUKLSNkZWZpbmUgU1lTTUVUUklDU19DWUlDT05TUEFDSU5HICAgICA3NQogI2Vsc2UKICNkZWZpbmUgU1lTTUVUUklDU19DWE1JTlRSQUNLICAgICAgIDEwMAogI2RlZmluZSBTWVNNRVRSSUNTX0NZTUlOVFJBQ0sgICAgICAgIDI4Ci0jZGVmaW5lIFNZU01FVFJJQ1NfQ1hJQ09OU1BBQ0lORyAgICAgMjAKLSNkZWZpbmUgU1lTTUVUUklDU19DWUlDT05TUEFDSU5HICAgICAyMAogI2VuZGlmCiAKICAgLyogU29tZSBub24tY29uc3RhbnQgc3lzdGVtIG1ldHJpY3MgKi8KQEAgLTczLDYgKzY5LDggQEAKICNkZWZpbmUgU1lTTUVUUklDU19DWERPVUJMRUNMSyAgICAgICAgIHN5c01ldHJpY3NbU01fQ1hET1VCTEVDTEtdCiAjZGVmaW5lIFNZU01FVFJJQ1NfQ1lET1VCTEVDTEsgICAgICAgICBzeXNNZXRyaWNzW1NNX0NZRE9VQkxFQ0xLXQogI2RlZmluZSBTWVNNRVRSSUNTX01FTlVEUk9QQUxJR05NRU5UICAgc3lzTWV0cmljc1tTTV9NRU5VRFJPUEFMSUdOTUVOVF0KKyNkZWZpbmUgU1lTTUVUUklDU19DWElDT05TUEFDSU5HICAgICAgIHN5c01ldHJpY3NbU01fQ1hJQ09OU1BBQ0lOR10KKyNkZWZpbmUgU1lTTUVUUklDU19DWUlDT05TUEFDSU5HICAgICAgIHN5c01ldHJpY3NbU01fQ1lJQ09OU1BBQ0lOR10KIAogZXh0ZXJuIHZvaWQgU1lTTUVUUklDU19Jbml0KHZvaWQpOwogZXh0ZXJuIHNob3J0IHN5c01ldHJpY3NbU01fQ01FVFJJQ1MrMV07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Rvb2xoZWxwLmggYi9pbmNsdWRlL3Rvb2xoZWxwLmgKaW5kZXggZmJmMjFhOC4uZWFmMzBlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90b29saGVscC5oCisrKyBiL2luY2x1ZGUvdG9vbGhlbHAuaApAQCAtMjc0LDcgKzI3NCw3IEBACiAjZGVmaW5lIE5GWV9VTktOT1dOCTAKICNkZWZpbmUgTkZZX0xPQURTRUcJMQogLyogREFUQSBpcyBhIHBvaW50ZXIgdG8gZm9sbG93aW5nIHN0cnVjdDogKi8KLXN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCB7CiAJRFdPUkQJZHdTaXplOwogCVdPUkQJd1NlbGVjdG9yOwogCVdPUkQJd1NlZ051bTsKQEAgLTI4Niw3ICsyODYsNyBAQAogCiAvKiBjYWxsZWQgd2hlbiBsb2FkaW5nL3N0YXJ0aW5nIGEgRExMICovCiAjZGVmaW5lIE5GWV9TVEFSVERMTAkzCi1zdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgewogICAgIERXT1JEICAgICAgZHdTaXplOwogICAgIEhNT0RVTEUxNiAgaE1vZHVsZTsKICAgICBXT1JEICAgICAgIHdDUzsKQEAgLTMwNCw3ICszMDQsNyBAQAogCiAvKiBSSVA/IGRlYnVnZXZlbnQgKi8KICNkZWZpbmUgTkZZX1JJUAkJNwotc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IHsKIAlEV09SRAlkd1NpemU7CiAJV09SRAl3SVA7CiAJV09SRAl3Q1M7CkBAIC0zMzEsNyArMzMxLDcgQEAKIAogLyogbG9nIGVycm9ycyAqLwogI2RlZmluZSBORllfTE9HRVJST1IJMTIKLXN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCB7CiAJRFdPUkQJZHdTaXplOwogCVVJTlQxNgl3RXJyQ29kZTsKIAlWT0lEICAgKmxwSW5mbzsgLyogZGVwZW5kcyBvbiB3RXJyQ29kZSAqLwpAQCAtMzM5LDcgKzMzOSw3IEBACiAKIC8qIGNhbGxlZCBmb3IgcGFyYW1ldGVyIGVycm9ycz8gKi8KICNkZWZpbmUgTkZZX0xPR1BBUkFNRVJST1IJMTMKLXN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgRFdPUkQgICAgICAgZHdTaXplOwogICAgIFVJTlQxNiAgICAgIHdFcnJDb2RlOwogICAgIEZBUlBST0MxNiAgIGxwZm5FcnJvckFkZHI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Zlci5oIGIvaW5jbHVkZS92ZXIuaAppbmRleCBkNjI2OTY3Li4wNTM0MmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Zlci5oCisrKyBiL2luY2x1ZGUvdmVyLmgKQEAgLTgzLDcgKzgzLDcgQEAKIAkvKiBvdXRwdXQgKHJldHVybmVkKSAqLwogI2RlZmluZQlWRkZfQ1VSTkVERVNUCQkweDAwMDEKICNkZWZpbmUJVkZGX0ZJTEVJTlVTRQkJMHgwMDAyCi0jZGVmaW5lCVZGRl9CVUZGVE9TTUFMTAkJMHgwMDAzCisjZGVmaW5lCVZGRl9CVUZGVE9PU01BTEwJMHgwMDA0CiAKIC8qIFZlckluc3RhbGxGaWxlIEZsYWdzICovCiAJLyogaW5wdXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luLmggYi9pbmNsdWRlL3dpbi5oCmluZGV4IGFhYmZlNjMuLmVkOWUxYmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luLmgKKysrIGIvaW5jbHVkZS93aW4uaApAQCAtNDAsNiArNDAsNyBAQAogICAgIEJJQzMyX1NDUk9MTCwKICAgICBCSUMzMl9ERVNLVE9QLAogICAgIEJJQzMyX0RJQUxPRywKKyAgICBCSUMzMl9JQ09OVElUTEUsCiAgICAgQklDMzJfTkJfQ0xBU1NFUwogfSBCVUlMVElOX0NMQVNTMzI7CiAKQEAgLTYyLDkgKzYzLDYgQEAKICAgICBISU5TVEFOQ0UxNiAgICBoSW5zdGFuY2U7ICAgICAvKiBXaW5kb3cgaEluc3RhbmNlIChmcm9tIENyZWF0ZVdpbmRvdykgKi8KICAgICBSRUNUMTYgICAgICAgICByZWN0Q2xpZW50OyAgICAvKiBDbGllbnQgYXJlYSByZWwuIHRvIHBhcmVudCBjbGllbnQgYXJlYSAqLwogICAgIFJFQ1QxNiAgICAgICAgIHJlY3RXaW5kb3c7ICAgIC8qIFdob2xlIHdpbmRvdyByZWwuIHRvIHBhcmVudCBjbGllbnQgYXJlYSAqLwotICAgIFJFQ1QxNiAgICAgICAgIHJlY3ROb3JtYWw7ICAgIC8qIFdpbmRvdyByZWN0LiB3aGVuIGluIG5vcm1hbCBzdGF0ZSAqLwotICAgIFBPSU5UMTYgICAgICAgIHB0SWNvblBvczsgICAgIC8qIEljb24gcG9zaXRpb24gKi8KLSAgICBQT0lOVDE2ICAgICAgICBwdE1heFBvczsgICAgICAvKiBNYXhpbWl6ZWQgd2luZG93IHBvc2l0aW9uICovCiAgICAgTFBTVFIgICAgICAgICAgdGV4dDsgICAgICAgICAgLyogV2luZG93IHRleHQgKi8KICAgICB2b2lkICAgICAgICAgICpwVlNjcm9sbDsgICAgICAvKiBWZXJ0aWNhbCBzY3JvbGwtYmFyIGluZm8gKi8KICAgICB2b2lkICAgICAgICAgICpwSFNjcm9sbDsgICAgICAvKiBIb3Jpem9udGFsIHNjcm9sbC1iYXIgaW5mbyAqLwpAQCAtODMsNiArODEsMTQgQEAKICAgICBEV09SRCAgICAgICAgICB3RXh0cmFbMV07ICAgICAvKiBXaW5kb3cgZXh0cmEgYnl0ZXMgKi8KIH0gV05EOwogCit0eXBlZGVmIHN0cnVjdAoreworICAgIFJFQ1QxNgkgICByZWN0Tm9ybWFsOworICAgIFBPSU5UMTYJICAgcHRJY29uUG9zOworICAgIFBPSU5UMTYJICAgcHRNYXhQb3M7CisgICAgSFdORDE2CSAgIGh3bmRJY29uVGl0bGU7Cit9IElOVEVSTkFMUE9TLCAqTFBJTlRFUk5BTFBPUzsKKwogICAvKiBXTkQgZmxhZ3MgdmFsdWVzICovCiAjZGVmaW5lIFdJTl9ORUVEU19CRUdJTlBBSU5UICAgMHgwMDAxIC8qIFdNX1BBSU5UIHNlbnQgdG8gd2luZG93ICovCiAjZGVmaW5lIFdJTl9ORUVEU19FUkFTRUJLR05EICAgMHgwMDAyIC8qIFdNX0VSQVNFQktHTkQgbXVzdCBiZSBzZW50IHRvIHdpbmRvdyovCkBAIC05NywzNCArMTAzLDQyIEBACiAjZGVmaW5lIFdJTl9JU1dJTjMyICAgICAgICAgICAgMHgwNDAwIC8qIFVuZGVyc3RhbmRzIFdpbjMyIG1lc3NhZ2VzICovCiAjZGVmaW5lIFdJTl9TQVZFVU5ERVJfT1ZFUlJJREUgMHgwODAwCiAKKyAgLyogQnVpbGRXaW5BcnJheSgpIGZsYWdzICovCisjZGVmaW5lIEJXQV9TS0lQRElTQUJMRUQJMHgwMDAxCisjZGVmaW5lIEJXQV9TS0lQSElEREVOCQkweDAwMDIKKyNkZWZpbmUgQldBX1NLSVBPV05FRAkJMHgwMDA0CisjZGVmaW5lIEJXQV9TS0lQSUNPTklDCQkweDAwMDgKKwogICAvKiBXaW5kb3cgZnVuY3Rpb25zICovCi1leHRlcm4gV05EICpXSU5fRmluZFduZFB0ciggSFdORDMyIGh3bmQgKTsKLWV4dGVybiBXTkQgKldJTl9HZXREZXNrdG9wKHZvaWQpOwotZXh0ZXJuIHZvaWQgV0lOX0R1bXBXaW5kb3coIEhXTkQzMiBod25kICk7Ci1leHRlcm4gdm9pZCBXSU5fV2Fsa1dpbmRvd3MoIEhXTkQzMiBod25kLCBpbnQgaW5kZW50ICk7CitleHRlcm4gV05EKiAgIFdJTl9GaW5kV25kUHRyKCBIV05EMzIgaHduZCApOworZXh0ZXJuIFdORCogICBXSU5fR2V0RGVza3RvcCh2b2lkKTsKK2V4dGVybiB2b2lkICAgV0lOX0R1bXBXaW5kb3coIEhXTkQzMiBod25kICk7CitleHRlcm4gdm9pZCAgIFdJTl9XYWxrV2luZG93cyggSFdORDMyIGh3bmQsIGludCBpbmRlbnQgKTsKIGV4dGVybiBXaW5kb3cgV0lOX0dldFhXaW5kb3coIEhXTkQzMiBod25kICk7CiBleHRlcm4gQk9PTDMyIFdJTl9VbmxpbmtXaW5kb3coIEhXTkQzMiBod25kICk7CiBleHRlcm4gQk9PTDMyIFdJTl9MaW5rV2luZG93KCBIV05EMzIgaHduZCwgSFdORDMyIGh3bmRJbnNlcnRBZnRlciApOwogZXh0ZXJuIEhXTkQzMiBXSU5fRmluZFdpblRvUmVwYWludCggSFdORDMyIGh3bmQsIEhRVUVVRTE2IGhRdWV1ZSApOwotZXh0ZXJuIHZvaWQgV0lOX1NlbmRQYXJlbnROb3RpZnkoIEhXTkQzMiBod25kLCBXT1JEIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgaWRDaGlsZCwgTFBBUkFNIGxWYWx1ZSApOwotZXh0ZXJuIHZvaWQgV0lOX1Jlc2V0UXVldWVXaW5kb3dzKCBXTkQqIHduZCwgSFFVRVVFMTYgaFF1ZXVlLCBIUVVFVUUxNiBoTmV3ICk7CitleHRlcm4gdm9pZCAgIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBIV05EMzIgaHduZCwgV09SRCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgaWRDaGlsZCwgTFBBUkFNIGxWYWx1ZSApOworZXh0ZXJuIHZvaWQgICBXSU5fUmVzZXRRdWV1ZVdpbmRvd3MoIFdORCogd25kLCBIUVVFVUUxNiBoUXVldWUsIEhRVUVVRTE2IGhOZXcgKTsKIGV4dGVybiBCT09MMzIgV0lOX0NyZWF0ZURlc2t0b3BXaW5kb3codm9pZCk7CiBleHRlcm4gSFdORDMyIFdJTl9HZXRUb3BQYXJlbnQoIEhXTkQzMiBod25kICk7CiBleHRlcm4gQk9PTDMyIFdJTl9Jc1dpbmRvd0RyYXdhYmxlKFdORCosIEJPT0wzMiApOwogZXh0ZXJuIEhJTlNUQU5DRTE2IFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggSFdORDMyIGh3bmQgKTsKLWV4dGVybiBXTkQgKipXSU5fQnVpbGRXaW5BcnJheSggV05EICp3bmRQdHIgKTsKK2V4dGVybiBXTkQqKiAgV0lOX0J1aWxkV2luQXJyYXkoIFdORCAqd25kUHRyLCBVSU5UMzIgYndhLCBVSU5UMzIqIHBudW0gKTsKIAotZXh0ZXJuIHZvaWQgREVGV05EX1NldFRleHQoIFdORCAqd25kUHRyLCBMUENTVFIgdGV4dCApOyAgLyogd2luZG93cy9kZWZ3bmQuYyAqLworZXh0ZXJuIHZvaWQgREVGV05EX1NldFRleHQoIFdORCAqd25kUHRyLCBMUENTVFIgdGV4dCApOwkJICAgICAgLyogd2luZG93cy9kZWZ3bmQuYyAqLwogCi1leHRlcm4gdm9pZCBQUk9QRVJUWV9SZW1vdmVXaW5kb3dQcm9wcyggV05EICpwV25kICk7ICAgLyogd2luZG93cy9wcm9wZXJ0eS5jICovCitleHRlcm4gdm9pZCBQUk9QRVJUWV9SZW1vdmVXaW5kb3dQcm9wcyggV05EICpwV25kICk7ICAJCSAgICAgIC8qIHdpbmRvd3MvcHJvcGVydHkuYyAqLwogCiBleHRlcm4gQk9PTDMyIFBBSU5UX1JlZHJhd1dpbmRvdyggSFdORDMyIGh3bmQsIGNvbnN0IFJFQ1QzMiAqcmVjdFVwZGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkdOMzIgaHJnblVwZGF0ZSwgVUlOVDMyIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBjb250cm9sICk7ICAgIC8qIHdpbmRvd3MvcGFpbnRpbmcuYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBjb250cm9sICk7CQkgICAgICAvKiB3aW5kb3dzL3BhaW50aW5nLmMgKi8KIAogZXh0ZXJuIEJPT0wzMiBXSURHRVRTX0lzQ29udHJvbDMyKCBXTkQqIHBXbmQsIEJVSUxUSU5fQ0xBU1MzMiBjbHMgKTsgIC8qIGNvbnRyb2xzL3dpZGdldHMuYyAqLwogCitleHRlcm4gSFdORDMyIElDT05USVRMRV9DcmVhdGUoIFdORCogKTsJCQkJICAgICAgLyogY29udHJvbHMvaWNvbnRpdGxlLmMgKi8KKwogZXh0ZXJuIERpc3BsYXkgKiBkaXNwbGF5OwogZXh0ZXJuIFNjcmVlbiAqIHNjcmVlbjsKIGV4dGVybiBXaW5kb3cgcm9vdFdpbmRvdzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luMTZkcnYuaCBiL2luY2x1ZGUvd2luMTZkcnYuaAppbmRleCAwNGRmNDE2Li5mN2QxNDRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbjE2ZHJ2LmgKKysrIGIvaW5jbHVkZS93aW4xNmRydi5oCkBAIC0xNjUsMTMgKzE2NSwxMyBAQAogCQkgICAgICAgRkFSUFJPQzE2IGxwQ2FsbGJhY2tGdW5jLCBMUFZPSUQgbHBDbGllbnREYXRhKTsKIGV4dGVybiBEV09SRCBQUlREUlZfUmVhbGl6ZU9iamVjdChMUFBERVZJQ0UgbHBEZXN0RGV2LCBXT1JEIHdTdHlsZSwgCiAJCQkJICBMUFZPSUQgbHBJbk9iaiwgTFBWT0lEIGxwT3V0T2JqLAotCQkJCSAgTFBURVhUWEZPUk0xNiBscFRleHRYRm9ybSk7CisJCQkJICBTRUdQVFIgbHBUZXh0WEZvcm0pOwogCiBleHRlcm4gQk9PTDE2IFBSVERSVl9FbnVtT2JqKExQUERFVklDRSBscERlc3REZXYsIFdPUkQgaVN0eWxlLCBGQVJQUk9DMTYgbHBmbiwgTFBWT0lEIGxwYik7CiBleHRlcm4gRFdPUkQgUFJURFJWX0V4dFRleHRPdXQoTFBQREVWSUNFIGxwRGVzdERldiwgV09SRCB3RGVzdFhPcmcsIFdPUkQgd0Rlc3RZT3JnLAogCQkJICAgICAgIFJFQ1QxNiAqbHBDbGlwUmVjdCwgTFBDU1RSIGxwU3RyaW5nLCBXT1JEIHdDb3VudCwgCi0JCQkgICAgICAgU0VHUFRSIGxwRm9udEluZm8sIExQRFJBV01PREUgbHBEcmF3TW9kZSwgCi0JCQkgICAgICAgTFBURVhUWEZPUk0xNiBscFRleHRYRm9ybSwgU0hPUlQgKmxwQ2hhcldpZHRocywKKwkJCSAgICAgICBTRUdQVFIgbHBGb250SW5mbyxTRUdQVFIgbHBEcmF3TW9kZSwgCisJCQkgICAgICAgU0VHUFRSIGxwVGV4dFhGb3JtLCBTSE9SVCAqbHBDaGFyV2lkdGhzLAogCQkJICAgICAgIFJFQ1QxNiAqICAgICBscE9wYXF1ZVJlY3QsIFdPUkQgd09wdGlvbnMpOwogCiAKQEAgLTE5MSw0ICsxOTEsMTIgQEAKIAogCiAKKy8qCisgKiBXaW5lIDE2Yml0IGRyaXZlciBnbG9iYWwgdmFyaWFibGVzCisgKi8KK2V4dGVybiBTRUdQVFIJCXdpbjE2ZHJ2X1NlZ1B0cl9UZXh0WEZvcm07CitleHRlcm4gTFBURVhUWEZPUk0xNiAJd2luMTZkcnZfVGV4dFhGb3JtUDsKK2V4dGVybiBTRUdQVFIJCXdpbjE2ZHJ2X1NlZ1B0cl9EcmF3TW9kZTsKK2V4dGVybiBMUERSQVdNT0RFIAl3aW4xNmRydl9EcmF3TW9kZVA7CisKICNlbmRpZiAgLyogX19XSU5FX1dJTjE2RFJWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggZGJmYjI5ZS4uZGMzYTQ5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTIzNSw5ICsyMzUsMTEgQEAKIERFQ0xfV0lORUxJQl9UWVBFX0FXKE1ESUNSRUFURVNUUlVDVCk7CiBERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1ESUNSRUFURVNUUlVDVCk7CiAKLSNkZWZpbmUgTURJVElMRV9WRVJUSUNBTCAgICAwICAgIAotI2RlZmluZSBNRElUSUxFX0hPUklaT05UQUwgIDEKLSNkZWZpbmUgTURJU19BTExDSElMRFNUWUxFUyAweDAwMDEKKyNkZWZpbmUgTURJVElMRV9WRVJUSUNBTCAgICAgMHgwMDAwICAgCisjZGVmaW5lIE1ESVRJTEVfSE9SSVpPTlRBTCAgIDB4MDAwMQorI2RlZmluZSBNRElUSUxFX1NLSVBESVNBQkxFRCAweDAwMDIKKworI2RlZmluZSBNRElTX0FMTENISUxEU1RZTEVTICAweDAwMDEKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIERXT1JEICAgc3R5bGVPbGQ7CkBAIC05ODAsNiArOTgyLDEwIEBACiAjZGVmaW5lIExGX0ZBQ0VTSVpFICAgICAzMgogI2RlZmluZSBMRl9GVUxMRkFDRVNJWkUgNjQKIAorI2RlZmluZSBSQVNURVJfRk9OVFRZUEUgICAgIDB4MDAwMQorI2RlZmluZSBERVZJQ0VfRk9OVFRZUEUgICAgIDB4MDAwMgorI2RlZmluZSBUUlVFVFlQRV9GT05UVFlQRSAgIDB4MDAwNAorCiB0eXBlZGVmIHN0cnVjdAogewogICAgIElOVDE2ICBsZkhlaWdodDsKQEAgLTExNjgsNyArMTE3NCwxNSBAQAogI2RlZmluZSBTWU1CT0xfQ0hBUlNFVAkgICAgICAyCiAjZGVmaW5lIFNISUZUSklTX0NIQVJTRVQgICAgICAxMjgKICNkZWZpbmUgSEFOR0VVTF9DSEFSU0VUICAgICAgIDEyOQorI2RlZmluZSBHQjIzMTNfQ0hBUlNFVCAgICAgICAgMTM0CiAjZGVmaW5lIENISU5FU0VCSUc1X0NIQVJTRVQgICAxMzYKKyNkZWZpbmUgR1JFRUtfQ0hBUlNFVCAgICAgICAgIDE2MQkvKiBDUDEyNTMgKi8KKyNkZWZpbmUgVFVSS0lTSF9DSEFSU0VUICAgICAgIDE2MgkvKiBDUDEyNTQsIC1pc284ODU5LTkgKi8KKyNkZWZpbmUgSEVCUkVXX0NIQVJTRVQgICAgICAgIDE3NwkvKiBDUDEyNTUgKi8KKyNkZWZpbmUgQVJBQklDX0NIQVJTRVQgICAgICAgIDE3OAkvKiBDUDEyNTYgKi8KKyNkZWZpbmUgQkFMVElDX0NIQVJTRVQgICAgICAgIDE4NgkvKiBDUDEyNTcgKi8KKyNkZWZpbmUgUlVTU0lBTl9DSEFSU0VUICAgICAgIDIwNAkvKiBDUDEyNTEgKi8KKyNkZWZpbmUgRUVfQ0hBUlNFVAkgICAgICAyMzgJLyogQ1AxMjUwLCAtaXNvODg1OS0yICovCiAjZGVmaW5lIE9FTV9DSEFSU0VUCSAgICAgIDI1NQogCiAgIC8qIGxmT3V0UHJlY2lzaW9uIHZhbHVlcyAqLwpAQCAtMTQwNSw4ICsxNDE5LDggQEAKIHR5cGVkZWYgSU5UMzIgKCpGT05URU5VTVBST0NFWDMyVykoTFBFTlVNTE9HRk9OVEVYMzJXLExQTkVXVEVYVE1FVFJJQ0VYMzJXLFVJTlQzMixMUEFSQU0pOwogREVDTF9XSU5FTElCX1RZUEVfQVcoRk9OVEVOVU1QUk9DRVgpOwogCi0gIC8qIHRtUGl0Y2hBbmRGYW1pbHkgdmFsdWVzICovCi0jZGVmaW5lIFRNUEZfRklYRURfUElUQ0ggICAgMQorICAvKiB0bVBpdGNoQW5kRmFtaWx5IGJpdHMgKi8KKyNkZWZpbmUgVE1QRl9GSVhFRF9QSVRDSCAgICAxCQkvKiBtZWFucyB2YXJpYWJsZSBwaXRjaCAqLwogI2RlZmluZSBUTVBGX1ZFQ1RPUgkgICAgMgogI2RlZmluZSBUTVBGX1RSVUVUWVBFCSAgICA0CiAjZGVmaW5lIFRNUEZfREVWSUNFCSAgICA4CkBAIC0yMzA0LDYgKzIzMTgsNyBAQAogI2RlZmluZQlXRl9TTUFMTEZSQU1FCTB4MDIwMAogI2RlZmluZQlXRl84MHg4NwkweDA0MDAKICNkZWZpbmUJV0ZfUEFHSU5HCTB4MDgwMAorI2RlZmluZQlXRl9IQVNDUFVJRCAgICAgMHgyMDAwCiAjZGVmaW5lCVdGX1dJTjMyV09XICAgICAweDQwMDAJLyogdW5kb2MgKi8KICNkZWZpbmUJV0ZfV0xPICAgICAgICAgIDB4ODAwMAogCkBAIC0yOTE3LDYgKzI5MzIsNTAgQEAKICNkZWZpbmUgQkZfRElBR09OQUxfRU5EQk9UVE9NTEVGVCAgIChCRl9ESUFHT05BTCB8IEJGX0JPVFRPTSB8IEJGX0xFRlQpCiAjZGVmaW5lIEJGX0RJQUdPTkFMX0VOREJPVFRPTVJJR0hUICAoQkZfRElBR09OQUwgfCBCRl9CT1RUT00gfCBCRl9SSUdIVCkKIAorLyogRHJhd0ZyYW1lQ29udHJvbCgpIHVUeXBlJ3MgKi8KKworI2RlZmluZSBERkNfQ0FQVElPTiAgICAgICAgICAgICAxCisjZGVmaW5lIERGQ19NRU5VICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgREZDX1NDUk9MTCAgICAgICAgICAgICAgMworI2RlZmluZSBERkNfQlVUVE9OICAgICAgICAgICAgICA0CisKKy8qIHVTdGF0ZSdzICovCisKKyNkZWZpbmUgREZDU19DQVBUSU9OQ0xPU0UgICAgICAgMHgwMDAwCisjZGVmaW5lIERGQ1NfQ0FQVElPTk1JTiAgICAgICAgIDB4MDAwMQorI2RlZmluZSBERkNTX0NBUFRJT05NQVggICAgICAgICAweDAwMDIKKyNkZWZpbmUgREZDU19DQVBUSU9OUkVTVE9SRSAgICAgMHgwMDAzCisjZGVmaW5lIERGQ1NfQ0FQVElPTkhFTFAgICAgICAgIDB4MDAwNAkJLyogV2luZG93cyA5NSBvbmx5ICovCisKKyNkZWZpbmUgREZDU19NRU5VQVJST1cgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIERGQ1NfTUVOVUNIRUNLICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBERkNTX01FTlVCVUxMRVQgICAgICAgICAweDAwMDIKKyNkZWZpbmUgREZDU19NRU5VQVJST1dSSUdIVCAgICAgMHgwMDA0CisKKyNkZWZpbmUgREZDU19TQ1JPTExVUCAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBERkNTX1NDUk9MTERPV04gICAgICAgICAgMHgwMDAxCisjZGVmaW5lIERGQ1NfU0NST0xMTEVGVCAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgREZDU19TQ1JPTExSSUdIVCAgICAgICAgIDB4MDAwMworI2RlZmluZSBERkNTX1NDUk9MTENPTUJPQk9YICAgICAgMHgwMDA1CisjZGVmaW5lIERGQ1NfU0NST0xMU0laRUdSSVAgICAgICAweDAwMDgKKyNkZWZpbmUgREZDU19TQ1JPTExTSVpFR1JJUFJJR0hUIDB4MDAxMAorCisjZGVmaW5lIERGQ1NfQlVUVE9OQ0hFQ0sgICAgICAgIDB4MDAwMAorI2RlZmluZSBERkNTX0JVVFRPTlJBRElPSU1BR0UgICAweDAwMDEKKyNkZWZpbmUgREZDU19CVVRUT05SQURJT01BU0sgICAgMHgwMDAyCQkvKiB0byBkcmF3IG5vbnNxdWFyZSBidXR0b24gKi8KKyNkZWZpbmUgREZDU19CVVRUT05SQURJTyAgICAgICAgMHgwMDA0CisjZGVmaW5lIERGQ1NfQlVUVE9OM1NUQVRFICAgICAgIDB4MDAwOAorI2RlZmluZSBERkNTX0JVVFRPTlBVU0ggICAgICAgICAweDAwMTAKKworLyogYWRkaXRpb25hbCBzdGF0ZSBvZiB0aGUgY29udHJvbCAqLworCisjZGVmaW5lIERGQ1NfSU5BQ1RJVkUgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBERkNTX1BVU0hFRCAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgREZDU19DSEVDS0VEICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIERGQ1NfQURKVVNUUkVDVCAgICAgICAgIDB4MjAwMAkJLyogZXhjbHVkZSBzdXJyb3VuZGluZyBlZGdlICovCisjZGVmaW5lIERGQ1NfRkxBVCAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBERkNTX01PTk8gICAgICAgICAgICAgICAweDgwMDAKKwogLyogV2luZG93IFN0eWxlcyAqLwogI2RlZmluZSBXU19PVkVSTEFQUEVEICAgIDB4MDAwMDAwMDBMCiAjZGVmaW5lIFdTX1BPUFVQICAgICAgICAgMHg4MDAwMDAwMEwKQEAgLTQwOTMsNiArNDE1Miw5OCBAQAogdHlwZWRlZiBJTlQzMiAoKk1GRU5VTVBST0MzMikoSERDMzIsSEFORExFVEFCTEUzMiosTUVUQVJFQ09SRCosSU5UMzIsTFBBUkFNKTsKIERFQ0xfV0lORUxJQl9UWVBFKE1GRU5VTVBST0MpOwogCisjaWZuZGVmIE5PTE9HRVJST1IKKworLyogTG9nUGFyYW1FcnJvciBhbmQgTG9nRXJyb3IgdmFsdWVzICovCisKKy8qIEVycm9yIG1vZGlmaWVyIGJpdHMgKi8KKyNkZWZpbmUgRVJSX1dBUk5JTkcgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEVSUl9QQVJBTSAgICAgICAgICAgICAgIDB4NDAwMAorCisjZGVmaW5lIEVSUl9TSVpFX01BU0sgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBFUlJfQllURSAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRVJSX1dPUkQgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIEVSUl9EV09SRCAgICAgICAgICAgICAgIDB4MzAwMAorCisvKiBMb2dQYXJhbUVycm9yKCkgdmFsdWVzICovCisKKy8qIEdlbmVyaWMgcGFyYW1ldGVyIHZhbHVlcyAqLworI2RlZmluZSBFUlJfQkFEX1ZBTFVFICAgICAgICAgICAweDYwMDEKKyNkZWZpbmUgRVJSX0JBRF9GTEFHUyAgICAgICAgICAgMHg2MDAyCisjZGVmaW5lIEVSUl9CQURfSU5ERVggICAgICAgICAgIDB4NjAwMworI2RlZmluZSBFUlJfQkFEX0RWQUxVRSAgICAgICAgICAweDcwMDQKKyNkZWZpbmUgRVJSX0JBRF9ERkxBR1MgICAgICAgICAgMHg3MDA1CisjZGVmaW5lIEVSUl9CQURfRElOREVYICAgICAgICAgIDB4NzAwNgorI2RlZmluZSBFUlJfQkFEX1BUUiAgICAgICAgICAgICAweDcwMDcKKyNkZWZpbmUgRVJSX0JBRF9GVU5DX1BUUiAgICAgICAgMHg3MDA4CisjZGVmaW5lIEVSUl9CQURfU0VMRUNUT1IgICAgICAgIDB4NjAwOQorI2RlZmluZSBFUlJfQkFEX1NUUklOR19QVFIgICAgICAweDcwMGEKKyNkZWZpbmUgRVJSX0JBRF9IQU5ETEUgICAgICAgICAgMHg2MDBiCisKKy8qIEtFUk5FTCBwYXJhbWV0ZXIgZXJyb3JzICovCisjZGVmaW5lIEVSUl9CQURfSElOU1RBTkNFICAgICAgIDB4NjAyMAorI2RlZmluZSBFUlJfQkFEX0hNT0RVTEUgICAgICAgICAweDYwMjEKKyNkZWZpbmUgRVJSX0JBRF9HTE9CQUxfSEFORExFICAgMHg2MDIyCisjZGVmaW5lIEVSUl9CQURfTE9DQUxfSEFORExFICAgIDB4NjAyMworI2RlZmluZSBFUlJfQkFEX0FUT00gICAgICAgICAgICAweDYwMjQKKyNkZWZpbmUgRVJSX0JBRF9IRklMRSAgICAgICAgICAgMHg2MDI1CisKKy8qIFVTRVIgcGFyYW1ldGVyIGVycm9ycyAqLworI2RlZmluZSBFUlJfQkFEX0hXTkQgICAgICAgICAgICAweDYwNDAKKyNkZWZpbmUgRVJSX0JBRF9ITUVOVSAgICAgICAgICAgMHg2MDQxCisjZGVmaW5lIEVSUl9CQURfSENVUlNPUiAgICAgICAgIDB4NjA0MgorI2RlZmluZSBFUlJfQkFEX0hJQ09OICAgICAgICAgICAweDYwNDMKKyNkZWZpbmUgRVJSX0JBRF9IRFdQICAgICAgICAgICAgMHg2MDQ0CisjZGVmaW5lIEVSUl9CQURfQ0lEICAgICAgICAgICAgIDB4NjA0NQorI2RlZmluZSBFUlJfQkFEX0hEUlZSICAgICAgICAgICAweDYwNDYKKworLyogR0RJIHBhcmFtZXRlciBlcnJvcnMgKi8KKyNkZWZpbmUgRVJSX0JBRF9DT09SRFMgICAgICAgICAgMHg3MDYwCisjZGVmaW5lIEVSUl9CQURfR0RJX09CSkVDVCAgICAgIDB4NjA2MQorI2RlZmluZSBFUlJfQkFEX0hEQyAgICAgICAgICAgICAweDYwNjIKKyNkZWZpbmUgRVJSX0JBRF9IUEVOICAgICAgICAgICAgMHg2MDYzCisjZGVmaW5lIEVSUl9CQURfSEZPTlQgICAgICAgICAgIDB4NjA2NAorI2RlZmluZSBFUlJfQkFEX0hCUlVTSCAgICAgICAgICAweDYwNjUKKyNkZWZpbmUgRVJSX0JBRF9IQklUTUFQICAgICAgICAgMHg2MDY2CisjZGVmaW5lIEVSUl9CQURfSFJHTiAgICAgICAgICAgIDB4NjA2NworI2RlZmluZSBFUlJfQkFEX0hQQUxFVFRFICAgICAgICAweDYwNjgKKyNkZWZpbmUgRVJSX0JBRF9ITUVUQUZJTEUgICAgICAgMHg2MDY5CisKKworLyogTG9nRXJyb3IoKSB2YWx1ZXMgKi8KKworLyogS0VSTkVMIGVycm9ycyAqLworI2RlZmluZSBFUlJfR0FMTE9DICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgRVJSX0dSRUFMTE9DICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEVSUl9HTE9DSyAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBFUlJfTEFMTE9DICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgRVJSX0xSRUFMTE9DICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEVSUl9MTE9DSyAgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBFUlJfQUxMT0NSRVMgICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgRVJSX0xPQ0tSRVMgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEVSUl9MT0FETU9EVUxFICAgICAgICAgIDB4MDAwOQorCisvKiBVU0VSIGVycm9ycyAqLworI2RlZmluZSBFUlJfQ1JFQVRFRExHICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgRVJSX0NSRUFURURMRzIgICAgICAgICAgMHgwMDQxCisjZGVmaW5lIEVSUl9SRUdJU1RFUkNMQVNTICAgICAgIDB4MDA0MgorI2RlZmluZSBFUlJfRENCVVNZICAgICAgICAgICAgICAweDAwNDMKKyNkZWZpbmUgRVJSX0NSRUFURVdORCAgICAgICAgICAgMHgwMDQ0CisjZGVmaW5lIEVSUl9TVFJVQ0VYVFJBICAgICAgICAgIDB4MDA0NQorI2RlZmluZSBFUlJfTE9BRFNUUiAgICAgICAgICAgICAweDAwNDYKKyNkZWZpbmUgRVJSX0xPQURNRU5VICAgICAgICAgICAgMHgwMDQ3CisjZGVmaW5lIEVSUl9ORVNURURCRUdJTlBBSU5UICAgIDB4MDA0OAorI2RlZmluZSBFUlJfQkFESU5ERVggICAgICAgICAgICAweDAwNDkKKyNkZWZpbmUgRVJSX0NSRUFURU1FTlUgICAgICAgICAgMHgwMDRhCisKKy8qIEdESSBlcnJvcnMgKi8KKyNkZWZpbmUgRVJSX0NSRUFURURDICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEVSUl9DUkVBVEVNRVRBICAgICAgICAgIDB4MDA4MQorI2RlZmluZSBFUlJfREVMT0JKU0VMRUNURUQgICAgICAweDAwODIKKyNkZWZpbmUgRVJSX1NFTEJJVE1BUCAgICAgICAgICAgMHgwMDgzCisKKworCiAvKiBEZWJ1Z2dpbmcgc3VwcG9ydCAoREVCVUcgU1lTVEVNIE9OTFkpICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtNDE0MSw2ICs0MjkyLDggQEAKICNkZWZpbmUgREJGX0FQUExJQ0FUSU9OICAgICAweDAwMDgKICNkZWZpbmUgREJGX0RSSVZFUiAgICAgICAgICAweDAwMTAKIAorI2VuZGlmIC8qIE5PTE9HRVJST1IgKi8KKwogLyogV2luMzItc3BlY2lmaWMgc3RydWN0dXJlcyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC00NTMyLDYgKzQ2ODUsOCBAQAogICAgIERXT1JEICAgIEhpZ2hQYXJ0OwogfSBVTEFSR0VfSU5URUdFUiwqTFBVTEFSR0VfSU5URUdFUjsKIAordHlwZWRlZiBMQVJHRV9JTlRFR0VSIExVSUQsKkxQTFVJRDsgLyogbG9jYWxseSB1bmlxdWUgaWRzICovCisKIC8qIFNldExhc3RFcnJvckV4IHR5cGVzICovCiAjZGVmaW5lCVNMRV9FUlJPUgkweDAwMDAwMDAxCiAjZGVmaW5lCVNMRV9NSU5PUkVSUk9SCTB4MDAwMDAwMDIKQEAgLTQ4MTQsNiArNDk2OSwzOSBAQAogREVDTF9XSU5FTElCX1RZUEVfQVcoRE9DSU5GTyk7CiBERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERPQ0lORk8pOwogCit0eXBlZGVmIHN0cnVjdCB7CisJRFdPUkQJZHdTY29wZTsKKwlEV09SRAlkd1R5cGU7CisJRFdPUkQJZHdEaXNwbGF5VHlwZTsKKwlEV09SRAlkd1VzYWdlOworCUxQU1RSCWxwTG9jYWxOYW1lOworCUxQU1RSCWxwUmVtb3RlTmFtZTsKKwlMUFNUUglscENvbW1lbnQgOworCUxQU1RSCWxwUHJvdmlkZXI7Cit9IE5FVFJFU09VUkNFMzJBLCpMUE5FVFJFU09VUkNFMzJBOworCit0eXBlZGVmIHN0cnVjdCB7CisJRFdPUkQJZHdTY29wZTsKKwlEV09SRAlkd1R5cGU7CisJRFdPUkQJZHdEaXNwbGF5VHlwZTsKKwlEV09SRAlkd1VzYWdlOworCUxQV1NUUglscExvY2FsTmFtZTsKKwlMUFdTVFIJbHBSZW1vdGVOYW1lOworCUxQV1NUUglscENvbW1lbnQgOworCUxQV1NUUglscFByb3ZpZGVyOworfSBORVRSRVNPVVJDRTMyVywqTFBORVRSRVNPVVJDRTMyVzsKKworREVDTF9XSU5FTElCX1RZUEVfQVcoTkVUUkVTT1VSQ0UpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBORVRSRVNPVVJDRSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlEV09SRAljYlN0cnVjdHVyZTsKKwlEV09SRAlkd0ZsYWdzOworCURXT1JECWR3U3BlZWQ7CisJRFdPUkQJZHdEZWxheTsKKwlEV09SRAlkd09wdERhdGFTaXplOworfSBORVRDT05ORUNUSU5GT1NUUlVDVCwqTFBORVRDT05ORUNUSU5GT1NUUlVDVDsKKwogI3ByYWdtYSBwYWNrKDQpCiAKIC8qIERlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIHRoYXQgZXhpc3Qgb25seSBpbiBXaW4xNiAqLwpAQCAtNDg5OSw2ICs1MDg3LDggQEAKIEJPT0wxNiAgICAgSXNUYXNrKEhUQVNLMTYpOwogSFRBU0sxNiAgICBJc1Rhc2tMb2NrZWQodm9pZCk7CiBCT09MMTYgICAgIElzVmFsaWRNZXRhRmlsZShITUVUQUZJTEUxNik7CitWT0lEICAgICAgIExvZ0Vycm9yKFVJTlQxNiwgTFBWT0lEKTsKK1ZPSUQgICAgICAgTG9nUGFyYW1FcnJvcihVSU5UMTYsRkFSUFJPQzE2LExQVk9JRCk7CiBCT09MMTYgICAgIExvY2FsSW5pdChIQU5ETEUxNixXT1JELFdPUkQpOwogRkFSUFJPQzE2ICBMb2NhbE5vdGlmeShGQVJQUk9DMTYpOwogSFRBU0sxNiAgICBMb2NrQ3VycmVudFRhc2soQk9PTDE2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2lucG9zLmggYi9pbmNsdWRlL3dpbnBvcy5oCmluZGV4IGJlMjFlZTIuLjQ0ZjllODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2lucG9zLmgKKysrIGIvaW5jbHVkZS93aW5wb3MuaApAQCAtMjUsNyArMjUsMTEgQEAKICAgICBXSU5ET1dQT1MzMiB3aW5Qb3NbMV07CiB9IERXUDsKIAotZXh0ZXJuIHZvaWQgV0lOUE9TX0ZpbmRJY29uUG9zKCBIV05EMzIgaHduZCApOworZXh0ZXJuIEJPT0wzMiBXSU5QT1NfUmVkcmF3SWNvblRpdGxlKCBIV05EMzIgaFduZCApOworZXh0ZXJuIEJPT0wzMiBXSU5QT1NfU2hvd0ljb25UaXRsZSggV05EKiBwV25kLCBCT09MMzIgYlNob3cgKTsKK2V4dGVybiB2b2lkICAgV0lOUE9TX0dldE1pbk1heEluZm8oIFdORCogcFduZCwgUE9JTlQxNiAqbWF4U2l6ZSwgUE9JTlQxNiAqbWF4UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9JTlQxNiAqbWluVHJhY2ssIFBPSU5UMTYgKm1heFRyYWNrICk7CitleHRlcm4gVUlOVDE2IFdJTlBPU19NaW5NYXhpbWl6ZSggV05EKiBwV25kLCBVSU5UMTYgY21kLCBMUFJFQ1QxNiBscFBvcyk7CiBleHRlcm4gQk9PTDMyIFdJTlBPU19TZXRBY3RpdmVXaW5kb3coIEhXTkQzMiBoV25kLCBCT09MMzIgZk1vdXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgZkNoYW5nZUZvY3VzICk7CiBleHRlcm4gQk9PTDMyIFdJTlBPU19DaGFuZ2VBY3RpdmVXaW5kb3coIEhXTkQzMiBod25kLCBCT09MMzIgbW91c2VNc2cgKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUveDExZHJ2LmggYi9pbmNsdWRlL3gxMWRydi5oCmluZGV4IDI2MzM2YzkuLmRhMzU4OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveDExZHJ2LmgKKysrIGIvaW5jbHVkZS94MTFkcnYuaApAQCAtMzAsMTEgKzMwLDcgQEAKIH0gWF9QSFlTQlJVU0g7CiAKICAgLyogWCBwaHlzaWNhbCBmb250ICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIFhGb250U3RydWN0ICogZnN0cnVjdDsKLSAgICBURVhUTUVUUklDMTYgIG1ldHJpY3M7Ci19IFhfUEhZU0ZPTlQ7Cit0eXBlZGVmIFVJTlQzMgkgWF9QSFlTRk9OVDsKIAogICAvKiBYIHBoeXNpY2FsIGRldmljZSAqLwogdHlwZWRlZiBzdHJ1Y3QKQEAgLTQ2LDEzICs0MiwxOCBAQAogICAgIFhfUEhZU0JSVVNIICAgYnJ1c2g7CiB9IFgxMURSVl9QREVWSUNFOwogCit0eXBlZGVmIElOVDMyICgqREVWSUNFRk9OVEVOVU1QUk9DKShMUEVOVU1MT0dGT05UMTYsTFBORVdURVhUTUVUUklDMTYsVUlOVDE2LExQQVJBTSk7CisKIC8qIFdpbmUgZHJpdmVyIFgxMSBmdW5jdGlvbnMgKi8KIAogc3RydWN0IHRhZ0RDOworc3RydWN0IHRhZ0RldmljZUNhcHM7CiAKIGV4dGVybiBCT09MMzIgWDExRFJWX0JpdEJsdCggc3RydWN0IHRhZ0RDICpkY0RzdCwgSU5UMzIgeERzdCwgSU5UMzIgeURzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCwgc3RydWN0IHRhZ0RDICpkY1NyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeFNyYywgSU5UMzIgeVNyYywgRFdPUkQgcm9wICk7CitleHRlcm4gQk9PTDMyIFgxMURSVl9FbnVtRGV2aWNlRm9udHMoIHN0cnVjdCB0YWdEQyAqZGMsIExQTE9HRk9OVDE2IHBsZiwKKwkJCQkgICAgICBERVZJQ0VGT05URU5VTVBST0MgZGZlcHJvYywgTFBBUkFNIGxwICk7CiBleHRlcm4gQk9PTDMyIFgxMURSVl9HZXRDaGFyV2lkdGgoIHN0cnVjdCB0YWdEQyAqZGMsIFVJTlQzMiBmaXJzdENoYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBsYXN0Q2hhciwgTFBJTlQzMiBidWZmZXIgKTsKIGV4dGVybiBCT09MMzIgWDExRFJWX0dldFRleHRFeHRlbnRQb2ludCggc3RydWN0IHRhZ0RDICpkYywgTFBDU1RSIHN0ciwKQEAgLTYwLDcgKzYxLDcgQEAKIGV4dGVybiBCT09MMzIgWDExRFJWX0dldFRleHRNZXRyaWNzKHN0cnVjdCB0YWdEQyAqZGMsIFRFWFRNRVRSSUMzMkEgKm1ldHJpY3MpOwogZXh0ZXJuIEJPT0wzMiBYMTFEUlZfUGF0Qmx0KCBzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHdpZHRoLCBJTlQzMiBoZWlnaHQsIERXT1JEIHJvcCApOwotZXh0ZXJuIFZPSUQgWDExRFJWX1NldERldmljZUNsaXBwaW5nKHN0cnVjdCB0YWdEQyAqZGMpOworZXh0ZXJuIFZPSUQgICBYMTFEUlZfU2V0RGV2aWNlQ2xpcHBpbmcoc3RydWN0IHRhZ0RDICpkYyk7CiBleHRlcm4gQk9PTDMyIFgxMURSVl9TdHJldGNoQmx0KCBzdHJ1Y3QgdGFnREMgKmRjRHN0LCBJTlQzMiB4RHN0LCBJTlQzMiB5RHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgd2lkdGhEc3QsIElOVDMyIGhlaWdodERzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0YWdEQyAqZGNTcmMsIElOVDMyIHhTcmMsIElOVDMyIHlTcmMsCkBAIC0xMDUsNiArMTA2LDYgQEAKIAogZXh0ZXJuIEJPT0wzMiBYMTFEUlZfQklUTUFQX0luaXQodm9pZCk7CiBleHRlcm4gQk9PTDMyIFgxMURSVl9CUlVTSF9Jbml0KHZvaWQpOwotZXh0ZXJuIEJPT0wzMiBYMTFEUlZfRk9OVF9Jbml0KHZvaWQpOworZXh0ZXJuIEJPT0wzMiBYMTFEUlZfRk9OVF9Jbml0KCBzdHJ1Y3QgdGFnRGV2aWNlQ2FwcyogKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfWDExRFJWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveDExZm9udC5oIGIvaW5jbHVkZS94MTFmb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3MDY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUveDExZm9udC5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogWDExIHBoeXNpY2FsIGZvbnQgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBBbGV4IEtvcm9ia2EKKyAqLworCisjaWZuZGVmIF9fV0lORV9YMTFGT05UX0gKKyNkZWZpbmUgX19XSU5FX1gxMUZPTlRfSAorCisjaW5jbHVkZSAiZ2RpLmgiCisKKyNwcmFnbWEgcGFjaygxKQorCisvKiB0aGlzIGlzIGEgcGFydCBvZiB0aGUgZm9udCByZXNvdXJjZSBoZWFkZXIsIHNob3VsZCAKKyAqIG1ha2UgaXQgZWFzaWVyIHRvIGltcGxlbWVudCBkeW5hbWljIHNvZnRmb250IGxvYWRpbmcgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBJTlQxNglkZlR5cGU7CisgICAgSU5UMTYJZGZQb2ludHM7CisgICAgSU5UMTYJZGZWZXJ0UmVzOworICAgIElOVDE2CWRmSG9yaXpSZXM7CisgICAgSU5UMTYJZGZBc2NlbnQ7CisgICAgSU5UMTYJZGZJbnRlcm5hbExlYWRpbmc7CisgICAgSU5UMTYJZGZFeHRlcm5hbExlYWRpbmc7CisgICAgQ0hBUglkZkl0YWxpYzsKKyAgICBDSEFSCWRmVW5kZXJsaW5lOworICAgIENIQVIJZGZTdHJpa2VPdXQ7CisgICAgSU5UMTYJZGZXZWlnaHQ7CisgICAgQ0hBUglkZkNoYXJTZXQ7CisgICAgSU5UMTYJZGZQaXhXaWR0aDsKKyAgICBJTlQxNglkZlBpeEhlaWdodDsKKyAgICBDSEFSCWRmUGl0Y2hBbmRGYW1pbHk7CisgICAgSU5UMTYJZGZBdmdXaWR0aDsKKyAgICBJTlQxNglkZk1heFdpZHRoOworICAgIENIQVIJZGZGaXJzdENoYXI7CisgICAgQ0hBUglkZkxhc3RDaGFyOworICAgIENIQVIJZGZEZWZhdWx0Q2hhcjsKKyAgICBDSEFSCWRmQnJlYWtDaGFyOworICAgIElOVDE2CWRmV2lkdGhCeXRlczsKKyAgICBMUENTVFIJZGZEZXZpY2U7CisgICAgTFBDU1RSCWRmRmFjZTsKK30gSUZPTlRJTkZPMTYsICpMUElGT05USU5GTzE2OworCisjcHJhZ21hIHBhY2soNCkKKworLyogaW50ZXJuYWwgZmxhZ3MgKi8KKworI2RlZmluZSBGSV9QT0xZV0VJR0hUCSAgICAweDAwMDEKKyNkZWZpbmUgRklfUE9MWVNMQU5UIAkgICAgMHgwMDAyCisjZGVmaW5lIEZJX09CTElRVUUJICAgIDB4MDAwNAorI2RlZmluZSBGSV9TQ0FMQUJMRSAgCSAgICAweDAwMDgKKyNkZWZpbmUgRklfRldfQk9PSwkgICAgMHgwMDEwCisjZGVmaW5lIEZJX0ZXX0RFTUkJICAgIDB4MDAyMAorI2RlZmluZSBGSV9WQVJJQUJMRVBJVENIICAgIDB4MDA0MAorI2RlZmluZSBGSV9GSVhFRFBJVENIICAgICAgIDB4MDA4MAorCisjZGVmaW5lIEZJX0VOQ19JU084ODU5CSAgICAweDAxMDAKKyNkZWZpbmUgRklfRU5DX0lTTzY0NgkgICAgMHgwMjAwCisjZGVmaW5lIEZJX0VOQ19BTlNJCSAgICAweDA0MDAKKworI2RlZmluZSBGSV9GSVhFREVYCSAgICAweDEwMDAKKyNkZWZpbmUgRklfTk9STUFMCSAgICAweDIwMDAKKyNkZWZpbmUgRklfU1VCU0VUIAkgICAgMHg0MDAwCisjZGVmaW5lIEZJX1RSVUVUWVBFCSAgICAweDgwMDAKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRm9udEluZm8KK3sKKyAgICBzdHJ1Y3QgdGFnRm9udEluZm8qCQluZXh0OworICAgIFVJTlQxNgkJCWZpX2ZsYWdzOworCisgLyogTEZEIHBhcmFtZXRlcnMgY2FuIGJlIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBhY3R1YWwgbWV0cmljcyAqLworCisgICAgVUlOVDE2CQkJbGZkX2hlaWdodDsKKyAgICBVSU5UMTYJCQlsZmRfd2lkdGg7CisgICAgVUlOVDE2CQkJbGZkX2RlY2lwb2ludHM7CisgICAgVUlOVDE2CQkJbGZkX3Jlc29sdXRpb247CisKKyAgICBJRk9OVElORk8xNgkJCWRmOworfSBmb250SW5mbzsKKworLyogRm9udCByZXNvdXJjZSBsaXN0IGZvciBFbnVtRm9udCgpIHB1cnBvc2VzICovCisKKyNkZWZpbmUgRlJfU09GVEZPTlQgICAgICAgICAweDEwMDAgICAgICAgICAgICAgIC8qIC0gLkZPTiBvciAuRk9UIGZpbGUgKi8KKyNkZWZpbmUgRlJfU09GVFJFU09VUkNFICAgICAweDIwMDAgICAgICAgICAgICAgIC8qIC0gcmVzb3VyY2UgaGFuZGxlICovCisjZGVmaW5lIEZSX1JFTU9WRUQgICAgICAgICAgMHg0MDAwICAgICAgICAgICAgICAvKiBkZWxheWVkIHJlbW92ZSAqLworI2RlZmluZSBGUl9OQU1FU0VUICAgICAgICAgIDB4ODAwMAorCit0eXBlZGVmIHN0cnVjdCB0YWdGb250UmVzb3VyY2UKK3sKKyAgc3RydWN0IHRhZ0ZvbnRSZXNvdXJjZSoJbmV4dDsKKyAgVUlOVDE2CQkJZnJfZmxhZ3M7CisgIFVJTlQxNgkJCWNvdW50OworICBmb250SW5mbyoJCQlmaTsKKyAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2U7CisgIENIQVIJCQkJbGZGYWNlTmFtZVtMRl9GQUNFU0laRV07Cit9IGZvbnRSZXNvdXJjZTsKKworI2RlZmluZSBGT19SRVNPVVJDRV9NQVNLCTB4MDAwRgorI2RlZmluZSBGT19TWVNURU0JCTB4MDAwMQkJLyogcmVzaWRlbnQgaW4gY2FjaGUgKi8KKyNkZWZpbmUgRk9fU09GVEZPTlQJCTB4MDAwMgkJLyogaW5zdGFsbGVkIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgRk9fU0hBUkVECQkweDAwMDQJCS8qIE1JVFNITSAqLworI2RlZmluZSBGT19SRU1PVkVECQkweDAwMDgJCS8qIHJlbW92ZSB3aGVuIGNvdW50IGZhbGxzIHRvIDAgKi8KKworI2RlZmluZSBGT19NQVRDSF9NQVNLCQkweDAwRjAKKyNkZWZpbmUgRk9fTUFUQ0hfTk9SQVNURVIJMHgwMDEwCisjZGVmaW5lIEZPX01BVENIX1BBRgkJMHgwMDIwCisjZGVmaW5lIEZPX01BVENIX1hZSU5ERVAJMHgwMDQwCisKKyNkZWZpbmUgRk9fU1lOVEhfTUFTSwkJMHhGRjAwCisjZGVmaW5lIEZPX1NZTlRIX0hFSUdIVCAgIAkweDIwMDAKKyNkZWZpbmUgRk9fU1lOVEhfV0lEVEgJCTB4NDAwMAorI2RlZmluZSBGT19TWU5USF9ST1RBVEUgCTB4ODAwMAorI2RlZmluZSBGT19TWU5USF9CT0xECQkweDAxMDAKKyNkZWZpbmUgRk9fU1lOVEhfSVRBTElDCQkweDAyMDAKKyNkZWZpbmUgRk9fU1lOVEhfVU5ERVJMSU5FCTB4MDQwMAorI2RlZmluZSBGT19TWU5USF9TVFJJS0VPVVQJMHgwODAwCisKKy8qIFJlYWxpemVkIHNjcmVlbiBmb250ICovCisKK3R5cGVkZWYgc3RydWN0IAoreworICBYRm9udFN0cnVjdCogICAgICAgICAgZnM7CQkJLyogdGV4dCBtZXRyaWNzICovCisgIGZvbnRSZXNvdXJjZSogICAgICAgICBmcjsJCQkvKiBmb250IGZhbWlseSAqLworICBmb250SW5mbyoJCWZpOwkJCS8qIGZvbnQgaW5zdGFuY2UgaW5mbyAqLworICBMUE1BVDIqCQlscFhGb3JtOwkJLyogb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4ICovCisgIFBpeG1hcCogICAgICAgICAgICAgICBscFBpeG1hcDsJCS8qIG9wdGlvbmFsIGNoYXJhY3RlciBiaXRtYXNrcyBmb3Igc3ludGggZm9udHMgKi8KKworICBJTlQxNgkJCWZvSW50ZXJuYWxMZWFkaW5nOworICBJTlQxNgkJCWZvQXZnQ2hhcldpZHRoOworICBVSU5UMTYJCWZvX2ZsYWdzOworCisgIC8qIGZvbnQgY2FjaGUgaG91c2VrZWVwaW5nICovCisKKyAgVUlOVDE2ICAgICAgICAgICAgICAgIGNvdW50OworICBVSU5UMTYgICAgICAgICAgICAgICAgbHJ1OworICBVSU5UMTYgICAgICAgICAgICAgICAgbGZjaGVja3N1bTsKKyAgTE9HRk9OVDE2ICAgICAgICAgICAgIGxmOworfSBmb250T2JqZWN0OworCit0eXBlZGVmIHN0cnVjdAoreworICBmb250UmVzb3VyY2UqCQlwZnI7CisgIGZvbnRJbmZvKgkJcGZpOworICBVSU5UMTYJCWhlaWdodDsKKyAgVUlOVDE2CQlmbGFnczsKKyAgTFBMT0dGT05UMTYJCXBsZjsKK30gZm9udE1hdGNoOworCit0eXBlZGVmIHN0cnVjdAoreworICBMUExPR0ZPTlQxNgkJbHBMb2dGb250UGFyYW07CisgIEZPTlRFTlVNUFJPQzE2CWxwRW51bUZ1bmM7CisgIExQQVJBTQkJbHBEYXRhOworCisgIExQTkVXVEVYVE1FVFJJQ0VYMTYJbHBUZXh0TWV0cmljOworICBMUEVOVU1MT0dGT05URVgxNglscExvZ0ZvbnQ7CisgIFNFR1BUUgkJc2VnVGV4dE1ldHJpYzsKKyAgU0VHUFRSCQlzZWdMb2dGb250OworfSBmb250RW51bTE2OworCit0eXBlZGVmIHN0cnVjdAoreworICBMUExPR0ZPTlQzMlcJCWxwTG9nRm9udFBhcmFtOworICBGT05URU5VTVBST0MzMlcJbHBFbnVtRnVuYzsKKyAgTFBBUkFNCQlscERhdGE7CisKKyAgTFBORVdURVhUTUVUUklDRVgzMlcgIGxwVGV4dE1ldHJpYzsKKyAgTFBFTlVNTE9HRk9OVEVYMzJXICAgIGxwTG9nRm9udDsKKyAgRFdPUkQJCQlkd0ZsYWdzOworfSBmb250RW51bTMyOworCitleHRlcm4gZm9udE9iamVjdCogWEZPTlRfR2V0Rm9udE9iamVjdCggWF9QSFlTRk9OVCBwRm9udCApOworZXh0ZXJuIFhGb250U3RydWN0KiBYRk9OVF9HZXRGb250U3RydWN0KCBYX1BIWVNGT05UIHBGb250ICk7CitleHRlcm4gTFBJRk9OVElORk8xNiBYRk9OVF9HZXRGb250SW5mbyggWF9QSFlTRk9OVCBwRm9udCApOworCisjZW5kaWYgX19XSU5FX1gxMUZPTlRfSCAKKwpkaWZmIC0tZ2l0IGEvbGlicmFyeS9zdXAuYyBiL2xpYnJhcnkvc3VwLmMKaW5kZXggOTM0YWMyYi4uNTI0NTYxOCAxMDA2NDQKLS0tIGEvbGlicmFyeS9zdXAuYworKysgYi9saWJyYXJ5L3N1cC5jCkBAIC0xNCwxNSArMTQsMzEgQEAKICNkZWZpbmUgTE9BRFNIT1JUKHgpIExPQUQoeCk7IFRBQi0+eCA9IENPTlZfU0hPUlQgKFRBQi0+eCk7CiAjZGVmaW5lIExPQURMT05HKHgpIExPQUQoeCk7ICBUQUItPnggPSBDT05WX0xPTkcgKFRBQi0+eCk7CiAKLXZvaWQgbG9hZF9tel9oZWFkZXIgKGludCBmZCwgc3RydWN0IG16X2hlYWRlcl9zICptel9oZWFkZXIpCit2b2lkIGxvYWRfbXpfaGVhZGVyIChpbnQgZmQsIExQSU1BR0VfRE9TX0hFQURFUiBtel9oZWFkZXIpCiB7CiAjZGVmaW5lIFRBQiBtel9oZWFkZXIKLQlMT0FEIChtel9tYWdpYyk7Ci0gICAgTE9BRCAoZG9udF9jYXJlKTsKLSAgICBMT0FEU0hPUlQgKG5lX29mZnNldCk7CisJTE9BRChlX21hZ2ljKTsKKwlMT0FEU0hPUlQoZV9jYmxwKTsKKwlMT0FEU0hPUlQoZV9jcCk7CisJTE9BRFNIT1JUKGVfY3JsYyk7CisJTE9BRFNIT1JUKGVfY3Bhcmhkcik7CisJTE9BRFNIT1JUKGVfbWluYWxsb2MpOworCUxPQURTSE9SVChlX21heGFsbG9jKTsKKwlMT0FEU0hPUlQoZV9zcyk7CisJTE9BRFNIT1JUKGVfc3ApOworCUxPQURTSE9SVChlX2NzdW0pOworCUxPQURTSE9SVChlX2lwKTsKKwlMT0FEU0hPUlQoZV9jcyk7CisJTE9BRFNIT1JUKGVfbGZhcmxjKTsKKwlMT0FEU0hPUlQoZV9vdm5vKTsKKwlMT0FEKGVfcmVzKTsKKwlMT0FEU0hPUlQoZV9vZW1pZCk7CisJTE9BRFNIT1JUKGVfb2VtaW5mbyk7CisJTE9BRChlX3JlczIpOworCUxPQURMT05HKGVfbGZhbmV3KTsKIH0KIAotdm9pZCBsb2FkX25lX2hlYWRlciAoaW50IGZkLCBzdHJ1Y3QgbmVfaGVhZGVyX3MgKm5lX2hlYWRlcikKK3ZvaWQgbG9hZF9uZV9oZWFkZXIgKGludCBmZCwgTFBJTUFHRV9PUzJfSEVBREVSIG5lX2hlYWRlcikKIHsKICN1bmRlZiBUQUIKICNkZWZpbmUgVEFCIG5lX2hlYWRlcgpkaWZmIC0tZ2l0IGEvbG9hZGVyL21haW4uYyBiL2xvYWRlci9tYWluLmMKaW5kZXggOGZkOGI1ZC4uMjRiOThhMyAxMDA2NDQKLS0tIGEvbG9hZGVyL21haW4uYworKysgYi9sb2FkZXIvbWFpbi5jCkBAIC0xMTAsNiArMTEwLDkgQEAKICAgICAgIC8qIEluaXRpYWxpemUgY29tbXVuaWNhdGlvbnMgKi8KICAgICBDT01NX0luaXQoKTsKIAorICAgICAgLyogSW5pdGlhbGl6ZSBJTy1wb3J0IHBlcm1pc3Npb25zICovCisgICAgSU9fcG9ydF9pbml0KCk7CisKICAgICAgIC8qIHJlZ2lzdHJ5IGluaXRpYWxpc2F0aW9uICovCiAgICAgU0hFTExfTG9hZFJlZ2lzdHJ5KCk7CiAgICAgCmRpZmYgLS1naXQgYS9sb2FkZXIvbW9kdWxlLmMgYi9sb2FkZXIvbW9kdWxlLmMKaW5kZXggMTliYjZkMC4uOGE1NGFhMiAxMDA2NDQKLS0tIGEvbG9hZGVyL21vZHVsZS5jCisrKyBiL2xvYWRlci9tb2R1bGUuYwpAQCAtMzgsNyArMzgsNyBAQAogTkVfTU9EVUxFICpNT0RVTEVfR2V0UHRyKCBITU9EVUxFMTYgaE1vZHVsZSApCiB7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2sxNiggaE1vZHVsZSApOwotICAgIGlmICghcE1vZHVsZSB8fCAocE1vZHVsZS0+bWFnaWMgIT0gTkVfU0lHTkFUVVJFKSB8fAorICAgIGlmICghcE1vZHVsZSB8fCAocE1vZHVsZS0+bWFnaWMgIT0gSU1BR0VfT1MyX1NJR05BVFVSRSkgfHwKICAgICAgICAgKHBNb2R1bGUtPnNlbGYgIT0gaE1vZHVsZSkpIHJldHVybiBOVUxMOwogICAgIHJldHVybiBwTW9kdWxlOwogfQpAQCAtNDcsNyArNDcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0R1bXBNb2R1bGUKICAqLwotdm9pZCBNT0RVTEVfRHVtcE1vZHVsZSggSE1PRFVMRTE2IGhtb2R1bGUgKQordm9pZCBNT0RVTEVfRHVtcE1vZHVsZSggSE1PRFVMRTE2IGhNb2R1bGUgKQogewogICAgIGludCBpLCBvcmRpbmFsOwogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWc7CkBAIC01NSwxNSArNTUsMTUgQEAKICAgICBXT1JEICpwd29yZDsKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKLSAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaG1vZHVsZSApKSkKKyAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkKICAgICB7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIioqKiogJTA0eCBpcyBub3QgYSBtb2R1bGUgaGFuZGxlXG4iLCBobW9kdWxlICk7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIioqKiogJTA0eCBpcyBub3QgYSBtb2R1bGUgaGFuZGxlXG4iLCBoTW9kdWxlICk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICAgIC8qIER1bXAgdGhlIG1vZHVsZSBpbmZvICovCiAKLSAgICBwcmludGYoICJNb2R1bGUgJTA0eDpcbiIsIGhtb2R1bGUgKTsKKyAgICBwcmludGYoICJNb2R1bGUgJTA0eDpcbiIsIGhNb2R1bGUgKTsKICAgICBwcmludGYoICJjb3VudD0lZCBmbGFncz0lMDR4IGhlYXA9JWQgc3RhY2s9JWRcbiIsCiAgICAgICAgICAgICBwTW9kdWxlLT5jb3VudCwgcE1vZHVsZS0+ZmxhZ3MsCiAgICAgICAgICAgICBwTW9kdWxlLT5oZWFwX3NpemUsIHBNb2R1bGUtPnN0YWNrX3NpemUgKTsKQEAgLTM2NCw3ICszNjQsNyBAQAogICAgIEhNT0RVTEUxNiBoTW9kdWxlOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKICAgICBTRUdUQUJMRUVOVFJZICpwU2VnbWVudDsKLSAgICBjaGFyICpwU3RyOworICAgIGNoYXIgKnBTdHIsKmJhc2VuYW1lLCpzOwogCiAgICAgSU5UMzIgb2Zfc2l6ZSA9IHNpemVvZihPRlNUUlVDVCkgLSBzaXplb2Yob2ZzLT5zelBhdGhOYW1lKQogICAgICAgICAgICAgICAgICAgICArIHN0cmxlbihvZnMtPnN6UGF0aE5hbWUpICsgMTsKQEAgLTM4NSw3ICszODUsNyBAQAogICAgIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jazE2KCBoTW9kdWxlICk7CiAKICAgICAvKiBTZXQgYWxsIHVzZWQgZW50cmllcyAqLwotICAgIHBNb2R1bGUtPm1hZ2ljICAgICAgICAgICAgPSBORV9TSUdOQVRVUkU7CisgICAgcE1vZHVsZS0+bWFnaWMgICAgICAgICAgICA9IElNQUdFX09TMl9TSUdOQVRVUkU7CiAgICAgcE1vZHVsZS0+Y291bnQgICAgICAgICAgICA9IDE7CiAgICAgcE1vZHVsZS0+bmV4dCAgICAgICAgICAgICA9IDA7CiAgICAgcE1vZHVsZS0+ZmxhZ3MgICAgICAgICAgICA9IDA7CkBAIC00MjAsNyArNDIwLDE5IEBACiAgICAgLyogTW9kdWxlIG5hbWUgKi8KICAgICBwU3RyID0gKGNoYXIgKilwU2VnbWVudDsKICAgICBwTW9kdWxlLT5uYW1lX3RhYmxlID0gKGludClwU3RyIC0gKGludClwTW9kdWxlOwotICAgIHN0cmNweSggcFN0ciwgIlx4MDhXMzJTWFhYWCIgKTsKKyAgICAvKiBzdHJjcHkoIHBTdHIsICJceDA4VzMyU1hYWFgiICk7ICovCisgICAgYmFzZW5hbWUgPSBzdHJyY2hyKG9mcy0+c3pQYXRoTmFtZSwnXFwnKTsKKyAgICBpZiAoIWJhc2VuYW1lKSAKKwkgICAgCWJhc2VuYW1lPW9mcy0+c3pQYXRoTmFtZTsKKyAgICBlbHNlCisJICAgIAliYXNlbmFtZSsrOworICAgIGJhc2VuYW1lPXN0cmR1cChiYXNlbmFtZSk7CisgICAgaWYgKChzPXN0cmNocihiYXNlbmFtZSwnLicpKSkKKwkgICAgCSpzPSdcMCc7CisgICAgKnBTdHIgPSBzdHJsZW4oYmFzZW5hbWUpOworICAgIGlmICgqcFN0cj44KSAqcFN0cj04OworICAgIHN0cm5jcHkoIHBTdHIrMSwgYmFzZW5hbWUsIDggKTsKKyAgICBmcmVlKGJhc2VuYW1lKTsKICAgICBwU3RyICs9IDk7CiAKICAgICAvKiBBbGwgdGFibGVzIHplcm8gdGVybWluYXRlZCAqLwpAQCAtNDM3LDggKzQ0OSw4IEBACiAgKi8KIHN0YXRpYyBITU9EVUxFMTYgTU9EVUxFX0xvYWRFeGVIZWFkZXIoIEhGSUxFMzIgaEZpbGUsIE9GU1RSVUNUICpvZnMgKQogewotICAgIHN0cnVjdCBtel9oZWFkZXJfcyBtel9oZWFkZXI7Ci0gICAgc3RydWN0IG5lX2hlYWRlcl9zIG5lX2hlYWRlcjsKKyAgICBJTUFHRV9ET1NfSEVBREVSIG16X2hlYWRlcjsKKyAgICBJTUFHRV9PUzJfSEVBREVSIG5lX2hlYWRlcjsKICAgICBpbnQgc2l6ZTsKICAgICBITU9EVUxFMTYgaE1vZHVsZTsKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CkBAIC00NTYsMTUgKzQ2OCwxNSBAQAogCiAgICAgX2xsc2VlazMyKCBoRmlsZSwgMCwgU0VFS19TRVQgKTsKICAgICBpZiAoKF9scmVhZDMyKGhGaWxlLCZtel9oZWFkZXIsc2l6ZW9mKG16X2hlYWRlcikpICE9IHNpemVvZihtel9oZWFkZXIpKSB8fAotICAgICAgICAobXpfaGVhZGVyLm16X21hZ2ljICE9IE1aX1NJR05BVFVSRSkpCisgICAgICAgIChtel9oZWFkZXIuZV9tYWdpYyAhPSBJTUFHRV9ET1NfU0lHTkFUVVJFKSkKICAgICAgICAgcmV0dXJuIChITU9EVUxFMTYpMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLwogCi0gICAgX2xsc2VlazMyKCBoRmlsZSwgbXpfaGVhZGVyLm5lX29mZnNldCwgU0VFS19TRVQgKTsKKyAgICBfbGxzZWVrMzIoIGhGaWxlLCBtel9oZWFkZXIuZV9sZmFuZXcsIFNFRUtfU0VUICk7CiAgICAgaWYgKF9scmVhZDMyKCBoRmlsZSwgJm5lX2hlYWRlciwgc2l6ZW9mKG5lX2hlYWRlcikgKSAhPSBzaXplb2YobmVfaGVhZGVyKSkKICAgICAgICAgcmV0dXJuIChITU9EVUxFMTYpMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLwogCi0gICAgaWYgKG5lX2hlYWRlci5uZV9tYWdpYyA9PSBQRV9TSUdOQVRVUkUpIHJldHVybiAoSE1PRFVMRTE2KTIxOyAgLyogd2luMzIgZXhlICovCi0gICAgaWYgKG5lX2hlYWRlci5uZV9tYWdpYyAhPSBORV9TSUdOQVRVUkUpIHJldHVybiAoSE1PRFVMRTE2KTExOyAgLyogaW52YWxpZCBleGUgKi8KKyAgICBpZiAobmVfaGVhZGVyLm5lX21hZ2ljID09IElNQUdFX05UX1NJR05BVFVSRSkgcmV0dXJuIChITU9EVUxFMTYpMjE7ICAvKiB3aW4zMiBleGUgKi8KKyAgICBpZiAobmVfaGVhZGVyLm5lX21hZ2ljICE9IElNQUdFX09TMl9TSUdOQVRVUkUpIHJldHVybiAoSE1PRFVMRTE2KTExOyAgLyogaW52YWxpZCBleGUgKi8KIAogICAgIC8qIFdlIG5vdyBoYXZlIGEgdmFsaWQgTkUgaGVhZGVyICovCiAKQEAgLTUzNyw3ICs1NDksNyBAQAogICAgICAgICBpbnQgaTsKICAgICAgICAgc3RydWN0IG5lX3NlZ21lbnRfdGFibGVfZW50cnlfcyAqcFNlZzsKIAotICAgICAgICBpZiAoIVJFQUQoIG16X2hlYWRlci5uZV9vZmZzZXQgKyBuZV9oZWFkZXIuc2VnbWVudF90YWJfb2Zmc2V0LAorICAgICAgICBpZiAoIVJFQUQoIG16X2hlYWRlci5lX2xmYW5ldyArIG5lX2hlYWRlci5zZWdtZW50X3RhYl9vZmZzZXQsCiAgICAgICAgICAgICAgbmVfaGVhZGVyLm5fc2VnbWVudF90YWIgKiBzaXplb2Yoc3RydWN0IG5lX3NlZ21lbnRfdGFibGVfZW50cnlfcyksCiAgICAgICAgICAgICAgYnVmZmVyICkpCiAgICAgICAgIHsKQEAgLTU2Niw3ICs1NzgsNyBAQAogICAgIGlmIChuZV9oZWFkZXIucmVzb3VyY2VfdGFiX29mZnNldCA8IG5lX2hlYWRlci5ybmFtZV90YWJfb2Zmc2V0KQogICAgIHsKICAgICAgICAgcE1vZHVsZS0+cmVzX3RhYmxlID0gKGludClwRGF0YSAtIChpbnQpcE1vZHVsZTsKLSAgICAgICAgaWYgKCFSRUFEKG16X2hlYWRlci5uZV9vZmZzZXQgKyBuZV9oZWFkZXIucmVzb3VyY2VfdGFiX29mZnNldCwKKyAgICAgICAgaWYgKCFSRUFEKG16X2hlYWRlci5lX2xmYW5ldyArIG5lX2hlYWRlci5yZXNvdXJjZV90YWJfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgbmVfaGVhZGVyLnJuYW1lX3RhYl9vZmZzZXQgLSBuZV9oZWFkZXIucmVzb3VyY2VfdGFiX29mZnNldCwKICAgICAgICAgICAgICAgICAgIHBEYXRhICkpIHJldHVybiAoSE1PRFVMRTE2KTExOyAgLyogaW52YWxpZCBleGUgKi8KICAgICAgICAgcERhdGEgKz0gbmVfaGVhZGVyLnJuYW1lX3RhYl9vZmZzZXQgLSBuZV9oZWFkZXIucmVzb3VyY2VfdGFiX29mZnNldDsKQEAgLTU3Niw3ICs1ODgsNyBAQAogICAgIC8qIEdldCB0aGUgcmVzaWRlbnQgbmFtZXMgdGFibGUgKi8KIAogICAgIHBNb2R1bGUtPm5hbWVfdGFibGUgPSAoaW50KXBEYXRhIC0gKGludClwTW9kdWxlOwotICAgIGlmICghUkVBRCggbXpfaGVhZGVyLm5lX29mZnNldCArIG5lX2hlYWRlci5ybmFtZV90YWJfb2Zmc2V0LAorICAgIGlmICghUkVBRCggbXpfaGVhZGVyLmVfbGZhbmV3ICsgbmVfaGVhZGVyLnJuYW1lX3RhYl9vZmZzZXQsCiAgICAgICAgICAgICAgICBuZV9oZWFkZXIubW9kdWxlcmVmX3RhYl9vZmZzZXQgLSBuZV9oZWFkZXIucm5hbWVfdGFiX29mZnNldCwKICAgICAgICAgICAgICAgIHBEYXRhICkpCiAgICAgewpAQCAtNTkxLDcgKzYwMyw3IEBACiAgICAgaWYgKG5lX2hlYWRlci5uX21vZF9yZWZfdGFiID4gMCkKICAgICB7CiAgICAgICAgIHBNb2R1bGUtPm1vZHJlZl90YWJsZSA9IChpbnQpcERhdGEgLSAoaW50KXBNb2R1bGU7Ci0gICAgICAgIGlmICghUkVBRCggbXpfaGVhZGVyLm5lX29mZnNldCArIG5lX2hlYWRlci5tb2R1bGVyZWZfdGFiX29mZnNldCwKKyAgICAgICAgaWYgKCFSRUFEKCBtel9oZWFkZXIuZV9sZmFuZXcgKyBuZV9oZWFkZXIubW9kdWxlcmVmX3RhYl9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICBuZV9oZWFkZXIubl9tb2RfcmVmX3RhYiAqIHNpemVvZihXT1JEKSwKICAgICAgICAgICAgICAgICAgIHBEYXRhICkpCiAgICAgICAgIHsKQEAgLTYwNiw3ICs2MTgsNyBAQAogICAgIC8qIEdldCB0aGUgaW1wb3J0ZWQgbmFtZXMgdGFibGUgKi8KIAogICAgIHBNb2R1bGUtPmltcG9ydF90YWJsZSA9IChpbnQpcERhdGEgLSAoaW50KXBNb2R1bGU7Ci0gICAgaWYgKCFSRUFEKCBtel9oZWFkZXIubmVfb2Zmc2V0ICsgbmVfaGVhZGVyLmluYW1lX3RhYl9vZmZzZXQsIAorICAgIGlmICghUkVBRCggbXpfaGVhZGVyLmVfbGZhbmV3ICsgbmVfaGVhZGVyLmluYW1lX3RhYl9vZmZzZXQsIAogICAgICAgICAgICAgICAgbmVfaGVhZGVyLmVudHJ5X3RhYl9vZmZzZXQgLSBuZV9oZWFkZXIuaW5hbWVfdGFiX29mZnNldCwKICAgICAgICAgICAgICAgIHBEYXRhICkpCiAgICAgewpAQCAtNjE5LDcgKzYzMSw3IEBACiAgICAgLyogR2V0IHRoZSBlbnRyeSB0YWJsZSAqLwogCiAgICAgcE1vZHVsZS0+ZW50cnlfdGFibGUgPSAoaW50KXBEYXRhIC0gKGludClwTW9kdWxlOwotICAgIGlmICghUkVBRCggbXpfaGVhZGVyLm5lX29mZnNldCArIG5lX2hlYWRlci5lbnRyeV90YWJfb2Zmc2V0LAorICAgIGlmICghUkVBRCggbXpfaGVhZGVyLmVfbGZhbmV3ICsgbmVfaGVhZGVyLmVudHJ5X3RhYl9vZmZzZXQsCiAgICAgICAgICAgICAgICBuZV9oZWFkZXIuZW50cnlfdGFiX2xlbmd0aCwKICAgICAgICAgICAgICAgIHBEYXRhICkpCiAgICAgewpAQCAtNjg1LDcgKzY5Nyw3IEBACiAgKi8KIFdPUkQgTU9EVUxFX0dldE9yZGluYWwoIEhNT0RVTEUxNiBoTW9kdWxlLCBjb25zdCBjaGFyICpuYW1lICkKIHsKLSAgICBjaGFyIGJ1ZmZlclsyNTZdLCAqY3BudDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyNTZdLCAqY3BudDsKICAgICBCWVRFIGxlbjsKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKQEAgLTE0NTIsNiArMTQ2NCw4IEBACiAgICAgY2hhciAqcCwgKmNtZGxpbmUsIGZpbGVuYW1lWzI1Nl07CiAgICAgc3RhdGljIGludCB1c2VfbG9hZF9tb2R1bGUgPSAxOwogCisgICAgaWYgKCFscENtZExpbmUpCisgICAgICAgIHJldHVybiAyOyAgLyogRmlsZSBub3QgZm91bmQgKi8KICAgICBpZiAoIShjbWRTaG93SGFuZGxlID0gR2xvYmFsQWxsb2MxNiggMCwgMiAqIHNpemVvZihXT1JEKSApKSkKICAgICAgICAgcmV0dXJuIDg7ICAvKiBPdXQgb2YgbWVtb3J5ICovCiAgICAgaWYgKCEoY21kTGluZUhhbmRsZSA9IEdsb2JhbEFsbG9jMTYoIDAsIDI1NiApKSkKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9pbWFnZS5jIGIvbG9hZGVyL25lX2ltYWdlLmMKaW5kZXggZDVmMWU4MC4uMTkzN2ZkZCAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX2ltYWdlLmMKKysrIGIvbG9hZGVyL25lX2ltYWdlLmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogCSAgICAKIAkgIGRlZmF1bHQ6CiAJICAgIGRwcmludGZfZml4dXAoc3RkZGViLAotCQkgICAiJWQ6IEFERFIgVFlQRSAlZCwgIFRZUEUgJWQsICBPRkZTRVQgJTA0eCwgICIsCisJCSAgICJXQVJOSU5HOiAlZDogQUREUiBUWVBFICVkLCAgdW5rbm93biBUWVBFICVkLCAgT0ZGU0VUICUwNHgsICAiLAogCQkgICBpICsgMSwgcmVwLT5hZGRyZXNzX3R5cGUsIHJlcC0+cmVsb2NhdGlvbl90eXBlLCAKIAkJICAgcmVwLT5vZmZzZXQpOwogCSAgICBkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwiVEFSR0VUICUwNHggJTA0eFxuIiwgCkBAIC0yODMsOSArMjgzLDkgQEAKIAogICAgICAgICAvKiBBcHBhcmVudGx5LCBoaWdoIGJpdCBvZiBhZGRyZXNzX3R5cGUgaXMgc29tZXRpbWVzIHNldDsgKi8KICAgICAgICAgLyogd2UgaWdub3JlIGl0IGZvciBub3cgKi8KLQlpZiAocmVwLT5hZGRyZXNzX3R5cGUgJiAweDgwKQotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogcmVsb2MgYWRkciB0eXBlID0gMHglMDJ4XG4iLAotICAgICAgICAgICAgICAgICAgICAgcmVwLT5hZGRyZXNzX3R5cGUgKTsKKwlpZiAocmVwLT5hZGRyZXNzX3R5cGUgPiBORV9SQUREUl9PRkZTRVQzMikKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldBUk5JTkc6IG1vZHVsZSAlczogdW5rbm93biByZWxvYyBhZGRyIHR5cGUgPSAweCUwMnguIFBsZWFzZSByZXBvcnQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX0dldE1vZHVsZU5hbWUoaE1vZHVsZSksIHJlcC0+YWRkcmVzc190eXBlICk7CiAKIAlzd2l0Y2ggKHJlcC0+YWRkcmVzc190eXBlICYgMHg3ZikKIAl7CkBAIC0zNDUsNyArMzQ1LDcgQEAKIAkgICAgCiAJICBkZWZhdWx0OgogCSAgICBkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwKLQkJICAgIiVkOiBBRERSIFRZUEUgJWQsICBUWVBFICVkLCAgT0ZGU0VUICUwNHgsICAiLAorCQkgICAiV0FSTklORzogJWQ6IHVua25vd24gQUREUiBUWVBFICVkLCAgVFlQRSAlZCwgIE9GRlNFVCAlMDR4LCAgIiwKIAkJICAgaSArIDEsIHJlcC0+YWRkcmVzc190eXBlLCByZXAtPnJlbG9jYXRpb25fdHlwZSwgCiAJCSAgIHJlcC0+b2Zmc2V0KTsKIAkgICAgZHByaW50Zl9maXh1cChzdGRkZWIsCmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfaW1hZ2UuYyBiL2xvYWRlci9wZV9pbWFnZS5jCmluZGV4IDFlNzRmNDguLjA2MTZlNmYgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9pbWFnZS5jCisrKyBiL2xvYWRlci9wZV9pbWFnZS5jCkBAIC00MCw3ICs0MCw3IEBACiAKIHZvaWQgZHVtcF9leHBvcnRzKElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkgKiBwZV9leHBvcnRzLCB1bnNpZ25lZCBpbnQgbG9hZF9hZGRyKQogeyAKLSAgY2hhcgkJKk1vZHVsZSwqczsKKyAgY2hhcgkJKk1vZHVsZTsKICAgaW50CQlpOwogICB1X3Nob3J0CSpvcmRpbmFsOwogICB1X2xvbmcJKmZ1bmN0aW9uLCpmdW5jdGlvbnM7CkBAIC03Niw3ICs3Niw2IEBACiAJICBkYWRkci5vZmY9UlZBKCpmdW5jdGlvbnMpOwogCSAgZnVuY3Rpb24rKzsKICAgICAgIH0KLSAgICAgIHdoaWxlICgocz1zdHJjaHIoYnVmZmVyLCcuJykpKSAqcz0nXyc7CiAgICAgICBERUJVR19BZGRTeW1ib2woYnVmZmVyLCZkYWRkciwgTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMpOwogICB9CiB9CkBAIC0zNjAsNyArMzU5LDcgQEAKICAqCQkJUEVfTG9hZEltYWdlCiAgKiBMb2FkIG9uZSBQRSBmb3JtYXQgZXhlY3V0YWJsZSBpbnRvIG1lbW9yeQogICovCi1zdGF0aWMgc3RydWN0IHBlX2RhdGEgKlBFX0xvYWRJbWFnZSggaW50IGZkLCBITU9EVUxFMTYgaE1vZHVsZSwgV09SRCBvZmZzZXQgKQorc3RhdGljIHZvaWQgUEVfTG9hZEltYWdlKCBzdHJ1Y3QgcHJfZGF0YSAqKnJldF9wZSwgaW50IGZkLCBITU9EVUxFMTYgaE1vZHVsZSwgV09SRCBvZmZzZXQsIE9GU1RSVUNUICpvZnMgKQogewogCXN0cnVjdCBwZV9kYXRhCQkqcGU7CiAJaW50CQkJaSwgcmVzdWx0OwpAQCAtMzY4LDYgKzM2Nyw3IEBACiAJSU1BR0VfREFUQV9ESVJFQ1RPUlkJZGlyOwogCWNoYXIJCQlidWZmZXJbMjAwXTsKIAlEQkdfQUREUgkJZGFkZHI7CisJY2hhcgkJCSptb2RuYW1lOwogCiAJZGFkZHIuc2VnPTA7CiAJZGFkZHIudHlwZSA9IE5VTEw7CkBAIC0zNzksNiArMzc5LDMwIEBACiAJbHNlZWsoIGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKIAlyZWFkKCBmZCwgcGUtPnBlX2hlYWRlciwgc2l6ZW9mKElNQUdFX05UX0hFQURFUlMpKTsKIAorCWlmIChwZS0+cGVfaGVhZGVyLT5GaWxlSGVhZGVyLk1hY2hpbmUgIT0gSU1BR0VfRklMRV9NQUNISU5FX0kzODYpIHsKKwkJZnByaW50ZihzdGRlcnIsInRyeWluZyB0byBsb2FkIFBFIGltYWdlIGZvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgKCIpOworCQlzd2l0Y2ggKHBlLT5wZV9oZWFkZXItPkZpbGVIZWFkZXIuTWFjaGluZSkgeworCQljYXNlIElNQUdFX0ZJTEVfTUFDSElORV9VTktOT1dOOgorCQkJZnByaW50ZihzdGRlcnIsIlVua25vd24iKTticmVhazsKKwkJY2FzZSBJTUFHRV9GSUxFX01BQ0hJTkVfSTg2MDoKKwkJCWZwcmludGYoc3RkZXJyLCJJODYwIik7YnJlYWs7CisJCWNhc2UgSU1BR0VfRklMRV9NQUNISU5FX1IzMDAwOgorCQkJZnByaW50ZihzdGRlcnIsIlIzMDAwIik7YnJlYWs7CisJCWNhc2UgSU1BR0VfRklMRV9NQUNISU5FX1I0MDAwOgorCQkJZnByaW50ZihzdGRlcnIsIlI0MDAwIik7YnJlYWs7CisJCWNhc2UgSU1BR0VfRklMRV9NQUNISU5FX1IxMDAwMDoKKwkJCWZwcmludGYoc3RkZXJyLCJSMTAwMDAiKTticmVhazsKKwkJY2FzZSBJTUFHRV9GSUxFX01BQ0hJTkVfQUxQSEE6CisJCQlmcHJpbnRmKHN0ZGVyciwiQWxwaGEiKTticmVhazsKKwkJY2FzZSBJTUFHRV9GSUxFX01BQ0hJTkVfUE9XRVJQQzoKKwkJCWZwcmludGYoc3RkZXJyLCJQb3dlclBDIik7YnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwiVW5rbm93bi0lMDR4IixwZS0+cGVfaGVhZGVyLT5GaWxlSGVhZGVyLk1hY2hpbmUpO2JyZWFrOworCQl9CisJCWZwcmludGYoc3RkZXJyLCIpXG4iKTsKKwkJcmV0dXJuOworCX0KKwogLyogRklYTUU6IHRoaXMgaXMgYSAqaG9ycmlibGUqIGhhY2sgdG8gbWFrZSBDT01ETEczMi5ETEwgbG9hZCBPSy4gVGhlCiBwcm9ibGVtIG5lZWRzIHRvIGJlIGZpeGVkIHByb3Blcmx5IGF0IHNvbWUgc3RhZ2UgKi8KIApAQCAtNTM5LDMzICs1NjMsMzkgQEAKIAkJZHByaW50Zl93aW4zMihzdGRuaW1wLCJVbmtub3duIGRpcmVjdG9yeSAxNSBpZ25vcmVkXG4iKTsKIAogCWlmKHBlLT5wZV9yZWxvYykgZG9fcmVsb2NhdGlvbnMocGUpOwotCWlmKHBlLT5wZV9pbXBvcnQpIGZpeHVwX2ltcG9ydHMocGUsIGhNb2R1bGUpOwotCWlmKHBlLT5wZV9leHBvcnQpIGR1bXBfZXhwb3J0cyhwZS0+cGVfZXhwb3J0LGxvYWRfYWRkcik7Ci0gIAkJCi0JaWYgKHBlLT5wZV9leHBvcnQpIHsKLQkJY2hhcgkqczsKIAotCQkvKiBhZGQgc3RhcnQgb2Ygc2VjdGlvbnMgYXMgZGVidWdzeW1ib2xzICovCi0JCWZvcihpPTA7aTxwZS0+cGVfaGVhZGVyLT5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnM7aSsrKSB7Ci0JCQlzcHJpbnRmKGJ1ZmZlciwiJXNfJXMiLAotCQkJCShjaGFyKilSVkEocGUtPnBlX2V4cG9ydC0+TmFtZSksCi0JCQkJcGUtPnBlX3NlZ1tpXS5OYW1lCi0JCQkpOwotCQkJZGFkZHIub2ZmPSBSVkEocGUtPnBlX3NlZ1tpXS5WaXJ0dWFsQWRkcmVzcyk7Ci0gICAgICAJCQl3aGlsZSAoKHM9c3RyY2hyKGJ1ZmZlciwnLicpKSkgKnM9J18nOwotCQkJREVCVUdfQWRkU3ltYm9sKGJ1ZmZlciwmZGFkZHIsIE5VTEwsIFNZTV9XSU4zMiB8IFNZTV9GVU5DKTsKLQkJfQotCQkvKiBhZGQgZW50cnkgcG9pbnQgKi8KLQkJc3ByaW50ZihidWZmZXIsIiVzX0VudHJ5UG9pbnQiLChjaGFyKilSVkEocGUtPnBlX2V4cG9ydC0+TmFtZSkpOwotCQlkYWRkci5vZmY9UlZBKHBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQpOwotICAgICAgCQl3aGlsZSAoKHM9c3RyY2hyKGJ1ZmZlciwnLicpKSkgKnM9J18nOwotCQlERUJVR19BZGRTeW1ib2woYnVmZmVyLCZkYWRkciwgTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMpOwotCQkvKiBhZGQgc3RhcnQgb2YgRExMICovCi0JCWRhZGRyLm9mZj1sb2FkX2FkZHI7Ci0JCURFQlVHX0FkZFN5bWJvbCgoY2hhciopIFJWQShwZS0+cGVfZXhwb3J0LT5OYW1lKSwmZGFkZHIsCi0JCQkJTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMpOworCS8qIERvIGV4cG9ydHMgYmVmb3JlIGltcG9ydHMgYmVjYXVzZSBmaXh1cF9pbXBvcnRzCisJICogbWF5IGxvYWQgYSBtb2R1bGUgdGhhdCByZWZlcmVuY2VzIHRoaXMgbW9kdWxlLgorCSAqLworCisJaWYocGUtPnBlX2V4cG9ydCkgZHVtcF9leHBvcnRzKHBlLT5wZV9leHBvcnQsbG9hZF9hZGRyKTsKKwkqcmV0X3BlID0gcGU7CS8qIG1ha2UgZXhwb3J0IGxpc3QgYXZhaWxhYmxlIGZvciBHZXRQcm9jQWRkcmVzcyAqLworCWlmKHBlLT5wZV9pbXBvcnQpIGZpeHVwX2ltcG9ydHMocGUsIGhNb2R1bGUpOworICAJCQorCWlmIChwZS0+cGVfZXhwb3J0KQorCQltb2RuYW1lID0gKGNoYXIqKVJWQShwZS0+cGVfZXhwb3J0LT5OYW1lKTsKKwllbHNlIHsKKwkJY2hhciAqczsKKwkJbW9kbmFtZSA9IHMgPSBvZnMtPnN6UGF0aE5hbWU7CisJCXdoaWxlIChzPXN0cmNocihtb2RuYW1lLCdcXCcpKQorCQkJbW9kbmFtZSA9IHMrMTsKKwkJaWYgKChzPXN0cmNocihtb2RuYW1lLCcuJykpKQorCQkJKnM9J1wwJzsKIAl9Ci0gICAgICAgIHJldHVybiBwZTsKKworCS8qIGFkZCBzdGFydCBvZiBzZWN0aW9ucyBhcyBkZWJ1Z3N5bWJvbHMgKi8KKwlmb3IoaT0wO2k8cGUtPnBlX2hlYWRlci0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zO2krKykgeworCQlzcHJpbnRmKGJ1ZmZlciwiJXNfJXMiLG1vZG5hbWUscGUtPnBlX3NlZ1tpXS5OYW1lKTsKKwkJZGFkZHIub2ZmPSBSVkEocGUtPnBlX3NlZ1tpXS5WaXJ0dWFsQWRkcmVzcyk7CisJCURFQlVHX0FkZFN5bWJvbChidWZmZXIsJmRhZGRyLCBOVUxMLCBTWU1fV0lOMzIgfCBTWU1fRlVOQyk7CisJfQorCS8qIGFkZCBlbnRyeSBwb2ludCAqLworCXNwcmludGYoYnVmZmVyLCIlc19FbnRyeVBvaW50Iixtb2RuYW1lKTsKKwlkYWRkci5vZmY9UlZBKHBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQpOworCURFQlVHX0FkZFN5bWJvbChidWZmZXIsJmRhZGRyLCBOVUxMLCBTWU1fV0lOMzIgfCBTWU1fRlVOQyk7CisJLyogYWRkIHN0YXJ0IG9mIERMTCAqLworCWRhZGRyLm9mZj1sb2FkX2FkZHI7CisJREVCVUdfQWRkU3ltYm9sKG1vZG5hbWUsJmRhZGRyLCBOVUxMLCBTWU1fV0lOMzIgfCBTWU1fRlVOQyk7CiB9CiAKIEhJTlNUQU5DRTE2IE1PRFVMRV9DcmVhdGVJbnN0YW5jZShITU9EVUxFMTYgaE1vZHVsZSxMT0FEUEFSQU1TICpwYXJhbXMpOwpAQCAtNTc1LDcgKzYwNSw3IEBACiAgICAgSE1PRFVMRTE2IGhNb2R1bGU7CiAgICAgSElOU1RBTkNFMTYgaEluc3RhbmNlOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLSAgICBzdHJ1Y3QgbXpfaGVhZGVyX3MgbXpfaGVhZGVyOworICAgIElNQUdFX0RPU19IRUFERVIgbXpfaGVhZGVyOwogICAgIGludCBmZDsKIAogICAgIGlmICgoaE1vZHVsZSA9IE1PRFVMRV9DcmVhdGVEdW1teU1vZHVsZSggb2ZzICkpIDwgMzIpIHJldHVybiBoTW9kdWxlOwpAQCAtNTg4LDcgKzYxOCw5IEBACiAgICAgbHNlZWsoIGZkLCAwLCBTRUVLX1NFVCApOwogICAgIHJlYWQoIGZkLCAmbXpfaGVhZGVyLCBzaXplb2YobXpfaGVhZGVyKSApOwogCi0gICAgcE1vZHVsZS0+cGVfbW9kdWxlID0gUEVfTG9hZEltYWdlKCBmZCwgaE1vZHVsZSwgbXpfaGVhZGVyLm5lX29mZnNldCApOworICAgIFBFX0xvYWRJbWFnZSggJnBNb2R1bGUtPnBlX21vZHVsZSwgZmQsIGhNb2R1bGUsIG16X2hlYWRlci5lX2xmYW5ldywgb2ZzICk7CisgICAgaWYgKCFwTW9kdWxlLT5wZV9tb2R1bGUpCisgICAgCXJldHVybiAyMTsKICAgICBjbG9zZSggZmQgKTsKIAogICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggaE1vZHVsZSwgcGFyYW1zICk7CmRpZmYgLS1naXQgYS9sb2FkZXIvdGFzay5jIGIvbG9hZGVyL3Rhc2suYwppbmRleCA4YWRhMjQwLi44OTllNTc3IDEwMDY0NAotLS0gYS9sb2FkZXIvdGFzay5jCisrKyBiL2xvYWRlci90YXNrLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgIndpbm50LmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImRkZV9wcm9jLmgiCkBAIC03MSwxNCArNzIsMjAgQEAKIHN0YXRpYyBIR0xPQkFMMTYgVEFTS19DcmVhdGVET1NFbnZpcm9ubWVudCh2b2lkKTsKIHN0YXRpYyB2b2lkCSBUQVNLX1lpZWxkVG9TeXN0ZW0oVERCKik7CiAKK3N0YXRpYyBUSERCIFRBU0tfU3lzdGVtVEhEQjsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFRBU0tfSW5pdAogICovCiBCT09MMzIgVEFTS19Jbml0KHZvaWQpCiB7CisKICAgICBUQVNLX1Jlc2NoZWR1bGVQcm9jID0gTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCAiVEFTS19SZXNjaGVkdWxlIiApOwogICAgIGlmICghKGhET1NFbnZpcm9ubWVudCA9IFRBU0tfQ3JlYXRlRE9TRW52aXJvbm1lbnQoKSkpCiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBET1MgRW52aXJvbm1lbnRcbiIgKTsKKyAgICBUQVNLX1N5c3RlbVRIREIudGViX3NlbCA9IFNFTEVDVE9SX0FsbG9jQmxvY2soICZUQVNLX1N5c3RlbVRIREIsIDB4MTAwMCwgU0VHTUVOVF9EQVRBLCBUUlVFLCBGQUxTRSApOworI2lmbmRlZiBXSU5FTElCCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdncgJXcwLCUlZnMiOjoiciIoVEFTS19TeXN0ZW1USERCLnRlYl9zZWwpKTsKKyNlbmRpZgogICAgIHJldHVybiAoaERPU0Vudmlyb25tZW50ICE9IDApOwogfQogCkBAIC0xNDI5LDEzICsxNDM2LDEzIEBACiAgICAgICAvKiBDaGVjayBmb3IgbW9kdWxlIGhhbmRsZSAqLwogCiAgICAgaWYgKCEocHRyID0gR2xvYmFsTG9jazE2KCBoYW5kbGUgKSkpIHJldHVybiAwOwotICAgIGlmICgoKE5FX01PRFVMRSAqKXB0ciktPm1hZ2ljID09IE5FX1NJR05BVFVSRSkgcmV0dXJuIGhhbmRsZTsKKyAgICBpZiAoKChORV9NT0RVTEUgKilwdHIpLT5tYWdpYyA9PSBJTUFHRV9PUzJfU0lHTkFUVVJFKSByZXR1cm4gaGFuZGxlOwogCiAgICAgICAvKiBDaGVjayB0aGUgb3duZXIgZm9yIG1vZHVsZSBoYW5kbGUgKi8KIAogICAgIG93bmVyID0gRmFyR2V0T3duZXIoIGhhbmRsZSApOwogICAgIGlmICghKHB0ciA9IEdsb2JhbExvY2sxNiggb3duZXIgKSkpIHJldHVybiAwOwotICAgIGlmICgoKE5FX01PRFVMRSAqKXB0ciktPm1hZ2ljID09IE5FX1NJR05BVFVSRSkgcmV0dXJuIG93bmVyOworICAgIGlmICgoKE5FX01PRFVMRSAqKXB0ciktPm1hZ2ljID09IElNQUdFX09TMl9TSUdOQVRVUkUpIHJldHVybiBvd25lcjsKIAogICAgICAgLyogU2VhcmNoIGZvciB0aGlzIGhhbmRsZSBhbmQgaXRzIG93bmVyIGluc2lkZSBhbGwgdGFza3MgKi8KIApkaWZmIC0tZ2l0IGEvbWVtb3J5L3ZpcnR1YWwuYyBiL21lbW9yeS92aXJ0dWFsLmMKaW5kZXggMmUzYTZjMC4uMmFhNDJiYSAxMDA2NDQKLS0tIGEvbWVtb3J5L3ZpcnR1YWwuYworKysgYi9tZW1vcnkvdmlydHVhbC5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTM3MywxNiArMzc0LDI4IEBACiAKICNpZmRlZiBsaW51eAogICAgIHsKLQlGSUxFICpmID0gZm9wZW4oICIvcHJvYy9zZWxmL21hcHMiLCAiciIgKTsKLSAgICAgICAgaWYgKGYpCisgICAgICAgIC8qIERvIG5vdCB1c2Ugc3RkaW8gaGVyZSBzaW5jZSBpdCBtYXkgdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSBzaXplCisgICAgICAgICAqIG9mIHNvbWUgc2VnbWVudHMgKGllIGxpYmM2IGFkZHMgMHgxMDAwIHBlciBvcGVuIEZJTEUpCisgICAgICAgICAqLworICAgICAgICBpbnQgZmQgPSBvcGVuICgiL3Byb2Mvc2VsZi9tYXBzIiwgT19SRE9OTFkpOworICAgICAgICBpZiAoZmQgPj0gMCkKICAgICAgICAgewogICAgICAgICAgICAgY2hhciBidWZmZXJbODBdOwotICAgICAgICAgICAgd2hpbGUgKGZnZXRzKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCBmICkpCisKKyAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBlbmQsIG9mZnNldDsKICAgICAgICAgICAgICAgICBjaGFyIHIsIHcsIHgsIHA7CiAgICAgICAgICAgICAgICAgQllURSB2cHJvdCA9IFZQUk9UX0NPTU1JVFRFRDsKIAorICAgICAgICAgICAgICAgIGNoYXIgKiBwdHIgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gc2l6ZW9mKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgd2hpbGUgKDEgPT0gcmVhZChmZCwgcHRyLCAxKSAmJiAqcHRyICE9ICdcbicgJiYgLS1jb3VudCA+IDApCisgICAgICAgICAgICAgICAgICAgIHB0cisrOworCisgICAgICAgICAgICAgICAgaWYgKCpwdHIgIT0gJ1xuJykgYnJlYWs7CisgICAgICAgICAgICAgICAgKnB0ciA9ICdcMCc7CisKICAgICAgICAgICAgICAgICBzc2NhbmYoIGJ1ZmZlciwgIiV4LSV4ICVjJWMlYyVjICV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCwgJnIsICZ3LCAmeCwgJnAsICZvZmZzZXQgKTsKICAgICAgICAgICAgICAgICBpZiAociA9PSAncicpIHZwcm90IHw9IFZQUk9UX1JFQUQ7CkBAIC0zOTIsNyArNDA1LDcgQEAKICAgICAgICAgICAgICAgICBWSVJUVUFMX0NyZWF0ZVZpZXcoIHN0YXJ0LCBlbmQgLSBzdGFydCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZGTEFHX1NZU1RFTSwgdnByb3QsIE5VTEwgKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZjbG9zZSggZiApOworICAgICAgICAgICAgY2xvc2UgKGZkKTsKICAgICAgICAgfQogICAgIH0KICNlbmRpZiAgLyogbGludXggKi8KZGlmZiAtLWdpdCBhL21pc2MvTWFrZWZpbGUuaW4gYi9taXNjL01ha2VmaWxlLmluCmluZGV4IDFkMTZlZGIuLjA4Yjg3ZTEgMTAwNjQ0Ci0tLSBhL21pc2MvTWFrZWZpbGUuaW4KKysrIGIvbWlzYy9NYWtlZmlsZS5pbgpAQCAtMTEsNiArMTEsNyBAQAogCWNvbXBvYmouYyBcCiAJY3J0ZGxsLmMgXAogCWNwdS5jIFwKKwllcnJvci5jIFwKIAlsc3RyLmMgXAogCWx6ZXhwYW5kLmMgXAogCW1haW4uYyBcCmRpZmYgLS1naXQgYS9taXNjL2NvbW0uYyBiL21pc2MvY29tbS5jCmluZGV4IGFkZjIxOTcuLjk1NzIwNzAgMTAwNjQ0Ci0tLSBhL21pc2MvY29tbS5jCisrKyBiL21pc2MvY29tbS5jCkBAIC00LDYgKzQsMTMgQEAKICAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogICogRklYTUU6IHVzZSBIRklMRXMgaW5zdGVhZCBvZiB1bml4ZmRzCiAgKgkgIHRoZSB3aW4zMiBmdW5jdGlvbnMgaGVyZSBnZXQgSEZJTEVzIGFscmVhZHkuCisgKgorICogTWF5IDI2LCAxOTk3LiAgRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4gW1JFUl0KKyAqIC0gcHRyLT5mZCB3YXNuJ3QgZ2V0dGluZyBjbGVhcmVkIG9uIGNsb3NlLgorICogLSBHZXRDb21tRXZlbnRNYXNrKCkgYW5kIEdldENvbW1FcnJvcigpIGRpZG4ndCBkbyBtdWNoIG9mIGFueXRoaW5nLgorICogICBJTUhPLCB0aGV5IGFyZSBzdGlsbCB3cm9uZywgYnV0IHRoZXkgYXQgbGVhc3QgaW1wbGVtZW50IHRoZSBSWENIQVIKKyAqICAgZXZlbnQgYW5kIHJldHVybiBJL08gcXVldWUgc2l6ZXMsIHdoaWNoIG1ha2VzIHRoZSBhcHAgSSdtIGludGVyZXN0ZWQKKyAqICAgaW4gKGFuYWxvZyBkZXZpY2VzIEVaS0lUIERTUCBkZXZlbG9wbWVudCBzeXN0ZW0pIHdvcmsuCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0xNiw2ICsyMyw4IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2VuZGlmCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKQEAgLTI3LDYgKzM2LDEwIEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJoYW5kbGUzMi5oIgogCisvKgorICogW1JFUl0gVGhlc2UgYXJlIGdsb2JhbHMgYXJlIHdyb25nLiAgVGhleSBzaG91bGQgYmUgaW4gRG9zRGV2aWNlU3RydWN0CisgKiBvbiBhIHBlciBwb3J0IGJhc2lzLgorICovCiBpbnQgY29tbWVycm9yID0gMCwgZXZlbnRtYXNrID0gMDsKIAogc3RydWN0IERvc0RldmljZVN0cnVjdCBDT01bTUFYX1BPUlRTXTsKQEAgLTQ0NSw3ICs0NTgsMTYgQEAKICAqLwogSU5UMTYgQ2xvc2VDb21tKElOVDE2IGZkKQogeworCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKKwogICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCJDbG9zZUNvbW06IGZkICVkXG4iLCBmZCk7CisJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoZmQpKSA9PSBOVUxMKSB7CisJCWNvbW1lcnJvciA9IElFX0JBRElEOworCQlyZXR1cm4gLTE7CisJfQorCisJcHRyLT5mZCA9IDA7CS8qIFtSRVJdIFJlYWxseSwgLTEgd291bGQgYmUgYSBiZXR0ZXIgdmFsdWUgKi8KKwogCWlmIChjbG9zZShmZCkgPT0gLTEpIHsKIAkJY29tbWVycm9yID0gV2luRXJyb3IoKTsKIAkJcmV0dXJuIC0xOwpAQCAtNzA5LDEwICs3MzEsMjYgQEAKICAqLwogSU5UMTYgR2V0Q29tbUVycm9yKElOVDE2IGZkLExQQ09NU1RBVCBscFN0YXQpCiB7Ci0JaW50IHRlbXBlcnJvcjsKKwlpbnQJCXRlbXBlcnJvcjsKKwl1bnNpZ25lZCBsb25nCWNudDsKKwlpbnQJCXJjOworCisJbHBTdGF0LT5zdGF0dXMgPSAwOworCisJcmMgPSBpb2N0bChmZCwgVElPQ09VVFEsICZjbnQpOworCWxwU3RhdC0+Y2JPdXRRdWUgPSBjbnQ7CisKKwlyYyA9IGlvY3RsKGZkLCBUSU9DSU5RLCAmY250KTsKKwlscFN0YXQtPmNiSW5RdWUgPSBjbnQ7CiAKICAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwKLQkJIkdldENvbW1FcnJvcjogZmQgJWQgKGN1cnJlbnQgZXJyb3IgJWQpXG4iLCBmZCwgY29tbWVycm9yKTsKKwkJIkdldENvbW1FcnJvcjogZmQgJWQsIGVycm9yICVkLCBscFN0YXQgJWQgJWQgJWRcbiIsCisJCWZkLCBjb21tZXJyb3IsCisJCWxwU3RhdC0+c3RhdHVzLCBscFN0YXQtPmNiSW5RdWUsIGxwU3RhdC0+Y2JPdXRRdWUpOworCS8qCisJICogW1JFUl0gSSBoYXZlIG5vIGlkZWEgd2hhdCB0aGUgZm9sbG93aW5nIGlzIHRyeWluZyB0byBhY2NvbXBsaXNoLgorCSAqIFtSRVJdIEl0IGlzIGNlcnRhaW5seSBub3Qgd2hhdCB0aGUgcmVmZXJlbmNlIG1hbnVhbCBzdWdnZXN0cy4KKwkgKi8KIAl0ZW1wZXJyb3IgPSBjb21tZXJyb3I7CiAJY29tbWVycm9yID0gMDsKIAlyZXR1cm4odGVtcGVycm9yKTsKQEAgLTc0NywxMCArNzg1LDQzIEBACiAgKi8KIFVJTlQxNiBHZXRDb21tRXZlbnRNYXNrKElOVDE2IGZkLFVJTlQxNiBmbkV2dENsZWFyKQogeworCWludAlldmVudHMgPSAwOworCiAgICAgCWRwcmludGZfY29tbShzdGRkZWIsCiAJCSJHZXRDb21tRXZlbnRNYXNrOiBmZCAlZCwgbWFzayAlZFxuIiwgZmQsIGZuRXZ0Q2xlYXIpOworCisJLyoKKwkgKglEZXRlcm1pbmUgaWYgYW55IGNoYXJhY3RlcnMgYXJlIGF2YWlsYWJsZQorCSAqLworCWlmIChmbkV2dENsZWFyICYgRVZfUlhDSEFSKQorCXsKKwkJaW50CQlyYzsKKwkJdW5zaWduZWQgbG9uZwljbnQ7CisKKwkJcmMgPSBpb2N0bChmZCwgVElPQ0lOUSwgJmNudCk7CisJCWlmIChjbnQpIGV2ZW50cyB8PSBFVl9SWENIQVI7CisKKwkJZHByaW50Zl9jb21tKHN0ZGRlYiwKKwkJCSJHZXRDb21tRXZlbnRNYXNrOiByeGNoYXIgJWxkXG4iLCBjbnQpOworCX0KKworCS8qCisJICoJVGhlcmUgYXJlIG90aGVyIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgY2hlY2tlZCBmb3IKKwkgKi8KKwkvKiBUT0RPICovCisKKwlkcHJpbnRmX2NvbW0oc3RkZGViLAorCQkiR2V0Q29tbUV2ZW50TWFzazogcmV0dXJuIGV2ZW50cyAlZFxuIiwgZXZlbnRzKTsKKwlyZXR1cm4gZXZlbnRzOworCisJLyoKKwkgKiBbUkVSXSBUaGUgZm9sbG93aW5nIHdhcyBnaWJiZXJpc2gKKwkgKi8KKyNpZiAwCisJdGVtcG1hc2sgPSBldmVudG1hc2s7CiAJZXZlbnRtYXNrICY9IH5mbkV2dENsZWFyOwogCXJldHVybiBldmVudG1hc2s7CisjZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9taXNjL2Vycm9yLmMgYi9taXNjL2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmMjgzNwotLS0gL2Rldi9udWxsCisrKyBiL21pc2MvZXJyb3IuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIExvZyBpbnRlcm5hbCBlcnJvcnMgCisgKgorICogQ29weXJpZ2h0IDE5OTcgQW5kcmV3IFRheWxvcgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2lmZGVmIERFQlVHX1JVTlRJTUUKKworI2RlZmluZSBFcnJvclN0cmluZyhtYW5pZmVzdCkgeyBtYW5pZmVzdCwgIyBtYW5pZmVzdCB9CisKK2NvbnN0IHN0cnVjdCB7CisJaW50IGNvbnN0YW50OworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IEVycm9yU3RyaW5nc1tdID0geworCisJRXJyb3JTdHJpbmcoRVJSX0dBTExPQyksCisJRXJyb3JTdHJpbmcoRVJSX0dSRUFMTE9DKSwKKwlFcnJvclN0cmluZyhFUlJfR0xPQ0spLAorCUVycm9yU3RyaW5nKEVSUl9MQUxMT0MpLAorCUVycm9yU3RyaW5nKEVSUl9MUkVBTExPQyksCisJRXJyb3JTdHJpbmcoRVJSX0xMT0NLKSwKKwlFcnJvclN0cmluZyhFUlJfQUxMT0NSRVMpLAorCUVycm9yU3RyaW5nKEVSUl9MT0NLUkVTKSwKKwlFcnJvclN0cmluZyhFUlJfTE9BRE1PRFVMRSksCisJRXJyb3JTdHJpbmcoRVJSX0NSRUFURURMRyksCisJRXJyb3JTdHJpbmcoRVJSX0NSRUFURURMRzIpLAorCUVycm9yU3RyaW5nKEVSUl9SRUdJU1RFUkNMQVNTKSwKKwlFcnJvclN0cmluZyhFUlJfRENCVVNZKSwKKwlFcnJvclN0cmluZyhFUlJfQ1JFQVRFV05EKSwKKwlFcnJvclN0cmluZyhFUlJfU1RSVUNFWFRSQSksCisJRXJyb3JTdHJpbmcoRVJSX0xPQURTVFIpLAorCUVycm9yU3RyaW5nKEVSUl9MT0FETUVOVSksCisJRXJyb3JTdHJpbmcoRVJSX05FU1RFREJFR0lOUEFJTlQpLAorCUVycm9yU3RyaW5nKEVSUl9CQURJTkRFWCksCisJRXJyb3JTdHJpbmcoRVJSX0NSRUFURU1FTlUpLAorCUVycm9yU3RyaW5nKEVSUl9DUkVBVEVEQyksCisJRXJyb3JTdHJpbmcoRVJSX0NSRUFURU1FVEEpLAorCUVycm9yU3RyaW5nKEVSUl9ERUxPQkpTRUxFQ1RFRCksCisJRXJyb3JTdHJpbmcoRVJSX1NFTEJJVE1BUCkKK307CisKKyNkZWZpbmUgRXJyb3JTdHJpbmdDb3VudCAoc2l6ZW9mKEVycm9yU3RyaW5ncykgLyBzaXplb2YoRXJyb3JTdHJpbmdzWzBdKSkKKworY29uc3Qgc3RydWN0IHsKKwlpbnQgY29uc3RhbnQ7CisJY29uc3QgY2hhciAqbmFtZTsKK30gUGFyYW1FcnJvclN0cmluZ3NbXSA9IHsKKworCUVycm9yU3RyaW5nKEVSUl9CQURfVkFMVUUpLAorCUVycm9yU3RyaW5nKEVSUl9CQURfRkxBR1MpLAorCUVycm9yU3RyaW5nKEVSUl9CQURfSU5ERVgpLAorCUVycm9yU3RyaW5nKEVSUl9CQURfRFZBTFVFKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0RGTEFHUyksCisJRXJyb3JTdHJpbmcoRVJSX0JBRF9ESU5ERVgpLAorCUVycm9yU3RyaW5nKEVSUl9CQURfUFRSKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0ZVTkNfUFRSKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX1NFTEVDVE9SKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX1NUUklOR19QVFIpLAorCUVycm9yU3RyaW5nKEVSUl9CQURfSEFORExFKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0hJTlNUQU5DRSksCisJRXJyb3JTdHJpbmcoRVJSX0JBRF9ITU9EVUxFKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0dMT0JBTF9IQU5ETEUpLAorCUVycm9yU3RyaW5nKEVSUl9CQURfTE9DQUxfSEFORExFKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0FUT00pLAorCUVycm9yU3RyaW5nKEVSUl9CQURfSEZJTEUpLAorCUVycm9yU3RyaW5nKEVSUl9CQURfSFdORCksCisJRXJyb3JTdHJpbmcoRVJSX0JBRF9ITUVOVSksCisJRXJyb3JTdHJpbmcoRVJSX0JBRF9IQ1VSU09SKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0hJQ09OKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0hEV1ApLAorCUVycm9yU3RyaW5nKEVSUl9CQURfQ0lEKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0hEUlZSKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0NPT1JEUyksCisJRXJyb3JTdHJpbmcoRVJSX0JBRF9HRElfT0JKRUNUKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0hEQyksCisJRXJyb3JTdHJpbmcoRVJSX0JBRF9IUEVOKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0hGT05UKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0hCUlVTSCksCisJRXJyb3JTdHJpbmcoRVJSX0JBRF9IQklUTUFQKSwKKwlFcnJvclN0cmluZyhFUlJfQkFEX0hSR04pLAorCUVycm9yU3RyaW5nKEVSUl9CQURfSFBBTEVUVEUpLAorCUVycm9yU3RyaW5nKEVSUl9CQURfSE1FVEFGSUxFKQorfTsKKworI2RlZmluZSBQYXJhbUVycm9yU3RyaW5nQ291bnQgKHNpemVvZihQYXJhbUVycm9yU3RyaW5ncykgLyBzaXplb2YoUGFyYW1FcnJvclN0cmluZ3NbMF0pKQorCisjZW5kaWYgLyogREVCVUdfUlVOVElNRSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJR2V0RXJyb3JTdHJpbmcgKGludGVybmFsKQorKi8KK3N0YXRpYyBjb25zdCBjaGFyICpHZXRFcnJvclN0cmluZyhVSU5UMTYgdUVycikgeworCXN0YXRpYyBjaGFyIGJ1ZmZlcls4MF07CisKKyNpZmRlZiBERUJVR19SVU5USU1FCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRXJyb3JTdHJpbmdDb3VudDsgaSsrKSB7CisJCWlmICh1RXJyID09IEVycm9yU3RyaW5nc1tpXS5jb25zdGFudCkKKwkJCXJldHVybiBFcnJvclN0cmluZ3NbaV0ubmFtZTsKKwl9CisjZW5kaWYKKworCXNwcmludGYoYnVmZmVyLCAiJXgiLCB1RXJyKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKglHZXRQYXJhbUVycm9yU3RyaW5nIChpbnRlcm5hbCkKKyovCitzdGF0aWMgY29uc3QgY2hhciAqR2V0UGFyYW1FcnJvclN0cmluZyhVSU5UMTYgdUVycikgeworCXN0YXRpYyBjaGFyIGJ1ZmZlcls4MF07CisKKwlpZiAodUVyciAmIEVSUl9XQVJOSU5HKSB7CisJCXN0cmNweShidWZmZXIsICJFUlJfV0FSTklORyB8ICIpOworCQl1RXJyICY9IH5FUlJfV0FSTklORzsKKwl9IGVsc2UKKwkJYnVmZmVyWzBdID0gJ1wwJzsKKworI2lmZGVmIERFQlVHX1JVTlRJTUUKKwl7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBQYXJhbUVycm9yU3RyaW5nQ291bnQ7IGkrKykgeworCQkJaWYgKHVFcnIgPT0gUGFyYW1FcnJvclN0cmluZ3NbaV0uY29uc3RhbnQpIHsKKwkJCQlzdHJjYXQoYnVmZmVyLCBQYXJhbUVycm9yU3RyaW5nc1tpXS5uYW1lKTsKKwkJCQlyZXR1cm4gYnVmZmVyOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwlzcHJpbnRmKGJ1ZmZlciArIHN0cmxlbihidWZmZXIpLCAiJXgiLCB1RXJyKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKglMb2dFcnJvciAoS0VSTkVMLjMyNCkKKyovCitWT0lEIExvZ0Vycm9yKFVJTlQxNiB1RXJyLCBMUFZPSUQgbHB2SW5mbykgeworCWZwcmludGYoc3RkZGViLCAiTG9nRXJyb3IoJXMsICVwKVxuIiwgCisJCUdldEVycm9yU3RyaW5nKHVFcnIpLCBscHZJbmZvKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJTG9nUGFyYW1FcnJvciAoS0VSTkVMLjMyNSkKKyovCit2b2lkIExvZ1BhcmFtRXJyb3IoVUlOVDE2IHVFcnIsIEZBUlBST0MxNiBscGZuLCBMUFZPSUQgbHB2UGFyYW0pIHsKKwkvKiBGSVhNRTogaXMgaXQgcG9zc2libGUgdG8gZ2V0IHRoZSBtb2R1bGUgbmFtZS9mdW5jdGlvbgorCSAqIGZyb20gdGhlIGxwZm4gcGFyYW0/CisJICovCisJZnByaW50ZihzdGRkZWIsICJMb2dQYXJhbUVycm9yKCVzLCAlcCwgJXApXG4iLCAKKwkJR2V0UGFyYW1FcnJvclN0cmluZyh1RXJyKSwgbHBmbiwgbHB2UGFyYW0pOworfQpkaWZmIC0tZ2l0IGEvbWlzYy9sc3RyLmMgYi9taXNjL2xzdHIuYwppbmRleCA3ZjU2NWNhLi43MjI4ZTY3IDEwMDY0NAotLS0gYS9taXNjL2xzdHIuYworKysgYi9taXNjL2xzdHIuYwpAQCAtNTM0LDEwICs1MzQsMTEgQEAKIAkJd2hpbGUgKCpmKSB7CiAJCQlpZiAoKmY9PSclJykgewogCQkJCWludAlpbnNlcnRucjsKLQkJCQljaGFyCSpmbXRzdHIsKnNwcmludGZidWYsKng7CisJCQkJY2hhcgkqZm10c3RyLCpzcHJpbnRmYnVmLCp4LCpsYXN0ZjsKIAkJCQlEV09SRAkqYXJnbGlzdHN0YXJ0OwogCiAJCQkJZm10c3RyID0gTlVMTDsKKwkJCQlsYXN0ZiA9IGY7CiAJCQkJZisrOwogCQkJCWlmICghKmYpIHsKIAkJCQkJQUREX1RPX1QoJyUnKTsKQEAgLTU3MywyNiArNTc0LDM1IEBACiAJCQkJCQl9CiAJCQkJCX0gZWxzZQogCQkJCQkJZm10c3RyPUhFQVBfc3RyZHVwQShHZXRQcm9jZXNzSGVhcCgpLDAsIiVzIik7Ci0JCQkJCWlmIChkd0ZsYWdzICYgRk9STUFUX01FU1NBR0VfQVJHVU1FTlRfQVJSQVkpCi0JCQkJCQlhcmdsaXN0c3RhcnQ9YXJncytpbnNlcnRuci0xOwotCQkJCQllbHNlCi0JCQkJCQkvKiBGSVhNRTogbm90IHN1cmUgdGhhdCB0aGlzIGlzCi0JCQkJCQkgKiBjb3JyZWN0IGZvciB1bml4LWMtdmFyYXJncy4KKwkJCQkJaWYgKGFyZ3MpIHsKKwkJCQkJCWlmIChkd0ZsYWdzICYgRk9STUFUX01FU1NBR0VfQVJHVU1FTlRfQVJSQVkpCisJCQkJCQkJYXJnbGlzdHN0YXJ0PWFyZ3MraW5zZXJ0bnItMTsKKwkJCQkJCWVsc2UKKwkJCQkJCQkvKiBGSVhNRTogbm90IHN1cmUgdGhhdCB0aGlzIGlzCisJCQkJCQkJICogY29ycmVjdCBmb3IgdW5peC1jLXZhcmFyZ3MuCisJCQkJCQkJICovCisJCQkJCQkJYXJnbGlzdHN0YXJ0PSgoRFdPUkQqKSZhcmdzKStpbnNlcnRuci0xOworCisJCQkJCQlpZiAoZm10c3RyW3N0cmxlbihmbXRzdHIpXT09J3MnKQorCQkJCQkJCXNwcmludGZidWY9SGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzdHJsZW4oKExQU1RSKWFyZ2xpc3RzdGFydFswXSkrMSk7CisJCQkJCQllbHNlCisJCQkJCQkJc3ByaW50ZmJ1Zj1IZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLDEwMCk7CisKKwkJCQkJCS8qIENNRiAtIFRoaXMgbWFrZXMgYSBCSUcgYXNzdW1wdGlvbiBhYm91dCB2YV9saXN0ICovCisJCQkJCQl2c3ByaW50ZihzcHJpbnRmYnVmLCBmbXRzdHIsICh2YV9saXN0KSBhcmdsaXN0c3RhcnQpOworCQkJCQkJeD1zcHJpbnRmYnVmOworCQkJCQkJd2hpbGUgKCp4KSB7CisJCQkJCQkJQUREX1RPX1QoKngrKyk7CisJCQkJCQl9CisJCQkJCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3ByaW50ZmJ1Zik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBOVUxMIGFyZ3MgLSBjb3B5IGZvcm1hdHN0ciAKKwkJCQkJCSAqIChwcm9iYWJseSB3cm9uZykKIAkJCQkJCSAqLwotCQkJCQkJYXJnbGlzdHN0YXJ0PSgoRFdPUkQqKSZhcmdzKStpbnNlcnRuci0xOwotCi0JCQkJCWlmIChmbXRzdHJbc3RybGVuKGZtdHN0cildPT0ncycpCi0JCQkJCQlzcHJpbnRmYnVmPUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc3RybGVuKChMUFNUUilhcmdsaXN0c3RhcnRbMF0pKzEpOwotCQkJCQllbHNlCi0JCQkJCQlzcHJpbnRmYnVmPUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsMTAwKTsKLQotCQkJCQkvKiBDTUYgLSBUaGlzIG1ha2VzIGEgQklHIGFzc3VtcHRpb24gYWJvdXQgdmFfbGlzdCAqLwotCQkJCQl2c3ByaW50ZihzcHJpbnRmYnVmLCBmbXRzdHIsICh2YV9saXN0KSBhcmdsaXN0c3RhcnQpOwotCQkJCQl4PXNwcmludGZidWY7Ci0JCQkJCXdoaWxlICgqeCkgewotCQkJCQkJQUREX1RPX1QoKngrKyk7CisJCQkJCQl3aGlsZSAobGFzdGY8ZikgeworCQkJCQkJCUFERF9UT19UKCpsYXN0ZisrKTsKKwkJCQkJCX0KIAkJCQkJfQotCQkJCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3ByaW50ZmJ1Zik7CiAJCQkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxmbXRzdHIpOwogCQkJCQlicmVhazsKIAkJCQljYXNlICduJzoKZGlmZiAtLWdpdCBhL21pc2MvbHpleHBhbmQuYyBiL21pc2MvbHpleHBhbmQuYwppbmRleCA0OGQ2N2U0Li4zODQwOTZlIDEwMDY0NAotLS0gYS9taXNjL2x6ZXhwYW5kLmMKKysrIGIvbWlzYy9semV4cGFuZC5jCkBAIC0yMDQsNyArMjA0LDcgQEAKICAqLwogSU5UMTYgR2V0RXhwYW5kZWROYW1lMTYoIExQQ1NUUiBpbiwgTFBTVFIgb3V0ICkKIHsKLSAgICByZXR1cm4gR2V0RXhwYW5kZWROYW1lMzJBKCBpbiwgb3V0ICk7CisgICAgcmV0dXJuIChJTlQxNilHZXRFeHBhbmRlZE5hbWUzMkEoIGluLCBvdXQgKTsKIH0KIAogCkBAIC0yMzAsMTcgKzIzMCwxNiBAQAogCWRwcmludGZfZmlsZShzdGRkZWIsIkdldEV4cGFuZGVkTmFtZSglcylcbiIsaW4pOwogCWZkPU9wZW5GaWxlMzIoaW4sJm9mcyxPRl9SRUFEKTsKIAlpZiAoZmQ9PUhGSUxFX0VSUk9SMzIpCi0JCXJldHVybiBMWkVSUk9SX0JBRElOSEFORExFOworCQlyZXR1cm4gKElOVDMyKShJTlQxNilMWkVSUk9SX0JBRElOSEFORExFOworCXN0cmNweShvdXQsaW4pOwogCXJldD1yZWFkX2hlYWRlcihmZCwmaGVhZCk7CiAJaWYgKHJldDw9MCkgeworCQkvKiBub3QgYSBMWiBjb21wcmVzc2VkIGZpbGUsIHNvIHRoZSBleHBhbmRlZCBuYW1lIGlzIHRoZSBzYW1lCisJCSAqIGFzIHRoZSBpbnB1dCBuYW1lICovCiAJCV9sY2xvc2UzMihmZCk7Ci0JCXJldHVybiBMWkVSUk9SX0JBRElOSEFORExFOworCQlyZXR1cm4gMTsKIAl9CiAKLQkvKiBUaGlzIGxpbmUgd2lsbCBjcmFzaCBpZiB0aGUgY2FsbGVyIGhhc24ndCBhbGxvY2F0ZWQgZW5vdWdoIG1lbW9yeQotCSAqIGZvciB1cy4KLQkgKi8KLQlzdHJjcHkob3V0LGluKTsKIAogCS8qIGxvb2sgZm9yIGRpcmVjdG9yeSBwcmVmaXggYW5kIHNraXAgaXQuICovCiAJcz1vdXQ7CmRpZmYgLS1naXQgYS9taXNjL21haW4uYyBiL21pc2MvbWFpbi5jCmluZGV4IDU3ODMyYWQuLjg0YWI5Y2YgMTAwNjQ0Ci0tLSBhL21pc2MvbWFpbi5jCisrKyBiL21pc2MvbWFpbi5jCkBAIC04MTcsNiArODE3LDggQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbW9kZSBzZXQ/IFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gQ2hlY2sgR2V0V2luRmxhZ3MoKSFcbiIpOwogICAgIGJyZWFrOwogICB9CisgIGlmIChzaS53UHJvY2Vzc29yTGV2ZWw+PTQpCisgICAgICByZXN1bHQgfD0gV0ZfSEFTQ1BVSUQ7CiAgIGlmKCBnZXRWZXJzaW9uRXguZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVCApCiAgICAgICByZXN1bHQgfD0gV0ZfV0lOMzJXT1c7IC8qIHVuZG9jdW1lbnRlZCBXRl9XSU5OVCAqLwogICByZXR1cm4gcmVzdWx0OwpAQCAtMTA2MCw5ICsxMDYyLDEyIEBACiAKIAkgICAgICAgIGNhc2UgU1BJX0dFVElDT05USVRMRUxPR0ZPTlQ6IAogCSAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRSBHZXRQcm9maWxlU3RyaW5nMzJBKCAiPyIsICI/IiwgIj8iICkgKi8KICAgICAgICAgICAgICAgICAgICAgTFBMT0dGT05UMTYgbHBMb2dGb250ID0gKExQTE9HRk9OVDE2KWxwdlBhcmFtOwotICAgICAgICAgICAgICAgICAgICBscExvZ0ZvbnQtPmxmSGVpZ2h0ID0gMTA7CisKKwkJICAgIEdldFByb2ZpbGVTdHJpbmczMkEoIkRlc2t0b3AiLCAiSWNvblRpdGxlRmFjZU5hbWUiLCAiSGVsdmV0aWNhIiwgCisJCQkJCWxwTG9nRm9udC0+bGZGYWNlTmFtZSwgTEZfRkFDRVNJWkUgKTsKKyAgICAgICAgICAgICAgICAgICAgbHBMb2dGb250LT5sZkhlaWdodCA9IC1HZXRQcm9maWxlSW50MzJBKCJEZXNrdG9wIiwiSWNvblRpdGxlU2l6ZSIsIDgpOworCiAgICAgICAgICAgICAgICAgICAgIGxwTG9nRm9udC0+bGZXaWR0aCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGxwTG9nRm9udC0+bGZFc2NhcGVtZW50ID0gbHBMb2dGb250LT5sZk9yaWVudGF0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgbHBMb2dGb250LT5sZldlaWdodCA9IEZXX05PUk1BTDsKZGlmZiAtLWdpdCBhL21pc2MvbXByLmMgYi9taXNjL21wci5jCmluZGV4IDYyZjlmODUuLjZjN2I2NzQgMTAwNjQ0Ci0tLSBhL21pc2MvbXByLmMKKysrIGIvbWlzYy9tcHIuYwpAQCAtMjEsMyArMjEsMTUgQEAKIAkpOwogCXJldHVybiAwOwogfQorCitEV09SRAorTXVsdGluZXRHZXRDb25uZWN0aW9uUGVyZm9ybWFuY2UzMkEoCisJTFBORVRSRVNPVVJDRTMyQSBscE5ldFJlc291cmNlLAorCUxQTkVUQ09OTkVDVElORk9TVFJVQ1QgbHBOZXRDb25uZWN0SW5mb1N0cnVjdAorKSB7CisJZnByaW50ZihzdGRuaW1wLCJNdWx0aW5ldEdldENvbm5lY3Rpb25QZXJmb3JtYW5jZSglcCwlcClcbiIsCisJCQlscE5ldFJlc291cmNlLAorCQkJbHBOZXRDb25uZWN0SW5mb1N0cnVjdAorCSk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9taXNjL3ByaW50ZHJ2LmMgYi9taXNjL3ByaW50ZHJ2LmMKaW5kZXggNjRlNDRmOS4uOTU4M2MzOCAxMDA2NDQKLS0tIGEvbWlzYy9wcmludGRydi5jCisrKyBiL21pc2MvcHJpbnRkcnYuYwpAQCAtNDAsNyArNDAsNyBAQAogRHJ2R2V0UHJpbnRlckRhdGEoTFBTVFIgbHBQcmludGVyLCBMUFNUUiBscFByb2ZpbGUsIExQRFdPUkQgbHBUeXBlLAogICAgICAgICAgICAgICAgICAgTFBCWVRFIGxwUHJpbnRlckRhdGEsIGludCBjYkRhdGEsIExQRFdPUkQgbHBOZWVkZWQpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsIkluIERydkdldFByaW50ZXJEYXRhIHByaW50ZXIgJXMgcHJvZmlsZSAlcyBscFR5cGUgJXAgXG4iLAorICAgIGZwcmludGYoc3RkZXJyLCJJbiBEcnZHZXRQcmludGVyRGF0YSBwcmludGVyICVwIHByb2ZpbGUgJXAgbHBUeXBlICVwIFxuIiwKICAgICAgICAgICAgbHBQcmludGVyLCBscFByb2ZpbGUsIGxwVHlwZSk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC01MSw3ICs1MSw3IEBACiBEcnZTZXRQcmludGVyRGF0YShMUFNUUiBscFByaW50ZXIsIExQU1RSIGxwUHJvZmlsZSwgTFBEV09SRCBscFR5cGUsCiAgICAgICAgICAgICAgICAgICBMUEJZVEUgbHBQcmludGVyRGF0YSwgRFdPUkQgZHdTaXplKQogewotICAgIGZwcmludGYoc3RkZXJyLCJJbiBEcnZTZXRQcmludGVyRGF0YSBwcmludGVyICVzIHByb2ZpbGUgJXMgbHBUeXBlICVwIFxuIiwKKyAgICBmcHJpbnRmKHN0ZGVyciwiSW4gRHJ2U2V0UHJpbnRlckRhdGEgcHJpbnRlciAlcCBwcm9maWxlICVwIGxwVHlwZSAlcCBcbiIsCiAgICAgICAgICAgIGxwUHJpbnRlciwgbHBQcm9maWxlLCBscFR5cGUpOwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbC5jIGIvbWlzYy9zaGVsbC5jCmluZGV4IGY2N2NhMzIuLjA0MWZjOGIgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGwuYworKysgYi9taXNjL3NoZWxsLmMKQEAgLTQ3NiwyMyArNDc2LDIzIEBACiBzdGF0aWMgQllURSogU0hFTExfR2V0UmVzb3VyY2VUYWJsZShIRklMRTMyIGhGaWxlKQogewogICBCWVRFKiAgICAgICAgICAgICAgcFR5cGVJbmZvID0gTlVMTDsKLSAgc3RydWN0IG16X2hlYWRlcl9zIG16X2hlYWRlcjsKLSAgc3RydWN0IG5lX2hlYWRlcl9zIG5lX2hlYWRlcjsKKyAgSU1BR0VfRE9TX0hFQURFUgltel9oZWFkZXI7CisgIElNQUdFX09TMl9IRUFERVIJbmVfaGVhZGVyOwogICBpbnQJCSAgICAgc2l6ZTsKICAgCiAgIF9sbHNlZWszMiggaEZpbGUsIDAsIFNFRUtfU0VUICk7CiAgIGlmICgoX2xyZWFkMzIoaEZpbGUsJm16X2hlYWRlcixzaXplb2YobXpfaGVhZGVyKSkgIT0gc2l6ZW9mKG16X2hlYWRlcikpIHx8Ci0gICAgICAobXpfaGVhZGVyLm16X21hZ2ljICE9IE1aX1NJR05BVFVSRSkpIHJldHVybiAoQllURSopLTE7CisgICAgICAobXpfaGVhZGVyLmVfbWFnaWMgIT0gSU1BR0VfRE9TX1NJR05BVFVSRSkpIHJldHVybiAoQllURSopLTE7CiAKLSAgX2xsc2VlazMyKCBoRmlsZSwgbXpfaGVhZGVyLm5lX29mZnNldCwgU0VFS19TRVQgKTsKKyAgX2xsc2VlazMyKCBoRmlsZSwgbXpfaGVhZGVyLmVfbGZhbmV3LCBTRUVLX1NFVCApOwogICBpZiAoX2xyZWFkMzIoIGhGaWxlLCAmbmVfaGVhZGVyLCBzaXplb2YobmVfaGVhZGVyKSApICE9IHNpemVvZihuZV9oZWFkZXIpKQogICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgaWYgKG5lX2hlYWRlci5uZV9tYWdpYyA9PSBQRV9TSUdOQVRVUkUpIAorICBpZiAobmVfaGVhZGVyLm5lX21hZ2ljID09IElNQUdFX05UX1NJR05BVFVSRSkgCiAgICAgIHsgZnByaW50ZihzdGRuaW1wLCJXaW4zMnMgRklYTUU6IGZpbGUgJXMgbGluZSAlaVxuIiwgX19GSUxFX18sIF9fTElORV9fICk7CiAgICAgICAgcmV0dXJuIE5VTEw7IH0KIAotICBpZiAobmVfaGVhZGVyLm5lX21hZ2ljICE9IE5FX1NJR05BVFVSRSkgcmV0dXJuIE5VTEw7CisgIGlmIChuZV9oZWFkZXIubmVfbWFnaWMgIT0gSU1BR0VfT1MyX1NJR05BVFVSRSkgcmV0dXJuIE5VTEw7CiAKICAgc2l6ZSA9IG5lX2hlYWRlci5ybmFtZV90YWJfb2Zmc2V0IC0gbmVfaGVhZGVyLnJlc291cmNlX3RhYl9vZmZzZXQ7CiAKQEAgLTUwMSw3ICs1MDEsNyBAQAogICAgICAgcFR5cGVJbmZvID0gKEJZVEUqKUhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSk7CiAgICAgICBpZiggcFR5cGVJbmZvICkgCiAgICAgICB7Ci0gICAgICAgICAgX2xsc2VlazMyKGhGaWxlLCBtel9oZWFkZXIubmVfb2Zmc2V0K25lX2hlYWRlci5yZXNvdXJjZV90YWJfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgX2xsc2VlazMyKGhGaWxlLCBtel9oZWFkZXIuZV9sZmFuZXcrbmVfaGVhZGVyLnJlc291cmNlX3RhYl9vZmZzZXQsIFNFRUtfU0VUKTsKICAgICAgICAgICBpZiggX2xyZWFkMzIoIGhGaWxlLCAoY2hhciopcFR5cGVJbmZvLCBzaXplKSAhPSBzaXplICkKICAgICAgICAgICB7IAogCSAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwVHlwZUluZm8pOyAKZGlmZiAtLWdpdCBhL21pc2Mvc3B5LmMgYi9taXNjL3NweS5jCmluZGV4IDMyMTZmNGEuLjY1NDkwYjkgMTAwNjQ0Ci0tLSBhL21pc2Mvc3B5LmMKKysrIGIvbWlzYy9zcHkuYwpAQCAtNTA4LDE1ICs1MDgsNDEgQEAKICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIAogICAgICJXTV9DT0FMRVNDRV9MQVNUIiwgCisgICAgCisgICAgLyogMHgwM2EwICovCisgICAgIk1NX0pPWTFNT1ZFIiwgCisgICAgIk1NX0pPWTJNT1ZFIiwgCisgICAgIk1NX0pPWTFaTU9WRSIsIAorICAgICJNTV9KT1kyWk1PVkUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgIC8qIDB4MDNiMCAqLworICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIAorICAgICJNTV9KT1kxQlVUVE9ORE9XTiIsIAorICAgICJNTV9KT1kyQlVUVE9ORE9XTiIsIAorICAgICJNTV9KT1kxQlVUVE9OVVAiLAorICAgICJNTV9KT1kyQlVUVE9OVVAiLAorICAgICJNTV9NQ0lOT1RJRlkiLAorICAgICAgICAgICAgICAgIE5VTEwsIAorICAgICJNTV9XT01fT1BFTiIsCisgICAgIk1NX1dPTV9DTE9TRSIsCisgICAgIk1NX1dPTV9ET05FIiwKKyAgICAiTU1fV0lNX09QRU4iLAorICAgICJNTV9XSU1fQ0xPU0UiLAogCiAgICAgLyogMHgwM2MwICovCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICJNTV9XSU1fREFUQSIsCisgICAgIk1NX01JTV9PUEVOIiwKKyAgICAiTU1fTUlNX0NMT1NFIiwKKyAgICAiTU1fTUlNX0RBVEEiLAorICAgICJNTV9NSU1fTE9OR0RBVEEiLAorICAgICJNTV9NSU1fRVJST1IiLAorICAgICJNTV9NSU1fTE9OR0VSUk9SIiwKKyAgICAiTU1fTU9NX09QRU4iLAorICAgICJNTV9NT01fQ0xPU0UiLAorICAgICJNTV9NT01fRE9ORSIsCisgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAKQEAgLTY2Niw3ICs2OTIsNyBAQAogaW50IFNQWV9Jbml0KHZvaWQpCiB7CiAgICAgaW50IGk7Ci0gICAgY2hhciBidWZmZXJbNTEyXTsKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKIAogICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggIlNweSIsICJJbmNsdWRlIiwgIiIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKICAgICBpZiAoYnVmZmVyWzBdICYmIHN0cmNtcCggYnVmZmVyLCAiSU5DTFVERUFMTCIgKSkKZGlmZiAtLWdpdCBhL21pc2MvdmVyLmMgYi9taXNjL3Zlci5jCmluZGV4IGJkM2QwYjIuLjcwNjkwYjggMTAwNjQ0Ci0tLSBhL21pc2MvdmVyLmMKKysrIGIvbWlzYy92ZXIuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCkBAIC0yNCwxOSArMjUsMTU2IEBACiAgIGlmIChzaXplb2YoKndoYXQpIT1MWlJlYWQzMihsemZkLHdoYXQsc2l6ZW9mKCp3aGF0KSkpIHJldHVybiAwOwogI2RlZmluZSBMWlRFTEwobHpmZCkgTFpTZWVrMzIobHpmZCwgMCwgU0VFS19DVVIpOwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICB2b2lkICBkcHJpbnRmX3Zlcl9zdHJpbmcoCisgKiAgICAgIGNoYXIgY29uc3QgKiBwcm9sb2d1ZSwKKyAqICAgICAgY2hhciBjb25zdCAqIHRlc3RzdHJpbmcsCisgKiAgICAgIGNoYXIgY29uc3QgKiBlcGlsb2d1ZSApCisgKgorICogICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJpbnQgdmlhIGRwcmludGZfdmVyIHRvIHN0ZGRlYiB0aGUgcHJvbG9ndWUgc3RyaW5nLAorICogICBmb2xsb3dlZCBieSB0aGUgYWRkcmVzcyBvZiB0ZXN0c3RyaW5nIGFuZCB0aGUgc3RyaW5nIGl0IGNvbnRhaW5zIGlmCisgKiAgIHRlc3RzdHJpbmcgaXMgbm9uLW51bGwgb3IgIihudWxsKSIgb3RoZXJ3aXNlLCBhbmQgdGhlbiB0aGUgZXBpbG9ndWUKKyAqICAgc3RyaW5nLgorICoKKyAqICAgUmV2aXNpb24gaGlzdG9yeQorICogICAgICAzMC1NYXktMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKKyAqICAgICAgICAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkICBkcHJpbnRmX3Zlcl9zdHJpbmcoCisgICAgY2hhciBjb25zdCAqIHByb2xvZ3VlLAorICAgIGNoYXIgY29uc3QgKiB0ZXN0c3RyaW5nLAorICAgIGNoYXIgY29uc3QgKiBlcGlsb2d1ZSApCit7CisgICAgZHByaW50Zl92ZXIoc3RkZGViLCAiJXMiLCBwcm9sb2d1ZSk7CisgICAgCisgICAgaWYodGVzdHN0cmluZykKKwlkcHJpbnRmX3ZlcihzdGRkZWIsICIlcCAoXCIlc1wiKSIsICh2b2lkIGNvbnN0ICopIHRlc3RzdHJpbmcsCisJCSAgICB0ZXN0c3RyaW5nKTsKKyAgICBlbHNlCisJZHByaW50Zl92ZXIoc3RkZGViLCAiKG51bGwpIik7CisKKyAgICBkcHJpbnRmX3ZlcihzdGRkZWIsICIlcyIsIGVwaWxvZ3VlKTsKKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgaW50ICB0ZXN0RmlsZUV4aXN0ZW5jZSgKKyAqICAgICAgY2hhciBjb25zdCAqIHBhdGgsCisgKiAgICAgIGNoYXIgY29uc3QgKiBmaWxlICkKKyAqCisgKiAgIFRlc3RzIHdoZXRoZXIgYSBnaXZlbiBwYXRoL2ZpbGUgY29tYmluYXRpb24gZXhpc3RzLiAgSWYgdGhlIGZpbGUgZG9lcworICogICBub3QgZXhpc3QsIHRoZSByZXR1cm4gdmFsdWUgaXMgemVyby4gIElmIGl0IGRvZXMgZXhpc3QsIHRoZSByZXR1cm4KKyAqICAgdmFsdWUgaXMgbm9uLXplcm8uCisgKgorICogICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAgIDMwLU1heS0xOTk3IERhdmUgQ3V0aGJlcnQgKGRhY3V0QGVjZS5jbXUuZWR1KQorICogICAgICAgICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCAgdGVzdEZpbGVFeGlzdGVuY2UoCisgICBjaGFyIGNvbnN0ICogcGF0aCwKKyAgIGNoYXIgY29uc3QgKiBmaWxlICkKK3sKKyAgICBjaGFyICBmaWxlbmFtZVsxMDI0XTsKKyAgICBpbnQgIGZpbGVuYW1lbGVuOworICAgIE9GU1RSVUNUICBmaWxlaW5mbzsKKyAgICBpbnQgIHJldHZhbDsKKworICAgIGZpbGVpbmZvLmNCeXRlcyA9IHNpemVvZihPRlNUUlVDVCk7CisKKyAgICBzdHJjcHkoZmlsZW5hbWUsIHBhdGgpOworICAgIGZpbGVuYW1lbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKworICAgIC8qIEFkZCBhIHRyYWlsaW5nIFwgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYoZmlsZW5hbWVsZW4pIHsKKwlpZihmaWxlbmFtZVtmaWxlbmFtZWxlbiAtIDFdICE9ICdcXCcpCisJICAgIHN0cmNhdChmaWxlbmFtZSwgIlxcIik7CisgICAgfQorICAgIGVsc2UgLyogc3BlY2lmeSB0aGUgY3VycmVudCBkaXJlY3RvcnkgKi8KKwlzdHJjcHkoZmlsZW5hbWUsICIuXFwiKTsKKworICAgIC8qIENyZWF0ZSB0aGUgZnVsbCBwYXRobmFtZSAqLworICAgIHN0cmNhdChmaWxlbmFtZSwgZmlsZSk7CisKKyAgICBpZihPcGVuRmlsZTMyKGZpbGVuYW1lLCAmZmlsZWluZm8sIE9GX0VYSVNUKSA9PSBIRklMRV9FUlJPUjMyKQorCXJldHZhbCA9IDA7CisgICAgZWxzZQorCXJldHZhbCA9IDE7CisKKyAgICByZXR1cm4gIHJldHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgaW50ICB0ZXN0RmlsZUV4Y2x1c2l2ZUV4aXN0ZW5jZSgKKyAqICAgICAgY2hhciBjb25zdCAqIHBhdGgsCisgKiAgICAgIGNoYXIgY29uc3QgKiBmaWxlICkKKyAqCisgKiAgIFRlc3RzIHdoZXRoZXIgYSBnaXZlbiBwYXRoL2ZpbGUgY29tYmluYXRpb24gZXhpc3RzIGFuZCBlbnN1cmVzIHRoYXQgbm8KKyAqICAgb3RoZXIgcHJvZ3JhbXMgaGF2ZSBoYW5kbGVzIHRvIHRoZSBnaXZlbiBmaWxlLiAgSWYgdGhlIGZpbGUgZG9lcyBub3QKKyAqICAgZXhpc3Qgb3IgaXMgb3BlbiwgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvLiAgSWYgaXQgZG9lcyBleGlzdCwgdGhlCisgKiAgIHJldHVybiB2YWx1ZSBpcyBub24temVyby4KKyAqCisgKiAgIFJldmlzaW9uIGhpc3RvcnkKKyAqICAgICAgMzAtTWF5LTE5OTcgRGF2ZSBDdXRoYmVydCAoZGFjdXRAZWNlLmNtdS5lZHUpCisgKiAgICAgICAgIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50ICB0ZXN0RmlsZUV4Y2x1c2l2ZUV4aXN0ZW5jZSgKKyAgIGNoYXIgY29uc3QgKiBwYXRoLAorICAgY2hhciBjb25zdCAqIGZpbGUgKQoreworICAgIGNoYXIgIGZpbGVuYW1lWzEwMjRdOworICAgIGludCAgZmlsZW5hbWVsZW47CisgICAgT0ZTVFJVQ1QgIGZpbGVpbmZvOworICAgIGludCAgcmV0dmFsOworCisgICAgZmlsZWluZm8uY0J5dGVzID0gc2l6ZW9mKE9GU1RSVUNUKTsKKworICAgIHN0cmNweShmaWxlbmFtZSwgcGF0aCk7CisgICAgZmlsZW5hbWVsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworCisgICAgLyogQWRkIGEgdHJhaWxpbmcgXCBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZihmaWxlbmFtZWxlbikgeworCWlmKGZpbGVuYW1lW2ZpbGVuYW1lbGVuIC0gMV0gIT0gJ1xcJykKKwkgICAgc3RyY2F0KGZpbGVuYW1lLCAiXFwiKTsKKyAgICB9CisgICAgZWxzZSAvKiBzcGVjaWZ5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLworCXN0cmNweShmaWxlbmFtZSwgIi5cXCIpOworCisgICAgLyogQ3JlYXRlIHRoZSBmdWxsIHBhdGhuYW1lICovCisgICAgc3RyY2F0KGZpbGVuYW1lLCBmaWxlKTsKKworICAgIGlmKE9wZW5GaWxlMzIoZmlsZW5hbWUsICZmaWxlaW5mbywgT0ZfRVhJU1QgfCBPRl9TSEFSRV9FWENMVVNJVkUpID09CisgICAgICAgSEZJTEVfRVJST1IzMikKKwlyZXR2YWwgPSAwOworICAgIGVsc2UKKwlyZXR2YWwgPSAxOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCiBpbnQKLXJlYWRfbmVfaGVhZGVyKEhGSUxFMzIgbHpmZCxzdHJ1Y3QgbmVfaGVhZGVyX3MgKm5laGQpIHsKLQlzdHJ1Y3QJbXpfaGVhZGVyX3MJbXpoOworcmVhZF9uZV9oZWFkZXIoSEZJTEUzMiBsemZkLExQSU1BR0VfT1MyX0hFQURFUiBuZWhkKSB7CisJSU1BR0VfRE9TX0hFQURFUgltemg7CiAKIAlMWlNlZWszMihsemZkLDAsU0VFS19TRVQpOwogCWlmIChzaXplb2YobXpoKSE9TFpSZWFkMzIobHpmZCwmbXpoLHNpemVvZihtemgpKSkKIAkJcmV0dXJuIDA7Ci0JaWYgKG16aC5tel9tYWdpYyE9TVpfU0lHTkFUVVJFKQorCWlmIChtemguZV9tYWdpYyE9SU1BR0VfRE9TX1NJR05BVFVSRSkKIAkJcmV0dXJuIDA7Ci0JTFpTZWVrMzIobHpmZCxtemgubmVfb2Zmc2V0LFNFRUtfU0VUKTsKKwlMWlNlZWszMihsemZkLG16aC5lX2xmYW5ldyxTRUVLX1NFVCk7CiAJTFpSRUFEKG5laGQpOwotCWlmIChuZWhkLT5uZV9tYWdpYyA9PSBORV9TSUdOQVRVUkUpIHsKLQkJTFpTZWVrMzIobHpmZCxtemgubmVfb2Zmc2V0LFNFRUtfU0VUKTsKKwlpZiAobmVoZC0+bmVfbWFnaWMgPT0gSU1BR0VfT1MyX1NJR05BVFVSRSkgeworCQlMWlNlZWszMihsemZkLG16aC5lX2xmYW5ldyxTRUVLX1NFVCk7CiAJCXJldHVybiAxOwogCX0KIAlmcHJpbnRmKHN0ZGVyciwibWlzYy92ZXIuYzpyZWFkX25lX2hlYWRlcjpjYW4ndCBoYW5kbGUgUEUgZmlsZXMgeWV0LlxuIik7CkBAIC00Nyw3ICsxODUsNyBAQAogCiBpbnQKIGZpbmRfbmVfcmVzb3VyY2UoCi0JSEZJTEUzMiBsemZkLHN0cnVjdCBuZV9oZWFkZXJfcyAqbmVoZCxTRUdQVFIgdHlwZWlkLFNFR1BUUiByZXNpZCwKKwlIRklMRTMyIGx6ZmQsTFBJTUFHRV9PUzJfSEVBREVSIG5laGQsU0VHUFRSIHR5cGVpZCxTRUdQVFIgcmVzaWQsCiAJQllURSAqKnJlc2RhdGEsaW50ICpyZXNsZW4sRFdPUkQgKm9mZgogKSB7CiAJTkVfVFlQRUlORk8JdGk7CkBAIC0xNjQsMTEgKzMwMiwxMSBAQAogLyogR2V0RmlsZVJlc291cmNlU2l6ZQkJCQlbVkVSLjJdICovCiBEV09SRAogR2V0RmlsZVJlc291cmNlU2l6ZShMUENTVFIgZmlsZW5hbWUsU0VHUFRSIHJlc3R5cGUsU0VHUFRSIHJlc2lkLExQRFdPUkQgb2ZmKSB7Ci0JSEZJTEUzMglsemZkOwotCU9GU1RSVUNUCW9mczsKLQlCWVRFCSpyZXNkYXRhOwotCWludAlyZXNsZW47Ci0Jc3RydWN0CW5lX2hlYWRlcl9zCW5laGQ7CisJSEZJTEUzMgkJCWx6ZmQ7CisJT0ZTVFJVQ1QJCW9mczsKKwlCWVRFCQkJKnJlc2RhdGE7CisJaW50CQkJcmVzbGVuOworCUlNQUdFX09TMl9IRUFERVIJbmVoZDsKIAogCWRwcmludGZfdmVyKHN0ZGRlYiwiR2V0RmlsZVJlc291cmNlU2l6ZSglcywlbHgsJWx4LCVwKVxuIiwKIAkJZmlsZW5hbWUsKExPTkcpcmVzdHlwZSwoTE9ORylyZXNpZCxvZmYKQEAgLTE5NCwxMSArMzMyLDExIEBACiBHZXRGaWxlUmVzb3VyY2UoTFBDU1RSIGZpbGVuYW1lLFNFR1BUUiByZXN0eXBlLFNFR1BUUiByZXNpZCwKIAkJRFdPUkQgb2ZmLERXT1JEIGRhdGFsZW4sTFBWT0lEIGRhdGEKICkgewotCUhGSUxFMzIJbHpmZDsKLQlPRlNUUlVDVAlvZnM7Ci0JQllURQkqcmVzZGF0YTsKLQlpbnQJcmVzbGVuPWRhdGFsZW47Ci0Jc3RydWN0CW5lX2hlYWRlcl9zCW5laGQ7CisJSEZJTEUzMgkJCWx6ZmQ7CisJT0ZTVFJVQ1QJCW9mczsKKwlCWVRFCQkJKnJlc2RhdGE7CisJaW50CQkJcmVzbGVuPWRhdGFsZW47CisJSU1BR0VfT1MyX0hFQURFUgluZWhkOwogCWRwcmludGZfdmVyKHN0ZGRlYiwiR2V0RmlsZVJlc291cmNlKCVzLCVseCwlbHgsJWxkLCVsZCwlcClcbiIsCiAJCWZpbGVuYW1lLChMT05HKXJlc3R5cGUsKExPTkcpcmVzaWQsb2ZmLGRhdGFsZW4sZGF0YQogCSk7CkBAIC0zODAsMjAgKzUxOCwxNzUgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi0vKiBWZXJGaW5kRmlsZQkJCQlbVkVSLjhdICovCi1EV09SRAotVmVyRmluZEZpbGUxNigKLQlVSU5UMTYgZmxhZ3MsTFBDU1RSIGZpbGVuYW1lLExQQ1NUUiB3aW5kaXIsTFBDU1RSIGFwcGRpciwKLQlMUFNUUiBjdXJkaXIsVUlOVDE2ICpjdXJkaXJsZW4sTFBTVFIgZGVzdGRpcixVSU5UMTYgKmRlc3RkaXJsZW4KLSkgewotCWRwcmludGZfdmVyKHN0ZGRlYiwiVmVyRmluZEZpbGUoJXgsJXMsJXMsJXMsJXAsJWQsJXAsJWQpXG4iLAotCQlmbGFncyxmaWxlbmFtZSx3aW5kaXIsYXBwZGlyLGN1cmRpciwqY3VyZGlybGVuLGRlc3RkaXIsKmRlc3RkaXJsZW4KLQkpOwotCXN0cmNweShjdXJkaXIsIlo6XFxST09UXFwuV0lORVxcIik7LypGSVhNRSovCi0JKmN1cmRpcmxlbj1zdHJsZW4oY3VyZGlyKTsKLQlzdHJjcHkoZGVzdGRpciwiWjpcXFJPT1RcXC5XSU5FXFwiKTsvKkZJWE1FKi8KLQkqZGVzdGRpcmxlbj1zdHJsZW4oZGVzdGRpcik7Ci0JcmV0dXJuIDA7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgIFZlckZpbmRGaWxlKCkgW1ZFUi44XQorICogICBEZXRlcm1pbmVzIHdoZXJlIHRvIGluc3RhbGwgYSBmaWxlIGJhc2VkIG9uIHdoZXRoZXIgaXQgbG9jYXRlcyBhbm90aGVyCisgKiAgIHZlcnNpb24gb2YgdGhlIGZpbGUgaW4gdGhlIHN5c3RlbS4gIFRoZSB2YWx1ZXMgVmVyRmluZEZpbGUgcmV0dXJucyBhcmUKKyAqICAgdXNlZCBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byB0aGUgVmVySW5zdGFsbEZpbGUgZnVuY3Rpb24uCisgKgorICogICBSZXZpc2lvbiBoaXN0b3J5OgorICogICAgICAzMC1NYXktMTk5NyAgIERhdmUgQ3V0aGJlcnQgKGRhY3V0QGVjZS5jbXUuZWR1KQorICogICAgICAgICBSZWltcGxlbWVudGF0aW9uIG9mIFZlckZpbmRGaWxlIGZyb20gb3JpZ2luYWwgc3R1Yi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRFdPUkQgVmVyRmluZEZpbGUxNigKKyAgICBVSU5UMTYgZmxhZ3MsCisgICAgTFBDU1RSIGxwc3pGaWxlbmFtZSwKKyAgICBMUENTVFIgbHBzeldpbkRpciwKKyAgICBMUENTVFIgbHBzekFwcERpciwKKyAgICBMUFNUUiBscHN6Q3VyRGlyLAorICAgIFVJTlQxNiAqbHB1Q3VyRGlyTGVuLAorICAgIExQU1RSIGxwc3pEZXN0RGlyLAorICAgIFVJTlQxNiAqbHB1RGVzdERpckxlbiApCit7CisgICAgRFdPUkQgIHJldHZhbDsKKyAgICBjaGFyICBjdXJEaXJbMjU2XTsKKyAgICBjaGFyICBkZXN0RGlyWzI1Nl07CisgICAgdW5zaWduZWQgaW50ICBjdXJEaXJTaXplUmVxOworICAgIHVuc2lnbmVkIGludCAgZGVzdERpclNpemVSZXE7CisKKyAgICByZXR2YWwgPSAwOworCisgICAgLyogUHJpbnQgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLworICAgIGRwcmludGZfdmVyKHN0ZGRlYiwgIlZlckZpbmRGaWxlKCkgY2FsbGVkIHdpdGggcGFyYW1ldGVyczpcbiIKKwkJIlx0ZmxhZ3MgPSAleCIsIGZsYWdzKTsKKyAgICBpZihmbGFncyAmIFZGRkZfSVNTSEFSRURGSUxFKQorCWRwcmludGZfdmVyKHN0ZGRlYiwgIiAoVkZGRl9JU1NIQVJFREZJTEUpXG4iKTsKKyAgICBlbHNlCisJZHByaW50Zl92ZXIoc3RkZGViLCAiXG4iKTsKKworICAgIGRwcmludGZfdmVyX3N0cmluZygiXHRscHN6RmlsZW5hbWUgPSAiLCBscHN6RmlsZW5hbWUsICJcbiIpOworICAgIGRwcmludGZfdmVyX3N0cmluZygiXHRscHN6V2luRGlyID0gIiwgbHBzeldpbkRpciwgIlxuIik7CisgICAgZHByaW50Zl92ZXJfc3RyaW5nKCJcdGxwc3pBcHBEaXIgPSAiLCBscHN6QXBwRGlyLCAiXG4iKTsKKworICAgIGRwcmludGZfdmVyKHN0ZGRlYiwgIlx0bHBzekN1ckRpciA9ICVwXG4iLCBscHN6Q3VyRGlyKTsKKyAgICBpZihscHVDdXJEaXJMZW4pCisJZHByaW50Zl92ZXIoc3RkZGViLCAiXHRscHVDdXJEaXJMZW4gPSAlcCAoJXUpXG4iLAorCQkgICAgbHB1Q3VyRGlyTGVuLCAqbHB1Q3VyRGlyTGVuKTsKKyAgICBlbHNlCisJZHByaW50Zl92ZXIoc3RkZGViLCAiXHRscHVDdXJEaXJMZW4gPSAobnVsbClcbiIpOworCisgICAgZHByaW50Zl92ZXIoc3RkZGViLCAiXHRscHN6RGVzdERpciA9ICVwXG4iLCBscHN6RGVzdERpcik7CisgICAgaWYobHB1RGVzdERpckxlbikKKwlkcHJpbnRmX3ZlcihzdGRkZWIsICJcdGxwdURlc3REaXJMZW4gPSAlcCAoJXUpXG4iLAorCQkgICAgbHB1RGVzdERpckxlbiwgKmxwdURlc3REaXJMZW4pOworCisgICAgLyogRmlndXJlIG91dCB3aGVyZSB0aGUgZmlsZSBzaG91bGQgZ287IHNoYXJlZCBmaWxlcyBkZWZhdWx0IHRvIHRoZQorICAgICAgIHN5c3RlbSBkaXJlY3RvcnkgKi8KKworICAgIHN0cmNweShjdXJEaXIsICIiKTsKKyAgICBzdHJjcHkoZGVzdERpciwgIiIpOworCisgICAgaWYoZmxhZ3MgJiBWRkZGX0lTU0hBUkVERklMRSAmJiAhZ2V0dWlkKCkpIHsKKwlHZXRTeXN0ZW1EaXJlY3RvcnkzMkEoZGVzdERpciwgMjU2KTsKKworCS8qIFdlcmUgd2UgZ2l2ZW4gYSBmaWxlbmFtZT8gIElmIHNvLCB0cnkgdG8gZmluZCB0aGUgZmlsZS4gKi8KKwlpZihscHN6RmlsZW5hbWUpIHsKKwkgICAgaWYodGVzdEZpbGVFeGlzdGVuY2UoZGVzdERpciwgbHBzekZpbGVuYW1lKSkgeworCQlzdHJjcHkoY3VyRGlyLCBkZXN0RGlyKTsKKworCQlpZighdGVzdEZpbGVFeGNsdXNpdmVFeGlzdGVuY2UoZGVzdERpciwgbHBzekZpbGVuYW1lKSkKKwkJICAgIHJldHZhbCB8PSBWRkZfRklMRUlOVVNFOworCSAgICB9CisJICAgIGVsc2UgaWYobHBzekFwcERpciAmJiB0ZXN0RmlsZUV4aXN0ZW5jZShscHN6QXBwRGlyLAorCQkJCQkJICAgIGxwc3pGaWxlbmFtZSkpIHsKKwkJc3RyY3B5KGN1ckRpciwgbHBzekFwcERpcik7CisJCXJldHZhbCB8PSBWRkZfQ1VSTkVERVNUOworCisJCWlmKCF0ZXN0RmlsZUV4Y2x1c2l2ZUV4aXN0ZW5jZShscHN6QXBwRGlyLCBscHN6RmlsZW5hbWUpKQorCQkgICAgcmV0dmFsIHw9IFZGRl9GSUxFSU5VU0U7CisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UgaWYoIShmbGFncyAmIFZGRkZfSVNTSEFSRURGSUxFKSkgeyAvKiBub3QgYSBzaGFyZWQgZmlsZSAqLworCWlmKGxwc3pBcHBEaXIpIHsKKwkgICAgY2hhciAgc3lzdGVtRGlyWzI1Nl07CisJICAgIEdldFN5c3RlbURpcmVjdG9yeTMyQShzeXN0ZW1EaXIsIDI1Nik7CisKKwkgICAgc3RyY3B5KGRlc3REaXIsIGxwc3pBcHBEaXIpOworCisJICAgIGlmKGxwc3pGaWxlbmFtZSkgeworCQlpZih0ZXN0RmlsZUV4aXN0ZW5jZShscHN6QXBwRGlyLCBscHN6RmlsZW5hbWUpKSB7CisJCSAgICBzdHJjcHkoY3VyRGlyLCBscHN6QXBwRGlyKTsKKworCQkgICAgaWYoIXRlc3RGaWxlRXhjbHVzaXZlRXhpc3RlbmNlKGxwc3pBcHBEaXIsIGxwc3pGaWxlbmFtZSkpCisJCQlyZXR2YWwgfD0gVkZGX0ZJTEVJTlVTRTsKKwkJfQorCQllbHNlIGlmKHRlc3RGaWxlRXhpc3RlbmNlKHN5c3RlbURpciwgbHBzekZpbGVuYW1lKSkgeworCQkgICAgc3RyY3B5KGN1ckRpciwgc3lzdGVtRGlyKTsKKwkJICAgIHJldHZhbCB8PSBWRkZfQ1VSTkVERVNUOworCisJCSAgICBpZighdGVzdEZpbGVFeGNsdXNpdmVFeGlzdGVuY2Uoc3lzdGVtRGlyLCBscHN6RmlsZW5hbWUpKQorCQkJcmV0dmFsIHw9IFZGRl9GSUxFSU5VU0U7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBjdXJEaXJTaXplUmVxID0gc3RybGVuKGN1ckRpcikgKyAxOworICAgIGRlc3REaXJTaXplUmVxID0gc3RybGVuKGRlc3REaXIpICsgMTsKKworCisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgcG9pbnRlcnMgdG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcnMgYXJlCisgICAgICAgdmFsaWQ7IGlmIG5vdCwgZG8gTk9USElORyB3aXRoIHRoYXQgYnVmZmVyLiAgSWYgdGhhdCBwb2ludGVyCisgICAgICAgaXMgdmFsaWQsIHRoZW4gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1ZmZlciBwb2ludGVyIGlzIHZhbGlkLCB0b28hICovCisKKyAgICBpZihscHVEZXN0RGlyTGVuICYmIGxwc3pEZXN0RGlyKSB7CisJaWYoKmxwdURlc3REaXJMZW4gPCBkZXN0RGlyU2l6ZVJlcSkgeworCSAgICByZXR2YWwgfD0gVkZGX0JVRkZUT09TTUFMTDsKKwkgICAgc3RybmNweShscHN6RGVzdERpciwgZGVzdERpciwgKmxwdURlc3REaXJMZW4gLSAxKTsKKwkgICAgbHBzekRlc3REaXJbKmxwdURlc3REaXJMZW4gLSAxXSA9ICdcMCc7CisJfQorCWVsc2UKKwkgICAgc3RyY3B5KGxwc3pEZXN0RGlyLCBkZXN0RGlyKTsKKworCSpscHVEZXN0RGlyTGVuID0gZGVzdERpclNpemVSZXE7CisgICAgfQorICAgIAorICAgIGlmKGxwdUN1ckRpckxlbiAmJiBscHN6Q3VyRGlyKSB7CisJaWYoKmxwdUN1ckRpckxlbiA8IGN1ckRpclNpemVSZXEpIHsKKwkgICAgcmV0dmFsIHw9IFZGRl9CVUZGVE9PU01BTEw7CisJICAgIHN0cm5jcHkobHBzekN1ckRpciwgY3VyRGlyLCAqbHB1Q3VyRGlyTGVuIC0gMSk7CisJICAgIGxwc3pDdXJEaXJbKmxwdUN1ckRpckxlbiAtIDFdID0gJ1wwJzsKKwl9CisJZWxzZQorCSAgICBzdHJjcHkobHBzekN1ckRpciwgY3VyRGlyKTsKKworCSpscHVDdXJEaXJMZW4gPSBjdXJEaXJTaXplUmVxOworICAgIH0KKworICAgIGRwcmludGZfdmVyKHN0ZGRlYiwgIlZlckZpbmRGaWxlKCkgcmV0ID0gJWx1ICIsCisJCXJldHZhbCk7CisKKyAgICBpZihyZXR2YWwpIHsKKwlkcHJpbnRmX3ZlcihzdGRkZWIsICIoICIpOworCisJaWYocmV0dmFsICYgVkZGX0NVUk5FREVTVCkKKwkgICAgZHByaW50Zl92ZXIoc3RkZGViLCAiVkZGX0NVUk5FREVTVCAiKTsKKwlpZihyZXR2YWwgJiBWRkZfRklMRUlOVVNFKQorCSAgICBkcHJpbnRmX3ZlcihzdGRkZWIsICJWRkZfRklMRUlOVVNFICIpOworCWlmKHJldHZhbCAmIFZGRl9CVUZGVE9PU01BTEwpCisJICAgIGRwcmludGZfdmVyKHN0ZGRlYiwgIlZGRl9CVUZGVE9PU01BTEwgIik7CisKKwlkcHJpbnRmX3ZlcihzdGRkZWIsICIpIik7CisgICAgfQorCisgICAgZHByaW50Zl92ZXJfc3RyaW5nKCJcblx0KEV4aXQpIGxwc3pDdXJEaXIgPSAiLCBscHN6Q3VyRGlyLCAiXG4iKTsKKyAgICBpZihscHVDdXJEaXJMZW4pCisJZHByaW50Zl92ZXIoc3RkZGViLCAiXHQoRXhpdCkgbHB1Q3VyRGlyTGVuID0gJXAgKCV1KVxuIiwKKwkJICAgIGxwdUN1ckRpckxlbiwgKmxwdUN1ckRpckxlbik7CisgICAgZWxzZQorCWRwcmludGZfdmVyKHN0ZGRlYiwgIlx0KEV4aXQpIGxwdUN1ckRpckxlbiA9IChudWxsKVxuIik7CisKKyAgICBkcHJpbnRmX3Zlcl9zdHJpbmcoIlx0KEV4aXQpIGxwc3pEZXN0RGlyID0gIiwgbHBzekRlc3REaXIsICJcbiIpOworICAgIGlmKGxwdURlc3REaXJMZW4pCisJZHByaW50Zl92ZXIoc3RkZGViLCAiXHQoRXhpdCkgbHB1RGVzdERpckxlbiA9ICVwICgldSlcbiIsCisJCSAgICBscHVEZXN0RGlyTGVuLCAqbHB1RGVzdERpckxlbik7CisKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAvKiBWZXJGaW5kRmlsZUEJCQkJCQlbVkVSU0lPTi41XSAqLwpkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrLmMgYi9taXNjL3dpbnNvY2suYwppbmRleCA5MjZjNTE0Li43ZjRjMzE0IDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2suYworKysgYi9taXNjL3dpbnNvY2suYwpAQCAtMyw2ICszLDEzIEBACiAgKiAoZnRwLm1pY3Jvc29mdC5jb206L0FkdnN5cy93aW5zb2NrL3NwZWMxMS9XSU5TT0NLLlRYVCkKICAqIAogICogKEMpIDE5OTMsMTk5NCwxOTk2IEpvaG4gQnJlemFrLCBFcmlrIEJvcywgQWxleCBLb3JvYmthLgorICoKKyAqIFRPRE86IE1lcmdlIEFzeW5jLi4uKCkgaGFuZGxpbmcgd2l0aCBYIGV2ZW50IGxvb3AgYnkgYWRkaW5nIAorICoJIHRocmVhZC90YXNrIGZkc2V0IHRvIHNlbGVjdCgyKSBpbiB3aW5kb3dzL2V2ZW50LmMuCisgKiAgICAgICBBbHNvIGZvcmsgZG5zIGxvb2t1cCBoZWxwZXIgZHVyaW5nIHRoZSBzdGFydHVwICh3aXRoIGEgcGlwZSAKKyAqCSBmb3IgY29tbXVuaWNhdGlvbikgYW5kIG1ha2UgaXQgZm9yayBmb3IgYSBkYXRhYmFzZSByZXF1ZXN0CisgKgkgaW5zdGVhZCBvZiBmb3JraW5nIHRoZSBtYWluIHByb2Nlc3MgKGkuZS4gc29tZXRoaW5nIGxpa2UgCisgKgkgTmV0c2NhcGUgNC4wKS4KICAqLwogIAogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0xNDQ2LDcgKzE0NTMsNyBAQAogICBGQVJQUk9DMTYJCXByZXY7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1NldEJsb2NraW5nSG9vayglMDh4KTogaG9vayAlMDh4XG4iLCAKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1NldEJsb2NraW5nSG9vazE2KCUwOHgpOiBob29rICUwOHhcbiIsIAogCQkJICAodW5zaWduZWQpcHdzaSwgKHVuc2lnbmVkKSBscEJsb2NrRnVuYyk7CiAKICAgaWYoIHB3c2kgKSB7IApAQCAtMTQ1OSwxMSArMTQ2NiwxMSBAQAogCiBGQVJQUk9DMzIgV1NBU2V0QmxvY2tpbmdIb29rMzIoRkFSUFJPQzMyIGxwQmxvY2tGdW5jKQogewotICAgIGZwcmludGYoIHN0ZGVyciwgIkVtcHR5IHN0dWIgV1NBU2V0QmxvY2tpbmdIb29rMzIoJXApXG4iLCBscEJsb2NrRnVuYyApOwotICAgIHJldHVybiBOVUxMOworICBmcHJpbnRmKCBzdGRlcnIsICJXU0FTZXRCbG9ja2luZ0hvb2szMiglcCk6IGVtcHR5IHN0dWJcbiIsIGxwQmxvY2tGdW5jICk7CisgIHJldHVybiBOVUxMOwogfQogCi1JTlQxNiBXU0FVbmhvb2tCbG9ja2luZ0hvb2sodm9pZCkKK0lOVDE2IFdTQVVuaG9va0Jsb2NraW5nSG9vazE2KHZvaWQpCiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKQEAgLTE0NzIsNiArMTQ3OSwxMiBAQAogICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQogCitJTlQzMiBXU0FVbmhvb2tCbG9ja2luZ0hvb2szMih2b2lkKQoreworICBmcHJpbnRmKCBzdGRlcnIsICJXU0FVbmhvb2tCbG9ja2luZ0hvb2szMigpOiBlbXB0eSBzdHViXG4iKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKIFZPSUQKIFdzQ29udHJvbChEV09SRCB4MSxEV09SRCB4MixMUERXT1JEIHgzLExQRFdPUkQgeDQsTFBEV09SRCB4NSxMUERXT1JEIHg2KSAKIHsKZGlmZiAtLWdpdCBhL21zZG9zL2lvcG9ydHMuYyBiL21zZG9zL2lvcG9ydHMuYwppbmRleCA3ZTQxY2U4Li5lMzM0ODdhIDEwMDY0NAotLS0gYS9tc2Rvcy9pb3BvcnRzLmMKKysrIGIvbXNkb3MvaW9wb3J0cy5jCkBAIC0xMCw2ICsxMCwxMyBAQAogICAgICBmaXggdGhhdCwgSSBndWVzcy4KICovCiAKKyNpZmRlZiBsaW51eAorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2VuZGlmCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzMsNiArNDAsMTE3IEBACiAgIDB4MWIsIDB4N2IsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4NWYKIH07CiAKKyNpZmRlZiBsaW51eAorY2hhciBkb19kaXJlY3RfcG9ydF9hY2Nlc3MgPSAwOworY2hhciBwb3J0X3Blcm1pc3Npb25zWzB4MTAwMDBdOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgSU9fcG9ydF9pbml0CisgKi8KKworLyogc2V0X0lPX3Blcm1pc3Npb25zKGludCB2YWwxLCBpbnQgdmFsKQorICogSGVscGVyIGZ1bmN0aW9uIGZvciBJT19wb3J0X2luaXQKKyAqLworI2lmZGVmIGxpbnV4Cit2b2lkIHNldF9JT19wZXJtaXNzaW9ucyhpbnQgdmFsMSwgaW50IHZhbCwgY2hhciBydykKK3sKKwlpbnQgajsKKwlpZiAodmFsMSAhPSAtMSkgeworCQlpZiAodmFsID09IC0xKSB2YWwgPSAweDNmZjsJCQorCQlmb3IgKGogPSB2YWwxOyBqIDw9IHZhbDsgaisrKQorCQkJcG9ydF9wZXJtaXNzaW9uc1tqXSB8PSBydzsJCQorCisJCWRvX2RpcmVjdF9wb3J0X2FjY2VzcyA9IDE7CisKKwkJdmFsMSA9IC0xOworCX0gZWxzZSBpZiAodmFsICE9IC0xKSB7CQkKKwkJZG9fZGlyZWN0X3BvcnRfYWNjZXNzID0gMTsKKworCQlwb3J0X3Blcm1pc3Npb25zW3ZhbF0gfD0gcnc7CisJfQorCit9CisKKy8qIGRvX0lPX3BvcnRfaW5pdF9yZWFkX29yX3dyaXRlKGNoYXIqIHRlbXAsIGNoYXIgcncpCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIElPX3BvcnRfaW5pdAorICovCisKK3ZvaWQgZG9fSU9fcG9ydF9pbml0X3JlYWRfb3Jfd3JpdGUoY2hhciogdGVtcCwgY2hhciBydykKK3sKKwlpbnQgdmFsLCB2YWwxLCBpLCBsZW47CisJaWYgKCFzdHJjYXNlY21wKHRlbXAsICJhbGwiKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmchISEgR3JhbnRpbmcgRlVMTCBJTyBwb3J0IGFjY2VzcyB0byIKKwkJCSIgd2luZG96ZSBwcm9ncmFtcyFcbldhcm5pbmchISEgIgorCQkJIioqKiBUSElTIElTIE5PVCBBVCBBTEwgIgorCQkJIlJFQ09NTUVOREVEISEhICoqKlxuIik7CisJCWZvciAoaT0wOyBpIDwgc2l6ZW9mKHBvcnRfcGVybWlzc2lvbnMpOyBpKyspCisJCQlwb3J0X3Blcm1pc3Npb25zW2ldIHw9IHJ3OworCisJfSBlbHNlIGlmICghKCFzdHJjbXAodGVtcCwgIioiKSB8fCAqdGVtcCA9PSAnXDAnKSkgeworCQlsZW4gPSBzdHJsZW4odGVtcCk7CisJCXZhbCA9IC0xOworCQl2YWwxID0gLTE7CQkKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlzd2l0Y2ggKHRlbXBbaV0pIHsKKwkJCWNhc2UgJzAnOgorCQkJCWlmICh0ZW1wW2krMV0gPT0gJ3gnIHx8IHRlbXBbaSsxXSA9PSAnWCcpIHsKKwkJCQkJc3NjYW5mKHRlbXAraSwgIiV4IiwgJnZhbCk7CisJCQkJCWkgKz0gMjsKKwkJCQl9IGVsc2UgeworCQkJCQlzc2NhbmYodGVtcCtpLCAiJWQiLCAmdmFsKTsKKwkJCQl9CisJCQkJd2hpbGUgKGlzeGRpZ2l0KHRlbXBbaV0pKQorCQkJCQlpKys7CisJCQkJaS0tOworCQkJCWJyZWFrOworCQkJY2FzZSAnLCc6CisJCQljYXNlICcgJzoKKwkJCWNhc2UgJ1x0JzoKKwkJCQlzZXRfSU9fcGVybWlzc2lvbnModmFsMSwgdmFsLCBydyk7CisJCQkJdmFsMSA9IC0xOyB2YWwgPSAtMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJy0nOgorCQkJCXZhbDEgPSB2YWw7CisJCQkJaWYgKHZhbDEgPT0gLTEpIHZhbDEgPSAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAodGVtcFtpXSA+PSAnMCcgJiYgdGVtcFtpXSA8PSAnOScpIHsKKwkJCQkJc3NjYW5mKHRlbXAraSwgIiVkIiwgJnZhbCk7CisJCQkJCXdoaWxlIChpc2RpZ2l0KHRlbXBbaV0pKQorCQkJCQkJaSsrOworCQkJCX0KKwkJCX0KKwkJfQorCQlzZXRfSU9fcGVybWlzc2lvbnModmFsMSwgdmFsLCBydyk7CQkKKwl9Cit9CisKKyNlbmRpZgorCit2b2lkIElPX3BvcnRfaW5pdCgpCit7CisjaWZkZWYgbGludXgKKwljaGFyIHRlbXBbMTAyNF07CisKKwltZW1zZXQocG9ydF9wZXJtaXNzaW9ucywgMCwgc2l6ZW9mKHBvcnRfcGVybWlzc2lvbnMpKTsKKwlkb19kaXJlY3RfcG9ydF9hY2Nlc3MgPSAwOworCisJLyogQ2FuIHdlIGRvIHRoYXQ/ICovCisJaWYgKCFpb3BsKDMpKSB7CisJCWlvcGwoMCk7CisKKwkJUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAicG9ydHMiLCAicmVhZCIsICIqIiwKKwkJCQkJIHRlbXAsIHNpemVvZih0ZW1wKSApOworCQlkb19JT19wb3J0X2luaXRfcmVhZF9vcl93cml0ZSh0ZW1wLCAxKTsKKwkJUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAicG9ydHMiLCAid3JpdGUiLCAiKiIsCisJCQkJCSB0ZW1wLCBzaXplb2YodGVtcCkgKTsKKwkJZG9fSU9fcG9ydF9pbml0X3JlYWRfb3Jfd3JpdGUodGVtcCwgMik7CisJfQorCisKKyNlbmRpZgorfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgIElPX2lucG9ydApAQCAtNDAsMjcgKzE1OCw0NiBAQAogRFdPUkQgSU9faW5wb3J0KCBpbnQgcG9ydCwgaW50IGNvdW50ICkKIHsKICAgICBEV09SRCByZXMgPSAwOwotICAgIEJZVEUgYjsKKyAgICBCWVRFIGI7ICAgIAogCi0gICAgZHByaW50Zl9pbnQoc3RkZGViLCAiSU86ICVkIGJ5dGVzIGZyb20gcG9ydCAweCUwMnhcbiIsIGNvdW50LCBwb3J0ICk7CisjaWZkZWYgbGludXggICAgCisgICAgaWYgKGRvX2RpcmVjdF9wb3J0X2FjY2VzcykgaW9wbCgzKTsKKyNlbmRpZgorCisgICAgZHByaW50Zl9pbnQoc3RkZGViLCAiSU86ICVkIGJ5dGVzIGZyb20gcG9ydCAweCUwMnggIiwgY291bnQsIHBvcnQgKTsKIAogICAgIHdoaWxlIChjb3VudC0tID4gMCkKICAgICB7Ci0gICAgICAgIHN3aXRjaCAocG9ydCsrKQotCXsKLQljYXNlIDB4NzA6Ci0gICAgICAgICAgICBiID0gY21vc2FkZHJlc3M7Ci0gICAgICAgICAgICBicmVhazsKLQljYXNlIDB4NzE6Ci0gICAgICAgICAgICBiID0gY21vc2ltYWdlW2Ntb3NhZGRyZXNzICYgMHgzZl07Ci0gICAgICAgICAgICBicmVhazsKLQlkZWZhdWx0OgotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRGlyZWN0IEkvTyByZWFkIGF0dGVtcHRlZCBmcm9tIHBvcnQgJXhcbiIsIHBvcnQpOwotICAgICAgICAgICAgYiA9IDB4ZmY7Ci0gICAgICAgICAgICBicmVhazsKLQl9Ci0gICAgICAgIHJlcyA9IChyZXMgPDwgOCkgfCBiOworI2lmZGVmIGxpbnV4CisJICAgIGlmKHBvcnRfcGVybWlzc2lvbnNbcG9ydF0gJiAxKSB7CQkgICAgCisJCSAgICBiID0gaW5iKHBvcnQpOworCSAgICB9IGVsc2UgCisjZW5kaWYKKwkgICAgeworCQkgICAgc3dpdGNoIChwb3J0KQorCQkgICAgeworCQkgICAgY2FzZSAweDcwOgorCQkJICAgIGIgPSBjbW9zYWRkcmVzczsKKwkJCSAgICBicmVhazsKKwkJICAgIGNhc2UgMHg3MToKKwkJCSAgICBiID0gY21vc2ltYWdlW2Ntb3NhZGRyZXNzICYgMHgzZl07CisJCQkgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkJICAgIGZwcmludGYoIHN0ZGVyciwgCisJCQkJICAgICJEaXJlY3QgSS9PIHJlYWQgYXR0ZW1wdGVkICIKKwkJCQkgICAgImZyb20gcG9ydCAleFxuIiwgcG9ydCk7CisJCQkgICAgYiA9IDB4ZmY7CisJCQkgICAgYnJlYWs7CisJCSAgICB9CisJICAgIH0KKworCSAgICBwb3J0Kys7CisJICAgIHJlcyA9IChyZXMgPDwgOCkgfCBiOwogICAgIH0KKyNpZmRlZiBsaW51eAorICAgIGlmIChkb19kaXJlY3RfcG9ydF9hY2Nlc3MpIGlvcGwoMCk7CisjZW5kaWYKKyAgICBkcHJpbnRmX2ludChzdGRkZWIsICIoIDB4JXggKVxuIiwgcmVzICk7CiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtNzUsMjEgKzIxMiwzNyBAQAogICAgIGRwcmludGZfaW50KCBzdGRkZWIsICJJTzogMHglbHggKCVkIGJ5dGVzKSB0byBwb3J0IDB4JTAyeFxuIiwKICAgICAgICAgICAgICAgICAgdmFsdWUsIGNvdW50LCBwb3J0ICk7CiAKKyNpZmRlZiBsaW51eAorICAgIGlmIChkb19kaXJlY3RfcG9ydF9hY2Nlc3MpIGlvcGwoMyk7CisjZW5kaWYKKwogICAgIHdoaWxlIChjb3VudC0tID4gMCkKICAgICB7CiAgICAgICAgIGIgPSB2YWx1ZSAmIDB4ZmY7CiAgICAgICAgIHZhbHVlID4+PSA4OwotICAgICAgICBzd2l0Y2ggKHBvcnQrKykKKyNpZmRlZiBsaW51eAorCWlmIChwb3J0X3Blcm1pc3Npb25zW3BvcnRdICYgMikgeworCQlvdXRiKGIsIHBvcnQpOworCX0gZWxzZSAKKyNlbmRpZgogCXsKLQljYXNlIDB4NzA6Ci0gICAgICAgICAgICBjbW9zYWRkcmVzcyA9IGIgJiAweDdmOwotICAgICAgICAgICAgYnJlYWs7Ci0JY2FzZSAweDcxOgotICAgICAgICAgICAgY21vc2ltYWdlW2Ntb3NhZGRyZXNzICYgMHgzZl0gPSBiOwotICAgICAgICAgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkRpcmVjdCBJL08gd3JpdGUgYXR0ZW1wdGVkIHRvIHBvcnQgJXhcbiIsIHBvcnQgKTsKLSAgICAgICAgICAgIGJyZWFrOworCQlzd2l0Y2ggKHBvcnQpCisJCXsKKwkJY2FzZSAweDcwOgorCQkJY21vc2FkZHJlc3MgPSBiICYgMHg3ZjsKKwkJCWJyZWFrOworCQljYXNlIDB4NzE6CisJCQljbW9zaW1hZ2VbY21vc2FkZHJlc3MgJiAweDNmXSA9IGI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoIHN0ZGVyciwgIkRpcmVjdCBJL08gd3JpdGUgYXR0ZW1wdGVkICIKKwkJCQkidG8gcG9ydCAleFxuIiwgcG9ydCApOworCQkJYnJlYWs7CisJCX0KIAl9CisJcG9ydCsrOwogICAgIH0KKyNpZmRlZiBsaW51eAorICAgIGlmIChkb19kaXJlY3RfcG9ydF9hY2Nlc3MpIGlvcGwoMCk7CisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvYXVkaW8uYyBiL211bHRpbWVkaWEvYXVkaW8uYwppbmRleCAzMWFmMzE4Li41MTczMjVmIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL2F1ZGlvLmMKKysrIGIvbXVsdGltZWRpYS9hdWRpby5jCkBAIC04NywxNSArODcsMzkgQEAKIHsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX05vdGlmeUNsaWVudCAvLyB3RGV2SUQgPSAlMDRYIHdNc2cgPSAlZCBkd1Bhcm0xID0gJTA0bFggZHdQYXJhbTIgPSAlMDRsWFxuIix3RGV2SUQsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAKLQlpZiAod0RldklEID4gTUFYX1dBVk9VVERSVikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwlzd2l0Y2ggKHdNc2cpIHsKKwljYXNlIFdPTV9PUEVOOgorCWNhc2UgV09NX0NMT1NFOgorCWNhc2UgV09NX0RPTkU6CisJICBpZiAod0RldklEID4gTUFYX1dBVk9VVERSVikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwkgIAorCSAgaWYgKFdPdXREZXZbd0RldklEXS53RmxhZ3MgIT0gRENCX05VTEwgJiYgIURyaXZlckNhbGxiYWNrKAorCQlXT3V0RGV2W3dEZXZJRF0ud2F2ZURlc2MuZHdDYWxsQmFjaywgCisJCVdPdXREZXZbd0RldklEXS53RmxhZ3MsIAorCQlXT3V0RGV2W3dEZXZJRF0ud2F2ZURlc2MuaFdhdmUsIAorICAgICAgICAgICAgICAgIHdNc2csIAorCQlXT3V0RGV2W3dEZXZJRF0ud2F2ZURlc2MuZHdJbnN0YW5jZSwgCisgICAgICAgICAgICAgICAgZHdQYXJhbTEsIAorICAgICAgICAgICAgICAgIGR3UGFyYW0yKSkgeworCSAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCSAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKKwkgIH0KKwkgIGJyZWFrOwogCi0JaWYgKFdJbkRldlt3RGV2SURdLndGbGFncyAhPSBEQ0JfTlVMTCAmJiAhRHJpdmVyQ2FsbGJhY2soCisJY2FzZSBXSU1fT1BFTjoKKwljYXNlIFdJTV9DTE9TRToKKwljYXNlIFdJTV9EQVRBOgorCSAgaWYgKHdEZXZJRCA+IE1BWF9XQVZJTkRSVikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwkgIAorCSAgaWYgKFdJbkRldlt3RGV2SURdLndGbGFncyAhPSBEQ0JfTlVMTCAmJiAhRHJpdmVyQ2FsbGJhY2soCiAJCVdJbkRldlt3RGV2SURdLndhdmVEZXNjLmR3Q2FsbEJhY2ssIFdJbkRldlt3RGV2SURdLndGbGFncywgCiAJCVdJbkRldlt3RGV2SURdLndhdmVEZXNjLmhXYXZlLCB3TXNnLCAKIAkJV0luRGV2W3dEZXZJRF0ud2F2ZURlc2MuZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKSkgewotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwotCQlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKLQkJfQorCSAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCSAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKKwkgIH0KKwkgIGJyZWFrOworCX0KICAgICAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTEzOSw3ICsxNjMsNyBAQAogCQlscHN0ckVsZW1lbnROYW1lID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpOwogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsCiAJCQkJCQlscHN0ckVsZW1lbnROYW1lKTsKLQkJaWYgKHN0cmxlbihscHN0ckVsZW1lbnROYW1lKSA+IDApIHsKKwkJaWYgKCBscHN0ckVsZW1lbnROYW1lICYmIChzdHJsZW4obHBzdHJFbGVtZW50TmFtZSkgPiAwKSkgewogCQkJc3RyY3B5KHN0ciwgbHBzdHJFbGVtZW50TmFtZSk7CiAJCQlDaGFyVXBwZXIzMkEoc3RyKTsKIAkJCU1DSVdhdkRldlt3RGV2SURdLmhGaWxlID0gbW1pb09wZW4oc3RyLCBOVUxMLCAKQEAgLTE1Niw3ICsxODAsOSBAQAogCW1lbWNweSgmTUNJV2F2RGV2W3dEZXZJRF0ub3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX1dBVkVfT1BFTl9QQVJNUykpOwogCU1DSVdhdkRldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKIAlscFdhdmVGb3JtYXQgPSAmTUNJV2F2RGV2W3dEZXZJRF0uV2F2ZUZvcm1hdDsKKwogCWhEZXNjID0gVVNFUl9IRUFQX0FMTE9DKHNpemVvZihXQVZFT1BFTkRFU0MpKTsKKwlpZiAoaERlc2MgPT0gMCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsgICAvKiBpcyB0aGlzIHJpZ2h0ID8gKi8KIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoRGVzYyk7CiAJbHBEZXNjLT5oV2F2ZSA9IDA7CiAvKgpAQCAtMjQwLDggKzI2Niw4IEBACiAgICBNQ0lfV0FWRV9JTlBVVCBmbGFnLiBObyBleHBsaWNpdCBjaGVjayBvbiBNQ0lfV0FWRV9PVVRQVVQgaXMgZG9uZSBzaW5jZSB0aGF0CiAgICBpcyB0aGUgZGVmYXVsdC4KIAotICAgVGhlIGZsYWdzIE1DSV9OT1RJRlkgKGFuZCB0aGUgY2FsbGJhY2sgcGFyYW1ldGVyIGluIGxwUGFybXMpIGFuZCBNQ0lfV0FJVCBhcmUKLSAgIGlnbm9yZWQKKyAgIFRoZSBmbGFncyBNQ0lfTk9USUZZIChhbmQgdGhlIGNhbGxiYWNrIHBhcmFtZXRlciBpbiBscFBhcm1zKSBhbmQgTUNJX1dBSVQKKyAgIGFyZSBpZ25vcmVkCiAqLwogCiAgICAgICAgIERXT1JEICAgICAgICAgIGR3UmV0OwpAQCAtNDg0LDEwICs1MTAsMTcgQEAKICovCiBzdGF0aWMgRFdPUkQgV0FWRV9tY2lTdG9wKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKKyAgICAgICAgRFdPUkQgZHdSZXQ7CisKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkiV0FWRV9tY2lTdG9wKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCXJldHVybiAwOworCWlmIChNQ0lXYXZEZXZbd0RldklEXS5mSW5wdXQpCisJICBkd1JldCA9IHdpZE1lc3NhZ2Uod0RldklELCBXSURNX1NUT1AsIDAsIGR3RmxhZ3MsIChEV09SRClscFBhcm1zKTsKKwllbHNlCisJICBkd1JldCA9IHdvZE1lc3NhZ2Uod0RldklELCBXT0RNX1NUT1AsIDAsIGR3RmxhZ3MsIChEV09SRClscFBhcm1zKTsKKwkgIAorCXJldHVybiBkd1JldDsKIH0KIAogCkBAIC00OTYsMTAgKzUyOSwxNyBAQAogKi8KIHN0YXRpYyBEV09SRCBXQVZFX21jaVBhdXNlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKKyAgICAgICAgRFdPUkQgZHdSZXQ7CisKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkiV0FWRV9tY2lQYXVzZSgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlyZXR1cm4gMDsKKwlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uZklucHV0KQorCSAgZHdSZXQgPSB3aWRNZXNzYWdlKHdEZXZJRCwgV0lETV9QQVVTRSwgMCwgZHdGbGFncywgKERXT1JEKWxwUGFybXMpOworCWVsc2UKKwkgIGR3UmV0ID0gd29kTWVzc2FnZSh3RGV2SUQsIFdPRE1fUEFVU0UsIDAsIGR3RmxhZ3MsIChEV09SRClscFBhcm1zKTsKKworCXJldHVybiBkd1JldDsKIH0KIAogCkBAIC03OTQsNiArODM0LDcgQEAKIAlscENhcHMtPndQaWQgPSAweDAwMDE7IAkvKiBQcm9kdWN0IElEICovCiAJc3RyY3B5KGxwQ2Fwcy0+c3pQbmFtZSwgIkxpbnV4IFdBVk9VVCBEcml2ZXIiKTsKICNlbmRpZgorCWxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSAweDAxMDA7CiAJbHBDYXBzLT5kd0Zvcm1hdHMgPSAweDAwMDAwMDAwOwogCWxwQ2Fwcy0+ZHdTdXBwb3J0ID0gV0FWRUNBUFNfVk9MVU1FOwogCWxwQ2Fwcy0+d0NoYW5uZWxzID0gKElPQ1RMKGF1ZGlvLCBTTkRDVExfRFNQX1NURVJFTywgZHNwX3N0ZXJlbykgIT0gMCkgPyAxIDogMjsKQEAgLTg5Miw3ICs5MzMsNiBAQAogCW1lbWNweSgmV091dERldlt3RGV2SURdLndhdmVEZXNjLCBscERlc2MsIHNpemVvZihXQVZFT1BFTkRFU0MpKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gbHBEZXNjLT5scEZvcm1hdCA9ICVwXG4iLGxwRGVzYy0+bHBGb3JtYXQpOwogICAgICAgICBscEZvcm1hdCA9IChMUFdBVkVGT1JNQVQpIFBUUl9TRUdfVE9fTElOKGxwRGVzYy0+bHBGb3JtYXQpOyAKLS8qCWxwRm9ybWF0ID0gbHBEZXNjLT5scEZvcm1hdDsgKi8KIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gbHBGb3JtYXQgPSAlcFxuIixscEZvcm1hdCk7CiAJaWYgKGxwRm9ybWF0LT53Rm9ybWF0VGFnICE9IFdBVkVfRk9STUFUX1BDTSkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gQmFkIGZvcm1hdCAlMDRYICFcbiIsCkBAIC05NDEsNiArOTgxLDcgQEAKIHN0YXRpYyBEV09SRCB3b2RDbG9zZShXT1JEIHdEZXZJRCkKIHsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RDbG9zZSgldSk7XG4iLCB3RGV2SUQpOworCWlmICh3RGV2SUQgPiBNQVhfV0FWT1VURFJWKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAlpZiAoV091dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kQ2xvc2UnIC8vIGNhbid0IGNsb3NlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTk1OSwxMCArMTAwMCwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQl3b2RXcml0ZQkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgd29kV3JpdGUoV09SRCB3RGV2SUQsIExQV0FWRUhEUiBscFdhdmVIZHIsIERXT1JEIGR3U2l6ZSkKK3N0YXRpYyBEV09SRCB3b2RXcml0ZShXT1JEIHdEZXZJRCwgRFdPUkQgbHBXSCwgRFdPUkQgZHdTaXplKQogewogCWludAkJY291bnQ7Ci0JTFBTVFIJbHBEYXRhOworCUxQU1RSCSAgICAgICAgbHBEYXRhOworCUxQV0FWRUhEUiAgICAgICBscFdhdmVIZHIgPSAoTFBXQVZFSERSKVBUUl9TRUdfVE9fTElOKGxwV0gpOworCiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kV3JpdGUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKIAlpZiAoV091dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewogICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kV3JpdGUnIC8vIGNhbid0IHBsYXkgIVxuIik7CkBAIC05ODgsNyArMTAzMSw3IEBACiAJV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgKz0gY291bnQ7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0lOUVVFVUU7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzIHw9IFdIRFJfRE9ORTsKLQlpZiAoV0FWRV9Ob3RpZnlDbGllbnQod0RldklELCBXT01fRE9ORSwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CisJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV09NX0RPTkUsIGxwV0gsIDApICE9IE1NU1lTRVJSX05PRVJST1IpIHsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFdyaXRlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAkJfQpAQCAtMTA0NCw3ICsxMDg3LDEzIEBACiAJaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFJlc3RhcnQnIC8vIGNhbid0IHJlc3RhcnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotCQl9CisJfQorCS8qIEZJWE1FOiBpcyBOb3RpZnlDbGllbnQgd2l0aCBXT01fRE9ORSByaWdodCA/IChDb21ldCBCdXN0ZXJzIDEuMy4zIG5lZWRzIHRoaXMgbm90aWZpY2F0aW9uKSAqLworICAgICAgIAlpZiAoV0FWRV9Ob3RpZnlDbGllbnQod0RldklELCBXT01fRE9ORSwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CisgICAgICAgICAgICAgICAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFJlc3RhcnQnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisgICAgICAgICAgICAgICAJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CisgICAgICAgIH0KKwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQogCkBAIC0xMTgxLDkgKzEyMzAsMTEgQEAKIAkJY2FzZSBXT0RNX0NMT1NFOgogCQkJcmV0dXJuIHdvZENsb3NlKHdEZXZJRCk7CiAJCWNhc2UgV09ETV9XUklURToKLQkJCXJldHVybiB3b2RXcml0ZSh3RGV2SUQsIChMUFdBVkVIRFIpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLCBkd1BhcmFtMik7CisJCQlyZXR1cm4gd29kV3JpdGUod0RldklELCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCQljYXNlIFdPRE1fUEFVU0U6CiAJCQlyZXR1cm4gMEw7CisJICAgICAgICBjYXNlIFdPRE1fU1RPUDoKKwkJCXJldHVybiAwTDsKIAkJY2FzZSBXT0RNX0dFVFBPUzoKIAkJCXJldHVybiB3b2RHZXRQb3NpdGlvbih3RGV2SUQsIChMUE1NVElNRSlQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksIGR3UGFyYW0yKTsKIAkJY2FzZSBXT0RNX0JSRUFLTE9PUDoKQEAgLTEzNDQsNyArMTM5NSw2IEBACiAJV0luRGV2W3dEZXZJRF0uZHdUb3RhbFJlY29yZGVkID0gMDsKIAltZW1jcHkoJldJbkRldlt3RGV2SURdLndhdmVEZXNjLCBscERlc2MsIHNpemVvZihXQVZFT1BFTkRFU0MpKTsKICAgICAgICAgbHBGb3JtYXQgPSAoTFBXQVZFRk9STUFUKSBQVFJfU0VHX1RPX0xJTihscERlc2MtPmxwRm9ybWF0KTsgCi0vKiAgICAgICAgbHBGb3JtYXQgPSBscERlc2MtPmxwRm9ybWF0OyAqLwogCWlmIChscEZvcm1hdC0+d0Zvcm1hdFRhZyAhPSBXQVZFX0ZPUk1BVF9QQ00pIHsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dpZE9wZW4nIC8vIEJhZCBmb3JtYXQgJTA0WCAhXG4iLAogCQkJCQlscEZvcm1hdC0+d0Zvcm1hdFRhZyk7CkBAIC0xMzg3LDYgKzE0MzcsNyBAQAogc3RhdGljIERXT1JEIHdpZENsb3NlKFdPUkQgd0RldklEKQogewogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZENsb3NlKCV1KTtcbiIsIHdEZXZJRCk7CisJaWYgKHdEZXZJRCA+IE1BWF9XQVZJTkRSVikgcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkQ2xvc2UnIC8vIGNhbid0IGNsb3NlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTE1MjEsNiArMTU3Miw5IEBACiAJCVdJbkRldlt3RGV2SURdLmR3VG90YWxSZWNvcmRlZCArPSBscFdJSGRyLT5kd0J5dGVzUmVjb3JkZWQ7CiAJCWxwV0lIZHItPmR3RmxhZ3MgJj0gfldIRFJfSU5RVUVVRTsKIAkJbHBXSUhkci0+ZHdGbGFncyB8PSBXSERSX0RPTkU7CisKKy8qIEZJWE1FIGhlcmUgc2hvdWxkIGJlIGEgc2VnbWVudGVkIGFkZHJlc3MgaW4gc3RlYWQgb2YgbHBXSUhkciAqLworCiAJCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdJTV9EQVRBLCAoRFdPUkQpbHBXSUhkciwgMEwpICE9IAogCQkJTU1TWVNFUlJfTk9FUlJPUikgewogCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwJIkxpbnV4ICd3aWRTdGFydCcgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKQEAgLTE1MzAsNyArMTU4NCw3IEBACiAJCWNvdW50Kys7CiAJCX0KIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3aWRTdGFydCAvLyBlbmQgb2YgcmVjb3JkaW5nICFcbiIpOwotCWZmbHVzaChzdGRvdXQpOworCWZmbHVzaChzdGRkZWIpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQogCkBAIC0xNjU4LDYgKzE3MTIsOCBAQAogCQkJcmV0dXJuIHdpZFJlc2V0KHdEZXZJRCk7CiAJCWNhc2UgV0lETV9TVEFSVDoKIAkJCXJldHVybiB3aWRTdGFydCh3RGV2SUQpOworCQljYXNlIFdJRE1fUEFVU0U6CisJCQlyZXR1cm4gd2lkU3RvcCh3RGV2SUQpOwogCQljYXNlIFdJRE1fU1RPUDoKIAkJCXJldHVybiB3aWRTdG9wKHdEZXZJRCk7CiAJCWRlZmF1bHQ6CkBAIC0xNzI4LDYgKzE3ODQsNDIgQEAKIAkJCXJldHVybiBXQVZFX21jaUdldERldkNhcHMoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRVRERVZDQVBTX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CiAJCWNhc2UgTUNJX0lORk86CiAJCQlyZXR1cm4gV0FWRV9tY2lJbmZvKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfSU5GT19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOworCisgICAgICAgICAgICAgICAgY2FzZSBNQ0lfTE9BRDoKKwkJCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CisJCWNhc2UgTUNJX1NBVkU6CisJCQlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOworCQljYXNlIE1DSV9TRUVLOgorCQkJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKKwkJY2FzZSBNQ0lfRlJFRVpFOgorCQkJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKKwkJY2FzZSBNQ0lfUFVUOgorCQkJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKKwkJY2FzZSBNQ0lfUkVBTElaRToKKwkJCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CisJCWNhc2UgTUNJX1VORlJFRVpFOgorCQkJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKKwkJY2FzZSBNQ0lfVVBEQVRFOgorCQkJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKKwkJY2FzZSBNQ0lfV0hFUkU6CisJCQlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOworCQljYXNlIE1DSV9XSU5ET1c6CisJCQlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOworCQljYXNlIE1DSV9TVEVQOgorCQkJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKKwkJY2FzZSBNQ0lfU1BJTjoKKwkJCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CisJCWNhc2UgTUNJX0VTQ0FQRToKKwkJCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CisJCWNhc2UgTUNJX0NPUFk6CisJCQlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOworCQljYXNlIE1DSV9DVVQ6CisJCQlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOworCQljYXNlIE1DSV9ERUxFVEU6CisJCQlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOworCQljYXNlIE1DSV9QQVNURToKKwkJCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CisKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RGV2SUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCQl9CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21jaXN0cmluZy5jIGIvbXVsdGltZWRpYS9tY2lzdHJpbmcuYwppbmRleCA0MjlmMmIyLi5iZTZjNzA2IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaXN0cmluZy5jCisrKyBiL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKQEAgLTM1MCwxMyArMzUwLDEzIEBACiAJaT0wOwogCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgewogCQlGTEFHMSgic2hhcmVhYmxlIixNQ0lfT1BFTl9TSEFSRUFCTEUpOwotCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwiYWxpYXMiKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaV0sImFsaWFzIikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CiAJCQlkd0ZsYWdzIHw9IE1DSV9PUEVOX0FMSUFTOwogCQkJcFUtPm9wZW5QYXJhbXMubHBzdHJBbGlhcz1TRUdQVFJfR0VUKFNFR1BUUl9TVFJEVVAoa2V5d29yZHNbaSsxXSkpOwogCQkJaSs9MjsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmICghc3RyY21wKGtleXdvcmRzW2ldLCJlbGVtZW50IikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CisJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJlbGVtZW50IikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CiAJCQlkd0ZsYWdzIHw9IE1DSV9PUEVOX0VMRU1FTlQ7CiAJCQlwVS0+b3BlblBhcmFtcy5scHN0ckVsZW1lbnROYW1lPVNFR1BUUl9HRVQoU0VHUFRSX1NUUkRVUChrZXl3b3Jkc1tpKzFdKSk7CiAJCQlpKz0yOwpAQCAtMjEwNCw3ICsyMTA0LDcgQEAKIERXT1JEIG1jaVNlbmRTdHJpbmcgKExQQ1NUUiBscHN0ckNvbW1hbmQsIExQU1RSIGxwc3RyUmV0dXJuU3RyaW5nLCAKIAlVSU5UMTYgdVJldHVybkxlbmd0aCwgSFdORDE2IGh3bmRDYWxsYmFjaykKIHsKLQljaGFyCSpjbWQsKmRldiwqYXJncywqKmtleXdvcmRzOworCWNoYXIJKmNtZCwqZGV2LCphcmdzLCoqa2V5d29yZHMsKmZpbGVuYW1lOwogCVdPUkQJdURldlR5cD0wLHdEZXZJRD0wOwogCURXT1JECWR3RmxhZ3M7CiAJaW50CXJlcz0wLGksbnJvZmtleXdvcmRzOwpAQCAtMjE0MywxNiArMjE0MywyMyBAQAogCX0KIAlkd0ZsYWdzID0gMDsgLyogZGVmYXVsdCBmbGFncyAqLwogCWZvciAoaT0wO2k8bnJvZmtleXdvcmRzOykgeworCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwidHlwZSIpKSB7CisJCQlmaWxlbmFtZSA9IGRldjsKKwkJCWRldiA9IGtleXdvcmRzW2krMV07CisJCQltZW1jcHkoa2V5d29yZHMraSxrZXl3b3JkcysoaSsyKSwobnJvZmtleXdvcmRzLWktMikqc2l6ZW9mKGNoYXIgKikpOworCQkJbnJvZmtleXdvcmRzIC09IDI7CisJCQljb250aW51ZTsKKwkJfQogCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwid2FpdCIpKSB7CiAJCQlkd0ZsYWdzIHw9IE1DSV9XQUlUOwotCQkJbWVtY3B5KGtleXdvcmRzK2ksa2V5d29yZHMrKGkrMSksbnJvZmtleXdvcmRzLWktMSk7CisJCQltZW1jcHkoa2V5d29yZHMraSxrZXl3b3JkcysoaSsxKSwobnJvZmtleXdvcmRzLWktMSkqc2l6ZW9mKGNoYXIgKikpOwogCQkJbnJvZmtleXdvcmRzLS07CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwibm90aWZ5IikpIHsKIAkJCS8qIGhvdyBzaG91bGQgd2UgY2FsbGJhY2s/ICBJIGRvbid0IGtub3cuICovCiAJCQkvKmR3RmxhZ3MgfD0gTUNJX05PVElGWTsqLwotCQkJbWVtY3B5KGtleXdvcmRzK2ksa2V5d29yZHMrKGkrMSksbnJvZmtleXdvcmRzLWktMSk7CisJCQltZW1jcHkoa2V5d29yZHMraSxrZXl3b3JkcysoaSsxKSwobnJvZmtleXdvcmRzLWktMSkqc2l6ZW9mKGNoYXIgKikpOwogCQkJbnJvZmtleXdvcmRzLS07CiAJCQljb250aW51ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taWRpLmMgYi9tdWx0aW1lZGlhL21pZGkuYwppbmRleCBhNDQ0NmUzLi40NzA2YTQ1IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21pZGkuYworKysgYi9tdWx0aW1lZGlhL21pZGkuYwpAQCAtNSw3ICs1LDEwIEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgpAQCAtMjMsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgogI2VsaWYgX19GcmVlQlNEX18KICNpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPHN5cy9lcnJuby5oPgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCmluZGV4IDEwZDc4MGQuLmU4ZDA5NGEgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYworKysgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAidXNlci5oIgpAQCAtMjMsNiArMjQsNyBAQAogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKIAogc3RhdGljIGludAlJbnN0YWxsZWRDb3VudDsKIHN0YXRpYyBpbnQJSW5zdGFsbGVkTGlzdExlbjsKQEAgLTI2OSw2ICsyNzEsOCBAQAogQk9PTDE2IERyaXZlckNhbGxiYWNrKERXT1JEIGR3Q2FsbEJhY2ssIFVJTlQxNiB1RmxhZ3MsIEhBTkRMRTE2IGhEZXYsIAogCQlXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogeworCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAiRHJpdmVyQ2FsbGJhY2soJTA4bFgsICUwNFgsICUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpOyAhXG4iLAogCQlkd0NhbGxCYWNrLCB1RmxhZ3MsIGhEZXYsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2godUZsYWdzICYgRENCX1RZUEVNQVNLKSB7CkBAIC0yNzYsNyArMjgwLDE0IEBACiAJCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIkRyaXZlckNhbGxiYWNrKCkgLy8gQ0FMTEJBQ0tfTlVMTCAhXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIERDQl9XSU5ET1c6Ci0JCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIkRyaXZlckNhbGxiYWNrKCkgLy8gQ0FMTEJBQ0tfV0lORE9XICFcbiIpOworCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJEcml2ZXJDYWxsYmFjaygpIC8vIENBTExCQUNLX1dJTkRPVyA9ICUwNGxYIVxuIixkd0NhbGxCYWNrKTsKKwkJCWlmICghSXNXaW5kb3czMihkd0NhbGxCYWNrKSkgcmV0dXJuIEZBTFNFOworCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJEcml2ZXJDYWxsYmFjaygpIC8vIERldmljZSBIYW5kbGUgPSAlMDRYXG4iLCBoRGV2KTsKKwkJCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhEZXYpOworCQkJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKwkJCWRwcmludGZfbW1zeXMoc3RkZGViLCAiRHJpdmVyQ2FsbGJhY2soKSAvLyBCZWZvcmUgUG9zdE1lc3NhZ2UxNlxuIik7CisJCQlQb3N0TWVzc2FnZTE2KChIV05EMTYpZHdDYWxsQmFjaywgd01zZywgaERldiwgZHdQYXJhbTEpOwogCQkJYnJlYWs7CiAJCWNhc2UgRENCX1RBU0s6CiAJCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIkRyaXZlckNhbGxiYWNrKCkgLy8gQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKQEAgLTg1NSw3ICs4NjYsOCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1jaVNvdW5kCQkJCVtpbnRlcm5hbF0KLSovCisqICBub3QgdXNlZCBhbnltb3JlID8/CisKIERXT1JEIG1jaVNvdW5kKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX1NPVU5EX1BBUk1TIGxwUGFybXMpCiB7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKQEAgLTg2Myw3ICs4NzUsOCBAQAogCQlkcHJpbnRmX21jaShzdGRkZWIsICJNQ0lfU09VTkQgLy8gZmlsZT0nJXMnICFcbiIsIGxwUGFybXMtPmxwc3RyU291bmROYW1lKTsKIAlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogfQotCisqCisqLwogCiBzdGF0aWMgY29uc3QgY2hhciAqX21jaUNvbW1hbmRUb1N0cmluZyhVSU5UMTYgd01zZykKIHsKQEAgLTE0NjQsNiArMTQ3Nyw4IEBACiAqLwogVUlOVDE2IHdhdmVPdXRHZXREZXZDYXBzKFVJTlQxNiB1RGV2aWNlSUQsIFdBVkVPVVRDQVBTICogbHBDYXBzLCBVSU5UMTYgdVNpemUpCiB7CisJaWYgKHVEZXZpY2VJRCA+IHdhdmVPdXRHZXROdW1EZXZzKCkgLSAxKSByZXR1cm4gTU1TWVNFUlJfQkFEREVWSUNFSUQ7CisJaWYgKHVEZXZpY2VJRCA9PSAoVUlOVDE2KVdBVkVfTUFQUEVSKSByZXR1cm4gTU1TWVNFUlJfQkFEREVWSUNFSUQ7IC8qIEZJWE1FOiBkbyB3ZSBoYXZlIGEgd2F2ZSBtYXBwZXIgPyAqLwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dEdldERldkNhcHNcbiIpOwogCXJldHVybiB3b2RNZXNzYWdlKHVEZXZpY2VJRCwgV09ETV9HRVRERVZDQVBTLCAwTCwgKERXT1JEKWxwQ2FwcywgdVNpemUpOwogfQpAQCAtMTU3OSwxNyArMTU5NCwxNyBAQAogCWxwRGVzYy0+ZHdJbnN0YW5jZSA9IGR3SW5zdGFuY2U7CiAJd2hpbGUodURldmljZUlEIDwgTUFYV0FWRURSSVZFUlMpIHsKIAkJZHdSZXQgPSB3b2RNZXNzYWdlKHVEZXZpY2VJRCwgV09ETV9PUEVOLCAKLQkJCWxwRGVzYy0+ZHdJbnN0YW5jZSwgKERXT1JEKWxwMTZEZXNjLCAwTCk7CisJCQlscERlc2MtPmR3SW5zdGFuY2UsIChEV09SRClscDE2RGVzYywgZHdGbGFncyk7CiAJCWlmIChkd1JldCA9PSBNTVNZU0VSUl9OT0VSUk9SKSBicmVhazsKIAkJaWYgKCFiTWFwcGVyRmxnKSBicmVhazsKIAkJdURldmljZUlEKys7CiAJCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dE9wZW4JLy8gV0FWRV9NQVBQRVIgbW9kZSAhIHRyeSBuZXh0IGRyaXZlci4uLlxuIik7CiAJCX0KKwlscERlc2MtPnVEZXZpY2VJRCA9IHVEZXZpY2VJRDsgIC8qIHNhdmUgcGh5c2ljYWwgRGV2aWNlIElEICovCiAJaWYgKGR3RmxhZ3MgJiBXQVZFX0ZPUk1BVF9RVUVSWSkgewogCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRPcGVuCS8vIEVuZCBvZiBXQVZFX0ZPUk1BVF9RVUVSWSAhXG4iKTsKLQkJd2F2ZU91dENsb3NlKGhXYXZlT3V0KTsKKwkJZHdSZXQgPSB3YXZlT3V0Q2xvc2UoaFdhdmVPdXQpOwogCQl9Ci0JbHBEZXNjLT51RGV2aWNlSUQgPSB1RGV2aWNlSUQ7ICAvKiBzYXZlIHBoeXNpY2FsIERldmljZSBJRCAqLwogCXJldHVybiBkd1JldDsKIH0KIApAQCAtMTc5MSw5ICsxODA2LDYgQEAKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJaWYgKGxwdURldmljZUlEID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLS8qCi0JKmxwdURldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOyAKLSovCiAJKmxwdURldmljZUlEID0gbHBEZXNjLT51RGV2aWNlSUQ7CiAgICAgICAgIHJldHVybiAwOwogfQpAQCAtMTg4NCw2ICsxODk2LDcgQEAKIAkJdURldmljZUlEKys7CiAJCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluT3BlbgkvLyBXQVZFX01BUFBFUiBtb2RlICEgdHJ5IG5leHQgZHJpdmVyLi4uXG4iKTsKIAkJfQorCWxwRGVzYy0+dURldmljZUlEID0gdURldmljZUlEOwogCWlmIChkd0ZsYWdzICYgV0FWRV9GT1JNQVRfUVVFUlkpIHsKIAkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5PcGVuCS8vIEVuZCBvZiBXQVZFX0ZPUk1BVF9RVUVSWSAhXG4iKTsKIAkJd2F2ZUluQ2xvc2UoaFdhdmVJbik7CkBAIC0yMDc0LDcgKzIwODcsMTMgQEAKIAlITU1JTzE2CQlobW1pbzsKIAlPRlNUUlVDVAlvZnM7CiAJTFBNTUlPSU5GTwlscG1taW5mbzsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1taW9PcGVuKCclcycsICVwLCAlMDhsWCk7XG4iLCBzekZpbGVOYW1lLCBscG1taW9pbmZvLCBkd09wZW5GbGFncyk7CisJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9PcGVuKCclcycsICVwLCAlMDhsWCk7XG4iLCBzekZpbGVOYW1lLCBscG1taW9pbmZvLCBkd09wZW5GbGFncyk7CisgICAgICAgIGlmICghc3pGaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRklYTUU6IHNob3VsZCBsb2FkIG1lbW9yeSBmaWxlIGlmIHN6RmlsZU5hbWUgPT0gTlVMTCAqLworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBtbWlvT3BlbigpOiBzekZpbGVOYW1lID09IE5VTEwgKG1lbW9yeSBmaWxlID8/PylcbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgCX0KIAloRmlsZSA9IE9wZW5GaWxlMzIoc3pGaWxlTmFtZSwgJm9mcywgZHdPcGVuRmxhZ3MpOwogCWlmIChoRmlsZSA9PSAtMSkgcmV0dXJuIDA7CiAJaG1taW8gPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUsIHNpemVvZihNTUlPSU5GTykpOwpAQCAtMjA4NCw3ICsyMTAzLDcgQEAKIAlscG1taW5mby0+aG1taW8gPSBobW1pbzsKIAlscG1taW5mby0+ZHdSZXNlcnZlZDIgPSBoRmlsZTsKIAlHbG9iYWxVbmxvY2sxNihobW1pbyk7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvT3BlbiAvLyByZXR1cm4gaG1taW89JTA0WFxuIiwgaG1taW8pOworCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvT3BlbiAvLyByZXR1cm4gaG1taW89JTA0WFxuIiwgaG1taW8pOwogCXJldHVybiBobW1pbzsKIH0KIApAQCAtMjA5NSw3ICsyMTE0LDcgQEAKIFVJTlQxNiBtbWlvQ2xvc2UoSE1NSU8xNiBobW1pbywgVUlOVDE2IHVGbGFncykKIHsKIAlMUE1NSU9JTkZPCWxwbW1pbmZvOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1pb0Nsb3NlKCUwNFgsICUwNFgpO1xuIiwgaG1taW8sIHVGbGFncyk7CisJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9DbG9zZSglMDRYLCAlMDRYKTtcbiIsIGhtbWlvLCB1RmxhZ3MpOwogCWxwbW1pbmZvID0gKExQTU1JT0lORk8pR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CiAJX2xjbG9zZTMyKChIRklMRTMyKWxwbW1pbmZvLT5kd1Jlc2VydmVkMik7CkBAIC0yMTMxLDcgKzIxNTAsNyBAQAogewogCUxPTkcJCWNvdW50OwogCUxQTU1JT0lORk8JbHBtbWluZm87Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvV3JpdGUoJTA0WCwgJXAsICVsZCk7XG4iLCBobW1pbywgcGNoLCBjY2gpOworCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvV3JpdGUoJTA0WCwgJXAsICVsZCk7XG4iLCBobW1pbywgcGNoLCBjY2gpOwogCWxwbW1pbmZvID0gKExQTU1JT0lORk8pR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CiAJY291bnQgPSBfbHdyaXRlMzIoTE9XT1JEKGxwbW1pbmZvLT5kd1Jlc2VydmVkMiksIChMUFNUUilwY2gsIGNjaCk7CkBAIC0yMTQ2LDEwICsyMTY1LDEwIEBACiB7CiAJaW50CQljb3VudDsKIAlMUE1NSU9JTkZPCWxwbW1pbmZvOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1pb1NlZWsoJTA0WCwgJTA4bFgsICVkKTtcbiIsIGhtbWlvLCBsT2Zmc2V0LCBpT3JpZ2luKTsKKwlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1NlZWsoJTA0WCwgJTA4bFgsICVkKTtcbiIsIGhtbWlvLCBsT2Zmc2V0LCBpT3JpZ2luKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPKUdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpIHsKLQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvU2VlayAvLyBjYW4ndCBsb2NrIGhtbWlvPSUwNFggIVxuIiwgaG1taW8pOworCQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1NlZWsgLy8gY2FuJ3QgbG9jayBobW1pbz0lMDRYICFcbiIsIGhtbWlvKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAljb3VudCA9IF9sbHNlZWszMigoSEZJTEUzMilscG1taW5mby0+ZHdSZXNlcnZlZDIsIGxPZmZzZXQsIGlPcmlnaW4pOwpAQCAtMjE2Myw3ICsyMTgyLDcgQEAKIFVJTlQxNiBtbWlvR2V0SW5mbyhITU1JTzE2IGhtbWlvLCBNTUlPSU5GTyAqIGxwbW1pb2luZm8sIFVJTlQxNiB1RmxhZ3MpCiB7CiAJTFBNTUlPSU5GTwlscG1taW5mbzsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1taW9HZXRJbmZvXG4iKTsKKwlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0dldEluZm9cbiIpOwogCWxwbW1pbmZvID0gKExQTU1JT0lORk8pR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CiAJbWVtY3B5KGxwbW1pb2luZm8sIGxwbW1pbmZvLCBzaXplb2YoTU1JT0lORk8pKTsKQEAgLTIxNzcsNyArMjE5Niw3IEBACiBVSU5UMTYgbW1pb1NldEluZm8oSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8gKiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKQogewogCUxQTU1JT0lORk8JbHBtbWluZm87Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvU2V0SW5mb1xuIik7CisJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9TZXRJbmZvXG4iKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPKUdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpIHJldHVybiAwOwogCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKQEAgLTIxOTAsNyArMjIwOSw3IEBACiBVSU5UMTYgbW1pb1NldEJ1ZmZlcihITU1JTzE2IGhtbWlvLCBMUFNUUiBwY2hCdWZmZXIsIAogCQkJCQkJTE9ORyBjY2hCdWZmZXIsIFVJTlQxNiB1RmxhZ3MpCiB7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvU2V0QnVmZmVyIC8vIGVtcHR5IHN0dWIgXG4iKTsKKwlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1NldEJ1ZmZlciAvLyBlbXB0eSBzdHViIFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyMDAsNyArMjIxOSw3IEBACiBVSU5UMTYgbW1pb0ZsdXNoKEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1RmxhZ3MpCiB7CiAJTFBNTUlPSU5GTwlscG1taW5mbzsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1taW9GbHVzaCglMDRYLCAlMDRYKVxuIiwgaG1taW8sIHVGbGFncyk7CisJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9GbHVzaCglMDRYLCAlMDRYKVxuIiwgaG1taW8sIHVGbGFncyk7CiAJbHBtbWluZm8gPSAoTFBNTUlPSU5GTylHbG9iYWxMb2NrMTYoaG1taW8pOwogCWlmIChscG1taW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKIAlHbG9iYWxVbmxvY2sxNihobW1pbyk7CkBAIC0yMjE0LDcgKzIyMzMsNyBAQAogewogCWludAkJY291bnQgPSAwOwogCUxQTU1JT0lORk8JbHBtbWluZm87Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvQWR2YW5jZVxuIik7CisJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9BZHZhbmNlXG4iKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPKUdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpIHJldHVybiAwOwogCWlmICh1RmxhZ3MgPT0gTU1JT19SRUFEKSB7CkBAIC0yMjM2LDcgKzIyNTUsNyBAQAogKi8KIEZPVVJDQyBtbWlvU3RyaW5nVG9GT1VSQ0MoTFBDU1RSIHN6LCBVSU5UMTYgdUZsYWdzKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1pb1N0cmluZ1RvRk9VUkNDIC8vIGVtcHR5IHN0dWIgXG4iKTsKKwlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1N0cmluZ1RvRk9VUkNDIC8vIGVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI0Niw3ICsyMjY1LDcgQEAKIExQTU1JT1BST0MgbW1pb0luc3RhbGxJT1Byb2MoRk9VUkNDIGZjY0lPUHJvYywgCiAJCQkJTFBNTUlPUFJPQyBwSU9Qcm9jLCBEV09SRCBkd0ZsYWdzKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1pb0luc3RhbGxJT1Byb2MgLy8gZW1wdHkgc3R1YiBcbiIpOworCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvSW5zdGFsbElPUHJvYyAvLyBlbXB0eSBzdHViIFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyNTYsNyArMjI3NSw3IEBACiBMUkVTVUxUIG1taW9TZW5kTWVzc2FnZShITU1JTzE2IGhtbWlvLCBVSU5UMTYgdU1lc3NhZ2UsCiAJCQkJCSAgICBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpCiB7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvU2VuZE1lc3NhZ2UgLy8gZW1wdHkgc3R1YiBcbiIpOworCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvU2VuZE1lc3NhZ2UgLy8gZW1wdHkgc3R1YiBcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjc1LDYgKzIyOTQsNyBAQAogCWlmIChscG1taW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKIAlkd2ZjYyA9IGxwY2stPmNraWQ7CiAJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9EZXNjZW5kIC8vIGR3ZmNjPSUwOGxYXG4iLCBkd2ZjYyk7CisJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9EZXNjZW5kIC8vIGhmaWxlID0gJWxkXG4iLCBscG1taW5mby0+ZHdSZXNlcnZlZDIpOwogCWR3T2xkUG9zID0gX2xsc2VlazMyKChIRklMRTMyKWxwbW1pbmZvLT5kd1Jlc2VydmVkMiwgMCwgU0VFS19DVVIpOwogCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvRGVzY2VuZCAvLyBkd09sZFBvcz0lbGRcbiIsIGR3T2xkUG9zKTsKIAlpZiAobHBja1BhcmVudCAhPSBOVUxMKSB7CkBAIC0yMjgyLDE0ICsyMzAyLDI2IEBACiAJCWR3T2xkUG9zID0gX2xsc2VlazMyKChIRklMRTMyKWxwbW1pbmZvLT5kd1Jlc2VydmVkMiwKIAkJCQkJbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0LCBTRUVLX1NFVCk7CiAJCX0KKy8qCisKKyAgIEl0IHNlZW1zIHRvIGJlIHRoYXQgRklORFJJRkYgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHRoZSAKKyAgIG90aGVyIEZJTkR4eHggc28gSSB0cmVhdCBpdCBhcyBhIE1NSU9fRklORHh4eAorCiAJaWYgKCh1RmxhZ3MgJiBNTUlPX0ZJTkRDSFVOSykgfHwgKHVGbGFncyAmIE1NSU9fRklORFJJRkYpIHx8IAogCQkodUZsYWdzICYgTU1JT19GSU5ETElTVCkpIHsKKyovCisJaWYgKCh1RmxhZ3MgJiBNTUlPX0ZJTkRDSFVOSykgfHwgKHVGbGFncyAmIE1NSU9fRklORExJU1QpKSB7CiAJCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvRGVzY2VuZCAvLyBNTUlPX0ZJTkR4eHh4IGR3ZmNjPSUwOGxYICFcbiIsIGR3ZmNjKTsKIAkJd2hpbGUgKFRSVUUpIHsKLQkJCWlmIChfbHJlYWQzMigoSEZJTEUzMilscG1taW5mby0+ZHdSZXNlcnZlZDIsIChMUFNUUilscGNrLCAKLQkJCQkJc2l6ZW9mKE1NQ0tJTkZPKSkgPCBzaXplb2YoTU1DS0lORk8pKSB7CisJCSAgICAgICAgc2l6ZV90IGl4OworCisJCQlpeCA9X2xyZWFkMzIoKEhGSUxFMzIpbHBtbWluZm8tPmR3UmVzZXJ2ZWQyLCAoTFBTVFIpbHBjaywgc2l6ZW9mKE1NQ0tJTkZPKSk7CisJCQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0Rlc2NlbmQgLy8gYWZ0ZXIgX2xyZWFkMzIgaXggPSAlZCByZXEgPSAlZCwgZXJybm8gPSAlZFxuIixpeCxzaXplb2YoTU1DS0lORk8pLGVycm5vKTsKKwkJCWlmIChpeCA8IHNpemVvZihNTUNLSU5GTykpIHsKKwogCQkJCV9sbHNlZWszMigoSEZJTEUzMilscG1taW5mby0+ZHdSZXNlcnZlZDIsIGR3T2xkUG9zLCBTRUVLX1NFVCk7CiAJCQkJR2xvYmFsVW5sb2NrMTYoaG1taW8pOworCQkJCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvRGVzY2VuZCAvLyByZXR1cm4gQ2h1bmtOb3RGb3VuZFxuIik7CiAJCQkJcmV0dXJuIE1NSU9FUlJfQ0hVTktOT1RGT1VORDsKIAkJCQl9CiAJCQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0Rlc2NlbmQgLy8gZHdmY2M9JTA4bFggY2tpZD0lMDhsWCBja3NpemU9JTA4bFggIVxuIiwgCkBAIC0yMzA2LDYgKzIzMzgsNyBAQAogCQkJCXNpemVvZihNTUNLSU5GTykpIDwgc2l6ZW9mKE1NQ0tJTkZPKSkgewogICAgICAgICAgICAgICAgICAgICBfbGxzZWVrMzIoKEhGSUxFMzIpbHBtbWluZm8tPmR3UmVzZXJ2ZWQyLCBkd09sZFBvcywgU0VFS19TRVQpOwogCQkJR2xvYmFsVW5sb2NrMTYoaG1taW8pOworIAkJICAgICAgICBkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0Rlc2NlbmQgLy8gcmV0dXJuIENodW5rTm90Rm91bmQgMm5kXG4iKTsKIAkJCXJldHVybiBNTUlPRVJSX0NIVU5LTk9URk9VTkQ7CiAJCQl9CiAJCX0KQEAgLTIzMTcsNyArMjM1MCw3IEBACiAJR2xvYmFsVW5sb2NrMTYoaG1taW8pOwogCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvRGVzY2VuZCAvLyBscGNrLT5ja2lkPSUwOGxYIGxwY2stPmNrc2l6ZT0lbGQgIVxuIiwgCiAJCQkJCQkJCWxwY2stPmNraWQsIGxwY2stPmNrc2l6ZSk7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvRGVzY2VuZCAvLyBscGNrLT5mY2NUeXBlPSUwOGxYICFcbiIsIGxwY2stPmZjY1R5cGUpOworCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvRGVzY2VuZCAvLyBscGNrLT5mY2NUeXBlPSUwOGxYICFcbiIsIGxwY2stPmZjY1R5cGUpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzI2LDcgKzIzNTksNyBAQAogKi8KIFVJTlQxNiBtbWlvQXNjZW5kKEhNTUlPMTYgaG1taW8sIE1NQ0tJTkZPICogbHBjaywgVUlOVDE2IHVGbGFncykKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1taW9Bc2NlbmQgLy8gZW1wdHkgc3R1YiAhXG4iKTsKKwlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0FzY2VuZCAvLyBlbXB0eSBzdHViICFcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzM1LDcgKzIzNjgsNyBAQAogKi8KIFVJTlQxNiBtbWlvQ3JlYXRlQ2h1bmsoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLCBVSU5UMTYgdUZsYWdzKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1pb0NyZWF0ZUNodW5rIC8vIGVtcHR5IHN0dWIgXG4iKTsKKwlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0NyZWF0ZUNodW5rIC8vIGVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM0Niw3ICsyMzc5LDcgQEAKIFVJTlQxNiBtbWlvUmVuYW1lKExQQ1NUUiBzekZpbGVOYW1lLCBMUENTVFIgc3pOZXdGaWxlTmFtZSwKICAgICAgTU1JT0lORk8gKiBscG1taW9pbmZvLCBEV09SRCBkd1JlbmFtZUZsYWdzKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1pb1JlbmFtZSgnJXMnLCAnJXMnLCAlcCwgJTA4bFgpOyAvLyBlbXB0eSBzdHViIFxuIiwKKwlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1JlbmFtZSgnJXMnLCAnJXMnLCAlcCwgJTA4bFgpOyAvLyBlbXB0eSBzdHViIFxuIiwKIAkJCXN6RmlsZU5hbWUsIHN6TmV3RmlsZU5hbWUsIGxwbW1pb2luZm8sIGR3UmVuYW1lRmxhZ3MpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS90aW1lLmMgYi9tdWx0aW1lZGlhL3RpbWUuYwppbmRleCBmOWZhMGM1Li5kOGM1OTE3IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL3RpbWUuYworKysgYi9tdWx0aW1lZGlhL3RpbWUuYwpAQCAtMzcsNiArMzcsMTQgQEAKIAogc3RhdGljIExQVElNRVJFTlRSWSBscFRpbWVyTGlzdCA9IE5VTEw7CiAKKy8qCisgKiBGSVhNRQorICogaXMgdGhpcyB0aGUgbWluaW11bSByZXNvbHV0aW9uID8gCisgKi8KKyNkZWZpbmUgTU1TWVNUSU1FX01JTklOVEVSVkFMICgzMykKKyNkZWZpbmUgTU1TWVNUSU1FX01BWElOVEVSVkFMICg2NTUzNSkKKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUSU1FX01NU3lzVGltZUNhbGxiYWNrCiAgKi8KQEAgLTQ0LDcgKzUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBpZCwgRFdPUkQgZHdUaW1lICkKIHsKICAgICBMUFRJTUVSRU5UUlkgbHBUaW1lciA9IGxwVGltZXJMaXN0OwotICAgIG1tU3lzVGltZU1TLnUubXMgKz0gMzM7CisgICAgbW1TeXNUaW1lTVMudS5tcyArPSBNTVNZU1RJTUVfTUlOSU5URVJWQUw7CiAgICAgbW1TeXNUaW1lU01QVEUudS5zbXB0ZS5mcmFtZSsrOwogICAgIHdoaWxlIChscFRpbWVyICE9IE5VTEwpIHsKIAlscFRpbWVyLT53Q3VyVGltZS0tOwpAQCAtOTksNyArMTA3LDcgQEAKIAltbVN5c1RpbWVTTVBURS51LnNtcHRlLmZyYW1lID0gMDsKIAltbVN5c1RpbWVTTVBURS51LnNtcHRlLmZwcyA9IDA7CiAJbW1TeXNUaW1lU01QVEUudS5zbXB0ZS5kdW1teSA9IDA7Ci0JU2V0VGltZXIzMiggMCwgMSwgMzMsIFRJTUVfTU1TeXNUaW1lQ2FsbGJhY2sgKTsKKwlTZXRUaW1lcjMyKCAwLCAxLCBNTVNZU1RJTUVfTUlOSU5URVJWQUwsIFRJTUVfTU1TeXNUaW1lQ2FsbGJhY2sgKTsKICAgICB9CiB9CiAKQEAgLTExMSw2ICsxMTksOCBAQAogICAgIGRwcmludGZfbW1zeXMoc3RkZGViLCAidGltZUdldFN5c3RlbVRpbWUoJXAsICV1KTtcbiIsIGxwVGltZSwgd1NpemUpOwogICAgIGlmICghbW1UaW1lU3RhcnRlZCkKIAlTdGFydE1NVGltZSgpOworICAgIGxwVGltZS0+d1R5cGUgPSBUSU1FX01TOworICAgIGxwVGltZS0+dS5tcyA9IG1tU3lzVGltZU1TLnUubXM7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE4NSw3ICsxOTUsMTEgQEAKICAqLwogV09SRCB0aW1lR2V0RGV2Q2FwcyhMUFRJTUVDQVBTIGxwQ2FwcywgV09SRCB3U2l6ZSkKIHsKLSAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInRpbWVHZXREZXZDYXBzKCVwLCAldSkgIVxuIiwgbHBDYXBzLCB3U2l6ZSk7CisgICAgZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZUdldERldkNhcHMoJXAsICV1KSAhXG4iLCBscENhcHMsIHdTaXplKTsKKyAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCisJU3RhcnRNTVRpbWUoKTsKKyAgICBscENhcHMtPndQZXJpb2RNaW4gPSBNTVNZU1RJTUVfTUlOSU5URVJWQUw7CisgICAgbHBDYXBzLT53UGVyaW9kTWF4ID0gTU1TWVNUSU1FX01BWElOVEVSVkFMOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xOTQsOSArMjA4LDExIEBACiAgKi8KIFdPUkQgdGltZUJlZ2luUGVyaW9kKFdPUkQgd1BlcmlvZCkKIHsKLSAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInRpbWVCZWdpblBlcmlvZCgldSkgIVxuIiwgd1BlcmlvZCk7CisgICAgZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZUJlZ2luUGVyaW9kKCV1KSAhXG4iLCB3UGVyaW9kKTsKICAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCiAJU3RhcnRNTVRpbWUoKTsKKyAgICBpZiAod1BlcmlvZCA8IE1NU1lTVElNRV9NSU5JTlRFUlZBTCB8fCB3UGVyaW9kID4gTU1TWVNUSU1FX01BWElOVEVSVkFMKSAKKyAgICAgICAgcmV0dXJuIFRJTUVSUl9OT0NBTkRPOwogICAgIHJldHVybiAwOwogfQogCkBAIC0yMDUsNyArMjIxLDkgQEAKICAqLwogV09SRCB0aW1lRW5kUGVyaW9kKFdPUkQgd1BlcmlvZCkKIHsKLSAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInRpbWVFbmRQZXJpb2QoJXUpICFcbiIsIHdQZXJpb2QpOworICAgIGRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVFbmRQZXJpb2QoJXUpICFcbiIsIHdQZXJpb2QpOworICAgIGlmICh3UGVyaW9kIDwgTU1TWVNUSU1FX01JTklOVEVSVkFMIHx8IHdQZXJpb2QgPiBNTVNZU1RJTUVfTUFYSU5URVJWQUwpIAorICAgICAgICByZXR1cm4gVElNRVJSX05PQ0FORE87CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTIxNCw4ICsyMzIsOSBAQAogICovCiBEV09SRCB0aW1lR2V0VGltZSgpCiB7Ci0gICAgZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ0aW1lR2V0VGltZSgpOyAhXG4iKTsKKyAgICBkcHJpbnRmX21tdGltZShzdGRkZWIsICJ0aW1lR2V0VGltZSgpOyAhXG4iKTsKICAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCiAJU3RhcnRNTVRpbWUoKTsKLSAgICByZXR1cm4gMDsKKyAgICBkcHJpbnRmX21tdGltZShzdGRkZWIsICJ0aW1lR2V0VGltZSgpIC8vIFRpbWUgPSAlbGRcbiIsbW1TeXNUaW1lTVMudS5tcyk7CisgICAgcmV0dXJuIG1tU3lzVGltZU1TLnUubXM7CiB9CmRpZmYgLS1naXQgYS9vYmplY3RzL2NvbG9yLmMgYi9vYmplY3RzL2NvbG9yLmMKaW5kZXggMzQ0MmQ5MS4uMDc0MzU5ZCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jb2xvci5jCisrKyBiL29iamVjdHMvY29sb3IuYwpAQCAtMzEsOCArMzEsOCBAQAogICogYmVjYXVzZSBwaXhlbCB2YWx1ZXMgY2FuIGJlIGNhbGN1bGF0ZWQgd2l0aG91dCBYIHNlcnZlciAKICAqIGFzc2lzdGFuY2UuCiAgKgotICogRm9yIHNvbWUgaW5mbyBhYm91dCBnZW5lcmFsIFdpbmRvd3MgcGFsZXR0ZSBtYW5hZ2VtZW50IHJlYWQKLSAqIGh0dHA6Ly8xOTguMTA1LjIzMi41L01TRE4vTElCUkFSWS9URUNITk9URS9DSDMuSFRNIAorICogV2luZG93cyBwYWxldHRlIG1hbmFnZXIgaXMgZGVzY3JpYmVkIGluIHRoZQorICogaHR0cDovL3ByZW1pdW0ubWljcm9zb2Z0LmNvbS9tc2RuL2xpYnJhcnkvdGVjaGFydC9mMzAvZjM0L2Y0MC9kNGQvc2E5NDIuaHRtCiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTQxLDcgKzQxLDggQEAKICAgICBVSU5UMTYgICAgICBzaXplOwogICAgIFVJTlQxNiAgICAgIGZsYWdzOwogICAgIElOVDMyCW1vbm9QbGFuZTsJIC8qIGJpdCBwbGFuZSBkaWZmZXJlbnQgZm9yIHdoaXRlIGFuZCBibGFjayBwaXhlbHMgKi8KLSAgICBCT09MMzIJYldoaXRlT247CSAvKiBtb25vUGxhbmUgYml0IGlzIDEgZm9yIHRoZSB3aGl0ZSBwaXhlbCAqLworCisgICAgSU5UMzIJKCptYXBDb2xvcikoIERDKiwgQ09MT1JSRUYgKTsKIH0gQ1NQQUNFOwogCiBzdGF0aWMgQ1NQQUNFIGNTcGFjZSA9IHswLCAwLCAwfTsKQEAgLTYxLDcgKzYyLDYgQEAKICAqIGN1cnJlbnRseSBpbmFjdGl2ZSB3aW5kb3cgaXQgY2hhbmdlcyBvbmx5IERDIHBhbGV0dGUgbWFwcGluZ3MuCiAgKi8KIAotI2RlZmluZSBOQl9SRVNFUlZFRF9DT0xPUlMgIAkJMjAgLyogbnVtYmVyIG9mIGZpeGVkIGNvbG9ycyBpbiBzeXN0ZW0gcGFsZXR0ZSAqLwogI2RlZmluZSBOQl9DT0xPUkNVQkVfU1RBUlRfSU5ERVgJNjMKIAogVmlzdWFsKiAJCXZpc3VhbCA9IE5VTEw7CkBAIC0xNDMsNiArMTQzLDExIEBACiAgICAgcmV0dXJuIGNTcGFjZS5mbGFnczsKIH0KIAorY29uc3QgUEFMRVRURUVOVFJZKiBDT0xPUl9HZXRTeXN0ZW1QYWxldHRlVGVtcGxhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gX19zeXNQYWxUZW1wbGF0ZTsKK30KKwogQ09MT1JSRUYgQ09MT1JfR2V0U3lzdGVtUGFsZXR0ZUVudHJ5KFVJTlQzMiBpKQogewogIHJldHVybiAqKENPTE9SUkVGKikoQ09MT1Jfc3lzUGFsICsgaSkgJiAweDAwZmZmZmZmOwpAQCAtMTc2LDcgKzE4MSwxMCBAQAogICByZXR1cm4gMTsKIH0KIAotdm9pZCBDT0xPUl9GaWxsRGVmYXVsdENvbG9ycyh2b2lkKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIENvbG9ybWFwIEluaXRpYWxpemF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIENPTE9SX0ZpbGxEZWZhdWx0Q29sb3JzKHZvaWQpCiB7CiAgLyogaW5pdGlhbGl6ZSB1bnVzZWQgZW50cmllcyB0byB3aGF0IFdpbmRvd3MgdXNlcyBhcyBhIGNvbG9yIAogICAqIGN1YmUgLSBiYXNlZCBvbiBHcmVnIEtyZWlkZXIncyBjb2RlLiAKQEAgLTUzMCw1OCArNTM4LDYgQEAKICAgIHJldHVybiBUUlVFOwogfQogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENPTE9SX0luaXRQYWxldHRlCi0gKgotICogQ3JlYXRlIHRoZSBzeXN0ZW0gcGFsZXR0ZS4KLSAqLwotc3RhdGljIEhQQUxFVFRFMTYgQ09MT1JfSW5pdFBhbGV0dGUodm9pZCkKLXsKLSAgICBpbnQgCQlpOwotICAgIEhQQUxFVFRFMTYgCQlocGFsZXR0ZTsKLSAgICBMT0dQQUxFVFRFICogCXBhbFB0cjsKLSAgICBQQUxFVFRFT0JKKiAgICAgICAgIHBhbE9iajsKLQotICAgIG1lbXNldChDT0xPUl9mcmVlTGlzdCwgMCwgMjU2KnNpemVvZih1bnNpZ25lZCBjaGFyKSk7Ci0KLSAgICBpZiAoY1NwYWNlLmZsYWdzICYgQ09MT1JfUFJJVkFURSkKLQlDT0xPUl9CdWlsZFByaXZhdGVNYXAoICZjU3BhY2UgKTsKLSAgICBlbHNlCi0JQ09MT1JfQnVpbGRTaGFyZWRNYXAoICZjU3BhY2UgKTsKLQotICAgIC8qIEJ1aWxkIGZyZWUgbGlzdCAqLwotCi0gICAgaWYoIENPTE9SX2ZpcnN0RnJlZSAhPSAtMSApCi0JQ09MT1JfRm9ybWF0U3lzdGVtUGFsZXR0ZSgpOwotCi0gICAgQ09MT1JfRmlsbERlZmF1bHRDb2xvcnMoKTsKLQotICAgIC8qIGNyZWF0ZSBkZWZhdWx0IHBhbGV0dGUgKDIwIHN5c3RlbSBjb2xvcnMpICovCi0KLSAgICBwYWxQdHIgPSB4bWFsbG9jKCBzaXplb2YoTE9HUEFMRVRURSkgKyAoTkJfUkVTRVJWRURfQ09MT1JTLTEpKnNpemVvZihQQUxFVFRFRU5UUlkpICk7Ci0gICAgaWYgKCFwYWxQdHIpIHJldHVybiBGQUxTRTsKLQotICAgIHBhbFB0ci0+cGFsVmVyc2lvbiA9IDB4MzAwOwotICAgIHBhbFB0ci0+cGFsTnVtRW50cmllcyA9IE5CX1JFU0VSVkVEX0NPTE9SUzsKLSAgICBmb3IoIGkgPSAwOyBpIDwgTkJfUkVTRVJWRURfQ09MT1JTOyBpICsrICkKLSAgICB7Ci0gICAgICAgIHBhbFB0ci0+cGFsUGFsRW50cnlbaV0ucGVSZWQgPSBfX3N5c1BhbFRlbXBsYXRlW2ldLnBlUmVkOwotICAgICAgICBwYWxQdHItPnBhbFBhbEVudHJ5W2ldLnBlR3JlZW4gPSBfX3N5c1BhbFRlbXBsYXRlW2ldLnBlR3JlZW47Ci0gICAgICAgIHBhbFB0ci0+cGFsUGFsRW50cnlbaV0ucGVCbHVlID0gX19zeXNQYWxUZW1wbGF0ZVtpXS5wZUJsdWU7Ci0gICAgICAgIHBhbFB0ci0+cGFsUGFsRW50cnlbaV0ucGVGbGFncyA9IDA7ICAKLSAgICB9Ci0gICAgaHBhbGV0dGUgPSBDcmVhdGVQYWxldHRlMTYoIHBhbFB0ciApOwotCi0gICAgcGFsT2JqID0gKFBBTEVUVEVPQkoqKSBHRElfR2V0T2JqUHRyKCBocGFsZXR0ZSwgUEFMRVRURV9NQUdJQyApOwotCi0gICAgcGFsT2JqLT5tYXBwaW5nID0geG1hbGxvYyggc2l6ZW9mKGludCkgKiAyMCApOwotCi0gICAgZnJlZSggcGFsUHRyICk7Ci0gICAgcmV0dXJuIGhwYWxldHRlOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgICBDT0xPUl9Db21wdXRlc2hpZnRzCiAgKgpAQCAtNjA5LDEwICs1NjUsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ09MT1JfSW5pdAogICoKLSAqIEluaXRpYWxpemUgY29sb3IgbWFwIGFuZCBzeXN0ZW0gcGFsZXR0ZS4KLSAqCisgKiBJbml0aWFsaXplIGNvbG9yIG1hbmFnZW1lbnQuCiAgKi8KLUhQQUxFVFRFMTYgQ09MT1JfSW5pdCh2b2lkKQorQk9PTDMyIENPTE9SX0luaXQodm9pZCkKIHsKICAgICBpbnQJbWFzaywgd2hpdGUsIGJsYWNrOwogCkBAIC02ODAsNyArNjM1LDIxIEBACiAgICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiIHZpc3VhbCBjbGFzcyAlaSAoJWkpXG4iLCAKIAkJICAgIHZpc3VhbC0+Y2xhc3MsIGNTcGFjZS5tb25vUGxhbmUpOwogCi0gICAgcmV0dXJuIENPTE9SX0luaXRQYWxldHRlKCk7CisgICAgbWVtc2V0KENPTE9SX2ZyZWVMaXN0LCAwLCAyNTYqc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKKworICAgIGlmIChjU3BhY2UuZmxhZ3MgJiBDT0xPUl9QUklWQVRFKQorICAgICAgICBDT0xPUl9CdWlsZFByaXZhdGVNYXAoICZjU3BhY2UgKTsKKyAgICBlbHNlCisgICAgICAgIENPTE9SX0J1aWxkU2hhcmVkTWFwKCAmY1NwYWNlICk7CisKKyAgICAvKiBCdWlsZCBmcmVlIGxpc3QgKi8KKworICAgIGlmKCBDT0xPUl9maXJzdEZyZWUgIT0gLTEgKQorICAgICAgICBDT0xPUl9Gb3JtYXRTeXN0ZW1QYWxldHRlKCk7CisKKyAgICBDT0xPUl9GaWxsRGVmYXVsdENvbG9ycygpOworCisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODY4LDMxICs4MzcsOCBAQAogaW50IENPTE9SX1RvUGh5c2ljYWwoIERDICpkYywgQ09MT1JSRUYgY29sb3IgKQogewogICAgIFdPUkQgCQkgaW5kZXggPSAwOwotICAgIHVuc2lnbmVkIGNoYXIJIHNwZWNfdHlwZTsKICAgICBIUEFMRVRURTE2CQkgaFBhbCA9IChkYyk/IGRjLT53LmhQYWxldHRlOiBTVE9DS19ERUZBVUxUX1BBTEVUVEU7Ci0KLSAgICBzcGVjX3R5cGUgPSBjb2xvciA+PiAyNDsKLQotICAgIGlmKCBzcGVjX3R5cGUgPT0gMHhmZiApCi0gICAgewotCXNwZWNfdHlwZSA9IDA7IC8qICd3cml0ZScgc2VlbXMgdG8gbmVlZCB0aGF0IGZvciAnUGFnZSAxJyB0ZXh0ICovCi0JY29sb3IgJj0gMHhmZmZmZmY7Ci0gICAgfQotCi0gICAgaWYoIHNwZWNfdHlwZSA+IDIgKQotICAgIHsgIAotCWRwcmludGZfcGFsZXR0ZShzdGRkZWIsICJDT0xPUl9Ub1BoeXNpY2FsIDogaW52YWxpZCBSR0Igc3BlY2lmaWVyIGZvcjogJTA4bHhcbiIsIGNvbG9yKTsKLQlzcGVjX3R5cGUgPSAwOwotICAgIH0KLQotICAgIGlmIChkYyAmJiAoZGMtPncuYml0c1BlclBpeGVsID09IDEpICYmIChzcGVjX3R5cGUgPT0gMCkpCi0gICAgewotCS8qIG1vbm9jaHJvbWUgKi8KLSAgICAgICAgaWYgKCgoY29sb3IgPj4gMTYpICYgMHhmZikgKwotICAgICAgICAgICAgKChjb2xvciA+PiA4KSAmIDB4ZmYpICsgKGNvbG9yICYgMHhmZikgPiAyNTUqMy8yKQotICAgICAgICAgICAgIHJldHVybiAxOyAgIC8qIHdoaXRlICovCi0gICAgICAgIGVsc2UgcmV0dXJuIDA7ICAgLyogYmxhY2sgKi8KLSAgICB9CisgICAgdW5zaWduZWQgY2hhcgkgc3BlY190eXBlID0gY29sb3IgPj4gMjQ7CiAKICAgICBpZiAoIGNTcGFjZS5mbGFncyAmIENPTE9SX0ZJWEVEICkKICAgICB7CkBAIC05MTksNyArODY1LDcgQEAKIAogICAgICAgICAgIGNhc2UgMTogLyogUEFMRVRURUlOREVYICovCiAKLSAgICAgICAgICAgIGlmICggKGlkeCA9IGNvbG9yICYgMHhmZmZmKSA+PSBwYWxQdHItPmxvZ3BhbGV0dGUucGFsTnVtRW50cmllcykKKyAgICAgICAgICAgIGlmKCAoaWR4ID0gY29sb3IgJiAweGZmZmYpID49IHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxOdW1FbnRyaWVzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHRSR0IoJWx4KSA6IGlkeCAlZCBpcyBvdXQgb2YgYm91bmRzLCBhc3N1bWluZyBibGFja1xuIiwgY29sb3IsIGlkeCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC05MjgsMTEgKzg3NCwxNiBAQAogICAgICAgICAgICAgaWYoIHBhbFB0ci0+bWFwcGluZyApIHJldHVybiBwYWxQdHItPm1hcHBpbmdbaWR4XTsKIAogCSAgICBjb2xvciA9ICooQ09MT1JSRUYqKShwYWxQdHItPmxvZ3BhbGV0dGUucGFsUGFsRW50cnkgKyBpZHgpOworCSAgICBicmVhazsKIAotCSAgICAvKiBmYWxsIHRocm91Z2ggYW5kIG91dCAqLworCSAgZGVmYXVsdDoKKwkgICAgY29sb3IgJj0gMHhmZmZmZmY7CisJICAgIC8qIGZhbGwgdGhyb3VnaCB0byBSR0IgKi8KIAogCSAgY2FzZSAwOiAvKiBSR0IgKi8KLQkgIGRlZmF1bHQ6CisJICAgIGlmKCBkYyAmJiAoZGMtPncuYml0c1BlclBpeGVsID09IDEpICkKKwkJcmV0dXJuICgoKGNvbG9yID4+IDE2KSAmIDB4ZmYpICsKKwkJCSgoY29sb3IgPj4gOCkgJiAweGZmKSArIChjb2xvciAmIDB4ZmYpID4gMjU1KjMvMikgPyAxIDogMDsKIAl9CiAKICAgICAgICAgcmVkID0gR2V0UlZhbHVlKGNvbG9yKTsgZ3JlZW4gPSBHZXRHVmFsdWUoY29sb3IpOyBibHVlID0gR2V0QlZhbHVlKGNvbG9yKTsKQEAgLTk2NSw3ICs5MTYsMTQgQEAKIAlzd2l0Y2goc3BlY190eXBlKQkvKiB3ZSBoYXZlIHRvIHBlcnVzZSBEQyBhbmQgc3lzdGVtIHBhbGV0dGUgKi8KICAgICAJewogCSAgICBkZWZhdWx0OgorCQljb2xvciAmPSAweGZmZmZmZjsKKwkJLyogZmFsbCB0aHJvdWdoIHRvIFJHQiAqLworCiAgICAgICAgCSAgICBjYXNlIDA6ICAvKiBSR0IgKi8KKwkJaWYoIGRjICYmIChkYy0+dy5iaXRzUGVyUGl4ZWwgPT0gMSkgKQorCQkgICAgcmV0dXJuICgoKGNvbG9yID4+IDE2KSAmIDB4ZmYpICsKKwkJCSAgICAoKGNvbG9yID4+IDgpICYgMHhmZikgKyAoY29sb3IgJiAweGZmKSA+IDI1NSozLzIpID8gMSA6IDA7CisKIAkgICAgCWluZGV4ID0gQ09MT1JfUGFsZXR0ZUxvb2t1cFBpeGVsKCBDT0xPUl9zeXNQYWwsIDI1NiwgCiAJCQkJCQkgIENPTE9SX1BhbGV0dGVUb1BpeGVsLCBjb2xvciwgRkFMU0UpOwogCmRpZmYgLS1naXQgYS9vYmplY3RzL2RjLmMgYi9vYmplY3RzL2RjLmMKaW5kZXggNmQzMWNkOC4uNGYyNWM5MCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kYy5jCisrKyBiL29iamVjdHMvZGMuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgImNvbG9yLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJmb250LmgiCisjaW5jbHVkZSAieDExZm9udC5oIgogCiBleHRlcm4gdm9pZCBDTElQUElOR19VcGRhdGVHQ1JlZ2lvbiggREMgKiBkYyApOyAgICAgLyogb2JqZWN0cy9jbGlwcGluZy5jICovCiAKQEAgLTMwMSwxNyArMzAyLDI4IEBACiAKICAgICBpZiAoZGMtPncuZmxhZ3MgJiBEQ19ESVJUWSkgQ0xJUFBJTkdfVXBkYXRlR0NSZWdpb24oZGMpOyAKIAotICAgIGlmICgoc2NyZWVuRGVwdGggPD0gOCkgJiYgIC8qIEZJWE1FOiBTaG91bGQgY2hlY2sgZm9yIHBhbGV0dGUgaW5zdGVhZCAqLwotICAgICAgICAoKGRjLT53LlJPUG1vZGUgPT0gUjJfQkxBQ0spIHx8IChkYy0+dy5ST1Btb2RlID09IFIyX1dISVRFKSkpCisgICAgc3dpdGNoIChkYy0+dy5ST1Btb2RlKQogICAgIHsKLSAgICAgICAgdmFsLmZ1bmN0aW9uICAgPSBHWGNvcHk7Ci0gICAgICAgIHZhbC5mb3JlZ3JvdW5kID0gQ09MT1JfVG9QaHlzaWNhbCggTlVMTCwgKGRjLT53LlJPUG1vZGUgPT0gUjJfQkxBQ0spID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdCKDAsMCwwKSA6IFJHQigyNTUsMjU1LDI1NSkgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmFsLmZ1bmN0aW9uICAgPSBEQ19YUk9QZnVuY3Rpb25bZGMtPncuUk9QbW9kZS0xXTsKLSAgICAgICAgdmFsLmZvcmVncm91bmQgPSBkYy0+dS54LnBlbi5waXhlbDsKKyAgICBjYXNlIFIyX0JMQUNLIDoKKwl2YWwuZm9yZWdyb3VuZCA9IEJsYWNrUGl4ZWwoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSk7CisJdmFsLmZ1bmN0aW9uID0gR1hjb3B5OworCWJyZWFrOworICAgIGNhc2UgUjJfV0hJVEUgOgorCXZhbC5mb3JlZ3JvdW5kID0gV2hpdGVQaXhlbChkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKTsKKwl2YWwuZnVuY3Rpb24gPSBHWGNvcHk7CisJYnJlYWs7CisgICAgY2FzZSBSMl9YT1JQRU4gOgorCXZhbC5mb3JlZ3JvdW5kID0gZGMtPnUueC5wZW4ucGl4ZWw7CisJLyogSXQgaXMgdmVyeSB1bmxpa2VseSBzb21lb25lIHdhbnRzIHRvIFhPUiB3aXRoIDAgKi8KKwkvKiBUaGlzIGZpeGVzIHRoZSBydWJiZXItZHJhd2luZ3MgaW4gcGFpbnRicnVzaCAqLworCWlmICh2YWwuZm9yZWdyb3VuZCA9PSAwKQorCSAgICB2YWwuZm9yZWdyb3VuZCA9IEJsYWNrUGl4ZWwoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSkKKwkJCSAgICBeIFdoaXRlUGl4ZWwoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSk7CisJdmFsLmZ1bmN0aW9uID0gR1h4b3I7CisJYnJlYWs7CisgICAgZGVmYXVsdCA6CisJdmFsLmZvcmVncm91bmQgPSBkYy0+dS54LnBlbi5waXhlbDsKKwl2YWwuZnVuY3Rpb24gICA9IERDX1hST1BmdW5jdGlvbltkYy0+dy5ST1Btb2RlLTFdOwogICAgIH0KICAgICB2YWwuYmFja2dyb3VuZCA9IGRjLT53LmJhY2tncm91bmRQaXhlbDsKICAgICB2YWwuZmlsbF9zdHlsZSA9IEZpbGxTb2xpZDsKQEAgLTM0MSwyNSArMzUzLDI3IEBACiAgKi8KIEJPT0wzMiBEQ19TZXR1cEdDRm9yVGV4dCggREMgKiBkYyApCiB7Ci0gICAgWEdDVmFsdWVzIHZhbDsKKyAgICBYRm9udFN0cnVjdCogeGZzID0gWEZPTlRfR2V0Rm9udFN0cnVjdCggZGMtPnUueC5mb250ICk7CiAKLSAgICBpZiAoIWRjLT51LnguZm9udC5mc3RydWN0KQorICAgIGlmKCB4ZnMgKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRENfU2V0dXBHQ0ZvclRleHQ6IGZzdHJ1Y3QgaXMgTlVMTC4gUGxlYXNlIHJlcG9ydCB0aGlzXG4iICk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAKLSAgICBpZiAoZGMtPncuZmxhZ3MgJiBEQ19ESVJUWSkgQ0xJUFBJTkdfVXBkYXRlR0NSZWdpb24oZGMpOworCVhHQ1ZhbHVlcyB2YWw7CiAKLSAgICB2YWwuZnVuY3Rpb24gICA9IEdYY29weTsgIC8qIFRleHQgaXMgYWx3YXlzIEdYY29weSAqLwotICAgIHZhbC5mb3JlZ3JvdW5kID0gZGMtPncudGV4dFBpeGVsOwotICAgIHZhbC5iYWNrZ3JvdW5kID0gZGMtPncuYmFja2dyb3VuZFBpeGVsOwotICAgIHZhbC5maWxsX3N0eWxlID0gRmlsbFNvbGlkOwotICAgIHZhbC5mb250ICAgICAgID0gZGMtPnUueC5mb250LmZzdHJ1Y3QtPmZpZDsKLSAgICBYQ2hhbmdlR0MoIGRpc3BsYXksIGRjLT51LnguZ2MsIAotCSAgICAgICBHQ0Z1bmN0aW9uIHwgR0NGb3JlZ3JvdW5kIHwgR0NCYWNrZ3JvdW5kIHwgR0NGaWxsU3R5bGUgfAotCSAgICAgICBHQ0ZvbnQsICZ2YWwgKTsKLSAgICByZXR1cm4gVFJVRTsKKwlpZiAoZGMtPncuZmxhZ3MgJiBEQ19ESVJUWSkgQ0xJUFBJTkdfVXBkYXRlR0NSZWdpb24oZGMpOworCisJdmFsLmZ1bmN0aW9uICAgPSBHWGNvcHk7ICAvKiBUZXh0IGlzIGFsd2F5cyBHWGNvcHkgKi8KKwl2YWwuZm9yZWdyb3VuZCA9IGRjLT53LnRleHRQaXhlbDsKKwl2YWwuYmFja2dyb3VuZCA9IGRjLT53LmJhY2tncm91bmRQaXhlbDsKKwl2YWwuZmlsbF9zdHlsZSA9IEZpbGxTb2xpZDsKKwl2YWwuZm9udCAgICAgICA9IHhmcy0+ZmlkOworCisJWENoYW5nZUdDKCBkaXNwbGF5LCBkYy0+dS54LmdjLAorCQkgICBHQ0Z1bmN0aW9uIHwgR0NGb3JlZ3JvdW5kIHwgR0NCYWNrZ3JvdW5kIHwgR0NGaWxsU3R5bGUgfAorCQkgICBHQ0ZvbnQsICZ2YWwgKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9IAorICAgIGZwcmludGYoIHN0ZGVyciwgIkRDX1NldHVwR0NGb3JUZXh0OiBwaHlzaWNhbCBmb250IGZhaWx1cmVcbiIgKTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kaWIuYyBiL29iamVjdHMvZGliLmMKaW5kZXggYTk1MTc0NS4uOTQ3NDNkYiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kaWIuYworKysgYi9vYmplY3RzL2RpYi5jCkBAIC00OSw2ICs0OSw5IEBACiB7CiAgICAgaW50CQlpOwogCisgICAgaWYgKCF4aW1hZ2VEZXB0aFRhYmxlWzBdKSB7CisJICAgIERJQl9Jbml0KCk7CisgICAgfQogICAgIGZvciggaSA9IDA7IGJpdG1hcERlcHRoVGFibGVbaV0gOyBpKysgKQogCSBpZiggYml0bWFwRGVwdGhUYWJsZVtpXSA9PSBkZXB0aCApCiAJICAgICByZXR1cm4gKDQgKiAoKHdpZHRoICogeGltYWdlRGVwdGhUYWJsZVtpXSArIDMxKS8zMikpOwpAQCAtOTcsMTQgKzEwMCwxNCBAQAogICAgIGlmIChpbmZvLT5ibWlIZWFkZXIuYmlTaXplID09IHNpemVvZihCSVRNQVBDT1JFSEVBREVSKSkKICAgICB7CiAgICAgICAgIEJJVE1BUENPUkVIRUFERVIgKmNvcmUgPSAoQklUTUFQQ09SRUhFQURFUiAqKWluZm87Ci0gICAgICAgIGNvbG9ycyA9IChjb3JlLT5iY0JpdENvdW50ICE9IDI0KSA/IDEgPDwgY29yZS0+YmNCaXRDb3VudCA6IDA7CisgICAgICAgIGNvbG9ycyA9IChjb3JlLT5iY0JpdENvdW50IDw9IDgpID8gMSA8PCBjb3JlLT5iY0JpdENvdW50IDogMDsKICAgICAgICAgcmV0dXJuIHNpemVvZihCSVRNQVBDT1JFSEVBREVSKSArIGNvbG9ycyAqCiAgICAgICAgICAgICAgKChjb2xvcnVzZSA9PSBESUJfUkdCX0NPTE9SUykgPyBzaXplb2YoUkdCVFJJUExFKSA6IHNpemVvZihXT1JEKSk7CiAgICAgfQogICAgIGVsc2UgIC8qIGFzc3VtZSBCSVRNQVBJTkZPSEVBREVSICovCiAgICAgewogICAgICAgICBjb2xvcnMgPSBpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkOwotICAgICAgICBpZiAoIWNvbG9ycyAmJiAoaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQgIT0gMjQpKQorICAgICAgICBpZiAoIWNvbG9ycyAmJiAoaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPD0gOCkpCiAgICAgICAgICAgICBjb2xvcnMgPSAxIDw8IGluZm8tPmJtaUhlYWRlci5iaUJpdENvdW50OwogICAgICAgICByZXR1cm4gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgY29sb3JzICoKICAgICAgICAgICAgICAgICgoY29sb3J1c2UgPT0gRElCX1JHQl9DT0xPUlMpID8gc2l6ZW9mKFJHQlFVQUQpIDogc2l6ZW9mKFdPUkQpKTsKQEAgLTU5MCwxMCArNTkzLDEyIEBACiAKICAgICAgIC8qIEJ1aWxkIHRoZSBjb2xvciBtYXBwaW5nIHRhYmxlICovCiAKLSAgICBpZiAoaW5mb0JwcCA9PSAyNCkgY29sb3JNYXBwaW5nID0gTlVMTDsKLSAgICBlbHNlCisgICAgaWYgKGluZm9CcHAgPiA4KSB7CisJICAgIAljb2xvck1hcHBpbmcgPSBOVUxMOworICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghKGNvbG9yTWFwcGluZyA9IERJQl9CdWlsZENvbG9yTWFwKCBkYywgY29sb3J1c2UsIGRlcHRoLCBpbmZvICkpKQogICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgICAgaWYoIGRjLT53LmZsYWdzICYgRENfRElSVFkgKSBDTElQUElOR19VcGRhdGVHQ1JlZ2lvbihkYyk7CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvZm9udC5jIGIvb2JqZWN0cy9mb250LmMKaW5kZXggM2FjMTdkYi4uZTc5YzZiNiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9mb250LmMKKysrIGIvb2JqZWN0cy9mb250LmMKQEAgLTIsMzA4ICsyLDIwNiBAQAogICogR0RJIGZvbnQgb2JqZWN0cwogICoKICAqIENvcHlyaWdodCAxOTkzIEFsZXhhbmRyZSBKdWxsaWFyZAotICoKLSAqIEVuaGFjZW1lbnRzIGJ5IEp1ZXJnZW4gTWFycXVhcmR0IDE5OTYKLSAqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlY29uZCBmb250IGNhY2hlIHdoaWNoIAotICogd2lsbCBiZSB1cGRhdGVkIGR5bmFtaWNhbGx5CisgKiAgICAgICAgICAgMTk5NyBBbGV4IEtvcm9ia2EKICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxYMTEvWGF0b20uaD4KICNpbmNsdWRlICJmb250LmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm1ldGFmaWxlLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLUxQTE9HRk9OVDE2IGxwTG9nRm9udExpc3RbTUFYX0ZPTlRTKzFdOworI2RlZmluZSBFTlVNX1VOSUNPREUJMHgwMDAwMDAwMQogCi0KLSNkZWZpbmUgQ0lfTk9ORVhJU1RDSEFSKGNzKSAoKChjcyktPndpZHRoID09IDApICYmIFwKLQkJCSAgICAgKCgoY3MpLT5yYmVhcmluZ3woY3MpLT5sYmVhcmluZ3wgXAotCQkJICAgICAgIChjcyktPmFzY2VudHwoY3MpLT5kZXNjZW50KSA9PSAwKSkKLQotLyogCi0gKiBDSV9HRVRfQ0hBUl9JTkZPIC0gcmV0dXJuIHRoZSBjaGFyaW5mbyBzdHJ1Y3QgZm9yIHRoZSBpbmRpY2F0ZWQgOGJpdAotICogY2hhcmFjdGVyLiAgSWYgdGhlIGNoYXJhY3RlciBpcyBpbiB0aGUgY29sdW1uIGFuZCBleGlzdHMsIHRoZW4gcmV0dXJuIHRoZQotICogYXBwcm9wcmlhdGUgbWV0cmljcyAobm90ZSB0aGF0IGZvbnRzIHdpdGggY29tbW9uIHBlci1jaGFyYWN0ZXIgbWV0cmljcyB3aWxsCi0gKiByZXR1cm4gbWluX2JvdW5kcykuICBJZiBub25lIG9mIHRoZXNlIGhvbGQgdHJ1ZSwgdHJ5IGFnYWluIHdpdGggdGhlIGRlZmF1bHQKLSAqIGNoYXIuCi0gKi8KLSNkZWZpbmUgQ0lfR0VUX0NIQVJfSU5GTyhmcyxjb2wsZGVmLGNzKSBcCi17IFwKLSAgICBjcyA9IGRlZjsgXAotICAgIGlmIChjb2wgPj0gZnMtPm1pbl9jaGFyX29yX2J5dGUyICYmIGNvbCA8PSBmcy0+bWF4X2NoYXJfb3JfYnl0ZTIpIHsgXAotCWlmIChmcy0+cGVyX2NoYXIgPT0gTlVMTCkgeyBcCi0JICAgIGNzID0gJmZzLT5taW5fYm91bmRzOyBcCi0JfSBlbHNlIHsgXAotCSAgICBjcyA9ICZmcy0+cGVyX2NoYXJbKGNvbCAtIGZzLT5taW5fY2hhcl9vcl9ieXRlMildOyBcCi0JICAgIGlmIChDSV9OT05FWElTVENIQVIoY3MpKSBjcyA9IGRlZjsgXAotCX0gXAotICAgIH0gXAotfQotCi0jZGVmaW5lIENJX0dFVF9ERUZBVUxUX0lORk8oZnMsY3MpIFwKLSAgQ0lfR0VUX0NIQVJfSU5GTyhmcywgZnMtPmRlZmF1bHRfY2hhciwgTlVMTCwgY3MpCi0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEZPTlRfTE9HRk9OVDMyQVRvTE9HRk9OVDE2Ci0gKi8KLXN0YXRpYyB2b2lkIEZPTlRfTE9HRk9OVDMyQVRvTE9HRk9OVDE2KCBjb25zdCBMT0dGT05UMzJBICpmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTE9HRk9OVDE2IGZvbnQxNiApCit0eXBlZGVmIHN0cnVjdAogewotICAgIGZvbnQxNi0+bGZIZWlnaHQgICAgICAgICA9IChJTlQxNilmb250LT5sZkhlaWdodDsKLSAgICBmb250MTYtPmxmV2lkdGggICAgICAgICAgPSAoSU5UMTYpZm9udC0+bGZXaWR0aDsKLSAgICBmb250MTYtPmxmRXNjYXBlbWVudCAgICAgPSAoSU5UMTYpZm9udC0+bGZFc2NhcGVtZW50OwotICAgIGZvbnQxNi0+bGZPcmllbnRhdGlvbiAgICA9IChJTlQxNilmb250LT5sZk9yaWVudGF0aW9uOwotICAgIGZvbnQxNi0+bGZXZWlnaHQgICAgICAgICA9IChJTlQxNilmb250LT5sZldlaWdodDsKLSAgICBmb250MTYtPmxmSXRhbGljICAgICAgICAgPSBmb250LT5sZkl0YWxpYzsKLSAgICBmb250MTYtPmxmVW5kZXJsaW5lICAgICAgPSBmb250LT5sZlVuZGVybGluZTsKLSAgICBmb250MTYtPmxmU3RyaWtlT3V0ICAgICAgPSBmb250LT5sZlN0cmlrZU91dDsKLSAgICBmb250MTYtPmxmQ2hhclNldCAgICAgICAgPSBmb250LT5sZkNoYXJTZXQ7Ci0gICAgZm9udDE2LT5sZk91dFByZWNpc2lvbiAgID0gZm9udC0+bGZPdXRQcmVjaXNpb247Ci0gICAgZm9udDE2LT5sZkNsaXBQcmVjaXNpb24gID0gZm9udC0+bGZDbGlwUHJlY2lzaW9uOwotICAgIGZvbnQxNi0+bGZRdWFsaXR5ICAgICAgICA9IGZvbnQtPmxmUXVhbGl0eTsKLSAgICBmb250MTYtPmxmUGl0Y2hBbmRGYW1pbHkgPSBmb250LT5sZlBpdGNoQW5kRmFtaWx5OwotICAgIGxzdHJjcHluMzJBKCBmb250MTYtPmxmRmFjZU5hbWUsIGZvbnQtPmxmRmFjZU5hbWUsIExGX0ZBQ0VTSVpFICk7Ci19CisgIExQTE9HRk9OVDE2ICAgICAgICAgICBscExvZ0ZvbnRQYXJhbTsKKyAgRk9OVEVOVU1QUk9DRVgxNiAgICAgIGxwRW51bUZ1bmM7CisgIExQQVJBTSAgICAgICAgICAgICAgICBscERhdGE7CiAKKyAgTFBORVdURVhUTUVUUklDRVgxNiAgIGxwVGV4dE1ldHJpYzsKKyAgTFBFTlVNTE9HRk9OVEVYMTYgICAgIGxwTG9nRm9udDsKKyAgU0VHUFRSICAgICAgICAgICAgICAgIHNlZ1RleHRNZXRyaWM7CisgIFNFR1BUUiAgICAgICAgICAgICAgICBzZWdMb2dGb250OworfSBmb250RW51bTE2OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBGT05UX0xPR0ZPTlQzMldUb0xPR0ZPTlQxNgotICovCi1zdGF0aWMgdm9pZCBGT05UX0xPR0ZPTlQzMldUb0xPR0ZPTlQxNiggY29uc3QgTE9HRk9OVDMyVyAqZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUExPR0ZPTlQxNiBmb250MTYgKQordHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBmb250MTYtPmxmSGVpZ2h0ICAgICAgICAgPSAoSU5UMTYpZm9udC0+bGZIZWlnaHQ7Ci0gICAgZm9udDE2LT5sZldpZHRoICAgICAgICAgID0gKElOVDE2KWZvbnQtPmxmV2lkdGg7Ci0gICAgZm9udDE2LT5sZkVzY2FwZW1lbnQgICAgID0gKElOVDE2KWZvbnQtPmxmRXNjYXBlbWVudDsKLSAgICBmb250MTYtPmxmT3JpZW50YXRpb24gICAgPSAoSU5UMTYpZm9udC0+bGZPcmllbnRhdGlvbjsKLSAgICBmb250MTYtPmxmV2VpZ2h0ICAgICAgICAgPSAoSU5UMTYpZm9udC0+bGZXZWlnaHQ7Ci0gICAgZm9udDE2LT5sZkl0YWxpYyAgICAgICAgID0gZm9udC0+bGZJdGFsaWM7Ci0gICAgZm9udDE2LT5sZlVuZGVybGluZSAgICAgID0gZm9udC0+bGZVbmRlcmxpbmU7Ci0gICAgZm9udDE2LT5sZlN0cmlrZU91dCAgICAgID0gZm9udC0+bGZTdHJpa2VPdXQ7Ci0gICAgZm9udDE2LT5sZkNoYXJTZXQgICAgICAgID0gZm9udC0+bGZDaGFyU2V0OwotICAgIGZvbnQxNi0+bGZPdXRQcmVjaXNpb24gICA9IGZvbnQtPmxmT3V0UHJlY2lzaW9uOwotICAgIGZvbnQxNi0+bGZDbGlwUHJlY2lzaW9uICA9IGZvbnQtPmxmQ2xpcFByZWNpc2lvbjsKLSAgICBmb250MTYtPmxmUXVhbGl0eSAgICAgICAgPSBmb250LT5sZlF1YWxpdHk7Ci0gICAgZm9udDE2LT5sZlBpdGNoQW5kRmFtaWx5ID0gZm9udC0+bGZQaXRjaEFuZEZhbWlseTsKLSAgICBsc3RyY3B5bld0b0EoIGZvbnQxNi0+bGZGYWNlTmFtZSwgZm9udC0+bGZGYWNlTmFtZSwgTEZfRkFDRVNJWkUgKTsKLX0KKyAgTFBMT0dGT05UMzJXICAgICAgICAgIGxwTG9nRm9udFBhcmFtOworICBGT05URU5VTVBST0MzMlcgICAgICAgbHBFbnVtRnVuYzsKKyAgTFBBUkFNICAgICAgICAgICAgICAgIGxwRGF0YTsKIAotCisgIExQTkVXVEVYVE1FVFJJQ0VYMzJXICBscFRleHRNZXRyaWM7CisgIExQRU5VTUxPR0ZPTlRFWDMyVyAgICBscExvZ0ZvbnQ7CisgIERXT1JEICAgICAgICAgICAgICAgICBkd0ZsYWdzOworfSBmb250RW51bTMyOworIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRk9OVF9MT0dGT05UMTZUb0xPR0ZPTlQzMkEKKyAqICAgICAgICAgICAgICBMT0dGT05UIGNvbnZlcnNpb24gZnVuY3Rpb25zLgogICovCi1zdGF0aWMgdm9pZCBGT05UX0xPR0ZPTlQxNlRvTE9HRk9OVDMyQSggTFBMT0dGT05UMTYgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUExPR0ZPTlQzMkEgZm9udDMyQSApCitzdGF0aWMgdm9pZCBfX2xvZ2ZvbnQzMnRvMTYoIElOVDE2KiBwbGYxNiwgSU5UMzIqIHBsZjMyICkKIHsKLSAgICBmb250MzJBLT5sZkhlaWdodCAgICAgICAgID0gKElOVDMyKWZvbnQtPmxmSGVpZ2h0OwotICAgIGZvbnQzMkEtPmxmV2lkdGggICAgICAgICAgPSAoSU5UMzIpZm9udC0+bGZXaWR0aDsKLSAgICBmb250MzJBLT5sZkVzY2FwZW1lbnQgICAgID0gKElOVDMyKWZvbnQtPmxmRXNjYXBlbWVudDsKLSAgICBmb250MzJBLT5sZk9yaWVudGF0aW9uICAgID0gKElOVDMyKWZvbnQtPmxmT3JpZW50YXRpb247Ci0gICAgZm9udDMyQS0+bGZXZWlnaHQgICAgICAgICA9IChJTlQzMilmb250LT5sZldlaWdodDsKLSAgICBmb250MzJBLT5sZkl0YWxpYyAgICAgICAgID0gZm9udC0+bGZJdGFsaWM7Ci0gICAgZm9udDMyQS0+bGZVbmRlcmxpbmUgICAgICA9IGZvbnQtPmxmVW5kZXJsaW5lOwotICAgIGZvbnQzMkEtPmxmU3RyaWtlT3V0ICAgICAgPSBmb250LT5sZlN0cmlrZU91dDsKLSAgICBmb250MzJBLT5sZkNoYXJTZXQgICAgICAgID0gZm9udC0+bGZDaGFyU2V0OwotICAgIGZvbnQzMkEtPmxmT3V0UHJlY2lzaW9uICAgPSBmb250LT5sZk91dFByZWNpc2lvbjsKLSAgICBmb250MzJBLT5sZkNsaXBQcmVjaXNpb24gID0gZm9udC0+bGZDbGlwUHJlY2lzaW9uOwotICAgIGZvbnQzMkEtPmxmUXVhbGl0eSAgICAgICAgPSBmb250LT5sZlF1YWxpdHk7Ci0gICAgZm9udDMyQS0+bGZQaXRjaEFuZEZhbWlseSA9IGZvbnQtPmxmUGl0Y2hBbmRGYW1pbHk7Ci0gICAgbHN0cmNweW4zMkEoIGZvbnQzMkEtPmxmRmFjZU5hbWUsIGZvbnQtPmxmRmFjZU5hbWUsIExGX0ZBQ0VTSVpFICk7CisgICAgaW50ICBpOworICAgIGZvciggaSA9IDA7IGkgPCA1OyBpKysgKSAqcGxmMTYrKyA9ICpwbGYzMisrOworICAgKigoSU5UMzIqKXBsZjE2KSsrID0gKnBsZjMyKys7CisgICAqKChJTlQzMiopcGxmMTYpICAgPSAqcGxmMzI7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRk9OVF9MT0dGT05UMTZUb0xPR0ZPTlQzMlcKLSAqLwotc3RhdGljIHZvaWQgRk9OVF9MT0dGT05UMTZUb0xPR0ZPTlQzMlcoIExQTE9HRk9OVDE2IGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBMT0dGT05UMzJXIGZvbnQzMlcgKQorc3RhdGljIHZvaWQgX19sb2dmb250MTZ0bzMyKCBJTlQzMiogcGxmMzIsIElOVDE2KiBwbGYxNiApCiB7Ci0gICAgZm9udDMyVy0+bGZIZWlnaHQgICAgICAgICA9IChJTlQzMilmb250LT5sZkhlaWdodDsKLSAgICBmb250MzJXLT5sZldpZHRoICAgICAgICAgID0gKElOVDMyKWZvbnQtPmxmV2lkdGg7Ci0gICAgZm9udDMyVy0+bGZFc2NhcGVtZW50ICAgICA9IChJTlQzMilmb250LT5sZkVzY2FwZW1lbnQ7Ci0gICAgZm9udDMyVy0+bGZPcmllbnRhdGlvbiAgICA9IChJTlQzMilmb250LT5sZk9yaWVudGF0aW9uOwotICAgIGZvbnQzMlctPmxmV2VpZ2h0ICAgICAgICAgPSAoSU5UMzIpZm9udC0+bGZXZWlnaHQ7Ci0gICAgZm9udDMyVy0+bGZJdGFsaWMgICAgICAgICA9IGZvbnQtPmxmSXRhbGljOwotICAgIGZvbnQzMlctPmxmVW5kZXJsaW5lICAgICAgPSBmb250LT5sZlVuZGVybGluZTsKLSAgICBmb250MzJXLT5sZlN0cmlrZU91dCAgICAgID0gZm9udC0+bGZTdHJpa2VPdXQ7Ci0gICAgZm9udDMyVy0+bGZDaGFyU2V0ICAgICAgICA9IGZvbnQtPmxmQ2hhclNldDsKLSAgICBmb250MzJXLT5sZk91dFByZWNpc2lvbiAgID0gZm9udC0+bGZPdXRQcmVjaXNpb247Ci0gICAgZm9udDMyVy0+bGZDbGlwUHJlY2lzaW9uICA9IGZvbnQtPmxmQ2xpcFByZWNpc2lvbjsKLSAgICBmb250MzJXLT5sZlF1YWxpdHkgICAgICAgID0gZm9udC0+bGZRdWFsaXR5OwotICAgIGZvbnQzMlctPmxmUGl0Y2hBbmRGYW1pbHkgPSBmb250LT5sZlBpdGNoQW5kRmFtaWx5OwotICAgIGxzdHJjcHluQXRvVyggZm9udDMyVy0+bGZGYWNlTmFtZSwgZm9udC0+bGZGYWNlTmFtZSwgTEZfRkFDRVNJWkUgKTsKKyAgICBpbnQgaTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgNTsgaSsrICkgKnBsZjMyKysgPSAqcGxmMTYrKzsKKyAgICpwbGYzMisrID0gKigoSU5UMzIqKXBsZjE2KSsrOworICAgKnBsZjMyICAgPSAqKChJTlQzMiopcGxmMTYpOwogfQogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEZPTlRfR2V0TWV0cmljcwotICovCi12b2lkIEZPTlRfR2V0TWV0cmljcyggTE9HRk9OVDE2ICogbG9nZm9udCwgWEZvbnRTdHJ1Y3QgKiB4Zm9udCwKLQkJICAgICAgVEVYVE1FVFJJQzE2ICogbWV0cmljcyApCi17ICAgIAotICAgIGludCBhdmVyYWdlLCBpLCBjb3VudDsKLSAgICB1bnNpZ25lZCBsb25nIHByb3A7Ci0JCi0gICAgbWV0cmljcy0+dG1Bc2NlbnQgID0geGZvbnQtPmFzY2VudDsKLSAgICBtZXRyaWNzLT50bURlc2NlbnQgPSB4Zm9udC0+ZGVzY2VudDsKLSAgICBtZXRyaWNzLT50bUhlaWdodCAgPSB4Zm9udC0+YXNjZW50ICsgeGZvbnQtPmRlc2NlbnQ7Ci0KLSAgICBtZXRyaWNzLT50bUludGVybmFsTGVhZGluZyAgPSAwOwotICAgIGlmIChYR2V0Rm9udFByb3BlcnR5KCB4Zm9udCwgWEFfQ0FQX0hFSUdIVCwgJnByb3AgKSkKLQltZXRyaWNzLT50bUludGVybmFsTGVhZGluZyA9IHhmb250LT5hc2NlbnQreGZvbnQtPmRlc2NlbnQtKElOVDE2KXByb3A7Ci0KLSAgICBtZXRyaWNzLT50bUV4dGVybmFsTGVhZGluZyAgPSAwOwotICAgIG1ldHJpY3MtPnRtTWF4Q2hhcldpZHRoICAgICA9IHhmb250LT5tYXhfYm91bmRzLndpZHRoOwotICAgIG1ldHJpY3MtPnRtV2VpZ2h0ICAgICAgICAgICA9IGxvZ2ZvbnQtPmxmV2VpZ2h0OwotICAgIG1ldHJpY3MtPnRtSXRhbGljICAgICAgICAgICA9IGxvZ2ZvbnQtPmxmSXRhbGljOwotICAgIG1ldHJpY3MtPnRtVW5kZXJsaW5lZCAgICAgICA9IGxvZ2ZvbnQtPmxmVW5kZXJsaW5lOwotICAgIG1ldHJpY3MtPnRtU3RydWNrT3V0ICAgICAgICA9IGxvZ2ZvbnQtPmxmU3RyaWtlT3V0OwotICAgIG1ldHJpY3MtPnRtRmlyc3RDaGFyICAgICAgICA9IHhmb250LT5taW5fY2hhcl9vcl9ieXRlMjsKLSAgICBtZXRyaWNzLT50bUxhc3RDaGFyICAgICAgICAgPSB4Zm9udC0+bWF4X2NoYXJfb3JfYnl0ZTI7Ci0gICAgbWV0cmljcy0+dG1EZWZhdWx0Q2hhciAgICAgID0geGZvbnQtPmRlZmF1bHRfY2hhcjsKLSAgICBtZXRyaWNzLT50bUJyZWFrQ2hhciAgICAgICAgPSAnICc7Ci0gICAgbWV0cmljcy0+dG1DaGFyU2V0ICAgICAgICAgID0gbG9nZm9udC0+bGZDaGFyU2V0OwotICAgIG1ldHJpY3MtPnRtT3ZlcmhhbmcgICAgICAgICA9IDA7Ci0gICAgbWV0cmljcy0+dG1EaWdpdGl6ZWRBc3BlY3RYID0gMTsKLSAgICBtZXRyaWNzLT50bURpZ2l0aXplZEFzcGVjdFkgPSAxOwotICAgIG1ldHJpY3MtPnRtUGl0Y2hBbmRGYW1pbHkgICA9IChsb2dmb250LT5sZlBpdGNoQW5kRmFtaWx5JjB4ZjApfFRNUEZfREVWSUNFOwotCi0gICAgLyogVE1QRl9GSVhFRF9QSVRDSCBiaXQgbWVhbnMgdmFyaWFibGUgcGl0Y2guLi5Eb24ndCB5b3UgbG92ZSBNaWNyb3NvZnQ/ICovCi0gICAgaWYgKHhmb250LT5taW5fYm91bmRzLndpZHRoICE9IHhmb250LT5tYXhfYm91bmRzLndpZHRoKQotICAgICAgICBtZXRyaWNzLT50bVBpdGNoQW5kRmFtaWx5IHw9IFRNUEZfRklYRURfUElUQ0g7Ci0KLSAgICBpZiAoIXhmb250LT5wZXJfY2hhcikgYXZlcmFnZSA9IG1ldHJpY3MtPnRtTWF4Q2hhcldpZHRoOwotICAgIGVsc2UKLSAgICB7Ci0JWENoYXJTdHJ1Y3QgKiBjaGFyUHRyID0geGZvbnQtPnBlcl9jaGFyOwotCWF2ZXJhZ2UgPSBjb3VudCA9IDA7Ci0JZm9yIChpID0gbWV0cmljcy0+dG1GaXJzdENoYXI7IGkgPD0gbWV0cmljcy0+dG1MYXN0Q2hhcjsgaSsrKQotCXsKLQkgICAgaWYgKCFDSV9OT05FWElTVENIQVIoIGNoYXJQdHIgKSkKLQkgICAgewotCQlhdmVyYWdlICs9IGNoYXJQdHItPndpZHRoOwotCQljb3VudCsrOwotCSAgICB9Ci0JICAgIGNoYXJQdHIrKzsKLQl9Ci0JaWYgKGNvdW50KSBhdmVyYWdlID0gKGF2ZXJhZ2UgKyBjb3VudC8yKSAvIGNvdW50OwotICAgIH0KLSAgICBtZXRyaWNzLT50bUF2ZUNoYXJXaWR0aCA9IGF2ZXJhZ2U7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0R2x5cGhPdXRsaW5lMTYgICAgKEdESS4zMDkpCi0gKi8KLURXT1JEIEdldEdseXBoT3V0bGluZTE2KCBIREMxNiBoZGMsIFVJTlQxNiB1Q2hhciwgVUlOVDE2IGZ1Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgIExQR0xZUEhNRVRSSUNTMTYgbHBnbSwgRFdPUkQgY2JCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQnVmZmVyLCBjb25zdCBNQVQyICpscG1hdDIgKQordm9pZCBGT05UX0xvZ0ZvbnQzMkFUbzE2KCBjb25zdCBMT0dGT05UMzJBKiBmb250MzIsIExQTE9HRk9OVDE2IGZvbnQxNiApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwiR2V0R2x5cGhPdXRMaW5lMTYoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKSAvLyAtIGVtcHR5IHN0dWIhXG4iLAotICAgICAgICAgICAgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOwotICAgIHJldHVybiAoRFdPUkQpLTE7IC8qIGZhaWx1cmUgKi8KKyAgX19sb2dmb250MzJ0bzE2KCAoSU5UMTYqKWZvbnQxNiwgKElOVDMyKilmb250MzIgKTsKKyAgICBsc3RyY3B5bjMyQSggZm9udDE2LT5sZkZhY2VOYW1lLCBmb250MzItPmxmRmFjZU5hbWUsIExGX0ZBQ0VTSVpFICk7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0R2x5cGhPdXRsaW5lMzJBICAgIChHREkzMi4xODYpCi0gKi8KLURXT1JEIEdldEdseXBoT3V0bGluZTMyQSggSERDMzIgaGRjLCBVSU5UMzIgdUNoYXIsIFVJTlQzMiBmdUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMUEdMWVBITUVUUklDUzMyIGxwZ20sIERXT1JEIGNiQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEJ1ZmZlciwgY29uc3QgTUFUMiAqbHBtYXQyICkKK3ZvaWQgRk9OVF9Mb2dGb250MzJXVG8xNiggY29uc3QgTE9HRk9OVDMyVyogZm9udDMyLCBMUExPR0ZPTlQxNiBmb250MTYgKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsIkdldEdseXBoT3V0TGluZTMyQSglMDR4LCAnJWMnLCAlMDR4LCAlcCwgJWxkLCAlcCwgJXApIC8vIC0gZW1wdHkgc3R1YiFcbiIsCi0gICAgICAgICAgICAgaGRjLCB1Q2hhciwgZnVGb3JtYXQsIGxwZ20sIGNiQnVmZmVyLCBscEJ1ZmZlciwgbHBtYXQyICk7Ci0gICAgcmV0dXJuIChEV09SRCktMTsgLyogZmFpbHVyZSAqLworICBfX2xvZ2ZvbnQzMnRvMTYoIChJTlQxNiopZm9udDE2LCAoSU5UMzIqKWZvbnQzMiApOworICAgIGxzdHJjcHluV3RvQSggZm9udDE2LT5sZkZhY2VOYW1lLCBmb250MzItPmxmRmFjZU5hbWUsIExGX0ZBQ0VTSVpFICk7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0R2x5cGhPdXRsaW5lMzJXICAgIChHREkzMi4xODcpCi0gKi8KLURXT1JEIEdldEdseXBoT3V0bGluZTMyVyggSERDMzIgaGRjLCBVSU5UMzIgdUNoYXIsIFVJTlQzMiBmdUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMUEdMWVBITUVUUklDUzMyIGxwZ20sIERXT1JEIGNiQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEJ1ZmZlciwgY29uc3QgTUFUMiAqbHBtYXQyICkKK3ZvaWQgRk9OVF9Mb2dGb250MTZUbzMyQSggTFBMT0dGT05UMTYgZm9udDE2LCBMUExPR0ZPTlQzMkEgZm9udDMyICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCJHZXRHbHlwaE91dExpbmUzMlcoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKSAvLyAtIGVtcHR5IHN0dWIhXG4iLAotICAgICAgICAgICAgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOwotICAgIHJldHVybiAoRFdPUkQpLTE7IC8qIGZhaWx1cmUgKi8KKyAgX19sb2dmb250MTZ0bzMyKCAoSU5UMzIqKWZvbnQzMiwgKElOVDE2Kilmb250MTYgKTsKKyAgICBsc3RyY3B5bjMyQSggZm9udDMyLT5sZkZhY2VOYW1lLCBmb250MTYtPmxmRmFjZU5hbWUsIExGX0ZBQ0VTSVpFICk7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UxNiAgIChHREkuMzEwKQotICovCi1CT09MMTYgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UxNiggVUlOVDE2IGZIaWRkZW4sIExQQ1NUUiBscHN6UmVzb3VyY2VGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBmb250RmlsZSwgTFBDU1RSIHBhdGggKQordm9pZCBGT05UX0xvZ0ZvbnQxNlRvMzJXKCBMUExPR0ZPTlQxNiBmb250MTYsIExQTE9HRk9OVDMyVyBmb250MzIgKQogewotICAgIHJldHVybiBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZTMyQSggZkhpZGRlbiwgbHBzelJlc291cmNlRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGaWxlLCBwYXRoICk7CisgIF9fbG9nZm9udDE2dG8zMiggKElOVDMyKilmb250MzIsIChJTlQxNiopZm9udDE2ICk7CisgICAgbHN0cmNweW5BdG9XKCBmb250MzItPmxmRmFjZU5hbWUsIGZvbnQxNi0+bGZGYWNlTmFtZSwgTEZfRkFDRVNJWkUgKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMkEgICAoR0RJMzIuNjIpCisgKiAgICAgICAgICAgICAgVEVYVE1FVFJJQyBjb252ZXJzaW9uIGZ1bmN0aW9ucy4KICAqLwotQk9PTDMyIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMzJBKCBEV09SRCBmSGlkZGVuLCBMUENTVFIgbHBzelJlc291cmNlRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwc3pGb250RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwc3pDdXJyZW50UGF0aCApCit2b2lkIEZPTlRfVGV4dE1ldHJpYzMyQXRvMTYoIExQVEVYVE1FVFJJQzMyQSBwdG0zMiwgTFBURVhUTUVUUklDMTYgcHRtMTYgKQogewotICAgIC8qIGZIaWRkZW49MSAtIG9ubHkgdmlzaWJsZSBmb3IgdGhlIGNhbGxpbmcgYXBwLCByZWFkLW9ubHksIG5vdAotICAgICAqIGVudW1iZXJlZCB3aXRoIEVudW1Gb250cy9FbnVtRm9udEZhbWlsaWVzCi0gICAgICogbHBzekN1cnJlbnRQYXRoIGNhbiBiZSBOVUxMCi0gICAgICovCi0gICAgZnByaW50ZihzdGRuaW1wLCJDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZSglbGQsJXMsJXMsJXMpIC8vIGVtcHR5IHN0dWJcbiIsCi0gICAgICAgICAgICBmSGlkZGVuLCBscHN6UmVzb3VyY2VGaWxlLCBscHN6Rm9udEZpbGUsIGxwc3pDdXJyZW50UGF0aCApOwotICAgIHJldHVybiBGQUxTRTsgLyogY3JlYXRlIGZhaWxlZCAqLworICAgIGludCAgICAgICAgIGk7CisgICAgSU5UMTYqICAgICAgcGkxNiA9IChJTlQxNiopcHRtMTY7CisKKyAgICooSU5UMzIqKSZwdG0xNi0+dG1GaXJzdENoYXIgPSAqKElOVDMyKikmcHRtMzItPnRtRmlyc3RDaGFyOworICAgKihJTlQzMiopJnB0bTE2LT50bUl0YWxpYyA9ICooSU5UMzIqKSZwdG0zMi0+dG1JdGFsaWM7CisgICAqKElOVDE2KikmcHRtMTYtPnRtUGl0Y2hBbmRGYW1pbHkgPSAqKElOVDE2KikmcHRtMzItPnRtUGl0Y2hBbmRGYW1pbHk7CisjZGVmaW5lIHBpMzIgKChJTlQzMiopcHRtMzIpCisgICAgZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApICpwaTE2KysgPSAqcGkzMisrOworICAgIHB0bTE2LT50bU92ZXJoYW5nID0gcGkzMlswXTsKKyAgICBwdG0xNi0+dG1EaWdpdGl6ZWRBc3BlY3RYID0gcGkzMlsxXTsKKyAgICBwdG0xNi0+dG1EaWdpdGl6ZWRBc3BlY3RZID0gcGkzMlsyXTsKKyN1bmRlZiAgcGkzMgogfQogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMzJXICAgKEdESTMyLjYzKQotICovCi1CT09MMzIgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMlcoIERXT1JEIGZIaWRkZW4sIExQQ1dTVFIgbHBzelJlc291cmNlRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBscHN6Rm9udEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbHBzekN1cnJlbnRQYXRoICkKK3ZvaWQgRk9OVF9UZXh0TWV0cmljMzJXdG8xNiggTFBURVhUTUVUUklDMzJXIHB0bTMyLCBMUFRFWFRNRVRSSUMxNiBwdG0xNiApCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZTMyVyglbGQsJXAsJXAsJXApIC8vIGVtcHR5IHN0dWJcbiIsCi0gICAgICAgICAgICBmSGlkZGVuLCBscHN6UmVzb3VyY2VGaWxlLCBscHN6Rm9udEZpbGUsIGxwc3pDdXJyZW50UGF0aCApOwotICAgIHJldHVybiBGQUxTRTsgLyogY3JlYXRlIGZhaWxlZCAqLworICAgIGludCAgICAgICAgIGk7CisgICAgSU5UMTYqICAgICAgcGkxNiA9IChJTlQxNiopcHRtMTY7CisKKyAgICBwdG0xNi0+dG1GaXJzdENoYXIgPSBwdG0zMi0+dG1GaXJzdENoYXI7CisgICAgcHRtMTYtPnRtTGFzdENoYXIgPSBwdG0zMi0+dG1MYXN0Q2hhcjsKKyAgICBwdG0xNi0+dG1EZWZhdWx0Q2hhciA9IHB0bTMyLT50bURlZmF1bHRDaGFyOworICAgIHB0bTE2LT50bUJyZWFrQ2hhciA9IHB0bTMyLT50bUJyZWFrQ2hhcjsKKyAgICooSU5UMzIqKSZwdG0xNi0+dG1JdGFsaWMgPSAqKElOVDMyKikmcHRtMzItPnRtSXRhbGljOworICAgKihJTlQxNiopJnB0bTE2LT50bVBpdGNoQW5kRmFtaWx5ID0gKihJTlQxNiopJnB0bTMyLT50bVBpdGNoQW5kRmFtaWx5OworI2RlZmluZSBwaTMyICgoSU5UMzIqKXB0bTMyKQorICAgIGZvciggaSA9IDA7IGkgPCA4OyBpKysgKSAqcGkxNisrID0gKnBpMzIrKzsKKyAgICBwdG0xNi0+dG1PdmVyaGFuZyA9IHBpMzJbMF07CisgICAgcHRtMTYtPnRtRGlnaXRpemVkQXNwZWN0WCA9IHBpMzJbMV07CisgICAgcHRtMTYtPnRtRGlnaXRpemVkQXNwZWN0WSA9IHBpMzJbMl07CisjdW5kZWYgIHBpMzIKIH0KIAordm9pZCBGT05UX1RleHRNZXRyaWMxNnRvMzJBKCBMUFRFWFRNRVRSSUMxNiBwdG0xNiwgTFBURVhUTUVUUklDMzJBIHB0bTMyICkKK3sKKyAgICBpbnQgICAgICAgICBpOworICAgIElOVDE2KiAgICAgIHBpMTYgPSAoSU5UMTYqKXB0bTE2OworCisgICAqKElOVDMyKikmcHRtMzItPnRtRmlyc3RDaGFyID0gKihJTlQzMiopJnB0bTE2LT50bUZpcnN0Q2hhcjsKKyAgICooSU5UMzIqKSZwdG0zMi0+dG1JdGFsaWMgPSAqKElOVDMyKikmcHRtMTYtPnRtSXRhbGljOworICAgKihJTlQxNiopJnB0bTMyLT50bVBpdGNoQW5kRmFtaWx5ID0gKihJTlQxNiopJnB0bTE2LT50bVBpdGNoQW5kRmFtaWx5OworI2RlZmluZSBwaTMyICgoSU5UMzIqKXB0bTMyKQorICAgIGZvciggaSA9IDA7IGkgPCA4OyBpKysgKSAqcGkzMisrID0gKnBpMTYrKzsKKyAgICBwaTMyWzBdID0gcHRtMTYtPnRtT3Zlcmhhbmc7CisgICAgcGkzMlsxXSA9IHB0bTE2LT50bURpZ2l0aXplZEFzcGVjdFg7CisgICAgcGkzMlsyXSA9IHB0bTE2LT50bURpZ2l0aXplZEFzcGVjdFk7CisjdW5kZWYgIHBpMzIKK30KKwordm9pZCBGT05UX1RleHRNZXRyaWMxNnRvMzJXKCBMUFRFWFRNRVRSSUMxNiBwdG0xNiwgTFBURVhUTUVUUklDMzJXIHB0bTMyICkKK3sKKyAgICBpbnQgICAgICAgICBpOworICAgIElOVDE2KiAgICAgIHBpMTYgPSAoSU5UMTYqKXB0bTE2OworCisgICAgcHRtMzItPnRtRmlyc3RDaGFyID0gcHRtMTYtPnRtRmlyc3RDaGFyOworICAgIHB0bTMyLT50bUxhc3RDaGFyID0gcHRtMTYtPnRtTGFzdENoYXI7CisgICAgcHRtMzItPnRtRGVmYXVsdENoYXIgPSBwdG0xNi0+dG1EZWZhdWx0Q2hhcjsKKyAgICBwdG0zMi0+dG1CcmVha0NoYXIgPSBwdG0xNi0+dG1CcmVha0NoYXI7CisgICAqKElOVDMyKikmcHRtMzItPnRtSXRhbGljID0gKihJTlQzMiopJnB0bTE2LT50bUl0YWxpYzsKKyAgICooSU5UMTYqKSZwdG0zMi0+dG1QaXRjaEFuZEZhbWlseSA9ICooSU5UMTYqKSZwdG0xNi0+dG1QaXRjaEFuZEZhbWlseTsKKyNkZWZpbmUgcGkzMiAoKElOVDMyKilwdG0zMikKKyAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkgKnBpMzIrKyA9ICpwaTE2Kys7CisgICAgcGkzMlswXSA9IHB0bTE2LT50bU92ZXJoYW5nOworICAgIHBpMzJbMV0gPSBwdG0xNi0+dG1EaWdpdGl6ZWRBc3BlY3RYOworICAgIHBpMzJbMl0gPSBwdG0xNi0+dG1EaWdpdGl6ZWRBc3BlY3RZOworI3VuZGVmICBwaTMyCit9CisKK3ZvaWQgRk9OVF9UZXh0TWV0cmljMzJBdG8zMlcoIExQVEVYVE1FVFJJQzMyQSBwdG0zMkEsIExQVEVYVE1FVFJJQzMyVyBwdG0zMlcgKQoreworICAgIGludCAgICAgICAgIGk7CisjZGVmaW5lIHBpMzJBICgoSU5UMzIqKXB0bTMyQSkKKyNkZWZpbmUgcGkzMlcgKChJTlQzMiopcHRtMzJXKQorICAgIGZvciggaSA9IDA7IGkgPCA4OyBpKysgKSAqcGkzMlcrKyA9ICpwaTMyQSsrOworI3VuZGVmIHBpMzJXCisjdW5kZWYgcGkzMkEKKyNkZWZpbmUgcGNoMzJBICgoQllURSopcHRtMzJBKQorI2RlZmluZSBwY2gzMlcgKChXQ0hBUiopcHRtMzJXKQorICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApICpwY2gzMlcrKyA9ICpwY2gzMkErKzsKKyN1bmRlZiBwY2gzMlcKKyNkZWZpbmUgcGNoMzJXICgoQllURSopcHRtMzJXKQorICAgZm9yKCBpID0gMDsgaSA8IDU7IGkrKyApICpwY2gzMlcrKyA9ICpwY2gzMkErKzsKKyN1bmRlZiBwY2gzMlcKKyN1bmRlZiBwY2gzMkEKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ3JlYXRlRm9udEluZGlyZWN0MTYgICAoR0RJLjU3KQogICovCiBIRk9OVDE2IENyZWF0ZUZvbnRJbmRpcmVjdDE2KCBjb25zdCBMT0dGT05UMTYgKmZvbnQgKQogewotICAgIEZPTlRPQkogKiBmb250UHRyOwotICAgIEhGT05UMTYgaGZvbnQ7CisgICAgSEZPTlQxNiBoRm9udCA9IDA7CiAKLSAgICBpZiAoIWZvbnQpCisgICAgaWYgKGZvbnQpCiAgICAgewotCWZwcmludGYoc3RkZXJyLCJDcmVhdGVGb250SW5kaXJlY3Q6IGZvbnQgaXMgTlVMTCA6IHJldHVybmluZyBOVUxMXG4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaGZvbnQgPSBHRElfQWxsb2NPYmplY3QoIHNpemVvZihGT05UT0JKKSwgRk9OVF9NQUdJQyApOwotICAgIGlmICghaGZvbnQpIHJldHVybiAwOwotICAgIGZvbnRQdHIgPSAoRk9OVE9CSiAqKSBHRElfSEVBUF9MSU5fQUREUiggaGZvbnQgKTsKLSAgICBtZW1jcHkoICZmb250UHRyLT5sb2dmb250LCBmb250LCBzaXplb2YoTE9HRk9OVDE2KSApOwotICAgIGRwcmludGZfZm9udChzdGRkZWIsIkNyZWF0ZUZvbnRJbmRpcmVjdCglcCAoJWQsJWQpKTsgcmV0dXJuICUwNHhcbiIsCi0JZm9udCwgZm9udC0+bGZIZWlnaHQsIGZvbnQtPmxmV2lkdGgsIGhmb250KTsKLSAgICByZXR1cm4gaGZvbnQ7Ci19CisJaEZvbnQgPSBHRElfQWxsb2NPYmplY3QoIHNpemVvZihGT05UT0JKKSwgRk9OVF9NQUdJQyApOworCWlmKCBoRm9udCApCisJeworCSAgICBGT05UT0JKKiBmb250UHRyOworCSAgICBmb250UHRyID0gKEZPTlRPQkogKikgR0RJX0hFQVBfTElOX0FERFIoIGhGb250ICk7CisJICAgIG1lbWNweSggJmZvbnRQdHItPmxvZ2ZvbnQsIGZvbnQsIHNpemVvZihMT0dGT05UMTYpICk7CiAKKwkgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiQ3JlYXRlRm9udEluZGlyZWN0KCVpICVpKSAnJXMnICVzICVzID0+ICUwNHhcbiIsCisJCQkJIGZvbnQtPmxmSGVpZ2h0LCBmb250LT5sZldpZHRoLCAKKwkJCQkgZm9udC0+bGZGYWNlTmFtZSA/IGZvbnQtPmxmRmFjZU5hbWUgOiAiTlVMTCIsCisJCQkJIGZvbnQtPmxmV2VpZ2h0ID4gNDAwID8gIkJvbGQiIDogIiIsCisJCQkJIGZvbnQtPmxmSXRhbGljID8gIkl0YWxpYyIgOiAiIiwKKwkJCQkgaEZvbnQpOworCX0KKyAgICB9CisgICAgZWxzZSBmcHJpbnRmKHN0ZGVyciwiQ3JlYXRlRm9udEluZGlyZWN0KE5VTEwpID0+IE5VTExcbiIpOworCisgICAgcmV0dXJuIGhGb250OworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDcmVhdGVGb250SW5kaXJlY3QzMkEgICAoR0RJMzIuNDQpCkBAIC0zMTIsMTIgKzIxMCwxMCBAQAogewogICAgIExPR0ZPTlQxNiBmb250MTY7CiAKLSAgICBGT05UX0xPR0ZPTlQzMkFUb0xPR0ZPTlQxNihmb250LCZmb250MTYpOwotCisgICAgRk9OVF9Mb2dGb250MzJBVG8xNiggZm9udCwgJmZvbnQxNiApOwogICAgIHJldHVybiBDcmVhdGVGb250SW5kaXJlY3QxNiggJmZvbnQxNiApOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENyZWF0ZUZvbnRJbmRpcmVjdDMyVyAgIChHREkzMi40NSkKICAqLwpAQCAtMzI1LDExICsyMjEsMTAgQEAKIHsKICAgICBMT0dGT05UMTYgZm9udDE2OwogCi0gICAgRk9OVF9MT0dGT05UMzJXVG9MT0dGT05UMTYoZm9udCwmZm9udDE2KTsKKyAgICBGT05UX0xvZ0ZvbnQzMldUbzE2KCBmb250LCAmZm9udDE2ICk7CiAgICAgcmV0dXJuIENyZWF0ZUZvbnRJbmRpcmVjdDE2KCAmZm9udDE2ICk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ3JlYXRlRm9udDE2ICAgIChHREkuNTYpCiAgKi8KQEAgLTMzOCwxNiArMjMzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgQllURSBzdHJpa2VvdXQsIEJZVEUgY2hhcnNldCwgQllURSBvdXRwcmVzLAogICAgICAgICAgICAgICAgICAgICAgIEJZVEUgY2xpcHByZXMsIEJZVEUgcXVhbGl0eSwgQllURSBwaXRjaCwgTFBDU1RSIG5hbWUgKQogewotICAgIExPR0ZPTlQxNiBsb2dmb250ID0ge2hlaWdodCwgd2lkdGgsIGVzYywgb3JpZW50LCB3ZWlnaHQsIGl0YWxpYywgdW5kZXJsaW5lLAotICAgICAgICAgICAgICAgICAgICAgIHN0cmlrZW91dCwgY2hhcnNldCwgb3V0cHJlcywgY2xpcHByZXMsIHF1YWxpdHksIHBpdGNoLCB9OwotICAgIGRwcmludGZfZm9udChzdGRkZWIsIkNyZWF0ZUZvbnQxNiglZCwlZClcbiIsIGhlaWdodCwgd2lkdGgpOwotICAgIGlmIChuYW1lKSBsc3RyY3B5bjMyQShsb2dmb250LmxmRmFjZU5hbWUsbmFtZSxzaXplb2YobG9nZm9udC5sZkZhY2VOYW1lKSk7Ci0gICAgZWxzZSBsb2dmb250LmxmRmFjZU5hbWVbMF0gPSAnXDAnOworICAgIExPR0ZPTlQxNiBsb2dmb250ID0geyBoZWlnaHQsIHdpZHRoLCBlc2MsIG9yaWVudCwgd2VpZ2h0LCBpdGFsaWMsIHVuZGVybGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlb3V0LCBjaGFyc2V0LCBvdXRwcmVzLCBjbGlwcHJlcywgcXVhbGl0eSwgcGl0Y2gsIH07CisKKyAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJDcmVhdGVGb250MTYoJyVzJywlZCwlZClcbiIsIG5hbWUsIGhlaWdodCwgd2lkdGgpOworICAgIGlmIChuYW1lKSAKKwlsc3RyY3B5bjMyQShsb2dmb250LmxmRmFjZU5hbWUsbmFtZSxzaXplb2YobG9nZm9udC5sZkZhY2VOYW1lKSk7CisgICAgZWxzZSAKKwlsb2dmb250LmxmRmFjZU5hbWVbMF0gPSAnXDAnOwogICAgIHJldHVybiBDcmVhdGVGb250SW5kaXJlY3QxNiggJmxvZ2ZvbnQgKTsKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ3JlYXRlRm9udDMyQSAgICAoR0RJMzIuNDMpCiAgKi8KQEAgLTM2MSw3ICsyNTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwcmVzLCBxdWFsaXR5LCBwaXRjaCwgbmFtZSApOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ3JlYXRlRm9udDMyVyAgICAoR0RJMzIuNDYpCiAgKi8KQEAgLTM5MSw3ICsyODYsNiBAQAogICAgIHJldHVybiBjb3VudDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBGT05UX0dldE9iamVjdDMyQQogICovCkBAIC0zOTksMjIgKzI5Myw3IEBACiB7CiAgICAgTE9HRk9OVDMyQSBmbnQzMjsKIAotICAgIG1lbXNldCgmZm50MzIsIDAsIHNpemVvZihmbnQzMikpOwotICAgIGZudDMyLmxmSGVpZ2h0ICAgICAgICAgPSBmb250LT5sb2dmb250LmxmSGVpZ2h0OwotICAgIGZudDMyLmxmV2lkdGggICAgICAgICAgPSBmb250LT5sb2dmb250LmxmV2lkdGg7Ci0gICAgZm50MzIubGZFc2NhcGVtZW50ICAgICA9IGZvbnQtPmxvZ2ZvbnQubGZFc2NhcGVtZW50OwotICAgIGZudDMyLmxmT3JpZW50YXRpb24gICAgPSBmb250LT5sb2dmb250LmxmT3JpZW50YXRpb247Ci0gICAgZm50MzIubGZXZWlnaHQgICAgICAgICA9IGZvbnQtPmxvZ2ZvbnQubGZXZWlnaHQ7Ci0gICAgZm50MzIubGZJdGFsaWMgICAgICAgICA9IGZvbnQtPmxvZ2ZvbnQubGZJdGFsaWM7Ci0gICAgZm50MzIubGZVbmRlcmxpbmUgICAgICA9IGZvbnQtPmxvZ2ZvbnQubGZVbmRlcmxpbmU7Ci0gICAgZm50MzIubGZTdHJpa2VPdXQgICAgICA9IGZvbnQtPmxvZ2ZvbnQubGZTdHJpa2VPdXQ7Ci0gICAgZm50MzIubGZDaGFyU2V0ICAgICAgICA9IGZvbnQtPmxvZ2ZvbnQubGZDaGFyU2V0OwotICAgIGZudDMyLmxmT3V0UHJlY2lzaW9uICAgPSBmb250LT5sb2dmb250LmxmT3V0UHJlY2lzaW9uOwotICAgIGZudDMyLmxmQ2xpcFByZWNpc2lvbiAgPSBmb250LT5sb2dmb250LmxmQ2xpcFByZWNpc2lvbjsKLSAgICBmbnQzMi5sZlF1YWxpdHkgICAgICAgID0gZm9udC0+bG9nZm9udC5sZlF1YWxpdHk7Ci0gICAgZm50MzIubGZQaXRjaEFuZEZhbWlseSA9IGZvbnQtPmxvZ2ZvbnQubGZQaXRjaEFuZEZhbWlseTsKLSAgICBzdHJuY3B5KCBmbnQzMi5sZkZhY2VOYW1lLCBmb250LT5sb2dmb250LmxmRmFjZU5hbWUsCi0gICAgICAgICAgICAgc2l6ZW9mKGZudDMyLmxmRmFjZU5hbWUpICk7CisgICAgRk9OVF9Mb2dGb250MTZUbzMyQSggJmZvbnQtPmxvZ2ZvbnQsICZmbnQzMiApOwogCiAgICAgaWYgKGNvdW50ID4gc2l6ZW9mKGZudDMyKSkgY291bnQgPSBzaXplb2YoZm50MzIpOwogICAgIG1lbWNweSggYnVmZmVyLCAmZm50MzIsIGNvdW50ICk7CkBAIC00MjIsNiArMzAxLDIwNyBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEZPTlRfRW51bUluc3RhbmNlMTYKKyAqCisgKiBDYWxsZWQgYnkgdGhlIGRldmljZSBkcml2ZXIgbGF5ZXIgdG8gcGFzcyBmb250IGluZm8KKyAqIGRvd24gdG8gdGhlIGFwcGxpY2F0aW9uLgorICovCitzdGF0aWMgSU5UMzIgRk9OVF9FbnVtSW5zdGFuY2UxNiggTFBFTlVNTE9HRk9OVDE2IHBsZiwgCisJCQkJICBMUE5FV1RFWFRNRVRSSUMxNiBwdG0sIFVJTlQxNiBmVHlwZSwgTFBBUkFNIGxwICkKK3sKKyNkZWZpbmUgcGZlICgoZm9udEVudW0xNiopbHApCisgICAgaWYoIHBmZS0+bHBMb2dGb250UGFyYW0tPmxmQ2hhclNldCA9PSBERUZBVUxUX0NIQVJTRVQgfHwgCisJcGZlLT5scExvZ0ZvbnRQYXJhbS0+bGZDaGFyU2V0ID09IHBsZi0+ZWxmTG9nRm9udC5sZkNoYXJTZXQgKQorICAgIHsKKwltZW1jcHkoIHBmZS0+bHBMb2dGb250LCBwbGYsIHNpemVvZihFTlVNTE9HRk9OVDE2KSApOworCW1lbWNweSggcGZlLT5scFRleHRNZXRyaWMsIHB0bSwgc2l6ZW9mKE5FV1RFWFRNRVRSSUMxNikgKTsKKworICAgICAgICByZXR1cm4gcGZlLT5scEVudW1GdW5jKCBwZmUtPnNlZ0xvZ0ZvbnQsIHBmZS0+c2VnVGV4dE1ldHJpYywgZlR5cGUsIChMUEFSQU0pKHBmZS0+bHBEYXRhKSApOworICAgIH0KKyN1bmRlZiBwZmUKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgRk9OVF9FbnVtSW5zdGFuY2UzMgorICovCitzdGF0aWMgSU5UMzIgRk9OVF9FbnVtSW5zdGFuY2UzMiggTFBFTlVNTE9HRk9OVDE2IHBsZiwKKwkJCQkgIExQTkVXVEVYVE1FVFJJQzE2IHB0bSwgVUlOVDE2IGZUeXBlLCBMUEFSQU0gbHAgKQoreworICAgIC8qIGxmQ2hhclNldCBpcyBhdCB0aGUgc2FtZSBvZmZzZXQgaW4gYm90aCBMT0dGT05UMzJBIGFuZCBMT0dGT05UMzJXICovCisKKyNkZWZpbmUgcGZlICgoZm9udEVudW0zMiopbHApCisgICAgaWYoIHBmZS0+bHBMb2dGb250UGFyYW0tPmxmQ2hhclNldCA9PSBERUZBVUxUX0NIQVJTRVQgfHwgCisJcGZlLT5scExvZ0ZvbnRQYXJhbS0+bGZDaGFyU2V0ID09IHBsZi0+ZWxmTG9nRm9udC5sZkNoYXJTZXQgKQorICAgIHsKKwkvKiBjb252ZXJ0IGZvbnQgbWV0cmljcyAqLworCisJaWYoIHBmZS0+ZHdGbGFncyAmIEVOVU1fVU5JQ09ERSApCisJeworCSAgICBGT05UX0xvZ0ZvbnQxNlRvMzJXKCAmcGxmLT5lbGZMb2dGb250LCAoTFBMT0dGT05UMzJXKShwZmUtPmxwTG9nRm9udCkgKTsKKwkgICAgRk9OVF9UZXh0TWV0cmljMTZ0bzMyVyggKExQVEVYVE1FVFJJQzE2KXB0bSwgKExQVEVYVE1FVFJJQzMyVykocGZlLT5scFRleHRNZXRyaWMpICk7CisJfQorCWVsc2UKKwl7CisJICAgIEZPTlRfTG9nRm9udDE2VG8zMkEoICZwbGYtPmVsZkxvZ0ZvbnQsIChMUExPR0ZPTlQzMkEpcGZlLT5scExvZ0ZvbnQgKTsKKwkgICAgRk9OVF9UZXh0TWV0cmljMTZ0bzMyQSggKExQVEVYVE1FVFJJQzE2KXB0bSwgKExQVEVYVE1FVFJJQzMyQSlwZmUtPmxwVGV4dE1ldHJpYyApOworCX0KKworICAgICAgICByZXR1cm4gcGZlLT5scEVudW1GdW5jKCAoTFBFTlVNTE9HRk9OVDMyVylwZmUtPmxwTG9nRm9udCwgCisJCQkJKExQTkVXVEVYVE1FVFJJQzMyVylwZmUtPmxwVGV4dE1ldHJpYywgZlR5cGUsIHBmZS0+bHBEYXRhICk7CisgICAgfQorI3VuZGVmIHBmZQorICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBFbnVtRm9udEZhbWlsaWVzRXgxNgkoR0RJLjYxMykKKyAqLworSU5UMTYgRW51bUZvbnRGYW1pbGllc0V4MTYoIEhEQzE2IGhEQywgTFBMT0dGT05UMTYgcGxmLCBGT05URU5VTVBST0NFWDE2IGVmcHJvYywgTFBBUkFNIGxQYXJhbSwgRFdPUkQgZHdGbGFncykKK3sKKyAgICBJTlQxNglyZXRWYWwgPSAwOworICAgIERDKiAJZGMgPSAoREMqKSBHRElfR2V0T2JqUHRyKCBoREMsIERDX01BR0lDICk7CisKKyAgICBpZiggZGMgJiYgZGMtPmZ1bmNzLT5wRW51bURldmljZUZvbnRzICkKKyAgICB7CisJTFBORVdURVhUTUVUUklDRVgxNglscHRtMTYgPSBTRUdQVFJfQUxMT0MoIHNpemVvZihORVdURVhUTUVUUklDRVgxNikgKTsKKwlpZiggbHB0bTE2ICkKKwl7CisJICAgIExQRU5VTUxPR0ZPTlRFWDE2CWxwbGYxNiA9IFNFR1BUUl9BTExPQyggc2l6ZW9mKEVOVU1MT0dGT05URVgxNikgKTsKKwkgICAgaWYoIGxwbGYxNiApCisJICAgIHsKKwkJZm9udEVudW0xNglmZTE2ID0geyBwbGYsIGVmcHJvYywgbFBhcmFtLCBscHRtMTYsIGxwbGYxNiwgCisJCQkJCSBTRUdQVFJfR0VUKGxwdG0xNiksIFNFR1BUUl9HRVQobHBsZjE2KSB9OworCisJCXJldFZhbCA9IGRjLT5mdW5jcy0+cEVudW1EZXZpY2VGb250cyggZGMsIHBsZiwgRk9OVF9FbnVtSW5zdGFuY2UxNiwgKExQQVJBTSkmZmUxNiApOworCisJCVNFR1BUUl9GUkVFKGxwbGYxNik7CisJICAgIH0KKwkgICAgU0VHUFRSX0ZSRUUobHB0bTE2KTsKKwl9CisgICAgfQorICAgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUZPTlRfRW51bUZvbnRGYW1pbGllc0V4MzIKKyAqLworc3RhdGljIElOVDMyIEZPTlRfRW51bUZvbnRGYW1pbGllc0V4MzIoIEhEQzMyIGhEQywgTFBMT0dGT05UMzJXIHBsZiwgRk9OVEVOVU1QUk9DMzJXIGVmcHJvYywgCisJCQkJCSAgICAgICAgICAgTFBBUkFNIGxQYXJhbSwgRFdPUkQgZHdVbmljb2RlKQoreworICAgIERDKgkJZGMgPSAoREMqKSBHRElfR2V0T2JqUHRyKCBoREMsIERDX01BR0lDICk7CisKKyAgICBpZiggZGMgJiYgZGMtPmZ1bmNzLT5wRW51bURldmljZUZvbnRzICkKKyAgICB7CisJTE9HRk9OVDE2CQlsZjE2OworCU5FV1RFWFRNRVRSSUNFWDMyVyAJdG0zMnc7CisJRU5VTUxPR0ZPTlRFWDMyVwlsZjMydzsKKwlmb250RW51bTMyCQlmZTMyID0geyBwbGYsIGVmcHJvYywgbFBhcmFtLCAmdG0zMncsICZsZjMydywgZHdVbmljb2RlIH07IAorCisJLyogdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIExPR0ZPTlQzMkEgYW5kIExPR0ZPTlQzMlcgaXMgaW4gdGhlIGxmRmFjZU5hbWUgKi8KKworCWlmKCBwbGYtPmxmRmFjZU5hbWVbMF0gKQorCXsKKwkgICAgaWYoIGR3VW5pY29kZSApCisJCWxzdHJjcHluV3RvQSggbGYxNi5sZkZhY2VOYW1lLCBwbGYtPmxmRmFjZU5hbWUsIExGX0ZBQ0VTSVpFICk7CisJICAgIGVsc2UKKwkJbHN0cmNweW4zMkEoIGxmMTYubGZGYWNlTmFtZSwgKExQQ1NUUilwbGYtPmxmRmFjZU5hbWUsIExGX0ZBQ0VTSVpFICk7CisJfQorCWVsc2UgbGYxNi5sZkZhY2VOYW1lWzBdID0gJ1wwJzsKKwlsZjE2LmxmQ2hhclNldCA9IHBsZi0+bGZDaGFyU2V0OworCisJcmV0dXJuIGRjLT5mdW5jcy0+cEVudW1EZXZpY2VGb250cyggZGMsICZsZjE2LCBGT05UX0VudW1JbnN0YW5jZTMyLCAoTFBBUkFNKSZmZTMyICk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBFbnVtRm9udEZhbWlsaWVzRXgzMlcJKEdESTMyLjgyKQorICovCitJTlQzMiBFbnVtRm9udEZhbWlsaWVzRXgzMlcoIEhEQzMyIGhEQywgTFBMT0dGT05UMzJXIHBsZiwgRk9OVEVOVU1QUk9DRVgzMlcgZWZwcm9jLCAKKwkJCQkJTFBBUkFNIGxQYXJhbSwgRFdPUkQgZHdGbGFncyApCit7CisgICAgcmV0dXJuICBGT05UX0VudW1Gb250RmFtaWxpZXNFeDMyKCBoREMsIHBsZiwgKEZPTlRFTlVNUFJPQzMyVyllZnByb2MsIAorCQkJCQkJICBsUGFyYW0sIEVOVU1fVU5JQ09ERSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBFbnVtRm9udEZhbWlsaWVzRXgzMkEJKEdESTMyLjgxKQorICovCitJTlQzMiBFbnVtRm9udEZhbWlsaWVzRXgzMkEoIEhEQzMyIGhEQywgTFBMT0dGT05UMzJBIHBsZiwgRk9OVEVOVU1QUk9DRVgzMkEgZWZwcm9jLCAKKwkJCQkJTFBBUkFNIGxQYXJhbSwgRFdPUkQgZHdGbGFncykKK3sKKyAgICByZXR1cm4gIEZPTlRfRW51bUZvbnRGYW1pbGllc0V4MzIoIGhEQywgKExQTE9HRk9OVDMyVylwbGYsIAorCQkJCSAgICAgIChGT05URU5VTVBST0MzMlcpZWZwcm9jLCBsUGFyYW0sIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBFbnVtRm9udEZhbWlsaWVzMTYJKEdESS4zMzApCisgKi8KK0lOVDE2IEVudW1Gb250RmFtaWxpZXMxNiggSERDMTYgaERDLCBMUENTVFIgbHBGYW1pbHksIEZPTlRFTlVNUFJPQzE2IGVmcHJvYywgTFBBUkFNIGxwRGF0YSApCit7CisgICAgTE9HRk9OVDE2CWxmOworCisgICAgbGYubGZDaGFyU2V0ID0gREVGQVVMVF9DSEFSU0VUOworICAgIGlmKCBscEZhbWlseSApIGxzdHJjcHluMzJBKCBsZi5sZkZhY2VOYW1lLCBscEZhbWlseSwgTEZfRkFDRVNJWkUgKTsKKyAgICBlbHNlIGxmLmxmRmFjZU5hbWVbMF0gPSAnXDAnOworCisgICAgcmV0dXJuIEVudW1Gb250RmFtaWxpZXNFeDE2KCBoREMsICZsZiwgKEZPTlRFTlVNUFJPQ0VYMTYpZWZwcm9jLCBscERhdGEsIDAgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgRW51bUZvbnRGYW1pbGllczMyQQkoR0RJMzIuODApCisgKi8KK0lOVDMyIEVudW1Gb250RmFtaWxpZXMzMkEoIEhEQzMyIGhEQywgTFBDU1RSIGxwRmFtaWx5LCBGT05URU5VTVBST0MzMkEgZWZwcm9jLCBMUEFSQU0gbHBEYXRhICkKK3sKKyAgICBMT0dGT05UMzJBCWxmOworCisgICAgbGYubGZDaGFyU2V0ID0gREVGQVVMVF9DSEFSU0VUOworICAgIGlmKCBscEZhbWlseSApIGxzdHJjcHluMzJBKCBsZi5sZkZhY2VOYW1lLCBscEZhbWlseSwgTEZfRkFDRVNJWkUgKTsKKyAgICBlbHNlIGxmLmxmRmFjZU5hbWVbMF0gPSBsZi5sZkZhY2VOYW1lWzFdID0gJ1wwJzsKKworICAgIHJldHVybiBGT05UX0VudW1Gb250RmFtaWxpZXNFeDMyKCBoREMsIChMUExPR0ZPTlQzMlcpJmxmLCAKKwkJCQkJICAgKEZPTlRFTlVNUFJPQzMyVyllZnByb2MsIGxwRGF0YSwgMCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBFbnVtRm9udEZhbWlsaWVzMzJXCShHREkzMi44MykKKyAqLworSU5UMzIgRW51bUZvbnRGYW1pbGllczMyVyggSERDMzIgaERDLCBMUENXU1RSIGxwRmFtaWx5LCBGT05URU5VTVBST0MzMlcgZWZwcm9jLCBMUEFSQU0gbHBEYXRhICkKK3sKKyAgICBMT0dGT05UMzJXICBsZjsKKworICAgIGxmLmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsKKyAgICBpZiggbHBGYW1pbHkgKSBsc3RyY3B5bjMyVyggbGYubGZGYWNlTmFtZSwgbHBGYW1pbHksIExGX0ZBQ0VTSVpFICk7CisgICAgZWxzZSBsZi5sZkZhY2VOYW1lWzBdID0gMDsKKworICAgIHJldHVybiBGT05UX0VudW1Gb250RmFtaWxpZXNFeDMyKCBoREMsICZsZiwgZWZwcm9jLCBscERhdGEsIEVOVU1fVU5JQ09ERSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBFbnVtRm9udHMxNgkJKEdESS43MCkKKyAqLworSU5UMTYgRW51bUZvbnRzMTYoIEhEQzE2IGhEQywgTFBDU1RSIGxwTmFtZSwgRk9OVEVOVU1QUk9DMTYgZWZwcm9jLCBMUEFSQU0gbHBEYXRhICkKK3sKKyAgICByZXR1cm4gRW51bUZvbnRGYW1pbGllczE2KCBoREMsIGxwTmFtZSwgKEZPTlRFTlVNUFJPQ0VYMTYpZWZwcm9jLCBscERhdGEgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgRW51bUZvbnRzMzJBCQkoR0RJMzIuODQpCisgKi8KK0lOVDMyIEVudW1Gb250czMyQSggSERDMzIgaERDLCBMUENTVFIgbHBOYW1lLCBGT05URU5VTVBST0MzMkEgZWZwcm9jLCBMUEFSQU0gbHBEYXRhICkKK3sKKyAgICByZXR1cm4gRW51bUZvbnRGYW1pbGllczMyQSggaERDLCBscE5hbWUsIGVmcHJvYywgbHBEYXRhICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEVudW1Gb250czMyVwkJKEdESTMyLjg1KQorICovCitJTlQzMiBFbnVtRm9udHMzMlcoIEhEQzMyIGhEQywgTFBDV1NUUiBscE5hbWUsIEZPTlRFTlVNUFJPQzMyVyBlZnByb2MsIExQQVJBTSBscERhdGEgKQoreworICAgIHJldHVybiBFbnVtRm9udEZhbWlsaWVzMzJXKCBoREMsIGxwTmFtZSwgZWZwcm9jLCBscERhdGEgKTsKK30KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQzMiw3ICs1MTIsNyBAQAogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiAwOwogICAgIHJldHVybiBhYnMoIChkYy0+dy5jaGFyRXh0cmEgKiBkYy0+d25kRXh0WCArIGRjLT52cG9ydEV4dFggLyAyKQotCSAgICAgICAgIC8gZGMtPnZwb3J0RXh0WCApOworICAgICAgICAgICAgICAgICAvIGRjLT52cG9ydEV4dFggKTsKIH0KIAogCkBAIC00NDQsNyArNTI0LDcgQEAKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSByZXR1cm4gMDsKICAgICByZXR1cm4gYWJzKCAoZGMtPncuY2hhckV4dHJhICogZGMtPnduZEV4dFggKyBkYy0+dnBvcnRFeHRYIC8gMikKLQkgICAgICAgICAvIGRjLT52cG9ydEV4dFggKTsKKyAgICAgICAgICAgICAgICAgLyBkYy0+dnBvcnRFeHRYICk7CiB9CiAKIApAQCAtNDY1LDcgKzU0NSw3IEBACiAgICAgSU5UMzIgcHJldjsKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSByZXR1cm4gMDsKLSAgICBleHRyYSA9IChleHRyYSAqIGRjLT52cG9ydEV4dFggKyBkYy0+d25kRXh0WCAvIDIpIC8gZGMtPnduZEV4dFg7ICAgIAorICAgIGV4dHJhID0gKGV4dHJhICogZGMtPnZwb3J0RXh0WCArIGRjLT53bmRFeHRYIC8gMikgLyBkYy0+d25kRXh0WDsKICAgICBwcmV2ID0gZGMtPncuY2hhckV4dHJhOwogICAgIGRjLT53LmNoYXJFeHRyYSA9IGFicyhleHRyYSk7CiAgICAgcmV0dXJuIChwcmV2ICogZGMtPnduZEV4dFggKyBkYy0+dnBvcnRFeHRYIC8gMikgLyBkYy0+dnBvcnRFeHRYOwpAQCAtNDk0LDE0ICs1NzQsMTQgQEAKICAgICBkYy0+dy5icmVha1RvdGFsRXh0cmEgPSBleHRyYTsKICAgICBkYy0+dy5icmVha0NvdW50ID0gYnJlYWtzOwogICAgIGlmIChicmVha3MpCi0gICAgewkKLQlkYy0+dy5icmVha0V4dHJhID0gZXh0cmEgLyBicmVha3M7Ci0JZGMtPncuYnJlYWtSZW0gICA9IGV4dHJhIC0gKGRjLT53LmJyZWFrQ291bnQgKiBkYy0+dy5icmVha0V4dHJhKTsKKyAgICB7CisgICAgICAgIGRjLT53LmJyZWFrRXh0cmEgPSBleHRyYSAvIGJyZWFrczsKKyAgICAgICAgZGMtPncuYnJlYWtSZW0gICA9IGV4dHJhIC0gKGRjLT53LmJyZWFrQ291bnQgKiBkYy0+dy5icmVha0V4dHJhKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQlkYy0+dy5icmVha0V4dHJhID0gMDsKLQlkYy0+dy5icmVha1JlbSAgID0gMDsKKyAgICAgICAgZGMtPncuYnJlYWtFeHRyYSA9IDA7CisgICAgICAgIGRjLT53LmJyZWFrUmVtICAgPSAwOwogICAgIH0KICAgICByZXR1cm4gMTsKIH0KQEAgLTUxMiw3ICs1OTIsNyBAQAogICovCiBJTlQxNiBHZXRUZXh0RmFjZTE2KCBIREMxNiBoZGMsIElOVDE2IGNvdW50LCBMUFNUUiBuYW1lICkKIHsKLQlyZXR1cm4gR2V0VGV4dEZhY2UzMkEoaGRjLGNvdW50LG5hbWUpOworICAgICAgICByZXR1cm4gR2V0VGV4dEZhY2UzMkEoaGRjLGNvdW50LG5hbWUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU3OSw3ICs2NTksNyBAQAogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpCiAgICAgewotCWlmICghKGRjID0gKERDICopR0RJX0dldE9ialB0ciggaGRjLCBNRVRBRklMRV9EQ19NQUdJQyApKSkKKyAgICAgICAgaWYgKCEoZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKCBoZGMsIE1FVEFGSUxFX0RDX01BR0lDICkpKQogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIApAQCAtNTg4LDcgKzY2OCw3IEBACiAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIGRwcmludGZfZm9udChzdGRkZWIsIkdldFRleHRFeHRlbnRQb2ludCglMDh4ICclLipzJyAlZCAlcCk6IHJldHVybmluZyAlZCwlZFxuIiwKLQkJIGhkYywgY291bnQsIHN0ciwgY291bnQsIHNpemUsIHNpemUtPmN4LCBzaXplLT5jeSApOworICAgICAgICAgICAgICAgICBoZGMsIGNvdW50LCBzdHIsIGNvdW50LCBzaXplLCBzaXplLT5jeCwgc2l6ZS0+Y3kgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNjA1LDExICs2ODUsMTIgQEAKICAgICByZXR1cm4gcmV0OwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFRleHRFeHRlbnRQb2ludDMyQUJ1Z2d5ICAgIChHREkzMi4yMzIpCiAgKi8KIEJPT0wzMiBHZXRUZXh0RXh0ZW50UG9pbnQzMkFCdWdneSggSERDMzIgaGRjLCBMUENTVFIgc3RyLCBJTlQzMiBjb3VudCwKLQkJCQkgICBMUFNJWkUzMiBzaXplICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTSVpFMzIgc2l6ZSApCiB7CiAgICAgZHByaW50Zl9mb250KCBzdGRkZWIsICJHZXRUZXh0RXh0ZW50UG9pbnQzMkFCdWdneTogbm90IGJ1ZyBjb21wYXRpYmxlLlxuIik7CiAgICAgcmV0dXJuIEdldFRleHRFeHRlbnRQb2ludDMyQSggaGRjLCBzdHIsIGNvdW50LCBzaXplICk7CkBAIC02MTksNyArNzAwLDcgQEAKICAqICAgICAgICAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMldCdWdneSAgICAoR0RJMzIuMjMzKQogICovCiBCT09MMzIgR2V0VGV4dEV4dGVudFBvaW50MzJXQnVnZ3koIEhEQzMyIGhkYywgTFBDV1NUUiBzdHIsIElOVDMyIGNvdW50LAotCQkJCSAgIExQU0laRTMyIHNpemUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNJWkUzMiBzaXplICkKIHsKICAgICBkcHJpbnRmX2ZvbnQoIHN0ZGRlYiwgIkdldFRleHRFeHRlbnRQb2ludDMyV0J1Z2d5OiBub3QgYnVnIGNvbXBhdGlibGUuXG4iKTsKICAgICByZXR1cm4gR2V0VGV4dEV4dGVudFBvaW50MzJXKCBoZGMsIHN0ciwgY291bnQsIHNpemUgKTsKQEAgLTYzMywzOSArNzE0LDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIG1heEV4dCxMUElOVDMyIGxwbkZpdCwgTFBJTlQzMiBhbHBEeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTSVpFMzIgc2l6ZSApCiB7Ci0gIGludCBpbmRleDsKLSAgU0laRTMyIHRTaXplOwotICBpbnQgbkZpdD0wOwotICBpbnQgZXh0ZW50PTA7Ci0gIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwotICBpZiAoIWRjKQotICAgIHsKLSAgICAgIGlmICghKGRjID0gKERDICopR0RJX0dldE9ialB0ciggaGRjLCBNRVRBRklMRV9EQ19NQUdJQyApKSkKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotICBpZiAoIWRjLT5mdW5jcy0+cEdldFRleHRFeHRlbnRQb2ludCkgcmV0dXJuIEZBTFNFOworICAgIGludCBpbmRleCwgbkZpdCwgZXh0ZW50OworICAgIFNJWkUzMiB0U2l6ZTsKKyAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKIAotICBzaXplLT5jeD0wOyBzaXplLT5jeT0wOwotICBmb3IoaW5kZXg9MDtpbmRleDxjb3VudDtpbmRleCsrKQorICAgIGlmICghZGMpCiAgICAgewotICAgICAgaWYoIWRjLT5mdW5jcy0+cEdldFRleHRFeHRlbnRQb2ludCggZGMsIHN0ciwgMSwgJnRTaXplICkpIHJldHVybiBGQUxTRTsKLSAgICAgIGlmKGV4dGVudCt0U2l6ZS5jeDxtYXhFeHQpCi0JewotCSAgZXh0ZW50Kz10U2l6ZS5jeDsKLQkgIG5GaXQrKzsKLQkgIHN0cisrOwotCSAgaWYoYWxwRHgpIGFscER4W2luZGV4XT1leHRlbnQ7Ci0JICBpZih0U2l6ZS5jeSA+IHNpemUtPmN5KSBzaXplLT5jeT10U2l6ZS5jeTsKLQl9Ci0gICAgICBlbHNlIGJyZWFrOworCWlmICghKGRjID0gKERDICopR0RJX0dldE9ialB0ciggaGRjLCBNRVRBRklMRV9EQ19NQUdJQyApKSkKKwkgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgc2l6ZS0+Y3g9ZXh0ZW50OwotICAqbHBuRml0PW5GaXQ7Ci0gIGRwcmludGZfZm9udChzdGRkZWIsIkdldFRleHRFeHRlbnRFeFBvaW50MzJBKCUwOHggJyUuKnMnICVkKSByZXR1cm5pbmcgJWQgJWQgJWRcbiIsCisgICAgaWYgKCFkYy0+ZnVuY3MtPnBHZXRUZXh0RXh0ZW50UG9pbnQpIHJldHVybiBGQUxTRTsKKworICAgIHNpemUtPmN4ID0gc2l6ZS0+Y3kgPSBuRml0ID0gZXh0ZW50ID0gMDsKKyAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKQorICAgIHsKKyAJaWYoIWRjLT5mdW5jcy0+cEdldFRleHRFeHRlbnRQb2ludCggZGMsIHN0ciwgMSwgJnRTaXplICkpIHJldHVybiBGQUxTRTsKKwlpZiggZXh0ZW50K3RTaXplLmN4IDwgbWF4RXh0ICkKKyAgICAgICAgeworCSAgICBleHRlbnQrPXRTaXplLmN4OworCSAgICBuRml0Kys7CisJICAgIHN0cisrOworCSAgICBpZiggYWxwRHggKSBhbHBEeFtpbmRleF0gPSBleHRlbnQ7CisJICAgIGlmKCB0U2l6ZS5jeSA+IHNpemUtPmN5ICkgc2l6ZS0+Y3kgPSB0U2l6ZS5jeTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGJyZWFrOworICAgIH0KKyAgICBzaXplLT5jeCA9IGV4dGVudDsKKyAgICpscG5GaXQgPSBuRml0OworCisgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiR2V0VGV4dEV4dGVudEV4UG9pbnQzMkEoJTA4eCAnJS4qcycgJWQpIHJldHVybmluZyAlZCAlZCAlZFxuIiwKICAgICAgICAgICAgICAgIGhkYyxjb3VudCxzdHIsbWF4RXh0LG5GaXQsIHNpemUtPmN4LHNpemUtPmN5KTsKLSAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0VGV4dEV4dGVudEV4UG9pbnQzMlcgICAgKEdESTMyLjIyOSkKICAqLwpAQCAtNjc2LDcgKzc1OCw3IEBACiB7CiAgICAgTFBTVFIgcCA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3RyICk7CiAgICAgQk9PTDMyIHJldCA9IEdldFRleHRFeHRlbnRFeFBvaW50MzJBKCBoZGMsIHAsIGNvdW50LCBtYXhFeHQsCi0JCQkJCWxwbkZpdCwgYWxwRHgsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwbkZpdCwgYWxwRHgsIHNpemUpOwogICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwICk7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTY4NiwyOSArNzY4LDEwIEBACiAgKi8KIEJPT0wxNiBHZXRUZXh0TWV0cmljczE2KCBIREMxNiBoZGMsIFRFWFRNRVRSSUMxNiAqbWV0cmljcyApCiB7Ci0gICAgVEVYVE1FVFJJQzMyQSB0bTsKLSAgICAKLSAgICBpZiAoIUdldFRleHRNZXRyaWNzMzJBKCAoSERDMzIpaGRjLCAmdG0gKSkgcmV0dXJuIEZBTFNFOwotICAgIG1ldHJpY3MtPnRtSGVpZ2h0ICAgICAgICAgICA9IHRtLnRtSGVpZ2h0OwotICAgIG1ldHJpY3MtPnRtQXNjZW50ICAgICAgICAgICA9IHRtLnRtQXNjZW50OwotICAgIG1ldHJpY3MtPnRtRGVzY2VudCAgICAgICAgICA9IHRtLnRtRGVzY2VudDsKLSAgICBtZXRyaWNzLT50bUludGVybmFsTGVhZGluZyAgPSB0bS50bUludGVybmFsTGVhZGluZzsKLSAgICBtZXRyaWNzLT50bUV4dGVybmFsTGVhZGluZyAgPSB0bS50bUV4dGVybmFsTGVhZGluZzsKLSAgICBtZXRyaWNzLT50bUF2ZUNoYXJXaWR0aCAgICAgPSB0bS50bUF2ZUNoYXJXaWR0aDsKLSAgICBtZXRyaWNzLT50bU1heENoYXJXaWR0aCAgICAgPSB0bS50bU1heENoYXJXaWR0aDsKLSAgICBtZXRyaWNzLT50bVdlaWdodCAgICAgICAgICAgPSB0bS50bVdlaWdodDsKLSAgICBtZXRyaWNzLT50bU92ZXJoYW5nICAgICAgICAgPSB0bS50bU92ZXJoYW5nOwotICAgIG1ldHJpY3MtPnRtRGlnaXRpemVkQXNwZWN0WCA9IHRtLnRtRGlnaXRpemVkQXNwZWN0WDsKLSAgICBtZXRyaWNzLT50bURpZ2l0aXplZEFzcGVjdFkgPSB0bS50bURpZ2l0aXplZEFzcGVjdFk7Ci0gICAgbWV0cmljcy0+dG1GaXJzdENoYXIgICAgICAgID0gdG0udG1GaXJzdENoYXI7Ci0gICAgbWV0cmljcy0+dG1MYXN0Q2hhciAgICAgICAgID0gdG0udG1MYXN0Q2hhcjsKLSAgICBtZXRyaWNzLT50bURlZmF1bHRDaGFyICAgICAgPSB0bS50bURlZmF1bHRDaGFyOwotICAgIG1ldHJpY3MtPnRtQnJlYWtDaGFyICAgICAgICA9IHRtLnRtQnJlYWtDaGFyOwotICAgIG1ldHJpY3MtPnRtSXRhbGljICAgICAgICAgICA9IHRtLnRtSXRhbGljOwotICAgIG1ldHJpY3MtPnRtVW5kZXJsaW5lZCAgICAgICA9IHRtLnRtVW5kZXJsaW5lZDsKLSAgICBtZXRyaWNzLT50bVN0cnVja091dCAgICAgICAgPSB0bS50bVN0cnVja091dDsKLSAgICBtZXRyaWNzLT50bVBpdGNoQW5kRmFtaWx5ICAgPSB0bS50bVBpdGNoQW5kRmFtaWx5OwotICAgIG1ldHJpY3MtPnRtQ2hhclNldCAgICAgICAgICA9IHRtLnRtQ2hhclNldDsKKyAgICBURVhUTUVUUklDMzJBIHRtMzI7CisKKyAgICBpZiAoIUdldFRleHRNZXRyaWNzMzJBKCAoSERDMzIpaGRjLCAmdG0zMiApKSByZXR1cm4gRkFMU0U7CisgICAgRk9OVF9UZXh0TWV0cmljMzJBdG8xNiggJnRtMzIsIG1ldHJpY3MgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNzE4LDU3ICs3ODEsMzUgQEAKICAqLwogQk9PTDMyIEdldFRleHRNZXRyaWNzMzJBKCBIREMzMiBoZGMsIFRFWFRNRVRSSUMzMkEgKm1ldHJpY3MgKQogewotREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CisgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykKICAgICB7Ci0JaWYgKCEoZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKCBoZGMsIE1FVEFGSUxFX0RDX01BR0lDICkpKQorICAgICAgICBpZiAoIShkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoIGhkYywgTUVUQUZJTEVfRENfTUFHSUMgKSkpCiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgaWYgKCFkYy0+ZnVuY3MtPnBHZXRUZXh0TWV0cmljcyB8fAogICAgICAgICAhZGMtPmZ1bmNzLT5wR2V0VGV4dE1ldHJpY3MoIGRjLG1ldHJpY3MgKSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIGRwcmludGZfZm9udChzdGRuaW1wLCJ0ZXh0IG1ldHJpY3M6XG4KLQlJbnRlcm5hbExlYWRpbmcgPSAlaQotCUV4dGVybmFsTGVhZGluZyA9ICVpCi0JTWF4Q2hhcldpZHRoID0gJWkKLQlXZWlnaHQgPSAlaQotCUl0YWxpYyA9ICVpCi0JVW5kZXJsaW5lZCA9ICVpCi0JU3RydWNrT3V0ID0gJWkKLQlGaXJzdENoYXIgPSAlaQotCUxhc3RDaGFyID0gJWkKLQlEZWZhdWx0Q2hhciA9ICVpCi0JQnJlYWtDaGFyID0gJWkKLQlDaGFyU2V0ID0gJWkKLQlPdmVyaGFuZyA9ICVpCi0JRGlnaXRpemVkQXNwZWN0WCA9ICVpCi0JRGlnaXRpemVkQXNwZWN0WSA9ICVpCi0JQXZlQ2hhcldpZHRoID0gJWkKLQlNYXhDaGFyV2lkdGggPSAlaQotCUFzY2VudCA9ICVpCi0JRGVzY2VudCA9ICVpCi0JSGVpZ2h0ID0gJWlcbiIsCi0gICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtSW50ZXJuYWxMZWFkaW5nLAotICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bUV4dGVybmFsTGVhZGluZywKLSAgICAgICAgICAgICAgICAgbWV0cmljcy0+dG1NYXhDaGFyV2lkdGgsCi0gICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtV2VpZ2h0LAotICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bUl0YWxpYywKLSAgICAgICAgICAgICAgICAgbWV0cmljcy0+dG1VbmRlcmxpbmVkLAotICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bVN0cnVja091dCwKLSAgICAgICAgICAgICAgICAgbWV0cmljcy0+dG1GaXJzdENoYXIsCi0gICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtTGFzdENoYXIsCi0gICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtRGVmYXVsdENoYXIsCi0gICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtQnJlYWtDaGFyLAotICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bUNoYXJTZXQsCi0gICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtT3ZlcmhhbmcsCi0gICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtRGlnaXRpemVkQXNwZWN0WCwKLSAgICAgICAgICAgICAgICAgbWV0cmljcy0+dG1EaWdpdGl6ZWRBc3BlY3RZLAotICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bUF2ZUNoYXJXaWR0aCwKLSAgICAgICAgICAgICAgICAgbWV0cmljcy0+dG1NYXhDaGFyV2lkdGgsCi0gICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtQXNjZW50LAotICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bURlc2NlbnQsCi0gICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtSGVpZ2h0KTsKKworICAgIGRwcmludGZfZm9udChzdGRuaW1wLCJ0ZXh0IG1ldHJpY3M6CisgICAgV2VpZ2h0ID0gJTAzaVx0IEZpcnN0Q2hhciA9ICUwM2lcdCBBdmVDaGFyV2lkdGggPSAlaQorICAgIEl0YWxpYyA9ICUgM2lcdCBMYXN0Q2hhciA9ICUwM2lcdFx0IE1heENoYXJXaWR0aCA9ICVpCisgICAgVW5kZXJMaW5lZCA9ICUwMWlcdCBEZWZhdWx0Q2hhciA9ICUwM2lcdCBPdmVyaGFuZyA9ICVpCisgICAgU3RydWNrT3V0ID0gJTAxaVx0IEJyZWFrQ2hhciA9ICUwM2lcdCBDaGFyU2V0ID0gJWkKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEludGVybmFsTGVhZGluZyA9ICVpCisgICAgQXNjZW50ID0gJWkKKyAgICBEZXNjZW50ID0gJWkKKyAgICBIZWlnaHQgPSAlaVxuIiwKKyAgICBtZXRyaWNzLT50bVdlaWdodCwgbWV0cmljcy0+dG1GaXJzdENoYXIsIG1ldHJpY3MtPnRtQXZlQ2hhcldpZHRoLAorICAgIG1ldHJpY3MtPnRtSXRhbGljLCBtZXRyaWNzLT50bUxhc3RDaGFyLCBtZXRyaWNzLT50bU1heENoYXJXaWR0aCwKKyAgICBtZXRyaWNzLT50bVVuZGVybGluZWQsIG1ldHJpY3MtPnRtRGVmYXVsdENoYXIsIG1ldHJpY3MtPnRtT3ZlcmhhbmcsCisgICAgbWV0cmljcy0+dG1TdHJ1Y2tPdXQsIG1ldHJpY3MtPnRtQnJlYWtDaGFyLCBtZXRyaWNzLT50bUNoYXJTZXQsCisgICAgbWV0cmljcy0+dG1JbnRlcm5hbExlYWRpbmcsCisgICAgbWV0cmljcy0+dG1Bc2NlbnQsCisgICAgbWV0cmljcy0+dG1EZXNjZW50LAorICAgIG1ldHJpY3MtPnRtSGVpZ2h0ICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTc4MCwzMSArODIxLDgyIEBACiB7CiAgICAgVEVYVE1FVFJJQzMyQSB0bTsKICAgICBpZiAoIUdldFRleHRNZXRyaWNzMzJBKCAoSERDMTYpaGRjLCAmdG0gKSkgcmV0dXJuIEZBTFNFOwotICAgIG1ldHJpY3MtPnRtSGVpZ2h0ICAgICAgICAgICA9IHRtLnRtSGVpZ2h0OwotICAgIG1ldHJpY3MtPnRtQXNjZW50ICAgICAgICAgICA9IHRtLnRtQXNjZW50OwotICAgIG1ldHJpY3MtPnRtRGVzY2VudCAgICAgICAgICA9IHRtLnRtRGVzY2VudDsKLSAgICBtZXRyaWNzLT50bUludGVybmFsTGVhZGluZyAgPSB0bS50bUludGVybmFsTGVhZGluZzsKLSAgICBtZXRyaWNzLT50bUV4dGVybmFsTGVhZGluZyAgPSB0bS50bUV4dGVybmFsTGVhZGluZzsKLSAgICBtZXRyaWNzLT50bUF2ZUNoYXJXaWR0aCAgICAgPSB0bS50bUF2ZUNoYXJXaWR0aDsKLSAgICBtZXRyaWNzLT50bU1heENoYXJXaWR0aCAgICAgPSB0bS50bU1heENoYXJXaWR0aDsKLSAgICBtZXRyaWNzLT50bVdlaWdodCAgICAgICAgICAgPSB0bS50bVdlaWdodDsKLSAgICBtZXRyaWNzLT50bU92ZXJoYW5nICAgICAgICAgPSB0bS50bU92ZXJoYW5nOwotICAgIG1ldHJpY3MtPnRtRGlnaXRpemVkQXNwZWN0WCA9IHRtLnRtRGlnaXRpemVkQXNwZWN0WDsKLSAgICBtZXRyaWNzLT50bURpZ2l0aXplZEFzcGVjdFkgPSB0bS50bURpZ2l0aXplZEFzcGVjdFk7Ci0gICAgbWV0cmljcy0+dG1GaXJzdENoYXIgICAgICAgID0gdG0udG1GaXJzdENoYXI7Ci0gICAgbWV0cmljcy0+dG1MYXN0Q2hhciAgICAgICAgID0gdG0udG1MYXN0Q2hhcjsKLSAgICBtZXRyaWNzLT50bURlZmF1bHRDaGFyICAgICAgPSB0bS50bURlZmF1bHRDaGFyOwotICAgIG1ldHJpY3MtPnRtQnJlYWtDaGFyICAgICAgICA9IHRtLnRtQnJlYWtDaGFyOwotICAgIG1ldHJpY3MtPnRtSXRhbGljICAgICAgICAgICA9IHRtLnRtSXRhbGljOwotICAgIG1ldHJpY3MtPnRtVW5kZXJsaW5lZCAgICAgICA9IHRtLnRtVW5kZXJsaW5lZDsKLSAgICBtZXRyaWNzLT50bVN0cnVja091dCAgICAgICAgPSB0bS50bVN0cnVja091dDsKLSAgICBtZXRyaWNzLT50bVBpdGNoQW5kRmFtaWx5ICAgPSB0bS50bVBpdGNoQW5kRmFtaWx5OwotICAgIG1ldHJpY3MtPnRtQ2hhclNldCAgICAgICAgICA9IHRtLnRtQ2hhclNldDsKKyAgICBGT05UX1RleHRNZXRyaWMzMkF0bzMyVyggJnRtLCBtZXRyaWNzICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q2hhcldpZHRoMTYgICAgKEdESS4zNTApCisgKi8KK0JPT0wxNiBHZXRDaGFyV2lkdGgxNiggSERDMTYgaGRjLCBVSU5UMTYgZmlyc3RDaGFyLCBVSU5UMTYgbGFzdENoYXIsCisgICAgICAgICAgICAgICAgICAgICAgIExQSU5UMTYgYnVmZmVyICkKK3sKKyAgICBCT09MMzIJcmV0VmFsID0gRkFMU0U7CisKKyAgICBpZiggZmlyc3RDaGFyICE9IGxhc3RDaGFyICkKKyAgICB7CisJTFBJTlQzMglidWYzMiA9IChMUElOVDMyKUhlYXBBbGxvYyhTeXN0ZW1IZWFwLCAwLAorCQkJCSBzaXplb2YoSU5UMzIpKigxICsgKGxhc3RDaGFyIC0gZmlyc3RDaGFyKSkpOworCWlmKCBidWYzMiApCisJeworCSAgICBMUElOVDMyCW9idWYzMiA9IGJ1ZjMyOworCSAgICBpbnQJCWk7CisKKyAgICAgICAgICAgIHJldFZhbCA9IEdldENoYXJXaWR0aDMyQShoZGMsIGZpcnN0Q2hhciwgbGFzdENoYXIsIGJ1ZjMyKTsKKwkgICAgaWYgKHJldFZhbCkKKwkgICAgeworCQlmb3IgKGkgPSBmaXJzdENoYXI7IGkgPD0gbGFzdENoYXI7IGkrKykKKwkJICAgICpidWZmZXIrKyA9ICpidWYzMisrOworCSAgICB9CisJICAgIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIG9idWYzMik7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCUlOVDMyIGNoV2lkdGg7CisJcmV0VmFsID0gR2V0Q2hhcldpZHRoMzJBKGhkYywgZmlyc3RDaGFyLCBsYXN0Q2hhciwgJmNoV2lkdGggKTsKKwkqYnVmZmVyID0gY2hXaWR0aDsKKyAgICB9CisgICAgcmV0dXJuIHJldFZhbDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRDaGFyV2lkdGgzMkEgICAgKEdESTMyLjE1NSkKKyAqLworQk9PTDMyIEdldENoYXJXaWR0aDMyQSggSERDMzIgaGRjLCBVSU5UMzIgZmlyc3RDaGFyLCBVSU5UMzIgbGFzdENoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICBMUElOVDMyIGJ1ZmZlciApCit7CisgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CisgICAgaWYgKCFkYykKKyAgICB7CisgICAgICAgIGlmICghKGRjID0gKERDICopR0RJX0dldE9ialB0ciggaGRjLCBNRVRBRklMRV9EQ19NQUdJQyApKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWRjLT5mdW5jcy0+cEdldENoYXJXaWR0aCB8fAorICAgICAgICAhZGMtPmZ1bmNzLT5wR2V0Q2hhcldpZHRoKCBkYywgZmlyc3RDaGFyLCBsYXN0Q2hhciwgYnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q2hhcldpZHRoMzJXICAgIChHREkzMi4xNTgpCisgKi8KK0JPT0wzMiBHZXRDaGFyV2lkdGgzMlcoIEhEQzMyIGhkYywgVUlOVDMyIGZpcnN0Q2hhciwgVUlOVDMyIGxhc3RDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgTFBJTlQzMiBidWZmZXIgKQoreworICAgIHJldHVybiBHZXRDaGFyV2lkdGgzMkEoIGhkYywgZmlyc3RDaGFyLCBsYXN0Q2hhciwgYnVmZmVyICk7Cit9CisKKworCisvKiBGSVhNRTogYWxsIGZvbGxvd2luZyBBUElzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgogICogICAgICAgICAgIFNldE1hcHBlckZsYWdzMTYgICAgKEdESS4zNDkpCiAgKi8KIERXT1JEIFNldE1hcHBlckZsYWdzMTYoIEhEQzE2IGhEQywgRFdPUkQgZHdGbGFnICkKQEAgLTgxOCwxMiArOTEwLDEyIEBACiAgKi8KIERXT1JEIFNldE1hcHBlckZsYWdzMzIoIEhEQzMyIGhEQywgRFdPUkQgZHdGbGFnICkKIHsKLSAgICBkcHJpbnRmX2ZvbnQoc3RkbmltcCwiU2V0bWFwcGVyRmxhZ3MoJTA0eCwgJTA4bFgpIC8vIEVtcHR5IFN0dWIgIVxuIiwgCi0JCSBoREMsIGR3RmxhZyk7IAorICAgIGRwcmludGZfZm9udChzdGRuaW1wLCJTZXRtYXBwZXJGbGFncyglMDR4LCAlMDhsWCkgLy8gRW1wdHkgU3R1YiAhXG4iLAorICAgICAgICAgICAgICAgICBoREMsIGR3RmxhZyk7CiAgICAgcmV0dXJuIDBMOwogfQogCi0gCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldENoYXJBQkNXaWR0aHMxNiAgIChHREkuMzA3KQogICovCkBAIC04NjMsNTU4ICs5NTUsNzggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDaGFyV2lkdGgxNiAgICAoR0RJLjM1MCkKKyAqICAgICAgICAgICBHZXRHbHlwaE91dGxpbmUxNiAgICAoR0RJLjMwOSkKICAqLwotQk9PTDE2IEdldENoYXJXaWR0aDE2KCBIREMxNiBoZGMsIFVJTlQxNiBmaXJzdENoYXIsIFVJTlQxNiBsYXN0Q2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgTFBJTlQxNiBidWZmZXIgKQorRFdPUkQgR2V0R2x5cGhPdXRsaW5lMTYoIEhEQzE2IGhkYywgVUlOVDE2IHVDaGFyLCBVSU5UMTYgZnVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBHTFlQSE1FVFJJQ1MxNiBscGdtLCBEV09SRCBjYkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBCdWZmZXIsIGNvbnN0IE1BVDIgKmxwbWF0MiApCiB7Ci0gICAgTFBJTlQzMgkgYnVmMzIgPSAoTFBJTlQzMil4bWFsbG9jKHNpemVvZihJTlQzMikqKDEgKyAobGFzdENoYXItZmlyc3RDaGFyKSkpOwotICAgIExQSU5UMzIJIG9idWYzMjsKLSAgICBCT09MMzIJIHJldFZhbDsKLSAgICBpbnQJCSBpOwotICAgIGlmICghYnVmMzIpCi0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgb2J1ZjMyID0gYnVmMzI7Ci0gICAgcmV0VmFsID0gR2V0Q2hhcldpZHRoMzJBKGhkYywgZmlyc3RDaGFyLCBsYXN0Q2hhciwgYnVmMzIpOwotICAgIGlmIChyZXRWYWwpCi0gICAgewotCWZvciAoaSA9IGZpcnN0Q2hhcjsgaSA8PSBsYXN0Q2hhcjsgaSsrKQotCXsKLQkgICAgKmJ1ZmZlcisrID0gKmJ1ZjMyKys7Ci0JfQotICAgIH0KLSAgICBmcmVlIChvYnVmMzIpOwotICAgIHJldHVybiByZXRWYWw7CisgICAgZnByaW50Ziggc3RkbmltcCwiR2V0R2x5cGhPdXRMaW5lMTYoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKSAvLyAtIGVtcHR5IHN0dWIhXG4iLAorICAgICAgICAgICAgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOworICAgIHJldHVybiAoRFdPUkQpLTE7IC8qIGZhaWx1cmUgKi8KIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDaGFyV2lkdGgzMkEgICAgKEdESTMyLjE1NSkKKyAqICAgICAgICAgICBHZXRHbHlwaE91dGxpbmUzMkEgICAgKEdESTMyLjE4NikKICAqLwotQk9PTDMyIEdldENoYXJXaWR0aDMyQSggSERDMzIgaGRjLCBVSU5UMzIgZmlyc3RDaGFyLCBVSU5UMzIgbGFzdENoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBMUElOVDMyIGJ1ZmZlciApCitEV09SRCBHZXRHbHlwaE91dGxpbmUzMkEoIEhEQzMyIGhkYywgVUlOVDMyIHVDaGFyLCBVSU5UMzIgZnVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBHTFlQSE1FVFJJQ1MzMiBscGdtLCBEV09SRCBjYkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBCdWZmZXIsIGNvbnN0IE1BVDIgKmxwbWF0MiApCiB7Ci0gICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7Ci0gICAgaWYgKCFkYykKLSAgICB7Ci0JaWYgKCEoZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKCBoZGMsIE1FVEFGSUxFX0RDX01BR0lDICkpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmICghZGMtPmZ1bmNzLT5wR2V0Q2hhcldpZHRoIHx8Ci0gICAgICAgICFkYy0+ZnVuY3MtPnBHZXRDaGFyV2lkdGgoIGRjLCBmaXJzdENoYXIsIGxhc3RDaGFyLCBidWZmZXIpKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFJVRTsKKyAgICBmcHJpbnRmKCBzdGRuaW1wLCJHZXRHbHlwaE91dExpbmUzMkEoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKSAvLyAtIGVtcHR5IHN0dWIhXG4iLAorICAgICAgICAgICAgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOworICAgIHJldHVybiAoRFdPUkQpLTE7IC8qIGZhaWx1cmUgKi8KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDaGFyV2lkdGgzMlcgICAgKEdESTMyLjE1OCkKKyAqICAgICAgICAgICBHZXRHbHlwaE91dGxpbmUzMlcgICAgKEdESTMyLjE4NykKICAqLwotQk9PTDMyIEdldENoYXJXaWR0aDMyVyggSERDMzIgaGRjLCBVSU5UMzIgZmlyc3RDaGFyLCBVSU5UMzIgbGFzdENoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBMUElOVDMyIGJ1ZmZlciApCitEV09SRCBHZXRHbHlwaE91dGxpbmUzMlcoIEhEQzMyIGhkYywgVUlOVDMyIHVDaGFyLCBVSU5UMzIgZnVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBHTFlQSE1FVFJJQ1MzMiBscGdtLCBEV09SRCBjYkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBCdWZmZXIsIGNvbnN0IE1BVDIgKmxwbWF0MiApCiB7Ci0gICAgcmV0dXJuIEdldENoYXJXaWR0aDMyQSggaGRjLCBmaXJzdENoYXIsIGxhc3RDaGFyLCBidWZmZXIgKTsKKyAgICBmcHJpbnRmKCBzdGRuaW1wLCJHZXRHbHlwaE91dExpbmUzMlcoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKSAvLyAtIGVtcHR5IHN0dWIhXG4iLAorICAgICAgICAgICAgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOworICAgIHJldHVybiAoRFdPUkQpLTE7IC8qIGZhaWx1cmUgKi8KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBBZGRGb250UmVzb3VyY2UxNiAgICAoR0RJLjExOSkKKyAqICAgICAgICAgICBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZTE2ICAgKEdESS4zMTApCiAgKi8KLUlOVDE2IEFkZEZvbnRSZXNvdXJjZTE2KCBMUENTVFIgc3RyICkKK0JPT0wxNiBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZTE2KCBVSU5UMTYgZkhpZGRlbiwgTFBDU1RSIGxwc3pSZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGZvbnRGaWxlLCBMUENTVFIgcGF0aCApCiB7Ci0gICAgcmV0dXJuIEFkZEZvbnRSZXNvdXJjZTMyQSggc3RyICk7CisgICAgcmV0dXJuIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMzJBKCBmSGlkZGVuLCBscHN6UmVzb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZpbGUsIHBhdGggKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBBZGRGb250UmVzb3VyY2UzMkEgICAgKEdESTMyLjIpCisgKiAgICAgICAgICAgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMkEgICAoR0RJMzIuNjIpCiAgKi8KLUlOVDMyIEFkZEZvbnRSZXNvdXJjZTMyQSggTFBDU1RSIHN0ciApCitCT09MMzIgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMkEoIERXT1JEIGZIaWRkZW4sIExQQ1NUUiBscHN6UmVzb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBzekZvbnRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBzekN1cnJlbnRQYXRoICkKIHsKLSAgICBpZiAoSElXT1JEKHN0cikpCi0gICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBBZGRGb250UmVzb3VyY2UoJyVzJylcbiIsIHN0ciApOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IEFkZEZvbnRSZXNvdXJjZSglMDR4KVxuIiwgTE9XT1JEKHN0cikgKTsKLSAgICByZXR1cm4gMTsKKyAgICAvKiBmSGlkZGVuPTEgLSBvbmx5IHZpc2libGUgZm9yIHRoZSBjYWxsaW5nIGFwcCwgcmVhZC1vbmx5LCBub3QKKyAgICAgKiBlbnVtYmVyZWQgd2l0aCBFbnVtRm9udHMvRW51bUZvbnRGYW1pbGllcworICAgICAqIGxwc3pDdXJyZW50UGF0aCBjYW4gYmUgTlVMTAorICAgICAqLworICAgIGZwcmludGYoc3RkbmltcCwiQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UoJWxkLCVzLCVzLCVzKSAvLyBlbXB0eSBzdHViXG4iLAorICAgICAgICAgICAgZkhpZGRlbiwgbHBzelJlc291cmNlRmlsZSwgbHBzekZvbnRGaWxlLCBscHN6Q3VycmVudFBhdGggKTsKKyAgICByZXR1cm4gRkFMU0U7IC8qIGNyZWF0ZSBmYWlsZWQgKi8KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBBZGRGb250UmVzb3VyY2UzMlcgICAgKEdESTMyLjQpCisgKiAgICAgICAgICAgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMlcgICAoR0RJMzIuNjMpCiAgKi8KLUlOVDMyIEFkZEZvbnRSZXNvdXJjZTMyVyggTFBDV1NUUiBzdHIgKQorQk9PTDMyIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMzJXKCBEV09SRCBmSGlkZGVuLCBMUENXU1RSIGxwc3pSZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbHBzekZvbnRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwc3pDdXJyZW50UGF0aCApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IEFkZEZvbnRSZXNvdXJjZTMyVyglcClcbiIsIHN0ciApOwotICAgIHJldHVybiAxOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlbW92ZUZvbnRSZXNvdXJjZTE2ICAgIChHREkuMTM2KQotICovCi1CT09MMTYgUmVtb3ZlRm9udFJlc291cmNlMTYoIExQQ1NUUiBzdHIgKQotewotICAgIHJldHVybiBSZW1vdmVGb250UmVzb3VyY2UzMkEoIHN0ciApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlbW92ZUZvbnRSZXNvdXJjZTMyQSAgICAoR0RJMzIuMjg0KQotICovCi1CT09MMzIgUmVtb3ZlRm9udFJlc291cmNlMzJBKCBMUENTVFIgc3RyICkKLXsKLSAgICBpZiAoSElXT1JEKHN0cikpCi0gICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBSZW1vdmVGb250UmVzb3VyY2UoJyVzJylcbiIsIHN0ciApOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IFJlbW92ZUZvbnRSZXNvdXJjZSglMDR4KVxuIiwgTE9XT1JEKHN0cikgKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZW1vdmVGb250UmVzb3VyY2UzMlcgICAgKEdESTMyLjI4NikKLSAqLwotQk9PTDMyIFJlbW92ZUZvbnRSZXNvdXJjZTMyVyggTFBDV1NUUiBzdHIgKQotewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBSZW1vdmVGb250UmVzb3VyY2UzMlcoJXApXG4iLCBzdHIgKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJRk9OVF9QYXJzZUZvbnRQYXJtcwkJW2ludGVybmFsXQotICovCi1pbnQgRk9OVF9QYXJzZUZvbnRQYXJtcyhMUFNUUiBscEZvbnQsIFdPUkQgd1Bhcm1zTm8sIExQU1RSIGxwUmV0U3RyLCBXT1JEIHdNYXhTaXopCi17Ci0JaW50IAlpOwotCWlmIChscEZvbnQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JaWYgKGxwUmV0U3RyID09IE5VTEwpIHJldHVybiAwOwotCWZvciAoaSA9IDA7ICgqbHBGb250ICE9ICdcMCcgJiYgaSAhPSB3UGFybXNObyk7ICkgewotCQlpZiAoKmxwRm9udCA9PSAnLScpIGkrKzsKLQkJbHBGb250Kys7Ci0JCX0KLQlpZiAoaSA9PSB3UGFybXNObykgewotCQlpZiAoKmxwRm9udCA9PSAnLScpIGxwRm9udCsrOwotCQl3TWF4U2l6LS07Ci0JCWZvciAoaSA9IDA7ICgqbHBGb250ICE9ICdcMCcgJiYgKmxwRm9udCAhPSAnLScgJiYgaSA8IHdNYXhTaXopOyBpKyspCi0JCQkqKGxwUmV0U3RyICsgaSkgPSAqbHBGb250Kys7Ci0JCSoobHBSZXRTdHIgKyBpKSA9ICdcMCc7Ci0JCXJldHVybiBpOwotCQl9Ci0JZWxzZQotCQlscFJldFN0clswXSA9ICdcMCc7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJSW5pdEZvbnRzTGlzdAkJW2ludGVybmFsXQotICovCi0KLXN0YXRpYyBpbnQgbG9nZmNtcChjb25zdCB2b2lkICphLGNvbnN0IHZvaWQgKmIpIAotewotICByZXR1cm4gbHN0cmNtcGkzMkEoICgqKExQTE9HRk9OVDE2ICopYSktPmxmRmFjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgKCooTFBMT0dGT05UMTYgKiliKS0+bGZGYWNlTmFtZSApOwotfQotCi12b2lkIEluaXRGb250c0xpc3Qodm9pZCkKLXsKLSAgY2hhciAJc3RyWzMyXTsKLSAgY2hhciAJcGF0dGVyblsxMDBdOwotICBjaGFyIAkqZmFtaWx5LCAqd2VpZ2h0LCAqY2hhcnNldDsKLSAgY2hhciAJKipuYW1lczsKLSAgY2hhciAJc2xhbnQsIHNwYWNpbmc7Ci0gIGludCAJaSwgY291bnQ7Ci0gIExQTE9HRk9OVDE2IGxwTmV3Rm9udDsKLQotICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJJbml0Rm9udHNMaXN0ICFcbiIpOwotCi0gIHdlaWdodCA9ICJtZWRpdW0iOwotICBzbGFudCA9ICdyJzsKLSAgc3BhY2luZyA9ICcqJzsKLSAgY2hhcnNldCA9ICIqIjsKLSAgZmFtaWx5ID0gIiotKiI7Ci0KLSAgc3ByaW50ZiggcGF0dGVybiwgIi0lcy0lcy0lYy1ub3JtYWwtKi0qLSotKi0qLSVjLSotJXMiLAotCSAgZmFtaWx5LCB3ZWlnaHQsIHNsYW50LCBzcGFjaW5nLCBjaGFyc2V0KTsKLSAgbmFtZXMgPSBYTGlzdEZvbnRzKCBkaXNwbGF5LCBwYXR0ZXJuLCBNQVhfRk9OVFMsICZjb3VudCApOwotICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJJbml0Rm9udHNMaXN0IC8vIGNvdW50PSVkIFxuIiwgY291bnQpOwotCi0gIGxwTmV3Rm9udCA9IG1hbGxvYygoc2l6ZW9mKExPR0ZPTlQxNikrTEZfRkFDRVNJWkUpKmNvdW50KTsKLSAgaWYgKGxwTmV3Rm9udCA9PSBOVUxMKSB7Ci0gICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLAotCQkgICAiSW5pdEZvbnRzTGlzdCAvLyBFcnJvciBhbGxvYyBuZXcgZm9udCBzdHJ1Y3R1cmUgIVxuIik7Ci0gICAgICBYRnJlZUZvbnROYW1lcyhuYW1lcyk7Ci0gICAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgIGRwcmludGZfZm9udChzdGRkZWIsIkluaXRGb250c0xpc3QgLy8gbmFtZXNbJWRdPSclcycgXG4iLCBpLCBuYW1lc1tpXSk7Ci0KLSAgICBGT05UX1BhcnNlRm9udFBhcm1zKG5hbWVzW2ldLCAyLCBzdHIsIHNpemVvZihzdHIpKTsKLSAgICBzdHJjcHkobHBOZXdGb250LT5sZkZhY2VOYW1lLCBzdHIpOwotICAgIEZPTlRfUGFyc2VGb250UGFybXMobmFtZXNbaV0sIDgsIHN0ciwgc2l6ZW9mKHN0cikpOwotICAgIGxwTmV3Rm9udC0+bGZIZWlnaHQgPSBhdG9pKHN0cikgLyAxMDsKLSAgICBGT05UX1BhcnNlRm9udFBhcm1zKG5hbWVzW2ldLCAxMiwgc3RyLCBzaXplb2Yoc3RyKSk7Ci0gICAgbHBOZXdGb250LT5sZldpZHRoID0gYXRvaShzdHIpIC8gMTA7Ci0gICAgbHBOZXdGb250LT5sZkVzY2FwZW1lbnQgPSAwOwotICAgIGxwTmV3Rm9udC0+bGZPcmllbnRhdGlvbiA9IDA7Ci0gICAgbHBOZXdGb250LT5sZldlaWdodCA9IEZXX1JFR1VMQVI7Ci0gICAgbHBOZXdGb250LT5sZkl0YWxpYyA9IDA7Ci0gICAgbHBOZXdGb250LT5sZlVuZGVybGluZSA9IDA7Ci0gICAgbHBOZXdGb250LT5sZlN0cmlrZU91dCA9IDA7Ci0gICAgRk9OVF9QYXJzZUZvbnRQYXJtcyhuYW1lc1tpXSwgMTMsIHN0ciwgc2l6ZW9mKHN0cikpOwotICAgIGlmIChzdHJjbXAoc3RyLCAiaXNvODg1OSIpID09IDApICB7Ci0gICAgICBscE5ld0ZvbnQtPmxmQ2hhclNldCA9IEFOU0lfQ0hBUlNFVDsKLSAgICB9IGVsc2UgIHsKLSAgICAgIGxwTmV3Rm9udC0+bGZDaGFyU2V0ID0gT0VNX0NIQVJTRVQ7Ci0gICAgfQotICAgIGxwTmV3Rm9udC0+bGZPdXRQcmVjaXNpb24gPSBPVVRfREVGQVVMVF9QUkVDSVM7Ci0gICAgbHBOZXdGb250LT5sZkNsaXBQcmVjaXNpb24gPSBDTElQX0RFRkFVTFRfUFJFQ0lTOwotICAgIGxwTmV3Rm9udC0+bGZRdWFsaXR5ID0gREVGQVVMVF9RVUFMSVRZOwotICAgIEZPTlRfUGFyc2VGb250UGFybXMobmFtZXNbaV0sIDExLCBzdHIsIHNpemVvZihzdHIpKTsKLSAgICBzd2l0Y2goc3RyWzBdKSB7Ci0gICAgIGNhc2UgJ3AnOgotICAgICAgbHBOZXdGb250LT5sZlBpdGNoQW5kRmFtaWx5ID0gVkFSSUFCTEVfUElUQ0ggfCBGRl9TV0lTUzsKLSAgICAgIGJyZWFrOwotICAgICBjYXNlICdtJzoKLSAgICAgY2FzZSAnYyc6Ci0gICAgICBscE5ld0ZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgPSBGSVhFRF9QSVRDSCB8IEZGX01PREVSTjsKLSAgICAgIGJyZWFrOwotICAgICBkZWZhdWx0OgotICAgICAgbHBOZXdGb250LT5sZlBpdGNoQW5kRmFtaWx5ID0gREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRwcmludGZfZm9udCggc3RkZGViLAotCQkgICJJbml0Rm9udHNMaXN0IC8vIGxwTmV3Rm9udC0+bGZIZWlnaHQ9JWRcbiIsCi0JCSAgbHBOZXdGb250LT5sZkhlaWdodCApOwotICAgIGRwcmludGZfZm9udCggc3RkZGViLAotCQkgICJJbml0Rm9udHNMaXN0IC8vIGxwTmV3Rm9udC0+bGZXaWR0aD0lZFxuIiwKLQkJICBscE5ld0ZvbnQtPmxmV2lkdGggKTsKLSAgICBkcHJpbnRmX2ZvbnQoIHN0ZGRlYiwKLQkJICAiSW5pdEZvbnRzTGlzdCAvLyBsZkZhY2VOYW1lPSclcydcbiIsCi0JCSAgbHBOZXdGb250LT5sZkZhY2VOYW1lICk7Ci0gICAgbHBMb2dGb250TGlzdFtpXSA9IGxwTmV3Rm9udDsKLSAgICBscE5ld0ZvbnQgPSAoTFBMT0dGT05UMTYpCi0gICAgICAoKGNoYXIgKilscE5ld0ZvbnQgKyBzaXplb2YoTE9HRk9OVDE2KStMRl9GQUNFU0laRSk7Ci0gIH0KLSAgbHBMb2dGb250TGlzdFtpXSA9IE5VTEw7Ci0KLSAgcXNvcnQobHBMb2dGb250TGlzdCxjb3VudCxzaXplb2YoKmxwTG9nRm9udExpc3QpLGxvZ2ZjbXApOwotICBYRnJlZUZvbnROYW1lcyhuYW1lcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlFbnVtRm9udHMJCQlbR0RJLjcwXQotICogV2UgcmV1c2UgRW51bUZvbnRGYW1pbGllcyogZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBnZXQgdGhlIHNhbWUKLSAqIHN0cnVjdHMgKCsgZXh0cmEgc3R1ZmYgYXQgdGhlIGVuZCB3aGljaCB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIGVudW0gZnVuY3MpCi0gKi8KLUlOVDE2IEVudW1Gb250czE2KEhEQzE2IGhEQywgTFBDU1RSIGxwRmFjZU5hbWUsIEZPTlRFTlVNUFJPQzE2IGxwRW51bUZ1bmMsIExQQVJBTSBscERhdGEpCi17Ci0gIHJldHVybiBFbnVtRm9udEZhbWlsaWVzMTYoaERDLGxwRmFjZU5hbWUsbHBFbnVtRnVuYyxscERhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJRW51bUZvbnRzQQkJCVtHREkzMi44NF0KLSAqLwotSU5UMzIgRW51bUZvbnRzMzJBKEhEQzMyIGhEQywgTFBDU1RSIGxwRmFjZU5hbWUsIEZPTlRFTlVNUFJPQzMyQSBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQotewotICByZXR1cm4gRW51bUZvbnRGYW1pbGllczMyQShoREMsbHBGYWNlTmFtZSxscEVudW1GdW5jLGxwRGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlFbnVtRm9udHNBCQkJW0dESTMyLjg0XQotICovCi1JTlQzMiBFbnVtRm9udHMzMlcoSERDMzIgaERDLCBMUENXU1RSIGxwRmFjZU5hbWUsIEZPTlRFTlVNUFJPQzMyVyBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQotewotICByZXR1cm4gRW51bUZvbnRGYW1pbGllczMyVyhoREMsbHBGYWNlTmFtZSxscEVudW1GdW5jLGxwRGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlFbnVtRm9udEZhbWlsaWVzCVtHREkuMzMwXQotICovCi1JTlQxNiBFbnVtRm9udEZhbWlsaWVzMTYoSERDMTYgaERDLCBMUENTVFIgbHBzekZhbWlseSwgRk9OVEVOVU1QUk9DMTYgbHBFbnVtRnVuYywgTFBBUkFNIGxwRGF0YSkKLXsKLSAgTE9HRk9OVDE2CUxGOwotCi0gIGlmIChscHN6RmFtaWx5KQotICAgICBzdHJjcHkoTEYubGZGYWNlTmFtZSxscHN6RmFtaWx5KTsKLSAgZWxzZQotICAgICBMRi5sZkZhY2VOYW1lWzBdPSdcMCc7Ci0gIExGLmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsKLQotICByZXR1cm4gRW51bUZvbnRGYW1pbGllc0V4MTYoaERDLCZMRiwoRk9OVEVOVU1QUk9DRVgxNilscEVudW1GdW5jLGxwRGF0YSwwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCUVudW1Gb250RmFtaWxpZXNBCVtHREkzMi44MF0KLSAqLwotSU5UMzIgRW51bUZvbnRGYW1pbGllczMyQShIREMzMiBoREMsIExQQ1NUUiBscHN6RmFtaWx5LCBGT05URU5VTVBST0MzMkEgbHBFbnVtRnVuYywgTFBBUkFNIGxwRGF0YSkKLXsKLSAgTE9HRk9OVDMyQQlMRjsKLQotICBpZiAobHBzekZhbWlseSkKLSAgICAgc3RyY3B5KExGLmxmRmFjZU5hbWUsbHBzekZhbWlseSk7Ci0gIGVsc2UKLSAgICAgTEYubGZGYWNlTmFtZVswXT0nXDAnOwotICBMRi5sZkNoYXJTZXQgPSBERUZBVUxUX0NIQVJTRVQ7Ci0KLSAgcmV0dXJuIEVudW1Gb250RmFtaWxpZXNFeDMyQShoREMsJkxGLChGT05URU5VTVBST0NFWDMyQSlscEVudW1GdW5jLGxwRGF0YSwwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCUVudW1Gb250RmFtaWxpZXNXCVtHREkzMi44M10KLSAqLwotSU5UMzIgRW51bUZvbnRGYW1pbGllczMyVyhIREMzMiBoREMsIExQQ1dTVFIgbHBzekZhbWlseVcsIEZPTlRFTlVNUFJPQzMyVyBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQotewotICBMT0dGT05UMzJXCUxGOwotCi0gIGlmIChscHN6RmFtaWx5VykKLSAgCWxzdHJjcHkzMlcoTEYubGZGYWNlTmFtZSxscHN6RmFtaWx5Vyk7Ci0gIGVsc2UKLSAgCUxGLmxmRmFjZU5hbWVbMF09MDsKLSAgTEYubGZDaGFyU2V0ID0gREVGQVVMVF9DSEFSU0VUOwotICByZXR1cm4gRW51bUZvbnRGYW1pbGllc0V4MzJXKGhEQywmTEYsKEZPTlRFTlVNUFJPQ0VYMzJXKWxwRW51bUZ1bmMsbHBEYXRhLDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJRW51bUZvbnRGYW1pbGllc0V4CVtHREkuNjE4XQotICogRklYTUU6IGZpbGwgdGhlIHJlc3Qgb2YgdGhlIE5FV1RFWFRNRVRSSUNFWCBhbmQgRU5VTUxPR0ZPTlRFWCBzdHJ1Y3R1cmVzLgotICogICAgICAgIChhcHBsaWVzIHRvIGFsbCBFbnVtRm9udEZhbWlsaWVzRXgqKQotICogICAgICAgIHdpbmVsaWIvMTYgc3VwcG9ydC4KLSAqLwotSU5UMTYgRW51bUZvbnRGYW1pbGllc0V4MTYoSERDMTYgaERDLCBMUExPR0ZPTlQxNiBscExGLCBGT05URU5VTVBST0NFWDE2IGxwRW51bUZ1bmMsIExQQVJBTSBscERhdGEsRFdPUkQgcmVzZXJ2ZWQpCi17Ci0gIEhMT0NBTDE2ICAgICAJaExvZzsKLSAgSExPQ0FMMTYgICAgIAloTWV0OwotICBIRk9OVDE2IGhGb250OwotICBIRk9OVDE2IGhPbGRGb250OwotICBMUEVOVU1MT0dGT05URVgxNiBscEVudW1Mb2dGb250OwotICBMUE5FV1RFWFRNRVRSSUNFWDE2IGxwdG07Ci0gIExQU1RSCSAgICAgICAJbHBPbGROYW1lOwotICBjaGFyCSAgICAgICAJRmFjZU5hbWVbTEZfRkFDRVNJWkVdOwotICBpbnQJICAgICAgIAluUmV0ID0gMDsKLSAgaW50CSAgICAgICAJaTsKLSAgCi0gIGRwcmludGZfZm9udChzdGRkZWIsIkVudW1Gb250RmFtaWxpZXNFeCglMDR4LCAnJXMnLCAlMDhseCwgJTA4bHgsICUwOGx4KVxuIiwKLQkgICAgICAgaERDLCBscExGLT5sZkZhY2VOYW1lLCAoRFdPUkQpbHBFbnVtRnVuYywgbHBEYXRhLCByZXNlcnZlZCk7Ci0gIGlmIChscEVudW1GdW5jID09IDApIHJldHVybiAwOwotICBoTG9nID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihFTlVNTE9HRk9OVEVYMTYpICk7Ci0gIGxwRW51bUxvZ0ZvbnQgPSAoTFBFTlVNTE9HRk9OVEVYMTYpIEdESV9IRUFQX0xJTl9BRERSKGhMb2cpOwotICBpZiAobHBFbnVtTG9nRm9udCA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIkVudW1Gb250RmFtaWxpZXNFeCAvLyBjYW4ndCBhbGxvYyBMT0dGT05UIHN0cnVjdCAhXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBoTWV0ID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihORVdURVhUTUVUUklDRVgxNikgKTsKLSAgbHB0bSA9IChMUE5FV1RFWFRNRVRSSUNFWDE2KSBHRElfSEVBUF9MSU5fQUREUihoTWV0KTsKLSAgaWYgKGxwdG0gPT0gTlVMTCkgewotICAgIEdESV9IRUFQX0ZSRUUoaExvZyk7Ci0gICAgZnByaW50ZihzdGRlcnIsIkVudW1Gb250RmFtaWxpZXNFeCAvLyBjYW4ndCBhbGxvYyBURVhUTUVUUklDIHN0cnVjdCAhXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBscE9sZE5hbWUgPSBOVUxMOwotICBzdHJjcHkoRmFjZU5hbWUsbHBMRi0+bGZGYWNlTmFtZSk7Ci0KLSAgaWYgKGxwTG9nRm9udExpc3RbMF0gPT0gTlVMTCkgSW5pdEZvbnRzTGlzdCgpOwotICBmb3IoaSA9IDA7IGxwTG9nRm9udExpc3RbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgLyogbGZDaGFyU2V0ICovCi0gICAgaWYgKGxwTEYtPmxmQ2hhclNldCE9REVGQVVMVF9DSEFSU0VUKQotICAgIAlpZiAobHBMb2dGb250TGlzdFtpXS0+bGZDaGFyU2V0ICE9IGxwTEYtPmxmQ2hhclNldCkKLQkgICBjb250aW51ZTsKLQotICAgIC8qIGxmUGl0Y2hBbmRGYW1pbHkgb25seSBvZiBpbXBvcnRhbmNlIGluIEhlYnJldyBhbmQgQXJhYmljIHZlcnNpb25zLiAqLwotICAgIC8qIGxmRmFjZU5hbWUgKi8KLSAgICBpZiAoRmFjZU5hbWVbMF0pCi0gICAgewotICAgIAlpZiAobHN0cmNtcGkzMkEoRmFjZU5hbWUsbHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZSkpCi0JICAgY29udGludWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgCWlmICgobHBPbGROYW1lIT1OVUxMKSAmJgotICAgICAgICAgICAgIWxzdHJjbXBpMzJBKGxwT2xkTmFtZSxscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lKSkKLQkgICBjb250aW51ZTsKLQlscE9sZE5hbWU9bHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZTsKLSAgICB9Ci0KLSAgICBtZW1jcHkobHBFbnVtTG9nRm9udCwgbHBMb2dGb250TGlzdFtpXSwgc2l6ZW9mKExPR0ZPTlQxNikpOwotICAgIHN0cmNweShscEVudW1Mb2dGb250LT5lbGZGdWxsTmFtZSwiIik7Ci0gICAgc3RyY3B5KGxwRW51bUxvZ0ZvbnQtPmVsZlN0eWxlLCIiKTsKLSAgICBoRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdDE2KChMUExPR0ZPTlQxNilscEVudW1Mb2dGb250KTsKLSAgICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKGhEQywgaEZvbnQpOwotICAgIEdldFRleHRNZXRyaWNzMTYoaERDLCAoTFBURVhUTUVUUklDMTYpbHB0bSk7Ci0gICAgU2VsZWN0T2JqZWN0MzIoaERDLCBoT2xkRm9udCk7Ci0gICAgRGVsZXRlT2JqZWN0MzIoaEZvbnQpOwotICAgIGRwcmludGZfZm9udChzdGRkZWIsICJFbnVtRm9udEZhbWlsaWVzRXggLy8gaT0lZCBscExvZ0ZvbnQ9JXAgbHB0bT0lcFxuIiwgaSwgbHBFbnVtTG9nRm9udCwgbHB0bSk7Ci0gICAgCi0gICAgblJldCA9IGxwRW51bUZ1bmMoIEdESV9IRUFQX1NFR19BRERSKGhMb2cpLCBHRElfSEVBUF9TRUdfQUREUihoTWV0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgMCwgbHBEYXRhICk7Ci0gICAgaWYgKG5SZXQgPT0gMCkgewotICAgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiRW51bUZvbnRGYW1pbGllcyAvLyBFbnVtRW5kIHJlcXVlc3RlZCBieSBhcHBsaWNhdGlvbiAhXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBHRElfSEVBUF9GUkVFKGhNZXQpOwotICBHRElfSEVBUF9GUkVFKGhMb2cpOwotICByZXR1cm4gblJldDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJRW51bUZvbnRGYW1pbGllc0V4QQlbR0RJMzIuODFdCi0gKiBGSVhNRTogRG9uJ3QgdXNlIDE2IGJpdCBHREkgaGVhcCBmdW5jdGlvbnMgKGFwcGxpZXMgdG8gRW51bUZvbnRGYW1pbGllc0V4MzIqKQotICovCi1JTlQzMiBFbnVtRm9udEZhbWlsaWVzRXgzMkEoSERDMzIgaERDLCBMUExPR0ZPTlQzMkEgbHBMRixGT05URU5VTVBST0NFWDMyQSBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhLERXT1JEIHJlc2VydmVkKQotewotICBITE9DQUwxNiAgICAgCWhMb2c7Ci0gIEhMT0NBTDE2ICAgICAJaE1ldDsKLSAgSEZPTlQzMgloRm9udDsKLSAgSEZPTlQzMgloT2xkRm9udDsKLSAgTFBFTlVNTE9HRk9OVEVYMzJBCWxwRW51bUxvZ0ZvbnQ7Ci0gIExQTkVXVEVYVE1FVFJJQ0VYMzJBCWxwdG07Ci0gIExQU1RSCSAgICAgICAJbHBPbGROYW1lOwotICBjaGFyCSAgICAgICAJRmFjZU5hbWVbTEZfRkFDRVNJWkVdOwotICBpbnQJICAgICAgIAluUmV0ID0gMDsKLSAgaW50CSAgICAgICAJaTsKLSAgCi0gIGRwcmludGZfZm9udChzdGRkZWIsIkVudW1Gb250RmFtaWxpZXMzMkEoJTA0eCwgJXAsICUwOGx4LCAlMDhseCwgJTA4bHgpXG4iLAotCSAgICAgICBoREMsIGxwTEYtPmxmRmFjZU5hbWUsIChEV09SRClscEVudW1GdW5jLCBscERhdGEscmVzZXJ2ZWQpOwotICBpZiAobHBFbnVtRnVuYyA9PSAwKSByZXR1cm4gMDsKLSAgaExvZyA9IEdESV9IRUFQX0FMTE9DKCBzaXplb2YoRU5VTUxPR0ZPTlRFWDMyQSkgKTsKLSAgbHBFbnVtTG9nRm9udCA9IChMUEVOVU1MT0dGT05URVgzMkEpIEdESV9IRUFQX0xJTl9BRERSKGhMb2cpOwotICBpZiAobHBFbnVtTG9nRm9udCA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIkVudW1Gb250RmFtaWxpZXMgLy8gY2FuJ3QgYWxsb2MgTE9HRk9OVCBzdHJ1Y3QgIVxuIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaE1ldCA9IEdESV9IRUFQX0FMTE9DKCBzaXplb2YoTkVXVEVYVE1FVFJJQ0VYMzJBKSApOwotICBscHRtID0gKExQTkVXVEVYVE1FVFJJQ0VYMzJBKSBHRElfSEVBUF9MSU5fQUREUihoTWV0KTsKLSAgaWYgKGxwdG0gPT0gTlVMTCkgewotICAgIEdESV9IRUFQX0ZSRUUoaExvZyk7Ci0gICAgZnByaW50ZihzdGRlcnIsIkVudW1Gb250RmFtaWxpZXMzMkEgLy8gY2FuJ3QgYWxsb2MgVEVYVE1FVFJJQyBzdHJ1Y3QgIVxuIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgbHBPbGROYW1lID0gTlVMTDsKLSAgc3RyY3B5KEZhY2VOYW1lLGxwTEYtPmxmRmFjZU5hbWUpOwotCi0gIGlmIChscExvZ0ZvbnRMaXN0WzBdID09IE5VTEwpIEluaXRGb250c0xpc3QoKTsKLSAgZm9yKGkgPSAwOyBscExvZ0ZvbnRMaXN0W2ldICE9IE5VTEw7IGkrKykgewotICAgIC8qIGxmQ2hhclNldCAqLwotICAgIGlmIChscExGLT5sZkNoYXJTZXQhPURFRkFVTFRfQ0hBUlNFVCkKLSAgICAJaWYgKGxwTG9nRm9udExpc3RbaV0tPmxmQ2hhclNldCAhPSBscExGLT5sZkNoYXJTZXQpCi0JICAgY29udGludWU7Ci0KLSAgICAvKiBsZlBpdGNoQW5kRmFtaWx5IG9ubHkgb2YgaW1wb3J0YW5jZSBpbiBIZWJyZXcgYW5kIEFyYWJpYyB2ZXJzaW9ucy4gKi8KLSAgICAvKiBsZkZhY2VOYW1lICovCi0gICAgaWYgKEZhY2VOYW1lWzBdKSB7Ci0gICAgCWlmIChsc3RyY21waTMyQShGYWNlTmFtZSxscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lKSkKLQkgICBjb250aW51ZTsKLSAgICB9IGVsc2UgewotICAgIAlpZiAoKGxwT2xkTmFtZSE9TlVMTCkgJiYKLSAgICAgICAgICAgICFsc3RyY21waTMyQShscE9sZE5hbWUsbHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZSkpCi0JICAgY29udGludWU7Ci0JbHBPbGROYW1lPWxwTG9nRm9udExpc3RbaV0tPmxmRmFjZU5hbWU7Ci0gICAgfQotCi0gICAgRk9OVF9MT0dGT05UMTZUb0xPR0ZPTlQzMkEobHBMb2dGb250TGlzdFtpXSwmKGxwRW51bUxvZ0ZvbnQtPmVsZkxvZ0ZvbnQpKTsKLSAgICBzdHJjcHkobHBFbnVtTG9nRm9udC0+ZWxmRnVsbE5hbWUsIiIpOwotICAgIHN0cmNweShscEVudW1Mb2dGb250LT5lbGZTdHlsZSwiIik7Ci0gICAgc3RyY3B5KGxwRW51bUxvZ0ZvbnQtPmVsZlNjcmlwdCwiIik7Ci0gICAgaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3QzMkEoKExQTE9HRk9OVDMyQSlscEVudW1Mb2dGb250KTsKLSAgICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKGhEQywgaEZvbnQpOwotICAgIEdldFRleHRNZXRyaWNzMzJBKGhEQywgKExQVEVYVE1FVFJJQzMyQSlscHRtKTsKLSAgICBTZWxlY3RPYmplY3QzMihoREMsIGhPbGRGb250KTsKLSAgICBEZWxldGVPYmplY3QzMihoRm9udCk7Ci0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIkVudW1Gb250RmFtaWxpZXNFeDMyQSAvLyBpPSVkIGxwTG9nRm9udD0lcCBscHRtPSVwXG4iLCBpLCBscEVudW1Mb2dGb250LCBscHRtKTsKLSAgICAKLSAgICBuUmV0ID0gbHBFbnVtRnVuYyhscEVudW1Mb2dGb250LGxwdG0sMCxscERhdGEpOwotICAgIGlmIChuUmV0ID09IDApIHsKLSAgICAgIGRwcmludGZfZm9udChzdGRkZWIsIkVudW1Gb250RmFtaWxpZXNFeDMyQSAvLyBFbnVtRW5kIHJlcXVlc3RlZCBieSBhcHBsaWNhdGlvbiAhXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBHRElfSEVBUF9GUkVFKGhNZXQpOwotICBHRElfSEVBUF9GUkVFKGhMb2cpOwotICByZXR1cm4gblJldDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJRW51bUZvbnRGYW1pbGllc1cJW0dESTMyLjgyXQotICovCi1JTlQzMiBFbnVtRm9udEZhbWlsaWVzRXgzMlcoSERDMzIgaERDLCBMUExPR0ZPTlQzMlcgbHBMRiwgRk9OVEVOVU1QUk9DRVgzMlcgbHBFbnVtRnVuYywgTFBBUkFNIGxwRGF0YSwgRFdPUkQgcmVzZXJ2ZWQpCi17Ci0gIEhMT0NBTDE2ICAgICAJaExvZzsKLSAgSExPQ0FMMTYgICAgIAloTWV0OwotICBIRk9OVDMyCWhGb250OwotICBIRk9OVDMyCWhPbGRGb250OwotICBMUEVOVU1MT0dGT05URVgzMlcJbHBFbnVtTG9nRm9udDsKLSAgTFBORVdURVhUTUVUUklDRVgzMlcJbHB0bTsKLSAgTFBTVFIJICAgICAgIAlscE9sZE5hbWU7Ci0gIGludAkgICAgICAgCW5SZXQgPSAwOwotICBpbnQJICAgICAgIAlpOwotICBMUFNUUglscHN6RmFtaWx5OwotICAKLSAgZHByaW50Zl9mb250KHN0ZGRlYiwiRW51bUZvbnRGYW1pbGllc0V4MzJXKCUwNHgsICVwLCAlMDhseCwgJTA4bHgsICUwOGx4KVxuIiwKLQkgICAgICAgaERDLCBscExGLCAoRFdPUkQpbHBFbnVtRnVuYywgbHBEYXRhLHJlc2VydmVkKTsKLSAgaWYgKGxwRW51bUZ1bmMgPT0gMCkgcmV0dXJuIDA7Ci0gIGhMb2cgPSBHRElfSEVBUF9BTExPQyggc2l6ZW9mKEVOVU1MT0dGT05URVgzMlcpICk7Ci0gIGxwRW51bUxvZ0ZvbnQgPSAoTFBFTlVNTE9HRk9OVEVYMzJXKSBHRElfSEVBUF9MSU5fQUREUihoTG9nKTsKLSAgaWYgKGxwRW51bUxvZ0ZvbnQgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCJFbnVtRm9udEZhbWlsaWVzMzJXIC8vIGNhbid0IGFsbG9jIExPR0ZPTlQgc3RydWN0ICFcbiIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGhNZXQgPSBHRElfSEVBUF9BTExPQyggc2l6ZW9mKE5FV1RFWFRNRVRSSUNFWDMyVykgKTsKLSAgbHB0bSA9IChMUE5FV1RFWFRNRVRSSUNFWDMyVykgR0RJX0hFQVBfTElOX0FERFIoaE1ldCk7Ci0gIGlmIChscHRtID09IE5VTEwpIHsKLSAgICBHRElfSEVBUF9GUkVFKGhMb2cpOwotICAgIGZwcmludGYoc3RkZXJyLCJFbnVtRm9udEZhbWlsaWVzMzJXIC8vIGNhbid0IGFsbG9jIFRFWFRNRVRSSUMgc3RydWN0ICFcbiIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGxwT2xkTmFtZSA9IE5VTEw7Ci0gIGxwc3pGYW1pbHkgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwTEYtPmxmRmFjZU5hbWUgKTsKLSAgaWYgKGxwTG9nRm9udExpc3RbMF0gPT0gTlVMTCkgSW5pdEZvbnRzTGlzdCgpOwotICBmb3IoaSA9IDA7IGxwTG9nRm9udExpc3RbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgLyogbGZDaGFyU2V0ICovCi0gICAgaWYgKGxwTEYtPmxmQ2hhclNldCE9REVGQVVMVF9DSEFSU0VUKQotICAgIAlpZiAobHBMb2dGb250TGlzdFtpXS0+bGZDaGFyU2V0ICE9IGxwTEYtPmxmQ2hhclNldCkKLQkgICBjb250aW51ZTsKLQotICAgIC8qIGxmUGl0Y2hBbmRGYW1pbHkgb25seSBvZiBpbXBvcnRhbmNlIGluIEhlYnJldyBhbmQgQXJhYmljIHZlcnNpb25zLiAqLwotICAgIC8qIGxmRmFjZU5hbWUgKi8KLSAgICBpZiAobHBzekZhbWlseVswXSkgewotICAgIAlpZiAobHN0cmNtcGkzMkEobHBzekZhbWlseSxscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lKSkKLQkgICBjb250aW51ZTsKLSAgICB9IGVsc2UgewotICAgIAlpZiAoKGxwT2xkTmFtZSE9TlVMTCkgJiYKLSAgICAgICAgICAgICFsc3RyY21waTMyQShscE9sZE5hbWUsbHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZSkpCi0JICAgY29udGludWU7Ci0JbHBPbGROYW1lPWxwTG9nRm9udExpc3RbaV0tPmxmRmFjZU5hbWU7Ci0gICAgfQotCi0gICAgRk9OVF9MT0dGT05UMTZUb0xPR0ZPTlQzMlcobHBMb2dGb250TGlzdFtpXSwmKGxwRW51bUxvZ0ZvbnQtPmVsZkxvZ0ZvbnQpKTsKLSAgICBscEVudW1Mb2dGb250LT5lbGZGdWxsTmFtZVswXSA9IDA7Ci0gICAgbHBFbnVtTG9nRm9udC0+ZWxmU3R5bGVbMF0gPSAwOwotICAgIGxwRW51bUxvZ0ZvbnQtPmVsZlNjcmlwdFswXSA9IDA7Ci0gICAgaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3QzMlcoKExQTE9HRk9OVDMyVylscEVudW1Mb2dGb250KTsKLSAgICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKGhEQywgaEZvbnQpOwotICAgIEdldFRleHRNZXRyaWNzMzJXKGhEQywgKExQVEVYVE1FVFJJQzMyVylscHRtKTsKLSAgICBTZWxlY3RPYmplY3QzMihoREMsIGhPbGRGb250KTsKLSAgICBEZWxldGVPYmplY3QzMihoRm9udCk7Ci0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIkVudW1Gb250RmFtaWxpZXMzMlcgLy8gaT0lZCBscExvZ0ZvbnQ9JXAgbHB0bT0lcFxuIiwgaSwgbHBFbnVtTG9nRm9udCwgbHB0bSk7Ci0gICAgCi0gICAgblJldCA9IGxwRW51bUZ1bmMobHBFbnVtTG9nRm9udCxscHRtLDAsbHBEYXRhKTsKLSAgICBpZiAoblJldCA9PSAwKSB7Ci0gICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udEZhbWlsaWVzMzJXIC8vIEVudW1FbmQgcmVxdWVzdGVkIGJ5IGFwcGxpY2F0aW9uICFcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIEdESV9IRUFQX0ZSRUUoaE1ldCk7Ci0gIEdESV9IRUFQX0ZSRUUoaExvZyk7Ci0gIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscHN6RmFtaWx5ICk7Ci0gIHJldHVybiBuUmV0OworICAgIGZwcmludGYoc3RkbmltcCwiQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMlcoJWxkLCVwLCVwLCVwKSAvLyBlbXB0eSBzdHViXG4iLAorICAgICAgICAgICAgZkhpZGRlbiwgbHBzelJlc291cmNlRmlsZSwgbHBzekZvbnRGaWxlLCBscHN6Q3VycmVudFBhdGggKTsKKyAgICByZXR1cm4gRkFMU0U7IC8qIGNyZWF0ZSBmYWlsZWQgKi8KIH0KIAogCkBAIC0xNDMyLDkgKzEwNDQsOCBAQAogICovCiBCT09MMzIgR2V0UmFzdGVyaXplckNhcHMzMiggTFBSQVNURVJJWkVSX1NUQVRVUyBscHJzLCBVSU5UMzIgY2JOdW1CeXRlcyApCiB7Ci0gIC8qIFRoaXMgaXMgbm90IG11Y2ggbW9yZSB0aGFuIGEgZHVtbXkgKi8KICAgUkFTVEVSSVpFUl9TVEFUVVMgcnM7Ci0gIAorCiAgIHJzLm5TaXplID0gc2l6ZW9mKHJzKTsKICAgcnMud0ZsYWdzID0gMDsKICAgcnMubkxhbmd1YWdlSUQgPSAwOwpAQCAtMTQ0OCwxMCArMTA1OSw3IEBACiBJTlQxNiBHZXRLZXJuaW5nUGFpcnMxNiggSERDMTYgaERDLCBJTlQxNiBjUGFpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFBLRVJOSU5HUEFJUjE2IGxwS2VybmluZ1BhaXJzICkKIHsKLSAgICAvKiBUaGlzIGhhcyB0byBiZSBkZWFsdCB3aXRoIHdoZW4gcHJvcGVyIGZvbnQgaGFuZGxpbmcgaXMgaW4gcGxhY2UgCi0gICAgICoKLSAgICAgKiBBdCB0aGlzIHRpbWUga2VybmluZyBpcyBpZ25vcmVkIChzZXQgdG8gMCkKLSAgICAgKi8KKyAgICAvKiBBdCB0aGlzIHRpbWUga2VybmluZyBpcyBpZ25vcmVkIChzZXQgdG8gMCkgKi8KICAgICBpbnQgaTsKICAgICBmcHJpbnRmKHN0ZG5pbXAsIkdldEtlcm5pbmdQYWlyczE2OiBhbG1vc3QgZW1wdHkgc3R1YiFcbiIpOwogICAgIGZvciAoaSA9IDA7IGkgPCBjUGFpcnM7IGkrKykgbHBLZXJuaW5nUGFpcnNbaV0uaUtlcm5BbW91bnQgPSAwOwpAQCAtMTQ1OSwxNiArMTA2NywxMyBAQAogfQogCiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIEdldEtlcm5pbmdQYWlyczMyQSAgIChHREkzMi4xOTIpCiAgKi8KIERXT1JEIEdldEtlcm5pbmdQYWlyczMyQSggSERDMzIgaERDLCBEV09SRCBjUGFpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExQS0VSTklOR1BBSVIzMiBscEtlcm5pbmdQYWlycyApCiB7Ci0gICAgLyogVGhpcyBoYXMgdG8gYmUgZGVhbHQgd2l0aCB3aGVuIHByb3BlciBmb250IGhhbmRsaW5nIGlzIGluIHBsYWNlIAotICAgICAqCi0gICAgICogQXQgdGhpcyB0aW1lIGtlcm5pbmcgaXMgaWdub3JlZCAoc2V0IHRvIDApCi0gICAgICovCiAgICAgaW50IGk7CiAgICAgZnByaW50ZihzdGRuaW1wLCJHZXRLZXJuaW5nUGFpcnMzMjogYWxtb3N0IGVtcHR5IHN0dWIhXG4iKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgY1BhaXJzOyBpKyspIGxwS2VybmluZ1BhaXJzW2ldLmlLZXJuQW1vdW50ID0gMDsKQEAgLTE0ODQsMyArMTA4OSw0IEBACiB7CiAgICAgcmV0dXJuIEdldEtlcm5pbmdQYWlyczMyQSggaERDLCBjUGFpcnMsIGxwS2VybmluZ1BhaXJzICk7CiB9CisKZGlmZiAtLWdpdCBhL29iamVjdHMvZ2Rpb2JqLmMgYi9vYmplY3RzL2dkaW9iai5jCmluZGV4IDg5YWFkNjUuLjUyYzhiZDUgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZ2Rpb2JqLmMKKysrIGIvb2JqZWN0cy9nZGlvYmouYwpAQCAtMTAwLDE0ICsxMDAsMTQgQEAKIHsKICAgICB7IDAsIEZPTlRfTUFHSUMsIDEgfSwgICAvKiBoZWFkZXIgKi8KICAgICB7IDEyLCAwLCAwLCAwLCBGV19OT1JNQUwsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEFOU0lfQ0hBUlNFVCwKLSAgICAgIDAsIDAsIERFRkFVTFRfUVVBTElUWSwgVkFSSUFCTEVfUElUQ0ggfCBGRl9TV0lTUywgIiIgfQorICAgICAgMCwgMCwgREVGQVVMVF9RVUFMSVRZLCBWQVJJQUJMRV9QSVRDSCB8IEZGX1NXSVNTLCAiTVMgU2FucyBTZXJpZiIgfQogfTsKIAogc3RhdGljIEZPTlRPQkogU3lzdGVtRm9udCA9CiB7Ci0gICAgeyAwLCBGT05UX01BR0lDLCAxIH0sICAgLyogaGVhZGVyICovCisgICAgeyAwLCBGT05UX01BR0lDLCAxIH0sCiAgICAgeyAxMiwgMCwgMCwgMCwgRldfQk9MRCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgQU5TSV9DSEFSU0VULAotICAgICAgMCwgMCwgREVGQVVMVF9RVUFMSVRZLCBWQVJJQUJMRV9QSVRDSCB8IEZGX1NXSVNTLCAiIiB9CisgICAgICAwLCAwLCBERUZBVUxUX1FVQUxJVFksIFZBUklBQkxFX1BJVENIIHwgRkZfU1dJU1MsICJTeXN0ZW0iIH0KIH07CiAKIHN0YXRpYyBGT05UT0JKIERldmljZURlZmF1bHRGb250ID0KQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgIChHRElPQkpIRFIgKikgJkFuc2lWYXJGb250LAogICAgIChHRElPQkpIRFIgKikgJlN5c3RlbUZvbnQsCiAgICAgKEdESU9CSkhEUiAqKSAmRGV2aWNlRGVmYXVsdEZvbnQsCi0gICAgTlVMTCwgICAgICAgICAgICAvKiBERUZBVUxUX1BBTEVUVEUgY3JlYXRlZCBieSBDT0xPUl9Jbml0ICovCisgICAgTlVMTCwgICAgICAgICAgICAvKiBERUZBVUxUX1BBTEVUVEUgY3JlYXRlZCBieSBQQUxFVFRFX0luaXQgKi8KICAgICAoR0RJT0JKSERSICopICZTeXN0ZW1GaXhlZEZvbnQKIH07CiAKQEAgLTE1NCwyMSArMTU0LDI2IEBACiAgKi8KIEJPT0wzMiBHRElfSW5pdCh2b2lkKQogewotICAgIEhQQUxFVFRFMTYgaHBhbGV0dGU7CiAgICAgZXh0ZXJuIEJPT0wzMiBYMTFEUlZfSW5pdCh2b2lkKTsKICAgICBleHRlcm4gQk9PTDMyIERJQl9Jbml0KHZvaWQpOwogCiAgICAgLyogSW5pdGlhbGl6ZSBkcml2ZXJzICovCiAKLSAgICBpZiAoIVgxMURSVl9Jbml0KCkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIURJQl9Jbml0KCkpIHJldHVybiBGQUxTRTsKKyAgICBESUJfSW5pdCgpOwkvKiBhbHdheXMgYmVmb3JlIFgxMURSVl9Jbml0KCkgKi8KIAotICAgICAgLyogQ3JlYXRlIGRlZmF1bHQgcGFsZXR0ZSAqLworICAgIGlmKCBYMTFEUlZfSW5pdCgpICkKKyAgICB7CisJLyogQ3JlYXRlIGRlZmF1bHQgcGFsZXR0ZSAqLwogCi0gICAgaWYgKCEoaHBhbGV0dGUgPSBDT0xPUl9Jbml0KCkpKSByZXR1cm4gRkFMU0U7Ci0gICAgU3RvY2tPYmplY3RzW0RFRkFVTFRfUEFMRVRURV0gPSAoR0RJT0JKSERSICopR0RJX0hFQVBfTElOX0FERFIoIGhwYWxldHRlICk7CisJSFBBTEVUVEUxNiBocGFsZXR0ZSA9IFBBTEVUVEVfSW5pdCgpOwogCi0gICAgcmV0dXJuIFRSVUU7CisJaWYoIGhwYWxldHRlICkKKwl7CisJICAgIFN0b2NrT2JqZWN0c1tERUZBVUxUX1BBTEVUVEVdID0gKEdESU9CSkhEUiAqKUdESV9IRUFQX0xJTl9BRERSKCBocGFsZXR0ZSApOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKIH0KIAogCmRpZmYgLS1naXQgYS9vYmplY3RzL21ldGFmaWxlLmMgYi9vYmplY3RzL21ldGFmaWxlLmMKaW5kZXggNWM1ZGE5OS4uODdlMGIzNCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9tZXRhZmlsZS5jCisrKyBiL29iamVjdHMvbWV0YWZpbGUuYwpAQCAtMzA0LDE4ICszMDQsMjkgQEAKIHsKICAgICBNRVRBSEVBREVSICptaCA9IChNRVRBSEVBREVSICopR2xvYmFsTG9jazE2KGhtZik7CiAgICAgTUVUQVJFQ09SRCAqbXI7CisgICAgSEFORExFVEFCTEUxNiAqaHQ7CiAgICAgSEdMT0JBTDE2IGhIVDsKLSAgICBTRUdQVFIgaHQsIHNwUmVjb3JkOworICAgIFNFR1BUUiBzcGh0LCBzcFJlY29yZDsKICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgCisgICAgV09SRCBpOworICAgIEhQRU4zMiBoUGVuOworICAgIEhCUlVTSDMyIGhCcnVzaDsKKyAgICBIRk9OVDMyIGhGb250OworICAgIERDICpkYzsKKyAgICAKICAgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiRW51bU1ldGFGaWxlKCUwNHgsICUwNHgsICUwOGx4LCAlMDhseClcbiIsCiAJCSAgICAgaGRjLCBobWYsIChEV09SRClscEVudW1GdW5jLCBscERhdGEpOworCisgICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApKSkgcmV0dXJuIDA7CisgICAgaFBlbiA9IGRjLT53LmhQZW47CisgICAgaEJydXNoID0gZGMtPncuaEJydXNoOworICAgIGhGb250ID0gZGMtPncuaEZvbnQ7CiAgICAKICAgICAvKiBjcmVhdGUgdGhlIGhhbmRsZSB0YWJsZSAqLwogICAgIAogICAgIGhIVCA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSB8IEdNRU1fWkVST0lOSVQsCiAJCSAgICAgc2l6ZW9mKEhBTkRMRVRBQkxFMTYpICogbWgtPm10Tm9PYmplY3RzKTsKLSAgICBodCA9IFdJTjE2X0dsb2JhbExvY2sxNihoSFQpOworICAgIHNwaHQgPSBXSU4xNl9HbG9iYWxMb2NrMTYoaEhUKTsKICAgIAogICAgIG9mZnNldCA9IG1oLT5tdEhlYWRlclNpemUgKiAyOwogICAgIApAQCAtMzI1LDcgKzMzNiw3IEBACiAgICAgd2hpbGUgKG9mZnNldCA8IChtaC0+bXRTaXplICogMikpCiAgICAgewogCW1yID0gKE1FVEFSRUNPUkQgKikoKGNoYXIgKiltaCArIG9mZnNldCk7Ci0gICAgICAgIGlmICghbHBFbnVtRnVuYyggaGRjLCAoSEFORExFVEFCTEUxNiAqKWh0LAorICAgICAgICBpZiAoIWxwRW51bUZ1bmMoIGhkYywgKEhBTkRMRVRBQkxFMTYgKilzcGh0LAogICAgICAgICAgICAgICAgICAgICAgICAgIChNRVRBUkVDT1JEICopKChVSU5UMzIpc3BSZWNvcmQgKyBvZmZzZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1oLT5tdE5vT2JqZWN0cywgKExPTkcpbHBEYXRhKSkKIAkgICAgYnJlYWs7CkBAIC0zMzMsNiArMzQ0LDE3IEBACiAJb2Zmc2V0ICs9IChtci0+cmRTaXplICogMik7CiAgICAgfQogCisgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBoQnJ1c2gpOworICAgIFNlbGVjdE9iamVjdDMyKGhkYywgaFBlbik7CisgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBoRm9udCk7CisKKyAgICBodCA9IChIQU5ETEVUQUJMRTE2ICopR2xvYmFsTG9jazE2KGhIVCk7CisKKyAgICAvKiBmcmVlIG9iamVjdHMgaW4gaGFuZGxlIHRhYmxlICovCisgICAgZm9yKGkgPSAwOyBpIDwgbWgtPm10Tm9PYmplY3RzOyBpKyspCisgICAgICBpZigqKGh0LT5vYmplY3RIYW5kbGUgKyBpKSAhPSAwKQorICAgICAgICBEZWxldGVPYmplY3QzMigqKGh0LT5vYmplY3RIYW5kbGUgKyBpKSk7CisKICAgICAvKiBmcmVlIGhhbmRsZSB0YWJsZSAqLwogICAgIEdsb2JhbEZyZWUxNihoSFQpOwogCkBAIC0xMTY1LDkgKzExODcsMTMgQEAKICAgICBEV09SRCBsZW47CiAgICAgSEdMT0JBTDE2IGhtcjsKICAgICBNRVRBUkVDT1JEICptcjsKLQorICAgIAorICAgIGlmKCghZmxhZ3MgJiYgcmVjdCkgfHwgKGZsYWdzICYmICFyZWN0KSkKKwlmcHJpbnRmKHN0ZGVyciwgIk1GX0V4dFRleHRPdXQ6IEluY29uc2lzdGVudCBmbGFncyBhbmQgcmVjdFxuIik7CiAgICAgbGVuID0gc2l6ZW9mKE1FVEFSRUNPUkQpICsgKCgoY291bnQgKyAxKSA+PiAxKSAqIDIpICsgMiAqIHNpemVvZihzaG9ydCkKLQkgICAgKyBzaXplb2YoVUlOVDE2KSArIHNpemVvZihSRUNUMTYpOworCSAgICArIHNpemVvZihVSU5UMTYpOworICAgIGlmKHJlY3QpCisgICAgICAgIGxlbiArPSBzaXplb2YoUkVDVDE2KTsKICAgICBpZiAobHBEeCkKICAgICAgbGVuKz1jb3VudCpzaXplb2YoSU5UMTYpOwogICAgIGlmICghKGhtciA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwgbGVuKSkpCkBAIC0xMTgyLDkgKzEyMDgsMTAgQEAKICAgICAqKG1yLT5yZFBhcmFtICsgMikgPSBjb3VudDsKICAgICAqKG1yLT5yZFBhcmFtICsgMykgPSBmbGFnczsKICAgICBpZiAocmVjdCkgbWVtY3B5KG1yLT5yZFBhcmFtICsgNCwgcmVjdCwgc2l6ZW9mKFJFQ1QxNikpOwotICAgIG1lbWNweShtci0+cmRQYXJhbSArIDgsIHN0ciwgY291bnQpOworICAgIG1lbWNweShtci0+cmRQYXJhbSArIChyZWN0ID8gOCA6IDQpLCBzdHIsIGNvdW50KTsKICAgICBpZiAobHBEeCkKLSAgICAgbWVtY3B5KG1yLT5yZFBhcmFtICsgOCsgKChjb3VudCArIDEpID4+IDEpLGxwRHgsY291bnQqc2l6ZW9mKElOVDE2KSk7CisgICAgIG1lbWNweShtci0+cmRQYXJhbSArIChyZWN0ID8gOCA6IDQpICsgKChjb3VudCArIDEpID4+IDEpLGxwRHgsCisgICAgICBjb3VudCpzaXplb2YoSU5UMTYpKTsKICAgICByZXQgPSBNRl9Xcml0ZVJlY29yZCggZGMsIG1yLCBtci0+cmRTaXplICogMik7CiAgICAgR2xvYmFsRnJlZTE2KGhtcik7CiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL29iamVjdHMvcGFsZXR0ZS5jIGIvb2JqZWN0cy9wYWxldHRlLmMKaW5kZXggNzVlMTFhNi4uNzQyMDdiOCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9wYWxldHRlLmMKKysrIGIvb2JqZWN0cy9wYWxldHRlLmMKQEAgLTQsNiArNCw4IEBACiAgKiBDb3B5cmlnaHQgMTk5MywxOTk0IEFsZXhhbmRyZSBKdWxsaWFyZAogICogQ29weXJpZ2h0IDE5OTYgQWxleCBLb3JvYmthCiAgKgorICogUEFMRVRURU9CSiBpcyBkb2N1bWVudGVkIGluIHRoZSBEci4gRG9iYnMgSm91cm5hbCBNYXkgMTk5My4KKyAqIEluZm9ybWF0aW9uIGluIHRoZSAiVW5kb2N1bWVudGVkIFdpbmRvd3MiIGlzIGluY29ycmVjdC4KICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0yOCw2ICszMCw0NSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFBBTEVUVEVfSW5pdAorICoKKyAqIENyZWF0ZSB0aGUgc3lzdGVtIHBhbGV0dGUuCisgKi8KK0hQQUxFVFRFMTYgUEFMRVRURV9Jbml0KHZvaWQpCit7CisgICAgZXh0ZXJuIGNvbnN0IFBBTEVUVEVFTlRSWSogQ09MT1JfR2V0U3lzdGVtUGFsZXR0ZVRlbXBsYXRlKHZvaWQpOworCisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIEhQQUxFVFRFMTYgICAgICAgICAgaHBhbGV0dGU7CisgICAgTE9HUEFMRVRURSAqICAgICAgICBwYWxQdHI7CisgICAgUEFMRVRURU9CSiogICAgICAgICBwYWxPYmo7CisgICAgY29uc3QgUEFMRVRURUVOVFJZKiBfX3N5c1BhbFRlbXBsYXRlID0gQ09MT1JfR2V0U3lzdGVtUGFsZXR0ZVRlbXBsYXRlKCk7CisKKyAgICAvKiBjcmVhdGUgZGVmYXVsdCBwYWxldHRlICgyMCBzeXN0ZW0gY29sb3JzKSAqLworCisgICAgcGFsUHRyID0geG1hbGxvYyggc2l6ZW9mKExPR1BBTEVUVEUpICsgKE5CX1JFU0VSVkVEX0NPTE9SUy0xKSpzaXplb2YoUEFMRVRURUVOVFJZKSApOworICAgIGlmICghcGFsUHRyKSByZXR1cm4gRkFMU0U7CisKKyAgICBwYWxQdHItPnBhbFZlcnNpb24gPSAweDMwMDsKKyAgICBwYWxQdHItPnBhbE51bUVudHJpZXMgPSBOQl9SRVNFUlZFRF9DT0xPUlM7CisgICAgZm9yKCBpID0gMDsgaSA8IE5CX1JFU0VSVkVEX0NPTE9SUzsgaSArKyApCisgICAgeworICAgICAgICBwYWxQdHItPnBhbFBhbEVudHJ5W2ldLnBlUmVkID0gX19zeXNQYWxUZW1wbGF0ZVtpXS5wZVJlZDsKKyAgICAgICAgcGFsUHRyLT5wYWxQYWxFbnRyeVtpXS5wZUdyZWVuID0gX19zeXNQYWxUZW1wbGF0ZVtpXS5wZUdyZWVuOworICAgICAgICBwYWxQdHItPnBhbFBhbEVudHJ5W2ldLnBlQmx1ZSA9IF9fc3lzUGFsVGVtcGxhdGVbaV0ucGVCbHVlOworICAgICAgICBwYWxQdHItPnBhbFBhbEVudHJ5W2ldLnBlRmxhZ3MgPSAwOworICAgIH0KKyAgICBocGFsZXR0ZSA9IENyZWF0ZVBhbGV0dGUxNiggcGFsUHRyICk7CisKKyAgICBwYWxPYmogPSAoUEFMRVRURU9CSiopIEdESV9HZXRPYmpQdHIoIGhwYWxldHRlLCBQQUxFVFRFX01BR0lDICk7CisKKyAgICBwYWxPYmotPm1hcHBpbmcgPSB4bWFsbG9jKCBzaXplb2YoaW50KSAqIDIwICk7CisKKyAgICBmcmVlKCBwYWxQdHIgKTsKKyAgICByZXR1cm4gaHBhbGV0dGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFBBTEVUVEVfVmFsaWRhdGVGbGFncwogICovCiB2b2lkIFBBTEVUVEVfVmFsaWRhdGVGbGFncyhQQUxFVFRFRU5UUlkqIGxwUGFsRSwgaW50IHNpemUpCmRpZmYgLS1naXQgYS9vYmplY3RzL3JlZ2lvbi5jIGIvb2JqZWN0cy9yZWdpb24uYwppbmRleCAzNTc1MTMyLi45MTQ4ZTZkIDEwMDY0NAotLS0gYS9vYmplY3RzL3JlZ2lvbi5jCisrKyBiL29iamVjdHMvcmVnaW9uLmMKQEAgLTIsNiArMiw4IEBACiAgKiBHREkgcmVnaW9uIG9iamVjdHMKICAqCiAgKiBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqCisgKiBSR05PQkogaXMgZG9jdW1lbnRlZCBpbiB0aGUgRHIuIERvYmJzIEpvdXJuYWwgTWFyY2ggMTk5My4KICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL0NoYW5nZUxvZyBiL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCmluZGV4IDhlMWZhYzAuLjRhNzgyMzUgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsOCBAQAorVHVlIEp1biAgMyAwNzozNDoyNiAxOTk3ICBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CisKKwkqIFtWYS5yY10gKG5ldykKKwlBZGRlZCBWYWxsYWRlciAoUnVtYW50c2NoIExhZGluKSBsYW5ndWFnZSBzdXBwb3J0LgorCiBXZWQgRmViIDEyIDAwOjU4OjM3IDE5OTcgIEVsa2VyIENhdmluYSA8ZWxrZXJAbWFpbC5hc2lhbmV0Lml0PgogCiAJKiBbSXQucmNdIChuZXcpCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgppbmRleCA1MmUzODBlLi5mN2VjYWViIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KQEAgLTgsNyArOCw3IEBACiBERUZTICAgICAgPSAtSSQoU1JDRElSKQogUkNGTEFHUyAgID0gLXczMgogCi1MQU5HVUFHRVMgICA9IEVuIERlIEZyIEZpIEtvIEh1IEl0CitMQU5HVUFHRVMgICA9IEVuIERlIEZyIEZpIEtvIEh1IEl0IFZhCiBMSUNFTlNFTEFORyA9IEVuCiAKICMgSW5zdGFsbGF0aW9uIGluZm9zCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL1ZhLnJjIGIvcHJvZ3JhbXMvcHJvZ21hbi9WYS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDU5NjNjCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9WYS5yYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIFByb2dyYW0gTWFuYWdlcgorICoKKyAqIENvcHlyaWdodCAxOTk2IFVscmljaCBTY2htaWQKKyAqCisgKiBSdW1hbnRzY2ggTGFkaW4gKFZhbGxhZGVyKSBhZGRlZCBieSBtYmF1ckBnMjYuZXRoei5jaAorICoKKyAqLworCisjZGVmaW5lIExBTkdVQUdFX0lEICAgICAgICAgICAgICAgICAgUmwKKyNkZWZpbmUgTEFOR1VBR0VfTlVNQkVSICAgICAgICAgICAgICAyCisjZGVmaW5lIExBTkdVQUdFX01FTlVfSVRFTSAgICAgICAgICAgIiZWYWxsYWRlciIKKworLyogTWVudSAqLworCisjZGVmaW5lIE1FTlVfRklMRSAgICAgICAgICAgICAgICAgICAgIiZEYXRvdGVjYSIKKyNkZWZpbmUgTUVOVV9GSUxFX05FVyAgICAgICAgICAgICAgICAiJk5vdXYuLi4iCisjZGVmaW5lIE1FTlVfRklMRV9PUEVOICAgICAgICAgICAgICAgIiZSaXZpclx0RW5kYXRheml1biIKKyNkZWZpbmUgTUVOVV9GSUxFX01PVkUgICAgICAgICAgICAgICAiJlNwb3N0YXIuLi5cdEY3IgorI2RlZmluZSBNRU5VX0ZJTEVfQ09QWSAgICAgICAgICAgICAgICImQ29wY2hhci4uLlx0RjgiCisjZGVmaW5lIE1FTlVfRklMRV9ERUxFVEUgICAgICAgICAgICAgIlMmdPxkZXJcdERlbCIKKyNkZWZpbmUgTUVOVV9GSUxFX0FUVFJJQlVURVMgICAgICAgICAiJlBhcnRpY3VsYXJpdGFkcy4uLlx0QWx0K0VuZGF0YXppdW4iCisjZGVmaW5lIE1FTlVfRklMRV9FWEVDVVRFICAgICAgICAgICAgIiZFc2VnbmlyLi4uIgorI2RlZmluZSBNRU5VX0ZJTEVfRVhJVCAgICAgICAgICAgICAgICImRmluaXIgV0lORS4uLiIKKworI2RlZmluZSBNRU5VX09QVElPTlMgICAgICAgICAgICAgICAgICImT3B6aXVucyIKKyNkZWZpbmUgTUVOVV9PUFRJT05TX0FVVE9fQVJSQU5HRSAgICAiT3JkaW5hciAmYXV0b21hdGljYW1haW5nIgorI2RlZmluZSBNRU5VX09QVElPTlNfTUlOX09OX1JVTiAgICAgICImU2ltYm9sIGRhdm8nbCBjdW1tYWluemFtYWludCBkYWwgcHJvZ3JhbSIKKyNkZWZpbmUgTUVOVV9PUFRJT05TX1NBVkVfU0VUVElOR1MgICAiQXJjdW5hciBjb256ZXB6aXVucyBhIGxhICZmaW5pc2NoaW5hIgorCisjZGVmaW5lIE1FTlVfV0lORE9XUyAgICAgICAgICAgICAgICAgIiZGYW5lc3RyYSIKKyNkZWZpbmUgTUVOVV9XSU5ET1dTX09WRVJMQVAgICAgICAgICAiJmNydXNjaG9uZFx0U2hpZnQrRjUiCisjZGVmaW5lIE1FTlVfV0lORE9XU19TSURFX0JZX1NJREUgICAgIvxuICZkYXNwZXIgbCdvdGVyXHRTaGlmdCtGNCIKKyNkZWZpbmUgTUVOVV9XSU5ET1dTX0FSUkFOR0UgICAgICAgICAiJm9yZGluYXIgaWxzIHNpbWJvbHMiCisKKyNkZWZpbmUgTUVOVV9MQU5HVUFHRSAgICAgICAgICAgICAgICAiJkxpbmd1biIKKworI2RlZmluZSBNRU5VX0hFTFAgICAgICAgICAgICAgICAgICAgICImQWf8ZCIKKyNkZWZpbmUgTUVOVV9IRUxQX0NPTlRFTlRTICAgICAgICAgICAiJkN1bnRnbvwiCisjZGVmaW5lIE1FTlVfSEVMUF9TRUFSQ0ggICAgICAgICAgICAgIiZUc2NoZXJjaGFyLi4uIgorI2RlZmluZSBNRU5VX0hFTFBfSEVMUF9PTl9IRUxQICAgICAgICImRG91dnJhciBsJ2Fn/GQiCisjZGVmaW5lIE1FTlVfSEVMUF9UVVRPUklBTCAgICAgICAgICAgIiZQcm9ncmFtIGQnaW1wcmVuZGVyIgorCisjZGVmaW5lIE1FTlVfSU5GTyAgICAgICAgICAgICAgICAgICAgIkluZiZvcm1heml1bi4uLiIKKyNkZWZpbmUgTUVOVV9JTkZPX0xJQ0VOU0UgICAgICAgICAgICAiJkxpY2V6YSIKKyNkZWZpbmUgTUVOVV9JTkZPX05PX1dBUlJBTlRZICAgICAgICAiJklOR1VFTkEgR0FSQU5aSUEiCisjZGVmaW5lIE1FTlVfSU5GT19BQk9VVF9XSU5FICAgICAgICAgIiZEYXZhcnQgV0lORSIKKworLyogRGlhbG9ncyAqLworCisjZGVmaW5lIERJQUxPR19PSyAgICAgICAgICAgICAgICAgICAgIk9LIgorI2RlZmluZSBESUFMT0dfQ0FOQ0VMICAgICAgICAgICAgICAgICJGYXIgZ2n2IHF1aW50IgorI2RlZmluZSBESUFMT0dfQlJPV1NFICAgICAgICAgICAgICAgICImVHNjaGVyY2hhciB0cmFzLi4uIgorI2RlZmluZSBESUFMT0dfSEVMUCAgICAgICAgICAgICAgICAgICImQWf8ZCIKKworI2RlZmluZSBESUFMT0dfTkVXX0NBUFRJT04gICAgICAgICAgICJOb3V2IHByb2dldCBkYSBwcm9ncmFtIgorI2RlZmluZSBESUFMT0dfTkVXX05FVyAgICAgICAgICAgICAgICJOb3V2IgorI2RlZmluZSBESUFMT0dfTkVXX0dST1VQICAgICAgICAgICAgICImR3J1cHBhIGRhIHByb2dyYW1zIgorI2RlZmluZSBESUFMT0dfTkVXX1BST0dSQU0gICAgICAgICAgICImUHJvZ3JhbSIKKworI2RlZmluZSBESUFMT0dfTU9WRV9DQVBUSU9OICAgICAgICAgICJTcG9zdGFyIGlsIHByb2dyYW0iCisjZGVmaW5lIERJQUxPR19NT1ZFX1BST0dSQU0gICAgICAgICAgIlNwb3N0YXIgaWwgcHJvZ3JhbToiCisjZGVmaW5lIERJQUxPR19NT1ZFX0ZST01fR1JPVVAgICAgICAgIiZEYSBsYSBncnVwcGE6IgorI2RlZmluZSBESUFMT0dfTU9WRV9UT19HUk9VUCAgICAgICAgICImSW4gZ3J1cHBhOiIKKworI2RlZmluZSBESUFMT0dfQ09QWV9DQVBUSU9OICAgICAgICAgICJDb3BjaGFyIGlsIHByb2dyYW0iCisjZGVmaW5lIERJQUxPR19DT1BZX1BST0dSQU0gICAgICAgICAgIkNvcGNoYXIgaWwgcHJvZ3JhbToiCisjZGVmaW5lIERJQUxPR19DT1BZX0ZST01fR1JPVVAgICAgICAgRElBTE9HX01PVkVfRlJPTV9HUk9VUAorI2RlZmluZSBESUFMT0dfQ09QWV9UT19HUk9VUCAgICAgICAgIERJQUxPR19NT1ZFX1RPX0dST1VQCisKKyNkZWZpbmUgRElBTE9HX0dST1VQX0NBUFRJT04gICAgICAgICAiUGFydGljdWxhcml0YWRzIGRhIGxhcyBncnVwcGFzIgorI2RlZmluZSBESUFMT0dfR1JPVVBfREVTQ1JJUFRJT04gICAgICImRGVzY3JpcHppdW46IgorI2RlZmluZSBESUFMT0dfR1JPVVBfRklMRSAgICAgICAgICAgICJEYXRvJnRlY2E6IgorCisjZGVmaW5lIERJQUxPR19QUk9HUkFNX0NBUFRJT04gICAgICAgIlBhcnRpY3VsYXJpdGFkcyBkYWwgcHJvZ3JhbSIKKyNkZWZpbmUgRElBTE9HX1BST0dSQU1fREVTQ1JJUFRJT04gICBESUFMT0dfR1JPVVBfREVTQ1JJUFRJT04KKyNkZWZpbmUgRElBTE9HX1BST0dSQU1fQ09NTUFORF9MSU5FICAiJkxpbmdpYSBkYSBjdW1vbmRzOiIKKyNkZWZpbmUgRElBTE9HX1BST0dSQU1fRElSRUNUT1JZICAgICAiJlJlZ2lzdGVyIGRhIGxhdnVvcnM6IgorI2RlZmluZSBESUFMT0dfUFJPR1JBTV9IT1RfS0VZICAgICAgICImQ3VtYmluYXppdW46IgorI2RlZmluZSBESUFMT0dfUFJPR1JBTV9TWU1CT0wgICAgICAgICJTY28gU2kmbWJvbCIKKyNkZWZpbmUgRElBTE9HX1BST0dSQU1fT1RIRVJfU1lNQk9MICAiT3RlciAmU2ltYm9sLi4uIgorCisjZGVmaW5lIERJQUxPR19TWU1CT0xfQ0FQVElPTiAgICAgICAgIlRzY2hlcm5lciBTaW1ib2wiCisjZGVmaW5lIERJQUxPR19TWU1CT0xfRklMRSAgICAgICAgICAgIiZOb20gZGEgbGEgRGF0b3RlY2E6IgorI2RlZmluZSBESUFMT0dfU1lNQk9MX0NVUlJFTlQgICAgICAgICJTaW1ib2wgJmFjdHVhbDoiCisKKyNkZWZpbmUgRElBTE9HX0VYRUNVVEVfQ0FQVElPTiAgICAgICAiRXNlZ3VpciBwcm9ncmFtIgorI2RlZmluZSBESUFMT0dfRVhFQ1VURV9DT01NQU5EX0xJTkUgIERJQUxPR19QUk9HUkFNX0NPTU1BTkRfTElORQorI2RlZmluZSBESUFMT0dfRVhFQ1VURV9TWU1CT0wgICAgICAgIERJQUxPR19QUk9HUkFNX1NZTUJPTAorCisvKiBTdHJpbmdzICovCisKKyNkZWZpbmUgU1RSSU5HX1BST0dSQU1fTUFOQUdFUiAgICAgICAgICAgICJNYW5hZ2VyIGRhIHByb2dyYW1zIgorI2RlZmluZSBTVFJJTkdfRVJST1IgICAgICAgICAgICAgICAgICAgICAgIlNCQUdMIgorI2RlZmluZSBTVFJJTkdfV0FSTklORyAgICAgICAgICAgICAgICAgICAgIkFUVEVOVElVTiIKKyNkZWZpbmUgU1RSSU5HX0lORk8gICAgICAgICAgICAgICAgICAgICAgICJJbmZ1b3JtYXppdW4iCisjZGVmaW5lIFNUUklOR19ERUxFVEUgICAgICAgICAgICAgICAgICAgICAiU3T8ZGVyIgorI2RlZmluZSBTVFJJTkdfREVMRVRFX0dST1VQX3MgICAgICAgICAgICAgIlN0/GRlciBsYSBncnVwcGEgZGEgcHJvZ3JhbXMgYCVzJyA/IgorI2RlZmluZSBTVFJJTkdfREVMRVRFX1BST0dSQU1fcyAgICAgICAgICAgIlN0/GRlciBpbCBwcm9ncmFtIGAlcycgPyIKKyNkZWZpbmUgU1RSSU5HX05PVF9JTVBMRU1FTlRFRCAgICAgICAgICAgICJOYSBpbXBsZW1lbnRhIgorI2RlZmluZSBTVFJJTkdfRklMRV9SRUFEX0VSUk9SX3MgICAgICAgICAgIlNiYWdsIGN1biBsZWdlciBgJXMnIgorI2RlZmluZSBTVFJJTkdfRklMRV9XUklURV9FUlJPUl9zICAgICAgICAgIlNiYWdsIGN1biBzY3JpdmVyIGAlcyciCisKKyNkZWZpbmUgU1RSSU5HX0dSUEZJTEVfUkVBRF9FUlJPUl9zICAgICAgICJcCitMYSBkYXRvdGVjYSBkYSBncnVwcGFzIGRhIHByb2dyYW0gJyVzJyBudSBwbyBnbmlyIHJpdmlkYS5cblwKK0VzYSBkYSBwcm91YXIgaW5hdmFudCBkYSBjaGFyZ2lhciBxdWlzdGFcbiIKKworI2RlZmluZSBTVFJJTkdfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgIk1hc3NhIHBhY2EgbWVtb3JpYSIKKyNkZWZpbmUgU1RSSU5HX1dJTkhFTFBfRVJST1IgICAgICAgICAgICAgICJJbmf8biBhZ/xkIGEgZGlzcG9zaXppdW4iCisjZGVmaW5lIFNUUklOR19VTktOT1dOX0ZFQVRVUkVfcyAgICAgICAgICAiRnVuY3ppdW4gaW5jdW50c2NoYWludGEgaW4gJXMiCisjZGVmaW5lIFNUUklOR19GSUxFX05PVF9PVkVSV1JJVFRFTl9zICAgICAiRGF0b3RlY2EgYCVzJyBleGlzdGEgZmluZ2ngLiBFbGxhIG51IHZlZ24uIgorI2RlZmluZSBTVFJJTkdfU0FWRV9HUk9VUF9BU19zICAgICAgICAgICAgIlwKK0xhIGdydXBwYSB2ZWduIHNn/HJhZGEgY3VsIG5vbSAnJXMnIHBlciBldml0YXIgXAorY2hhIGxhIGRhdG90ZWNhIG9yaWdpbmFsYSB2ZWduYSBzdXJzY3JpdHRhLiIKKworI2RlZmluZSBTVFJJTkdfTk9fSE9UX0tFWSAgICAgICAgICAgICAgICAgIkluZ2n8bmEiCisKKyNkZWZpbmUgU1RSSU5HX0FMTF9GSUxFUyAgICAgICAgICAgICAgICAgICJUdW90IGxhcyBkYXRvdGVjYXMgKCouKikiCisjZGVmaW5lIFNUUklOR19QUk9HUkFNUyAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbXMiCisjZGVmaW5lIFNUUklOR19MSUJSQVJJRVNfRExMICAgICAgICAgICAgICAiQmlibGlvdGVjYXMgKCouZGxsKSIKKyNkZWZpbmUgU1RSSU5HX1NZTUJPTF9GSUxFUyAgICAgICAgICAgICAgICJEYXRvdGVjYXMgZGEgc2ltYm9scyIKKyNkZWZpbmUgU1RSSU5HX1NZTUJPTFNfSUNPICAgICAgICAgICAgICAgICJTaW1ib2xzICgqLmljbykiCisKKyNpbmNsdWRlICJYeC5yYyIKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9wcm9jZXNzLmMgYi9zY2hlZHVsZXIvcHJvY2Vzcy5jCmluZGV4IDY4Njg2ZDUuLjZlOWRiMjkgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9wcm9jZXNzLmMKKysrIGIvc2NoZWR1bGVyL3Byb2Nlc3MuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAKIFBEQjMyICpwQ3VycmVudFByb2Nlc3MgPSBOVUxMOwpAQCAtNzg2LDMgKzc4NywxMjMgQEAKICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7CiAgICAgcmV0dXJuIEZBTFNFOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBfS0VSTkVMMzJfMTggICAgKEtFUk5FTDMyLjE4LFdpbjk1KQorICogJ09mIGNvdXJzZSB5b3UgY2Fubm90IGRpcmVjdGx5IGFjY2VzcyBXaW5kb3dzIGludGVybmFsIHN0cnVjdHVyZXMnCisgKi8KK2V4dGVybiBUSERCICpwQ3VycmVudFRocmVhZDsKK0RXT1JECitfS0VSTkVMMzJfMTgoRFdPUkQgcHJvY2Vzc2lkLERXT1JEIGFjdGlvbikgeworCVBEQjMyCSpwcm9jZXNzOworCVREQgkqcFRhc2s7CisKKwlhY3Rpb24rPTU2OworCWZwcmludGYoc3RkZXJyLCJfS0VSTkVMMzJfMTgoJWxkLCVsZCsweDM4KVxuIixwcm9jZXNzaWQsYWN0aW9uKTsKKwlpZiAoYWN0aW9uPjU2KQorCQlyZXR1cm4gMDsKKwlpZiAoIXByb2Nlc3NpZCkgeworCQlwcm9jZXNzPXBDdXJyZW50UHJvY2VzczsKKwkJLyogY2hlY2sgaWYgdmFsaWQgcHJvY2VzcyAqLworCX0gZWxzZQorCQlwcm9jZXNzPShQREIzMiopcEN1cnJlbnRQcm9jZXNzOyAvKiBkZWNyeXB0IHRvbywgaWYgbmVlZGVkICovCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIDA6CS8qIHJldHVybiBhcHAgY29tcGF0IGZsYWdzICovCisJCXBUYXNrID0gKFREQiopR2xvYmFsTG9jazE2KHByb2Nlc3MtPnRhc2spOworCQlpZiAoIXBUYXNrKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBwVGFzay0+Y29tcGF0X2ZsYWdzOworCWNhc2UgNDoJLyogcmV0dXJucyBvZmZzZXQgMHhiOCBvZiBwcm9jZXNzIHN0cnVjdC4uLiBkdW5ubyB3aGF0IGl0IGlzICovCisJCXJldHVybiAwOworCWNhc2UgODoJLyogcmV0dXJuIGhpbnN0YW5jZTE2ICovCisJCXBUYXNrID0gKFREQiopR2xvYmFsTG9jazE2KHByb2Nlc3MtPnRhc2spOworCQlpZiAoIXBUYXNrKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBwVGFzay0+aEluc3RhbmNlOworCWNhc2UgMTI6LyogcmV0dXJuIGV4cGVjdGVkIHdpbmRvd3MgdmVyc2lvbiAqLworCQlwVGFzayA9IChUREIqKUdsb2JhbExvY2sxNihwcm9jZXNzLT50YXNrKTsKKwkJaWYgKCFwVGFzaykKKwkJCXJldHVybiAwOworCQlyZXR1cm4gcFRhc2stPnZlcnNpb247CisJY2FzZSAxNjovKiByZXR1cm4gdW5jcnlwdGVkIHBvaW50ZXIgdG8gY3VycmVudCB0aHJlYWQgKi8KKwkJcmV0dXJuIChEV09SRClwQ3VycmVudFRocmVhZDsKKwljYXNlIDIwOi8qIHJldHVybiB1bmNyeXB0ZWQgcG9pbnRlciB0byBwcm9jZXNzICovCisJCXJldHVybiAoRFdPUkQpcHJvY2VzczsKKwljYXNlIDI0Oi8qIHJldHVybiBzdGRvdXRwdXQgaGFuZGxlIGZyb20gc3RhcnR1cGluZm8gKi8KKwkJcmV0dXJuIChEV09SRCkocHJvY2Vzcy0+ZW52X2RiLT5zdGFydHVwX2luZm8tPmhTdGRPdXRwdXQpOworCWNhc2UgMjg6LyogcmV0dXJuIHN0ZGlucHV0IGhhbmRsZSBmcm9tIHN0YXJ0dXBpbmZvICovCisJCXJldHVybiAoRFdPUkQpKHByb2Nlc3MtPmVudl9kYi0+c3RhcnR1cF9pbmZvLT5oU3RkSW5wdXQpOworCWNhc2UgMzI6LyogZ2V0IHNob3d3aW5kb3cgZmxhZyBmcm9tIHN0YXJ0dXBpbmZvICovCisJCXJldHVybiAoRFdPUkQpKHByb2Nlc3MtPmVudl9kYi0+c3RhcnR1cF9pbmZvLT53U2hvd1dpbmRvdyk7CisJY2FzZSAzNjp7LyogcmV0dXJuIHN0YXJ0dXAgeCBhbmQgeSBzaXplcyAqLworCQlMUFNUQVJUVVBJTkZPMzJBIHNpID0gcHJvY2Vzcy0+ZW52X2RiLT5zdGFydHVwX2luZm87CisJCURXT1JEIHgseTsKKworCQl4PXNpLT5kd1hTaXplO2lmICh4PT0weDgwMDAwMDAwKSB4PTB4ODAwMDsKKwkJeT1zaS0+ZHdZU2l6ZTtpZiAoeT09MHg4MDAwMDAwMCkgeT0weDgwMDA7CisJCXJldHVybiAoeTw8MTYpK3g7CisJfQorCWNhc2UgNDA6ey8qIHJldHVybiBzdGFydHVwIHggYW5kIHkgKi8KKwkJTFBTVEFSVFVQSU5GTzMyQSBzaSA9IHByb2Nlc3MtPmVudl9kYi0+c3RhcnR1cF9pbmZvOworCQlEV09SRCB4LHk7CisKKwkJeD1zaS0+ZHdYO2lmICh4PT0weDgwMDAwMDAwKSB4PTB4ODAwMDsKKwkJeT1zaS0+ZHdZO2lmICh5PT0weDgwMDAwMDAwKSB5PTB4ODAwMDsKKwkJcmV0dXJuICh5PDwxNikreDsKKwl9CisJY2FzZSA0NDovKiByZXR1cm4gc3RhcnR1cCBmbGFncyAqLworCQlyZXR1cm4gcHJvY2Vzcy0+ZW52X2RiLT5zdGFydHVwX2luZm8tPmR3RmxhZ3M7CisJY2FzZSA0ODovKiByZXR1cm4gdW5jcnlwdGVkIHBvaW50ZXIgdG8gcGFyZW50IHByb2Nlc3MgKGlmIGFueSkgKi8KKwkJcmV0dXJuIChEV09SRClwcm9jZXNzLT5wYXJlbnQ7CisJY2FzZSA1MjovKiByZXR1cm4gcHJvY2VzcyBmbGFncyAqLworCQlyZXR1cm4gcHJvY2Vzcy0+ZmxhZ3M7CisJY2FzZSA1NjovKiB1bmV4cGxvcmVkICovCisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCJfS0VSTkVMMzJfMTg6dW5rbm93biBvZmZzZXQgKCVsZClcbiIsYWN0aW9uKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIHNob3VsZG4ndCBjb21lIGhlcmUgKi8KK30KKworVk9JRCAvKiBGSVhNRSAqLworX0tFUk5FTDMyXzUyKERXT1JEIGFyZzEsQ09OVEVYVCAqcmVncykgeworCVNFR1BUUiAqc3RyID0gU0VHUFRSX1NUUkRVUCgiVGhrQnVmIik7CisKKwlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FMzJfNTIoYXJnMT0lMDhseCwlMDhseClcbiIsYXJnMSxFRElfcmVnKHJlZ3MpKTsKKworCUVBWF9yZWcocmVncykgPSBHZXRQcm9jQWRkcmVzczE2KEVESV9yZWcocmVncyksU0VHUFRSX0dFVChzdHIpKTsKKwlmcHJpbnRmKHN0ZGVyciwiCUdldFByb2NBZGRyZXNzMTYoXCJUaGtCdWZcIikgcmV0dXJucyAlMDhseFxuIiwKKwkJCUVBWF9yZWcocmVncykKKwkpOworCVNFR1BUUl9GUkVFKHN0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFBXaW5Mb2NrICAgIChLRVJORUwzMikgRklYTUUKKyAqLworVk9JRAorR2V0UFdpbkxvY2soQ1JJVElDQUxfU0VDVElPTiAqKmxvY2spIHsKKwlzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBwbG9jazsKKwlmcHJpbnRmKHN0ZGVyciwiR2V0UFdpbmxvY2soJXApXG4iLGxvY2spOworCSpsb2NrID0gJnBsb2NrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRQcm9jZXNzVmVyc2lvbiAgICAoS0VSTkVMMzIpCisgKi8KK0RXT1JECitHZXRQcm9jZXNzVmVyc2lvbihEV09SRCBwcm9jZXNzaWQpIHsKKwlQREIzMgkqcHJvY2VzczsKKwlUREIJKnBUYXNrOworCisJaWYgKCFwcm9jZXNzaWQpIHsKKwkJcHJvY2Vzcz1wQ3VycmVudFByb2Nlc3M7CisJCS8qIGNoZWNrIGlmIHZhbGlkIHByb2Nlc3MgKi8KKwl9IGVsc2UKKwkJcHJvY2Vzcz0oUERCMzIqKXBDdXJyZW50UHJvY2VzczsgLyogZGVjcnlwdCB0b28sIGlmIG5lZWRlZCAqLworCXBUYXNrID0gKFREQiopR2xvYmFsTG9jazE2KHByb2Nlc3MtPnRhc2spOworCWlmICghcFRhc2spCisJCXJldHVybiAwOworCXJldHVybiAocFRhc2stPnZlcnNpb24mMHhmZikgfCAoKChwVGFzay0+dmVyc2lvbiA+PjgpICYgMHhmZik8PDE2KTsKK30KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci90aHJlYWQuYyBiL3NjaGVkdWxlci90aHJlYWQuYwppbmRleCAzMzkwN2FiLi5hZDRmZjI3IDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvdGhyZWFkLmMKKysrIGIvc2NoZWR1bGVyL3RocmVhZC5jCkBAIC02Myw3ICs2Myw3IEBACiAgICAgLyogU2V0IGEgZ3VhcmQgcGFnZSBhdCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAqLwogICAgIFZpcnR1YWxQcm90ZWN0KCB0aGRiLT5zdGFja19iYXNlLCAxLCBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFIHwgUEFHRV9HVUFSRCwKICAgICAgICAgICAgICAgICAgICAgJm9sZF9wcm90ICk7Ci0gICAgdGhkYi0+dGViLnN0YWNrX3RvcCAgID0gKGNoYXIgKil0aGRiLT5zdGFja19iYXNlICsgc3RhY2tfc2l6ZSAtIDE7CisgICAgdGhkYi0+dGViLnN0YWNrX3RvcCAgID0gKGNoYXIgKil0aGRiLT5zdGFja19iYXNlICsgc3RhY2tfc2l6ZTsKICAgICB0aGRiLT50ZWIuc3RhY2tfbG93ICAgPSB0aGRiLT5zdGFja19iYXNlOwogICAgIHRoZGItPmV4aXRfc3RhY2sgICAgICA9IHRoZGItPnRlYi5zdGFja190b3A7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IDZkOTAwOGMuLjUzZTY3ODAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtNzA0LDcgKzcwNCw3IEBACiAgICAgYnVmZmVyID0geG1hbGxvYyggMHgxMDAwMCApOwogCiAgICAgcE1vZHVsZSA9IChORV9NT0RVTEUgKilidWZmZXI7Ci0gICAgcE1vZHVsZS0+bWFnaWMgPSBORV9TSUdOQVRVUkU7CisgICAgcE1vZHVsZS0+bWFnaWMgPSBJTUFHRV9PUzJfU0lHTkFUVVJFOwogICAgIHBNb2R1bGUtPmNvdW50ID0gMTsKICAgICBwTW9kdWxlLT5uZXh0ID0gMDsKICAgICBwTW9kdWxlLT5mbGFncyA9IE5FX0ZGTEFHU19TSU5HTEVEQVRBIHwgTkVfRkZMQUdTX0JVSUxUSU4gfCBORV9GRkxBR1NfTElCTU9EVUxFOwpAQCAtODg3LDcgKzg4Nyw3IEBACiAgICAgYnVmZmVyID0geG1hbGxvYyggMHgxMDAwMCApOwogCiAgICAgcE1vZHVsZSA9IChORV9NT0RVTEUgKilidWZmZXI7Ci0gICAgcE1vZHVsZS0+bWFnaWMgPSBORV9TSUdOQVRVUkU7CisgICAgcE1vZHVsZS0+bWFnaWMgPSBJTUFHRV9PUzJfU0lHTkFUVVJFOwogICAgIHBNb2R1bGUtPmNvdW50ID0gMTsKICAgICBwTW9kdWxlLT5uZXh0ID0gMDsKICAgICBwTW9kdWxlLT5kZ3JvdXBfZW50cnkgPSAwOwpkaWZmIC0tZ2l0IGEvdG9vbHMvZm50MmJkZi5jIGIvdG9vbHMvZm50MmJkZi5jCmluZGV4IDhlODg5ZTYuLjY3OTUxMTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZudDJiZGYuYworKysgYi90b29scy9mbnQyYmRmLmMKQEAgLTM0LDYgKzM0LDcgQEAKIGNoYXIqCWdfbHBzdHJGaWxlTmFtZSA9IE5VTEw7CiBjaGFyKglnX2xwc3RyQ2hhclNldCA9IE5VTEw7CiBjaGFyKiAgIGdfbHBzdHJJbnB1dEZpbGUgPSBOVUxMOworaW50ICAgICBnX291dHB1dFBvaW50cyA9IDA7CiAKIHN0YXRpYyBjaGFyKgllcnJvckRMTFJlYWQgPSAiVW5hYmxlIHRvIHJlYWQgV2luZG93cyBETEwuXG4iOwogc3RhdGljIGNoYXIqICAgIGVycm9yRk5UUmVhZCA9ICJVbmFibGUgdG8gcmVhZCAuRk5UIGZpbGUuXG4iOwpAQCAtNDcsOSArNDgsMTAgQEAKIAogdm9pZCB1c2FnZSgpCiB7Ci0gICAgcHJpbnRmKCJVc2FnZTogZm9udDJiZGYgWy1jIGNoYXJzZXRdIFstbyBiYXNlbmFtZV0gW2lucHV0IGZpbGVdXG4iKTsKLSAgICBwcmludGYoIiAgLWMgY2hhcnNldFx0dXNlIHRoaXMgY2hhcnNldCBuYW1lIGZvciBPRU1fQ0hBUlNFVCBmb250c1xuIik7CisgICAgcHJpbnRmKCJVc2FnZTogZm50MmJkZiBbLXRdIFstYyBjaGFyc2V0XSBbLW8gYmFzZW5hbWVdIFtpbnB1dCBmaWxlXVxuIik7CisgICAgcHJpbnRmKCIgIC1jIGNoYXJzZXRcdGNoYXJzZXQgbmFtZSBmb3IgT0VNX0NIQVJTRVQgZm9udHNcbiIpOwogICAgIHByaW50ZigiICAtZiBiYXNlbmFtZVx0YmFzaWMgb3V0cHV0IGZpbGVuYW1lXG4iKTsKKyAgICBwcmludGYoIiAgLXQgXHRcdG91dHB1dCBmaWxlcyBieSBwb2ludCBzaXplIGluc3RlYWQgb2YgcGl4ZWwgaGVpZ2h0XG4iKTsKICAgICBwcmludGYoIiAgaW5wdXQgZmlsZVx0TVNXaW5kb3dzIC5mb24sIC5mbnQsIC5kbGwsIG9yIC5leGUgZmlsZS5cbiIpOwogICAgIHByaW50ZigiXG5FeGFtcGxlOlxuICBmbnQyYmRmIC1jIHdpbnN5cyB2Z2FzeXMuZm50XG5cbiIpOwogICAgIGV4aXQoLTEpOwpAQCAtMTEwLDcgKzExMiw4IEBACiAKICAgbHBDaGFyID0gbmFtZSArIHN0cmxlbiggbmFtZSApOwogICBzcHJpbnRmKGxwQ2hhciwgIiVkLSVkLmJkZiIsIHJldHVybl9kYXRhX3ZhbHVlKGRmU2hvcnQsIGNwZV9mb250X3N0cnVjdC0+aGRyLmRmV2VpZ2h0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fZGF0YV92YWx1ZShkZlNob3J0LCBjcGVfZm9udF9zdHJ1Y3QtPmhkci5kZlBvaW50cykgKTsKKyAgICAgICAgICAoZ19vdXRwdXRQb2ludHMpID8gcmV0dXJuX2RhdGFfdmFsdWUoZGZTaG9ydCwgY3BlX2ZvbnRfc3RydWN0LT5oZHIuZGZQb2ludHMpCisJCQkgICA6IHJldHVybl9kYXRhX3ZhbHVlKGRmU2hvcnQsIGNwZV9mb250X3N0cnVjdC0+aGRyLmRmUGl4SGVpZ2h0KSApOwogICByZXR1cm4gMDsKIH0KIApAQCAtMTM2LDcgKzEzOSw3IEBACiAKICAgICBpbnQgbF9mY2hhciA9IHJldHVybl9kYXRhX3ZhbHVlKGRmQ2hhciwgY3BlX2ZvbnRfc3RydWN0Lmhkci5kZkZpcnN0Q2hhciksCiAgICAgICAgIGxfbGNoYXIgPSByZXR1cm5fZGF0YV92YWx1ZShkZkNoYXIsIGNwZV9mb250X3N0cnVjdC5oZHIuZGZMYXN0Q2hhcik7IAotICAgIGludCBsX2xlbiAgID0gbF9sY2hhci1sX2ZjaGFyLCBsX3B0ciA9IE1BUF9CRUc7CisgICAgaW50IGxfbGVuICAgPSBsX2xjaGFyIC0gbF9mY2hhciArIDEsIGxfcHRyID0gTUFQX0JFRzsKIAogICAgIC8qIG1hbGxvYyBzaXplID0gKCMgY2hhcnMpICogc2l6ZW9mKFdpbkNoYXJTKSAqLwogCkBAIC0xNzQsNyArMTc3LDcgQEAKICAgaW50ICAgICBsX2ZjaGFyID0gcmV0dXJuX2RhdGFfdmFsdWUoZGZDaGFyLCBjcGVfZm9udF9zdHJ1Y3QtPmhkci5kZkZpcnN0Q2hhciksIAogICAgICAgICAgIGxfbGNoYXIgPSByZXR1cm5fZGF0YV92YWx1ZShkZkNoYXIsIGNwZV9mb250X3N0cnVjdC0+aGRyLmRmTGFzdENoYXIpOyAKIAotICBpbnQgICAgIGxfbGVuID0gbF9sY2hhci1sX2ZjaGFyLAorICBpbnQgICAgIGxfbGVuID0gbF9sY2hhci1sX2ZjaGFyICsgMSwKICAgICAgICAgICBsX2hndCA9IHJldHVybl9kYXRhX3ZhbHVlKGRmQ2hhciwgY3BlX2ZvbnRfc3RydWN0LT5oZHIuZGZQaXhIZWlnaHQpOyAKICAgaW50CSAgbF9hc2NlbnQgPSByZXR1cm5fZGF0YV92YWx1ZShkZlNob3J0LCBjcGVfZm9udF9zdHJ1Y3QtPmhkci5kZkFzY2VudCk7CiAgIGNoYXIgICAgbF9maWxlbmFtZVsyNTZdOwpAQCAtMjc5LDcgKzI4Miw3IEBACiB7CiBpbnQgICAgIGxfZmNoYXIgPSByZXR1cm5fZGF0YV92YWx1ZShkZkNoYXIsIGNwZV9mb250X3N0cnVjdC0+aGRyLmRmRmlyc3RDaGFyKSwgCiAgICAgICAgIGxfbGNoYXIgPSByZXR1cm5fZGF0YV92YWx1ZShkZkNoYXIsIGNwZV9mb250X3N0cnVjdC0+aGRyLmRmTGFzdENoYXIpOwotaW50ICAgICBsX2xlbiA9IGxfbGNoYXIgLSBsX2ZjaGFyOworaW50ICAgICBsX2xlbiA9IGxfbGNoYXIgLSBsX2ZjaGFyICsgMTsKIGludCAgICAgbF9uYW1lb2Zmc2V0ID0gcmV0dXJuX2RhdGFfdmFsdWUoZGZMb25nLCBjcGVfZm9udF9zdHJ1Y3QtPmhkci5kZkZhY2UpOwogaW50IAlsX2NlbGxoZWlnaHQgPSByZXR1cm5fZGF0YV92YWx1ZShkZlNob3J0LCBjcGVfZm9udF9zdHJ1Y3QtPmhkci5kZlBpeEhlaWdodCk7CiBpbnQgICAgIGxfYXNjZW50ID0gcmV0dXJuX2RhdGFfdmFsdWUoZGZTaG9ydCwgY3BlX2ZvbnRfc3RydWN0LT5oZHIuZGZBc2NlbnQpOwpAQCAtMzMzLDcgKzMzNiw3IEBACiAgICAgICAvKiBzcGFjaW5nICovCiAKICAgICAgIGlmKCByZXR1cm5fZGF0YV92YWx1ZShkZlNob3J0LCBjcGVfZm9udF9zdHJ1Y3QtPmhkci5kZlBpeFdpZHRoKSApIGZwdXRzKCJjLSIsIGZzKTsKLSAgICAgIGVsc2UgZnB1dHMoIm0tIiwgZnMpOworICAgICAgZWxzZSBmcHV0cygicC0iLCBmcyk7CiAJCiAgICAgICAvKiBhdmVyYWdlIHdpZHRoICovCiAKQEAgLTM0MywxNSArMzQ2LDI3IEBACiAKICAgICAgIHN3aXRjaCggY3BlX2ZvbnRfc3RydWN0LT5oZHIuZGZDaGFyU2V0WzBdICkKICAgICAgIHsKLQljYXNlIEFOU0lfQ0hBUlNFVDogZnB1dHMoImFuc2ktMFxuIiwgZnMpOyBicmVhazsKKwkvKiBNaWNyb3NvZnQganVzdCBoYWQgdG8gaW52ZW50IGl0cyBvd24gY2hhcnNldHMhICovCisKKwljYXNlIEFOU0lfQ0hBUlNFVDogCWZwdXRzKCJhbnNpLTBcbiIsIGZzKTsgYnJlYWs7CisJY2FzZSBHUkVFS19DSEFSU0VUOiAJZnB1dHMoImNwMTI1LTNcbiIsIGZzKTsgYnJlYWs7CisJY2FzZSBUVVJLSVNIX0NIQVJTRVQ6IAlmcHV0cygiaXNvODg1OS05IiwgZnMpOyBicmVhazsKKwljYXNlIEhFQlJFV19DSEFSU0VUOiAJZnB1dHMoImNwMTI1LTUiLCBmcyk7IGJyZWFrOworCWNhc2UgQVJBQklDX0NIQVJTRVQ6IAlmcHV0cygiY3AxMjUtNiIsIGZzKTsgYnJlYWs7CisJY2FzZSBCQUxUSUNfQ0hBUlNFVDogCWZwdXRzKCJjcDEyNS03IiwgZnMpOyBicmVhazsKKwljYXNlIFJVU1NJQU5fQ0hBUlNFVDogCWZwdXRzKCJjcDEyNS0xIiwgZnMpOyBicmVhazsKKwljYXNlIEVFX0NIQVJTRVQ6IAlmcHV0cygiaXNvODg1OS0yIiwgZnMpOyBicmVhazsgCisJY2FzZSBTWU1CT0xfQ0hBUlNFVDogCWZwdXRzKCJtaXNjLWZvbnRzcGVjaWZpY1xuIiwgZnMpOyBicmVhazsKKwljYXNlIFNISUZUSklTX0NIQVJTRVQ6IAlmcHV0cygiamlzeDAyMDguMTk4My0wXG4iLCBmcyk7IGJyZWFrOworCWNhc2UgREVGQVVMVF9DSEFSU0VUOglmcHV0cygiaXNvODg1OS0xXG4iLCBmcyk7IGJyZWFrOworCiAJZGVmYXVsdDoKLQljYXNlIERFRkFVTFRfQ0hBUlNFVDogZnB1dHMoImlzbzg4NTktMVxuIiwgZnMpOyBicmVhazsKLQljYXNlIFNZTUJPTF9DSEFSU0VUOiBmcHV0cygibWlzYy1mb250c3BlY2lmaWNcbiIsIGZzKTsgYnJlYWs7Ci0JY2FzZSBTSElGVEpJU19DSEFSU0VUOiBmcHV0cygiamlzeDAyMDguMTk4My0wXG4iLCBmcyk7IGJyZWFrOwogCWNhc2UgT0VNX0NIQVJTRVQ6IAogCQlpZiggIWdfbHBzdHJDaGFyU2V0ICkgCi0JCXsgZnB1dHMoIlVuZGVmaW5lZCBPRU0gY2hhcnNldCwgdXNlIC1jIG9wdGlvbi5cbiIsIHN0ZGVycik7IAotCQkgIHJldHVybiBFUlJPUl9EQVRBOyB9CisJCXsgCisJCSAgICBmcHV0cygiVW5kZWZpbmVkIGNoYXJzZXQsIHVzZSAtYyBvcHRpb24uXG4iLCBzdGRlcnIpOyAKKwkJICAgIHJldHVybiBFUlJPUl9EQVRBOyAKKwkJfQogCSAgICAgICAgZnByaW50ZihmcywgIiVzXG4iLCBnX2xwc3RyQ2hhclNldCk7CiAgICAgICB9CiAgICAgfQpAQCAtMzk3LDE0ICs0MTIsMjQgQEAKICAgICBjYXNlIDQ6CiAgICAgY2FzZSA1OgogICAgIGNhc2UgNjoKKyAgICBjYXNlIDc6CisgICAgY2FzZSA4OgogCSBmb3IoIGkgPSAxOyBpIDwgYXJnYyAtIDE7IGkrKyApCiAJIHsKIAkgICBpZiggYXJndltpXVswXSAhPSAnLScgfHwKIAkgICAgICAgc3RybGVuKGFyZ3ZbaV0pICE9IDIgKSBicmVhazsKIAotCSAgIGlmKCBhcmd2W2ldWzFdID09ICdjJyApIHsgZ19scHN0ckNoYXJTZXQgPSBhcmd2W2krMV07IH0KKwkgICBpZiggYXJndltpXVsxXSA9PSAnYycgKSAKKwkgICAgICAgZ19scHN0ckNoYXJTZXQgPSBhcmd2W2krMV07CiAJICAgZWxzZSAKLQkgICBpZiggYXJndltpXVsxXSA9PSAnZicgKSB7IGdfbHBzdHJGaWxlTmFtZSA9IGFyZ3ZbaSsxXTsgfQorCSAgIGlmKCBhcmd2W2ldWzFdID09ICdmJyApIAorCSAgICAgICBnX2xwc3RyRmlsZU5hbWUgPSBhcmd2W2krMV07CisJICAgZWxzZQorCSAgIGlmKCBhcmd2W2ldWzFdID09ICd0JyApCisJICAgeworCSAgICAgIGdfb3V0cHV0UG9pbnRzID0gMTsKKwkgICAgICBjb250aW51ZTsKKwkgICB9CiAJICAgZWxzZQogCSAgIHVzYWdlKCk7CiAKQEAgLTQyNCw4ICs0NDksOCBAQAogCiBpbnQgZ2V0X3Jlc291cmNlX3RhYmxlKGludCBmZCwgdW5zaWduZWQgY2hhcioqIGxwZGF0YSwgaW50IGZzaXplKQogewotICBzdHJ1Y3QgbXpfaGVhZGVyX3MgbXpfaGVhZGVyOwotICBzdHJ1Y3QgbmVfaGVhZGVyX3MgbmVfaGVhZGVyOworICBJTUFHRV9ET1NfSEVBREVSIG16X2hlYWRlcjsKKyAgSU1BR0VfT1MyX0hFQURFUiBuZV9oZWFkZXI7CiAgIHNob3J0CQkgICAgIHMsIG9mZnNldCwgc2l6ZSwgcmV0dmFsOwogCiAgCkBAIC00MzQsMTEgKzQ1OSwxMSBAQAogICBpZiggcmVhZChmZCwgJm16X2hlYWRlciwgc2l6ZW9mKG16X2hlYWRlcikpICE9IHNpemVvZihtel9oZWFkZXIpICkgCiAgICAgICByZXR1cm4gRklMRV9FUlJPUjsKIAotICBzID0gcmV0dXJuX2RhdGFfdmFsdWUoZGZTaG9ydCwgJm16X2hlYWRlci5tel9tYWdpYyk7CisgIHMgPSByZXR1cm5fZGF0YV92YWx1ZShkZlNob3J0LCAmbXpfaGVhZGVyLmVfbWFnaWMpOwogCi0gIGlmKCBzID09IE1aX1NJR05BVFVSRSkgCQkvKiBsb29rcyBsaWtlIC5kbGwgZmlsZSBzbyBmYXIuLi4gKi8KKyAgaWYoIHMgPT0gSU1BR0VfRE9TX1NJR05BVFVSRSkJCS8qIGxvb2tzIGxpa2UgLmRsbCBmaWxlIHNvIGZhci4uLiAqLwogICB7Ci0gICAgcyA9IHJldHVybl9kYXRhX3ZhbHVlKGRmU2hvcnQsICZtel9oZWFkZXIubmVfb2Zmc2V0KTsKKyAgICBzID0gcmV0dXJuX2RhdGFfdmFsdWUoZGZTaG9ydCwgJm16X2hlYWRlci5lX2xmYW5ldyk7CiAgICAgbHNlZWsoIGZkLCBzLCBTRUVLX1NFVCApOwogCiAgICAgaWYoIHJlYWQoZmQsICZuZV9oZWFkZXIsIHNpemVvZihuZV9oZWFkZXIpKSAhPSBzaXplb2YobmVfaGVhZGVyKSApCkBAIC00NDYsMTIgKzQ3MSwxMiBAQAogCiAgICAgcyA9IHJldHVybl9kYXRhX3ZhbHVlKGRmU2hvcnQsICZuZV9oZWFkZXIubmVfbWFnaWMpOwogCi0gICAgaWYoIHMgPT0gUEVfU0lHTkFUVVJFKQorICAgIGlmKCBzID09IElNQUdFX05UX1NJR05BVFVSRSkKICAgICB7CiAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRG8gbm90IGtub3cgaG93IHRvIGhhbmRsZSAzMi1iaXQgV2luZG93cyBETExzLlxuIik7CiAgICAgICAgcmV0dXJuIEZJTEVfRVJST1I7IAogICAgIH0KLSAgICBlbHNlIGlmICggcyAhPSBORV9TSUdOQVRVUkUpIHJldHVybiBGSUxFX0VSUk9SOworICAgIGVsc2UgaWYgKCBzICE9IElNQUdFX09TMl9TSUdOQVRVUkUpIHJldHVybiBGSUxFX0VSUk9SOwogCiAgICAgcyA9IHJldHVybl9kYXRhX3ZhbHVlKGRmU2hvcnQsICZuZV9oZWFkZXIucmVzb3VyY2VfdGFiX29mZnNldCk7CiAgICAgc2l6ZSA9IHJldHVybl9kYXRhX3ZhbHVlKGRmU2hvcnQsICZuZV9oZWFkZXIucm5hbWVfdGFiX29mZnNldCk7CkBAIC00NTksMTQgKzQ4NCwxNCBAQAogICAgIGlmKCBzaXplID4gZnNpemUgKSByZXR1cm4gRklMRV9FUlJPUjsKIAogICAgIHNpemUgLT0gczsKLSAgICBvZmZzZXQgPSBzICsgcmV0dXJuX2RhdGFfdmFsdWUoZGZTaG9ydCwgJm16X2hlYWRlci5uZV9vZmZzZXQpOworICAgIG9mZnNldCA9IHMgKyByZXR1cm5fZGF0YV92YWx1ZShkZlNob3J0LCAmbXpfaGVhZGVyLmVfbGZhbmV3KTsKIAogICAgIGlmKCBzaXplIDw9IHNpemVvZihORV9UWVBFSU5GTykgKSByZXR1cm4gRklMRV9FUlJPUjsKICAgICByZXR2YWwgPSBGSUxFX0RMTDsKICAgfQogICBlbHNlIGlmKCBzID09IDB4MzAwIHx8IHMgPT0gMHgyMDAgKQkJLyogbWF5YmUgLmZudCA/ICovCiAgIHsKLSAgICBzaXplID0gcmV0dXJuX2RhdGFfdmFsdWUoZGZMb25nLCAmbXpfaGVhZGVyLmRvbnRfY2FyZSk7CisgICAgc2l6ZSA9IHJldHVybl9kYXRhX3ZhbHVlKGRmTG9uZywgKGNoYXIqKSZtel9oZWFkZXIrMik7CiAKICAgICBpZiggc2l6ZSAhPSBmc2l6ZSApIHJldHVybiBGSUxFX0VSUk9SOwogICAgIG9mZnNldCAgPSAwOwpkaWZmIC0tZ2l0IGEvd2luMzIvYWR2YXBpLmMgYi93aW4zMi9hZHZhcGkuYwppbmRleCAyZmU1NGYyLi45YmIxY2E3IDEwMDY0NAotLS0gYS93aW4zMi9hZHZhcGkuYworKysgYi93aW4zMi9hZHZhcGkuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTU1LDYgKzU2LDE5IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE9wZW5UaHJlYWRUb2tlbgkJW0FEVkFQSTMyLjExNF0KKyAqLworQk9PTDMyCitPcGVuVGhyZWFkVG9rZW4oCisJSEFORExFMzIgdGhyZWFkLERXT1JEIGRlc2lyZWRhY2Nlc3MsQk9PTDMyIG9wZW5hc3NlbGYsSEFORExFMzIgKnRoYW5kbGUKKykgeworCWZwcmludGYoc3RkbmltcCwiT3BlblRocmVhZFRva2VuKCUwOHgsJTA4bHgsJWQsJXApLHN0dWIhXG4iLAorCQl0aHJlYWQsZGVzaXJlZGFjY2VzcyxvcGVuYXNzZWxmLHRoYW5kbGUKKwkpOworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMb29rdXBQcml2aWxlZ2VWYWx1ZUEgICBbQURWQVBJMzIuOTBdCiAgKi8KIEJPT0wzMgpAQCAtNzIsMyArODYsNDMgQEAKIHsKIAlyZXR1cm4gVFJVRTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0VG9rZW5JbmZvcm1hdGlvbglbQURWQVBJMzIuNjZdCisgKi8KK0JPT0wzMgorR2V0VG9rZW5JbmZvcm1hdGlvbigKKwlIQU5ETEUzMiB0b2tlbiwvKlRPS0VOX0lORk9STUFUSU9OX0NMQVNTKi8gRFdPUkQgdG9rZW5pbmZvY2xhc3MsTFBWT0lEIHRva2VuaW5mbywKKwlEV09SRCB0b2tlbmluZm9sZW5ndGgsTFBEV09SRCByZXRsZW4KKykgeworCWZwcmludGYoc3RkZXJyLCJHZXRUb2tlbkluZm9ybWF0aW9uKCUwOGx4LCVkLCVwLCVsZCwlcClcbiIsCisJCXRva2VuLHRva2VuaW5mb2NsYXNzLHRva2VuaW5mbyx0b2tlbmluZm9sZW5ndGgscmV0bGVuCisJKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLypTQ19IQU5ETEUqLworRFdPUkQKK09wZW5TQ01hbmFnZXJBKExQQ1NUUiBtYWNoaW5lLExQQ1NUUiBkYm5hbWUsRFdPUkQgZGVzaXJlZGFjY2VzcykKK3sKKwlmcHJpbnRmKHN0ZGVyciwiT3BlblNDTWFuYWdlckEoJXMsJXMsJTA4bHgpXG4iLG1hY2hpbmUsZGJuYW1lLGRlc2lyZWRhY2Nlc3MpOworCXJldHVybiAwOworfQorCitEV09SRAorT3BlblNDTWFuYWdlclcoTFBDV1NUUiBtYWNoaW5lLExQQ1dTVFIgZGJuYW1lLERXT1JEIGRlc2lyZWRhY2Nlc3MpCit7CisJTFBTVFIJbWFjaGluZUEgPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLG1hY2hpbmUpOworCUxQU1RSCWRibmFtZUEgPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLGRibmFtZSk7CisJZnByaW50ZihzdGRlcnIsIk9wZW5TQ01hbmFnZXJXKCVzLCVzLCUwOGx4KVxuIixtYWNoaW5lQSxkYm5hbWVBLGRlc2lyZWRhY2Nlc3MpOworCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxtYWNoaW5lQSk7CisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGRibmFtZUEpOworCXJldHVybiAwOworfQorCitCT09MMzIKK0FsbG9jYXRlTG9jYWxseVVuaXF1ZUlkKExQTFVJRCBscGx1aWQpIHsKKwlscGx1aWQtPkxvd1BhcnQgPSB0aW1lKE5VTEwpOworCWxwbHVpZC0+SGlnaFBhcnQgPSAwOworCXJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvd2luMzIvY29uc29sZS5jIGIvd2luMzIvY29uc29sZS5jCmluZGV4IGQwYjI1YWUuLmU4ZTUwNmQgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvbnNvbGUuYworKysgYi93aW4zMi9jb25zb2xlLmMKQEAgLTIxNSwzICsyMTUsMjUgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwiRmx1c2hDb25zb2xlSW5wdXRCdWZmZXIoJWQpXG4iLGhDb25zb2xlSW5wdXQpOwogICAgIHJldHVybiBUUlVFOwogfQorCitCT09MMzIKK1NldENvbnNvbGVDdXJzb3JQb3NpdGlvbihIQU5ETEUzMiBoY29ucyxDT09SRCBjKSB7CisgICAgLyogeCBhcmUgY29sdW1ucywgeSByb3dzICovCisgICAgaWYgKCFjLnkpIHsKKyAgICAJZnByaW50ZihzdGRlcnIsIlxyIik7CisJaWYgKGMueCkKKwkJZnByaW50ZihzdGRlcnIsIhtbJWRDIixjLngpOworCXJldHVybiBUUlVFOworICAgIH0KKyAgICAvKiBoYW5kbGUgcmVzdCBvZiB0aGUgY2FzZXMgKi8KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBHZXROdW1iZXJPZkNvbnNvbGVJbnB1dEV2ZW50cyAgIChLRVJORUwzMi4yNDYpCisgKi8KK0JPT0wzMgorR2V0TnVtYmVyT2ZDb25zb2xlSW5wdXRFdmVudHMoSEFORExFMzIgaGNvbixMUERXT1JEIG5yb2ZldmVudHMpIHsKKwkqbnJvZmV2ZW50cyA9IDE7CisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS93aW5kb3dzL2NsaXBib2FyZC5jIGIvd2luZG93cy9jbGlwYm9hcmQuYwppbmRleCBkNGU5Mjc2Li5jZTI2MWMwIDEwMDY0NAotLS0gYS93aW5kb3dzL2NsaXBib2FyZC5jCisrKyBiL3dpbmRvd3MvY2xpcGJvYXJkLmMKQEAgLTExMiwzMCArMTEyLDMwIEBACiB7CiAgIExQQ0xJUEZPUk1BVCBscEZvcm1hdCA9IENsaXBGb3JtYXRzOwogCi0gIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiRGlzT3duOiBjbGlwYm9hcmQgb3duZXIgPSAlMDR4LCBzdyA9ICUwOHhcbiIsIAorICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIkRpc093bjogY2xpcGJvYXJkIG93bmVyID0gJTA0eCwgc2VsZWN0aW9uID0gJTA4eFxuIiwgCiAJCQkJaFduZENsaXBPd25lciwgKHVuc2lnbmVkKXNlbGVjdGlvbldpbmRvdyk7CiAKICAgaWYoIHBXbmQtPmh3bmRTZWxmID09IGhXbmRDbGlwT3duZXIpCiAgIHsKLSAgICBTZW5kTWVzc2FnZTE2KGhXbmRDbGlwT3duZXIsV01fUkVOREVSQUxMRk9STUFUUywwLDBMKTsKKyAgICAgIFNlbmRNZXNzYWdlMTYoaFduZENsaXBPd25lcixXTV9SRU5ERVJBTExGT1JNQVRTLDAsMEwpOwogCi0gICAgLyogY2hlY2sgaWYgYWxsIGZvcm1hdHMgd2VyZSByZW5kZXJlZCAqLworICAgICAgLyogY2hlY2sgaWYgYWxsIGZvcm1hdHMgd2VyZSByZW5kZXJlZCAqLwogCi0gICAgd2hpbGUobHBGb3JtYXQpCi0gICAgeyAKLSAgICAgICBpZiggbHBGb3JtYXQtPndEYXRhUHJlc2VudCAmJiAhbHBGb3JtYXQtPmhEYXRhICkKKyAgICAgIHdoaWxlKGxwRm9ybWF0KQorICAgICAgeyAKKyAgICAgICAgIGlmKCBscEZvcm1hdC0+d0RhdGFQcmVzZW50ICYmICFscEZvcm1hdC0+aERhdGEgKQogCSB7CiAJICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGRhdGEgbWlzc2luZyBmb3IgY2xpcGJvYXJkIGZvcm1hdCAlaVxuIiwgbHBGb3JtYXQtPndGb3JtYXRJRCk7IAogCSAgIGxwRm9ybWF0LT53RGF0YVByZXNlbnQgPSAwOwogCSB9Ci0gICAgICAgbHBGb3JtYXQgPSBscEZvcm1hdC0+TmV4dEZvcm1hdDsKLSAgICB9Ci0gICAgaFduZENsaXBPd25lciA9IDA7CisgICAgICAgICBscEZvcm1hdCA9IGxwRm9ybWF0LT5OZXh0Rm9ybWF0OworICAgICAgfQorICAgICAgaFduZENsaXBPd25lciA9IDA7CiAgIH0KIAogICAvKiBub3cgdHJ5IHRvIHNhbHZhZ2UgY3VycmVudCBzZWxlY3Rpb24gZnJvbSBiZWluZyBkZXN0cm95ZWQgYnkgWCAqLwogCi0gIENMSVBCT0FSRF9DaGVja1NlbGVjdGlvbihwV25kKTsKKyAgaWYoIHBXbmQtPndpbmRvdyApIENMSVBCT0FSRF9DaGVja1NlbGVjdGlvbihwV25kKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS93aW5kb3dzL2RlZnduZC5jIGIvd2luZG93cy9kZWZ3bmQuYwppbmRleCAxNjk0YTc5Li44NTAzNTlhIDEwMDY0NAotLS0gYS93aW5kb3dzL2RlZnduZC5jCisrKyBiL3dpbmRvd3MvZGVmd25kLmMKQEAgLTE3MSw3ICsxNzEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTV9NT1VTRUFDVElWQVRFLCB3UGFyYW0sIGxQYXJhbSApOwogCSAgICBpZiAocmV0KSByZXR1cm4gcmV0OwogCX0KLQlyZXR1cm4gTUFfQUNUSVZBVEU7CisKKwkvKiBDYXB0aW9uIGNsaWNrcyBhcmUgaGFuZGxlZCBieSB0aGUgTkNfSGFuZGxlTkNMQnV0dG9uRG93bigpICovIAorCXJldHVybiAoTE9XT1JEKGxQYXJhbSkgPT0gSFRDQVBUSU9OKSA/IE1BX05PQUNUSVZBVEUgOiBNQV9BQ1RJVkFURTsKIAogICAgIGNhc2UgV01fQUNUSVZBVEU6CiAJaWYgKExPV09SRCh3UGFyYW0pICE9IFdBX0lOQUNUSVZFKSBTZXRGb2N1czMyKCB3bmRQdHItPmh3bmRTZWxmICk7CkBAIC0xODIsMTkgKzE4NCw2IEBACiAJewogCSAgICBpZiAoIXduZFB0ci0+Y2xhc3MtPmhickJhY2tncm91bmQpIHJldHVybiAwOwogCi0JICAgIC8qIEZJWE1FOiBzaG91bGQgZmlsbCBpY29uIHRleHQgd2l0aCBoYnJ1c2hBY3RpdmVDYXB0aW9uIAotCQkgICAgICBpbnN0ZWFkIG9mIHRoaXMgKi8KLQotCSAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgKQotCSAgICB7Ci0JCSBpZiggd25kUHRyLT5mbGFncyAmIFdJTl9OQ0FDVElWQVRFRCApCi0JCSB7Ci0JCSAgIEZpbGxXaW5kb3coIEdldFBhcmVudDE2KHduZFB0ci0+aHduZFNlbGYpLCB3bmRQdHItPmh3bmRTZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIREMxNil3UGFyYW0sIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hBY3RpdmVDYXB0aW9uICk7Ci0JCSAgIHJldHVybiAxOwotCQkgfQotCSAgICB9Ci0KIAkgICAgaWYgKHduZFB0ci0+Y2xhc3MtPmhickJhY2tncm91bmQgPD0gKEhCUlVTSDE2KShDT0xPUl9NQVgrMSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgSEJSVVNIMzIgaGJydXNoID0gQ3JlYXRlU29saWRCcnVzaDMyKCAKQEAgLTM1NSw2ICszNDQsOSBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCisgICAgY2FzZSBXTV9JU0FDVElWRUlDT046CisJcmV0dXJuICgod25kUHRyLT5mbGFncyAmIFdJTl9OQ0FDVElWQVRFRCkgIT0gMCk7CisKICAgICBjYXNlIFdNX1FVRVJZT1BFTjoKICAgICBjYXNlIFdNX1FVRVJZRU5EU0VTU0lPTjoKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCmluZGV4IGY1OWNiZDkuLjQwMjQzMTAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGlhbG9nLmMKKysrIGIvd2luZG93cy9kaWFsb2cuYwpAQCAtNTAxLDcgKzUwMSw3IEBACiAgICAgICAgICAgLyogKHNlZSBDcmVhdGVGb250KCkgZG9jdW1lbnRhdGlvbiBpbiB0aGUgV2luZG93cyBTREspLiAgICovCiAJaEZvbnQgPSBDcmVhdGVGb250MTYoIC10ZW1wbGF0ZS5wb2ludFNpemUsIDAsIDAsIDAsIEZXX0RPTlRDQVJFLAogCQkJICAgIEZBTFNFLCBGQUxTRSwgRkFMU0UsIERFRkFVTFRfQ0hBUlNFVCwgMCwgMCwKLQkJCSAgICBERUZBVUxUX1FVQUxJVFksIEZGX0RPTlRDQVJFLAorCQkJICAgIFBST09GX1FVQUxJVFksIEZGX0RPTlRDQVJFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmZhY2VOYW1lICk7ICAvKiBGSVhNRTogd2luMzIgKi8KIAlpZiAoaEZvbnQpCiAJewpAQCAtOTA4LDcgKzkwOCw3IEBACiAgICAgZGxnQ29kZSA9IFNlbmRNZXNzYWdlMzJBKCBod25kLCBXTV9HRVRETEdDT0RFLCAwLCAwICk7CiAgICAgaWYgKGRsZ0NvZGUgJiBETEdDX1dBTlRNRVNTQUdFKQogICAgIHsKLSAgICAgICAgKmRpc3BhdGNoID0gVFJVRTsKKyAgICAgICAgKnRyYW5zbGF0ZSA9ICpkaXNwYXRjaCA9IFRSVUU7CiAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvd2luZG93cy9ldmVudC5jIGIvd2luZG93cy9ldmVudC5jCmluZGV4IGZhMDE5MDguLmMwM2M5OGMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZXZlbnQuYworKysgYi93aW5kb3dzL2V2ZW50LmMKQEAgLTgxMywxNiArODEzLDE2IEBACiAJfQogICAgIH0KIAotICAgIGlmKHJwcm9wPT1Ob25lKSAKKyAgICBpZihycHJvcCA9PSBOb25lKSAKICAgICAgICBkcHJpbnRmX2V2ZW50KHN0ZGRlYiwiUmVxdWVzdCBmb3IgJXMgaWdub3JlZFxuIiwgWEdldEF0b21OYW1lKGRpc3BsYXksZXZlbnQtPnRhcmdldCkpOwogCi0gICAgcmVzdWx0LnR5cGU9U2VsZWN0aW9uTm90aWZ5OwotICAgIHJlc3VsdC5kaXNwbGF5PWRpc3BsYXk7Ci0gICAgcmVzdWx0LnJlcXVlc3Rvcj1yZXF1ZXN0OwotICAgIHJlc3VsdC5zZWxlY3Rpb249ZXZlbnQtPnNlbGVjdGlvbjsKLSAgICByZXN1bHQucHJvcGVydHk9cnByb3A7Ci0gICAgcmVzdWx0LnRhcmdldD1ldmVudC0+dGFyZ2V0OwotICAgIHJlc3VsdC50aW1lPWV2ZW50LT50aW1lOworICAgIHJlc3VsdC50eXBlID0gU2VsZWN0aW9uTm90aWZ5OworICAgIHJlc3VsdC5kaXNwbGF5ID0gZGlzcGxheTsKKyAgICByZXN1bHQucmVxdWVzdG9yID0gcmVxdWVzdDsKKyAgICByZXN1bHQuc2VsZWN0aW9uID0gZXZlbnQtPnNlbGVjdGlvbjsKKyAgICByZXN1bHQucHJvcGVydHkgPSBycHJvcDsKKyAgICByZXN1bHQudGFyZ2V0ID0gZXZlbnQtPnRhcmdldDsKKyAgICByZXN1bHQudGltZSA9IGV2ZW50LT50aW1lOwogICAgIFhTZW5kRXZlbnQoZGlzcGxheSxldmVudC0+cmVxdWVzdG9yLEZhbHNlLE5vRXZlbnRNYXNrLChYRXZlbnQqKSZyZXN1bHQpOwogfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL21kaS5jIGIvd2luZG93cy9tZGkuYwppbmRleCBlMzAxY2JmLi41ODFkMDkxIDEwMDY0NAotLS0gYS93aW5kb3dzL21kaS5jCisrKyBiL3dpbmRvd3MvbWRpLmMKQEAgLTE3OSwxMCArMTc5LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLQkvKiB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gb3duZWQgcG9wdXBzICovCi0gICAgICAgIGlmICggIXBXbmQtPm93bmVyICYmCi0JICAgICAocFduZC0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpICYmCi0gICAgICAgICAgICAhKHBXbmQtPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkpICAvKiBmb3VuZCBvbmUgKi8KKyAgICAgICAgaWYgKCAhcFduZC0+b3duZXIgJiYgKHBXbmQtPmR3U3R5bGUgJiAKKwkJCSAgICAgKFdTX1ZJU0lCTEUgfCBXU19ESVNBQkxFRCkpID09IFdTX1ZJU0lCTEUgKQogICAgICAgICB7CiAgICAgICAgICAgICBwV25kTGFzdCA9IHBXbmQ7CiAgICAgICAgICAgICBpZiAoIXdUbykgYnJlYWs7CkBAIC02MDYsNjAgKzYwNCw2IEBACiAgICAgcmV0dXJuIDE7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCU1ESV9CdWlsZFdDTAotICoKLSAqICBpVG90YWwgcmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4gYXZhaWxhYmxlIGZvciB0aWxpbmcgb3IgY2FzY2FkaW5nCi0gKi8KLXN0YXRpYyBNRElXQ0wqIE1ESV9CdWlsZFdDTChXTkQqIGNsaWVudFduZCwgVUlOVDE2KiBpVG90YWwpCi17Ci0gICAgTURJV0NMICpsaXN0VG9wLCpsaXN0TmV4dDsKLSAgICBXTkQgICAgKmNoaWxkV25kOwotCi0gICAgaWYgKCEobGlzdFRvcCA9IChNRElXQ0wqKW1hbGxvYyggc2l6ZW9mKE1ESVdDTCkgKSkpIHJldHVybiBOVUxMOwotCi0gICAgbGlzdFRvcC0+aENoaWxkID0gY2xpZW50V25kLT5jaGlsZCA/IGNsaWVudFduZC0+Y2hpbGQtPmh3bmRTZWxmIDogMDsKLSAgICBsaXN0VG9wLT5wcmV2ICAgPSBOVUxMOwotICAgICppVG90YWwgCSAgICA9IDE7Ci0KLSAgICAvKiBidWlsZCBsaW5rZWQgbGlzdCBmcm9tIHRvcCBjaGlsZCB0byBib3R0b20gKi8KLQotICAgIGNoaWxkV25kICA9ICBXSU5fRmluZFduZFB0ciggbGlzdFRvcC0+aENoaWxkICk7Ci0gICAgd2hpbGUoIGNoaWxkV25kICYmIGNoaWxkV25kLT5uZXh0ICkKLSAgICB7Ci0JbGlzdE5leHQgPSAoTURJV0NMKil4bWFsbG9jKHNpemVvZihNRElXQ0wpKTsKLQkKLQkvKiBGSVhNRTogcGF5IGF0dGVudGlvbiB0byBNRElUSUxFX1NLSVBESVNBQkxFRCAKLQkgKiAgICAgICAgd2hlbiBXSU5fSVNXSU4zMiBpcyBzZXQuCi0JICovCi0JaWYoIChjaGlsZFduZC0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKSB8fAotCSAgICAoY2hpbGRXbmQtPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkgfHwKLQkgICAgIShjaGlsZFduZC0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpICAgKQotCXsKLQkgICAgbGlzdFRvcC0+aENoaWxkID0gMDsKLQkgICAgKCppVG90YWwpLS07Ci0JfQotCi0JbGlzdE5leHQtPmhDaGlsZCA9IGNoaWxkV25kLT5uZXh0LT5od25kU2VsZjsKLQlsaXN0TmV4dC0+cHJldiAgID0gbGlzdFRvcDsKLQlsaXN0VG9wICAgICAgICAgID0gbGlzdE5leHQ7Ci0JKCppVG90YWwpKys7Ci0KLQljaGlsZFduZCAgPSAgY2hpbGRXbmQtPm5leHQ7Ci0gICAgfQotCi0gICAgaWYoIChjaGlsZFduZC0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKSB8fAotCShjaGlsZFduZC0+ZHdTdHlsZSAmIFdTX01JTklNSVpFKSB8fAotCSEoY2hpbGRXbmQtPmR3U3R5bGUgJiBXU19WSVNJQkxFKSAgICkKLSAgICB7Ci0JbGlzdFRvcC0+aENoaWxkID0gMDsKLQkoKmlUb3RhbCktLTsKLSAgICB9Ci0gCi0gICAgcmV0dXJuIGxpc3RUb3A7Ci19Ci0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gTURJIGNsaWVudCB3aW5kb3cgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTY5NSwxNDIgKzYzOSwxMTUgQEAKICAqLwogc3RhdGljIExPTkcgTURJQ2FzY2FkZShXTkQqIGNsaWVudFduZCwgTURJQ0xJRU5USU5GTyAqY2kpCiB7Ci0JTURJV0NMCSpsaXN0VG9wLCpsaXN0UHJldjsKLQlJTlQxNglkZWx0YSA9IDAsIG4gPSAwOwotCVVJTlQxNglpVG9Qb3NpdGlvbiA9IDA7Ci0JUE9JTlQxNglwb3NbMl07CisgICAgV05EKioJcHBXbmQ7CisgICAgVUlOVDMyCXRvdGFsOwogICAKICAgICBpZiAoY2ktPmh3bmRDaGlsZE1heGltaXplZCkKICAgICAgICAgU2hvd1dpbmRvdzE2KCBjaS0+aHduZENoaWxkTWF4aW1pemVkLCBTV19OT1JNQUwpOwogCiAgICAgaWYgKGNpLT5uQWN0aXZlQ2hpbGRyZW4gPT0gMCkgcmV0dXJuIDA7CiAKLSAgICBpZiAoIShsaXN0VG9wID0gTURJX0J1aWxkV0NMKGNsaWVudFduZCwmaVRvUG9zaXRpb24pKSkgcmV0dXJuIDA7Ci0KLSAgICBpZiggaVRvUG9zaXRpb24gPCBjaS0+bkFjdGl2ZUNoaWxkcmVuICkgCi0gICAgICAgIGRlbHRhID0gMiAqIFNZU01FVFJJQ1NfQ1lJQ09OU1BBQ0lORyArIFNZU01FVFJJQ1NfQ1lJQ09OOwotCi0gICAgLyogd2FsayBsaXN0IGFuZCBtb3ZlIHdpbmRvd3MgKi8KLSAgICB3aGlsZSAoIGxpc3RUb3AgKQorICAgIGlmICgocHBXbmQgPSBXSU5fQnVpbGRXaW5BcnJheShjbGllbnRXbmQsIEJXQV9TS0lQSElEREVOIHwgQldBX1NLSVBPV05FRCB8IAorCQkJCQkgICAgICBCV0FfU0tJUElDT05JQywgJnRvdGFsKSkpCiAgICAgewotCWRwcmludGZfbWRpKHN0ZGRlYiwgIk1ESUNhc2NhZGU6IG1vdmUgJTA0eCB0byAoJWQsJWQpIHNpemUgWyVkLCVkXVxuIiwgCi0gICAgICAgICAgICAgICAgICAgIGxpc3RUb3AtPmhDaGlsZCwgcG9zWzBdLngsIHBvc1swXS55LCBwb3NbMV0ueCwgcG9zWzFdLnkpOworCVdORCoqCWhlYXBQdHIgPSBwcFduZDsKKwlpZiggdG90YWwgKQorCXsKKwkgICAgSU5UMTYJZGVsdGEgPSAwLCBuID0gMDsKKwkgICAgUE9JTlQxNglwb3NbMl07CisJICAgIGlmKCB0b3RhbCA8IGNpLT5uQWN0aXZlQ2hpbGRyZW4gKQorCQlkZWx0YSA9IFNZU01FVFJJQ1NfQ1lJQ09OU1BBQ0lORyArIFNZU01FVFJJQ1NfQ1lJQ09OOwogCi0JaWYoIGxpc3RUb3AtPmhDaGlsZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1ESV9DYWxjRGVmYXVsdENoaWxkUG9zKGNsaWVudFduZCwgbisrLCBwb3MsIGRlbHRhKTsKLSAgICAgICAgICAgIFNldFdpbmRvd1BvczMyKGxpc3RUb3AtPmhDaGlsZCwgMCwgcG9zWzBdLngsIHBvc1swXS55LCBwb3NbMV0ueCwgcG9zWzFdLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfRFJBV0ZSQU1FIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIpOwotICAgICAgICB9CisJICAgIC8qIHdhbGsgdGhlIGxpc3QgYW5kIG1vdmUgd2luZG93cyAqLworCSAgICB3aGlsZSAoICpwcFduZCApCisJICAgIHsKKwkJZHByaW50Zl9tZGkoc3RkZGViLCAiTURJQ2FzY2FkZTogbW92ZSAlMDR4IHRvICglZCwlZCkgc2l6ZSBbJWQsJWRdXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBwV25kKS0+aHduZFNlbGYsIHBvc1swXS54LCBwb3NbMF0ueSwgcG9zWzFdLngsIHBvc1sxXS55KTsKIAotCWxpc3RQcmV2ID0gbGlzdFRvcC0+cHJldjsKLQlmcmVlKGxpc3RUb3ApOwotCWxpc3RUb3AgPSBsaXN0UHJldjsKKwkJTURJX0NhbGNEZWZhdWx0Q2hpbGRQb3MoY2xpZW50V25kLCBuKyssIHBvcywgZGVsdGEpOworCQlTZXRXaW5kb3dQb3MzMigoKnBwV25kKS0+aHduZFNlbGYsIDAsIHBvc1swXS54LCBwb3NbMF0ueSwgcG9zWzFdLngsIHBvc1sxXS55LAorCQkJCQkgICAgICBTV1BfRFJBV0ZSQU1FIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIpOworCQlwcFduZCsrOworCSAgICB9CisJfQorCUhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBoZWFwUHRyICk7CiAgICAgfQogCi0gICAgaWYoIGlUb1Bvc2l0aW9uIDwgY2ktPm5BY3RpdmVDaGlsZHJlbiApCi0gICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzMzIoIGNsaWVudFduZC0+aHduZFNlbGYgKTsKLQorICAgIGlmKCB0b3RhbCA8IGNpLT5uQWN0aXZlQ2hpbGRyZW4gKSBBcnJhbmdlSWNvbmljV2luZG93czMyKCBjbGllbnRXbmQtPmh3bmRTZWxmICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJTURJVGlsZQotICoKICAqLwogc3RhdGljIExPTkcgTURJVGlsZShXTkQqIHduZENsaWVudCwgTURJQ0xJRU5USU5GTyAqY2ksV09SRCB3UGFyYW0pCiB7Ci0gICAgTURJV0NMICAgICAgICpsaXN0VG9wLCpsaXN0UHJldjsKLSAgICBSRUNUMTYgICAgICAgIHJlY3Q7Ci0gICAgaW50ICAgICAgICAgICB4c2l6ZSwgeXNpemU7Ci0gICAgaW50CQkgIHgsIHk7Ci0gICAgaW50CQkgIHJvd3MsIGNvbHVtbnM7Ci0gICAgaW50ICAgICAgICAgICByLCBjOwotICAgIGludCAgICAgICAgICAgaTsKLSAgICBVSU5UMTYJICBpVG9Qb3NpdGlvbiA9IDA7CisgICAgV05EKioJcHBXbmQ7CisgICAgVUlOVDMyCXRvdGFsID0gMDsKIAogICAgIGlmIChjaS0+aHduZENoaWxkTWF4aW1pemVkKQogCVNob3dXaW5kb3cxNihjaS0+aHduZENoaWxkTWF4aW1pemVkLCBTV19OT1JNQUwpOwogCiAgICAgaWYgKGNpLT5uQWN0aXZlQ2hpbGRyZW4gPT0gMCkgcmV0dXJuIDA7CiAKLSAgICBsaXN0VG9wID0gTURJX0J1aWxkV0NMKHduZENsaWVudCwgJmlUb1Bvc2l0aW9uKTsKKyAgICBwcFduZCA9IFdJTl9CdWlsZFdpbkFycmF5KHduZENsaWVudCwgQldBX1NLSVBISURERU4gfCBCV0FfU0tJUE9XTkVEIHwgQldBX1NLSVBJQ09OSUMgfAorCSAgICAoKHdQYXJhbSAmIE1ESVRJTEVfU0tJUERJU0FCTEVEKT8gQldBX1NLSVBESVNBQkxFRCA6IDApLCAmdG90YWwgKTsKIAotICAgIGRwcmludGZfbWRpKHN0ZGRlYiwiTURJVGlsZTogJWkgd2luZG93cyB0byB0aWxlXG4iLGlUb1Bvc2l0aW9uKTsKKyAgICBkcHJpbnRmX21kaShzdGRkZWIsIk1ESVRpbGU6ICV1IHdpbmRvd3MgdG8gdGlsZVxuIiwgdG90YWwpOwogCi0gICAgaWYoICFsaXN0VG9wICkgcmV0dXJuIDA7Ci0KLSAgICAvKiB0aWxlIGNoaWxkcmVuICovCi0gICAgaWYgKCBpVG9Qb3NpdGlvbiApCisgICAgaWYoIHBwV25kICkKICAgICB7Ci0gICAgICAgIHJlY3QgPSB3bmRDbGllbnQtPnJlY3RDbGllbnQ7Ci0gICAgCXJvd3MgICAgPSAoaW50KSBzcXJ0KChkb3VibGUpIGlUb1Bvc2l0aW9uKTsKLSAgICAJY29sdW1ucyA9IGlUb1Bvc2l0aW9uIC8gcm93czsKKwlXTkQqKgloZWFwUHRyID0gcHBXbmQ7CiAKLSAgICAgICAgaWYgKHdQYXJhbSA9PSBNRElUSUxFX0hPUklaT05UQUwpICAvKiB2ZXJzaW9uID49IDMuMSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpPXJvd3M7Ci0gICAgICAgICAgICByb3dzPWNvbHVtbnM7ICAvKiBleGNoYW5nZSByIGFuZCBjICovCi0gICAgICAgICAgICBjb2x1bW5zPWk7Ci0gICAgICAgIH0KKwlpZiggdG90YWwgKQorCXsKKwkgICAgUkVDVDE2CXJlY3Q7CisJICAgIGludAkJeCwgeSwgeHNpemUsIHlzaXplOworCSAgICBpbnQJCXJvd3MsIGNvbHVtbnMsIHIsIGMsIGk7CiAKLSAgICAJLyogaGFjayAqLwotICAgIAlpZiggaVRvUG9zaXRpb24gIT0gY2ktPm5BY3RpdmVDaGlsZHJlbikKLSAgICAgICAgewotICAgICAgICAgICAgeSA9IHJlY3QuYm90dG9tIC0gMiAqIFNZU01FVFJJQ1NfQ1lJQ09OU1BBQ0lORyAtIFNZU01FVFJJQ1NfQ1lJQ09OOwotICAgICAgICAgICAgcmVjdC5ib3R0b20gPSAoIHkgLSBTWVNNRVRSSUNTX0NZSUNPTiA8IHJlY3QudG9wICk/IHJlY3QuYm90dG9tOiB5OwotICAgICAgICB9CisJICAgIHJlY3QgICAgPSB3bmRDbGllbnQtPnJlY3RDbGllbnQ7CisJICAgIHJvd3MgICAgPSAoaW50KSBzcXJ0KChkb3VibGUpdG90YWwpOworCSAgICBjb2x1bW5zID0gdG90YWwgLyByb3dzOwogCi0gICAgCXlzaXplICAgPSByZWN0LmJvdHRvbSAvIHJvd3M7Ci0gICAgCXhzaXplICAgPSByZWN0LnJpZ2h0ICAvIGNvbHVtbnM7CisJICAgIGlmKCB3UGFyYW0gJiBNRElUSUxFX0hPUklaT05UQUwgKSAgLyogdmVyc2lvbiA+PSAzLjEgKi8KKwkgICAgeworCSAgICAgICAgaSA9IHJvd3M7CisJICAgICAgICByb3dzID0gY29sdW1uczsgIC8qIGV4Y2hhbmdlIHIgYW5kIGMgKi8KKwkgICAgICAgIGNvbHVtbnMgPSBpOworCSAgICB9CisKKwkgICAgaWYoIHRvdGFsICE9IGNpLT5uQWN0aXZlQ2hpbGRyZW4pCisJICAgIHsKKwkgICAgICAgIHkgPSByZWN0LmJvdHRvbSAtIDIgKiBTWVNNRVRSSUNTX0NZSUNPTlNQQUNJTkcgLSBTWVNNRVRSSUNTX0NZSUNPTjsKKwkgICAgICAgIHJlY3QuYm90dG9tID0gKCB5IC0gU1lTTUVUUklDU19DWUlDT04gPCByZWN0LnRvcCApPyByZWN0LmJvdHRvbTogeTsKKwkgICAgfQorCisJICAgIHlzaXplICAgPSByZWN0LmJvdHRvbSAvIHJvd3M7CisJICAgIHhzaXplICAgPSByZWN0LnJpZ2h0ICAvIGNvbHVtbnM7CiAgICAgCi0gICAgCXggICAgICAgPSAwOwotICAgIAlpICAgICAgID0gMDsKKwkgICAgZm9yICh4ID0gaSA9IDAsIGMgPSAxOyBjIDw9IGNvbHVtbnMgJiYgKnBwV25kOyBjKyspCisJICAgIHsKKwkgICAgICAgIGlmIChjID09IGNvbHVtbnMpCisJCXsKKwkJICAgIHJvd3MgID0gdG90YWwgLSBpOworCQkgICAgeXNpemUgPSByZWN0LmJvdHRvbSAvIHJvd3M7CisJCX0KIAotICAgIAlmb3IgKGMgPSAxOyBjIDw9IGNvbHVtbnM7IGMrKykKLSAgICAJewotICAgICAgICAgICAgaWYgKGMgPT0gY29sdW1ucykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByb3dzICA9IGlUb1Bvc2l0aW9uIC0gaTsKLSAgICAgICAgICAgICAgICB5c2l6ZSA9IHJlY3QuYm90dG9tIC8gcm93czsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeSA9IDA7Ci0gICAgICAgICAgICBmb3IgKHIgPSAxOyByIDw9IHJvd3M7IHIrKywgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHNob3VsZG4ndCBoYXBwZW4gYnV0Li4uICovCi0gICAgICAgICAgICAgICAgaWYoICFsaXN0VG9wICkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyogc2tpcCBpY29uaXplZCBjaGlsZHMgZnJvbSB0aWxpbmcgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAoIWxpc3RUb3AtPmhDaGlsZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgCSAgICAgICAgICAgIGxpc3RQcmV2ID0gbGlzdFRvcC0+cHJldjsKLSAgICAJICAgICAgICAgICAgZnJlZShsaXN0VG9wKTsKLSAgICAJICAgICAgICAgICAgbGlzdFRvcCA9IGxpc3RQcmV2OwotICAgIAkgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU2V0V2luZG93UG9zMzIobGlzdFRvcC0+aENoaWxkLCAwLCB4LCB5LCB4c2l6ZSwgeXNpemUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXUF9EUkFXRlJBTUUgfCBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUik7Ci0gICAgICAgICAgICAgICAgeSArPSB5c2l6ZTsKLSAgICAJICAgICAgICBsaXN0UHJldiA9IGxpc3RUb3AtPnByZXY7Ci0gICAgCSAgICAgICAgZnJlZShsaXN0VG9wKTsKLSAgICAJICAgICAgICBsaXN0VG9wID0gbGlzdFByZXY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4ICs9IHhzaXplOwotICAgIAl9CisJCXkgPSAwOworCQlmb3IgKHIgPSAxOyByIDw9IHJvd3MgJiYgKnBwV25kOyByKyssIGkrKykKKwkJeworCQkgICAgU2V0V2luZG93UG9zMzIoKCpwcFduZCktPmh3bmRTZWxmLCAwLCB4LCB5LCB4c2l6ZSwgeXNpemUsIAorCQkJCSAgIFNXUF9EUkFXRlJBTUUgfCBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUik7CisgICAgICAgICAgICAgICAgICAgIHkgKz0geXNpemU7CisJCSAgICBwcFduZCsrOworCQl9CisJCXggKz0geHNpemU7CisJICAgIH0KKwl9CisJSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGhlYXBQdHIgKTsKICAgICB9CiAgIAotICAgIC8qIGZyZWUgdGhlIHJlc3QgaWYgYW55ICovCi0gICAgd2hpbGUoIGxpc3RUb3AgKQotICAgIHsKLSAgICAgICAgbGlzdFByZXYgPSBsaXN0VG9wLT5wcmV2OwotICAgICAgICBmcmVlKGxpc3RUb3ApOwotICAgICAgICBsaXN0VG9wID0gbGlzdFByZXY7Ci0gICAgfQotICAgIAotICAgIGlmIChpVG9Qb3NpdGlvbiA8IGNpLT5uQWN0aXZlQ2hpbGRyZW4gKQotICAgICAgICBBcnJhbmdlSWNvbmljV2luZG93czMyKCB3bmRDbGllbnQtPmh3bmRTZWxmICk7Ci0KKyAgICBpZiggdG90YWwgPCBjaS0+bkFjdGl2ZUNoaWxkcmVuICkgQXJyYW5nZUljb25pY1dpbmRvd3MzMiggd25kQ2xpZW50LT5od25kU2VsZiApOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xNjA3LDkgKzE1MjQsNiBAQAogQk9PTDE2IFRyYW5zbGF0ZU1ESVN5c0FjY2VsMTYoIEhXTkQxNiBod25kQ2xpZW50LCBMUE1TRzE2IG1zZyApCiB7CiAgICAgV05EKiBjbGllbnRXbmQgPSBXSU5fRmluZFduZFB0ciggaHduZENsaWVudCk7Ci0gICAgV05EKiB3bmQ7Ci0gICAgTURJQ0xJRU5USU5GTyAgICAgKmNpICAgICA9IE5VTEw7Ci0gICAgV1BBUkFNMTYJICAgICAgIHdQYXJhbSA9IDA7CiAKICAgICBpZiggY2xpZW50V25kICYmIChtc2ctPm1lc3NhZ2UgPT0gV01fS0VZRE9XTiB8fCBtc2ctPm1lc3NhZ2UgPT0gV01fU1lTS0VZRE9XTikpCiAgICAgewpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZXNzYWdlLmMgYi93aW5kb3dzL21lc3NhZ2UuYwppbmRleCA4MGMzZTVjLi41YjcwZWUyIDEwMDY0NAotLS0gYS93aW5kb3dzL21lc3NhZ2UuYworKysgYi93aW5kb3dzL21lc3NhZ2UuYwpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKICAgICBpZiAoaHduZCA9PSBIV05EX0JST0FEQ0FTVCkKICAgICB7CiAgICAgICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiU2VuZE1lc3NhZ2UgLy8gSFdORF9CUk9BRENBU1QgIVxuIik7Ci0gICAgICAgIGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggV0lOX0dldERlc2t0b3AoKSApOworICAgICAgICBsaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoIFdJTl9HZXREZXNrdG9wKCksIDAsIE5VTEwgKTsKICAgICAgICAgZm9yIChwcFduZCA9IGxpc3Q7ICpwcFduZDsgcHBXbmQrKykKICAgICAgICAgewogICAgICAgICAgICAgd25kUHRyID0gKnBwV25kOwpAQCAtMTA5OSw3ICsxMDk5LDcgQEAKIAogICAgIGlmIChod25kID09IEhXTkRfQlJPQURDQVNUKQogICAgIHsKLSAgICAgICAgbGlzdCA9IFdJTl9CdWlsZFdpbkFycmF5KCBXSU5fR2V0RGVza3RvcCgpICk7CisgICAgICAgIGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggV0lOX0dldERlc2t0b3AoKSwgMCwgTlVMTCApOwogICAgICAgICBmb3IgKHBwV25kID0gbGlzdDsgKnBwV25kOyBwcFduZCsrKQogICAgICAgICB7CiAgICAgICAgICAgICB3bmRQdHIgPSAqcHBXbmQ7CkBAIC0xMTQ4LDcgKzExNDgsNyBAQAogCiAgICAgaWYgKGh3bmQgPT0gSFdORF9CUk9BRENBU1QpCiAgICAgewotICAgICAgICBsaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoIFdJTl9HZXREZXNrdG9wKCkgKTsKKyAgICAgICAgbGlzdCA9IFdJTl9CdWlsZFdpbkFycmF5KCBXSU5fR2V0RGVza3RvcCgpLCAwLCBOVUxMICk7CiAgICAgICAgIGZvciAocHBXbmQgPSBsaXN0OyAqcHBXbmQ7IHBwV25kKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIHduZFB0ciA9ICpwcFduZDsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvbm9uY2xpZW50LmMgYi93aW5kb3dzL25vbmNsaWVudC5jCmluZGV4IDA4ZmY5OGIuLjUyMzdhNTIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvbm9uY2xpZW50LmMKKysrIGIvd2luZG93cy9ub25jbGllbnQuYwpAQCAtMTUwLDg2ICsxNTAsNiBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIE5DX0dldE1pbk1heEluZm8KLSAqCi0gKiBHZXQgdGhlIG1pbmltaXplZCBhbmQgbWF4aW1pemVkIGluZm9ybWF0aW9uIGZvciBhIHdpbmRvdy4KLSAqLwotdm9pZCBOQ19HZXRNaW5NYXhJbmZvKCBXTkQgKnduZFB0ciwgUE9JTlQxNiAqbWF4U2l6ZSwgUE9JTlQxNiAqbWF4UG9zLAotICAgICAgICAgICAgICAgICAgICAgICBQT0lOVDE2ICptaW5UcmFjaywgUE9JTlQxNiAqbWF4VHJhY2sgKQotewotICAgIE1JTk1BWElORk8xNiAqTWluTWF4OwotICAgIHNob3J0IHhpbmMsIHlpbmM7Ci0KLSAgICBpZiAoIShNaW5NYXggPSBTRUdQVFJfTkVXKE1JTk1BWElORk8xNikpKSByZXR1cm47Ci0KLSAgICAgIC8qIENvbXB1dGUgZGVmYXVsdCB2YWx1ZXMgKi8KLQotICAgIE1pbk1heC0+cHRNYXhTaXplLnggPSBTWVNNRVRSSUNTX0NYU0NSRUVOOwotICAgIE1pbk1heC0+cHRNYXhTaXplLnkgPSBTWVNNRVRSSUNTX0NZU0NSRUVOOwotICAgIE1pbk1heC0+cHRNaW5UcmFja1NpemUueCA9IFNZU01FVFJJQ1NfQ1hNSU5UUkFDSzsKLSAgICBNaW5NYXgtPnB0TWluVHJhY2tTaXplLnkgPSBTWVNNRVRSSUNTX0NZTUlOVFJBQ0s7Ci0gICAgTWluTWF4LT5wdE1heFRyYWNrU2l6ZS54ID0gU1lTTUVUUklDU19DWFNDUkVFTjsKLSAgICBNaW5NYXgtPnB0TWF4VHJhY2tTaXplLnkgPSBTWVNNRVRSSUNTX0NZU0NSRUVOOwotCi0gICAgaWYgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTUFOQUdFRCkgeGluYyA9IHlpbmMgPSAwOwotICAgIGVsc2UgaWYgKEhBU19ETEdGUkFNRSggd25kUHRyLT5kd1N0eWxlLCB3bmRQdHItPmR3RXhTdHlsZSApKQotICAgIHsKLSAgICAgICAgeGluYyA9IFNZU01FVFJJQ1NfQ1hETEdGUkFNRTsKLSAgICAgICAgeWluYyA9IFNZU01FVFJJQ1NfQ1lETEdGUkFNRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeGluYyA9IHlpbmMgPSAwOwotCWlmIChIQVNfVEhJQ0tGUkFNRSh3bmRQdHItPmR3U3R5bGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICB4aW5jICs9IFNZU01FVFJJQ1NfQ1hGUkFNRTsKLSAgICAgICAgICAgIHlpbmMgKz0gU1lTTUVUUklDU19DWUZSQU1FOwotICAgICAgICB9Ci0JaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0JPUkRFUikKLSAgICAgICAgewotICAgICAgICAgICAgeGluYyArPSBTWVNNRVRSSUNTX0NYQk9SREVSOwotICAgICAgICAgICAgeWluYyArPSBTWVNNRVRSSUNTX0NZQk9SREVSOwotICAgICAgICB9Ci0gICAgfQotICAgIE1pbk1heC0+cHRNYXhTaXplLnggKz0gMiAqIHhpbmM7Ci0gICAgTWluTWF4LT5wdE1heFNpemUueSArPSAyICogeWluYzsKLQotICAgIC8qIE5vdGU6IFRoZSAnKycgaW4gdGhlIGZvbGxvd2luZyB0ZXN0IHNob3VsZCByZWFsbHkgYmUgYSB8fCwgYnV0Ci0gICAgICogdGhhdCB3b3VsZCBjYXVzZSBnY2MtMi43LjAgdG8gZ2VuZXJhdGUgaW5jb3JyZWN0IGNvZGUuCi0gICAgICovCi0gICAgaWYgKCh3bmRQdHItPnB0TWF4UG9zLnggIT0gLTEpICsgKHduZFB0ci0+cHRNYXhQb3MueSAhPSAtMSkpCi0gICAgICAgIE1pbk1heC0+cHRNYXhQb3NpdGlvbiA9IHduZFB0ci0+cHRNYXhQb3M7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTWluTWF4LT5wdE1heFBvc2l0aW9uLnggPSAteGluYzsKLSAgICAgICAgTWluTWF4LT5wdE1heFBvc2l0aW9uLnkgPSAteWluYzsKLSAgICB9Ci0KLSAgICBTZW5kTWVzc2FnZTE2KCB3bmRQdHItPmh3bmRTZWxmLCBXTV9HRVRNSU5NQVhJTkZPLCAwLAotICAgICAgICAgICAgICAgICAgIChMUEFSQU0pU0VHUFRSX0dFVChNaW5NYXgpICk7Ci0KLSAgICAgIC8qIFNvbWUgc2FuaXR5IGNoZWNrcyAqLwotCi0gICAgZHByaW50Zl9ub25jbGllbnQoc3RkZGViLCAKLQkJICAgICAgIk5DX0dldE1pbk1heEluZm86ICVkICVkIC8gJWQgJWQgLyAlZCAlZCAvICVkICVkXG4iLAotCQkgICAgICBNaW5NYXgtPnB0TWF4U2l6ZS54LCBNaW5NYXgtPnB0TWF4U2l6ZS55LAotICAgICAgICAgICAgICAgICAgICAgIE1pbk1heC0+cHRNYXhQb3NpdGlvbi54LCBNaW5NYXgtPnB0TWF4UG9zaXRpb24ueSwKLQkJICAgICAgTWluTWF4LT5wdE1heFRyYWNrU2l6ZS54LCBNaW5NYXgtPnB0TWF4VHJhY2tTaXplLnksCi0JCSAgICAgIE1pbk1heC0+cHRNaW5UcmFja1NpemUueCwgTWluTWF4LT5wdE1pblRyYWNrU2l6ZS55KTsKLSAgICBNaW5NYXgtPnB0TWF4VHJhY2tTaXplLnggPSBNQVgoIE1pbk1heC0+cHRNYXhUcmFja1NpemUueCwKLQkJCQkgICBNaW5NYXgtPnB0TWluVHJhY2tTaXplLnggKTsKLSAgICBNaW5NYXgtPnB0TWF4VHJhY2tTaXplLnkgPSBNQVgoIE1pbk1heC0+cHRNYXhUcmFja1NpemUueSwKLQkJCQkgICBNaW5NYXgtPnB0TWluVHJhY2tTaXplLnkgKTsKLSAgICAKLSAgICBpZiAobWF4U2l6ZSkgKm1heFNpemUgPSBNaW5NYXgtPnB0TWF4U2l6ZTsKLSAgICBpZiAobWF4UG9zKSAqbWF4UG9zID0gTWluTWF4LT5wdE1heFBvc2l0aW9uOwotICAgIGlmIChtaW5UcmFjaykgKm1pblRyYWNrID0gTWluTWF4LT5wdE1pblRyYWNrU2l6ZTsKLSAgICBpZiAobWF4VHJhY2spICptYXhUcmFjayA9IE1pbk1heC0+cHRNYXhUcmFja1NpemU7Ci0gICAgU0VHUFRSX0ZSRUUoTWluTWF4KTsKLX0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBOQ19IYW5kbGVOQ0NhbGNTaXplCiAgKgpAQCAtNjY0LDE1ICs1ODQsMTQgQEAKICAqCiAgKiBQYWludCB0aGUgbm9uLWNsaWVudCBhcmVhLiBjbGlwIGlzIGN1cnJlbnRseSB1bnVzZWQuCiAgKi8KLXZvaWQgTkNfRG9OQ1BhaW50KCBIV05EMzIgaHduZCwgSFJHTjMyIGNsaXAsIEJPT0wzMiBzdXBwcmVzc19tZW51cGFpbnQgKQordm9pZCBOQ19Eb05DUGFpbnQoIFdORCogd25kUHRyLCBIUkdOMzIgY2xpcCwgQk9PTDMyIHN1cHByZXNzX21lbnVwYWludCApCiB7CiAgICAgSERDMzIgaGRjOwogICAgIFJFQ1QzMiByZWN0OwogICAgIEJPT0wzMiBhY3RpdmU7CisgICAgSFdORDMyIGh3bmQgPSB3bmRQdHItPmh3bmRTZWxmOwogCi0gICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotCi0gICAgaWYgKCF3bmRQdHIgfHwgd25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgfHwKKyAgICBpZiAoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFIHx8CiAJIVdJTl9Jc1dpbmRvd0RyYXdhYmxlKCB3bmRQdHIsIDAgKSkgcmV0dXJuOyAvKiBOb3RoaW5nIHRvIGRvICovCiAKICAgICBhY3RpdmUgID0gd25kUHRyLT5mbGFncyAmIFdJTl9OQ0FDVElWQVRFRDsKQEAgLTc1Nyw3ICs2NzYsMTUgQEAKICAqLwogTE9ORyBOQ19IYW5kbGVOQ1BhaW50KCBIV05EMzIgaHduZCAsIEhSR04zMiBjbGlwKQogewotICAgIE5DX0RvTkNQYWludCggaHduZCwgY2xpcCwgRkFMU0UgKTsKKyAgICBXTkQqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisKKyAgICBpZiggd25kUHRyICYmIHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUgKQorICAgIHsKKwlpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgKQorCSAgICBXSU5QT1NfUmVkcmF3SWNvblRpdGxlKCBod25kICk7CisJZWxzZSAKKwkgICAgTkNfRG9OQ1BhaW50KCB3bmRQdHIsIGNsaXAsIEZBTFNFICk7CisgICAgfQogICAgIHJldHVybiAwOwogfQogCkBAIC03NzYsMTMgKzcwMywxMyBAQAogCiAgICAgaWYoIHdTdGF0ZUNoYW5nZSApCiAgICAgewotICAgICAgaWYgKHdQYXJhbSkgd25kUHRyLT5mbGFncyB8PSBXSU5fTkNBQ1RJVkFURUQ7Ci0gICAgICBlbHNlIHduZFB0ci0+ZmxhZ3MgJj0gfldJTl9OQ0FDVElWQVRFRDsKKwlpZiAod1BhcmFtKSB3bmRQdHItPmZsYWdzIHw9IFdJTl9OQ0FDVElWQVRFRDsKKwllbHNlIHduZFB0ci0+ZmxhZ3MgJj0gfldJTl9OQ0FDVElWQVRFRDsKIAotICAgICAgaWYoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFICkKLQlQQUlOVF9SZWRyYXdXaW5kb3coIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIDAsIFJEV19JTlZBTElEQVRFIHwgUkRXX0VSQVNFIHwgUkRXX0VSQVNFTk9XLCAwICk7Ci0gICAgICBlbHNlCi0JTkNfRG9OQ1BhaW50KCB3bmRQdHItPmh3bmRTZWxmLCAoSFJHTjMyKTEsIEZBTFNFICk7CisJaWYoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFICkgCisJICAgIFdJTlBPU19SZWRyYXdJY29uVGl0bGUoIHduZFB0ci0+aHduZFNlbGYgKTsKKwllbHNlCisJICAgIE5DX0RvTkNQYWludCggd25kUHRyLCAoSFJHTjMyKTEsIEZBTFNFICk7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwogfQpAQCAtODY4LDYgKzc5NSw3IEBACiAgKiAgICAgICAgICAgTkNfVHJhY2tTeXNNZW51CiAgKgogICogVHJhY2sgYSBtb3VzZSBidXR0b24gcHJlc3Mgb24gdGhlIHN5c3RlbSBtZW51LgorICogVE9ETzogVW5pZnkgd2l0aCBOQ19UcmFja01pbk1heEJveCgpIChhbmQgd2l0aG91dCBJbnRlcm5hbEdldE1lc3NhZ2UoKSBjYWxscykuCiAgKi8KIHN0YXRpYyB2b2lkIE5DX1RyYWNrU3lzTWVudSggSFdORDMyIGh3bmQsIFBPSU5UMTYgcHQgKQogewpAQCAtMTA1Myw3ICs5ODEsNyBAQAogCiAgICAgICAvKiBHZXQgbWluL21heCBpbmZvICovCiAKLSAgICBOQ19HZXRNaW5NYXhJbmZvKCB3bmRQdHIsIE5VTEwsIE5VTEwsICZtaW5UcmFjaywgJm1heFRyYWNrICk7CisgICAgV0lOUE9TX0dldE1pbk1heEluZm8oIHduZFB0ciwgTlVMTCwgTlVMTCwgJm1pblRyYWNrLCAmbWF4VHJhY2sgKTsKICAgICBzaXppbmdSZWN0ID0gd25kUHRyLT5yZWN0V2luZG93OwogICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkKIAlHZXRDbGllbnRSZWN0MTYoIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgJm1vdXNlUmVjdCApOwpAQCAtMTA5NiwxNSArMTAyNCwxNyBAQAogCiAgICAgaWYoIGljb25pYyApCiAgICAgewotICAgICAgSElDT04xNiBoSWNvbiA9ICh3bmRQdHItPmNsYXNzLT5oSWNvbikKKwlISUNPTjE2IGhJY29uID0gKHduZFB0ci0+Y2xhc3MtPmhJY29uKQogICAgICAgICAgICAgICAgICAgICAgID8gd25kUHRyLT5jbGFzcy0+aEljb24KICAgICAgICAgICAgICAgICAgICAgICA6IChISUNPTjE2KVNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX1FVRVJZRFJBR0lDT04sIDAsIDBMKTsKLSAgICAgIGlmKCBoSWNvbiApCi0gICAgICB7Ci0gICAgICAgIGhEcmFnQ3Vyc29yID0gIENVUlNPUklDT05fSWNvblRvQ3Vyc29yKCBoSWNvbiwgVFJVRSApOwotICAgICAgICBoT2xkQ3Vyc29yID0gU2V0Q3Vyc29yMzIoaERyYWdDdXJzb3IpOwotICAgICAgICBTaG93Q3Vyc29yMzIoIFRSVUUgKTsKLSAgICAgIH0gZWxzZSBpY29uaWMgPSBGQUxTRTsKKwlpZiggaEljb24gKQorCXsKKwkgICAgaERyYWdDdXJzb3IgPSAgQ1VSU09SSUNPTl9JY29uVG9DdXJzb3IoIGhJY29uLCBUUlVFICk7CisJICAgIGhPbGRDdXJzb3IgPSBTZXRDdXJzb3IzMihoRHJhZ0N1cnNvcik7CisJICAgIFNob3dDdXJzb3IzMiggVFJVRSApOworCX0gCisJZWxzZSBpY29uaWMgPSBGQUxTRTsKKwlXSU5QT1NfU2hvd0ljb25UaXRsZSggd25kUHRyLCBGQUxTRSApOwogICAgIH0KIAogICAgIGlmKCAhaWNvbmljICkgTkNfRHJhd01vdmluZ0ZyYW1lKCBoZGMsICZzaXppbmdSZWN0LCB0aGlja2ZyYW1lICk7CkBAIC0xMTU4LDggKzEwODgsOCBAQAogCQllbHNlIGlmIChPTl9CT1RUT01fQk9SREVSKGhpdHRlc3QpKSBuZXdSZWN0LmJvdHRvbSArPSBkeTsKIAkJaWYoICFpY29uaWMgKQogCQl7Ci0JCSAgTkNfRHJhd01vdmluZ0ZyYW1lKCBoZGMsICZzaXppbmdSZWN0LCB0aGlja2ZyYW1lICk7Ci0JCSAgTkNfRHJhd01vdmluZ0ZyYW1lKCBoZGMsICZuZXdSZWN0LCB0aGlja2ZyYW1lICk7CisJCSAgICBOQ19EcmF3TW92aW5nRnJhbWUoIGhkYywgJnNpemluZ1JlY3QsIHRoaWNrZnJhbWUgKTsKKwkJICAgIE5DX0RyYXdNb3ZpbmdGcmFtZSggaGRjLCAmbmV3UmVjdCwgdGhpY2tmcmFtZSApOwogCQl9CiAJCWNhcHR1cmVQb2ludCA9IHB0OwogCQlzaXppbmdSZWN0ID0gbmV3UmVjdDsKQEAgLTExNzAsMTIgKzExMDAsMTIgQEAKICAgICBSZWxlYXNlQ2FwdHVyZSgpOwogICAgIGlmKCBpY29uaWMgKQogICAgIHsKLSAgICAgIFNob3dDdXJzb3IzMiggRkFMU0UgKTsKLSAgICAgIFNldEN1cnNvcjMyKGhPbGRDdXJzb3IpOwotICAgICAgaWYoIGhEcmFnQ3Vyc29yICkgRGVzdHJveUN1cnNvcjMyKCBoRHJhZ0N1cnNvciApOworCVNob3dDdXJzb3IzMiggRkFMU0UgKTsKKwlTZXRDdXJzb3IzMihoT2xkQ3Vyc29yKTsKKwlpZiggaERyYWdDdXJzb3IgKSBEZXN0cm95Q3Vyc29yMzIoIGhEcmFnQ3Vyc29yICk7CiAgICAgfQogICAgIGVsc2UKLSAgICAgIE5DX0RyYXdNb3ZpbmdGcmFtZSggaGRjLCAmc2l6aW5nUmVjdCwgdGhpY2tmcmFtZSApOworCU5DX0RyYXdNb3ZpbmdGcmFtZSggaGRjLCAmc2l6aW5nUmVjdCwgdGhpY2tmcmFtZSApOwogCiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQogICAgICAgICBSZWxlYXNlREMzMiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCBoZGMgKTsKQEAgLTEyMDQsMjIgKzExMzQsMjEgQEAKIAogICAgIC8qIFNpbmdsZSBjbGljayBicmluZ3MgdXAgdGhlIHN5c3RlbSBtZW51IHdoZW4gaWNvbml6ZWQgKi8KIAotICAgIGlmICghbW92ZWQgJiYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFKSkKKyAgICBpZiggbW92ZWQgKQogICAgIHsKLSAgICAgICAgTkNfVHJhY2tTeXNNZW51KCBod25kLCBwdCApOwotICAgICAgICByZXR1cm47Ci0gICAgfQorCWlmICgobXNnLm1lc3NhZ2UgPT0gV01fS0VZRE9XTikgJiYgKG1zZy53UGFyYW0gPT0gVktfRVNDQVBFKSkgcmV0dXJuOwogCi0gICAgICAvKiBJZiBFc2Mga2V5LCBkb24ndCBtb3ZlIHRoZSB3aW5kb3cgKi8KLSAgICBpZiAoKG1zZy5tZXNzYWdlID09IFdNX0tFWURPV04pICYmIChtc2cud1BhcmFtID09IFZLX0VTQ0FQRSkpIHJldHVybjsKLQotICAgIGlmIChoaXR0ZXN0ICE9IEhUQ0FQVElPTikKKwkvKiBOT1RFOiBTV1BfTk9BQ1RJVkFURSBwcmV2ZW50cyBkb2N1bWVudCB3aW5kb3cgYWN0aXZhdGlvbiBpbiBXb3JkIDYgKi8KIAlTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgc2l6aW5nUmVjdC5sZWZ0LCBzaXppbmdSZWN0LnRvcCwKLQkJICAgICAgICBzaXppbmdSZWN0LnJpZ2h0IC0gc2l6aW5nUmVjdC5sZWZ0LAotCQkgICAgICAgIHNpemluZ1JlY3QuYm90dG9tIC0gc2l6aW5nUmVjdC50b3AsCi0JCSAgICAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIgKTsKLSAgICBlbHNlIFNldFdpbmRvd1BvczMyKCBod25kLCAwLCBzaXppbmdSZWN0LmxlZnQsIHNpemluZ1JlY3QudG9wLCAwLCAwLAotCQkgICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1NJWkUgfCBTV1BfTk9aT1JERVIgKTsKKwkJCXNpemluZ1JlY3QucmlnaHQgLSBzaXppbmdSZWN0LmxlZnQsCisJCQlzaXppbmdSZWN0LmJvdHRvbSAtIHNpemluZ1JlY3QudG9wLAorCQkgICAgICAoIGhpdHRlc3QgPT0gSFRDQVBUSU9OICkgPyBTV1BfTk9TSVpFIDogMCApOworICAgIH0KKyAgICBpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgKQorICAgIHsKKwlXSU5QT1NfU2hvd0ljb25UaXRsZSggd25kUHRyLCBUUlVFICk7CisJaWYoICFtb3ZlZCApIE5DX1RyYWNrU3lzTWVudSggaHduZCwgcHQgKTsKKyAgICB9CiB9CiAKIApAQCAtMTMzMiw3ICsxMjYxLDEwIEBACiAgICAgc3dpdGNoKHdQYXJhbSkgIC8qIEhpdCB0ZXN0ICovCiAgICAgewogICAgIGNhc2UgSFRDQVBUSU9OOgotCVNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX01PVkUgKyBIVENBUFRJT04sIGxQYXJhbSApOworCisJaWYoIFdJTlBPU19TZXRBY3RpdmVXaW5kb3coV0lOX0dldFRvcFBhcmVudChod25kKSwgVFJVRSwgVFJVRSkKKwkgICAgfHwgKEdldEFjdGl2ZVdpbmRvdzMyKCkgPT0gV0lOX0dldFRvcFBhcmVudChod25kKSkgKQorCQlTZW5kTWVzc2FnZTE2KCBod25kLCBXTV9TWVNDT01NQU5ELCBTQ19NT1ZFICsgSFRDQVBUSU9OLCBsUGFyYW0gKTsKIAlicmVhazsKIAogICAgIGNhc2UgSFRTWVNNRU5VOgpkaWZmIC0tZ2l0IGEvd2luZG93cy9wYWludGluZy5jIGIvd2luZG93cy9wYWludGluZy5jCmluZGV4IDExOTZiOGYuLjQ4ZjBkNTEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcGFpbnRpbmcuYworKysgYi93aW5kb3dzL3BhaW50aW5nLmMKQEAgLTIsNiArMiwxMCBAQAogICogV2luZG93IHBhaW50aW5nIGZ1bmN0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1IEFsZXhhbmRyZSBKdWxsaWFyZAorICoKKyAqIEZJWE1FOiBEbyBub3QgcmVwYWludCBmdWxsIG5vbmNsaWVudCBhcmVhIGFsbCB0aGUgdGltZS4gSW5zdGVhZCwgY29tcHV0ZSAKKyAqCSAgaW50ZXJzZWN0aW9uIHdpdGggaHJnblVwZGF0ZSAod2hpY2ggc2hvdWxkIGJlIG1vdmVkIGZyb20gY2xpZW50IHRvIAorICoJICB3aW5kb3cgY29vcmRzIGFzIHdlbGwsIGxvb2t1cCAndGhlIHBhaW4nIGNvbW1lbnQgaW4gdGhlIHdpbnBvcy5jKS4KICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTI0NCw2ICsyNDgsOCBAQAogICogd1BhcmFtICAgICAgICAgPSBmbGFncwogICogTE9XT1JEKGxQYXJhbSkgPSBocmduQ2xpcAogICogSElXT1JEKGxQYXJhbSkgPSBod25kU2tpcCAgKG5vdCB1c2VkOyBhbHdheXMgTlVMTCkKKyAqCisgKiBBbGwgaW4gYWxsLCBhIHByaW1lIGNhbmRpZGF0ZSBmb3IgYSByZXdyaXRlLgogICovCiBCT09MMzIgUEFJTlRfUmVkcmF3V2luZG93KCBIV05EMzIgaHduZCwgY29uc3QgUkVDVDMyICpyZWN0VXBkYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJHTjMyIGhyZ25VcGRhdGUsIFVJTlQzMiBmbGFncywgVUlOVDMyIGNvbnRyb2wgKQpAQCAtNDA5LDM5ICs0MTUsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9Ci0gICAgICAgICAgIGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggd25kUHRyICk7Ci0gICAgICAgICAgIGZvciAocHBXbmQgPSBsaXN0OyAqcHBXbmQ7IHBwV25kKyspCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHduZFB0ciA9ICpwcFduZDsKLSAgICAgICAgICAgICAgIGlmICghSXNXaW5kb3czMih3bmRQdHItPmh3bmRTZWxmKSkgY29udGludWU7Ci0gICAgICAgICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfVklTSUJMRSkKLQkgICAgICAgewotICAgICAgICAgICAgICAgICAgIFNldFJlY3RSZ24zMiggaHJnbiwgd25kUHRyLT5yZWN0V2luZG93LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHItPnJlY3RXaW5kb3cudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5yZWN0V2luZG93LnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5yZWN0V2luZG93LmJvdHRvbSApOwotICAgICAgICAgICAgICAgICAgIGlmICghQ29tYmluZVJnbjMyKCBocmduLCBocmduLCBocmduVXBkYXRlLCBSR05fQU5EICkpCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgIE9mZnNldFJnbjMyKCBocmduLCAtd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13bmRQdHItPnJlY3RDbGllbnQudG9wICk7Ci0gICAgICAgICAgICAgICAgICAgUEFJTlRfUmVkcmF3V2luZG93KCB3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCBocmduLCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19DX1VTRUhSR04gKTsKLSAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYoIChsaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoIHduZFB0ciwgMCwgTlVMTCApKSApCisJICAgeworCQlmb3IgKHBwV25kID0gbGlzdDsgKnBwV25kOyBwcFduZCsrKQorCQl7CisJCSAgICB3bmRQdHIgPSAqcHBXbmQ7CisJCSAgICBpZiAoIUlzV2luZG93MzIod25kUHRyLT5od25kU2VsZikpIGNvbnRpbnVlOworCQkgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpCisJCSAgICB7CisJCQlTZXRSZWN0UmduMzIoIGhyZ24sIAorCQkJCXduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0LCB3bmRQdHItPnJlY3RXaW5kb3cudG9wLCAKKwkJCQl3bmRQdHItPnJlY3RXaW5kb3cucmlnaHQsIHduZFB0ci0+cmVjdFdpbmRvdy5ib3R0b20gKTsKKwkJCWlmIChDb21iaW5lUmduMzIoIGhyZ24sIGhyZ24sIGhyZ25VcGRhdGUsIFJHTl9BTkQgKSkKKwkJCXsKKwkJCSAgICBPZmZzZXRSZ24zMiggaHJnbiwgLXduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13bmRQdHItPnJlY3RDbGllbnQudG9wICk7CisJCQkgICAgUEFJTlRfUmVkcmF3V2luZG93KCB3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCBocmduLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRXX0NfVVNFSFJHTiApOworCQkJfQorCQkgICAgfQorCQl9CisJCUhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBsaXN0ICk7CiAJICAgfQotCSAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBsaXN0ICk7CiAJICAgRGVsZXRlT2JqZWN0MzIoIGhyZ24gKTsKIAkgICBpZiAoY29udHJvbCAmIFJEV19DX0RFTEVURUhSR04pIERlbGV0ZU9iamVjdDMyKCBocmduVXBkYXRlICk7CiAJfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgbGlzdCA9IFdJTl9CdWlsZFdpbkFycmF5KCB3bmRQdHIgKTsKLSAgICAgICAgICAgZm9yIChwcFduZCA9IGxpc3Q7ICpwcFduZDsgcHBXbmQrKykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgd25kUHRyID0gKnBwV25kOwotICAgICAgICAgICAgICAgaWYgKElzV2luZG93MzIoIHduZFB0ci0+aHduZFNlbGYgKSkKLSAgICAgICAgICAgICAgICAgICBQQUlOVF9SZWRyYXdXaW5kb3coIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIDAsIGZsYWdzLCAwICk7Ci0JICAgfQotCSAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBsaXN0ICk7CisJICAgIGlmKCAobGlzdCA9IFdJTl9CdWlsZFdpbkFycmF5KCB3bmRQdHIsIDAsIE5VTEwgKSkgKQorCSAgICB7CisJCWZvciAocHBXbmQgPSBsaXN0OyAqcHBXbmQ7IHBwV25kKyspCisJCXsKKwkJICAgIHduZFB0ciA9ICpwcFduZDsKKwkJICAgIGlmIChJc1dpbmRvdzMyKCB3bmRQdHItPmh3bmRTZWxmICkpCisJCQlQQUlOVF9SZWRyYXdXaW5kb3coIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIDAsIGZsYWdzLCAwICk7CisJCX0KKwkgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBsaXN0ICk7CisJICAgIH0KIAl9CiAKICAgICB9CmRpZmYgLS1naXQgYS93aW5kb3dzL3VzZXIuYyBiL3dpbmRvd3MvdXNlci5jCmluZGV4IDIzMTc2MWEuLjcyY2Q5YjAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvdXNlci5jCisrKyBiL3dpbmRvd3MvdXNlci5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgIm1lc3NhZ2UuaCIKKyNpbmNsdWRlICJzaGVsbC5oIgogCiBXT1JEIFVTRVJfSGVhcFNlbCA9IDA7CiAKQEAgLTE3OCw3ICsxNzksNyBAQAogICAgICAgICAKICAgICAvKiBXZSBoYXZlIHRvIGJ1aWxkIGEgbGlzdCBvZiBhbGwgd2luZG93cyBmaXJzdCwgYXMgaW4gRW51bVdpbmRvd3MgKi8KIAotICAgIGlmICghKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggV0lOX0dldERlc2t0b3AoKSApKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggV0lOX0dldERlc2t0b3AoKSwgMCwgTlVMTCApKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgLyogU2VuZCBhIFdNX1FVRVJZRU5EU0VTU0lPTiBtZXNzYWdlIHRvIGV2ZXJ5IHdpbmRvdyAqLwogCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCBmMDkzYWYxLi4wODdmOTQyIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTQzLDExICs0MywxMyBAQAogc3RhdGljIFdPUkQgd0RyYWdXaWR0aCA9IDQ7CiBzdGF0aWMgV09SRCB3RHJhZ0hlaWdodD0gMzsKIAorZXh0ZXJuIEJPT0wzMiBJQ09OVElUTEVfSW5pdCh2b2lkKTsKIGV4dGVybiBCT09MMzIgTUVOVV9QYXRjaFJlc2lkZW50UG9wdXAoIEhRVUVVRTE2LCBXTkQqICk7CiBleHRlcm4gSENVUlNPUjE2IENVUlNPUklDT05fSWNvblRvQ3Vyc29yKEhJQ09OMTYsIEJPT0wzMik7CiBleHRlcm4gSFdORDMyIENBUkVUX0dldEh3bmQodm9pZCk7CitleHRlcm4gQk9PTDMyIFdJTlBPU19DcmVhdGVJbnRlcm5hbFBvc0F0b20odm9pZCk7CitleHRlcm4gdm9pZCAgIFdJTlBPU19DaGVja0ludGVybmFsUG9zKEhXTkQzMik7CiBleHRlcm4gQk9PTDMyIFdJTlBPU19BY3RpdmF0ZU90aGVyV2luZG93KFdORCogcFduZCk7Ci1leHRlcm4gdm9pZCAgIFdJTlBPU19DaGVja0FjdGl2ZShIV05EMzIpOwogZXh0ZXJuIEJPT0wzMiBFVkVOVF9DaGVja0ZvY3VzKHZvaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk3LDcgKzk5LDcgQEAKICAgICAgICAgICAgICAibmV4dD0lcCAgY2hpbGQ9JXAgIHBhcmVudD0lcCAgb3duZXI9JXAgIGNsYXNzPSVwICclcydcbiIKICAgICAgICAgICAgICAiaW5zdD0lMDR4ICB0YXNrUT0lMDR4ICB1cGRSZ249JTA0eCAgYWN0aXZlPSUwNHggZGNlPSVwICBpZG1lbnU9JTA0eFxuIgogICAgICAgICAgICAgICJzdHlsZT0lMDhseCAgZXhzdHlsZT0lMDhseCAgd25kcHJvYz0lMDh4ICB0ZXh0PSclcydcbiIKLSAgICAgICAgICAgICAiY2xpZW50PSVkLCVkLSVkLCVkICB3aW5kb3c9JWQsJWQtJWQsJWQgIGljb25wb3M9JWQsJWQgIG1heHBvcz0lZCwlZFxuIgorICAgICAgICAgICAgICJjbGllbnQ9JWQsJWQtJWQsJWQgIHdpbmRvdz0lZCwlZC0lZCwlZCIKICAgICAgICAgICAgICAic3lzbWVudT0lMDR4ICBmbGFncz0lMDR4ICBwcm9wcz0lcCAgdnNjcm9sbD0lcCAgaHNjcm9sbD0lcFxuIiwKICAgICAgICAgICAgICBwdHItPm5leHQsIHB0ci0+Y2hpbGQsIHB0ci0+cGFyZW50LCBwdHItPm93bmVyLAogICAgICAgICAgICAgIHB0ci0+Y2xhc3MsIGNsYXNzTmFtZSwgcHRyLT5oSW5zdGFuY2UsIHB0ci0+aG1lbVRhc2tRLApAQCAtMTA2LDggKzEwOCw3IEBACiAgICAgICAgICAgICAgcHRyLT50ZXh0ID8gcHRyLT50ZXh0IDogIiIsCiAgICAgICAgICAgICAgcHRyLT5yZWN0Q2xpZW50LmxlZnQsIHB0ci0+cmVjdENsaWVudC50b3AsIHB0ci0+cmVjdENsaWVudC5yaWdodCwKICAgICAgICAgICAgICBwdHItPnJlY3RDbGllbnQuYm90dG9tLCBwdHItPnJlY3RXaW5kb3cubGVmdCwgcHRyLT5yZWN0V2luZG93LnRvcCwKLSAgICAgICAgICAgICBwdHItPnJlY3RXaW5kb3cucmlnaHQsIHB0ci0+cmVjdFdpbmRvdy5ib3R0b20sIHB0ci0+cHRJY29uUG9zLngsCi0gICAgICAgICAgICAgcHRyLT5wdEljb25Qb3MueSwgcHRyLT5wdE1heFBvcy54LCBwdHItPnB0TWF4UG9zLnksIHB0ci0+aFN5c01lbnUsCisgICAgICAgICAgICAgcHRyLT5yZWN0V2luZG93LnJpZ2h0LCBwdHItPnJlY3RXaW5kb3cuYm90dG9tLCBwdHItPmhTeXNNZW51LAogICAgICAgICAgICAgIHB0ci0+ZmxhZ3MsIHB0ci0+cFByb3AsIHB0ci0+cFZTY3JvbGwsIHB0ci0+cEhTY3JvbGwgKTsKIAogICAgIGlmIChwdHItPmNsYXNzLT5jYlduZEV4dHJhKQpAQCAtMzI5LDcgKzMzMCw3IEBACiAKICAgICAvKiBGSVhNRTogZG8gd2UgbmVlZCB0byBmYWtlIFFTX01PVVNFTU9WRSB3YWtlYml0PyAqLwogCi0gICAgV0lOUE9TX0NoZWNrQWN0aXZlKCBod25kICk7CisgICAgV0lOUE9TX0NoZWNrSW50ZXJuYWxQb3MoIGh3bmQgKTsKICAgICBpZiggaHduZCA9PSBHZXRDYXB0dXJlMzIoKSkgUmVsZWFzZUNhcHR1cmUoKTsKIAogICAgIC8qIGZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2luZG93ICovCkBAIC00MDQsNyArNDA1LDkgQEAKIAogICAgIGRwcmludGZfd2luKHN0ZGRlYiwiQ3JlYXRpbmcgZGVza3RvcCB3aW5kb3dcbiIpOwogCi0gICAgaWYgKCEoY2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIERFU0tUT1BfQ0xBU1NfQVRPTSwgMCApKSkKKyAgICBpZiAoIUlDT05USVRMRV9Jbml0KCkgfHwKKwkhV0lOUE9TX0NyZWF0ZUludGVybmFsUG9zQXRvbSgpIHx8CisJIShjbGFzcyA9IENMQVNTX0ZpbmRDbGFzc0J5QXRvbSggREVTS1RPUF9DTEFTU19BVE9NLCAwICkpKQogCXJldHVybiBGQUxTRTsKIAogICAgIGh3bmREZXNrdG9wID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoV05EKStjbGFzcy0+Y2JXbmRFeHRyYSApOwpAQCAtNDI0LDExICs0MjcsNiBAQAogICAgIHBXbmREZXNrdG9wLT5yZWN0V2luZG93LnJpZ2h0ICA9IFNZU01FVFJJQ1NfQ1hTQ1JFRU47CiAgICAgcFduZERlc2t0b3AtPnJlY3RXaW5kb3cuYm90dG9tID0gU1lTTUVUUklDU19DWVNDUkVFTjsKICAgICBwV25kRGVza3RvcC0+cmVjdENsaWVudCAgICAgICAgPSBwV25kRGVza3RvcC0+cmVjdFdpbmRvdzsKLSAgICBwV25kRGVza3RvcC0+cmVjdE5vcm1hbCAgICAgICAgPSBwV25kRGVza3RvcC0+cmVjdFdpbmRvdzsKLSAgICBwV25kRGVza3RvcC0+cHRJY29uUG9zLnggICAgICAgPSAtMTsKLSAgICBwV25kRGVza3RvcC0+cHRJY29uUG9zLnkgICAgICAgPSAtMTsKLSAgICBwV25kRGVza3RvcC0+cHRNYXhQb3MueCAgICAgICAgPSAtMTsKLSAgICBwV25kRGVza3RvcC0+cHRNYXhQb3MueSAgICAgICAgPSAtMTsKICAgICBwV25kRGVza3RvcC0+dGV4dCAgICAgICAgICAgICAgPSBOVUxMOwogICAgIHBXbmREZXNrdG9wLT5obWVtVGFza1EgICAgICAgICA9IDA7IC8qIERlc2t0b3AgZG9lcyBub3QgYmVsb25nIHRvIGEgdGFzayAqLwogICAgIHBXbmREZXNrdG9wLT5ocmduVXBkYXRlICAgICAgICA9IDA7CkBAIC01NTUsMTAgKzU1Myw2IEBACiAgICAgd25kUHRyLT5kd01hZ2ljICAgICAgICA9IFdORF9NQUdJQzsKICAgICB3bmRQdHItPmh3bmRTZWxmICAgICAgID0gaHduZDsKICAgICB3bmRQdHItPmhJbnN0YW5jZSAgICAgID0gY3MtPmhJbnN0YW5jZTsKLSAgICB3bmRQdHItPnB0SWNvblBvcy54ICAgID0gLTE7Ci0gICAgd25kUHRyLT5wdEljb25Qb3MueSAgICA9IC0xOwotICAgIHduZFB0ci0+cHRNYXhQb3MueCAgICAgPSAtMTsKLSAgICB3bmRQdHItPnB0TWF4UG9zLnkgICAgID0gLTE7CiAgICAgd25kUHRyLT50ZXh0ICAgICAgICAgICA9IE5VTEw7CiAgICAgd25kUHRyLT5obWVtVGFza1EgICAgICA9IEdldFRhc2tRdWV1ZSgwKTsKICAgICB3bmRQdHItPmhyZ25VcGRhdGUgICAgID0gMDsKQEAgLTYyMSw3ICs2MTUsNyBAQAogCiAgICAgaWYgKChjcy0+c3R5bGUgJiBXU19USElDS0ZSQU1FKSB8fCAhKGNzLT5zdHlsZSAmIChXU19QT1BVUCB8IFdTX0NISUxEKSkpCiAgICAgewotICAgICAgICBOQ19HZXRNaW5NYXhJbmZvKCB3bmRQdHIsICZtYXhTaXplLCAmbWF4UG9zLCAmbWluVHJhY2ssICZtYXhUcmFjayApOworICAgICAgICBXSU5QT1NfR2V0TWluTWF4SW5mbyggd25kUHRyLCAmbWF4U2l6ZSwgJm1heFBvcywgJm1pblRyYWNrLCAmbWF4VHJhY2sgKTsKICAgICAgICAgaWYgKG1heFNpemUueCA8IGNzLT5jeCkgY3MtPmN4ID0gbWF4U2l6ZS54OwogICAgICAgICBpZiAobWF4U2l6ZS55IDwgY3MtPmN5KSBjcy0+Y3kgPSBtYXhTaXplLnk7CiAgICAgICAgIGlmIChjcy0+Y3ggPCBtaW5UcmFjay54ICkgY3MtPmN4ID0gbWluVHJhY2sueDsKQEAgLTYzNSw3ICs2MjksNiBAQAogICAgIHduZFB0ci0+cmVjdFdpbmRvdy5yaWdodCAgPSBjcy0+eCArIGNzLT5jeDsKICAgICB3bmRQdHItPnJlY3RXaW5kb3cuYm90dG9tID0gY3MtPnkgKyBjcy0+Y3k7CiAgICAgd25kUHRyLT5yZWN0Q2xpZW50ICAgICAgICA9IHduZFB0ci0+cmVjdFdpbmRvdzsKLSAgICB3bmRQdHItPnJlY3ROb3JtYWwgICAgICAgID0gd25kUHRyLT5yZWN0V2luZG93OwogCiAgICAgLyogQ3JlYXRlIHRoZSBYIHdpbmRvdyAob25seSBmb3IgdG9wLWxldmVsIHdpbmRvd3MsIGFuZCB0aGVuIG9ubHkgKi8KICAgICAvKiB3aGVuIHRoZXJlJ3Mgbm8gZGVza3RvcCB3aW5kb3cpICovCkBAIC03NTMsMjAgKzc0NiwxOCBAQAogCiAgICAgICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTWluTWF4aW1pemUoaHduZCwgU1dfU0hPV01JTk5PQUNUSVZFLCAxKSBpbiAiSW50ZXJuYWxzIiAqLwotCi0gICAgICAgICAgICAgICAgd25kUHRyLT5kd1N0eWxlICY9IH5XU19NQVhJTUlaRTsKLSAgICAgICAgICAgICAgICBXSU5QT1NfRmluZEljb25Qb3MoIGh3bmQgKTsKLSAgICAgICAgICAgICAgICBTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgd25kUHRyLT5wdEljb25Qb3MueCwgd25kUHRyLT5wdEljb25Qb3MueSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNZU01FVFJJQ1NfQ1hJQ09OLCBTWVNNRVRSSUNTX0NZSUNPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNXUF9GUkFNRUNIQU5HRUQgfCAoKEdldEFjdGl2ZVdpbmRvdzMyKCkpPyBTV1BfTk9BQ1RJVkFURSA6IDApICApOworCQlSRUNUMTYgbmV3UG9zOworICAgICAgICAgICAgICAgIHduZFB0ci0+ZHdTdHlsZSAmPSB+KFdTX01BWElNSVpFIHwgV1NfTUlOSU1JWkUpOworCQlXSU5QT1NfTWluTWF4aW1pemUoIHduZFB0ciwgU1dfTUlOSU1JWkUsICZuZXdQb3MgKTsKKyAgICAgICAgICAgICAgICBTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgbmV3UG9zLmxlZnQsIG5ld1Bvcy50b3AsIG5ld1Bvcy5yaWdodCwgbmV3UG9zLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX0ZSQU1FQ0hBTkdFRCB8ICgoR2V0QWN0aXZlV2luZG93MzIoKSk/IFNXUF9OT0FDVElWQVRFIDogMCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUFYSU1JWkUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTWluTWF4aW1pemUoaHduZCwgU1dfU0hPV01BWElNSVpFRCwgMSkgKi8KLQotICAgICAgICAgICAgICAgIE5DX0dldE1pbk1heEluZm8oIHduZFB0ciwgJm1heFNpemUsICZtYXhQb3MsICZtaW5UcmFjaywgJm1heFRyYWNrICk7Ci0gICAgICAgICAgICAgICAgU2V0V2luZG93UG9zMzIoIGh3bmQsIDAsIG1heFBvcy54LCBtYXhQb3MueSwgbWF4U2l6ZS54LCBtYXhTaXplLnksCisJCVJFQ1QxNiBuZXdQb3M7CisJCXduZFB0ci0+ZHdTdHlsZSAmPSB+KFdTX01BWElNSVpFIHwgV1NfTUlOSU1JWkUpOworCQlXSU5QT1NfTWluTWF4aW1pemUoIHduZFB0ciwgU1dfTUFYSU1JWkUsICZuZXdQb3MgKTsKKyAgICAgICAgICAgICAgICBTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgbmV3UG9zLmxlZnQsIG5ld1Bvcy50b3AsIG5ld1Bvcy5yaWdodCwgbmV3UG9zLmJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgKChHZXRBY3RpdmVXaW5kb3czMigpKT8gU1dQX05PQUNUSVZBVEUgOiAwKSB8IFNXUF9GUkFNRUNIQU5HRUQgKTsKICAgICAgICAgICAgIH0KIApAQCAtMTM4MCw3ICsxMzcxLDcgQEAKICAgICB7CiAgICAgICAgIGlmIChvZmZzZXQgKyBzaXplb2YoV09SRCkgPiB3bmRQdHItPmNsYXNzLT5jYlduZEV4dHJhKQogICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZXRXaW5kb3dXb3JkOiBpbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJHZXRXaW5kb3dXb3JkOiBpbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gKihXT1JEICopKCgoY2hhciAqKXduZFB0ci0+d0V4dHJhKSArIG9mZnNldCk7CkBAIC0xODIzLDkgKzE4MTQsOSBAQAogICoKICAqIGh3bmQgaXMgZHJhd2FibGUgd2hlbiBpdCBpcyB2aXNpYmxlLCBhbGwgcGFyZW50cyBhcmUgbm90CiAgKiBtaW5pbWl6ZWQsIGFuZCBpdCBpcyBpdHNlbGYgbm90IG1pbmltaXplZCB1bmxlc3Mgd2UgYXJlCi0gKiB0cnlpbmcgdG8gZHJhdyBpY29uIGFuZCB0aGUgZGVmYXVsdCBjbGFzcyBpY29uIGlzIHNldC4KKyAqIHRyeWluZyB0byBkcmF3IGl0cyBkZWZhdWx0IGNsYXNzIGljb24uCiAgKi8KLUJPT0wzMiBXSU5fSXNXaW5kb3dEcmF3YWJsZSggV05EKiB3bmQgLCBCT09MMzIgaWNvbiApCitCT09MMzIgV0lOX0lzV2luZG93RHJhd2FibGUoIFdORCogd25kLCBCT09MMzIgaWNvbiApCiB7CiAgIGlmKCAod25kLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgJiYKICAgICAgICBpY29uICYmIHduZC0+Y2xhc3MtPmhJY29uKSB8fApAQCAtMTk2NywyOCArMTk1OCw1MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXSU5fQnVpbGRXaW5BcnJheQogICoKLSAqIEJ1aWxkIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGFsbCBjaGlsZHJlbiBvZiBhIGdpdmVuIHdpbmRvdy4KLSAqIFRoZSBhcnJheSBtdXN0IGJlIGZyZWVkIHdpdGggSGVhcEZyZWUoU3lzdGVtSGVhcCkuCisgKiBCdWlsZCBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgY2hpbGRyZW4gb2YgYSBnaXZlbiB3aW5kb3cuCisgKiBUaGUgYXJyYXkgbXVzdCBiZSBmcmVlZCB3aXRoIEhlYXBGcmVlKFN5c3RlbUhlYXApLiBSZXR1cm4gTlVMTAorICogd2hlbiBubyB3aW5kb3dzIGFyZSBmb3VuZC4KICAqLwotV05EICoqV0lOX0J1aWxkV2luQXJyYXkoIFdORCAqd25kUHRyICkKK1dORCAqKldJTl9CdWlsZFdpbkFycmF5KCBXTkQgKnduZFB0ciwgVUlOVDMyIGJ3YUZsYWdzLCBVSU5UMzIqIHBUb3RhbCApCiB7CiAgICAgV05EICoqbGlzdCwgKipwcFduZDsKICAgICBXTkQgKnBXbmQ7Ci0gICAgSU5UMzIgY291bnQ7CisgICAgVUlOVDMyIGNvdW50LCBza2lwT3duZWQsIHNraXBIaWRkZW47CisgICAgRFdPUkQgc2tpcEZsYWdzOworCisgICAgc2tpcEhpZGRlbiA9IGJ3YUZsYWdzICYgQldBX1NLSVBISURERU47CisgICAgc2tpcE93bmVkID0gYndhRmxhZ3MgJiBCV0FfU0tJUE9XTkVEOworICAgIHNraXBGbGFncyA9IChid2FGbGFncyAmIEJXQV9TS0lQRElTQUJMRUQpID8gV1NfRElTQUJMRUQgOiAwOworICAgIGlmKCBid2FGbGFncyAmIEJXQV9TS0lQSUNPTklDICkgc2tpcEZsYWdzIHw9IFdTX01JTklNSVpFOwogCiAgICAgLyogRmlyc3QgY291bnQgdGhlIHdpbmRvd3MgKi8KIAogICAgIGlmICghd25kUHRyKSB3bmRQdHIgPSBwV25kRGVza3RvcDsKLSAgICBmb3IgKHBXbmQgPSB3bmRQdHItPmNoaWxkLCBjb3VudCA9IDA7IHBXbmQ7IHBXbmQgPSBwV25kLT5uZXh0KSBjb3VudCsrOwotICAgIGNvdW50Kys7ICAvKiBGb3IgdGhlIHRlcm1pbmF0aW5nIE5VTEwgKi8KKyAgICBmb3IgKHBXbmQgPSB3bmRQdHItPmNoaWxkLCBjb3VudCA9IDA7IHBXbmQ7IHBXbmQgPSBwV25kLT5uZXh0KSAKKyAgICB7CisJaWYoIChwV25kLT5kd1N0eWxlICYgc2tpcEZsYWdzKSB8fCAoc2tpcE93bmVkICYmIHBXbmQtPm93bmVyKSApIGNvbnRpbnVlOworCWlmKCAhc2tpcEhpZGRlbiB8fCBwV25kLT5kd1N0eWxlICYgV1NfVklTSUJMRSApIGNvdW50Kys7CisgICAgfQogCi0gICAgLyogTm93IGJ1aWxkIHRoZSBsaXN0IG9mIGFsbCB3aW5kb3dzICovCisgICAgaWYoIGNvdW50ICkKKyAgICB7CisJLyogTm93IGJ1aWxkIHRoZSBsaXN0IG9mIGFsbCB3aW5kb3dzICovCiAKLSAgICBpZiAoIShsaXN0ID0gKFdORCAqKilIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihXTkQgKikgKiBjb3VudCApKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZm9yIChwV25kID0gd25kUHRyLT5jaGlsZCwgcHBXbmQgPSBsaXN0OyBwV25kOyBwV25kID0gcFduZC0+bmV4dCkKLSAgICAgICAgKnBwV25kKysgPSBwV25kOwotICAgICpwcFduZCA9IE5VTEw7CisJaWYgKChsaXN0ID0gKFdORCAqKilIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihXTkQgKikgKiAoY291bnQgKyAxKSkpKQorCXsKKwkgICAgZm9yIChwV25kID0gd25kUHRyLT5jaGlsZCwgcHBXbmQgPSBsaXN0LCBjb3VudCA9IDA7IHBXbmQ7IHBXbmQgPSBwV25kLT5uZXh0KQorCSAgICB7CisJCWlmKCAocFduZC0+ZHdTdHlsZSAmIHNraXBGbGFncykgfHwgKHNraXBPd25lZCAmJiBwV25kLT5vd25lcikgKSBjb250aW51ZTsKKwkJaWYoICFza2lwSGlkZGVuIHx8IHBXbmQtPmR3U3R5bGUgJiBXU19WSVNJQkxFICkKKwkJeworCQkgICAqcHBXbmQrKyA9IHBXbmQ7CisJCSAgICBjb3VudCsrOworCQl9CisJICAgIH0KKwkgICAqcHBXbmQgPSBOVUxMOworCX0KKwllbHNlIGNvdW50ID0gMDsKKyAgICB9IGVsc2UgbGlzdCA9IE5VTEw7CisKKyAgICBpZiggcFRvdGFsICkgKnBUb3RhbCA9IGNvdW50OwogICAgIHJldHVybiBsaXN0OwogfQogCkBAIC0yMDA0LDcgKzIwMTksNyBAQAogICAgIC8qIHVucGxlYXNhbnQgc2lkZS1lZmZlY3RzLCBmb3IgaW5zdGFuY2UgaWYgdGhlIGNhbGxiYWNrICAqLwogICAgIC8qIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIFotb3JkZXIgb2YgdGhlIHdpbmRvd3MuICAgICAgICAgICAqLwogCi0gICAgaWYgKCEobGlzdCA9IFdJTl9CdWlsZFdpbkFycmF5KCBwV25kRGVza3RvcCApKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggcFduZERlc2t0b3AsIDAsIE5VTEwgKSkpIHJldHVybiBGQUxTRTsKIAogICAgIC8qIE5vdyBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZXZlcnkgd2luZG93ICovCiAKQEAgLTIwMzksNyArMjA1NCw3IEBACiAgICAgLyogVGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBFbnVtV2luZG93cygpLCAgICAqLwogICAgIC8qIGV4Y2VwdCBmb3IgYW4gYWRkZWQgY2hlY2sgb24gdGhlIHdpbmRvdyBxdWV1ZS4gKi8KIAotICAgIGlmICghKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggcFduZERlc2t0b3AgKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIShsaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoIHBXbmREZXNrdG9wLCAwLCBOVUxMICkpKSByZXR1cm4gRkFMU0U7CiAKICAgICAvKiBOb3cgY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGV2ZXJ5IHdpbmRvdyAqLwogCkBAIC0yMDc3LDE3ICsyMDkyLDE3IEBACiAgICAgV05EICoqY2hpbGRMaXN0OwogICAgIEJPT0wxNiByZXQgPSBGQUxTRTsKIAotICAgIHdoaWxlICgqcHBXbmQpCisgICAgZm9yICggOyAqcHBXbmQ7IHBwV25kKyspCiAgICAgewogICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgd2luZG93IHN0aWxsIGV4aXN0cyAqLwogICAgICAgICBpZiAoIUlzV2luZG93MzIoKCpwcFduZCktPmh3bmRTZWxmKSkgY29udGludWU7CiAgICAgICAgIC8qIEJ1aWxkIGNoaWxkcmVuIGxpc3QgZmlyc3QgKi8KLSAgICAgICAgaWYgKCEoY2hpbGRMaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoICpwcFduZCApKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIShjaGlsZExpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggKnBwV25kLCBCV0FfU0tJUE9XTkVELCBOVUxMICkpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICBpZiAoIWZ1bmMoICgqcHBXbmQpLT5od25kU2VsZiwgbFBhcmFtICkpIHJldHVybiBGQUxTRTsKICAgICAgICAgcmV0ID0gV0lOX0VudW1DaGlsZFdpbmRvd3MoIGNoaWxkTGlzdCwgZnVuYywgbFBhcmFtICk7CiAgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBjaGlsZExpc3QgKTsKICAgICAgICAgaWYgKCFyZXQpIHJldHVybiBGQUxTRTsKLSAgICAgICAgcHBXbmQrKzsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0yMTAxLDcgKzIxMTYsNyBAQAogICAgIFdORCAqKmxpc3QsICpwUGFyZW50OwogCiAgICAgaWYgKCEocFBhcmVudCA9IFdJTl9GaW5kV25kUHRyKCBwYXJlbnQgKSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIShsaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoIHBQYXJlbnQgKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIShsaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoIHBQYXJlbnQsIEJXQV9TS0lQT1dORUQsIE5VTEwgKSkpIHJldHVybiBGQUxTRTsKICAgICBXSU5fRW51bUNoaWxkV2luZG93cyggbGlzdCwgZnVuYywgbFBhcmFtICk7CiAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGxpc3QgKTsKICAgICByZXR1cm4gVFJVRTsKQEAgLTIzMDAsMzkgKzIzMTUsMzggQEAKICAqLwogQk9PTDMyIERyYWdEZXRlY3QzMiggSFdORDMyIGhXbmQsIFBPSU5UMzIgcHQgKQogewotICBNU0cxNiBtc2c7Ci0gIFJFQ1QxNiAgcmVjdDsKKyAgICBNU0cxNiBtc2c7CisgICAgUkVDVDE2ICByZWN0OwogCi0gIHJlY3QubGVmdCA9IHB0LnggLSB3RHJhZ1dpZHRoOwotICByZWN0LnJpZ2h0ID0gcHQueCArIHdEcmFnV2lkdGg7CisgICAgcmVjdC5sZWZ0ID0gcHQueCAtIHdEcmFnV2lkdGg7CisgICAgcmVjdC5yaWdodCA9IHB0LnggKyB3RHJhZ1dpZHRoOwogCi0gIHJlY3QudG9wID0gcHQueSAtIHdEcmFnSGVpZ2h0OwotICByZWN0LmJvdHRvbSA9IHB0LnkgKyB3RHJhZ0hlaWdodDsKKyAgICByZWN0LnRvcCA9IHB0LnkgLSB3RHJhZ0hlaWdodDsKKyAgICByZWN0LmJvdHRvbSA9IHB0LnkgKyB3RHJhZ0hlaWdodDsKIAotICBTZXRDYXB0dXJlMzIoaFduZCk7CisgICAgU2V0Q2FwdHVyZTMyKGhXbmQpOwogCi0gIHdoaWxlKDEpCi0gICB7Ci0gICAgICAgIHdoaWxlKFBlZWtNZXNzYWdlMTYoJm1zZyAsMCAsV01fTU9VU0VGSVJTVCAsV01fTU9VU0VMQVNUICxQTV9SRU1PVkUpKQotICAgICAgICAgewotICAgICAgICAgICBpZiggbXNnLm1lc3NhZ2UgPT0gV01fTEJVVFRPTlVQICkKKyAgICB3aGlsZSgxKQorICAgIHsKKwl3aGlsZShQZWVrTWVzc2FnZTE2KCZtc2cgLDAgLFdNX01PVVNFRklSU1QgLFdNX01PVVNFTEFTVCAsUE1fUkVNT1ZFKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG1zZy5tZXNzYWdlID09IFdNX0xCVVRUT05VUCApCisJICAgIHsKKwkJUmVsZWFzZUNhcHR1cmUoKTsKKwkJcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbXNnLm1lc3NhZ2UgPT0gV01fTU9VU0VNT1ZFICkKKwkgICAgeworCQlpZiggIVB0SW5SZWN0MTYoICZyZWN0LCBNQUtFUE9JTlQxNihtc2cubFBhcmFtKSApICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCSAgICBSZWxlYXNlQ2FwdHVyZSgpOworCQkgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICBpZiggbXNnLm1lc3NhZ2UgPT0gV01fTU9VU0VNT1ZFICkKLQkJewotICAgICAgICAgICAgICAgICAgaWYoICFQdEluUmVjdDE2KCAmcmVjdCwgTUFLRVBPSU5UMTYobXNnLmxQYXJhbSkgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOwotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgIH0KLSAgICAgICAgV2FpdE1lc3NhZ2UoKTsKLSAgIH0KLQotICByZXR1cm4gMDsKKwkgICAgfQorICAgICAgICB9CisJV2FpdE1lc3NhZ2UoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIzNDEsMTE5ICsyMzU1LDExMCBAQAogRFdPUkQgRHJhZ09iamVjdDE2KCBIV05EMTYgaHduZFNjb3BlLCBIV05EMTYgaFduZCwgVUlOVDE2IHdPYmosCiAgICAgICAgICAgICAgICAgICAgIEhBTkRMRTE2IGhPZlN0cnVjdCwgV09SRCBzekxpc3QsIEhDVVJTT1IxNiBoQ3Vyc29yICkKIHsKLSBNU0cxNgkgCW1zZzsKLSBMUERSQUdJTkZPCWxwRHJhZ0luZm87Ci0gU0VHUFRSCQlzcERyYWdJbmZvOwotIEhDVVJTT1IxNiAJaERyYWdDdXJzb3I9MCwgaE9sZEN1cnNvcj0wLCBoQnVtbWVyPTA7Ci0gSEdMT0JBTDE2CWhEcmFnSW5mbyAgPSBHbG9iYWxBbGxvYzE2KCBHTUVNX1NIQVJFIHwgR01FTV9aRVJPSU5JVCwgMipzaXplb2YoRFJBR0lORk8pKTsKLSBXTkQgICAgICAgICAgICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKLSBEV09SRAkJZHdSZXQgPSAwOwotIHNob3J0CSAJZHJhZ0RvbmUgPSAwOwotIEhDVVJTT1IxNgloQ3VycmVudEN1cnNvciA9IDA7Ci0gSFdORDE2CQloQ3VycmVudFduZCA9IDA7Ci0gQk9PTDE2CQliOworICAgIE1TRzE2CW1zZzsKKyAgICBMUERSQUdJTkZPCWxwRHJhZ0luZm87CisgICAgU0VHUFRSCXNwRHJhZ0luZm87CisgICAgSENVUlNPUjE2IAloRHJhZ0N1cnNvcj0wLCBoT2xkQ3Vyc29yPTAsIGhCdW1tZXI9MDsKKyAgICBIR0xPQkFMMTYJaERyYWdJbmZvICA9IEdsb2JhbEFsbG9jMTYoIEdNRU1fU0hBUkUgfCBHTUVNX1pFUk9JTklULCAyKnNpemVvZihEUkFHSU5GTykpOworICAgIFdORCAgICAgICAgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOworICAgIEhDVVJTT1IxNgloQ3VycmVudEN1cnNvciA9IDA7CisgICAgSFdORDE2CWhDdXJyZW50V25kID0gMDsKIAotIGxwRHJhZ0luZm8gPSAoTFBEUkFHSU5GTykgR2xvYmFsTG9jazE2KGhEcmFnSW5mbyk7Ci0gc3BEcmFnSW5mbyA9IChTRUdQVFIpIFdJTjE2X0dsb2JhbExvY2sxNihoRHJhZ0luZm8pOworICAgIGxwRHJhZ0luZm8gPSAoTFBEUkFHSU5GTykgR2xvYmFsTG9jazE2KGhEcmFnSW5mbyk7CisgICAgc3BEcmFnSW5mbyA9IChTRUdQVFIpIFdJTjE2X0dsb2JhbExvY2sxNihoRHJhZ0luZm8pOwogCi0gaWYoICFscERyYWdJbmZvIHx8ICFzcERyYWdJbmZvICkgcmV0dXJuIDBMOworICAgIGlmKCAhbHBEcmFnSW5mbyB8fCAhc3BEcmFnSW5mbyApIHJldHVybiAwTDsKIAotIGhCdW1tZXIgPSBMb2FkQ3Vyc29yMTYoMCxJRENfQlVNTUVSKTsKKyAgICBoQnVtbWVyID0gTG9hZEN1cnNvcjE2KDAsIElEQ19CVU1NRVIpOwogCi0gaWYoICFoQnVtbWVyIHx8ICF3bmRQdHIgKQotICAgeworICAgIGlmKCAhaEJ1bW1lciB8fCAhd25kUHRyICkKKyAgICB7CiAgICAgICAgIEdsb2JhbEZyZWUxNihoRHJhZ0luZm8pOwogICAgICAgICByZXR1cm4gMEw7Ci0gICB9CisgICAgfQogCi0gaWYoaEN1cnNvcikKLSAgIHsKKyAgICBpZihoQ3Vyc29yKQorICAgIHsKIAlpZiggIShoRHJhZ0N1cnNvciA9IENVUlNPUklDT05fSWNvblRvQ3Vyc29yKGhDdXJzb3IsIEZBTFNFKSkgKQotCSAgewotCSAgIEdsb2JhbEZyZWUxNihoRHJhZ0luZm8pOwotCSAgIHJldHVybiAwTDsKLQkgIH0KKwl7CisJICAgIEdsb2JhbEZyZWUxNihoRHJhZ0luZm8pOworCSAgICByZXR1cm4gMEw7CisJfQogCiAJaWYoIGhEcmFnQ3Vyc29yID09IGhDdXJzb3IgKSBoRHJhZ0N1cnNvciA9IDA7CiAJZWxzZSBoQ3Vyc29yID0gaERyYWdDdXJzb3I7CiAKIAloT2xkQ3Vyc29yID0gU2V0Q3Vyc29yMzIoaERyYWdDdXJzb3IpOwotICAgfQorICAgIH0KIAotIGxwRHJhZ0luZm8tPmhXbmQgICA9IGhXbmQ7Ci0gbHBEcmFnSW5mby0+aFNjb3BlID0gMDsKLSBscERyYWdJbmZvLT53RmxhZ3MgPSB3T2JqOwotIGxwRHJhZ0luZm8tPmhMaXN0ICA9IHN6TGlzdDsgLyogbmVhciBwb2ludGVyISAqLwotIGxwRHJhZ0luZm8tPmhPZlN0cnVjdCA9IGhPZlN0cnVjdDsKLSBscERyYWdJbmZvLT5sID0gMEw7IAorICAgIGxwRHJhZ0luZm8tPmhXbmQgICA9IGhXbmQ7CisgICAgbHBEcmFnSW5mby0+aFNjb3BlID0gMDsKKyAgICBscERyYWdJbmZvLT53RmxhZ3MgPSB3T2JqOworICAgIGxwRHJhZ0luZm8tPmhMaXN0ICA9IHN6TGlzdDsgLyogbmVhciBwb2ludGVyISAqLworICAgIGxwRHJhZ0luZm8tPmhPZlN0cnVjdCA9IGhPZlN0cnVjdDsKKyAgICBscERyYWdJbmZvLT5sID0gMEw7IAogCi0gU2V0Q2FwdHVyZTMyKGhXbmQpOwotIFNob3dDdXJzb3IzMiggVFJVRSApOworICAgIFNldENhcHR1cmUzMihoV25kKTsKKyAgICBTaG93Q3Vyc29yMzIoIFRSVUUgKTsKIAotIHdoaWxlKCAhZHJhZ0RvbmUgKQotICB7Ci0gICAgV2FpdE1lc3NhZ2UoKTsKKyAgICBkbworICAgIHsKKwlkb3sgIFdhaXRNZXNzYWdlKCk7IH0KKwl3aGlsZSggIVBlZWtNZXNzYWdlMTYoJm1zZywwLFdNX01PVVNFRklSU1QsV01fTU9VU0VMQVNULFBNX1JFTU9WRSkgKTsKIAotICAgIGlmKCAhUGVla01lc3NhZ2UxNigmbXNnLDAsV01fTU9VU0VGSVJTVCxXTV9NT1VTRUxBU1QsUE1fUkVNT1ZFKSApCi0JIGNvbnRpbnVlOworICAgICAgICoobHBEcmFnSW5mbysxKSA9ICpscERyYWdJbmZvOwogCi0gICAqKGxwRHJhZ0luZm8rMSkgPSAqbHBEcmFnSW5mbzsKKwlscERyYWdJbmZvLT5wdCA9IG1zZy5wdDsKIAotICAgIGxwRHJhZ0luZm8tPnB0ID0gbXNnLnB0OworCS8qIHVwZGF0ZSBEUkFHSU5GTyBzdHJ1Y3QgKi8KKwlkcHJpbnRmX21zZyhzdGRkZWIsImRyYWc6IGxwREktPmhTY29wZSA9ICUwNHhcbiIsbHBEcmFnSW5mby0+aFNjb3BlKTsKIAotICAgIC8qIHVwZGF0ZSBEUkFHSU5GTyBzdHJ1Y3QgKi8KLSAgICBkcHJpbnRmX21zZyhzdGRkZWIsImRyYWc6IGxwREktPmhTY29wZSA9ICUwNHhcbiIsbHBEcmFnSW5mby0+aFNjb3BlKTsKLQotICAgIGlmKCAoYiA9IERSQUdfUXVlcnlVcGRhdGUoaHduZFNjb3BlLCBzcERyYWdJbmZvLCBGQUxTRSkpID4gMCApCi0JIGhDdXJyZW50Q3Vyc29yID0gaEN1cnNvcjsKLSAgICBlbHNlCisJaWYoIERSQUdfUXVlcnlVcGRhdGUoaHduZFNjb3BlLCBzcERyYWdJbmZvLCBGQUxTRSkgPiAwICkKKwkgICAgaEN1cnJlbnRDdXJzb3IgPSBoQ3Vyc29yOworCWVsc2UKICAgICAgICAgewotICAgICAgICAgaEN1cnJlbnRDdXJzb3IgPSBoQnVtbWVyOwotICAgICAgICAgbHBEcmFnSW5mby0+aFNjb3BlID0gMDsKKyAgICAgICAgICAgIGhDdXJyZW50Q3Vyc29yID0gaEJ1bW1lcjsKKyAgICAgICAgICAgIGxwRHJhZ0luZm8tPmhTY29wZSA9IDA7CiAJfQotICAgIGlmKCBoQ3VycmVudEN1cnNvciApCi0gICAgICAgIFNldEN1cnNvcjMyKGhDdXJyZW50Q3Vyc29yKTsKKwlpZiggaEN1cnJlbnRDdXJzb3IgKQorCSAgICBTZXRDdXJzb3IzMihoQ3VycmVudEN1cnNvcik7CiAKLSAgICBkcHJpbnRmX21zZyhzdGRkZWIsImRyYWc6IGdvdCAlMDR4XG4iLCBiKTsKLQotICAgIC8qIHNlbmQgV01fRFJBR0xPT1AgKi8KLSAgICBTZW5kTWVzc2FnZTE2KCBoV25kLCBXTV9EUkFHTE9PUCwgKFdQQVJBTTE2KShoQ3VycmVudEN1cnNvciAhPSBoQnVtbWVyKSAsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKSBzcERyYWdJbmZvICk7Ci0gICAgLyogc2VuZCBXTV9EUkFHU0VMRUNUIG9yIFdNX0RSQUdNT1ZFICovCi0gICAgaWYoIGhDdXJyZW50V25kICE9IGxwRHJhZ0luZm8tPmhTY29wZSApCisJLyogc2VuZCBXTV9EUkFHTE9PUCAqLworCVNlbmRNZXNzYWdlMTYoIGhXbmQsIFdNX0RSQUdMT09QLCAoV1BBUkFNMTYpKGhDdXJyZW50Q3Vyc29yICE9IGhCdW1tZXIpLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkgc3BEcmFnSW5mbyApOworCS8qIHNlbmQgV01fRFJBR1NFTEVDVCBvciBXTV9EUkFHTU9WRSAqLworCWlmKCBoQ3VycmVudFduZCAhPSBscERyYWdJbmZvLT5oU2NvcGUgKQogCXsKLQkgaWYoIGhDdXJyZW50V25kICkKLQkgICBTZW5kTWVzc2FnZTE2KCBoQ3VycmVudFduZCwgV01fRFJBR1NFTEVDVCwgMCwgCisJICAgIGlmKCBoQ3VycmVudFduZCApCisJICAgICAgICBTZW5kTWVzc2FnZTE2KCBoQ3VycmVudFduZCwgV01fRFJBR1NFTEVDVCwgMCwgCiAJCSAgICAgICAoTFBBUkFNKU1BS0VMT05HKExPV09SRChzcERyYWdJbmZvKStzaXplb2YoRFJBR0lORk8pLAogCQkJCSAgICAgICAgSElXT1JEKHNwRHJhZ0luZm8pKSApOwotCSBoQ3VycmVudFduZCA9IGxwRHJhZ0luZm8tPmhTY29wZTsKLQkgaWYoIGhDdXJyZW50V25kICkKLSAgICAgICAgICAgU2VuZE1lc3NhZ2UxNiggaEN1cnJlbnRXbmQsIFdNX0RSQUdTRUxFQ1QsIDEsIChMUEFSQU0pc3BEcmFnSW5mbyk7IAorCSAgICBoQ3VycmVudFduZCA9IGxwRHJhZ0luZm8tPmhTY29wZTsKKwkgICAgaWYoIGhDdXJyZW50V25kICkKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTE2KCBoQ3VycmVudFduZCwgV01fRFJBR1NFTEVDVCwgMSwgKExQQVJBTSlzcERyYWdJbmZvKTsgCiAJfQorCWVsc2UKKwkgICAgaWYoIGhDdXJyZW50V25kICkKKwkgICAgICAgIFNlbmRNZXNzYWdlMTYoIGhDdXJyZW50V25kLCBXTV9EUkFHTU9WRSwgMCwgKExQQVJBTSlzcERyYWdJbmZvKTsKKworICAgIH0gd2hpbGUoIG1zZy5tZXNzYWdlICE9IFdNX0xCVVRUT05VUCAmJiBtc2cubWVzc2FnZSAhPSBXTV9OQ0xCVVRUT05VUCApOworCisgICAgUmVsZWFzZUNhcHR1cmUoKTsKKyAgICBTaG93Q3Vyc29yMzIoIEZBTFNFICk7CisKKyAgICBpZiggaEN1cnNvciApCisgICAgeworCVNldEN1cnNvcjMyKCBoT2xkQ3Vyc29yICk7CisJaWYgKGhEcmFnQ3Vyc29yKSBEZXN0cm95Q3Vyc29yMzIoIGhEcmFnQ3Vyc29yICk7CisgICAgfQorCisgICAgaWYoIGhDdXJyZW50Q3Vyc29yICE9IGhCdW1tZXIgKSAKKwltc2cubFBhcmFtID0gU2VuZE1lc3NhZ2UxNiggbHBEcmFnSW5mby0+aFNjb3BlLCBXTV9EUk9QT0JKRUNULCAKKwkJCQkgICAoV1BBUkFNMTYpaFduZCwgKExQQVJBTSlzcERyYWdJbmZvICk7CiAgICAgZWxzZQotCWlmKCBoQ3VycmVudFduZCApCi0JICAgU2VuZE1lc3NhZ2UxNiggaEN1cnJlbnRXbmQsIFdNX0RSQUdNT1ZFLCAwLCAoTFBBUkFNKXNwRHJhZ0luZm8pOworICAgICAgICBtc2cubFBhcmFtID0gMDsKKyAgICBHbG9iYWxGcmVlMTYoaERyYWdJbmZvKTsKIAotCi0gICAgLyogY2hlY2sgaWYgd2UncmUgZG9uZSAqLwotICAgIGlmKCBtc2cubWVzc2FnZSA9PSBXTV9MQlVUVE9OVVAgfHwgbXNnLm1lc3NhZ2UgPT0gV01fTkNMQlVUVE9OVVAgKQotCWRyYWdEb25lID0gVFJVRTsKLSAgfQotCi0gUmVsZWFzZUNhcHR1cmUoKTsKLSBTaG93Q3Vyc29yMzIoIEZBTFNFICk7Ci0KLSBpZiggaEN1cnNvciApCi0gewotICAgICBTZXRDdXJzb3IzMiggaE9sZEN1cnNvciApOwotICAgICBpZiAoaERyYWdDdXJzb3IpIERlc3Ryb3lDdXJzb3IzMiggaERyYWdDdXJzb3IgKTsKLSB9Ci0KLSBpZiggaEN1cnJlbnRDdXJzb3IgIT0gaEJ1bW1lciApIAotCWR3UmV0ID0gU2VuZE1lc3NhZ2UxNiggbHBEcmFnSW5mby0+aFNjb3BlLCBXTV9EUk9QT0JKRUNULCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpaFduZCwgKExQQVJBTSlzcERyYWdJbmZvICk7Ci0gR2xvYmFsRnJlZTE2KGhEcmFnSW5mbyk7Ci0KLSByZXR1cm4gZHdSZXQ7CisgICAgcmV0dXJuIChEV09SRCkobXNnLmxQYXJhbSk7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luaGVscC5jIGIvd2luZG93cy93aW5oZWxwLmMKaW5kZXggZjA4NzI0Ny4uNDlhZTJjYSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5oZWxwLmMKKysrIGIvd2luZG93cy93aW5oZWxwLmMKQEAgLTc2LDcgKzc2LDcgQEAKIAkJCXJldHVybiBGQUxTRTsKIAl9CiAJaWYobHBIZWxwRmlsZSkKLQkJbmxlbiA9ICBzdHJsZW4obHBIZWxwRmlsZSkrMTsKKwkJbmxlbiA9IHN0cmxlbihscEhlbHBGaWxlKSsxOwogCWVsc2UKIAkJbmxlbiA9IDA7CiAJc2l6ZSA9IHNpemVvZihXSU5IRUxQKSArIG5sZW4gKyBkc2l6ZTsKQEAgLTg0LDEwICs4NCwxMiBAQAogCWxwd2ggPSBHbG9iYWxMb2NrMTYoaHdoKTsKIAlscHdoLT5zaXplID0gc2l6ZTsKIAlscHdoLT5jb21tYW5kID0gd0NvbW1hbmQ7CisJbHB3aC0+ZGF0YSA9IGR3RGF0YTsKIAlpZihubGVuKSB7Ci0JCWxwd2gtPm9mc0ZpbGVuYW1lID0gc2l6ZW9mKFdJTkhFTFApOwogCQlzdHJjcHkoKChjaGFyKilscHdoKSArIHNpemVvZihXSU5IRUxQKSxscEhlbHBGaWxlKTsKLQl9CisJCWxwd2gtPm9mc0ZpbGVuYW1lID0gc2l6ZW9mKFdJTkhFTFApOworIAl9IGVsc2UKKwkJbHB3aC0+b2ZzRmlsZW5hbWUgPSAwOwogCWlmKGRzaXplKSB7CiAJCW1lbWNweSgoKGNoYXIqKWxwd2gpK3NpemVvZihXSU5IRUxQKStubGVuLChMUFNUUilkd0RhdGEsZHNpemUpOwogCQlscHdoLT5vZnNEYXRhID0gc2l6ZW9mKFdJTkhFTFApK25sZW47CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnBvcy5jIGIvd2luZG93cy93aW5wb3MuYwppbmRleCA5YjkwNTY0Li4zYzRhNDY5IDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnBvcy5jCisrKyBiL3dpbmRvd3Mvd2lucG9zLmMKQEAgLTIsNyArMiw3IEBACiAgKiBXaW5kb3cgcG9zaXRpb24gcmVsYXRlZCBmdW5jdGlvbnMuCiAgKgogICogQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgMTk5NSwxOTk2IEFsZXggS29yb2JrYQorICogICAgICAgICAgICAgICAgICAgICAgIDE5OTUsIDE5OTYgQWxleCBLb3JvYmthCiAgKi8KIAogI2luY2x1ZGUgPFgxMS9YbGliLmg+CkBAIC0yNCw2ICsyNCwxNCBAQAogLyogI2RlZmluZSBERUJVR19XSU4gKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogCisjZGVmaW5lIEhBU19ETEdGUkFNRShzdHlsZSxleFN0eWxlKSBcCisgICAgKCgoZXhTdHlsZSkgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSB8fCBcCisgICAgICgoKHN0eWxlKSAmIFdTX0RMR0ZSQU1FKSAmJiAhKChzdHlsZSkgJiBXU19CT1JERVIpKSkKKworI2RlZmluZSBIQVNfVEhJQ0tGUkFNRShzdHlsZSkgXAorICAgICgoKHN0eWxlKSAmIFdTX1RISUNLRlJBTUUpICYmIFwKKyAgICAgISgoKHN0eWxlKSAmIChXU19ETEdGUkFNRXxXU19CT1JERVIpKSA9PSBXU19ETEdGUkFNRSkpCisKICNkZWZpbmUgIFNXUF9BR0dfTk9HRU9NRVRSWUNIQU5HRSBcCiAgICAgKFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwgU1dQX05PQ0xJRU5UU0laRSB8IFNXUF9OT0NMSUVOVE1PVkUpCiAjZGVmaW5lICBTV1BfQUdHX05PUE9TQ0hBTkdFIFwKQEAgLTMxLDYgKzM5LDEyIEBACiAjZGVmaW5lICBTV1BfQUdHX1NUQVRVU0ZMQUdTIFwKICAgICAoU1dQX0FHR19OT1BPU0NIQU5HRSB8IFNXUF9GUkFNRUNIQU5HRUQgfCBTV1BfSElERVdJTkRPVyB8IFNXUF9TSE9XV0lORE9XKQogCisjZGVmaW5lIEVNUFRZUE9JTlQocHQpICAgICAgICAgICgoKihMT05HKikmKHB0KSkgPT0gLTEpCisKKyNkZWZpbmUgUExBQ0VfTUlOCQkweDAwMDEKKyNkZWZpbmUgUExBQ0VfTUFYCQkweDAwMDIKKyNkZWZpbmUgUExBQ0VfUkVDVAkJMHgwMDA0CisKICNkZWZpbmUgU01DX05PQ09QWQkJMHgwMDAxCiAjZGVmaW5lIFNNQ19OT1BBUkVOVEVSQVNFCTB4MDAwMgogI2RlZmluZSBTTUNfRFJBV0ZSQU1FCQkweDAwMDQKQEAgLTQ4LDQ2ICs2Miw2NiBAQAogc3RhdGljIEhXTkQzMiBod25kQWN0aXZlICAgICAgPSAwOyAgLyogQ3VycmVudGx5IGFjdGl2ZSB3aW5kb3cgKi8KIHN0YXRpYyBIV05EMzIgaHduZFByZXZBY3RpdmUgID0gMDsgIC8qIFByZXZpb3VzbHkgYWN0aXZlIHdpbmRvdyAqLwogCitzdGF0aWMgTFBDU1RSIGF0b21JbnRlcm5hbFBvczsKKwogZXh0ZXJuIE1FU1NBR0VRVUVVRSogcEFjdGl2ZVF1ZXVlOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXSU5QT1NfQ2hlY2tBY3RpdmUKKyAqICAgICAgICAgICBXSU5QT1NfQ3JlYXRlSW50ZXJuYWxQb3NBdG9tCiAgKi8KLXZvaWQgV0lOUE9TX0NoZWNrQWN0aXZlKCBIV05EMzIgaHduZCApCitCT09MMzIgV0lOUE9TX0NyZWF0ZUludGVybmFsUG9zQXRvbSgpCiB7Ci0gIGlmKCBod25kID09IGh3bmRQcmV2QWN0aXZlICkgaHduZFByZXZBY3RpdmUgPSAwOwotICBpZiggaHduZCA9PSBod25kQWN0aXZlICkKLSAgewotICAgICAgaHduZEFjdGl2ZSA9IDA7IAotICAgICAgZHByaW50Zl93aW4oc3RkZGViLCJcdGF0dGVtcHQgdG8gYWN0aXZhdGUgZGVzdHJveWVkIHdpbmRvdyFcbiIpOwotICB9CisgICAgTFBTVFIgc3RyID0gIlN5c0lQIjsKKyAgICBhdG9tSW50ZXJuYWxQb3MgPSAoTFBDU1RSKShEV09SRClHbG9iYWxBZGRBdG9tMzJBKHN0cik7CisgICAgcmV0dXJuIChhdG9tSW50ZXJuYWxQb3MpID8gVFJVRSA6IEZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXSU5QT1NfQ2hlY2tJbnRlcm5hbFBvcworICoKKyAqIENhbGxlZCB3aGVuIGEgd2luZG93IGlzIGRlc3Ryb3llZC4KKyAqLwordm9pZCBXSU5QT1NfQ2hlY2tJbnRlcm5hbFBvcyggSFdORDMyIGh3bmQgKQoreworICAgIExQSU5URVJOQUxQT1MgbHBQb3MgPSAoTFBJTlRFUk5BTFBPUykgR2V0UHJvcDMyQSggaHduZCwgYXRvbUludGVybmFsUG9zICk7CisKKyAgICBpZiggaHduZCA9PSBod25kUHJldkFjdGl2ZSApIGh3bmRQcmV2QWN0aXZlID0gMDsKKyAgICBpZiggaHduZCA9PSBod25kQWN0aXZlICkKKyAgICB7CisJaHduZEFjdGl2ZSA9IDA7IAorCWRwcmludGZfd2luKHN0ZGRlYiwiXHRhdHRlbXB0IHRvIGFjdGl2YXRlIGRlc3Ryb3llZCB3aW5kb3chXG4iKTsKKyAgICB9CisKKyAgICBpZiggbHBQb3MgKQorICAgIHsKKwlpZiggSXNXaW5kb3czMihscFBvcy0+aHduZEljb25UaXRsZSkgKSAKKwkgICAgRGVzdHJveVdpbmRvdzMyKCBscFBvcy0+aHduZEljb25UaXRsZSApOworCUhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBscFBvcyApOworICAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgV0lOUE9TX0ZpbmRJY29uUG9zCiAgKgogICogRmluZCBhIHN1aXRhYmxlIHBsYWNlIGZvciBhbiBpY29uaWMgd2luZG93LgotICogVGhlIG5ldyBwb3NpdGlvbiBpcyBzdG9yZWQgaW50byB3bmRQdHItPnB0SWNvblBvcy4KICAqLwotdm9pZCBXSU5QT1NfRmluZEljb25Qb3MoIEhXTkQzMiBod25kICkKK3N0YXRpYyBQT0lOVDE2IFdJTlBPU19GaW5kSWNvblBvcyggV05EKiB3bmRQdHIsIFBPSU5UMTYgcHQgKQogewogICAgIFJFQ1QxNiByZWN0UGFyZW50OwogICAgIHNob3J0IHgsIHksIHhzcGFjaW5nLCB5c3BhY2luZzsKLSAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCi0gICAgaWYgKCF3bmRQdHIgfHwgIXduZFB0ci0+cGFyZW50KSByZXR1cm47CiAgICAgR2V0Q2xpZW50UmVjdDE2KCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsICZyZWN0UGFyZW50ICk7Ci0gICAgaWYgKCh3bmRQdHItPnB0SWNvblBvcy54ID49IHJlY3RQYXJlbnQubGVmdCkgJiYKLSAgICAgICAgKHduZFB0ci0+cHRJY29uUG9zLnggKyBTWVNNRVRSSUNTX0NYSUNPTiA8IHJlY3RQYXJlbnQucmlnaHQpICYmCi0gICAgICAgICh3bmRQdHItPnB0SWNvblBvcy55ID49IHJlY3RQYXJlbnQudG9wKSAmJgotICAgICAgICAod25kUHRyLT5wdEljb25Qb3MueSArIFNZU01FVFJJQ1NfQ1lJQ09OIDwgcmVjdFBhcmVudC5ib3R0b20pKQotICAgICAgICByZXR1cm47ICAvKiBUaGUgaWNvbiBhbHJlYWR5IGhhcyBhIHN1aXRhYmxlIHBvc2l0aW9uICovCisgICAgaWYgKChwdC54ID49IHJlY3RQYXJlbnQubGVmdCkgJiYgKHB0LnggKyBTWVNNRVRSSUNTX0NYSUNPTiA8IHJlY3RQYXJlbnQucmlnaHQpICYmCisgICAgICAgIChwdC55ID49IHJlY3RQYXJlbnQudG9wKSAmJiAocHQueSArIFNZU01FVFJJQ1NfQ1lJQ09OIDwgcmVjdFBhcmVudC5ib3R0b20pKQorICAgICAgICByZXR1cm4gcHQ7ICAvKiBUaGUgaWNvbiBhbHJlYWR5IGhhcyBhIHN1aXRhYmxlIHBvc2l0aW9uICovCiAKLSAgICB4c3BhY2luZyA9IHlzcGFjaW5nID0gNzA7ICAvKiBGSVhNRTogVGhpcyBzaG91bGQgY29tZSBmcm9tIFdJTi5JTkkgKi8KKyAgICB4c3BhY2luZyA9IFNZU01FVFJJQ1NfQ1hJQ09OU1BBQ0lORzsKKyAgICB5c3BhY2luZyA9IFNZU01FVFJJQ1NfQ1lJQ09OU1BBQ0lORzsKKwogICAgIHkgPSByZWN0UGFyZW50LmJvdHRvbTsKICAgICBmb3IgKDs7KQogICAgIHsKLSAgICAgICAgZm9yICh4ID0gcmVjdFBhcmVudC5sZWZ0OyB4PD1yZWN0UGFyZW50LnJpZ2h0LXhzcGFjaW5nOyB4ICs9IHhzcGFjaW5nKQorICAgICAgICBmb3IgKHggPSByZWN0UGFyZW50LmxlZnQ7IHggPD0gcmVjdFBhcmVudC5yaWdodC14c3BhY2luZzsgeCArPSB4c3BhY2luZykKICAgICAgICAgewogICAgICAgICAgICAgICAvKiBDaGVjayBpZiBhbm90aGVyIGljb24gYWxyZWFkeSBvY2N1cGllcyB0aGlzIHNwb3QgKi8KICAgICAgICAgICAgIFdORCAqY2hpbGRQdHIgPSB3bmRQdHItPnBhcmVudC0+Y2hpbGQ7CkBAIC0xMDMsMTIgKzEzNywxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjaGlsZFB0ciA9IGNoaWxkUHRyLT5uZXh0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGlsZFB0cikKKyAgICAgICAgICAgIGlmICghY2hpbGRQdHIpIC8qIE5vIHdpbmRvdyB3YXMgZm91bmQsIHNvIGl0J3MgT0sgZm9yIHVzICovCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBObyB3aW5kb3cgd2FzIGZvdW5kLCBzbyBpdCdzIE9LIGZvciB1cyAqLwotICAgICAgICAgICAgICAgIHduZFB0ci0+cHRJY29uUG9zLnggPSB4ICsgKHhzcGFjaW5nIC0gU1lTTUVUUklDU19DWElDT04pIC8gMjsKLSAgICAgICAgICAgICAgICB3bmRQdHItPnB0SWNvblBvcy55ID0geSAtICh5c3BhY2luZyArIFNZU01FVFJJQ1NfQ1lJQ09OKSAvIDI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworCQlwdC54ID0geCArICh4c3BhY2luZyAtIFNZU01FVFJJQ1NfQ1hJQ09OKSAvIDI7CisJCXB0LnkgPSB5IC0gKHlzcGFjaW5nICsgU1lTTUVUUklDU19DWUlDT04pIC8gMjsKKwkJcmV0dXJuIHB0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHkgLT0geXNwYWNpbmc7CkBAIC0xMTcsMTMgKzE1MCwxNCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzICAgKFVTRVIzMi42KQorICogICAgICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzMTYgICAoVVNFUi4xNzApCiAgKi8KLVVJTlQxNiBBcnJhbmdlSWNvbmljV2luZG93czE2KCBIV05EMTYgcGFyZW50KSB7CitVSU5UMTYgQXJyYW5nZUljb25pY1dpbmRvd3MxNiggSFdORDE2IHBhcmVudCkgCit7CiAgICAgcmV0dXJuIEFycmFuZ2VJY29uaWNXaW5kb3dzMzIocGFyZW50KTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzICAgKFVTRVIuMTcwKQorICogICAgICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzMzIgICAoVVNFUjMyLjYpCiAgKi8KIFVJTlQzMiBBcnJhbmdlSWNvbmljV2luZG93czMyKCBIV05EMzIgcGFyZW50ICkKIHsKQEAgLTEzNCwxNSArMTY4LDIwIEBACiAgICAgR2V0Q2xpZW50UmVjdDMyKCBwYXJlbnQsICZyZWN0UGFyZW50ICk7CiAgICAgeCA9IHJlY3RQYXJlbnQubGVmdDsKICAgICB5ID0gcmVjdFBhcmVudC5ib3R0b207Ci0gICAgeHNwYWNpbmcgPSB5c3BhY2luZyA9IDcwOyAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGNvbWUgZnJvbSBXSU4uSU5JICovCisgICAgeHNwYWNpbmcgPSBTWVNNRVRSSUNTX0NYSUNPTlNQQUNJTkc7CisgICAgeXNwYWNpbmcgPSBTWVNNRVRSSUNTX0NZSUNPTlNQQUNJTkc7CisKICAgICBod25kQ2hpbGQgPSBHZXRXaW5kb3czMiggcGFyZW50LCBHV19DSElMRCApOwogICAgIHdoaWxlIChod25kQ2hpbGQpCiAgICAgewotICAgICAgICBpZiAoSXNJY29uaWMzMiggaHduZENoaWxkICkpCisgICAgICAgIGlmKCBJc0ljb25pYzMyKCBod25kQ2hpbGQgKSApCiAgICAgICAgIHsKKwkgICAgV0lOUE9TX1Nob3dJY29uVGl0bGUoIFdJTl9GaW5kV25kUHRyKGh3bmRDaGlsZCksIEZBTFNFICk7CiAgICAgICAgICAgICBTZXRXaW5kb3dQb3MzMiggaHduZENoaWxkLCAwLCB4ICsgKHhzcGFjaW5nIC0gU1lTTUVUUklDU19DWElDT04pIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IC0gKHlzcGFjaW5nICsgU1lTTUVUUklDU19DWUlDT04pIC8gMiwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9TSVpFfFNXUF9OT1pPUkRFUnxTV1BfTk9BQ1RJVkFURSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLSB5c3BhY2luZyAtIFNZU01FVFJJQ1NfQ1lJQ09OLzIsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFICk7CisJICAgIGlmKCBJc1dpbmRvdzMyKGh3bmRDaGlsZCkgKQorCSAgICAgICAgV0lOUE9TX1Nob3dJY29uVGl0bGUoIFdJTl9GaW5kV25kUHRyKGh3bmRDaGlsZCksIFRSVUUgKTsKICAgICAgICAgICAgIGlmICh4IDw9IHJlY3RQYXJlbnQucmlnaHQgLSB4c3BhY2luZykgeCArPSB4c3BhY2luZzsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTQ5NywxNCArNTM2LDE0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSXNJY29uaWMgICAoVVNFUi4zMSkKKyAqICAgICAgICAgICBJc0ljb25pYzE2ICAgKFVTRVIuMzEpCiAgKi8KIEJPT0wxNiBJc0ljb25pYzE2KEhXTkQxNiBoV25kKQogewogICAgIHJldHVybiBJc0ljb25pYzMyKGhXbmQpOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSXNJY29uaWMgICAoVVNFUjMyLjM0NCkKKyAqICAgICAgICAgICBJc0ljb25pYzMyICAgKFVTRVIzMi4zNDQpCiAgKi8KIEJPT0wzMiBJc0ljb25pYzMyKEhXTkQzMiBoV25kKQogewpAQCAtNTM3LDIxICs1NzYsMjIgQEAKICAqLwogSFdORDE2IEdldEFjdGl2ZVdpbmRvdzE2KHZvaWQpCiB7Ci0gICAgcmV0dXJuIEdldEFjdGl2ZVdpbmRvdzMyKCk7CisgICAgcmV0dXJuIChIV05EMTYpaHduZEFjdGl2ZTsKIH0KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgR2V0QWN0aXZlV2luZG93ICAgIChVU0VSMzIuMjA0KQogICovCiBIV05EMzIgR2V0QWN0aXZlV2luZG93MzIodm9pZCkKIHsKLSAgICByZXR1cm4gaHduZEFjdGl2ZTsKKyAgICByZXR1cm4gKEhXTkQzMilod25kQWN0aXZlOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIFdJTlBPU19Jc0dvb2RFbm91Z2gKKyAqICAgICAgICAgV0lOUE9TX0NhbkFjdGl2YXRlCiAgKi8KLXN0YXRpYyBCT09MMzIgV0lOUE9TX0lzR29vZEVub3VnaChXTkQqIHBXbmQpCitzdGF0aWMgQk9PTDMyIFdJTlBPU19DYW5BY3RpdmF0ZShXTkQqIHBXbmQpCiB7CiAgcmV0dXJuIChwV25kKSA/ICgoIShwV25kLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpICYmCiAgICAgICAgICAgICAgICAgICAgICBwV25kLT5kd1N0eWxlICYgV1NfVklTSUJMRSApID8gVFJVRSA6IEZBTFNFKSA6IEZBTFNFOwpAQCAtNTczLDcgKzYxMyw3IEBACiAgICAgSFdORDMyIHByZXYgPSBod25kQWN0aXZlOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIAotICAgIGlmICggIVdJTlBPU19Jc0dvb2RFbm91Z2god25kUHRyKSApIHJldHVybiAwOworICAgIGlmICggIVdJTlBPU19DYW5BY3RpdmF0ZSh3bmRQdHIpICkgcmV0dXJuIDA7CiAKICAgICBXSU5QT1NfU2V0QWN0aXZlV2luZG93KCBod25kLCAwLCAwICk7CiAgICAgcmV0dXJuIHByZXY7CkBAIC02MTgsNiArNjU4LDI0NyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXSU5QT1NfSW5pdEludGVybmFsUG9zCisgKi8KK3N0YXRpYyBMUElOVEVSTkFMUE9TIFdJTlBPU19Jbml0SW50ZXJuYWxQb3MoIFdORCogd25kLCBQT0lOVDE2IHB0LCAKKwkJCQkJICAgICBMUFJFQ1QxNiByZXN0b3JlUmVjdCApCit7CisgICAgTFBJTlRFUk5BTFBPUyBscFBvcyA9IChMUElOVEVSTkFMUE9TKSBHZXRQcm9wMzJBKCB3bmQtPmh3bmRTZWxmLCBhdG9tSW50ZXJuYWxQb3MgKTsKKyAgICBpZiggIWxwUG9zICkKKyAgICB7CisJLyogdGhpcyBoYXBwZW5zIHdoZW4gdGhlIHdpbmRvdyBpcyBtaW5pbWl6ZWQvbWF4aW1pemVkIAorCSAqIGZvciB0aGUgZmlyc3QgdGltZSAocmVjdFdpbmRvdyBpcyBub3QgYWRqdXN0ZWQgeWV0KSAqLworCisJbHBQb3MgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihJTlRFUk5BTFBPUykgKTsKKwlpZiggIWxwUG9zICkgcmV0dXJuIE5VTEw7CisKKwlTZXRQcm9wMzJBKCB3bmQtPmh3bmRTZWxmLCBhdG9tSW50ZXJuYWxQb3MsIChIQU5ETEUzMilscFBvcyApOworCWxwUG9zLT5od25kSWNvblRpdGxlID0gMDsgLyogZGVmZXIgdW50aWwgbmVlZHMgdG8gYmUgc2hvd24gKi8KKwlscFBvcy0+cmVjdE5vcm1hbCA9IHduZC0+cmVjdFdpbmRvdzsKKwkqKFVJTlQzMiopJmxwUG9zLT5wdEljb25Qb3MgPSAqKFVJTlQzMiopJmxwUG9zLT5wdE1heFBvcyA9IDB4RkZGRkZGRkY7CisgICAgfQorCisgICAgaWYoIHduZC0+ZHdTdHlsZSAmIFdTX01JTklNSVpFICkgCisJbHBQb3MtPnB0SWNvblBvcyA9IHB0OworICAgIGVsc2UgaWYoIHduZC0+ZHdTdHlsZSAmIFdTX01BWElNSVpFICkgCisJbHBQb3MtPnB0TWF4UG9zID0gcHQ7CisgICAgZWxzZSBpZiggcmVzdG9yZVJlY3QgKSAKKwlscFBvcy0+cmVjdE5vcm1hbCA9ICpyZXN0b3JlUmVjdDsKKworICAgIHJldHVybiBscFBvczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV0lOUE9TX1JlZHJhd0ljb25UaXRsZQorICovCitCT09MMzIgV0lOUE9TX1JlZHJhd0ljb25UaXRsZSggSFdORDMyIGhXbmQgKQoreworICAgIExQSU5URVJOQUxQT1MgbHBQb3MgPSAoTFBJTlRFUk5BTFBPUylHZXRQcm9wMzJBKCBoV25kLCBhdG9tSW50ZXJuYWxQb3MgKTsKKyAgICBpZiggbHBQb3MgKQorICAgIHsKKwlpZiggbHBQb3MtPmh3bmRJY29uVGl0bGUgKQorCXsKKwkgICAgU2VuZE1lc3NhZ2UzMkEoIGxwUG9zLT5od25kSWNvblRpdGxlLCBXTV9TSE9XV0lORE9XLCBUUlVFLCAwKTsKKwkgICAgSW52YWxpZGF0ZVJlY3QzMiggbHBQb3MtPmh3bmRJY29uVGl0bGUsIE5VTEwsIFRSVUUgKTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdJTlBPU19TaG93SWNvblRpdGxlCisgKi8KK0JPT0wzMiBXSU5QT1NfU2hvd0ljb25UaXRsZSggV05EKiBwV25kLCBCT09MMzIgYlNob3cgKQoreworICAgIExQSU5URVJOQUxQT1MgbHBQb3MgPSAoTFBJTlRFUk5BTFBPUylHZXRQcm9wMzJBKCBwV25kLT5od25kU2VsZiwgYXRvbUludGVybmFsUG9zICk7CisKKyAgICBpZiggbHBQb3MgJiYgIShwV25kLT5mbGFncyAmIFdJTl9NQU5BR0VEKSkKKyAgICB7CisJSFdORDE2IGhXbmQgPSBscFBvcy0+aHduZEljb25UaXRsZTsKKworCWRwcmludGZfd2luKHN0ZGRlYiwiU2hvd0ljb25UaXRsZTogMHglMDR4ICVpXG4iLCBwV25kLT5od25kU2VsZiwgKGJTaG93ICE9IDApICk7CisKKwlpZiggIWhXbmQgKQorCSAgICBscFBvcy0+aHduZEljb25UaXRsZSA9IGhXbmQgPSBJQ09OVElUTEVfQ3JlYXRlKCBwV25kICk7CisJaWYoIGJTaG93ICkKKyAgICAgICAgeworCSAgICBwV25kID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisKKwkgICAgaWYoICEocFduZC0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpICkKKwkgICAgeworCQlTZW5kTWVzc2FnZTE2KCBoV25kLCBXTV9TSE9XV0lORE9XLCBUUlVFLCAwICk7CisJCVNldFdpbmRvd1BvczMyKCBoV25kLCAwLCAwLCAwLCAwLCAwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8CisJCQkgICAgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSIHwgU1dQX1NIT1dXSU5ET1cgKTsKKwkgICAgfQorCX0KKwllbHNlIFNob3dXaW5kb3czMiggaFduZCwgU1dfSElERSApOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV0lOUE9TX0dldE1pbk1heEluZm8KKyAqCisgKiBHZXQgdGhlIG1pbmltaXplZCBhbmQgbWF4aW1pemVkIGluZm9ybWF0aW9uIGZvciBhIHdpbmRvdy4KKyAqLwordm9pZCBXSU5QT1NfR2V0TWluTWF4SW5mbyggV05EICp3bmRQdHIsIFBPSU5UMTYgKm1heFNpemUsIFBPSU5UMTYgKm1heFBvcywKKwkJCSAgIFBPSU5UMTYgKm1pblRyYWNrLCBQT0lOVDE2ICptYXhUcmFjayApCit7CisgICAgTFBJTlRFUk5BTFBPUyBscFBvczsKKyAgICBNSU5NQVhJTkZPMTYgKk1pbk1heDsKKyAgICBzaG9ydCB4aW5jLCB5aW5jOworCisgICAgaWYgKCEoTWluTWF4ID0gU0VHUFRSX05FVyhNSU5NQVhJTkZPMTYpKSkgcmV0dXJuOworCisgICAgICAvKiBDb21wdXRlIGRlZmF1bHQgdmFsdWVzICovCisKKyAgICBNaW5NYXgtPnB0TWF4U2l6ZS54ID0gU1lTTUVUUklDU19DWFNDUkVFTjsKKyAgICBNaW5NYXgtPnB0TWF4U2l6ZS55ID0gU1lTTUVUUklDU19DWVNDUkVFTjsKKyAgICBNaW5NYXgtPnB0TWluVHJhY2tTaXplLnggPSBTWVNNRVRSSUNTX0NYTUlOVFJBQ0s7CisgICAgTWluTWF4LT5wdE1pblRyYWNrU2l6ZS55ID0gU1lTTUVUUklDU19DWU1JTlRSQUNLOworICAgIE1pbk1heC0+cHRNYXhUcmFja1NpemUueCA9IFNZU01FVFJJQ1NfQ1hTQ1JFRU47CisgICAgTWluTWF4LT5wdE1heFRyYWNrU2l6ZS55ID0gU1lTTUVUUklDU19DWVNDUkVFTjsKKworICAgIGlmICh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpIHhpbmMgPSB5aW5jID0gMDsKKyAgICBlbHNlIGlmIChIQVNfRExHRlJBTUUoIHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5kd0V4U3R5bGUgKSkKKyAgICB7CisgICAgICAgIHhpbmMgPSBTWVNNRVRSSUNTX0NYRExHRlJBTUU7CisgICAgICAgIHlpbmMgPSBTWVNNRVRSSUNTX0NZRExHRlJBTUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHhpbmMgPSB5aW5jID0gMDsKKyAgICAgICAgaWYgKEhBU19USElDS0ZSQU1FKHduZFB0ci0+ZHdTdHlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHhpbmMgKz0gU1lTTUVUUklDU19DWEZSQU1FOworICAgICAgICAgICAgeWluYyArPSBTWVNNRVRSSUNTX0NZRlJBTUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0JPUkRFUikKKyAgICAgICAgeworICAgICAgICAgICAgeGluYyArPSBTWVNNRVRSSUNTX0NYQk9SREVSOworICAgICAgICAgICAgeWluYyArPSBTWVNNRVRSSUNTX0NZQk9SREVSOworICAgICAgICB9CisgICAgfQorICAgIE1pbk1heC0+cHRNYXhTaXplLnggKz0gMiAqIHhpbmM7CisgICAgTWluTWF4LT5wdE1heFNpemUueSArPSAyICogeWluYzsKKworICAgIGxwUG9zID0gKExQSU5URVJOQUxQT1MpR2V0UHJvcDMyQSggd25kUHRyLT5od25kU2VsZiwgYXRvbUludGVybmFsUG9zICk7CisgICAgaWYoIGxwUG9zICYmICFFTVBUWVBPSU5UKGxwUG9zLT5wdE1heFBvcykgKQorCU1pbk1heC0+cHRNYXhQb3NpdGlvbiA9IGxwUG9zLT5wdE1heFBvczsKKyAgICBlbHNlCisgICAgeworICAgICAgICBNaW5NYXgtPnB0TWF4UG9zaXRpb24ueCA9IC14aW5jOworICAgICAgICBNaW5NYXgtPnB0TWF4UG9zaXRpb24ueSA9IC15aW5jOworICAgIH0KKworICAgIFNlbmRNZXNzYWdlMTYoIHduZFB0ci0+aHduZFNlbGYsIFdNX0dFVE1JTk1BWElORk8sIDAsCisgICAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKE1pbk1heCkgKTsKKworICAgICAgLyogU29tZSBzYW5pdHkgY2hlY2tzICovCisKKyAgICBkcHJpbnRmX3dpbihzdGRkZWIsIkdldE1pbk1heEluZm86ICVkICVkIC8gJWQgJWQgLyAlZCAlZCAvICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIE1pbk1heC0+cHRNYXhTaXplLngsIE1pbk1heC0+cHRNYXhTaXplLnksCisgICAgICAgICAgICAgICAgICAgICAgTWluTWF4LT5wdE1heFBvc2l0aW9uLngsIE1pbk1heC0+cHRNYXhQb3NpdGlvbi55LAorICAgICAgICAgICAgICAgICAgICAgIE1pbk1heC0+cHRNYXhUcmFja1NpemUueCwgTWluTWF4LT5wdE1heFRyYWNrU2l6ZS55LAorICAgICAgICAgICAgICAgICAgICAgIE1pbk1heC0+cHRNaW5UcmFja1NpemUueCwgTWluTWF4LT5wdE1pblRyYWNrU2l6ZS55KTsKKyAgICBNaW5NYXgtPnB0TWF4VHJhY2tTaXplLnggPSBNQVgoIE1pbk1heC0+cHRNYXhUcmFja1NpemUueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluTWF4LT5wdE1pblRyYWNrU2l6ZS54ICk7CisgICAgTWluTWF4LT5wdE1heFRyYWNrU2l6ZS55ID0gTUFYKCBNaW5NYXgtPnB0TWF4VHJhY2tTaXplLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbk1heC0+cHRNaW5UcmFja1NpemUueSApOworCisgICAgaWYgKG1heFNpemUpICptYXhTaXplID0gTWluTWF4LT5wdE1heFNpemU7CisgICAgaWYgKG1heFBvcykgKm1heFBvcyA9IE1pbk1heC0+cHRNYXhQb3NpdGlvbjsKKyAgICBpZiAobWluVHJhY2spICptaW5UcmFjayA9IE1pbk1heC0+cHRNaW5UcmFja1NpemU7CisgICAgaWYgKG1heFRyYWNrKSAqbWF4VHJhY2sgPSBNaW5NYXgtPnB0TWF4VHJhY2tTaXplOworICAgIFNFR1BUUl9GUkVFKE1pbk1heCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdJTlBPU19NaW5NYXhpbWl6ZQorICoKKyAqIEZpbGwgaW4gbHBSZWN0IGFuZCByZXR1cm4gYWRkaXRpb25hbCBmbGFncyB0byBiZSB1c2VkIHdpdGggU2V0V2luZG93UG9zKCkuCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCAnY21kJyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCB3aW5kb3cKKyAqIHN0YXRlLgorICovCitVSU5UMTYgV0lOUE9TX01pbk1heGltaXplKCBXTkQqIHduZFB0ciwgVUlOVDE2IGNtZCwgTFBSRUNUMTYgbHBSZWN0ICkKK3sKKyAgICBVSU5UMTYJICBzd3BGbGFncyA9IDA7CisgICAgUE9JTlQxNgkgIHNpemUgPSB7IHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0LCB3bmRQdHItPnJlY3RXaW5kb3cudG9wIH07CisgICAgTFBJTlRFUk5BTFBPUyBscFBvcyA9IFdJTlBPU19Jbml0SW50ZXJuYWxQb3MoIHduZFB0ciwgc2l6ZSwgJnduZFB0ci0+cmVjdFdpbmRvdyApOworCisgICAgZHByaW50Zl93aW4oc3RkZGViLCJNaW5NYXhpbWl6ZTogMHglMDR4ICV1XG4iLCB3bmRQdHItPmh3bmRTZWxmLCBjbWQgKTsKKworICAgIGlmKCBscFBvcyAmJiAhSE9PS19DYWxsSG9va3MxNiggV0hfQ0JULCBIQ0JUX01JTk1BWCwgd25kUHRyLT5od25kU2VsZiwgY21kKSApCisgICAgeworCWlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSApCisJeworCSAgICBpZiggIVNlbmRNZXNzYWdlMzJBKCB3bmRQdHItPmh3bmRTZWxmLCBXTV9RVUVSWU9QRU4sIDAsIDBMICkgKQorCQlyZXR1cm4gKFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFKTsKKwkgICAgc3dwRmxhZ3MgfD0gU1dQX05PQ09QWUJJVFM7CisJfQorCXN3aXRjaCggY21kICkKKwl7CisJICAgIGNhc2UgU1dfTUlOSU1JWkU6CisJCSBpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfTUFYSU1JWkUpCisJCSB7CisJCSAgICAgd25kUHRyLT5mbGFncyB8PSBXSU5fUkVTVE9SRV9NQVg7CisJCSAgICAgd25kUHRyLT5kd1N0eWxlICY9IH5XU19NQVhJTUlaRTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlCisJCSAgICAgd25kUHRyLT5mbGFncyAmPSB+V0lOX1JFU1RPUkVfTUFYOworCQkgd25kUHRyLT5kd1N0eWxlIHw9IFdTX01JTklNSVpFOworCisJCSBscFBvcy0+cHRJY29uUG9zID0gV0lOUE9TX0ZpbmRJY29uUG9zKCB3bmRQdHIsIGxwUG9zLT5wdEljb25Qb3MgKTsKKworCQkgU2V0UmVjdDE2KCBscFJlY3QsIGxwUG9zLT5wdEljb25Qb3MueCwgbHBQb3MtPnB0SWNvblBvcy55LAorCQkJCSAgICBTWVNNRVRSSUNTX0NYSUNPTiwgU1lTTUVUUklDU19DWUlDT04gKTsKKwkJIHN3cEZsYWdzIHw9IFNXUF9OT0NPUFlCSVRTOworCQkgYnJlYWs7CisKKwkgICAgY2FzZSBTV19NQVhJTUlaRToKKwkJIFdJTlBPU19HZXRNaW5NYXhJbmZvKCB3bmRQdHIsICZzaXplLCAmbHBQb3MtPnB0TWF4UG9zLCBOVUxMLCBOVUxMICk7CisKKwkJIGlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSApCisJCSB7CisJCSAgICAgV0lOUE9TX1Nob3dJY29uVGl0bGUoIHduZFB0ciwgRkFMU0UgKTsKKwkJICAgICB3bmRQdHItPmR3U3R5bGUgJj0gfldTX01JTklNSVpFOworCQkgfQorICAgICAgICAgICAgICAgICB3bmRQdHItPmR3U3R5bGUgfD0gV1NfTUFYSU1JWkU7CisKKwkJIFNldFJlY3QxNiggbHBSZWN0LCBscFBvcy0+cHRNYXhQb3MueCwgbHBQb3MtPnB0TWF4UG9zLnksCisJCQkJICAgIHNpemUueCwgc2l6ZS55ICk7CisJCSBicmVhazsKKworCSAgICBjYXNlIFNXX1JFU1RPUkU6CisJCSBpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgKQorCQkgeworCQkgICAgIHduZFB0ci0+ZHdTdHlsZSAmPSB+V1NfTUlOSU1JWkU7CisJCSAgICAgV0lOUE9TX1Nob3dJY29uVGl0bGUoIHduZFB0ciwgRkFMU0UgKTsKKwkJICAgICBpZiggd25kUHRyLT5mbGFncyAmIFdJTl9SRVNUT1JFX01BWCkKKwkJICAgICB7CisJCQkgLyogUmVzdG9yZSB0byBtYXhpbWl6ZWQgcG9zaXRpb24gKi8KKwkJCSBXSU5QT1NfR2V0TWluTWF4SW5mbyggd25kUHRyLCAmc2l6ZSwgJmxwUG9zLT5wdE1heFBvcywgTlVMTCwgTlVMTCApOworCQkJIHduZFB0ci0+ZHdTdHlsZSB8PSBXU19NQVhJTUlaRTsKKwkJICAgICB9CisJCSB9IAorCQkgZWxzZSAKKwkJICAgICBpZiggISh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRSkgKSByZXR1cm4gKFVJTlQxNikoLTEpOworIAkJICAgICBlbHNlIHduZFB0ci0+ZHdTdHlsZSAmPSB+V1NfTUFYSU1JWkU7CisKKwkJIC8qIFJlc3RvcmUgdG8gbm9ybWFsIHBvc2l0aW9uICovCisKKwkJKmxwUmVjdCA9IGxwUG9zLT5yZWN0Tm9ybWFsOyAKKwkJIGxwUmVjdC0+cmlnaHQgLT0gbHBSZWN0LT5sZWZ0OyAKKwkJIGxwUmVjdC0+Ym90dG9tIC09IGxwUmVjdC0+dG9wOworCisJCSBicmVhazsKKwl9CisgICAgfSBlbHNlIHN3cEZsYWdzIHw9IFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFOworICAgIHJldHVybiBzd3BGbGFnczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2hvd1dpbmRvdyAgIChVU0VSLjQyKQogICovCiBCT09MMTYgU2hvd1dpbmRvdzE2KCBIV05EMTYgaHduZCwgSU5UMTYgY21kICkgCkBAIC02MjksMTEgKzkxMCwxMCBAQAogICovCiBCT09MMzIgU2hvd1dpbmRvdzMyKCBIV05EMzIgaHduZCwgSU5UMzIgY21kICkgCiB7ICAgIAotICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7Ci0gICAgQk9PTDMyIHdhc1Zpc2libGUsIHNob3dGbGFnOwotICAgIFBPSU5UMTYgbWF4U2l6ZTsKLSAgICBpbnQgc3dwZmxhZ3MgPSAwOwotICAgIHNob3J0IHggPSAwLCB5ID0gMCwgY3ggPSAwLCBjeSA9IDA7CisgICAgV05EKiAJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICBCT09MMzIgCXdhc1Zpc2libGUsIHNob3dGbGFnOworICAgIFJFQ1QxNiAJbmV3UG9zID0gezAsIDAsIDAsIDB9OworICAgIGludCAJc3dwID0gMDsKIAogICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7CiAKQEAgLTY0NSwxMzkgKzkyNSw0OSBAQAogICAgIHsKICAgICAgICAgY2FzZSBTV19ISURFOgogICAgICAgICAgICAgaWYgKCF3YXNWaXNpYmxlKSByZXR1cm4gRkFMU0U7Ci0JICAgIHN3cGZsYWdzIHw9IFNXUF9ISURFV0lORE9XIHwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCAKKwkgICAgc3dwIHw9IFNXUF9ISURFV0lORE9XIHwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCAKIAkJICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUjsKIAkgICAgYnJlYWs7CiAKIAljYXNlIFNXX1NIT1dNSU5OT0FDVElWRToKLSAgICAgICAgICAgIHN3cGZsYWdzIHw9IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSOworICAgICAgICAgICAgc3dwIHw9IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSOwogICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBTV19TSE9XTUlOSU1JWkVEOgotICAgICAgICAgICAgc3dwZmxhZ3MgfD0gU1dQX1NIT1dXSU5ET1c7CisgICAgICAgICAgICBzd3AgfD0gU1dQX1NIT1dXSU5ET1c7CiAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFNXX01JTklNSVpFOgotICAgICAgICAgICAgc3dwZmxhZ3MgfD0gU1dQX0ZSQU1FQ0hBTkdFRDsKLSAgICAgICAgICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFKSkKLSAgICAgICAgICAgIHsKLQkJaWYoIEhPT0tfQ2FsbEhvb2tzMTYoIFdIX0NCVCwgSENCVF9NSU5NQVgsIGh3bmQsIGNtZCkgKQotCQkgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUFYSU1JWkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3bmRQdHItPmZsYWdzIHw9IFdJTl9SRVNUT1JFX01BWDsKLSAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5kd1N0eWxlICY9IH5XU19NQVhJTUlaRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5mbGFncyAmPSB+V0lOX1JFU1RPUkVfTUFYOwotICAgICAgICAgICAgICAgICAgICB3bmRQdHItPnJlY3ROb3JtYWwgPSB3bmRQdHItPnJlY3RXaW5kb3c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHduZFB0ci0+ZHdTdHlsZSB8PSBXU19NSU5JTUlaRTsKLSAgICAgICAgICAgICAgICBXSU5QT1NfRmluZEljb25Qb3MoIGh3bmQgKTsKLSAgICAgICAgICAgICAgICB4ICA9IHduZFB0ci0+cHRJY29uUG9zLng7Ci0gICAgICAgICAgICAgICAgeSAgPSB3bmRQdHItPnB0SWNvblBvcy55OwotICAgICAgICAgICAgICAgIGN4ID0gU1lTTUVUUklDU19DWElDT047Ci0gICAgICAgICAgICAgICAgY3kgPSBTWVNNRVRSSUNTX0NZSUNPTjsKLQkJc3dwZmxhZ3MgfD0gU1dQX05PQ09QWUJJVFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHN3cGZsYWdzIHw9IFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFOworICAgICAgICAgICAgc3dwIHw9IFNXUF9GUkFNRUNIQU5HRUQ7CisgICAgICAgICAgICBpZiggISh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkgKQorCQkgc3dwIHw9IFdJTlBPU19NaW5NYXhpbWl6ZSggd25kUHRyLCBTV19NSU5JTUlaRSwgJm5ld1BvcyApOworICAgICAgICAgICAgZWxzZSBzd3AgfD0gU1dQX05PU0laRSB8IFNXUF9OT01PVkU7CiAJICAgIGJyZWFrOwogCi0JY2FzZSBTV19TSE9XTUFYSU1JWkVEOiAvKiBzYW1lIGFzIFNXX01BWElNSVpFOiAqLwotICAgICAgICAgICAgc3dwZmxhZ3MgfD0gU1dQX1NIT1dXSU5ET1cgfCBTV1BfRlJBTUVDSEFOR0VEOwotICAgICAgICAgICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgV1NfTUFYSU1JWkUpKQotICAgICAgICAgICAgewotCQlpZiggSE9PS19DYWxsSG9va3MxNiggV0hfQ0JULCBIQ0JUX01JTk1BWCwgaHduZCwgY21kKSApCi0JCSAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGZpbmQgdGhlIG1heGltaXplZCBzaXplICovCi0gICAgICAgICAgICAgICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpKQotICAgICAgICAgICAgICAgICAgICB3bmRQdHItPnJlY3ROb3JtYWwgPSB3bmRQdHItPnJlY3RXaW5kb3c7IAotCi0gICAgICAgICAgICAgICAgTkNfR2V0TWluTWF4SW5mbyggd25kUHRyLCAmbWF4U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd25kUHRyLT5wdE1heFBvcywgTlVMTCwgTlVMTCApOwotICAgICAgICAgICAgICAgIHggID0gd25kUHRyLT5wdE1heFBvcy54OwotICAgICAgICAgICAgICAgIHkgID0gd25kUHRyLT5wdE1heFBvcy55OwotCi0JCWlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSApCi0JCSAgICBpZiggIVNlbmRNZXNzYWdlMzJBKCBod25kLCBXTV9RVUVSWU9QRU4sIDAsIDBMICkgKQotCQkJewotCQkgICAgICAgICBzd3BmbGFncyB8PSBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRTsKLQkJCSBicmVhazsKLQkJCX0KLQkJICAgIGVsc2Ugc3dwZmxhZ3MgfD0gU1dQX05PQ09QWUJJVFM7Ci0KLSAgICAgICAgICAgICAgICBjeCA9IG1heFNpemUueDsKLSAgICAgICAgICAgICAgICBjeSA9IG1heFNpemUueTsKLSAgICAgICAgICAgICAgICB3bmRQdHItPmR3U3R5bGUgJj0gfldTX01JTklNSVpFOwotICAgICAgICAgICAgICAgIHduZFB0ci0+ZHdTdHlsZSB8PSBXU19NQVhJTUlaRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2Ugc3dwZmxhZ3MgfD0gU1dQX05PU0laRSB8IFNXUF9OT01PVkU7CisJY2FzZSBTV19TSE9XTUFYSU1JWkVEOiAvKiBzYW1lIGFzIFNXX01BWElNSVpFICovCisgICAgICAgICAgICBzd3AgfD0gU1dQX1NIT1dXSU5ET1cgfCBTV1BfRlJBTUVDSEFOR0VEOworICAgICAgICAgICAgaWYoICEod25kUHRyLT5kd1N0eWxlICYgV1NfTUFYSU1JWkUpICkKKwkJIHN3cCB8PSBXSU5QT1NfTWluTWF4aW1pemUoIHduZFB0ciwgU1dfTUFYSU1JWkUsICZuZXdQb3MgKTsKKyAgICAgICAgICAgIGVsc2Ugc3dwIHw9IFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFOwogICAgICAgICAgICAgYnJlYWs7CiAKIAljYXNlIFNXX1NIT1dOQToKLSAgICAgICAgICAgIHN3cGZsYWdzIHw9IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSOworICAgICAgICAgICAgc3dwIHw9IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSOwogICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBTV19TSE9XOgotCSAgICBzd3BmbGFncyB8PSBTV1BfU0hPV1dJTkRPVyB8IFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFOworCSAgICBzd3AgfD0gU1dQX1NIT1dXSU5ET1cgfCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRTsKIAkgICAgYnJlYWs7CiAKIAljYXNlIFNXX1NIT1dOT0FDVElWQVRFOgotICAgICAgICAgICAgc3dwZmxhZ3MgfD0gU1dQX05PWk9SREVSOwotICAgICAgICAgICAgaWYgKEdldEFjdGl2ZVdpbmRvdzMyKCkpIHN3cGZsYWdzIHw9IFNXUF9OT0FDVElWQVRFOworICAgICAgICAgICAgc3dwIHw9IFNXUF9OT1pPUkRFUjsKKyAgICAgICAgICAgIGlmIChHZXRBY3RpdmVXaW5kb3czMigpKSBzd3AgfD0gU1dQX05PQUNUSVZBVEU7CiAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFNXX1NIT1dOT1JNQUw6ICAvKiBzYW1lIGFzIFNXX05PUk1BTDogKi8KIAljYXNlIFNXX1NIT1dERUZBVUxUOiAvKiBGSVhNRTogc2hvdWxkIGhhdmUgaXRzIG93biBoYW5kbGVyICovCiAJY2FzZSBTV19SRVNUT1JFOgotCSAgICBzd3BmbGFncyB8PSBTV1BfU0hPV1dJTkRPVyB8IFNXUF9GUkFNRUNIQU5HRUQ7CisJICAgIHN3cCB8PSBTV1BfU0hPV1dJTkRPVyB8IFNXUF9GUkFNRUNIQU5HRUQ7CiAKLSAgICAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkKLSAgICAgICAgICAgIHsKLQkJaWYoIEhPT0tfQ2FsbEhvb2tzMTYoIFdIX0NCVCwgSENCVF9NSU5NQVgsIGh3bmQsIGNtZCkgKQotCQkgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICBpZiggIVNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX1FVRVJZT1BFTiwgMCwgMEwpICkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3dwZmxhZ3MgfD0gU1dQX05PU0laRSB8IFNXUF9OT01PVkU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHduZFB0ci0+cHRJY29uUG9zLnggPSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKLSAgICAgICAgICAgICAgICB3bmRQdHItPnB0SWNvblBvcy55ID0gd25kUHRyLT5yZWN0V2luZG93LnRvcDsKLSAgICAgICAgICAgICAgICB3bmRQdHItPmR3U3R5bGUgJj0gfldTX01JTklNSVpFOwotICAgICAgICAgICAgICAgIGlmICh3bmRQdHItPmZsYWdzICYgV0lOX1JFU1RPUkVfTUFYKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSB0byBtYXhpbWl6ZWQgcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgTkNfR2V0TWluTWF4SW5mbyggd25kUHRyLCAmbWF4U2l6ZSwgJnduZFB0ci0+cHRNYXhQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwgKTsKLSAgICAgICAgICAgICAgICAgICAgeCAgPSB3bmRQdHItPnB0TWF4UG9zLng7Ci0gICAgICAgICAgICAgICAgICAgIHkgID0gd25kUHRyLT5wdE1heFBvcy55OwotICAgICAgICAgICAgICAgICAgICBjeCA9IG1heFNpemUueDsKLSAgICAgICAgICAgICAgICAgICAgY3kgPSBtYXhTaXplLnk7Ci0gICAgICAgICAgICAgICAgICAgd25kUHRyLT5kd1N0eWxlIHw9IFdTX01BWElNSVpFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlICAvKiBSZXN0b3JlIHRvIG5vcm1hbCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeCAgPSB3bmRQdHItPnJlY3ROb3JtYWwubGVmdDsKLSAgICAgICAgICAgICAgICAgICAgeSAgPSB3bmRQdHItPnJlY3ROb3JtYWwudG9wOwotICAgICAgICAgICAgICAgICAgICBjeCA9IHduZFB0ci0+cmVjdE5vcm1hbC5yaWdodCAtIHduZFB0ci0+cmVjdE5vcm1hbC5sZWZ0OwotICAgICAgICAgICAgICAgICAgICBjeSA9IHduZFB0ci0+cmVjdE5vcm1hbC5ib3R0b20gLSB3bmRQdHItPnJlY3ROb3JtYWwudG9wOwotICAgICAgICAgICAgICAgIH0KLQkJc3dwZmxhZ3MgfD0gU1dQX05PQ09QWUJJVFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRSkKLSAgICAgICAgICAgIHsKLQkJaWYoIEhPT0tfQ2FsbEhvb2tzMTYoIFdIX0NCVCwgSENCVF9NSU5NQVgsIGh3bmQsIGNtZCkgKQotCQkgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICB3bmRQdHItPnB0TWF4UG9zLnggPSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKLSAgICAgICAgICAgICAgICB3bmRQdHItPnB0TWF4UG9zLnkgPSB3bmRQdHItPnJlY3RXaW5kb3cudG9wOwotICAgICAgICAgICAgICAgIHduZFB0ci0+ZHdTdHlsZSAmPSB+V1NfTUFYSU1JWkU7Ci0gICAgICAgICAgICAgICAgeCAgPSB3bmRQdHItPnJlY3ROb3JtYWwubGVmdDsKLSAgICAgICAgICAgICAgICB5ICA9IHduZFB0ci0+cmVjdE5vcm1hbC50b3A7Ci0gICAgICAgICAgICAgICAgY3ggPSB3bmRQdHItPnJlY3ROb3JtYWwucmlnaHQgLSB3bmRQdHItPnJlY3ROb3JtYWwubGVmdDsKLSAgICAgICAgICAgICAgICBjeSA9IHduZFB0ci0+cmVjdE5vcm1hbC5ib3R0b20gLSB3bmRQdHItPnJlY3ROb3JtYWwudG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBzd3BmbGFncyB8PSBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRTsKKyAgICAgICAgICAgIGlmKCB3bmRQdHItPmR3U3R5bGUgJiAoV1NfTUlOSU1JWkUgfCBXU19NQVhJTUlaRSkgKQorCQkgc3dwIHw9IFdJTlBPU19NaW5NYXhpbWl6ZSggd25kUHRyLCBTV19SRVNUT1JFLCAmbmV3UG9zICk7CisgICAgICAgICAgICBlbHNlIHN3cCB8PSBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRTsKIAkgICAgYnJlYWs7CiAgICAgfQogCkBAIC03OTAsNyArOTgwLDcgQEAKIAogICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpICYmCiAgICAgICAgICFJc1dpbmRvd1Zpc2libGUzMiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmICkgJiYKLSAgICAgICAgKHN3cGZsYWdzICYgU1dQX05PU0laRSkgJiYgKHN3cGZsYWdzICYgU1dQX05PTU9WRSkpCisgICAgICAgIChzd3AgJiAoU1dQX05PU0laRSB8IFNXUF9OT01PVkUpKSA9PSAoU1dQX05PU0laRSB8IFNXUF9OT01PVkUpICkKICAgICB7CiAgICAgICAgIC8qIERvbid0IGNhbGwgU2V0V2luZG93UG9zMzIoKSBvbiBpbnZpc2libGUgY2hpbGQgd2luZG93cyAqLwogICAgICAgICBpZiAoY21kID09IFNXX0hJREUpIHduZFB0ci0+ZHdTdHlsZSAmPSB+V1NfVklTSUJMRTsKQEAgLTc5OSwxMCArOTg5LDExIEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgLyogV2UgY2FuJ3QgYWN0aXZhdGUgYSBjaGlsZCB3aW5kb3cgKi8KLSAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQotICAgICAgICAgICAgc3dwZmxhZ3MgfD0gU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVI7Ci0gICAgICAgIFNldFdpbmRvd1BvczMyKCBod25kLCBIV05EX1RPUCwgeCwgeSwgY3gsIGN5LCBzd3BmbGFncyApOworICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpIHN3cCB8PSBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUjsKKyAgICAgICAgU2V0V2luZG93UG9zMzIoIGh3bmQsIEhXTkRfVE9QLCAKKwkJCW5ld1Bvcy5sZWZ0LCBuZXdQb3MudG9wLCBuZXdQb3MucmlnaHQsIG5ld1Bvcy5ib3R0b20sIHN3cCApOwogICAgICAgICBpZiAoIUlzV2luZG93MzIoIGh3bmQgKSkgcmV0dXJuIHdhc1Zpc2libGU7CisJZWxzZSBpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgKSBXSU5QT1NfU2hvd0ljb25UaXRsZSggd25kUHRyLCBUUlVFICk7CiAgICAgfQogCiAgICAgaWYgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkVFRF9TSVpFKQpAQCAtODMwLDEwICsxMDIxLDEzIEBACiBVSU5UMTYgR2V0SW50ZXJuYWxXaW5kb3dQb3MxNiggSFdORDE2IGh3bmQsIExQUkVDVDE2IHJlY3RXbmQsIExQUE9JTlQxNiBwdEljb24pCiB7CiAgICAgV0lORE9XUExBQ0VNRU5UMTYgd25kcGw7Ci0gICAgaWYgKCFHZXRXaW5kb3dQbGFjZW1lbnQxNiggaHduZCwgJnduZHBsICkpIHJldHVybiAwOwotICAgIGlmIChyZWN0V25kKSAqcmVjdFduZCA9IHduZHBsLnJjTm9ybWFsUG9zaXRpb247Ci0gICAgaWYgKHB0SWNvbikgICpwdEljb24gPSB3bmRwbC5wdE1pblBvc2l0aW9uOwotICAgIHJldHVybiB3bmRwbC5zaG93Q21kOworICAgIGlmIChHZXRXaW5kb3dQbGFjZW1lbnQxNiggaHduZCwgJnduZHBsICkpIAorICAgIHsKKwlpZiAocmVjdFduZCkgKnJlY3RXbmQgPSB3bmRwbC5yY05vcm1hbFBvc2l0aW9uOworCWlmIChwdEljb24pICAqcHRJY29uID0gd25kcGwucHRNaW5Qb3NpdGlvbjsKKwlyZXR1cm4gd25kcGwuc2hvd0NtZDsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtODQzLDEwICsxMDM3LDE0MiBAQAogVUlOVDMyIEdldEludGVybmFsV2luZG93UG9zMzIoIEhXTkQzMiBod25kLCBMUFJFQ1QzMiByZWN0V25kLCBMUFBPSU5UMzIgcHRJY29uKQogewogICAgIFdJTkRPV1BMQUNFTUVOVDMyIHduZHBsOwotICAgIGlmICghR2V0V2luZG93UGxhY2VtZW50MzIoIGh3bmQsICZ3bmRwbCApKSByZXR1cm4gMDsKLSAgICBpZiAocmVjdFduZCkgKnJlY3RXbmQgPSB3bmRwbC5yY05vcm1hbFBvc2l0aW9uOwotICAgIGlmIChwdEljb24pICAqcHRJY29uID0gd25kcGwucHRNaW5Qb3NpdGlvbjsKLSAgICByZXR1cm4gd25kcGwuc2hvd0NtZDsKKyAgICBpZiAoR2V0V2luZG93UGxhY2VtZW50MzIoIGh3bmQsICZ3bmRwbCApKQorICAgIHsKKwlpZiAocmVjdFduZCkgKnJlY3RXbmQgPSB3bmRwbC5yY05vcm1hbFBvc2l0aW9uOworCWlmIChwdEljb24pICAqcHRJY29uID0gd25kcGwucHRNaW5Qb3NpdGlvbjsKKwlyZXR1cm4gd25kcGwuc2hvd0NtZDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFdpbmRvd1BsYWNlbWVudDE2ICAgKFVTRVIuMzcwKQorICovCitCT09MMTYgR2V0V2luZG93UGxhY2VtZW50MTYoIEhXTkQxNiBod25kLCBXSU5ET1dQTEFDRU1FTlQxNiAqd25kcGwgKQoreworICAgIFdORCAqcFduZCA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgaWYoIHBXbmQgKQorICAgIHsKKwlMUElOVEVSTkFMUE9TIGxwUG9zID0gKExQSU5URVJOQUxQT1MpV0lOUE9TX0luaXRJbnRlcm5hbFBvcyggcFduZCwKKwkJCSAgICAgKihMUFBPSU5UMTYpJnBXbmQtPnJlY3RXaW5kb3cubGVmdCwgJnBXbmQtPnJlY3RXaW5kb3cgKTsKKwl3bmRwbC0+bGVuZ3RoICA9IHNpemVvZigqd25kcGwpOworCWlmKCBwV25kLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgKQorCSAgICB3bmRwbC0+c2hvd0NtZCA9IFNXX1NIT1dNQVhJTUlaRUQ7CisJZWxzZSAKKwkgICAgd25kcGwtPnNob3dDbWQgPSAoIHBXbmQtPmR3U3R5bGUgJiBXU19NQVhJTUlaRSApCisJCQkgICAgID8gU1dfU0hPV01JTklNSVpFRCA6IFNXX1NIT1dOT1JNQUwgOworCWlmKCBwV25kLT5mbGFncyAmIFdJTl9SRVNUT1JFX01BWCApCisJICAgIHduZHBsLT5mbGFncyA9IFdQRl9SRVNUT1JFVE9NQVhJTUlaRUQ7CisJZWxzZQorCSAgICB3bmRwbC0+ZmxhZ3MgPSAwOworCXduZHBsLT5wdE1pblBvc2l0aW9uID0gbHBQb3MtPnB0SWNvblBvczsKKwl3bmRwbC0+cHRNYXhQb3NpdGlvbiA9IGxwUG9zLT5wdE1heFBvczsKKwl3bmRwbC0+cmNOb3JtYWxQb3NpdGlvbiA9IGxwUG9zLT5yZWN0Tm9ybWFsOworCXJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0V2luZG93UGxhY2VtZW50MzIgICAoVVNFUjMyLjMwNikKKyAqLworQk9PTDMyIEdldFdpbmRvd1BsYWNlbWVudDMyKCBIV05EMzIgaHduZCwgV0lORE9XUExBQ0VNRU5UMzIgKnB3cGwzMiApCit7CisgICAgaWYoIHB3cGwzMiApCisgICAgeworCVdJTkRPV1BMQUNFTUVOVDE2IHdwbDsKKwl3cGwubGVuZ3RoID0gc2l6ZW9mKHdwbCk7CisgICAgICAgIGlmKCBHZXRXaW5kb3dQbGFjZW1lbnQxNiggaHduZCwgJndwbCApICkKKwl7CisJICAgIHB3cGwzMi0+bGVuZ3RoID0gc2l6ZW9mKCpwd3BsMzIpOworCSAgICBwd3BsMzItPmZsYWdzID0gd3BsLmZsYWdzOworCSAgICBwd3BsMzItPnNob3dDbWQgPSB3cGwuc2hvd0NtZDsKKwkgICAgQ09OVl9QT0lOVDE2VE8zMiggJndwbC5wdE1pblBvc2l0aW9uLCAmcHdwbDMyLT5wdE1pblBvc2l0aW9uICk7CisJICAgIENPTlZfUE9JTlQxNlRPMzIoICZ3cGwucHRNYXhQb3NpdGlvbiwgJnB3cGwzMi0+cHRNYXhQb3NpdGlvbiApOworCSAgICBDT05WX1JFQ1QxNlRPMzIoICZ3cGwucmNOb3JtYWxQb3NpdGlvbiwgJnB3cGwzMi0+cmNOb3JtYWxQb3NpdGlvbiApOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXSU5QT1NfU2V0UGxhY2VtZW50CisgKi8KK3N0YXRpYyBCT09MMzIgV0lOUE9TX1NldFBsYWNlbWVudCggSFdORDMyIGh3bmQsIGNvbnN0IFdJTkRPV1BMQUNFTUVOVDE2ICp3bmRwbCwKKwkJCQkJCVVJTlQzMiBmbGFncyApCit7CisgICAgV05EICpwV25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICBpZiggcFduZCApCisgICAgeworCUxQSU5URVJOQUxQT1MgbHBQb3MgPSAoTFBJTlRFUk5BTFBPUylXSU5QT1NfSW5pdEludGVybmFsUG9zKCBwV25kLAorCQkJICAgICAqKExQUE9JTlQxNikmcFduZC0+cmVjdFdpbmRvdy5sZWZ0LCAmcFduZC0+cmVjdFdpbmRvdyApOworCisJaWYoIGZsYWdzICYgUExBQ0VfTUlOICkgbHBQb3MtPnB0SWNvblBvcyA9IHduZHBsLT5wdE1pblBvc2l0aW9uOworCWlmKCBmbGFncyAmIFBMQUNFX01BWCApIGxwUG9zLT5wdE1heFBvcyA9IHduZHBsLT5wdE1heFBvc2l0aW9uOworCWlmKCBmbGFncyAmIFBMQUNFX1JFQ1QpIGxwUG9zLT5yZWN0Tm9ybWFsID0gd25kcGwtPnJjTm9ybWFsUG9zaXRpb247CisKKwlpZiggcFduZC0+ZHdTdHlsZSAmIFdTX01JTklNSVpFICkKKwl7CisJICAgIFdJTlBPU19TaG93SWNvblRpdGxlKCBwV25kLCBGQUxTRSApOworCSAgICBpZiggd25kcGwtPmZsYWdzICYgV1BGX1NFVE1JTlBPU0lUSU9OICYmICFFTVBUWVBPSU5UKGxwUG9zLT5wdEljb25Qb3MpKQorCQlTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgbHBQb3MtPnB0SWNvblBvcy54LCBscFBvcy0+cHRJY29uUG9zLnksCisJCQkJMCwgMCwgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFICk7CisJfSAKKwllbHNlIGlmKCBwV25kLT5kd1N0eWxlICYgV1NfTUFYSU1JWkUgKQorCXsKKwkgICAgaWYoICFFTVBUWVBPSU5UKGxwUG9zLT5wdE1heFBvcykgKQorCQlTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgbHBQb3MtPnB0TWF4UG9zLngsIGxwUG9zLT5wdE1heFBvcy55LAorCQkJCTAsIDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9BQ1RJVkFURSApOworCX0KKwllbHNlIGlmKCBmbGFncyAmIFBMQUNFX1JFQ1QgKQorCQlTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgbHBQb3MtPnJlY3ROb3JtYWwubGVmdCwgbHBQb3MtPnJlY3ROb3JtYWwudG9wLAorCQkJCWxwUG9zLT5yZWN0Tm9ybWFsLnJpZ2h0IC0gbHBQb3MtPnJlY3ROb3JtYWwubGVmdCwKKwkJCQlscFBvcy0+cmVjdE5vcm1hbC5ib3R0b20gLSBscFBvcy0+cmVjdE5vcm1hbC50b3AsCisJCQkJU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUgKTsKKworCVNob3dXaW5kb3czMiggaHduZCwgd25kcGwtPnNob3dDbWQgKTsKKwlpZiggSXNXaW5kb3czMihod25kKSAmJiBwV25kLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgKQorCXsKKwkgICAgaWYoIHBXbmQtPmR3U3R5bGUgJiBXU19WSVNJQkxFICkgV0lOUE9TX1Nob3dJY29uVGl0bGUoIHBXbmQsIFRSVUUgKTsKKworCSAgICAvKiBTREs6IC4uLnZhbGlkIG9ubHkgdGhlIG5leHQgdGltZS4uLiAqLworCSAgICBpZiggd25kcGwtPmZsYWdzICYgV1BGX1JFU1RPUkVUT01BWElNSVpFRCApIHBXbmQtPmZsYWdzIHw9IFdJTl9SRVNUT1JFX01BWDsKKwl9CisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRXaW5kb3dQbGFjZW1lbnQxNiAgIChVU0VSLjM3MSkKKyAqLworQk9PTDE2IFNldFdpbmRvd1BsYWNlbWVudDE2KCBIV05EMTYgaHduZCwgY29uc3QgV0lORE9XUExBQ0VNRU5UMTYgKnduZHBsICkKK3sKKyAgICByZXR1cm4gV0lOUE9TX1NldFBsYWNlbWVudCggaHduZCwgd25kcGwsIFBMQUNFX01JTiB8IFBMQUNFX01BWCB8IFBMQUNFX1JFQ1QgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0V2luZG93UGxhY2VtZW50MzIgICAoVVNFUjMyLjUxOCkKKyAqLworQk9PTDMyIFNldFdpbmRvd1BsYWNlbWVudDMyKCBIV05EMzIgaHduZCwgY29uc3QgV0lORE9XUExBQ0VNRU5UMzIgKnB3cGwzMiApCit7CisgICAgaWYoIHB3cGwzMiApCisgICAgeworCVdJTkRPV1BMQUNFTUVOVDE2IHdwbCA9IHsgc2l6ZW9mKFdJTkRPV1BMQUNFTUVOVDE2KSwgCisJCXB3cGwzMi0+ZmxhZ3MsIHB3cGwzMi0+c2hvd0NtZCwgeyBwd3BsMzItPnB0TWluUG9zaXRpb24ueCwKKwkJcHdwbDMyLT5wdE1pblBvc2l0aW9uLnkgfSwgeyBwd3BsMzItPnB0TWF4UG9zaXRpb24ueCwKKwkJcHdwbDMyLT5wdE1heFBvc2l0aW9uLnkgfSwgeyBwd3BsMzItPnJjTm9ybWFsUG9zaXRpb24ubGVmdCwKKwkJcHdwbDMyLT5yY05vcm1hbFBvc2l0aW9uLnRvcCwgcHdwbDMyLT5yY05vcm1hbFBvc2l0aW9uLnJpZ2h0LAorCQlwd3BsMzItPnJjTm9ybWFsUG9zaXRpb24uYm90dG9tIH0gfTsKKworICAgICAgICByZXR1cm4gV0lOUE9TX1NldFBsYWNlbWVudCggaHduZCwgJndwbCwgUExBQ0VfTUlOIHwgUExBQ0VfTUFYIHwgUExBQ0VfUkVDVCApOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIApAQCAtODU2LDE2ICsxMTgyLDI4IEBACiB2b2lkIFNldEludGVybmFsV2luZG93UG9zMTYoIEhXTkQxNiBod25kLCBVSU5UMTYgc2hvd0NtZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSRUNUMTYgcmVjdCwgTFBQT0lOVDE2IHB0ICkKIHsKLSAgICBXSU5ET1dQTEFDRU1FTlQxNiB3bmRwbDsKLSAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgaWYoIElzV2luZG93MTYoaHduZCkgKQorICAgIHsKKwlXSU5ET1dQTEFDRU1FTlQxNiB3bmRwbDsKKwlVSU5UMzIgZmxhZ3M7CiAKLSAgICB3bmRwbC5sZW5ndGggID0gc2l6ZW9mKHduZHBsKTsKLSAgICB3bmRwbC5mbGFncyAgID0gKHB0ICE9IE5VTEwpID8gV1BGX1NFVE1JTlBPU0lUSU9OIDogMDsKLSAgICB3bmRwbC5zaG93Q21kID0gc2hvd0NtZDsKLSAgICBpZiAocHQpIHduZHBsLnB0TWluUG9zaXRpb24gPSAqcHQ7Ci0gICAgd25kcGwucmNOb3JtYWxQb3NpdGlvbiA9IChyZWN0ICE9IE5VTEwpID8gKnJlY3QgOiB3bmRQdHItPnJlY3ROb3JtYWw7Ci0gICAgd25kcGwucHRNYXhQb3NpdGlvbiA9IHduZFB0ci0+cHRNYXhQb3M7Ci0gICAgU2V0V2luZG93UGxhY2VtZW50MTYoIGh3bmQsICZ3bmRwbCApOworCXduZHBsLmxlbmd0aCAgPSBzaXplb2Yod25kcGwpOworCXduZHBsLnNob3dDbWQgPSBzaG93Q21kOworCXduZHBsLmZsYWdzID0gZmxhZ3MgPSAwOworCisJaWYoIHB0ICkKKwl7CisJICAgIGZsYWdzIHw9IFBMQUNFX01JTjsKKwkgICAgd25kcGwuZmxhZ3MgfD0gV1BGX1NFVE1JTlBPU0lUSU9OOworCSAgICB3bmRwbC5wdE1pblBvc2l0aW9uID0gKnB0OworCX0KKwlpZiggcmVjdCApCisJeworCSAgICBmbGFncyB8PSBQTEFDRV9SRUNUOworCSAgICB3bmRwbC5yY05vcm1hbFBvc2l0aW9uID0gKnJlY3Q7CisJfQorCVdJTlBPU19TZXRQbGFjZW1lbnQoIGh3bmQsICZ3bmRwbCwgZmxhZ3MgKTsKKyAgICB9CiB9CiAKIApAQCAtODc1LDkzICsxMjEzLDI4IEBACiB2b2lkIFNldEludGVybmFsV2luZG93UG9zMzIoIEhXTkQzMiBod25kLCBVSU5UMzIgc2hvd0NtZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSRUNUMzIgcmVjdCwgTFBQT0lOVDMyIHB0ICkKIHsKLSAgICBXSU5ET1dQTEFDRU1FTlQzMiB3bmRwbDsKLSAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgaWYoIElzV2luZG93MzIoaHduZCkgKQorICAgIHsKKwlXSU5ET1dQTEFDRU1FTlQxNiB3bmRwbDsKKwlVSU5UMzIgZmxhZ3M7CiAKLSAgICB3bmRwbC5sZW5ndGggID0gc2l6ZW9mKHduZHBsKTsKLSAgICB3bmRwbC5mbGFncyAgID0gKHB0ICE9IE5VTEwpID8gV1BGX1NFVE1JTlBPU0lUSU9OIDogMDsKLSAgICB3bmRwbC5zaG93Q21kID0gc2hvd0NtZDsKLSAgICBpZiAocHQpIHduZHBsLnB0TWluUG9zaXRpb24gPSAqcHQ7Ci0gICAgaWYgKHJlY3QpIHduZHBsLnJjTm9ybWFsUG9zaXRpb24gPSAqcmVjdDsKLSAgICBlbHNlIENPTlZfUkVDVDE2VE8zMiggJnduZFB0ci0+cmVjdE5vcm1hbCwgJnduZHBsLnJjTm9ybWFsUG9zaXRpb24gKTsKLSAgICBDT05WX1BPSU5UMTZUTzMyKCAmd25kUHRyLT5wdE1heFBvcywgJnduZHBsLnB0TWF4UG9zaXRpb24gKTsKLSAgICBTZXRXaW5kb3dQbGFjZW1lbnQzMiggaHduZCwgJnduZHBsICk7Ci19CisJd25kcGwubGVuZ3RoICA9IHNpemVvZih3bmRwbCk7CisJd25kcGwuc2hvd0NtZCA9IHNob3dDbWQ7CisJd25kcGwuZmxhZ3MgPSBmbGFncyA9IDA7CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0V2luZG93UGxhY2VtZW50MTYgICAoVVNFUi4zNzApCi0gKi8KLUJPT0wxNiBHZXRXaW5kb3dQbGFjZW1lbnQxNiggSFdORDE2IGh3bmQsIFdJTkRPV1BMQUNFTUVOVDE2ICp3bmRwbCApCi17Ci0gICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7Ci0KLSAgICB3bmRwbC0+bGVuZ3RoICA9IHNpemVvZigqd25kcGwpOwotICAgIHduZHBsLT5mbGFncyAgID0gMDsKLSAgICB3bmRwbC0+c2hvd0NtZCA9IElzWm9vbWVkMTYoaHduZCkgPyBTV19TSE9XTUFYSU1JWkVEIDogCi0JICAgICAgICAgICAgIChJc0ljb25pYzE2KGh3bmQpID8gU1dfU0hPV01JTklNSVpFRCA6IFNXX1NIT1dOT1JNQUwpOwotICAgIHduZHBsLT5wdE1pblBvc2l0aW9uID0gd25kUHRyLT5wdEljb25Qb3M7Ci0gICAgd25kcGwtPnB0TWF4UG9zaXRpb24gPSB3bmRQdHItPnB0TWF4UG9zOwotICAgIHduZHBsLT5yY05vcm1hbFBvc2l0aW9uID0gd25kUHRyLT5yZWN0Tm9ybWFsOwotICAgIHJldHVybiBUUlVFOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFdpbmRvd1BsYWNlbWVudDMyICAgKFVTRVIzMi4zMDYpCi0gKi8KLUJPT0wzMiBHZXRXaW5kb3dQbGFjZW1lbnQzMiggSFdORDMyIGh3bmQsIFdJTkRPV1BMQUNFTUVOVDMyICp3bmRwbCApCi17Ci0gICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7Ci0KLSAgICB3bmRwbC0+bGVuZ3RoICA9IHNpemVvZigqd25kcGwpOwotICAgIHduZHBsLT5mbGFncyAgID0gMDsKLSAgICB3bmRwbC0+c2hvd0NtZCA9IElzWm9vbWVkMzIoaHduZCkgPyBTV19TSE9XTUFYSU1JWkVEIDogCi0JICAgICAgICAgICAgIChJc0ljb25pYzMyKGh3bmQpID8gU1dfU0hPV01JTklNSVpFRCA6IFNXX1NIT1dOT1JNQUwpOwotICAgIENPTlZfUE9JTlQxNlRPMzIoICZ3bmRQdHItPnB0SWNvblBvcywgJnduZHBsLT5wdE1pblBvc2l0aW9uICk7Ci0gICAgQ09OVl9QT0lOVDE2VE8zMiggJnduZFB0ci0+cHRNYXhQb3MsICZ3bmRwbC0+cHRNYXhQb3NpdGlvbiApOwotICAgIENPTlZfUkVDVDE2VE8zMiggJnduZFB0ci0+cmVjdE5vcm1hbCwgJnduZHBsLT5yY05vcm1hbFBvc2l0aW9uICk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0V2luZG93UGxhY2VtZW50MTYgICAoVVNFUi4zNzEpCi0gKi8KLUJPT0wxNiBTZXRXaW5kb3dQbGFjZW1lbnQxNiggSFdORDE2IGh3bmQsIGNvbnN0IFdJTkRPV1BMQUNFTUVOVDE2ICp3bmRwbCApCi17Ci0gICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAod25kcGwtPmZsYWdzICYgV1BGX1NFVE1JTlBPU0lUSU9OKQotCXduZFB0ci0+cHRJY29uUG9zID0gd25kcGwtPnB0TWluUG9zaXRpb247Ci0gICAgaWYgKCh3bmRwbC0+ZmxhZ3MgJiBXUEZfUkVTVE9SRVRPTUFYSU1JWkVEKSAmJgotCSh3bmRwbC0+c2hvd0NtZCA9PSBTV19TSE9XTUlOSU1JWkVEKSkgd25kUHRyLT5mbGFncyB8PSBXSU5fUkVTVE9SRV9NQVg7Ci0gICAgd25kUHRyLT5wdE1heFBvcyAgID0gd25kcGwtPnB0TWF4UG9zaXRpb247Ci0gICAgd25kUHRyLT5yZWN0Tm9ybWFsID0gd25kcGwtPnJjTm9ybWFsUG9zaXRpb247Ci0gICAgU2hvd1dpbmRvdzE2KCBod25kLCB3bmRwbC0+c2hvd0NtZCApOwotICAgIHJldHVybiBUUlVFOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFdpbmRvd1BsYWNlbWVudDMyICAgKFVTRVIzMi41MTgpCi0gKi8KLUJPT0wzMiBTZXRXaW5kb3dQbGFjZW1lbnQzMiggSFdORDMyIGh3bmQsIGNvbnN0IFdJTkRPV1BMQUNFTUVOVDMyICp3bmRwbCApCi17Ci0gICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAod25kcGwtPmZsYWdzICYgV1BGX1NFVE1JTlBPU0lUSU9OKQotCUNPTlZfUE9JTlQzMlRPMTYoICZ3bmRwbC0+cHRNaW5Qb3NpdGlvbiwgJnduZFB0ci0+cHRJY29uUG9zICk7Ci0gICAgaWYgKCh3bmRwbC0+ZmxhZ3MgJiBXUEZfUkVTVE9SRVRPTUFYSU1JWkVEKSAmJgotCSh3bmRwbC0+c2hvd0NtZCA9PSBTV19TSE9XTUlOSU1JWkVEKSkgd25kUHRyLT5mbGFncyB8PSBXSU5fUkVTVE9SRV9NQVg7Ci0gICAgQ09OVl9QT0lOVDMyVE8xNiggJnduZHBsLT5wdE1heFBvc2l0aW9uLCAmd25kUHRyLT5wdE1heFBvcyApOwotICAgIENPTlZfUkVDVDMyVE8xNiggJnduZHBsLT5yY05vcm1hbFBvc2l0aW9uLCAmd25kUHRyLT5yZWN0Tm9ybWFsICk7Ci0gICAgU2hvd1dpbmRvdzMyKCBod25kLCB3bmRwbC0+c2hvd0NtZCApOwotICAgIHJldHVybiBUUlVFOworCWlmKCBwdCApCisJeworICAgICAgICAgICAgZmxhZ3MgfD0gUExBQ0VfTUlOOworICAgICAgICAgICAgd25kcGwuZmxhZ3MgfD0gV1BGX1NFVE1JTlBPU0lUSU9OOworICAgICAgICAgICAgQ09OVl9QT0lOVDMyVE8xNiggcHQsICZ3bmRwbC5wdE1pblBvc2l0aW9uICk7CisJfQorCWlmKCByZWN0ICkKKwl7CisgICAgICAgICAgICBmbGFncyB8PSBQTEFDRV9SRUNUOworICAgICAgICAgICAgQ09OVl9SRUNUMzJUTzE2KCByZWN0LCAmd25kcGwucmNOb3JtYWxQb3NpdGlvbiApOworCX0KKyAgICAgICAgV0lOUE9TX1NldFBsYWNlbWVudCggaHduZCwgJnduZHBsLCBmbGFncyApOworICAgIH0KIH0KIAogCkBAIC0xMDAwLDIyICsxMjczLDIyIEBACiAgKi8KIEJPT0wzMiBXSU5QT1NfU2V0QWN0aXZlV2luZG93KCBIV05EMzIgaFduZCwgQk9PTDMyIGZNb3VzZSwgQk9PTDMyIGZDaGFuZ2VGb2N1cykKIHsKLSAgICBXTkQgICAgICAgICAgICAgICAgICAgKnduZFB0ciAgICAgICAgICA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwotICAgIFdORCAgICAgICAgICAgICAgICAgICAqd25kVGVtcCAgICAgICAgID0gV0lOX0ZpbmRXbmRQdHIoaHduZEFjdGl2ZSk7Ci0gICAgQ0JUQUNUSVZBVEVTVFJVQ1QxNiAgICpjYnRTdHJ1Y3Q7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICB3SWNvbml6ZWQ9MDsKLSAgICBIUVVFVUUxNiBoT2xkQWN0aXZlUXVldWUgPSAocEFjdGl2ZVF1ZXVlKT9wQWN0aXZlUXVldWUtPnNlbGY6MDsKLSAgICBIUVVFVUUxNiBoTmV3QWN0aXZlUXVldWU7CisgICAgQ0JUQUNUSVZBVEVTVFJVQ1QxNiogY2J0U3RydWN0OworICAgIFdORCogICAgIHduZFB0ciwgKnduZFRlbXA7CisgICAgSFFVRVVFMTYgaE9sZEFjdGl2ZVF1ZXVlLCBoTmV3QWN0aXZlUXVldWU7CisgICAgV09SRCAgICAgd0ljb25pemVkID0gMDsKIAogICAgIC8qIHBhcmFub2lkIGNoZWNrcyAqLwotICAgIGlmKCBoV25kID09IEdldERlc2t0b3BXaW5kb3czMigpIHx8IGhXbmQgPT0gaHduZEFjdGl2ZSApCi0JcmV0dXJuIDA7CisgICAgaWYoIGhXbmQgPT0gR2V0RGVza3RvcFdpbmRvdzMyKCkgfHwgaFduZCA9PSBod25kQWN0aXZlICkgcmV0dXJuIDA7CiAKIC8qIGlmICh3bmRQdHIgJiYgKEdldFRhc2tRdWV1ZSgwKSAhPSB3bmRQdHItPmhtZW1UYXNrUSkpCiAJcmV0dXJuIDA7CiAgICAgICAgICovCiAKLSAgICBpZiggd25kVGVtcCApCisgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisgICAgaE9sZEFjdGl2ZVF1ZXVlID0gKHBBY3RpdmVRdWV1ZSk/cEFjdGl2ZVF1ZXVlLT5zZWxmIDogMDsKKworICAgIGlmKCAod25kVGVtcCA9IFdJTl9GaW5kV25kUHRyKGh3bmRBY3RpdmUpKSApCiAJd0ljb25pemVkID0gSElXT1JEKHduZFRlbXAtPmR3U3R5bGUgJiBXU19NSU5JTUlaRSk7CiAgICAgZWxzZQogCWRwcmludGZfd2luKHN0ZGRlYiwiV0lOUE9TX0FjdGl2YXRlV2luZG93OiBubyBjdXJyZW50IGFjdGl2ZSB3aW5kb3cuXG4iKTsKQEAgLTEwNjMsMTUgKzEzMzYsOCBAQAogICAgIGlmIChoV25kICYmIFNlbmRNZXNzYWdlMTYoIGhXbmQsIFdNX1FVRVJZTkVXUEFMRVRURSwgMCwgMEwpKQogCVNlbmRNZXNzYWdlMTYoKEhXTkQxNiktMSwgV01fUEFMRVRURUlTQ0hBTkdJTkcsIChXUEFSQU0xNiloV25kLCAwTCApOwogCi0gICAgLyogaWYgcHJldiB3bmQgaXMgbWluaW1pemVkIHJlZHJhdyBpY29uIHRpdGxlIAotICBpZiggaHduZFByZXZBY3RpdmUgKQotICAgIHsKLSAgICAgICAgd25kVGVtcCA9IFdJTl9GaW5kV25kUHRyKCBXSU5fR2V0VG9wUGFyZW50KCBod25kUHJldkFjdGl2ZSApICk7Ci0gICAgICAgIGlmKHduZFRlbXApCi0gICAgICAgICAgaWYod25kVGVtcC0+ZHdTdHlsZSAmIFdTX01JTklNSVpFKQotICAgICAgICAgICAgUmVkcmF3SWNvblRpdGxlKGh3bmRQcmV2QWN0aXZlKTsgCi0gICAgICB9IAotICAqLworICAgIC8qIGlmIHByZXYgd25kIGlzIG1pbmltaXplZCByZWRyYXcgaWNvbiB0aXRsZSAqLworICAgIGlmKCBJc0ljb25pYzMyKCBod25kUHJldkFjdGl2ZSApICkgV0lOUE9TX1JlZHJhd0ljb25UaXRsZShod25kUHJldkFjdGl2ZSk7CiAKICAgICAvKiBtYW5hZ2VkIHdpbmRvd3Mgd2lsbCBnZXQgQ29uZmlndXJlTm90aWZ5IGV2ZW50ICovICAKICAgICBpZiAod25kUHRyICYmICEod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpICYmICEod25kUHRyLT5mbGFncyAmIFdJTl9NQU5BR0VEKSkKQEAgLTEwOTMsNyArMTM1OSw3IEBACiAgICAgewogICAgICAgICBXTkQgKipsaXN0LCAqKnBwV25kOwogCi0gICAgICAgIGlmICgobGlzdCA9IFdJTl9CdWlsZFdpbkFycmF5KCBXSU5fR2V0RGVza3RvcCgpICkpKQorICAgICAgICBpZiAoKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggV0lOX0dldERlc2t0b3AoKSwgMCwgTlVMTCApKSkKICAgICAgICAgewogICAgICAgICAgICAgZm9yIChwcFduZCA9IGxpc3Q7ICpwcFduZDsgcHBXbmQrKykKICAgICAgICAgICAgIHsKQEAgLTExMDksNyArMTM3NSw3IEBACiAJcEFjdGl2ZVF1ZXVlID0gKGhOZXdBY3RpdmVRdWV1ZSkKIAkJICAgICAgID8gKE1FU1NBR0VRVUVVRSopIEdsb2JhbExvY2sxNihoTmV3QWN0aXZlUXVldWUpIDogTlVMTDsKIAotICAgICAgICBpZiAoKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggV0lOX0dldERlc2t0b3AoKSApKSkKKyAgICAgICAgaWYgKChsaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoIFdJTl9HZXREZXNrdG9wKCksIDAsIE5VTEwgKSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAocHBXbmQgPSBsaXN0OyAqcHBXbmQ7IHBwV25kKyspCiAgICAgICAgICAgICB7CkBAIC0xMTU2LDE0ICsxNDIyLDkgQEAKIAkgd25kUHRyLT53aW5kb3cgJiYgISh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpICkKIAlXSU5QT1NfRm9yY2VYV2luZG93UmFpc2Uod25kUHRyKTsKIAotICAgIC8qIGlmIGFjdGl2ZSB3bmQgaXMgbWluaW1pemVkIHJlZHJhdyBpY29uIHRpdGxlIAotICBpZiggaHduZEFjdGl2ZSApCi0gICAgICB7Ci0gICAgICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmRBY3RpdmUpOwotICAgICAgICBpZih3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkKLSAgICAgICAgICAgUmVkcmF3SWNvblRpdGxlKGh3bmRBY3RpdmUpOwotICAgIH0KLSAgKi8KKyAgICAvKiBpZiBhY3RpdmUgd25kIGlzIG1pbmltaXplZCByZWRyYXcgaWNvbiB0aXRsZSAqLworICAgIGlmKCBJc0ljb25pYzMyKGh3bmRBY3RpdmUpICkgV0lOUE9TX1JlZHJhd0ljb25UaXRsZShod25kQWN0aXZlKTsKKwogICAgIHJldHVybiAoaFduZCA9PSBod25kQWN0aXZlKTsKIH0KIApAQCAtMTE4NSwxNCArMTQ0NiwxNCBAQAogICAgICAgcmV0dXJuIDA7CiAKICAgaWYoIHBXbmQtPmR3U3R5bGUgJiBXU19QT1BVUCAmJgotICAgICAgV0lOUE9TX0lzR29vZEVub3VnaCggcFduZC0+b3duZXIgKSApIHBXbmRUbyA9IHBXbmQtPm93bmVyOworICAgICAgV0lOUE9TX0NhbkFjdGl2YXRlKCBwV25kLT5vd25lciApICkgcFduZFRvID0gcFduZC0+b3duZXI7CiAgIGVsc2UKICAgewogICAgIFdORCogcFduZFB0ciA9IHBXbmQ7CiAKICAgICBwV25kVG8gPSBXSU5fRmluZFduZFB0cihod25kUHJldkFjdGl2ZSk7CiAKLSAgICB3aGlsZSggIVdJTlBPU19Jc0dvb2RFbm91Z2gocFduZFRvKSApIAorICAgIHdoaWxlKCAhV0lOUE9TX0NhbkFjdGl2YXRlKHBXbmRUbykgKSAKICAgICB7CiAgICAgICAvKiBieSBub3cgb3duZWQgd2luZG93cyBzaG91bGQndmUgYmVlbiB0YWtlbiBjYXJlIG9mICovCiAKQEAgLTEyOTYsNyArMTU1Nyw3IEBACiAgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19USElDS0ZSQU1FKSB8fAogCSgod25kUHRyLT5kd1N0eWxlICYgKFdTX1BPUFVQIHwgV1NfQ0hJTEQpKSA9PSAwKSkKICAgICB7Ci0JTkNfR2V0TWluTWF4SW5mbyggd25kUHRyLCAmbWF4U2l6ZSwgTlVMTCwgTlVMTCwgTlVMTCApOworCVdJTlBPU19HZXRNaW5NYXhJbmZvKCB3bmRQdHIsICZtYXhTaXplLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAJd2lucG9zLT5jeCA9IE1JTiggd2lucG9zLT5jeCwgbWF4U2l6ZS54ICk7CiAJd2lucG9zLT5jeSA9IE1JTiggd2lucG9zLT5jeSwgbWF4U2l6ZS55ICk7CiAgICAgfQpAQCAtMTMxNiw3ICsxNTc3LDcgQEAKICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1RISUNLRlJBTUUpIHx8CiAJKCh3bmRQdHItPmR3U3R5bGUgJiAoV1NfUE9QVVAgfCBXU19DSElMRCkpID09IDApKQogICAgIHsKLQlOQ19HZXRNaW5NYXhJbmZvKCB3bmRQdHIsICZtYXhTaXplLCBOVUxMLCBOVUxMLCBOVUxMICk7CisJV0lOUE9TX0dldE1pbk1heEluZm8oIHduZFB0ciwgJm1heFNpemUsIE5VTEwsIE5VTEwsIE5VTEwgKTsKIAl3aW5wb3MtPmN4ID0gTUlOKCB3aW5wb3MtPmN4LCBtYXhTaXplLnggKTsKIAl3aW5wb3MtPmN5ID0gTUlOKCB3aW5wb3MtPmN5LCBtYXhTaXplLnkgKTsKICAgICB9CkBAIC0xNDU5LDYgKzE3MjAsOSBAQAogICogdmlzaWJsZSByZWdpb25zIGFyZSBpbiB3aW5kb3cgY29vcmRpbmF0ZXMKICAqIHVwZGF0ZSByZWdpb25zIGFyZSBpbiB3aW5kb3cgY2xpZW50IGNvb3JkaW5hdGVzCiAgKiBjbGllbnQgYW5kIHdpbmRvdyByZWN0YW5nbGVzIGFyZSBpbiBwYXJlbnQgY2xpZW50IGNvb3JkaW5hdGVzCisgKgorICogRklYTUU6IE1vdmUgdmlzaWJsZSBhbmQgdXBkYXRlIHJlZ2lvbnMgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZSBzeXN0ZW0KKyAqCSAoZWl0aGVyIHBhcmVudCBjbGllbnQgb3Igd2luZG93KS4gVGhpcyBpcyBhIGxvdCBvZiB3b3JrIHRob3VnaC4KICAqLwogc3RhdGljIFVJTlQzMiBXSU5QT1NfU2l6ZU1vdmVDbGVhbihXTkQqIFduZCwgSFJHTjMyIG9sZFZpc1JnbiwgTFBSRUNUMTYgbHBPbGRXbmRSZWN0LCBMUFJFQ1QxNiBscE9sZENsaWVudFJlY3QsIFVJTlQzMiB1RmxhZ3MgKQogewpAQCAtMjAzMCw3ICsyMjk0LDggQEAKIAogICAgIGlmICh3bmRQdHItPndpbmRvdykgRVZFTlRfU3luY2hyb25pemUoKTsgIC8qIFdhaXQgZm9yIGFsbCBleHBvc2UgZXZlbnRzICovCiAKLSAgICBFVkVOVF9EdW1teU1vdGlvbk5vdGlmeSgpOyAvKiBTaW11bGF0ZSBhIG1vdXNlIGV2ZW50IHRvIHNldCB0aGUgY3Vyc29yICovCisgICAgaWYgKCFHZXRDYXB0dXJlMzIoKSkKKyAgICAgICAgRVZFTlRfRHVtbXlNb3Rpb25Ob3RpZnkoKTsgLyogU2ltdWxhdGUgYSBtb3VzZSBldmVudCB0byBzZXQgdGhlIGN1cnNvciAqLwogCiAgICAgaWYgKCEoZmxhZ3MgJiBTV1BfREVGRVJFUkFTRSkgJiYgISh1RmxhZ3MgJiBTTUNfTk9QQVJFTlRFUkFTRSkgKQogICAgIHsKZGlmZiAtLWdpdCBhL3dpbmUuaW5pIGIvd2luZS5pbmkKaW5kZXggYjEyMWUyNy4uMWVmZjc5MyAxMDA2NDQKLS0tIGEvd2luZS5pbmkKKysrIGIvd2luZS5pbmkKQEAgLTMxLDYgKzMxLDEyIEBACiBUeXBlPWhkCiBMYWJlbD1UbXAgRHJpdmUKIAorW0RyaXZlIEZdCitQYXRoPSR7SE9NRX0KK1R5cGU9bmV0d29yaworTGFiZWw9SG9tZQorRmlsZXN5c3RlbT11bml4CisKIFt3aW5lXQogV2luZG93cz1jOlx3aW5kb3dzCiBTeXN0ZW09Yzpcd2luZG93c1xzeXN0ZW0KQEAgLTQyLDE3ICs0OCwxMSBAQAogQWxsb2NTeXN0ZW1Db2xvcnM9MTAwCiAKIFtmb250c10KLXN5c3RlbT0qLWhlbHZldGljYQotbXNzYW5zc2VyaWY9Ki1oZWx2ZXRpY2EKLW1zc2VyaWY9Ki10aW1lcwotY291cmllciBuZXc9YWRvYmUtY291cmllcgotdGltZXMgbmV3IHJvbWFuPWFkb2JlLXRpbWVzCi1zeW1ib2w9YWRvYmUtc3ltYm9sCi1maXhlZHN5cz0qLWZpeGVkCi1hcmlhbD0qLWhlbHZldGljYQotaGVsdj0qLWhlbHZldGljYQotcm9tYW49Ki10aW1lcwotZGVmYXVsdD0qLSoKKzsgc2VlIGRvY3VtZW50YXRpb24vZm9udHMKKztBbGlhczAgPSBTeXN0ZW0sIC0taW50ZXJuYXRpb25hbC0KKztBbGlhczEgPSBNUyBTYW5zIFNlcmlmLCAtYWRvYmUtaGVsdmV0aWNhLQorO0FsaWFzMiA9IEFyaWFsLCAtYWRvYmUtaGVsdmV0aWNhLSwgc3Vic3QKKztBbGlhczMgPSBUaW1lcyBOZXcgUm9tYW4sIC1hZG9iZS10aW1lcy0sIHN1YnN0CiAKIFtzZXJpYWxwb3J0c10KIENvbTE9L2Rldi9jdWEwCkBAIC02Myw1ICs2MywxNCBAQAogW3BhcmFsbGVscG9ydHNdCiBMcHQxPS9kZXYvbHAwCiAKK1tzcG9vbGVyXQorTFBUMTo9fGxwcgorTFBUMjo9fGdzIC1zREVWSUNFPWJqMjAwIC1zT3V0cHV0RmlsZT0vdG1wL2ZyZWQgLXEgLQorTFBUMzo9L2Rldi9scDMKKworW3BvcnRzXQorO3JlYWQ9MHg3NzksMHgzNzksMHgyODAtMHgyYTAKKzt3cml0ZT0weDc3OSwweDM3OSwweDI4MC0weDJhMAorCiBbc3B5XQogRXhjbHVkZT1XTV9TSVpFO1dNX1RJTUVSOwo=