ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA2MTkzZTAwLi41NWMyOWMxIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjkgQEAKIAotCQlDaGFuZ2VMb2cgZmlsZSBmb3IgemxpYgorICAgICAgICAgICAgICAgIENoYW5nZUxvZyBmaWxlIGZvciB6bGliCitDaGFuZ2VzIGluIDEuMi4wLjEgKDE3IE1hcmNoIDIwMDMpCistIEFkZCBaX1JMRSBzdHJhdGVneSBmb3IgcnVuLWxlbmd0aCBlbmNvZGluZyBbVHJ1dGFdCisgICAgLSBXaGVuIFpfUkxFIHJlcXVlc3RlZCwgcmVzdHJpY3QgbWF0Y2hlcyB0byBkaXN0YW5jZSBvbmUKKyAgICAtIFVwZGF0ZSB6bGliLmgsIG1pbmlnemlwLmMsIGd6b3BlbigpLCBnemRvcGVuKCkgZm9yIFpfUkxFCistIENvcnJlY3QgRkFTVEVTVCBjb21waWxhdGlvbiB0byBhbGxvdyBsZXZlbCA9PSAwCistIENsZWFuIHVwIHdoYXQgZ2V0cyBjb21waWxlZCBmb3IgRkFTVEVTVAorLSBJbmNvcnBvcmF0ZSBjaGFuZ2VzIHRvIHpjb25mLmluLmggW1ZvbGxhbnRdCisgICAgLSBSZWZpbmUgZGV0ZWN0aW9uIG9mIFR1cmJvIEMgbmVlZCBmb3IgZHVtbXkgcmV0dXJucworICAgIC0gUmVmaW5lIFpMSUJfRExMIGNvbXBpbGF0aW9uCisgICAgLSBJbmNsdWRlIGFkZGl0aW9uYWwgaGVhZGVyIGZpbGUgb24gVk1TIGZvciBvZmZfdCB0eXBlZGVmCistIFRyeSB0byB1c2UgX3ZzbnByaW50ZiB3aGVyZSBpdCBzdXBwbGFudHMgdnNwcmludGYgW1ZvbGxhbnRdCistIEFkZCBzb21lIGNhc3RzIGluIGluZmZhc3QuYworLSBFbmNoYW5jZSBjb21tZW50cyBpbiB6bGliLmggb24gd2hhdCBoYXBwZW5zIGlmIHRoZSBnenByaW50ZigpIHRyaWVzIHRvCisgIHdyaXRlIG1vcmUgdGhhbiA0MDk1IGJ5dGVzIGJlZm9yZSBjb21wcmVzc2lvbgorLSBSZW1vdmUgdW51c2VkIHN0YXRlIGZyb20gaW5mbGF0ZUJhY2tFbmQoKQorLSBSZW1vdmUgZXhpdCgwKSBmcm9tIG1pbmlnemlwLmMsIGV4YW1wbGUuYworLSBHZXQgcmlkIG9mIGFsbCB0aG9zZSBkYXJuIHRhYnMKKy0gQWRkICJjaGVjayIgdGFyZ2V0IHRvIE1ha2VmaWxlLmluIHRoYXQgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyAidGVzdCIKKy0gQWRkICJtb3N0bHljbGVhbiIgYW5kICJtYWludGFpbmVyLWNsZWFuIiB0YXJnZXRzIHRvIE1ha2VmaWxlLmluCistIFVwZGF0ZSBjb250cmliL2luZmxhdGU4NiBbQW5kZXJzb25dCistIFVwZGF0ZSBjb250cmliL3Rlc3R6bGliLCBjb250cmliL3ZzdHVkaW8sIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KKy0gQWRkIG1zZG9zIGFuZCB3aW4zMiBkaXJlY3RvcmllcyB3aXRoIG1ha2VmaWxlcyBbVHJ1dGFdCistIE1vcmUgYWRkaXRpb25zIGFuZCBpbXByb3ZlbWVudHMgdG8gdGhlIEZBUQorCiBDaGFuZ2VzIGluIDEuMi4wICg5IE1hcmNoIDIwMDMpCiAtIE5ldyBhbmQgaW1wcm92ZWQgaW5mbGF0ZSBjb2RlCiAgICAgLSBBYm91dCAyMCUgZmFzdGVyCkBAIC0yMzYsMTMgKzI2MCwxMyBAQAogLSBhZGRlZCBNYWtlZmlsZS5udCAodGhhbmtzIHRvIFN0ZXBoZW4gV2lsbGlhbXMpCiAtIGFkZGVkIHRoZSB1bnN1cHBvcnRlZCAiY29udHJpYiIgZGlyZWN0b3J5OgogICAgY29udHJpYi9hc20zODYvIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KLQkzODYgYXNtIGNvZGUgcmVwbGFjaW5nIGxvbmdlc3RfbWF0Y2goKS4KKyAgICAgICAgMzg2IGFzbSBjb2RlIHJlcGxhY2luZyBsb25nZXN0X21hdGNoKCkuCiAgICBjb250cmliL2lvc3RyZWFtLyBieSBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KICAgICAgICAgQSBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGd6KiBmdW5jdGlvbnMKICAgIGNvbnRyaWIvaW9zdHJlYW0yLyAgYnkgVHlnZSBM+HZzZXQgPFR5Z2UuTG92c2V0QGNtci5ubz4KLQlBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKKyAgICAgICAgQW5vdGhlciBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlCiAgICBjb250cmliL3VudGd6LyAgYnkgIlBlZHJvIEEuIEFyYW5kYSBHdXRpXGlycmV6IiA8cGFhZ0B0aWQuZXM+Ci0JQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYgorICAgICAgICBBIHZlcnkgc2ltcGxlIHRhci5neiBmaWxlIGV4dHJhY3RvciB1c2luZyB6bGliCiAgICBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgYnkgQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4KICAgICAgICAgSG93IHRvIHVzZSBjb21wcmVzcygpLCB1bmNvbXByZXNzKCkgYW5kIHRoZSBneiogZnVuY3Rpb25zIGZyb20gVkIuCiAtIHBhc3MgcGFyYW1zIC1mIChmaWx0ZXJlZCBkYXRhKSwgLWggKGh1ZmZtYW4gb25seSksIC0xIHRvIC05IChjb21wcmVzc2lvbgpAQCAtMjY5LDcgKzI5Myw3IEBACiAtIGFkZCBORUVEX0RVTU1ZX1JFVFVSTiBmb3IgQm9ybGFuZAogLSB1c2UgdmFyaWFibGUgel92ZXJib3NlIGZvciB0cmFjaW5nIGluIGRlYnVnIG1vZGUgKEwuIFBldGVyIERldXRzY2gpLgogLSBhbGxvdyBjb21waWxhdGlvbiB3aXRoIENDCi0tIGRlZmluZWQgU1REQyBmb3IgT1MvMiAoRGF2aWQgQ2hhcmxhcCkJCistIGRlZmluZWQgU1REQyBmb3IgT1MvMiAoRGF2aWQgQ2hhcmxhcCkKIC0gbGltaXQgZXh0ZXJuYWwgbmFtZXMgdG8gOCBjaGFycyBmb3IgTVZTIChUaG9tYXMgTHVuZCkKIC0gaW4gbWluaWd6aXAuYywgdXNlIHN0YXRpYyBidWZmZXJzIG9ubHkgZm9yIDE2LWJpdCBzeXN0ZW1zCiAtIGZpeCBzdWZmaXggY2hlY2sgZm9yICJtaW5pZ3ppcCAtZCBmb28uZ3oiCmRpZmYgLS1naXQgYS9GQVEgYi9GQVEKaW5kZXggYWJmNjgwYy4uMmE4MjQ3YyAxMDA2NDQKLS0tIGEvRkFRCisrKyBiL0ZBUQpAQCAtMSw1ICsxLDUgQEAKIAotCQlGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBhYm91dCB6bGliCisgICAgICAgICAgICAgICAgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgemxpYgogCiAKIElmIHlvdXIgcXVlc3Rpb24gaXMgbm90IHRoZXJlLCBwbGVhc2UgY2hlY2sgdGhlIHpsaWIgaG9tZSBwYWdlIApAQCAtOTAsMTMgKzkwLDE0IEBACiAgICAgLi9jb25maWd1cmUgLXMKICAgICBtYWtlCiAKLTE0LiBXaHkgZG9lcyAibWFrZSB0ZXN0IiBmYWlsIG9uIE1hYyBPUyBYPworMTQuIEhvdyBkbyBJIGluc3RhbGwgYSBzaGFyZWQgemxpYiBsaWJyYXJ5IG9uIFVuaXg/CiAKLSAgICBNYWMgT1MgWCBhbHJlYWR5IGluY2x1ZGVzIHpsaWIgYXMgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHNvIC1seiBsaW5rcyB0aGUKLSAgICBzaGFyZWQgbGlicmFyeSBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhhdCB0aGUgIm1ha2UiIGNvbXBpbGVkLiBUaGUgdHdvIGFyZQotICAgIGluY29tcGF0aWJsZSBkdWUgdG8gZGlmZmVyZW50IGNvbXBpbGUtdGltZSBvcHRpb25zLiBTaW1wbHkgY2hhbmdlIHRoZSAtbHoKLSAgICBpbiB0aGUgTWFrZWZpbGUgdG8gbGliei5hLCBhbmQgaXQgd2lsbCB1c2UgdGhlIGNvbXBpbGVkIGxpYnJhcnkgaW5zdGVhZAotICAgIG9mIHRoZSBzaGFyZWQgb25lIGFuZCB0aGUgIm1ha2UgdGVzdCIgd2lsbCBzdWNjZWVkLgorICAgIG1ha2UgaW5zdGFsbAorCisgICAgSG93ZXZlciwgbWFueSBmbGF2b3JzIG9mIFVuaXggY29tZSB3aXRoIGEgc2hhcmVkIHpsaWIgYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgQmVmb3JlIGdvaW5nIHRvIHRoZSB0cm91YmxlIG9mIGNvbXBpbGluZyBhIHNoYXJlZCB2ZXJzaW9uIG9mIHpsaWIgYW5kCisgICAgdHJ5aW5nIHRvIGluc3RhbGwgaXQsIHlvdSBtYXkgd2FudCB0byBjaGVjayBpZiBpdCdzIGFscmVhZHkgdGhlcmUhIElmIHlvdQorICAgIGNhbiAjaW5jbHVkZSA8emxpYi5oPiwgaXQncyB0aGVyZS4gVGhlIC1seiBvcHRpb24gd2lsbCBwcm9iYWJseSBsaW5rIHRvIGl0LgogCiAxNS4gSSBoYXZlIGEgcXVlc3Rpb24gYWJvdXQgT3R0b1BERgogCkBAIC0xMDgsOCArMTA5LDggQEAKICAgICBUaGUgY29tcHJlc3MgYW5kIGRlZmxhdGUgZnVuY3Rpb25zIHByb2R1Y2UgZGF0YSBpbiB0aGUgemxpYiBmb3JtYXQsIHdoaWNoCiAgICAgaXMgZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZ3ppcCBmb3JtYXQuIFRoZSBneiogZnVuY3Rpb25zIGluCiAgICAgemxpYiBvbiB0aGUgb3RoZXIgaGFuZCB1c2UgdGhlIGd6aXAgZm9ybWF0LiBCb3RoIHRoZSB6bGliIGFuZCBnemlwCi0gICAgZm9ybWF0cyB1c2UgdGhlIHNhbWUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCwgYnV0IGhhdmUgZGlmZmVyZW50IGhlYWRlcnMKLSAgICBhbmQgdHJhaWxlcnMuCisgICAgZm9ybWF0cyB1c2UgdGhlIHNhbWUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCBpbnRlcm5hbGx5LCBidXQgaGF2ZSBkaWZmZXJlbnQKKyAgICBoZWFkZXJzIGFuZCB0cmFpbGVycyBhcm91bmQgdGhlIGNvbXByZXNzZWQgZGF0YS4KIAogMTcuIE9rLCBzbyB3aHkgYXJlIHRoZXJlIHR3byBkaWZmZXJlbnQgZm9ybWF0cz8KIApAQCAtMTI3LDEyICsxMjgsMTMgQEAKIDE5LiBJcyB6bGliIHRocmVhZC1zYWZlPwogCiAgICAgWWVzLiBIb3dldmVyIGFueSBsaWJyYXJ5IHJvdXRpbmVzIHRoYXQgemxpYiB1c2VzIGFuZCBhbnkgYXBwbGljYXRpb24tCi0gICAgcHJvdmlkZWQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgbXVzdCBhbHNvIGJlIHRocmVhZC1zYWZlLiBPZiBjb3Vyc2UsCi0gICAgeW91IHNob3VsZCBvbmx5IG9wZXJhdGUgb24gYW55IGdpdmVuIHpsaWIgb3IgZ3ppcCBzdHJlYW0gZnJvbSBhIHNpbmdsZQotICAgIHRocmVhZC4gemxpYidzIGd6KiBmdW5jdGlvbnMgdXNlIHN0ZGlvIGxpYnJhcnkgcm91dGluZXMsIGFuZCBtb3N0IG9mCi0gICAgemxpYidzIGZ1bmN0aW9ucyB1c2UgdGhlIGxpYnJhcnkgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgYnkgZGVmYXVsdC4KLSAgICB6bGliJ3MgSW5pdCBmdW5jdGlvbnMgYWxsb3cgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBwcm92aWRlIGN1c3RvbSBtZW1vcnkKLSAgICBhbGxvY2F0aW9uIHJvdXRpbmVzLgorICAgIHByb3ZpZGVkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIG11c3QgYWxzbyBiZSB0aHJlYWQtc2FmZS4gemxpYidzIGd6KgorICAgIGZ1bmN0aW9ucyB1c2Ugc3RkaW8gbGlicmFyeSByb3V0aW5lcywgYW5kIG1vc3Qgb2YgemxpYidzIGZ1bmN0aW9ucyB1c2UgdGhlCisgICAgbGlicmFyeSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBieSBkZWZhdWx0LiB6bGliJ3MgSW5pdCBmdW5jdGlvbnMgYWxsb3cKKyAgICBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgY3VzdG9tIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgorCisgICAgT2YgY291cnNlLCB5b3Ugc2hvdWxkIG9ubHkgb3BlcmF0ZSBvbiBhbnkgZ2l2ZW4gemxpYiBvciBnemlwIHN0cmVhbSBmcm9tIGEKKyAgICBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZS4KIAogMjAuIENhbiBJIHVzZSB6bGliIGluIG15IGNvbW1lcmNpYWwgYXBwbGljYXRpb24/CiAKQEAgLTE0MiwyNCArMTQ0LDQ0IEBACiAKICAgICBOby4gUGxlYXNlIHJlYWQgdGhlIGxpY2Vuc2UgaW4gemxpYi5oLgogCi0yMi4gV2lsbCB6bGliIHdvcmsgb24gYSBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4gYXJjaGl0ZWN0dXJlLCBhbmQgY2FuIEkKKzIyLiBUaGUgbGljZW5zZSBzYXlzIHRoYXQgYWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSAicGxhaW5seSBtYXJrZWQiLiBTbworICAgIHdoYXQgZXhhY3RseSBkbyBJIG5lZWQgdG8gZG8gdG8gbWVldCB0aGF0IHJlcXVpcmVtZW50PworCisgICAgWW91IG5lZWQgdG8gYXBwZW5kIHNvbWV0aGluZyB0aGUgWkxJQl9WRVJTSU9OIHN0cmluZyBpbiB6bGliLmguIEZvcgorICAgIGV4YW1wbGUsIGlmIHRoZSB2ZXJzaW9uIG9mIHRoZSBiYXNlIHpsaWIgeW91IGFyZSBhbHRlcmluZyBpcyAiMS4yLjMiLCB0aGVuCisgICAgeW91IGNvdWxkIGNoYW5nZSB0aGUgc3RyaW5nIHRvICIxLjIuMy1mcmVkLW1vZHMtdjMiLiBZb3Ugc2hvdWxkIG5vdCBjaGFuZ2UKKyAgICBpdCB0byAiMS4yLjQiIG9yICIxLjIuMy4xIiBzaW5jZSB0aGUgemxpYiBhdXRob3JzIHdvdWxkIGxpa2UgdG8gcmVzZXJ2ZQorICAgIHRob3NlIGZvcm1zIG9mIHRoZSB2ZXJzaW9uIGZvciB0aGVpciBvd24gdXNlLgorCisgICAgRm9yIGFsdGVyZWQgc291cmNlIGRpc3RyaWJ1dGlvbnMsIHlvdSBzaG91bGQgYWxzbyBub3RlIHRoZSBvcmlnaW4gYW5kCisgICAgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzIGluIHpsaWIuaCwgYXMgd2VsbCBhcyBpbiBDaGFuZ2VMb2cgYW5kIFJFQURNRSwgYWxvbmcKKyAgICB3aXRoIHRoZSBkYXRlcyBvZiB0aGUgYWx0ZXJhdGlvbnMuIFRoZSBvcmlnaW4gc2hvdWxkIGluY2x1ZGUgYXQgbGVhc3QgeW91cgorICAgIG5hbWUgKG9yIHlvdXIgY29tcGFueSdzIG5hbWUpLCBhbmQgYW4gZW1haWwgYWRkcmVzcyB0byBjb250YWN0IGZvciBoZWxwIG9yCisgICAgaXNzdWVzIHdpdGggdGhlIGxpYnJhcnkuCisKKyAgICBOb3RlIHRoYXQgZGlzdHJpYnV0aW5nIGEgY29tcGlsZWQgemxpYiBsaWJyYXJ5IGFsb25nIHdpdGggemxpYi5oIGFuZAorICAgIHpjb25mLmggaXMgYWxzbyBhIHNvdXJjZSBkaXN0cmlidXRpb24sIGFuZCBzbyB5b3Ugc2hvdWxkIGNoYW5nZQorICAgIFpMSUJfVkVSU0lPTiBhbmQgbm90ZSB0aGUgb3JpZ2luIGFuZCBuYXR1cmUgb2YgdGhlIGNoYW5nZXMgaW4gemxpYi5oIGFzIHlvdQorICAgIHdvdWxkIGZvciBhIGZ1bGwgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworMjMuIFdpbGwgemxpYiB3b3JrIG9uIGEgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGFyY2hpdGVjdHVyZSwgYW5kIGNhbiBJCiAgICAgZXhjaGFuZ2UgY29tcHJlc3NlZCBkYXRhIGJldHdlZW4gdGhlbT8KIAogICAgIFllcyBhbmQgeWVzLgogCi0yMy4gV2lsbCB6bGliIHdvcmsgb24gYSA2NC1iaXQgbWFjaGluZT8KKzI0LiBXaWxsIHpsaWIgd29yayBvbiBhIDY0LWJpdCBtYWNoaW5lPwogCiAgICAgSXQgc2hvdWxkLiBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gNjQtYml0IG1hY2hpbmVzLCBhbmQgaGFzIG5vIGRlcGVuZGVuY2UKICAgICBvbiBhbnkgZGF0YSB0eXBlcyBiZWluZyBsaW1pdGVkIHRvIDMyLWJpdHMgaW4gbGVuZ3RoLiBJZiB5b3UgaGF2ZSBhbnkKICAgICBkaWZmaWN1bHRpZXMsIHBsZWFzZSBwcm92aWRlIGEgY29tcGxldGUgcHJvYmxlbSByZXBvcnQgdG8gemxpYkBnemlwLm9yZwogCi0yNC4gV2lsbCB6bGliIGRlY29tcHJlc3MgZGF0YSBmcm9tIHRoZSBQS1dhcmUgRGF0YSBDb21wcmVzc2lvbiBMaWJyYXJ5PworMjUuIFdpbGwgemxpYiBkZWNvbXByZXNzIGRhdGEgZnJvbSB0aGUgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeT8KIAogICAgIE5vLiBUaGUgUEtXYXJlIERDTCB1c2VzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgY29tcHJlc3NlZCBkYXRhIGZvcm1hdAogICAgIHRoYW4gZG9lcyBQS1pJUCBhbmQgemxpYi4gSG93ZXZlciwgeW91IGNhbiBsb29rIGluIHpsaWIncyBjb250cmliL2JsYXN0CiAgICAgZGlyZWN0b3J5IGZvciBhIHBvc3NpYmxlIHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbS4KIAotMjUuIENhbiBJIGFjY2VzcyBkYXRhIHJhbmRvbWx5IGluIGEgY29tcHJlc3NlZCBzdHJlYW0/CisyNi4gQ2FuIEkgYWNjZXNzIGRhdGEgcmFuZG9tbHkgaW4gYSBjb21wcmVzc2VkIHN0cmVhbT8KIAogICAgIE5vLCBub3Qgd2l0aG91dCBzb21lIHByZXBhcmF0aW9uLiBJZiB3aGVuIGNvbXByZXNzaW5nIHlvdSBwZXJpb2RpY2FsbHkKICAgICB1c2UgWl9GVUxMX0ZMVVNILCBjYXJlZnVsbHkgd3JpdGUgYWxsIHRoZSBwZW5kaW5nIGRhdGEgYXQgdGhvc2UgcG9pbnRzLApAQCAtMTY3LDc2ICsxODksODMgQEAKICAgICBhdCB0aG9zZSBwb2ludHMuIFlvdSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gbm90IHVzZSBaX0ZVTExfRkxVU0ggdG9vCiAgICAgb2Z0ZW4sIHNpbmNlIGl0IGNhbiBzaWduaWZpY2FudGx5IGRlZ3JhZGUgY29tcHJlc3Npb24uCiAKLTI2LiBEb2VzIHpsaWIgd29yayBvbiBNVlMsIE9TLzM5MCwgQ0lDUywgZXRjLj8KKzI3LiBEb2VzIHpsaWIgd29yayBvbiBNVlMsIE9TLzM5MCwgQ0lDUywgZXRjLj8KIAogICAgIFdlIGRvbid0IGtub3cgZm9yIHN1cmUuIFdlIGhhdmUgaGVhcmQgb2NjYXNpb25hbCByZXBvcnRzIG9mIHN1Y2Nlc3Mgb24KICAgICB0aGVzZSBzeXN0ZW1zLiBJZiB5b3UgZG8gdXNlIGl0IG9uIG9uZSBvZiB0aGVzZSwgcGxlYXNlIHByb3ZpZGUgdXMgd2l0aAogICAgIGEgcmVwb3J0LCBpbnN0cnVjdGlvbnMsIGFuZCBwYXRjaGVzIHRoYXQgd2UgY2FuIHJlZmVyZW5jZSB3aGVuIHdlIGdldAogICAgIHRoZXNlIHF1ZXN0aW9ucy4gVGhhbmtzLgogCi0yNy4gSXMgdGhlcmUgc29tZSBzaW1wbGVyLCBlYXNpZXIgdG8gcmVhZCB2ZXJzaW9uIG9mIGluZmxhdGUgSSBjYW4gbG9vayBhdAorMjguIElzIHRoZXJlIHNvbWUgc2ltcGxlciwgZWFzaWVyIHRvIHJlYWQgdmVyc2lvbiBvZiBpbmZsYXRlIEkgY2FuIGxvb2sgYXQKICAgICB0byB1bmRlcnN0YW5kIHRoZSBkZWZsYXRlIGZvcm1hdD8KIAogICAgIEZpcnN0IG9mZiwgeW91IHNob3VsZCByZWFkIFJGQyAxOTUxLiBTZWNvbmQsIHllcy4gTG9vayBpbiB6bGliJ3MKICAgICBjb250cmliL3B1ZmYgZGlyZWN0b3J5LgogCi0yOC4gRG9lcyB6bGliIGluZnJpbmdlIG9uIGFueSBwYXRlbnRzPworMjkuIERvZXMgemxpYiBpbmZyaW5nZSBvbiBhbnkgcGF0ZW50cz8KIAogICAgIEFzIGZhciBhcyB3ZSBrbm93LCBuby4gSW4gZmFjdCwgdGhhdCB3YXMgb3JpZ2luYWxseSB0aGUgd2hvbGUgcG9pbnQgYmVoaW5kCiAgICAgemxpYi4gTG9vayBoZXJlIGZvciBzb21lIG1vcmUgaW5mb3JtYXRpb246CiAKICAgICBodHRwOi8vd3d3Lmd6aXAub3JnLyNmYXExMQogCi0yOS4gQ2FuIHpsaWIgd29yayB3aXRoIGdyZWF0ZXIgdGhhbiA0IEdCIG9mIGRhdGE/CiszMC4gQ2FuIHpsaWIgd29yayB3aXRoIGdyZWF0ZXIgdGhhbiA0IEdCIG9mIGRhdGE/CiAKICAgICBZZXMuIGluZmxhdGUoKSBhbmQgZGVmbGF0ZSgpIHdpbGwgcHJvY2VzcyBhbnkgYW1vdW50IG9mIGRhdGEgY29ycmVjdGx5LgogICAgIEhvd2V2ZXIgdGhlIHN0cm0udG90YWxfaW4gYW5kIHN0cm1fdG90YWxfb3V0IGNvdW50ZXJzIG1heSBiZSBsaW1pdGVkIHRvCi0gICAgNCBHQi4gVGhlIHVzZXIgY2FuIGVhc2lseSBzZXQgdXAgdGhlaXIgb3duIGNvdW50ZXJzIHVwZGF0ZWQgYWZ0ZXIgZWFjaAorICAgIDQgR0IuIFRoZSBhcHBsaWNhdGlvbiBjYW4gZWFzaWx5IHNldCB1cCBpdHMgb3duIGNvdW50ZXJzIHVwZGF0ZWQgYWZ0ZXIgZWFjaAogICAgIGNhbGwgb2YgaW5mbGF0ZSgpIG9yIGRlZmxhdGUoKSB0byBjb3VudCBiZXlvbmQgNCBHQi4gY29tcHJlc3MoKSBhbmQKLSAgICB1bmNvbXByZXNzKCkgbWF5IGJlIGxpbWl0ZWQgdG8gNCBHQiwgc2luY2UgdGhleSBvcGVyYXRlIGluIGEgc2luZ2xlCi0gICAgY2FsbCB1c2luZyB1bnNpZ25lZCBsb25nIGxlbmd0aHMuIGd6c2VlaygpIG1heSBiZSBsaW1pdGVkIHRvIDQgR0IKKyAgICB1bmNvbXByZXNzKCkgbWF5IGJlIGxpbWl0ZWQgdG8gNCBHQiwgc2luY2UgdGhleSBvcGVyYXRlIGluIGEgc2luZ2xlIGNhbGwKKyAgICB1c2luZyB1bnNpZ25lZCBsb25nIGxlbmd0aHMuIGd6c2VlaygpIGFuZCBnenRlbGwoKSBtYXkgYmUgbGltaXRlZCB0byA0IEdCCiAgICAgZGVwZW5kaW5nIG9uIGhvdyB6bGliIGlzIGNvbXBpbGVkLgogCi0zMC4gRG9lcyB6bGliIGhhdmUgYW55IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcz8KKzMxLiBEb2VzIHpsaWIgaGF2ZSBhbnkgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzPwogCiAgICAgVGhlIG9ubHkgb25lIHRoYXQgd2UgYXJlIGF3YXJlIG9mIGlzIHBvdGVudGlhbGx5IGluIGd6cHJpbnRmKCkuIElmIHpsaWIKICAgICBpcyBjb21waWxlZCB0byB1c2Ugc3ByaW50ZigpIG9yIHZzcHJpbnRmKCksIHRoZW4gdGhlcmUgaXMgbm8gcHJvdGVjdGlvbgogICAgIGFnYWluc3QgYSBidWZmZXIgb3ZlcmZsb3cgb2YgYSA0SyBzdHJpbmcgc3BhY2UsIG90aGVyIHRoYW4gdGhlIGNhbGxlciBvZgogICAgIGd6cHJpbnRmKCkgYXNzdXJpbmcgdGhhdCB0aGUgb3V0cHV0IHdpbGwgbm90IGV4Y2VlZCA0Sy4gT24gdGhlIG90aGVyCi0gICAgaGFuZCwgaWYgemxpYiBpcyBjb21waWxlZCB0byB1c2Ugc25wcmludGYoKSBvciB2c25wcmludGYoKSwgdGhlbiB0aGVyZSBpcwotICAgIG5vIHZ1bG5lcmFiaWxpdHkuCisgICAgaGFuZCwgaWYgemxpYiBpcyBjb21waWxlZCB0byB1c2Ugc25wcmludGYoKSBvciB2c25wcmludGYoKSwgd2hpY2ggc2hvdWxkCisgICAgbm9ybWFsbHkgYmUgdGhlIGNhc2UsIHRoZW4gdGhlcmUgaXMgbm8gdnVsbmVyYWJpbGl0eS4gVGhlIC4vY29uZmlndXJlCisgICAgc2NyaXB0IHdpbGwgZGlzcGxheSB3YXJuaW5ncyBpZiBhbiBpbnNlY3VyZSB2YXJpYXRpb24gb2Ygc3ByaW50ZigpIHdpbGwKKyAgICBiZSB1c2VkIGJ5IGd6cHJpbnRmKCkuCisKKyAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBzbnByaW50ZigpIG9yIHZzbnByaW50ZigpIGFuZCB3b3VsZCBsaWtlIG9uZSwgeW91IGNhbgorICAgIGZpbmQgYSBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBoZXJlOgorCisgICAgICAgIGh0dHA6Ly93d3cuaWpzLnNpL3NvZnR3YXJlL3NucHJpbnRmLwogCiAgICAgTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgdXNpbmcgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgemxpYi4gVmVyc2lvbnMKICAgICAxLjEuMyBhbmQgYmVmb3JlIHdlcmUgc3ViamVjdCB0byBhIGRvdWJsZS1mcmVlIHZ1bG5lcmFiaWxpdHkuCiAKLTMxLiBJcyB0aGVyZSBhIEphdmEgdmVyc2lvbiBvZiB6bGliPworMzIuIElzIHRoZXJlIGEgSmF2YSB2ZXJzaW9uIG9mIHpsaWI/CiAKICAgICBQcm9iYWJseSB3aGF0IHlvdSB3YW50IGlzIHRvIHVzZSB6bGliIGluIEphdmEuIHpsaWIgaXMgYWxyZWFkeSBpbmNsdWRlZAogICAgIGFzIHBhcnQgb2YgdGhlIEphdmEgU0RLIGluIHRoZSBqYXZhLnV0aWwuemlwIGNsYXNzLiBJZiB5b3UgcmVhbGx5IHdhbnQKICAgICBhIHZlcnNpb24gb2YgemxpYiB3cml0dGVuIGluIHRoZSBKYXZhIGxhbmd1YWdlLCBsb29rIG9uIHRoZSB6bGliIGhvbWUKICAgICBwYWdlIGZvciBsaW5rczogaHR0cDovL3d3dy56bGliLm9yZy8KIAotMzIuIEkgZ2V0IHRoaXMgb3IgdGhhdCBjb21waWxlciBvciBzb3VyY2UtY29kZSBzY2FubmVyIHdhcm5pbmcuIENhbid0IHlvdSBndXlzCi0gICAgd3JpdGUgcHJvcGVyIGNvZGU/CiszMy4gSSBnZXQgdGhpcyBvciB0aGF0IGNvbXBpbGVyIG9yIHNvdXJjZS1jb2RlIHNjYW5uZXIgd2FybmluZyB3aGVuIEkgY3JhbmsgaXQKKyAgICB1cCB0byBtYXhpbWFsbHktcGVuZGFudGljLiBDYW4ndCB5b3UgZ3V5cyB3cml0ZSBwcm9wZXIgY29kZT8KIAogICAgIE1hbnkgeWVhcnMgYWdvLCB3ZSBnYXZlIHVwIGF0dGVtcHRpbmcgdG8gYXZvaWQgd2FybmluZ3Mgb24gZXZlcnkgY29tcGlsZXIKICAgICBpbiB0aGUgdW5pdmVyc2UuIEl0IGp1c3QgZ290IHRvIGJlIGEgd2FzdGUgb2YgdGltZSwgYW5kIHNvbWUgY29tcGlsZXJzCiAgICAgd2VyZSBkb3ducmlnaHQgc2lsbHkuIFNvIG5vdywgd2Ugc2ltcGx5IG1ha2Ugc3VyZSB0aGF0IHRoZSBjb2RlIGFsd2F5cwogICAgIHdvcmtzLgogCi0zMy4gV2lsbCB6bGliIHJlYWQgdGhlIChpbnNlcnQgYW55IGFuY2llbnQgb3IgYXJjYW5lIGZvcm1hdCBoZXJlKSBjb21wcmVzc2VkCiszNC4gV2lsbCB6bGliIHJlYWQgdGhlIChpbnNlcnQgYW55IGFuY2llbnQgb3IgYXJjYW5lIGZvcm1hdCBoZXJlKSBjb21wcmVzc2VkCiAgICAgZGF0YSBmb3JtYXQ/CiAKICAgICBQcm9iYWJseSBub3QuIExvb2sgaW4gdGhlIGNvbXAuY29tcHJlc3Npb24gRkFRIGZvciBwb2ludGVycyB0byB2YXJpb3VzCiAgICAgZm9ybWF0cyBhbmQgYXNzb2NpYXRlZCBzb2Z0d2FyZS4KIAotMzQuIEhvdyBjYW4gSSBlbmNyeXB0L2RlY3J5cHQgemlwIGZpbGVzIHdpdGggemxpYj8KKzM1LiBIb3cgY2FuIEkgZW5jcnlwdC9kZWNyeXB0IHppcCBmaWxlcyB3aXRoIHpsaWI/CiAKICAgICB6bGliIGRvZXNuJ3Qgc3VwcG9ydCBlbmNyeXB0aW9uLiBQS1pJUCBlbmNyeXB0aW9uIGlzIHZlcnkgd2VhayBhbmQgY2FuIGJlCiAgICAgYnJva2VuIHdpdGggZnJlZWx5IGF2YWlsYWJsZSBwcm9ncmFtcy4gVG8gZ2V0IHN0cm9uZyBlbmNyeXB0aW9uLCB1c2UgZ3BnCiAgICAgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB6bGliIGNvbXByZXNzaW9uLgogCi0zNS4gV2hhdCdzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlICJnemlwIiBhbmQgImRlZmxhdGUiIEhUVFAgMS4xIGVuY29kaW5ncz8KKzM2LiBXaGF0J3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgImd6aXAiIGFuZCAiZGVmbGF0ZSIgSFRUUCAxLjEgZW5jb2RpbmdzPwogCiAgICAgImd6aXAiIGlzIHRoZSBnemlwIGZvcm1hdCwgYW5kICJkZWZsYXRlIiBpcyB0aGUgemxpYiBmb3JtYXQuIFRoZXkgc2hvdWxkCiAgICAgcHJvYmFibHkgaGF2ZSBjYWxsZWQgdGhlIHNlY29uZCBvbmUgInpsaWIiIGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW9uCkBAIC0yNTAsMTQgKzI3OSwxNCBAQAogICAgIGZvciksIHVzaW5nIHRoZSAiZ3ppcCIgdHJhbnNmZXIgZW5jb2RpbmcgaXMgcHJvYmFibHkgbW9yZSByZWxpYWJsZSBkdWUgdG8KICAgICBhbiB1bmZvcnR1bmF0ZSBjaG9pY2Ugb2YgbmFtZSBvbiB0aGUgcGFydCBvZiB0aGUgSFRUUCAxLjEgYXV0aG9ycy4KIAotMzYuIERvZXMgemxpYiBzdXBwb3J0IHRoZSBuZXcgIkRlZmxhdGU2NCIgZm9ybWF0IGludHJvZHVjZWQgYnkgUEtXYXJlPworMzcuIERvZXMgemxpYiBzdXBwb3J0IHRoZSBuZXcgIkRlZmxhdGU2NCIgZm9ybWF0IGludHJvZHVjZWQgYnkgUEtXYXJlPwogCiAgICAgTm8uIFBLV2FyZSBoYXMgYXBwYXJlbnRseSBkZWNpZGVkIHRvIGtlZXAgdGhhdCBmb3JtYXQgcHJvcHJpZXRhcnksIHNpbmNlCiAgICAgdGhleSBoYXZlIG5vdCBkb2N1bWVudGVkIGl0IGFzIHRoZXkgaGF2ZSBwcmV2aW91cyBjb21wcmVzc2lvbiBmb3JtYXRzLgogICAgIEluIGFueSBjYXNlLCB0aGUgY29tcHJlc3Npb24gaW1wcm92ZW1lbnRzIGFyZSBzbyBtb2Rlc3QgY29tcGFyZWQgdG8gb3RoZXIKICAgICBtb3JlIG1vZGVybiBhcHByb2FjaGVzLCB0aGF0IGl0J3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQgdG8gaW1wbGVtZW50LgogCi0zNy4gQ2FuIHlvdSBwbGVhc2Ugc2lnbiB0aGVzZSBsZW5ndGh5IGxlZ2FsIGRvY3VtZW50cyBhbmQgZmF4IHRoZW0gYmFjayB0byB1cworMzguIENhbiB5b3UgcGxlYXNlIHNpZ24gdGhlc2UgbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgYW5kIGZheCB0aGVtIGJhY2sgdG8gdXMKICAgICBzbyB0aGF0IHdlIGNhbiB1c2UgeW91ciBzb2Z0d2FyZSBpbiBvdXIgcHJvZHVjdD8KIAotICAgIE5vLgorICAgIE5vLiBHbyBhd2F5LgpkaWZmIC0tZ2l0IGEvSU5ERVggYi9JTkRFWAppbmRleCA4N2RmOTU5Li5hMTQ2M2NlIDEwMDY0NAotLS0gYS9JTkRFWAorKysgYi9JTkRFWApAQCAtMSwyMiArMSwyNCBAQAotQ2hhbmdlTG9nCQloaXN0b3J5IG9mIGNoYW5nZXMKLUZBUQkJCUZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IHpsaWIKLUlOREVYCQkJdGhpcyBmaWxlCi1NYWtlZmlsZQkJbWFrZWZpbGUgZm9yIFVuaXggKGdlbmVyYXRlZCBieSBjb25maWd1cmUpCi1NYWtlZmlsZS5pbgkJbWFrZWZpbGUgZm9yIFVuaXggKHRlbXBsYXRlIGZvciBjb25maWd1cmUpCi1SRUFETUUJCQlndWVzcyB3aGF0Ci1hbGdvcml0aG0udHh0CQlkZXNjcmlwdGlvbiBvZiB0aGUgKGRlKWNvbXByZXNzaW9uIGFsZ29yaXRobQotY29uZmlndXJlCQljb25maWd1cmUgc2NyaXB0IGZvciBVbml4Ci16Y29uZi5pbi5oCQl0ZW1wbGF0ZSBmb3IgemNvbmYuaCAodXNlZCBieSBjb25maWd1cmUpCitDaGFuZ2VMb2cgICAgICAgaGlzdG9yeSBvZiBjaGFuZ2VzCitGQVEgICAgICAgICAgICAgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgemxpYgorSU5ERVggICAgICAgICAgIHRoaXMgZmlsZQorTWFrZWZpbGUgICAgICAgIG1ha2VmaWxlIGZvciBVbml4IChnZW5lcmF0ZWQgYnkgY29uZmlndXJlKQorTWFrZWZpbGUuaW4gICAgIG1ha2VmaWxlIGZvciBVbml4ICh0ZW1wbGF0ZSBmb3IgY29uZmlndXJlKQorUkVBRE1FICAgICAgICAgIGd1ZXNzIHdoYXQKK2FsZ29yaXRobS50eHQgICBkZXNjcmlwdGlvbiBvZiB0aGUgKGRlKWNvbXByZXNzaW9uIGFsZ29yaXRobQorY29uZmlndXJlICAgICAgIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIFVuaXgKK3pjb25mLmluLmggICAgICB0ZW1wbGF0ZSBmb3IgemNvbmYuaCAodXNlZCBieSBjb25maWd1cmUpCiAKLWFpeC8JCQlpbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIGFuIEFJWCBzaGFyZWQgbGlicmFyeQotb2xkLwkJCW1ha2VmaWxlcyBmb3IgdmFyaW91cyBhcmNoaXRlY3R1cmVzIGFuZCB6bGliIGRvY3VtZW50YXRpb24KLQkJCXRoYXQgaGFzIG5vdCB5ZXQgYmVlbiB1cGRhdGVkIGZvciB6bGliIDEuMi54CithaXgvICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zIGZvciBidWlsZGluZyBhbiBBSVggc2hhcmVkIGxpYnJhcnkKK21zZG9zLwkJbWFrZWZpbGVzIGZvciBNU0RPUworb2xkLyAgICAgICAgICAgIG1ha2VmaWxlcyBmb3IgdmFyaW91cyBhcmNoaXRlY3R1cmVzIGFuZCB6bGliIGRvY3VtZW50YXRpb24KKyAgICAgICAgICAgICAgICBmaWxlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHVwZGF0ZWQgZm9yIHpsaWIgMS4yLngKK3dpbjMyLwkJbWFrZWZpbGVzIGZvciBXaW5kb3dzCiAKLQkJemxpYiBwdWJsaWMgaGVhZGVyIGZpbGVzIChtdXN0IGJlIGtlcHQpOgorICAgICAgICAgICAgICAgIHpsaWIgcHVibGljIGhlYWRlciBmaWxlcyAobXVzdCBiZSBrZXB0KToKIHpjb25mLmgKIHpsaWIuaAogCi0JCXByaXZhdGUgc291cmNlIGZpbGVzIHVzZWQgdG8gYnVpbGQgdGhlIHpsaWIgbGlicmFyeToKKyAgICAgICAgICAgICAgICBwcml2YXRlIHNvdXJjZSBmaWxlcyB1c2VkIHRvIGJ1aWxkIHRoZSB6bGliIGxpYnJhcnk6CiBhZGxlcjMyLmMKIGNvbXByZXNzLmMKIGNyYzMyLmMKQEAgLTM4LDkgKzQwLDkgQEAKIHp1dGlsLmMKIHp1dGlsLmgKIAotCQlzb3VyY2UgZmlsZXMgZm9yIHNhbXBsZSBwcm9ncmFtczoKKyAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZXMgZm9yIHNhbXBsZSBwcm9ncmFtczoKIGV4YW1wbGUuYwogbWluaWd6aXAuYwogCi0JCXVuc3VwcG9ydGVkIGNvbnRyaWJ1dGlvbiBieSB0aGlyZCBwYXJ0aWVzCisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQgY29udHJpYnV0aW9uIGJ5IHRoaXJkIHBhcnRpZXMKIFNlZSBjb250cmliL1JFQURNRS5jb250cmliCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDA4N2UzODguLjA1NTQwZTkgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0yNCw3ICsyNCw3IEBACiBMRFNIQVJFRD0kKENDKQogQ1BQPSQoQ0MpIC1FCiAKLVZFUj0xLjIuMAorVkVSPTEuMi4wLjEKIExJQlM9bGliei5hCiBTSEFSRURMSUI9bGliei5zbwogCkBAIC02MSw2ICs2MSw3IEBACiAKIGFsbDogZXhhbXBsZSBtaW5pZ3ppcAogCitjaGVjazogdGVzdAogdGVzdDogYWxsCiAJQExEX0xJQlJBUllfUEFUSD0uOiQoTERfTElCUkFSWV9QQVRIKSA7IGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg7IFwKIAllY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcCB8IC4vbWluaWd6aXAgLWQgfHwgXApAQCAtMTIzLDEwICsxMjQsMTIgQEAKIAkgIHJtIC1mICQoU0hBUkVETElCKS4kJHYgJChTSEFSRURMSUIpICQoU0hBUkVETElCKS4xOyBcCiAJZmkKIAorbW9zdGx5Y2xlYW46IGNsZWFuCiBjbGVhbjoKIAlybSAtZiAqLm8gKn4gZXhhbXBsZSBtaW5pZ3ppcCBsaWJ6LmEgbGliei5zbyogZm9vLmd6IHNvX2xvY2F0aW9ucyBcCiAJICAgX21hdGNoLnMgbWFrZXRyZWUKIAorbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCiBkaXN0Y2xlYW46CWNsZWFuCiAJY3AgLXAgTWFrZWZpbGUuaW4gTWFrZWZpbGUKIAljcCAtcCB6Y29uZi5pbi5oIHpjb25mLmgKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KaW5kZXggMDg3ZTM4OC4uMDU1NDBlOSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTI0LDcgKzI0LDcgQEAKIExEU0hBUkVEPSQoQ0MpCiBDUFA9JChDQykgLUUKIAotVkVSPTEuMi4wCitWRVI9MS4yLjAuMQogTElCUz1saWJ6LmEKIFNIQVJFRExJQj1saWJ6LnNvCiAKQEAgLTYxLDYgKzYxLDcgQEAKIAogYWxsOiBleGFtcGxlIG1pbmlnemlwCiAKK2NoZWNrOiB0ZXN0CiB0ZXN0OiBhbGwKIAlATERfTElCUkFSWV9QQVRIPS46JChMRF9MSUJSQVJZX1BBVEgpIDsgZXhwb3J0IExEX0xJQlJBUllfUEFUSDsgXAogCWVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwIHwgLi9taW5pZ3ppcCAtZCB8fCBcCkBAIC0xMjMsMTAgKzEyNCwxMiBAQAogCSAgcm0gLWYgJChTSEFSRURMSUIpLiQkdiAkKFNIQVJFRExJQikgJChTSEFSRURMSUIpLjE7IFwKIAlmaQogCittb3N0bHljbGVhbjogY2xlYW4KIGNsZWFuOgogCXJtIC1mICoubyAqfiBleGFtcGxlIG1pbmlnemlwIGxpYnouYSBsaWJ6LnNvKiBmb28uZ3ogc29fbG9jYXRpb25zIFwKIAkgICBfbWF0Y2gucyBtYWtldHJlZQogCittYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KIGRpc3RjbGVhbjoJY2xlYW4KIAljcCAtcCBNYWtlZmlsZS5pbiBNYWtlZmlsZQogCWNwIC1wIHpjb25mLmluLmggemNvbmYuaApkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDI2YWIyYjYuLjhhYzc5YTEgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTEsMzggKzEsNDAgQEAKLXpsaWIgMS4yLjAgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgQWxsIHRoZSBjb2RlCi1pcyB0aHJlYWQgc2FmZS4gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkKLWlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyAKLWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0ICh6bGliIGZvcm1hdCksIHJmYzE5NTEudHh0IChkZWZsYXRlCi1mb3JtYXQpIGFuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLiBUaGVzZSBkb2N1bWVudHMgYXJlIGFsc28gYXZhaWxhYmxlIGluCi1vdGhlciBmb3JtYXRzIGZyb20gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sCitaTElCIERBVEEgQ09NUFJFU1NJT04gTElCUkFSWQorCit6bGliIDEuMi4wLjEgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgQWxsIHRoZSBjb2RlIGlzCit0aHJlYWQgc2FmZS4gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MKKyhSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcworaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KQorYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuIFRoZXNlIGRvY3VtZW50cyBhcmUgYWxzbyBhdmFpbGFibGUgaW4gb3RoZXIKK2Zvcm1hdHMgZnJvbSBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL3BuZy9kb2N1bWVudHMvemxpYi96ZG9jLWluZGV4Lmh0bWwKIAogQWxsIGZ1bmN0aW9ucyBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSB6bGliLmgKLSh2b2x1bnRlZXIgdG8gd3JpdGUgbWFuIHBhZ2VzIHdlbGNvbWUsIGNvbnRhY3QgamxvdXBAZ3ppcC5vcmcpLiBBIHVzYWdlCi1leGFtcGxlIG9mIHRoZSBsaWJyYXJ5IGlzIGdpdmVuIGluIHRoZSBmaWxlIGV4YW1wbGUuYyB3aGljaCBhbHNvIHRlc3RzIHRoYXQKLXRoZSBsaWJyYXJ5IGlzIHdvcmtpbmcgY29ycmVjdGx5LiBBbm90aGVyIGV4YW1wbGUgaXMgZ2l2ZW4gaW4gdGhlIGZpbGUKLW1pbmlnemlwLmMuIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGl0c2VsZiBpcyBjb21wb3NlZCBvZiBhbGwgc291cmNlIGZpbGVzCi1leGNlcHQgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jLgorKHZvbHVudGVlciB0byB3cml0ZSBtYW4gcGFnZXMgd2VsY29tZSwgY29udGFjdCBqbG91cEBnemlwLm9yZykuIEEgdXNhZ2UgZXhhbXBsZQorb2YgdGhlIGxpYnJhcnkgaXMgZ2l2ZW4gaW4gdGhlIGZpbGUgZXhhbXBsZS5jIHdoaWNoIGFsc28gdGVzdHMgdGhhdCB0aGUgbGlicmFyeQoraXMgd29ya2luZyBjb3JyZWN0bHkuIEFub3RoZXIgZXhhbXBsZSBpcyBnaXZlbiBpbiB0aGUgZmlsZSBtaW5pZ3ppcC5jLiBUaGUKK2NvbXByZXNzaW9uIGxpYnJhcnkgaXRzZWxmIGlzIGNvbXBvc2VkIG9mIGFsbCBzb3VyY2UgZmlsZXMgZXhjZXB0IGV4YW1wbGUuYyBhbmQKK21pbmlnemlwLmMuCiAKLVRvIGNvbXBpbGUgYWxsIGZpbGVzIGFuZCBydW4gdGhlIHRlc3QgcHJvZ3JhbSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKLWdpdmVuIGF0IHRoZSB0b3Agb2YgTWFrZWZpbGUuIEluIHNob3J0ICJtYWtlIHRlc3Q7IG1ha2UgaW5zdGFsbCIKLXNob3VsZCB3b3JrIGZvciBtb3N0IG1hY2hpbmVzLiBGb3IgVW5peDogIi4vY29uZmlndXJlOyBtYWtlIHRlc3Q7IG1ha2UgaW5zdGFsbCIKLUZvciBNU0RPUywgdXNlIG9uZSBvZiB0aGUgc3BlY2lhbCBtYWtlZmlsZXMgc3VjaCBhcyBNYWtlZmlsZS5tc2MuCi1Gb3IgVk1TLCB1c2UgTWFrZV92bXMuY29tIG9yIGRlc2NyaXAubW1zLgorVG8gY29tcGlsZSBhbGwgZmlsZXMgYW5kIHJ1biB0aGUgdGVzdCBwcm9ncmFtLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBnaXZlbiBhdAordGhlIHRvcCBvZiBNYWtlZmlsZS4gSW4gc2hvcnQgIm1ha2UgdGVzdDsgbWFrZSBpbnN0YWxsIiBzaG91bGQgd29yayBmb3IgbW9zdAorbWFjaGluZXMuIEZvciBVbml4OiAiLi9jb25maWd1cmU7IG1ha2UgdGVzdDsgbWFrZSBpbnN0YWxsIiBGb3IgTVNET1MsIHVzZSBvbmUKK29mIHRoZSBzcGVjaWFsIG1ha2VmaWxlcyBzdWNoIGFzIE1ha2VmaWxlLm1zYy4gRm9yIFZNUywgdXNlIE1ha2Vfdm1zLmNvbSBvcgorZGVzY3JpcC5tbXMuCiAKLVF1ZXN0aW9ucyBhYm91dCB6bGliIHNob3VsZCBiZSBzZW50IHRvIDx6bGliQGd6aXAub3JnPiwgb3IgdG8KLUdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4gZm9yIHRoZSBXaW5kb3dzIERMTCB2ZXJzaW9uLgotVGhlIHpsaWIgaG9tZSBwYWdlIGlzIGh0dHA6Ly93d3cuemxpYi5vcmcgb3IgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLwotQmVmb3JlIHJlcG9ydGluZyBhIHByb2JsZW0sIHBsZWFzZSBjaGVjayB0aGlzIHNpdGUgdG8gdmVyaWZ5IHRoYXQKLXlvdSBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliOyBvdGhlcndpc2UgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQKLWNoZWNrIHdoZXRoZXIgdGhlIHByb2JsZW0gc3RpbGwgZXhpc3RzIG9yIG5vdC4KK1F1ZXN0aW9ucyBhYm91dCB6bGliIHNob3VsZCBiZSBzZW50IHRvIDx6bGliQGd6aXAub3JnPiwgb3IgdG8gR2lsbGVzIFZvbGxhbnQKKzxpbmZvQHdpbmltYWdlLmNvbT4gZm9yIHRoZSBXaW5kb3dzIERMTCB2ZXJzaW9uLiBUaGUgemxpYiBob21lIHBhZ2UgaXMKK2h0dHA6Ly93d3cuemxpYi5vcmcgb3IgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLyBCZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwKK3BsZWFzZSBjaGVjayB0aGlzIHNpdGUgdG8gdmVyaWZ5IHRoYXQgeW91IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHpsaWI7CitvdGhlcndpc2UgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgY2hlY2sgd2hldGhlciB0aGUgcHJvYmxlbSBzdGlsbCBleGlzdHMgb3IKK25vdC4KIAotUExFQVNFIHJlYWQgdGhlIHpsaWIgRkFRIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCi1iZWZvcmUgYXNraW5nIGZvciBoZWxwLgorUExFQVNFIHJlYWQgdGhlIHpsaWIgRkFRIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sIGJlZm9yZSBhc2tpbmcKK2ZvciBoZWxwLgogCiBNYXJrIE5lbHNvbiA8bWFya25AaWVlZS5vcmc+IHdyb3RlIGFuIGFydGljbGUgYWJvdXQgemxpYiBmb3IgdGhlIEphbi4gMTk5NwogaXNzdWUgb2YgIERyLiBEb2JiJ3MgSm91cm5hbDsgYSBjb3B5IG9mIHRoZSBhcnRpY2xlIGlzIGF2YWlsYWJsZSBpbgogaHR0cDovL2RvZ21hLm5ldC9tYXJrbi9hcnRpY2xlcy96bGlidG9vbC96bGlidG9vbC5odG0KIAotVGhlIGNoYW5nZXMgbWFkZSBpbiB2ZXJzaW9uIDEuMi4wIGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIENoYW5nZUxvZy4KK1RoZSBjaGFuZ2VzIG1hZGUgaW4gdmVyc2lvbiAxLjIuMC4xIGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIENoYW5nZUxvZy4KIAogVW5zdXBwb3J0ZWQgdGhpcmQgcGFydHkgY29udHJpYnV0aW9ucyBhcmUgcHJvdmlkZWQgaW4gZGlyZWN0b3J5ICJjb250cmliIi4KIApAQCAtNDAsNTYgKzQyLDU2IEBACiBodHRwOi8vd3d3LmphdmFzb2Z0LmNvbS9wcm9kdWN0cy9KREsvMS4xL2RvY3MvYXBpL1BhY2thZ2UtamF2YS51dGlsLnppcC5odG1sCiBTZWUgdGhlIHpsaWIgaG9tZSBwYWdlIGh0dHA6Ly93d3cuemxpYi5vcmcgZm9yIGRldGFpbHMuCiAKLUEgUGVybCBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgPHBtcXNAY3Bhbi5vcmc+Ci1pcyBpbiB0aGUgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMKK0EgUGVybCBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgPHBtcXNAY3Bhbi5vcmc+IGlzIGluIHRoZQorQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMKIGh0dHA6Ly93d3cuY3Bhbi5vcmcvbW9kdWxlcy9ieS1tb2R1bGUvQ29tcHJlc3MvCiAKLUEgUHl0aG9uIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgQS5NLiBLdWNobGluZyA8YW1rQG1hZ25ldC5jb20+Ci1pcyBhdmFpbGFibGUgaW4gUHl0aG9uIDEuNSBhbmQgbGF0ZXIgdmVyc2lvbnMsIHNlZQorQSBQeXRob24gaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBBLk0uIEt1Y2hsaW5nIDxhbWtAbWFnbmV0LmNvbT4gaXMKK2F2YWlsYWJsZSBpbiBQeXRob24gMS41IGFuZCBsYXRlciB2ZXJzaW9ucywgc2VlCiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2xpYi9tb2R1bGUtemxpYi5odG1sCiAKLUEgemxpYiBiaW5kaW5nIGZvciBUQ0wgd3JpdHRlbiBieSBBbmRyZWFzIEt1cHJpZXMgPGEua3Vwcmllc0B3ZXN0ZW5kLmNvbT4KLWlzIGF2YWlsbGFibGUgYXQgaHR0cDovL3d3dy53ZXN0ZW5kLmNvbS9+a3Vwcmllcy9kb2MvdHJmL21hbi9tYW4uaHRtbAorQSB6bGliIGJpbmRpbmcgZm9yIFRDTCB3cml0dGVuIGJ5IEFuZHJlYXMgS3VwcmllcyA8YS5rdXByaWVzQHdlc3RlbmQuY29tPiBpcworYXZhaWxsYWJsZSBhdCBodHRwOi8vd3d3Lndlc3RlbmQuY29tL35rdXByaWVzL2RvYy90cmYvbWFuL21hbi5odG1sCiAKLUFuIGV4cGVyaW1lbnRhbCBwYWNrYWdlIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIGluIC56aXAgZm9ybWF0LAotd3JpdHRlbiBvbiB0b3Agb2YgemxpYiBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+LCBpcwotYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAotYW5kIGFsc28gaW4gdGhlIGNvbnRyaWIvbWluaXppcCBkaXJlY3Rvcnkgb2YgemxpYi4KK0FuIGV4cGVyaW1lbnRhbCBwYWNrYWdlIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIGluIC56aXAgZm9ybWF0LCB3cml0dGVuIG9uIHRvcAorb2YgemxpYiBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+LCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbCBhbmQgYWxzbyBpbiB0aGUgY29udHJpYi9taW5pemlwCitkaXJlY3Rvcnkgb2YgemxpYi4KIAogCiBOb3RlcyBmb3Igc29tZSB0YXJnZXRzOgogCiAtIFRvIGJ1aWxkIGEgV2luZG93cyBETEwgdmVyc2lvbiwgaW5jbHVkZSBpbiBhIERMTCBwcm9qZWN0IHpsaWIuZGVmLCB6bGliLnJjCi0gIGFuZCBhbGwgLmMgZmlsZXMgZXhjZXB0IGV4YW1wbGUuYyBhbmQgbWluaWd6aXAuYzsgY29tcGlsZSB3aXRoIC1EWkxJQl9ETEwKLSAgVGhlIHpsaWIgRExMIHN1cHBvcnQgd2FzIGluaXRpYWxseSBkb25lIGJ5IEFsZXNzYW5kcm8gSWFjb3BldHRpIGFuZCBpcwotICBub3cgbWFpbnRhaW5lZCBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+LiBDaGVjayB0aGUgemxpYiBETEwKLSAgaG9tZSBwYWdlIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwKKyAgYW5kIGFsbCAuYyBmaWxlcyBleGNlcHQgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jOyBjb21waWxlIHdpdGggLURaTElCX0RMTCBUaGUKKyAgemxpYiBETEwgc3VwcG9ydCB3YXMgaW5pdGlhbGx5IGRvbmUgYnkgQWxlc3NhbmRybyBJYWNvcGV0dGkgYW5kIGlzIG5vdworICBtYWludGFpbmVkIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4uIENoZWNrIHRoZSB6bGliIERMTCBob21lCisgIHBhZ2UgYXQgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbAogCi0gIEZyb20gVmlzdWFsIEJhc2ljLCB5b3UgY2FuIGNhbGwgdGhlIERMTCBmdW5jdGlvbnMgd2hpY2ggZG8gbm90IHRha2UKLSAgYSBzdHJ1Y3R1cmUgYXMgYXJndW1lbnQ6IGNvbXByZXNzLCB1bmNvbXByZXNzIGFuZCBhbGwgZ3oqIGZ1bmN0aW9ucy4KLSAgU2VlIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgb3IgZ2V0CisgIEZyb20gVmlzdWFsIEJhc2ljLCB5b3UgY2FuIGNhbGwgdGhlIERMTCBmdW5jdGlvbnMgd2hpY2ggZG8gbm90IHRha2UgYQorICBzdHJ1Y3R1cmUgYXMgYXJndW1lbnQ6IGNvbXByZXNzLCB1bmNvbXByZXNzIGFuZCBhbGwgZ3oqIGZ1bmN0aW9ucy4gU2VlCisgIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgb3IgZ2V0CiAgIGh0dHA6Ly93d3cudGNmYi5jb20vZG93c2V3YXJlL2NtcC16LWl0LnppcAogCi0tIEZvciA2NC1iaXQgSXJpeCwgZGVmbGF0ZS5jIG11c3QgYmUgY29tcGlsZWQgd2l0aG91dCBhbnkgb3B0aW1pemF0aW9uLgotICBXaXRoIC1PLCBvbmUgbGlicG5nIHRlc3QgZmFpbHMuIFRoZSB0ZXN0IHdvcmtzIGluIDMyIGJpdCBtb2RlICh3aXRoCi0gIHRoZSAtbjMyIGNvbXBpbGVyIGZsYWcpLiBUaGUgY29tcGlsZXIgYnVnIGhhcyBiZWVuIHJlcG9ydGVkIHRvIFNHSS4KKy0gRm9yIDY0LWJpdCBJcml4LCBkZWZsYXRlLmMgbXVzdCBiZSBjb21waWxlZCB3aXRob3V0IGFueSBvcHRpbWl6YXRpb24uIFdpdGgKKyAgLU8sIG9uZSBsaWJwbmcgdGVzdCBmYWlscy4gVGhlIHRlc3Qgd29ya3MgaW4gMzIgYml0IG1vZGUgKHdpdGggdGhlIC1uMzIKKyAgY29tcGlsZXIgZmxhZykuIFRoZSBjb21waWxlciBidWcgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gU0dJLgogCi0tIHpsaWIgZG9lc24ndCB3b3JrIHdpdGggZ2NjIDIuNi4zIG9uIGEgREVDIDMwMDAvMzAwTFggdW5kZXIgT1NGLzEgMi4xICAgCi0gIGl0IHdvcmtzIHdoZW4gY29tcGlsZWQgd2l0aCBjYy4KKy0gemxpYiBkb2Vzbid0IHdvcmsgd2l0aCBnY2MgMi42LjMgb24gYSBERUMgMzAwMC8zMDBMWCB1bmRlciBPU0YvMSAyLjEgaXQgd29ya3MKKyAgd2hlbiBjb21waWxlZCB3aXRoIGNjLgogCi0tIG9uIERpZ2l0YWwgVW5peCA0LjBEIChmb3JtZWx5IE9TRi8xKSBvbiBBbHBoYVNlcnZlciwgdGhlIGNjIG9wdGlvbiAtc3RkMQotICBpcyBuZWNlc3NhcnkgdG8gZ2V0IGd6cHJpbnRmIHdvcmtpbmcgY29ycmVjdGx5LiBUaGlzIGlzIGRvbmUgYnkgY29uZmlndXJlLgorLSBPbiBEaWdpdGFsIFVuaXggNC4wRCAoZm9ybWVseSBPU0YvMSkgb24gQWxwaGFTZXJ2ZXIsIHRoZSBjYyBvcHRpb24gLXN0ZDEgaXMKKyAgbmVjZXNzYXJ5IHRvIGdldCBnenByaW50ZiB3b3JraW5nIGNvcnJlY3RseS4gVGhpcyBpcyBkb25lIGJ5IGNvbmZpZ3VyZS4KIAotLSB6bGliIGRvZXNuJ3Qgd29yayBvbiBIUC1VWCA5LjA1IHdpdGggc29tZSB2ZXJzaW9ucyBvZiAvYmluL2NjLiBJdCB3b3JrcwotICB3aXRoIG90aGVyIGNvbXBpbGVycy4gVXNlICJtYWtlIHRlc3QiIHRvIGNoZWNrIHlvdXIgY29tcGlsZXIuCistIHpsaWIgZG9lc24ndCB3b3JrIG9uIEhQLVVYIDkuMDUgd2l0aCBzb21lIHZlcnNpb25zIG9mIC9iaW4vY2MuIEl0IHdvcmtzIHdpdGgKKyAgb3RoZXIgY29tcGlsZXJzLiBVc2UgIm1ha2UgdGVzdCIgdG8gY2hlY2sgeW91ciBjb21waWxlci4KIAogLSBnemRvcGVuIGlzIG5vdCBzdXBwb3J0ZWQgb24gUklTQ09TLCBCRU9TIGFuZCBieSBzb21lIE1hYyBjb21waWxlcnMuCiAKIC0gRm9yIFR1cmJvIEMgdGhlIHNtYWxsIG1vZGVsIGlzIHN1cHBvcnRlZCBvbmx5IHdpdGggcmVkdWNlZCBwZXJmb3JtYW5jZSB0bwogICBhdm9pZCBhbnkgZmFyIGFsbG9jYXRpb247IGl0IHdhcyB0ZXN0ZWQgd2l0aCAtRE1BWF9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MwogCi0tIEZvciBQYWxtT3MsIHNlZSBodHRwOi8vd3d3LmNzLnVpdC5uby9+cGVybS9QQVNUQS9waWxvdC9zb2Z0d2FyZS5odG1sCi0gIFBlciBIYXJhbGQgTXlydmFuZyA8cGVybUBzdHVkLmNzLnVpdC5ubz4KKy0gRm9yIFBhbG1Pcywgc2VlIGh0dHA6Ly93d3cuY3MudWl0Lm5vL35wZXJtL1BBU1RBL3BpbG90L3NvZnR3YXJlLmh0bWwgUGVyCisgIEhhcmFsZCBNeXJ2YW5nIDxwZXJtQHN0dWQuY3MudWl0Lm5vPgogCiAKIEFja25vd2xlZGdtZW50czoKQEAgLTEyOSw0ICsxMzEsNiBAQAogaW5jbHVkZSB0aGlyZC1wYXJ0eSBjb2RlLgogCiBJZiB5b3UgcmVkaXN0cmlidXRlIG1vZGlmaWVkIHNvdXJjZXMsIHdlIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3UgaW5jbHVkZQotaW4gdGhlIGZpbGUgQ2hhbmdlTG9nIGhpc3RvcnkgaW5mb3JtYXRpb24gZG9jdW1lbnRpbmcgeW91ciBjaGFuZ2VzLgoraW4gdGhlIGZpbGUgQ2hhbmdlTG9nIGhpc3RvcnkgaW5mb3JtYXRpb24gZG9jdW1lbnRpbmcgeW91ciBjaGFuZ2VzLiBQbGVhc2UKK3JlYWQgdGhlIEZBUSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIG1vZGlmaWVkIHNvdXJjZQordmVyc2lvbnMuCmRpZmYgLS1naXQgYS9hZGxlcjMyLmMgYi9hZGxlcjMyLmMKaW5kZXggMzE5NjAzYy4uMjhjNjViYSAxMDA2NDQKLS0tIGEvYWRsZXIzMi5jCisrKyBiL2FkbGVyMzIuYwpAQCAtMzQsMTIgKzM0LDEyIEBACiAgICAgICAgIGxlbiAtPSBrOwogICAgICAgICB3aGlsZSAoayA+PSAxNikgewogICAgICAgICAgICAgRE8xNihidWYpOwotCSAgICBidWYgKz0gMTY7CisgICAgICAgICAgICBidWYgKz0gMTY7CiAgICAgICAgICAgICBrIC09IDE2OwogICAgICAgICB9CiAgICAgICAgIGlmIChrICE9IDApIGRvIHsKICAgICAgICAgICAgIHMxICs9ICpidWYrKzsKLQkgICAgczIgKz0gczE7CisgICAgICAgICAgICBzMiArPSBzMTsKICAgICAgICAgfSB3aGlsZSAoLS1rKTsKICAgICAgICAgczEgJT0gQkFTRTsKICAgICAgICAgczIgJT0gQkFTRTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIgYi9jb250cmliL1JFQURNRS5jb250cmliCmluZGV4IGZjZWUwMjAuLjM1NzlkNDMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIKKysrIGIvY29udHJpYi9SRUFETUUuY29udHJpYgpAQCAtMTIsNyArMTIsNyBAQAogICAgICAgICBTZWUgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAogCiBibGFzdC8gICAgICBieSBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgotCURlY29tcHJlc3NvciBmb3Igb3V0cHV0IG9mIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkKKwlEZWNvbXByZXNzb3IgZm9yIG91dHB1dCBvZiBQS1dhcmUgRGF0YSBDb21wcmVzc2lvbiBMaWJyYXJ5IChEQ0wpCiAKIGRlbHBoaS8gICAgIGJ5IEJvYiBEZWxsYWNhIDxib2JkbEB4dHJhLmNvLm56PgogCVN1cHBvcnQgZm9yIERlbHBoaQpAQCAtMzMsOCArMzMsMTUgQEAKIGlvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+CiAJQW5vdGhlciBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlCiAKK3Rlc3R6bGliLyAgICBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CisJRXhhbXBsZSBvZiB0aGUgdXNlIG9mIHpsaWIKKwogdW50Z3ovICAgICAgYnkgIlBlZHJvIEEuIEFyYW5kYSBHdXRpXGlycmV6IiA8cGFhZ0B0aWQuZXM+CiAJQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYgogCiB2aXN1YWwtYmFzaWMudHh0IGJ5IENhcmxvcyBSaW9zIDxjX3Jpb3NAc29uZGEuY2w+CiAgICAgICAgIEhvdyB0byB1c2UgY29tcHJlc3MoKSwgdW5jb21wcmVzcygpIGFuZCB0aGUgZ3oqIGZ1bmN0aW9ucyBmcm9tIFZCLgorCit2c3R1ZGlvLyAgICBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CisJQnVpbGRpbmcgemxpYiBETEwgd2l0aCBWaXN1YWwgU3R1ZGlvIC5ORVQKKwlJbmNsdWRlcyB4ODYgaW5mZmFzdC5hc20gZm9yIE1BU00KZGlmZiAtLWdpdCBhL2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhczg2LmMgYi9jb250cmliL2luZmxhdGU4Ni9pbmZmYXM4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzQ2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2luZmxhdGU4Ni9pbmZmYXM4Ni5jCkBAIC0wLDAgKzEsNzgzIEBACisvKiBpbmZmYXM4Ni5jIGlzIGEgaGFuZCB0dW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZgorICoKKyAqIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzIEFuZGVyc29uIDxjaHJpc3RvcEBjaGFybS5uZXQ+CisgKiBQbGVhc2UgdXNlIHRoZSBjb3B5cmlnaHQgY29uZGl0aW9ucyBhYm92ZS4KKyAqCisgKiBNYXItMTMtMjAwMyAtLSBNb3N0IG9mIHRoaXMgaXMgZGVyaXZlZCBmcm9tIGluZmZhc3QuUyB3aGljaCBpcyBkZXJpdmVkIGZyb20KKyAqIHRoZSBnY2MgLVMgb3V0cHV0IG9mIHpsaWItMS4yLjAvaW5mZmFzdC5jLiAgWmxpYi0xLjIuMCBpcyBpbiBiZXRhIHJlbGVhc2UgYXQKKyAqIHRoZSBtb21lbnQuICBJIGhhdmUgc3VjY2Vzc2Z1bGx5IGNvbXBpbGVkIGFuZCB0ZXN0ZWQgdGhpcyBjb2RlIHdpdGggZ2NjMi45NiwKKyAqIGdjYzMuMiwgaWNjNS4wLCBtc3ZjNi4wLiAgSXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgc3BlZWQgb2YgaW5mZmFzdC5TCisgKiBjb21waWxlZCB3aXRoIGdjYyAtRE5PX01NWCwgYnV0IGluZmZhc3QuUyBpcyBzdGlsbCBmYXN0ZXIgb24gdGhlIFAzIHdpdGggTU1YCisgKiBlbmFibGVkLiAgSSB3aWxsIGF0dGVtcHQgdG8gbWVyZ2UgdGhlIE1NWCBjb2RlIGludG8gdGhpcyB2ZXJzaW9uLiAgTmV3ZXIKKyAqIHZlcnNpb25zIG9mIHRoaXMgYW5kIGluZmZhc3QuUyBjYW4gYmUgZm91bmQgYXQKKyAqIGh0dHA6Ly93d3cuZWV0YmVldGVlLmNvbS96bGliLyBhbmQgaHR0cDovL3d3dy5jaGFybS5uZXQvfmNocmlzdG9wL3psaWIvCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisvKiBNYXJrIEFkbGVyJ3MgY29tbWVudHMgZnJvbSBpbmZmYXN0LmM6ICovCisKKy8qCisgICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nCisgICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXMKKyAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yCisgICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlCisgICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS4KKworICAgRW50cnkgYXNzdW1wdGlvbnM6CisKKyAgICAgICAgc3RhdGUtPm1vZGUgPT0gTEVOCisgICAgICAgIHN0cm0tPmF2YWlsX2luID49IDYKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID49IDI1OAorICAgICAgICBzdGFydCA+PSBzdHJtLT5hdmFpbF9vdXQKKyAgICAgICAgc3RhdGUtPmJpdHMgPCA4CisKKyAgIE9uIHJldHVybiwgc3RhdGUtPm1vZGUgaXMgb25lIG9mOgorCisgICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dAorICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9jaworICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YQorCisgICBOb3RlczoKKworICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlCisgICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSwKKyAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuCisgICAgICBUaGVyZWZvcmUgaWYgc3RybS0+YXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWQKKyAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuCisKKyAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNTgKKyAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKQorICAgICAgcmVxdWlyZXMgc3RybS0+YXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvcgorICAgICAgb3V0cHV0IHNwYWNlLgorICovCit2b2lkIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkKK3pfc3RyZWFtcCBzdHJtOwordW5zaWduZWQgc3RhcnQ7ICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgc3RydWN0IGluZmZhc3RfYXIgeworICAgICAgdm9pZCAqZXNwOyAgICAgICAgICAgICAgICAgIC8qIGVzcCBzYXZlICovCisgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgICAgLyogbG9jYWwgc3RybS0+bmV4dF9pbiAqLworICAgICAgdW5zaWduZWQgY2hhciBGQVIgKmxhc3Q7ICAgIC8qIHdoaWxlIGluIDwgbGFzdCwgZW5vdWdoIGlucHV0IGF2YWlsYWJsZSAqLworICAgICAgdW5zaWduZWQgY2hhciBGQVIgKm91dDsgICAgIC8qIGxvY2FsIHN0cm0tPm5leHRfb3V0ICovCisgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqYmVnOyAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLT5uZXh0X291dCAqLworICAgICAgdW5zaWduZWQgY2hhciBGQVIgKmVuZDsgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqLworICAgICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLworICAgICAgdW5zaWduZWQgd3JpdGU7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLworICAgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqLworICAgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGxvY2FsIHN0cm0tPmhvbGQgKi8KKyAgICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLT5iaXRzICovCisgICAgICBjb2RlIGNvbnN0IEZBUiAqbGNvZGU7ICAgICAgLyogbG9jYWwgc3RybS0+bGVuY29kZSAqLworICAgICAgY29kZSBjb25zdCBGQVIgKmRjb2RlOyAgICAgIC8qIGxvY2FsIHN0cm0tPmRpc3Rjb2RlICovCisgICAgICB1bnNpZ25lZCBsbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovCisgICAgICB1bnNpZ25lZCBkbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyAgICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqLworICAgICAgdW5zaWduZWQgZGlzdDsgICAgICAgICAgICAgIC8qIG1hdGNoIGRpc3RhbmNlICovCisgICAgICB1bnNpZ25lZCBzdGF0dXM7ICAgICAgICAgICAgLyogdGhpcyBpcyBzZXQgd2hlbiBzdGF0ZSBjaGFuZ2VzICovCisgICAgfSBhcjsKKworICAgIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgYXIuaW4gPSBzdHJtLT5uZXh0X2luOworICAgIGFyLmxhc3QgPSBhci5pbiArIChzdHJtLT5hdmFpbF9pbiAtIDUpOworICAgIGFyLm91dCA9IHN0cm0tPm5leHRfb3V0OworICAgIGFyLmJlZyA9IGFyLm91dCAtIChzdGFydCAtIHN0cm0tPmF2YWlsX291dCk7CisgICAgYXIuZW5kID0gYXIub3V0ICsgKHN0cm0tPmF2YWlsX291dCAtIDI1Nyk7CisgICAgYXIud3NpemUgPSBzdGF0ZS0+d3NpemU7CisgICAgYXIud3JpdGUgPSBzdGF0ZS0+d3JpdGU7CisgICAgYXIud2luZG93ID0gc3RhdGUtPndpbmRvdzsKKyAgICBhci5ob2xkID0gc3RhdGUtPmhvbGQ7CisgICAgYXIuYml0cyA9IHN0YXRlLT5iaXRzOworICAgIGFyLmxjb2RlID0gc3RhdGUtPmxlbmNvZGU7CisgICAgYXIuZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7CisgICAgYXIubG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsKKyAgICBhci5kbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsKKworICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaAorICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovCisKKyAgICAvKiBhbGlnbiBpbiBvbiAyIGJ5dGUgYm91bmRhcnkgKi8KKyAgICBpZiAoKCh1bnNpZ25lZCBsb25nKSh2b2lkICopYXIuaW4gJiAweDEpICE9IDApIHsKKyAgICAgICAgYXIuaG9sZCArPSAodW5zaWduZWQgbG9uZykqYXIuaW4rKyA8PCBhci5iaXRzOworICAgICAgICBhci5iaXRzICs9IDg7CisgICAgfQorCisjaWYgZGVmaW5lZCggX19HTlVDX18gKSB8fCBkZWZpbmVkKCBfX0lDQyApCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorIiAgICAgICAgbGVhbCAgICAlMCwgJSVlYXhcbiIKKyIgICAgICAgIHB1c2hmXG4iCisiICAgICAgICBwdXNobCAgICUlZWJwXG4iCisiICAgICAgICBtb3ZsICAgICUlZXNwLCAoJSVlYXgpXG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVzcFxuIgorIiAgICAgICAgbW92bCAgICA0KCUlZXNwKSwgJSVlc2lcbiIgICAgICAgLyogZXNpID0gaW4gKi8KKyIgICAgICAgIG1vdmwgICAgMTIoJSVlc3ApLCAlJWVkaVxuIiAgICAgIC8qIGVkaSA9IG91dCAqLworIiAgICAgICAgbW92bCAgICAzNiglJWVzcCksICUlZWR4XG4iICAgICAgLyogZWR4ID0gaG9sZCAqLworIiAgICAgICAgbW92bCAgICA0MCglJWVzcCksICUlZWJ4XG4iICAgICAgLyogZWJ4ID0gYml0cyAqLworIiAgICAgICAgbW92bCAgICA0NCglJWVzcCksICUlZWJwXG4iICAgICAgLyogZWJwID0gbGNvZGUgKi8KKworIiAgICAgICAgY2xkXG4iCisiICAgICAgICBqbXAgICAgIC5MX2RvX2xvb3BcbiIKKworIi5MX3doaWxlX3Rlc3Q6XG4iCisiICAgICAgICBjbXBsICAgICUlZWRpLCAyMCglJWVzcClcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcFxuIgorIiAgICAgICAgY21wbCAgICAlJWVzaSwgOCglJWVzcClcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcFxuIgorCisiLkxfZG9fbG9vcDpcbiIKKyIgICAgICAgIGNtcGIgICAgJDE1LCAlJWJsXG4iCisiICAgICAgICBqYSAgICAgIC5MX2dldF9sZW5ndGhfY29kZVxuIiAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLworCisiICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgorIiAgICAgICAgbG9kc3dcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KKyIgICAgICAgIG1vdmIgICAgJSVibCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisiICAgICAgICBhZGRiICAgICQxNiwgJSVibFxuIiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBvcmwgICAgICUlZWF4LCAlJWVkeFxuIiAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKKyIuTF9nZXRfbGVuZ3RoX2NvZGU6XG4iCisiICAgICAgICBtb3ZsICAgIDUyKCUlZXNwKSwgJSVlYXhcbiIgICAgICAvKiBlYXggPSBsbWFzayAqLworIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIG1vdmwgICAgKCUlZWJwLCUlZWF4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisKKyIuTF9kb2xlbjpcbiIKKyIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gdGhpcy5iaXRzICovCisiICAgICAgICBzdWJiICAgICUlYWgsICUlYmxcbiIgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworIiAgICAgICAgc2hybCAgICAlJWNsLCAlJWVkeFxuIiAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCisKKyIgICAgICAgIHRlc3RiICAgJSVhbCwgJSVhbFxuIgorIiAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZVxuIiAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8KKworIiAgICAgICAgc2hybCAgICAkMTYsICUlZWF4XG4iICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KKyIgICAgICAgIHN0b3NiXG4iCisiICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKKworIi5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlOlxuIgorIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVlY3hcbiIgICAgICAgICAgLyogbGVuID0gdGhpcyAqLworIiAgICAgICAgc2hybCAgICAkMTYsICUlZWN4XG4iICAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8KKyIgICAgICAgIG1vdmwgICAgJSVlY3gsIDYwKCUlZXNwKVxuIiAgICAgIC8qIGxlbiA9IHRoaXMgKi8KKyIgICAgICAgIG1vdmIgICAgJSVhbCwgJSVjbFxuIgorCisiICAgICAgICB0ZXN0YiAgICQxNiwgJSVhbFxuIgorIiAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoXG4iIC8qIGlmICgob3AgJiAxNikgPT0gMCkgOCUgKi8KKyIgICAgICAgIGFuZGIgICAgJDE1LCAlJWNsXG4iICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisiICAgICAgICBqeiAgICAgIC5MX2RlY29kZV9kaXN0YW5jZVxuIiAgICAvKiBpZiAoIW9wKSAqLworIiAgICAgICAgY21wYiAgICAlJWNsLCAlJWJsXG4iCisiICAgICAgICBqYWUgICAgIC5MX2FkZF9iaXRzX3RvX2xlblxuIiAgICAvKiBpZiAob3AgPD0gYml0cykgKi8KKworIiAgICAgICAgbW92YiAgICAlJWNsLCAlJWNoXG4iICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8KKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBsb2Rzd1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyIgICAgICAgIGFkZGIgICAgJDE2LCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIG9ybCAgICAgJSVlYXgsICUlZWR4XG4iICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisiICAgICAgICBtb3ZiICAgICUlY2gsICUlY2xcbiIgICAgICAgICAgICAvKiBtb3ZlIG9wIGJhY2sgdG8gZWN4ICovCisKKyIuTF9hZGRfYml0c190b19sZW46XG4iCisiICAgICAgICBtb3ZsICAgICQxLCAlJWVheFxuIgorIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgorIiAgICAgICAgZGVjbCAgICAlJWVheFxuIgorIiAgICAgICAgc3ViYiAgICAlJWNsLCAlJWJsXG4iCisiICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworIiAgICAgICAgc2hybCAgICAlJWNsLCAlJWVkeFxuIgorIiAgICAgICAgYWRkbCAgICAlJWVheCwgNjAoJSVlc3ApXG4iICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLworCisiLkxfZGVjb2RlX2Rpc3RhbmNlOlxuIgorIiAgICAgICAgY21wYiAgICAkMTUsICUlYmxcbiIKKyIgICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RhbmNlX2NvZGVcbiIgIC8qIGlmICgxNSA8IGJpdHMpICovCisKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBsb2Rzd1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyIgICAgICAgIGFkZGIgICAgJDE2LCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIG9ybCAgICAgJSVlYXgsICUlZWR4XG4iICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKKyIuTF9nZXRfZGlzdGFuY2VfY29kZTpcbiIKKyIgICAgICAgIG1vdmwgICAgNTYoJSVlc3ApLCAlJWVheFxuIiAgICAgIC8qIGVheCA9IGRtYXNrICovCisiICAgICAgICBtb3ZsICAgIDQ4KCUlZXNwKSwgJSVlY3hcbiIgICAgICAvKiBlY3ggPSBkY29kZSAqLworIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIG1vdmwgICAgKCUlZWN4LCUlZWF4LDQpLCAlJWVheFxuIi8qIGVheCA9IGRjb2RlW2hvbGQgJiBkbWFza10gKi8KKworIi5MX2RvZGlzdDpcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlZWJwXG4iICAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVlYnBcbiIgICAgICAgICAgICAvKiBkaXN0ID0gdGhpcy52YWwgKi8KKyIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIgorIiAgICAgICAgc3ViYiAgICAlJWFoLCAlJWJsXG4iICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKyIgICAgICAgIHNocmwgICAgJSVjbCwgJSVlZHhcbiIgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLworIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSB0aGlzLm9wICovCisKKyIgICAgICAgIHRlc3RiICAgJDE2LCAlJWFsXG4iICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KKyIgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3RcbiIKKyIgICAgICAgIGFuZGIgICAgJDE1LCAlJWNsXG4iICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisiICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lXG4iCisiICAgICAgICBjbXBiICAgICUlY2wsICUlYmxcbiIKKyIgICAgICAgIGphZSAgICAgLkxfYWRkX2JpdHNfdG9fZGlzdFxuIiAgIC8qIGlmIChvcCA8PSBiaXRzKSA5Ny42JSAqLworCisiICAgICAgICBtb3ZiICAgICUlY2wsICUlY2hcbiIgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLworIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKKyIgICAgICAgIGxvZHN3XG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisiICAgICAgICBtb3ZiICAgICUlYmwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLworIiAgICAgICAgYWRkYiAgICAkMTYsICUlYmxcbiIgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgorIiAgICAgICAgb3JsICAgICAlJWVheCwgJSVlZHhcbiIgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworIiAgICAgICAgbW92YiAgICAlJWNoLCAlJWNsXG4iICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLworCisiLkxfYWRkX2JpdHNfdG9fZGlzdDpcbiIKKyIgICAgICAgIG1vdmwgICAgJDEsICUlZWF4XG4iCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBkZWNsICAgICUlZWF4XG4iICAgICAgICAgICAgICAgICAvKiAoMSA8PCBvcCkgLSAxICovCisiICAgICAgICBzdWJiICAgICUlY2wsICUlYmxcbiIKKyIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisiICAgICAgICBzaHJsICAgICUlY2wsICUlZWR4XG4iCisiICAgICAgICBhZGRsICAgICUlZWF4LCAlJWVicFxuIiAgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkgKi8KKworIi5MX2NoZWNrX3dpbmRvdzpcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlc2ksIDQoJSVlc3ApXG4iICAgICAgIC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovCisiICAgICAgICBtb3ZsICAgICUlZWRpLCAlJWVheFxuIgorIiAgICAgICAgc3VibCAgICAxNiglJWVzcCksICUlZWF4XG4iICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovCisKKyIgICAgICAgIGNtcGwgICAgJSVlYnAsICUlZWF4XG4iCisiICAgICAgICBqYiAgICAgIC5MX2NsaXBfd2luZG93XG4iICAgICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLworCisiICAgICAgICBtb3ZsICAgIDYwKCUlZXNwKSwgJSVlY3hcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlZGksICUlZXNpXG4iCisiICAgICAgICBzdWJsICAgICUlZWJwLCAlJWVzaVxuIiAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCisiICAgICAgICBzdWJsICAgICQzLCAlJWVjeFxuIiAgICAgICAgICAgICAvKiBjb3B5IGZyb20gdG8gb3V0ICovCisiICAgICAgICBtb3ZiICAgICglJWVzaSksICUlYWxcbiIKKyIgICAgICAgIG1vdmIgICAgJSVhbCwgKCUlZWRpKVxuIgorIiAgICAgICAgbW92YiAgICAxKCUlZXNpKSwgJSVhbFxuIgorIiAgICAgICAgbW92YiAgICAyKCUlZXNpKSwgJSVhaFxuIgorIiAgICAgICAgYWRkbCAgICAkMywgJSVlc2lcbiIKKyIgICAgICAgIG1vdmIgICAgJSVhbCwgMSglJWVkaSlcbiIKKyIgICAgICAgIG1vdmIgICAgJSVhaCwgMiglJWVkaSlcbiIKKyIgICAgICAgIGFkZGwgICAgJDMsICUlZWRpXG4iCisiICAgICAgICByZXAgICAgIG1vdnNiXG4iCisKKyIgICAgICAgIG1vdmwgICAgNCglJWVzcCksICUlZXNpXG4iICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworIiAgICAgICAgbW92bCAgICA0NCglJWVzcCksICUlZWJwXG4iICAgICAvKiBlYnAgPSBsY29kZSAqLworIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCisKKyIuTF9jaGVja19kaXN0X29uZTpcbiIKKyIgICAgICAgIGNtcGwgICAgJDEsICUlZWJwXG4iICAgICAgICAgICAgLyogaWYgZGlzdCAxLCBpcyBhIG1lbXNldCAqLworIiAgICAgICAgam5lICAgICAuTF9jaGVja193aW5kb3dcbiIKKyIgICAgICAgIGNtcGwgICAgJSVlZGksIDE2KCUlZXNwKVxuIgorIiAgICAgICAgamUgICAgICAuTF9jaGVja193aW5kb3dcbiIKKworIiAgICAgICAgZGVjbCAgICAlJWVkaVxuIgorIiAgICAgICAgbW92bCAgICA2MCglJWVzcCksICUlZWN4XG4iCisiICAgICAgICBtb3ZiICAgICglJWVkaSksICUlYWxcbiIKKyIgICAgICAgIHN1YmwgICAgJDMsICUlZWN4XG4iCisKKyIgICAgICAgIG1vdmIgICAgJSVhbCwgMSglJWVkaSlcbiIgICAgICAgLyogbWVtc2V0IG91dCB3aXRoIGZyb21bLTFdICovCisiICAgICAgICBtb3ZiICAgICUlYWwsIDIoJSVlZGkpXG4iCisiICAgICAgICBtb3ZiICAgICUlYWwsIDMoJSVlZGkpXG4iCisiICAgICAgICBhZGRsICAgICQ0LCAlJWVkaVxuIgorIiAgICAgICAgcmVwICAgICBzdG9zYlxuIgorIiAgICAgICAgbW92bCAgICA0NCglJWVzcCksICUlZWJwXG4iICAgICAgLyogZWJwID0gbGNvZGUgKi8KKyIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgorCisiLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDpcbiIKKyIgICAgICAgIHRlc3RiICAgJDY0LCAlJWFsXG4iCisiICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9ja1xuIiAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCisKKyIgICAgICAgIG1vdmwgICAgJDEsICUlZWF4XG4iCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBkZWNsICAgICUlZWF4XG4iCisiICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisiICAgICAgICBhZGRsICAgIDYwKCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLworIiAgICAgICAgbW92bCAgICAoJSVlYnAsJSVlYXgsNCksICUlZWF4XG4iIC8qIGVheCA9IGxjb2RlW3ZhbCsoaG9sZCZtYXNrW29wXSldKi8KKyIgICAgICAgIGptcCAgICAgLkxfZG9sZW5cbiIKKworIi5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0OlxuIgorIiAgICAgICAgdGVzdGIgICAkNjQsICUlYWxcbiIKKyIgICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlXG4iIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworIiAgICAgICAgbW92bCAgICAkMSwgJSVlYXhcbiIKKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIKKyIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIGFkZGwgICAgJSVlYnAsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICs9IHRoaXMudmFsICovCisiICAgICAgICBtb3ZsICAgIDQ4KCUlZXNwKSwgJSVlY3hcbiIgICAgIC8qIGVjeCA9IGRjb2RlICovCisiICAgICAgICBtb3ZsICAgICglJWVjeCwlJWVheCw0KSwgJSVlYXhcbiIgLyogZWF4ID0gZGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLworIiAgICAgICAgam1wICAgICAuTF9kb2Rpc3RcbiIKKworIi5MX2NsaXBfd2luZG93OlxuIgorIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVlY3hcbiIKKyIgICAgICAgIG1vdmwgICAgMjQoJSVlc3ApLCAlJWVheFxuIiAgICAgLyogcHJlcGFyZSBmb3IgZGlzdCBjb21wYXJlICovCisiICAgICAgICBuZWdsICAgICUlZWN4XG4iICAgICAgICAgICAgICAgIC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KKyIgICAgICAgIG1vdmwgICAgMzIoJSVlc3ApLCAlJWVzaVxuIiAgICAgLyogZnJvbSA9IHdpbmRvdyAqLworCisiICAgICAgICBjbXBsICAgICUlZWJwLCAlJWVheFxuIgorIiAgICAgICAgamIgICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJcbiIgLyogaWYgKGRpc3QgPiB3c2l6ZSkgKi8KKworIiAgICAgICAgYWRkbCAgICAlJWVicCwgJSVlY3hcbiIgICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCisiICAgICAgICBjbXBsICAgICQwLCAyOCglJWVzcClcbiIKKyIgICAgICAgIGpuZSAgICAgLkxfd3JhcF9hcm91bmRfd2luZG93XG4iIC8qIGlmICh3cml0ZSAhPSAwKSAqLworCisiICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIgorIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovCisKKyIgICAgICAgIG1vdmwgICAgNjAoJSVlc3ApLCAlJWVheFxuIgorIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFcbiIgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorIiAgICAgICAgbW92bCAgICAlJWVkaSwgJSVlc2lcbiIKKyIgICAgICAgIHN1YmwgICAgJSVlYnAsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyIgICAgICAgIGptcCAgICAgLkxfZG9fY29weTFcbiIKKworIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFcbiIgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorIiAgICAgICAgbW92bCAgICAlJWVkaSwgJSVlc2lcbiIKKyIgICAgICAgIHN1YmwgICAgJSVlYnAsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyIgICAgICAgIGptcCAgICAgLkxfZG9fY29weTFcbiIKKworIi5MX3dyYXBfYXJvdW5kX3dpbmRvdzpcbiIKKyIgICAgICAgIG1vdmwgICAgMjgoJSVlc3ApLCAlJWVheFxuIgorIiAgICAgICAgY21wbCAgICAlJWVheCwgJSVlY3hcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfY29udGlndW91c19pbl93aW5kb3dcbiIgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KKworIiAgICAgICAgYWRkbCAgICAyNCglJWVzcCksICUlZXNpXG4iCisiICAgICAgICBhZGRsICAgICUlZWF4LCAlJWVzaVxuIgorIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBuYnl0ZXMgKi8KKyIgICAgICAgIHN1YmwgICAgJSVlYXgsICUlZWN4XG4iICAgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovCisKKyIgICAgICAgIG1vdmwgICAgNjAoJSVlc3ApLCAlJWVheFxuIgorIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFcbiIgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorIiAgICAgICAgbW92bCAgICAzMiglJWVzcCksICUlZXNpXG4iICAgICAvKiBmcm9tID0gd2luZG93ICovCisiICAgICAgICBtb3ZsICAgIDI4KCUlZXNwKSwgJSVlY3hcbiIgICAgIC8qIG5ieXRlcyA9IHdyaXRlICovCisiICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgorIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5MVxuIiAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisiICAgICAgICByZXAgICAgIG1vdnNiXG4iCisiICAgICAgICBtb3ZsICAgICUlZWRpLCAlJWVzaVxuIgorIiAgICAgICAgc3VibCAgICAlJWVicCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworIiAgICAgICAgam1wICAgICAuTF9kb19jb3B5MVxuIgorCisiLkxfY29udGlndW91c19pbl93aW5kb3c6XG4iCisiICAgICAgICBhZGRsICAgICUlZWF4LCAlJWVzaVxuIgorIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzICovCisKKyIgICAgICAgIG1vdmwgICAgNjAoJSVlc3ApLCAlJWVheFxuIgorIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFcbiIgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorIiAgICAgICAgbW92bCAgICAlJWVkaSwgJSVlc2lcbiIKKyIgICAgICAgIHN1YmwgICAgJSVlYnAsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKworIi5MX2RvX2NvcHkxOlxuIgorIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVlY3hcbiIKKyIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKKworIiAgICAgICAgbW92bCAgICA0KCUlZXNwKSwgJSVlc2lcbiIgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisiICAgICAgICBtb3ZsICAgIDQ0KCUlZXNwKSwgJSVlYnBcbiIgICAgIC8qIGVicCA9IGxjb2RlICovCisiICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKKworIi5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jazpcbiIKKyIgICAgICAgIHRlc3RiICAgJDMyLCAlJWFsXG4iCisiICAgICAgICBqeiAgICAgIC5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZVxuIgorIiAgICAgICAgbW92bCAgICAkMSwgNjgoJSVlc3ApXG4iCisiICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKKworIi5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZTpcbiIKKyIgICAgICAgIG1vdmwgICAgJDIsIDY4KCUlZXNwKVxuIgorIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCisKKyIuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGU6XG4iCisiICAgICAgICBtb3ZsICAgICQzLCA2OCglJWVzcClcbiIKKyIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgorCisiLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyOlxuIgorIiAgICAgICAgbW92bCAgICA0KCUlZXNwKSwgJSVlc2lcbiIKKyIgICAgICAgIG1vdmwgICAgJDQsIDY4KCUlZXNwKVxuIgorIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCisKKyIuTF9icmVha19sb29wOlxuIgorIiAgICAgICAgbW92bCAgICAkMCwgNjgoJSVlc3ApXG4iCisKKyIuTF9icmVha19sb29wX3dpdGhfc3RhdHVzOlxuIgorLyogcHV0IGluLCBvdXQsIGJpdHMsIGFuZCBob2xkIGJhY2sgaW50byBhciBhbmQgcG9wIGVzcCAqLworIiAgICAgICAgbW92bCAgICAlJWVzaSwgNCglJWVzcClcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlZGksIDEyKCUlZXNwKVxuIgorIiAgICAgICAgbW92bCAgICAlJWVieCwgNDAoJSVlc3ApXG4iCisiICAgICAgICBtb3ZsICAgICUlZWR4LCAzNiglJWVzcClcbiIKKyIgICAgICAgIG1vdmwgICAgKCUlZXNwKSwgJSVlc3BcbiIKKyIgICAgICAgIHBvcGwgICAgJSVlYnBcbiIKKyIgICAgICAgIHBvcGZcbiIKKyAgICAgICAgICA6CisgICAgICAgICAgOiAibSIgKGFyKQorICAgICAgICAgIDogIm1lbW9yeSIsICIlZWF4IiwgIiVlYngiLCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIKKyAgICApOworI2VsaWYgZGVmaW5lZCggX01TQ19WRVIgKQorICAgIF9fYXNtIHsKKwlsZWEJZWF4LCBhcgorCXB1c2hmZAorCXB1c2gJZWJwCisJbW92CVtlYXhdLCBlc3AKKwltb3YJZXNwLCBlYXgKKwltb3YJZXNpLCBbZXNwKzRdICAgICAgIC8qIGVzaSA9IGluICovCisJbW92CWVkaSwgW2VzcCsxMl0gICAgICAvKiBlZGkgPSBvdXQgKi8KKwltb3YJZWR4LCBbZXNwKzM2XSAgICAgIC8qIGVkeCA9IGhvbGQgKi8KKwltb3YJZWJ4LCBbZXNwKzQwXSAgICAgIC8qIGVieCA9IGJpdHMgKi8KKwltb3YJZWJwLCBbZXNwKzQ0XSAgICAgIC8qIGVicCA9IGxjb2RlICovCisKKwljbGQKKwlqbXAJTF9kb19sb29wCisKK0xfd2hpbGVfdGVzdDoKKwljbXAJW2VzcCsyMF0sIGVkaQorCWpiZQlMX2JyZWFrX2xvb3AKKwljbXAJW2VzcCs4XSwgZXNpCisJamJlCUxfYnJlYWtfbG9vcAorCitMX2RvX2xvb3A6CisJY21wCWJsLCAxNQorCWphCUxfZ2V0X2xlbmd0aF9jb2RlICAgIC8qIGlmICgxNSA8IGJpdHMpICovCisKKwl4b3IJZWF4LCBlYXgKKwlsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworCW1vdgljbCwgYmwgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLworCWFkZAlibCwgMTYgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworCXNobAllYXgsIGNsCisJb3IJZWR4LCBlYXggICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworCitMX2dldF9sZW5ndGhfY29kZToKKwltb3YJZWF4LCBbZXNwKzUyXSAgICAgIC8qIGVheCA9IGxtYXNrICovCisJYW5kCWVheCwgZWR4ICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisJbW92CWVheCwgW2VicCtlYXgqNF0gLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLworCitMX2RvbGVuOgorCW1vdgljbCwgYWggICAgICAgICAgICAvKiBjbCA9IHRoaXMuYml0cyAqLworCXN1YglibCwgYWggICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworCXNocgllZHgsIGNsICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KKworCXRlc3QJYWwsIGFsCisJam56CUxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UgLyogaWYgKG9wICE9IDApIDQ1LjclICovCisKKwlzaHIJZWF4LCAxNiAgICAgICAgICAgIC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovCisJc3Rvc2IKKwlqbXAJTF93aGlsZV90ZXN0CisKK0xfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6CisJbW92CWVjeCwgZWF4ICAgICAgICAgIC8qIGxlbiA9IHRoaXMgKi8KKwlzaHIJZWN4LCAxNiAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCisJbW92CVtlc3ArNjBdLCBlY3ggICAgICAvKiBsZW4gPSB0aGlzICovCisJbW92CWNsLCBhbAorCisJdGVzdAlhbCwgMTYKKwlqeglMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGggLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLworCWFuZAljbCwgMTUgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KKwlqeglMX2RlY29kZV9kaXN0YW5jZSAgICAvKiBpZiAoIW9wKSAqLworCWNtcAlibCwgY2wKKwlqYWUJTF9hZGRfYml0c190b19sZW4gICAgLyogaWYgKG9wIDw9IGJpdHMpICovCisKKwltb3YJY2gsIGNsICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8KKwl4b3IJZWF4LCBlYXgKKwlsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworCW1vdgljbCwgYmwgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLworCWFkZAlibCwgMTYgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworCXNobAllYXgsIGNsCisJb3IJZWR4LCBlYXggICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KKwltb3YJY2wsIGNoICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLworCitMX2FkZF9iaXRzX3RvX2xlbjoKKwltb3YJZWF4LCAxCisJc2hsCWVheCwgY2wKKwlkZWMJZWF4CisJc3ViCWJsLCBjbAorCWFuZAllYXgsIGVkeCAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworCXNocgllZHgsIGNsCisJYWRkCVtlc3ArNjBdLCBlYXggICAgICAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovCisKK0xfZGVjb2RlX2Rpc3RhbmNlOgorCWNtcAlibCwgMTUKKwlqYQlMX2dldF9kaXN0YW5jZV9jb2RlICAvKiBpZiAoMTUgPCBiaXRzKSAqLworCisJeG9yCWVheCwgZWF4CisJbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KKwltb3YJY2wsIGJsICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKwlhZGQJYmwsIDE2ICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKwlzaGwJZWF4LCBjbAorCW9yCWVkeCwgZWF4ICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKK0xfZ2V0X2Rpc3RhbmNlX2NvZGU6CisJbW92CWVheCwgW2VzcCs1Nl0gICAgICAvKiBlYXggPSBkbWFzayAqLworCW1vdgllY3gsIFtlc3ArNDhdICAgICAgLyogZWN4ID0gZGNvZGUgKi8KKwlhbmQJZWF4LCBlZHggICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKwltb3YJZWF4LCBbZWN4K2VheCo0XS8qIGVheCA9IGRjb2RlW2hvbGQgJiBkbWFza10gKi8KKworTF9kb2Rpc3Q6CisJbW92CWVicCwgZWF4ICAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovCisJc2hyCWVicCwgMTYgICAgICAgICAgICAvKiBkaXN0ID0gdGhpcy52YWwgKi8KKwltb3YJY2wsIGFoCisJc3ViCWJsLCBhaCAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCisJc2hyCWVkeCwgY2wgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLworCW1vdgljbCwgYWwgICAgICAgICAgICAvKiBjbCA9IHRoaXMub3AgKi8KKworCXRlc3QJYWwsIDE2ICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KKwlqeglMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0CisJYW5kCWNsLCAxNSAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLworCWp6CUxfY2hlY2tfZGlzdF9vbmUKKwljbXAJYmwsIGNsCisJamFlCUxfYWRkX2JpdHNfdG9fZGlzdCAgIC8qIGlmIChvcCA8PSBiaXRzKSA5Ny42JSAqLworCisJbW92CWNoLCBjbCAgICAgICAgICAgIC8qIHN0YXNoIG9wIGluIGNoLCBmcmVlaW5nIGNsICovCisJeG9yCWVheCwgZWF4CisJbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KKwltb3YJY2wsIGJsICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKwlhZGQJYmwsIDE2ICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKwlzaGwJZWF4LCBjbAorCW9yCWVkeCwgZWF4ICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KKwltb3YJY2wsIGNoICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLworCitMX2FkZF9iaXRzX3RvX2Rpc3Q6CisJbW92CWVheCwgMQorCXNobAllYXgsIGNsCisJZGVjCWVheCAgICAgICAgICAgICAgICAgLyogKDEgPDwgb3ApIC0gMSAqLworCXN1YglibCwgY2wKKwlhbmQJZWF4LCBlZHggICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKwlzaHIJZWR4LCBjbAorCWFkZAllYnAsIGVheCAgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkgKi8KKworTF9jaGVja193aW5kb3c6CisJbW92CVtlc3ArNF0sIGVzaSAgICAgICAvKiBzYXZlIGluIHNvIGZyb20gY2FuIHVzZSBpdCdzIHJlZyAqLworCW1vdgllYXgsIGVkaQorCXN1YgllYXgsIFtlc3ArMTZdICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovCisKKwljbXAJZWF4LCBlYnAKKwlqYglMX2NsaXBfd2luZG93ICAgICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLworCisJbW92CWVjeCwgW2VzcCs2MF0KKwltb3YJZXNpLCBlZGkKKwlzdWIJZXNpLCBlYnAgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKworCXN1YgllY3gsIDMgICAgICAgICAgICAgLyogY29weSBmcm9tIHRvIG91dCAqLworCW1vdglhbCwgW2VzaV0KKwltb3YJW2VkaV0sIGFsCisJbW92CWFsLCBbZXNpKzFdCisJbW92CWFoLCBbZXNpKzJdCisJYWRkCWVzaSwgMworCW1vdglbZWRpKzFdLCBhbAorCW1vdglbZWRpKzJdLCBhaAorCWFkZAllZGksIDMKKwlyZXAgICAgIG1vdnNiCisKKwltb3YJZXNpLCBbZXNwKzRdICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworCW1vdgllYnAsIFtlc3ArNDRdICAgICAvKiBlYnAgPSBsY29kZSAqLworCWptcAlMX3doaWxlX3Rlc3QKKworTF9jaGVja19kaXN0X29uZToKKwljbXAJZWJwLCAxICAgICAgICAgICAgLyogaWYgZGlzdCAxLCBpcyBhIG1lbXNldCAqLworCWpuZQlMX2NoZWNrX3dpbmRvdworCWNtcAlbZXNwKzE2XSwgZWRpCisJamUJTF9jaGVja193aW5kb3cKKworCWRlYwllZGkKKwltb3YJZWN4LCBbZXNwKzYwXQorCW1vdglhbCwgW2VkaV0KKwlzdWIJZWN4LCAzCisKKwltb3YJW2VkaSsxXSwgYWwgICAgICAgLyogbWVtc2V0IG91dCB3aXRoIGZyb21bLTFdICovCisJbW92CVtlZGkrMl0sIGFsCisJbW92CVtlZGkrM10sIGFsCisJYWRkCWVkaSwgNAorCXJlcCAgICAgc3Rvc2IKKwltb3YJZWJwLCBbZXNwKzQ0XSAgICAgIC8qIGVicCA9IGxjb2RlICovCisJam1wCUxfd2hpbGVfdGVzdAorCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6CisJdGVzdAlhbCwgNjQKKwlqbnoJTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLworCisJbW92CWVheCwgMQorCXNobAllYXgsIGNsCisJZGVjCWVheAorCWFuZAllYXgsIGVkeCAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisJYWRkCWVheCwgW2VzcCs2MF0gICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLworCW1vdgllYXgsIFtlYnArZWF4KjRdIC8qIGVheCA9IGxjb2RlW3ZhbCsoaG9sZCZtYXNrW29wXSldKi8KKwlqbXAJTF9kb2xlbgorCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0OgorCXRlc3QJYWwsIDY0CisJam56CUxfaW52YWxpZF9kaXN0YW5jZV9jb2RlIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworCW1vdgllYXgsIDEKKwlzaGwJZWF4LCBjbAorCWRlYwllYXgKKwlhbmQJZWF4LCBlZHggICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworCWFkZAllYXgsIGVicCAgICAgICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLworCW1vdgllY3gsIFtlc3ArNDhdICAgICAvKiBlY3ggPSBkY29kZSAqLworCW1vdgllYXgsIFtlY3grZWF4KjRdIC8qIGVheCA9IGRjb2RlW3ZhbCsoaG9sZCZtYXNrW29wXSldKi8KKwlqbXAJTF9kb2Rpc3QKKworTF9jbGlwX3dpbmRvdzoKKwltb3YJZWN4LCBlYXgKKwltb3YJZWF4LCBbZXNwKzI0XSAgICAgLyogcHJlcGFyZSBmb3IgZGlzdCBjb21wYXJlICovCisJbmVnCWVjeCAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovCisJbW92CWVzaSwgW2VzcCszMl0gICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KKworCWNtcAllYXgsIGVicAorCWpiCUxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyIC8qIGlmIChkaXN0ID4gd3NpemUpICovCisKKwlhZGQJZWN4LCBlYnAgICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCisJY21wCWR3b3JkIHB0ciBbZXNwKzI4XSwgMAorCWpuZQlMX3dyYXBfYXJvdW5kX3dpbmRvdyAvKiBpZiAod3JpdGUgIT0gMCkgKi8KKworCXN1YgllYXgsIGVjeAorCWFkZAllc2ksIGVheCAgICAgICAgIC8qIGZyb20gKz0gd3NpemUgLSBuYnl0ZXMgKi8KKworCW1vdgllYXgsIFtlc3ArNjBdCisJY21wCWVheCwgZWN4CisJamJlCUxfZG9fY29weTEgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKwlzdWIJZWF4LCBlY3ggICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisJcmVwICAgICBtb3ZzYgorCW1vdgllc2ksIGVkaQorCXN1Ygllc2ksIGVicCAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisJam1wCUxfZG9fY29weTEKKworCWNtcAllYXgsIGVjeAorCWpiZQlMX2RvX2NvcHkxICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisJc3ViCWVheCwgZWN4ICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworCXJlcCAgICAgbW92c2IKKwltb3YJZXNpLCBlZGkKKwlzdWIJZXNpLCBlYnAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCWptcAlMX2RvX2NvcHkxCisKK0xfd3JhcF9hcm91bmRfd2luZG93OgorCW1vdgllYXgsIFtlc3ArMjhdCisJY21wCWVjeCwgZWF4CisJamJlCUxfY29udGlndW91c19pbl93aW5kb3cgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KKworCWFkZAllc2ksIFtlc3ArMjRdCisJYWRkCWVzaSwgZWF4CisJc3ViCWVzaSwgZWN4ICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSArIHdyaXRlIC0gbmJ5dGVzICovCisJc3ViCWVjeCwgZWF4ICAgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovCisKKwltb3YJZWF4LCBbZXNwKzYwXQorCWNtcAllYXgsIGVjeAorCWpiZQlMX2RvX2NvcHkxICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisJc3ViCWVheCwgZWN4ICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworCXJlcCAgICAgbW92c2IKKwltb3YJZXNpLCBbZXNwKzMyXSAgICAgLyogZnJvbSA9IHdpbmRvdyAqLworCW1vdgllY3gsIFtlc3ArMjhdICAgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLworCWNtcAllYXgsIGVjeAorCWpiZQlMX2RvX2NvcHkxICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisJc3ViCWVheCwgZWN4ICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworCXJlcCAgICAgbW92c2IKKwltb3YJZXNpLCBlZGkKKwlzdWIJZXNpLCBlYnAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCWptcAlMX2RvX2NvcHkxCisKK0xfY29udGlndW91c19pbl93aW5kb3c6CisJYWRkCWVzaSwgZWF4CisJc3ViCWVzaSwgZWN4ICAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworCisJbW92CWVheCwgW2VzcCs2MF0KKwljbXAJZWF4LCBlY3gKKwlqYmUJTF9kb19jb3B5MSAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworCXN1YgllYXgsIGVjeCAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKwlyZXAgICAgIG1vdnNiCisJbW92CWVzaSwgZWRpCisJc3ViCWVzaSwgZWJwICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKworTF9kb19jb3B5MToKKwltb3YJZWN4LCBlYXgKKwlyZXAgICAgIG1vdnNiCisKKwltb3YJZXNpLCBbZXNwKzRdICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworCW1vdgllYnAsIFtlc3ArNDRdICAgICAvKiBlYnAgPSBsY29kZSAqLworCWptcAlMX3doaWxlX3Rlc3QKKworTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6CisJdGVzdAlhbCwgMzIKKwlqeglMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZQorCW1vdglkd29yZCBwdHIgW2VzcCs2OF0sIDEKKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCisKK0xfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlOgorCW1vdglkd29yZCBwdHIgW2VzcCs2OF0sIDIKKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCisKK0xfaW52YWxpZF9kaXN0YW5jZV9jb2RlOgorCW1vdglkd29yZCBwdHIgW2VzcCs2OF0sIDMKKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCisKK0xfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyOgorCW1vdgllc2ksIFtlc3ArNF0KKwltb3YJZHdvcmQgcHRyIFtlc3ArNjhdLCA0CisJam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cworCitMX2JyZWFrX2xvb3A6CisJbW92CWR3b3JkIHB0ciBbZXNwKzY4XSwgMAorCitMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXM6CisvKiBwdXQgaW4sIG91dCwgYml0cywgYW5kIGhvbGQgYmFjayBpbnRvIGFyIGFuZCBwb3AgZXNwICovCisJbW92CVtlc3ArNF0sIGVzaQorCW1vdglbZXNwKzEyXSwgZWRpCisJbW92CVtlc3ArNDBdLCBlYngKKwltb3YJW2VzcCszNl0sIGVkeAorCW1vdgllc3AsIFtlc3BdCisJcG9wCWVicAorCXBvcGZkCisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoYXIuc3RhdHVzID4gMSkgeworICAgICAgICBpZiAoYXIuc3RhdHVzID09IDIpCisgICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKKyAgICAgICAgZWxzZSBpZiAoYXIuc3RhdHVzID09IDMpCisgICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgfQorICAgIGVsc2UgaWYgKCBhci5zdGF0dXMgPT0gMSApIHsKKyAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgIH0KKworICAgIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqLworICAgIGFyLmxlbiA9IGFyLmJpdHMgPj4gMzsKKyAgICBhci5pbiAtPSBhci5sZW47CisgICAgYXIuYml0cyAtPSBhci5sZW4gPDwgMzsKKyAgICBhci5ob2xkICY9ICgxVSA8PCBhci5iaXRzKSAtIDE7CisKKyAgICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqLworICAgIHN0cm0tPm5leHRfaW4gPSBhci5pbjsKKyAgICBzdHJtLT5uZXh0X291dCA9IGFyLm91dDsKKyAgICBzdHJtLT5hdmFpbF9pbiA9ICh1bnNpZ25lZCkoYXIuaW4gPCBhci5sYXN0ID8gNSArIChhci5sYXN0IC0gYXIuaW4pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAtIChhci5pbiAtIGFyLmxhc3QpKTsKKyAgICBzdHJtLT5hdmFpbF9vdXQgPSAodW5zaWduZWQpKGFyLm91dCA8IGFyLmVuZCA/IDI1NyArIChhci5lbmQgLSBhci5vdXQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NyAtIChhci5vdXQgLSBhci5lbmQpKTsKKyAgICBzdGF0ZS0+aG9sZCA9IGFyLmhvbGQ7CisgICAgc3RhdGUtPmJpdHMgPSBhci5iaXRzOworICAgIHJldHVybjsKK30KKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9pbmZsYXRlODYvaW5mZmFzdC5TIGIvY29udHJpYi9pbmZsYXRlODYvaW5mZmFzdC5TCmluZGV4IGQxZTgwZWYuLjM2MDI5MDcgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhc3QuUworKysgYi9jb250cmliL2luZmxhdGU4Ni9pbmZmYXN0LlMKQEAgLTEsMTA5NSArMSwxMzc3IEBACi0vKg0KLSAqIGluZmZhc3QuUyBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2Y6DQotICoNCi0gKiBpbmZmYXN0LmMgLS0gZmFzdCBkZWNvZGluZw0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXINCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIA0KLSAqDQotICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzIEFuZGVyc29uIDxjaHJpc3RvcEBjaGFybS5uZXQ+DQotICogUGxlYXNlIHVzZSB0aGUgY29weXJpZ2h0IGNvbmRpdGlvbnMgYWJvdmUuDQotICogDQotICogVGhpcyB2ZXJzaW9uIChKYW4tMjMtMjAwMykgb2YgaW5mbGF0ZV9mYXN0IHdhcyBjb2RlZCBhbmQgdGVzdGVkIHVuZGVyDQotICogR05VL0xpbnV4IG9uIGEgcGVudGl1bSAzLCB1c2luZyB0aGUgZ2NjLTMuMiBjb21waWxlciBkaXN0cmlidXRpb24uICBPbiB0aGF0DQotICogbWFjaGluZSwgSSBmb3VuZCB0aGF0IGd6aXAgc3R5bGUgYXJjaGl2ZXMgZGVjb21wcmVzc2VkIGFib3V0IDIwJSBmYXN0ZXIgdGhhbg0KLSAqIHRoZSBnY2MtMy4yIC1PMyAtZm9taXQtZnJhbWUtcG9pbnRlciBjb21waWxlZCB2ZXJzaW9uLiAgWW91ciByZXN1bHRzIHdpbGwNCi0gKiBkZXBlbmQgb24gaG93IGxhcmdlIG9mIGEgYnVmZmVyIGlzIHVzZWQgZm9yIHpfc3RyZWFtLm5leHRfaW4gJiBuZXh0X291dA0KLSAqICg4Sy0zMksgd29ya2VkIGJlc3QgZm9yIG15IDI1NksgY3B1IGNhY2hlKSBhbmQgaG93IG11Y2ggb3ZlcmhlYWQgdGhlcmUgaXMgaW4NCi0gKiBzdHJlYW0gcHJvY2Vzc2luZyBJL08gYW5kIGNyYzMyL2FkZGxlcjMyLiAgSW4gbXkgY2FzZSwgdGhpcyByb3V0aW5lIHVzZWQNCi0gKiA3MCUgb2YgdGhlIGNwdSB0aW1lIGFuZCBjcmMzMiB1c2VkIDIwJS4NCi0gKg0KLSAqIEkgYW0gY29uZmlkZW50IHRoYXQgdGhpcyB2ZXJzaW9uIHdpbGwgd29yayBpbiB0aGUgZ2VuZXJhbCBjYXNlLCBidXQgSSBoYXZlDQotICogbm90IHRlc3RlZCBhIHdpZGUgdmFyaWV0eSBvZiBkYXRhc2V0cyBvciBhIHdpZGUgdmFyaWV0eSBvZiBwbGF0Zm9ybXMuDQotICoNCi0gKiBKYW4tMjQtMjAwMyAtLSBBZGRlZCAtRFVTRV9NTVggZGVmaW5lIGZvciBzbGlnaHRseSBmYXN0ZXIgaW5mbGF0aW5nLg0KLSAqIEl0IHNob3VsZCBiZSBhIHJ1bnRpbWUgZmxhZyBpbnN0ZWFkIG9mIGNvbXBpbGUgdGltZSBmbGFnLi4uDQotICovDQotDQotLmZpbGUgImluZmZhc3QuUyINCi0NCi0uZ2xvYmwgaW5mbGF0ZV9mYXN0DQotDQotLnRleHQNCi0uYWxpZ24gNCwwDQotLkxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlX21zZzoNCi0uc3RyaW5nICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiDQotDQotLmFsaWduIDQsMA0KLS5MX2ludmFsaWRfZGlzdGFuY2VfY29kZV9tc2c6DQotLnN0cmluZyAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIg0KLQ0KLS5hbGlnbiA0LDANCi0uTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnOg0KLS5zdHJpbmcgImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIg0KLQ0KLSNpZiBkZWZpbmVkKCBVU0VfTU1YICkNCi0uYWxpZ24gNCwwDQotLkxfbWFzazogLyogbWFza1tOXSA9ICggMSA8PCBOICkgLSAxICovDQotLmxvbmcgMA0KLS5sb25nIDENCi0ubG9uZyAzDQotLmxvbmcgNw0KLS5sb25nIDE1DQotLmxvbmcgMzENCi0ubG9uZyA2Mw0KLS5sb25nIDEyNw0KLS5sb25nIDI1NQ0KLS5sb25nIDUxMQ0KLS5sb25nIDEwMjMNCi0ubG9uZyAyMDQ3DQotLmxvbmcgNDA5NQ0KLS5sb25nIDgxOTENCi0ubG9uZyAxNjM4Mw0KLS5sb25nIDMyNzY3DQotLmxvbmcgNjU1MzUNCi0ubG9uZyAxMzEwNzENCi0ubG9uZyAyNjIxNDMNCi0ubG9uZyA1MjQyODcNCi0ubG9uZyAxMDQ4NTc1DQotLmxvbmcgMjA5NzE1MQ0KLS5sb25nIDQxOTQzMDMNCi0ubG9uZyA4Mzg4NjA3DQotLmxvbmcgMTY3NzcyMTUNCi0ubG9uZyAzMzU1NDQzMQ0KLS5sb25nIDY3MTA4ODYzDQotLmxvbmcgMTM0MjE3NzI3DQotLmxvbmcgMjY4NDM1NDU1DQotLmxvbmcgNTM2ODcwOTExDQotLmxvbmcgMTA3Mzc0MTgyMw0KLS5sb25nIDIxNDc0ODM2NDcNCi0ubG9uZyA0Mjk0OTY3Mjk1DQotI2VuZGlmDQotDQotLnRleHQNCi0NCi0vKg0KLSAqIHN0cnVjdCB6X3N0cmVhbSBvZmZzZXRzLCBpbiB6bGliLmgNCi0gKi8NCi0jZGVmaW5lIG5leHRfaW5fc3RybSAgIDAgICAvKiBzdHJtLT5uZXh0X2luICovDQotI2RlZmluZSBhdmFpbF9pbl9zdHJtICA0ICAgLyogc3RybS0+YXZhaWxfaW4gKi8NCi0jZGVmaW5lIG5leHRfb3V0X3N0cm0gIDEyICAvKiBzdHJtLT5uZXh0X291dCAqLw0KLSNkZWZpbmUgYXZhaWxfb3V0X3N0cm0gMTYgIC8qIHN0cm0tPmF2YWlsX291dCAqLw0KLSNkZWZpbmUgbXNnX3N0cm0gICAgICAgMjQgIC8qIHN0cm0tPm1zZyAqLw0KLSNkZWZpbmUgc3RhdGVfc3RybSAgICAgMjggIC8qIHN0cm0tPnN0YXRlICovDQotDQotLyoNCi0gKiBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBvZmZzZXRzLCBpbiBpbmZsYXRlLmgNCi0gKi8NCi0jZGVmaW5lIG1vZGVfc3RhdGUgICAgIDAgICAvKiBzdGF0ZS0+bW9kZSAqLw0KLSNkZWZpbmUgd3NpemVfc3RhdGUgICAgMzIgIC8qIHN0YXRlLT53c2l6ZSAqLw0KLSNkZWZpbmUgd3JpdGVfc3RhdGUgICAgMzYgIC8qIHN0YXRlLT53cml0ZSAqLw0KLSNkZWZpbmUgd2luZG93X3N0YXRlICAgNDAgIC8qIHN0YXRlLT53aW5kb3cgKi8NCi0jZGVmaW5lIGhvbGRfc3RhdGUgICAgIDQ0ICAvKiBzdGF0ZS0+aG9sZCAqLw0KLSNkZWZpbmUgYml0c19zdGF0ZSAgICAgNDggIC8qIHN0YXRlLT5iaXRzICovDQotI2RlZmluZSBsZW5jb2RlX3N0YXRlICA2NCAgLyogc3RhdGUtPmxlbmNvZGUgKi8NCi0jZGVmaW5lIGRpc3Rjb2RlX3N0YXRlIDY4ICAvKiBzdGF0ZS0+ZGlzdGNvZGUgKi8NCi0jZGVmaW5lIGxlbmJpdHNfc3RhdGUgIDcyICAvKiBzdGF0ZS0+bGVuYml0cyAqLw0KLSNkZWZpbmUgZGlzdGJpdHNfc3RhdGUgNzYgIC8qIHN0YXRlLT5kaXN0Yml0cyAqLw0KLQ0KLS8qDQotICogaW5mbGF0ZV9mYXN0J3MgYWN0aXZhdGlvbiByZWNvcmQNCi0gKi8NCi0jZGVmaW5lIGxvY2FsX3Zhcl9zaXplIDU2IC8qIGhvdyBtdWNoIGxvY2FsIHNwYWNlIGZvciB2YXJzICovDQotI2RlZmluZSBzdHJtX3NwICAgICAgICA4MCAvKiBmaXJzdCBhcmc6IHpfc3RyZWFtICogKGxvY2FsX3Zhcl9zaXplICsgMjQpICovDQotI2RlZmluZSBzdGFydF9zcCAgICAgICA4NCAvKiBzZWNvbmQgYXJnOiB1bnNpZ25lZCBpbnQgKGxvY2FsX3Zhcl9zaXplICsgMjgpICovDQotDQotLyoNCi0gKiBvZmZzZXRzIGZvciBsb2NhbCB2YXJzIG9uIHN0YWNrDQotICovDQotI2RlZmluZSBvdXQgICAgICAgICAgICA1MiAgLyogdW5zaWduZWQgY2hhciogKi8NCi0jZGVmaW5lIHdpbmRvdyAgICAgICAgIDQ4ICAvKiB1bnNpZ25lZCBjaGFyKiAqLw0KLSNkZWZpbmUgd3NpemUgICAgICAgICAgNDQgIC8qIHVuc2lnbmVkIGludCAqLw0KLSNkZWZpbmUgd3JpdGUgICAgICAgICAgNDAgIC8qIHVuc2lnbmVkIGludCAqLw0KLSNkZWZpbmUgaW4gICAgICAgICAgICAgMzYgIC8qIHVuc2lnbmVkIGNoYXIqICovDQotI2RlZmluZSBiZWcgICAgICAgICAgICAzMiAgLyogdW5zaWduZWQgY2hhciogKi8NCi0jZGVmaW5lIGRpc3QgICAgICAgICAgIDI4ICAvKiB1bnNpZ25lZCBpbnQgKi8NCi0jZGVmaW5lIGxlbiAgICAgICAgICAgIDI0ICAvKiB1bnNpZ25lZCBpbnQgKi8NCi0jZGVmaW5lIGxhc3QgICAgICAgICAgIDIwICAvKiB1bnNpZ25lZCBjaGFyKiAqLw0KLSNkZWZpbmUgZW5kICAgICAgICAgICAgMTYgIC8qIHVuc2lnbmVkIGNoYXIqICovDQotI2RlZmluZSBkY29kZSAgICAgICAgICAxMiAgLyogY29kZSogKi8NCi0jZGVmaW5lIGxjb2RlICAgICAgICAgICA4ICAvKiBjb2RlKiAqLw0KLSNkZWZpbmUgZG1hc2sgICAgICAgICAgIDQgIC8qIHVuc2lnbmVkIGludCAqLw0KLSNkZWZpbmUgbG1hc2sgICAgICAgICAgIDAgIC8qIHVuc2lnbmVkIGludCAqLw0KLQ0KLS8qDQotICogdHlwZWRlZiBlbnVtIGluZmxhdGVfbW9kZSBjb25zdHMsIGluIGluZmxhdGUuaA0KLSAqLw0KLSNpZm5kZWYgTk9fR1VOWklQDQotI2RlZmluZSBHVU5aSVANCi0jZW5kaWYNCi0NCi0jaWZkZWYgR1VOWklQDQotI2RlZmluZSBJTkZMQVRFX01PREVfVFlQRSAxMSAgLyogc3RhdGUtPm1vZGUgZmxhZ3MgZW51bS1lZCBpbiBpbmZsYXRlLmggKi8NCi0jZGVmaW5lIElORkxBVEVfTU9ERV9CQUQgIDI2DQotI2Vsc2UNCi0jZGVmaW5lIElORkxBVEVfTU9ERV9UWVBFIDMNCi0jZGVmaW5lIElORkxBVEVfTU9ERV9CQUQgIDE3DQotI2VuZGlmDQotDQotDQotLmFsaWduIDE2LDB4OTANCi1pbmZsYXRlX2Zhc3Q6DQotICAgICAgICBwdXNobCAgICVlZGkNCi0gICAgICAgIHB1c2hsICAgJWVzaQ0KLSAgICAgICAgcHVzaGwgICAlZWJwDQotICAgICAgICBwdXNobCAgICVlYngNCi0gICAgICAgIHB1c2hmICAgLyogc2F2ZSBlZmxhZ3MgKHN0cm1fc3AsIHN0YXRlX3NwIGFzc3VtZXMgdGhpcyBpcyAzMiBiaXRzKSAqLw0KLSAgICAgICAgc3VibCAgICAkbG9jYWxfdmFyX3NpemUsICVlc3ANCi0gICAgICAgIGNsZA0KLSNpZiBkZWZpbmVkKCBVU0VfTU1YICkNCi0gICAgICAgIGVtbXMNCi0jZW5kaWYNCi0NCi0jZGVmaW5lIHN0cm1fciAgJWVzaQ0KLSNkZWZpbmUgc3RhdGVfciAlZWRpDQotDQotICAgICAgICBtb3ZsICAgIHN0cm1fc3AoJWVzcCksIHN0cm1fcg0KLSAgICAgICAgbW92bCAgICBzdGF0ZV9zdHJtKHN0cm1fciksIHN0YXRlX3INCi0NCi0gICAgICAgIC8qIGluID0gc3RybS0+bmV4dF9pbjsNCi0gICAgICAgICAqIG91dCA9IHN0cm0tPm5leHRfb3V0Ow0KLSAgICAgICAgICogbGFzdCA9IGluICsgc3RybS0+YXZhaWxfaW4gLSA1Ow0KLSAgICAgICAgICogYmVnID0gb3V0IC0gKHN0YXJ0IC0gc3RybS0+YXZhaWxfb3V0KTsNCi0gICAgICAgICAqIGVuZCA9IG91dCArIChzdHJtLT5hdmFpbF9vdXQgLSAyNTcpOw0KLSAgICAgICAgICovDQotICAgICAgICBtb3ZsICAgIG5leHRfaW5fc3RybShzdHJtX3IpLCAlZWF4DQotICAgICAgICBtb3ZsICAgIG5leHRfb3V0X3N0cm0oc3RybV9yKSwgJWVieA0KLSAgICAgICAgbW92bCAgICBhdmFpbF9pbl9zdHJtKHN0cm1fciksICVlZHgNCi0gICAgICAgIG1vdmwgICAgYXZhaWxfb3V0X3N0cm0oc3RybV9yKSwgJWVjeA0KLSAgICAgICAgbW92bCAgICBzdGFydF9zcCglZXNwKSwgJWVicA0KLQ0KLSAgICAgICAgYWRkbCAgICAlZWF4LCAlZWR4ICAgICAgLyogYXZhaWxfaW4gKz0gbmV4dF9pbiAqLw0KLSAgICAgICAgc3VibCAgICAkNSwgJWVkeCAgICAgICAgLyogYXZhaWxfaW4gLT0gNSAqLw0KLQ0KLSAgICAgICAgc3VibCAgICAlZWN4LCAlZWJwICAgICAgLyogc3RhcnQgLT0gYXZhaWxfb3V0ICovDQotICAgICAgICBuZWdsICAgICVlYnAgICAgICAgICAgICAvKiBzdGFydCA9IC1zdGFydCAqLw0KLSAgICAgICAgYWRkbCAgICAlZWJ4LCAlZWJwICAgICAgLyogc3RhcnQgKz0gbmV4dF9vdXQgKi8NCi0NCi0gICAgICAgIHN1YmwgICAgJDI1NywgJWVjeCAgICAgIC8qIGF2YWlsX291dCAtPSAyNTcgKi8NCi0gICAgICAgIGFkZGwgICAgJWVieCwgJWVjeCAgICAgIC8qIGF2YWlsX291dCArPSBvdXQgKi8NCi0NCi0gICAgICAgIG1vdmwgICAgJWVheCwgaW4oJWVzcCkNCi0gICAgICAgIG1vdmwgICAgJWVieCwgb3V0KCVlc3ApDQotICAgICAgICBtb3ZsICAgICVlZHgsIGxhc3QoJWVzcCkNCi0gICAgICAgIG1vdmwgICAgJWVicCwgYmVnKCVlc3ApDQotICAgICAgICBtb3ZsICAgICVlY3gsIGVuZCglZXNwKQ0KLQ0KLSAgICAgICAgLyogd3NpemUgPSBzdGF0ZS0+d3NpemU7DQotICAgICAgICAgKiB3cml0ZSA9IHN0YXRlLT53cml0ZTsNCi0gICAgICAgICAqIHdpbmRvdyA9IHN0YXRlLT53aW5kb3c7DQotICAgICAgICAgKiBob2xkID0gc3RhdGUtPmhvbGQ7DQotICAgICAgICAgKiBiaXRzID0gc3RhdGUtPmJpdHM7DQotICAgICAgICAgKiBsY29kZSA9IHN0YXRlLT5sZW5jb2RlOw0KLSAgICAgICAgICogZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7DQotICAgICAgICAgKiBsbWFzayA9ICggMSA8PCBzdGF0ZS0+bGVuYml0cyApIC0gMTsNCi0gICAgICAgICAqIGRtYXNrID0gKCAxIDw8IHN0YXRlLT5kaXN0Yml0cyApIC0gMTsNCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgbW92bCAgICBsZW5jb2RlX3N0YXRlKHN0YXRlX3IpLCAlZWF4DQotICAgICAgICBtb3ZsICAgIGRpc3Rjb2RlX3N0YXRlKHN0YXRlX3IpLCAlZWN4DQotDQotICAgICAgICBtb3ZsICAgICVlYXgsIGxjb2RlKCVlc3ApDQotICAgICAgICBtb3ZsICAgICVlY3gsIGRjb2RlKCVlc3ApDQotDQotICAgICAgICBtb3ZsICAgICQxLCAlZWF4DQotICAgICAgICBtb3ZsICAgIGxlbmJpdHNfc3RhdGUoc3RhdGVfciksICVlY3gNCi0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4DQotICAgICAgICBkZWNsICAgICVlYXgNCi0gICAgICAgIG1vdmwgICAgJWVheCwgbG1hc2soJWVzcCkNCi0NCi0gICAgICAgIG1vdmwgICAgJDEsICVlYXgNCi0gICAgICAgIG1vdmwgICAgZGlzdGJpdHNfc3RhdGUoc3RhdGVfciksICVlY3gNCi0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4DQotICAgICAgICBkZWNsICAgICVlYXgNCi0gICAgICAgIG1vdmwgICAgJWVheCwgZG1hc2soJWVzcCkNCi0NCi0gICAgICAgIG1vdmwgICAgd3NpemVfc3RhdGUoc3RhdGVfciksICVlYXgNCi0gICAgICAgIG1vdmwgICAgd3JpdGVfc3RhdGUoc3RhdGVfciksICVlY3gNCi0gICAgICAgIG1vdmwgICAgd2luZG93X3N0YXRlKHN0YXRlX3IpLCAlZWR4DQotDQotICAgICAgICBtb3ZsICAgICVlYXgsIHdzaXplKCVlc3ApDQotICAgICAgICBtb3ZsICAgICVlY3gsIHdyaXRlKCVlc3ApDQotICAgICAgICBtb3ZsICAgICVlZHgsIHdpbmRvdyglZXNwKQ0KLQ0KLSNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KLQ0KLSNkZWZpbmUgaG9sZF9yICAgICAlZWJwDQotI2RlZmluZSBiaXRzX3IgICAgICVibA0KLSNkZWZpbmUgYml0c2xvbmdfciAlZWJ4DQotDQotICAgICAgICBtb3ZsICAgIGhvbGRfc3RhdGUoc3RhdGVfciksIGhvbGRfcg0KLSAgICAgICAgbW92bCAgICBiaXRzX3N0YXRlKHN0YXRlX3IpLCBiaXRzbG9uZ19yDQotDQotI2Vsc2UgLyogVVNFX01NWCAqLw0KLQ0KLSNkZWZpbmUgaG9sZF9tbSAgICAlbW0wDQotI2RlZmluZSBiaXRzX3IgICAgICVlYnANCi0jZGVmaW5lIGJpdHNsb25nX3IgJWVicA0KLQ0KLSAgICAgICAgbW92bCAgICBob2xkX3N0YXRlKHN0YXRlX3IpLCAlZWJ4DQotICAgICAgICBtb3ZsICAgIGJpdHNfc3RhdGUoc3RhdGVfciksIGJpdHNsb25nX3INCi0NCi0jZW5kaWYNCi0NCi0jdW5kZWYgc3RybV9yDQotI3VuZGVmIHN0YXRlX3INCi0jZGVmaW5lIGluX3IgICAgICAgJWVzaQ0KLSNkZWZpbmUgZnJvbV9yICAgICAlZXNpDQotI2RlZmluZSBvdXRfciAgICAgICVlZGkNCi0NCi0gICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3INCi0NCi0jaWYgISBkZWZpbmVkICggVVNFX01NWCApDQotDQotICAgICAgICAvKiBhbGlnbiBpbl9yIG9uIHdvcmQgYm91bmRhcnkgKi8NCi0gICAgICAgIHRlc3RsICAgJDEsIGluX3INCi0gICAgICAgIGp6ICAgICAgLkxfaXNfYWxpZ25lZA0KLSAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4DQotICAgICAgICBtb3ZiICAgIChpbl9yKSwgJWFsDQotICAgICAgICBpbmNsICAgIGluX3INCi0gICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wNCi0gICAgICAgIGFkZGIgICAgJDgsIGJpdHNfcg0KLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgNCi0gICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yDQotDQotI2Vsc2UNCi0gICAgICAgIC8qIGFsaWduIGluX3Igb24gbG9uZyBib3VuZGFyeSAqLw0KLS5MX2FsaWduX2xvbmc6DQotICAgICAgICB0ZXN0bCAgICQzLCBpbl9yDQotICAgICAgICBqeiAgICAgIC5MX2lzX2FsaWduZWQNCi0gICAgICAgIHhvcmwgICAgJWVheCwgJWVheA0KLSAgICAgICAgbW92YiAgICAoaW5fciksICVhbA0KLSAgICAgICAgaW5jbCAgICBpbl9yDQotICAgICAgICBtb3ZsICAgIGJpdHNfciwgJWVjeA0KLSAgICAgICAgYWRkbCAgICAkOCwgYml0c19yDQotICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KLSAgICAgICAgb3JsICAgICAlZWF4LCAlZWJ4DQotICAgICAgICBqbXAgICAgIC5MX2FsaWduX2xvbmcNCi0NCi0jZW5kaWYNCi0NCi0uTF9pc19hbGlnbmVkOg0KLSAgICAgICAgbW92bCAgICBvdXQoJWVzcCksIG91dF9yDQotDQotI2lmIGRlZmluZWQgKCBVU0VfTU1YICkNCi0NCi0jZGVmaW5lIHVzZWRfbW0gICAlbW0xDQotI2RlZmluZSBkbWFzazJfbW0gJW1tMg0KLSNkZWZpbmUgbG1hc2syX21tICVtbTMNCi0jZGVmaW5lIGxtYXNrX21tICAlbW00DQotI2RlZmluZSBkbWFza19tbSAgJW1tNQ0KLSNkZWZpbmUgdG1wX21tICAgICVtbTYNCi0NCi0gICAgICAgIG1vdmwgICAgb3V0KCVlc3ApLCBvdXRfcg0KLSAgICAgICAgbW92ZCAgICBsbWFzayglZXNwKSwgbG1hc2tfbW0gDQotICAgICAgICBtb3ZxICAgIGxtYXNrX21tLCBsbWFzazJfbW0NCi0gICAgICAgIG1vdmQgICAgZG1hc2soJWVzcCksIGRtYXNrX21tDQotICAgICAgICBtb3ZxICAgIGRtYXNrX21tLCBkbWFzazJfbW0NCi0gICAgICAgIG1vdmQgICAgJWVieCwgaG9sZF9tbQ0KLSAgICAgICAgcHhvciAgICB1c2VkX21tLCB1c2VkX21tDQotICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIGVieCA9IGxjb2RlICovDQotI2VuZGlmDQotDQotICAgICAgICBqbXAgICAgIC5MX2RvX2xvb3ANCi0NCi0uYWxpZ24gMTYsMHg5MA0KLQ0KLSNpZiAhIGRlZmluZWQgKCBVU0VfTU1YICkNCi0NCi0uTF9kb19sb29wOg0KLSAgICAgICAgLyogcmVnczogJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dA0KLSAgICAgICAgICoNCi0gICAgICAgICAqIGRvIHsgDQotICAgICAgICAgKiAgIGlmIChiaXRzIDwgMTUpIHsNCi0gICAgICAgICAqICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsNCi0gICAgICAgICAqICAgICBiaXRzICs9IDE2DQotICAgICAgICAgKiAgIH0NCi0gICAgICAgICAqICAgdGhpcyA9IGxjb2RlW2hvbGQgJiBsbWFza10NCi0gICAgICAgICAqLw0KLSAgICAgICAgY21wYiAgICAkMTUsIGJpdHNfcg0KLSAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGUgICAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLw0KLQ0KLSAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4DQotICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovDQotICAgICAgICBtb3ZiICAgIGJpdHNfciwgJWNsICAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovDQotICAgICAgICBhZGRiICAgICQxNiwgYml0c19yICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8NCi0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4DQotICAgICAgICBvcmwgICAgICVlYXgsIGhvbGRfciAgICAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLw0KLQ0KLS5MX2dldF9sZW5ndGhfY29kZToNCi0gICAgICAgIG1vdmwgICAgbG1hc2soJWVzcCksICVlZHggICAgICAgLyogZWR4ID0gbG1hc2sgKi8NCi0gICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlY3ggICAgICAgLyogZWN4ID0gbGNvZGUgKi8NCi0gICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWR4ICAgICAgICAgICAgLyogZWR4ICY9IGhvbGQgKi8NCi0gICAgICAgIG1vdmwgICAgKCVlY3gsJWVkeCw0KSwgJWVheCAgICAgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLw0KLQ0KLSNlbHNlIC8qIFVTRV9NTVggKi8NCi0NCi0uTF9kb19sb29wOg0KLSAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8NCi0NCi0gICAgICAgIGNtcGwgICAgJDMyLCBiaXRzX3INCi0gICAgICAgIGphICAgICAgLkxfZ2V0X2xlbmd0aF9jb2RlICAgICAgLyogaWYgKDMyIDwgYml0cykgKi8NCi0NCi0gICAgICAgIG1vdmQgICAgYml0c19yLCB0bXBfbW0NCi0gICAgICAgIG1vdmQgICAgKGluX3IpLCAlbW03DQotICAgICAgICBhZGRsICAgICQ0LCBpbl9yDQotICAgICAgICBwc2xscSAgIHRtcF9tbSwgJW1tNw0KLSAgICAgICAgYWRkbCAgICAkMzIsIGJpdHNfcg0KLSAgICAgICAgcG9yICAgICAlbW03LCBob2xkX21tICAgICAgICAgICAvKiBob2xkX21tIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovDQotDQotLkxfZ2V0X2xlbmd0aF9jb2RlOg0KLSAgICAgICAgcGFuZCAgICBob2xkX21tLCBsbWFza19tbQ0KLSAgICAgICAgbW92ZCAgICBsbWFza19tbSwgJWVheA0KLSAgICAgICAgbW92cSAgICBsbWFzazJfbW0sIGxtYXNrX21tDQotICAgICAgICBtb3ZsICAgICglZWJ4LCVlYXgsNCksICVlYXggICAgIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8NCi0NCi0jZW5kaWYNCi0NCi0jaWYgISBkZWZpbmVkKCBVU0VfTU1YICkNCi0NCi0uTF9kb2xlbjoNCi0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBpbiwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQNCi0gICAgICAgICAqDQotICAgICAgICAgKiBkb2xlbjoNCi0gICAgICAgICAqICAgIGJpdHMgLT0gdGhpcy5iaXRzOw0KLSAgICAgICAgICogICAgaG9sZCA+Pj0gdGhpcy5iaXRzDQotICAgICAgICAgKi8NCi0gICAgICAgIG1vdmIgICAgJWFoLCAlY2wgICAgICAgICAgICAgICAgLyogY2wgPSB0aGlzLmJpdHMgKi8NCi0gICAgICAgIHN1YmIgICAgJWFoLCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8NCi0gICAgICAgIHNocmwgICAgJWNsLCBob2xkX3IgICAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovDQotDQotICAgICAgICAvKiBjaGVjayBpZiBvcCBpcyBhIGxpdGVyYWwNCi0gICAgICAgICAqIGlmIChvcCA9PSAwKSB7DQotICAgICAgICAgKiAgICBQVVAob3V0KSA9IHRoaXMudmFsOw0KLSAgICAgICAgICogIH0NCi0gICAgICAgICAqLw0KLSAgICAgICAgdGVzdGIgICAlYWwsICVhbA0KLSAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZSAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8NCi0NCi0gICAgICAgIHNocmwgICAgJDE2LCAlZWF4ICAgICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8NCi0gICAgICAgIHN0b3NiDQotDQotI2Vsc2UgLyogVVNFX01NWCAqLw0KLQ0KLSNkZWZpbmUgbGVuX3IgICVlZHgNCi0NCi0uTF9kb2xlbjoNCi0gICAgICAgIG1vdnpibCAgJWFoLCAlZWN4ICAgICAgICAgICAgICAgLyogZWN4ID0gdGhpcy5iaXRzICovDQotICAgICAgICBtb3ZsICAgICVlYXgsIGxlbl9yICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMgKi8NCi0gICAgICAgIHNocmwgICAgJDE2LCBsZW5fciAgICAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8NCi0gICAgICAgIG1vdmQgICAgJWVjeCwgdXNlZF9tbQ0KLSAgICAgICAgc3VibCAgICAlZWN4LCBiaXRzX3IgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLw0KLQ0KLSAgICAgICAgdGVzdGIgICAlYWwsICVhbA0KLSAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZSAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8NCi0NCi0gICAgICAgIG1vdmIgICAgJWRsLCAob3V0X3IpDQotICAgICAgICBpbmNsICAgIG91dF9yDQotDQotI2VuZGlmDQotDQotLkxfd2hpbGVfdGVzdDoNCi0gICAgICAgIC8qIHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKQ0KLSAgICAgICAgICovDQotICAgICAgICBjbXBsICAgIG91dF9yLCBlbmQoJWVzcCkNCi0gICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcCAgICAgICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovDQotDQotICAgICAgICBjbXBsICAgIGluX3IsIGxhc3QoJWVzcCkNCi0gICAgICAgIGphICAgICAgLkxfZG9fbG9vcCAgICAgICAgICAgICAgLyogaWYgKGluIDwgbGFzdCkgKi8NCi0gICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcA0KLQ0KLSNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KLQ0KLS5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlOg0KLSAgICAgICAgLyogcmVnczogJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGxlbg0KLSAgICAgICAgICoNCi0gICAgICAgICAqIGVsc2UgaWYgKG9wICYgMTYpIHsNCi0gICAgICAgICAqICAgbGVuID0gdGhpcy52YWwNCi0gICAgICAgICAqICAgb3AgJj0gMTUNCi0gICAgICAgICAqICAgaWYgKG9wKSB7DQotICAgICAgICAgKiAgICAgaWYgKG9wID4gYml0cykgew0KLSAgICAgICAgICogICAgICAgaG9sZCB8PSAqKCh1bnNpZ25lZCBzaG9ydCAqKWluKSsrIDw8IGJpdHM7DQotICAgICAgICAgKiAgICAgICBiaXRzICs9IDE2DQotICAgICAgICAgKiAgICAgfQ0KLSAgICAgICAgICogICAgIGxlbiArPSBob2xkICYgbWFza1tvcF07DQotICAgICAgICAgKiAgICAgYml0cyAtPSBvcDsNCi0gICAgICAgICAqICAgICBob2xkID4+PSBvcDsNCi0gICAgICAgICAqICAgfQ0KLSAgICAgICAgICovDQotI2RlZmluZSBsZW5fciAlZWR4DQotICAgICAgICBtb3ZsICAgICVlYXgsIGxlbl9yICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMgKi8NCi0gICAgICAgIHNocmwgICAgJDE2LCBsZW5fciAgICAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8NCi0gICAgICAgIG1vdmIgICAgJWFsLCAlY2wNCi0NCi0gICAgICAgIHRlc3RiICAgJDE2LCAlYWwNCi0gICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aCAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovDQotICAgICAgICBhbmRiICAgICQxNSwgJWNsICAgICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovDQotICAgICAgICBqeiAgICAgIC5MX3NhdmVfbGVuICAgICAgICAgICAgIC8qIGlmICghb3ApICovDQotICAgICAgICBjbXBiICAgICVjbCwgYml0c19yDQotICAgICAgICBqYWUgICAgIC5MX2FkZF9iaXRzX3RvX2xlbiAgICAgIC8qIGlmIChvcCA8PSBiaXRzKSAqLw0KLQ0KLSAgICAgICAgbW92YiAgICAlY2wsICVjaCAgICAgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLw0KLSAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4DQotICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovDQotICAgICAgICBtb3ZiICAgIGJpdHNfciwgJWNsICAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovDQotICAgICAgICBhZGRiICAgICQxNiwgYml0c19yICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8NCi0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4DQotICAgICAgICBvcmwgICAgICVlYXgsIGhvbGRfciAgICAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLw0KLSAgICAgICAgbW92YiAgICAlY2gsICVjbCAgICAgICAgICAgICAgICAvKiBtb3ZlIG9wIGJhY2sgdG8gZWN4ICovDQotDQotLkxfYWRkX2JpdHNfdG9fbGVuOg0KLSAgICAgICAgbW92bCAgICAkMSwgJWVheA0KLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgNCi0gICAgICAgIGRlY2wgICAgJWVheA0KLSAgICAgICAgc3ViYiAgICAlY2wsIGJpdHNfcg0KLSAgICAgICAgYW5kbCAgICBob2xkX3IsICVlYXggICAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLw0KLSAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfcg0KLSAgICAgICAgYWRkbCAgICAlZWF4LCBsZW5fciAgICAgICAgICAgICAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovDQotDQotLkxfc2F2ZV9sZW46DQotICAgICAgICBtb3ZsICAgIGxlbl9yLCBsZW4oJWVzcCkgICAgICAgIC8qIHNhdmUgbGVuICovDQotI3VuZGVmICBsZW5fcg0KLQ0KLS5MX2RlY29kZV9kaXN0YW5jZToNCi0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBpbiwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0DQotICAgICAgICAgKg0KLSAgICAgICAgICogICBpZiAoYml0cyA8IDE1KSB7DQotICAgICAgICAgKiAgICAgaG9sZCB8PSAqKCh1bnNpZ25lZCBzaG9ydCAqKWluKSsrIDw8IGJpdHM7DQotICAgICAgICAgKiAgICAgYml0cyArPSAxNg0KLSAgICAgICAgICogICB9DQotICAgICAgICAgKiAgIHRoaXMgPSBkY29kZVtob2xkICYgZG1hc2tdOw0KLSAgICAgICAgICogZG9kaXN0Og0KLSAgICAgICAgICogICBiaXRzIC09IHRoaXMuYml0czsNCi0gICAgICAgICAqICAgaG9sZCA+Pj0gdGhpcy5iaXRzOw0KLSAgICAgICAgICogICBvcCA9IHRoaXMub3A7DQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIGNtcGIgICAgJDE1LCBiaXRzX3INCi0gICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RhbmNlX2NvZGUgICAgLyogaWYgKDE1IDwgYml0cykgKi8NCi0NCi0gICAgICAgIHhvcmwgICAgJWVheCwgJWVheA0KLSAgICAgICAgbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLw0KLSAgICAgICAgbW92YiAgICBiaXRzX3IsICVjbCAgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLw0KLSAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovDQotICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KLSAgICAgICAgb3JsICAgICAlZWF4LCBob2xkX3IgICAgICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8NCi0NCi0uTF9nZXRfZGlzdGFuY2VfY29kZToNCi0gICAgICAgIG1vdmwgICAgZG1hc2soJWVzcCksICVlZHggICAgICAgLyogZWR4ID0gZG1hc2sgKi8NCi0gICAgICAgIG1vdmwgICAgZGNvZGUoJWVzcCksICVlY3ggICAgICAgLyogZWN4ID0gZGNvZGUgKi8NCi0gICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWR4ICAgICAgICAgICAgLyogZWR4ICY9IGhvbGQgKi8NCi0gICAgICAgIG1vdmwgICAgKCVlY3gsJWVkeCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGRtYXNrXSAqLw0KLQ0KLSNlbHNlIC8qIFVTRV9NTVggKi8NCi0NCi0uTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZToNCi0gICAgICAgIHRlc3RiICAgJDE2LCAlYWwNCi0gICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aCAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovDQotICAgICAgICBhbmRsICAgICQxNSwgJWVheCAgICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovDQotICAgICAgICBqeiAgICAgIC5MX2RlY29kZV9kaXN0YW5jZSAgICAgIC8qIGlmICghb3ApICovDQotDQotICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLw0KLSAgICAgICAgbW92ZCAgICAlZWF4LCB1c2VkX21tDQotICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3gNCi0gICAgICAgIHN1YmwgICAgJWVheCwgYml0c19yDQotICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3gNCi0gICAgICAgIGFkZGwgICAgJWVjeCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLw0KLQ0KLS5MX2RlY29kZV9kaXN0YW5jZToNCi0NCi0gICAgICAgIHBzcmxxICAgdXNlZF9tbSwgaG9sZF9tbSAgICAgICAgLyogaG9sZF9tbSA+Pj0gbGFzdCBiaXQgbGVuZ3RoICovDQotDQotICAgICAgICBjbXBsICAgICQzMiwgYml0c19yDQotICAgICAgICBqYSAgICAgIC5MX2dldF9kaXN0X2NvZGUgICAgICAgIC8qIGlmICgzMiA8IGJpdHMpICovDQotDQotICAgICAgICBtb3ZkICAgIGJpdHNfciwgdG1wX21tDQotICAgICAgICBtb3ZkICAgIChpbl9yKSwgJW1tNw0KLSAgICAgICAgYWRkbCAgICAkNCwgaW5fcg0KLSAgICAgICAgcHNsbHEgICB0bXBfbW0sICVtbTcNCi0gICAgICAgIGFkZGwgICAgJDMyLCBiaXRzX3INCi0gICAgICAgIHBvciAgICAgJW1tNywgaG9sZF9tbSAgICAgICAgICAgLyogaG9sZF9tbSB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLw0KLQ0KLS5MX2dldF9kaXN0X2NvZGU6DQotICAgICAgICBtb3ZsICAgIGRjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIGVieCA9IGRjb2RlICovDQotICAgICAgICBwYW5kICAgIGhvbGRfbW0sIGRtYXNrX21tDQotICAgICAgICBtb3ZkICAgIGRtYXNrX21tLCAlZWF4DQotICAgICAgICBtb3ZxICAgIGRtYXNrMl9tbSwgZG1hc2tfbW0NCi0gICAgICAgIG1vdmwgICAgKCVlYngsJWVheCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGxtYXNrXSAqLw0KLQ0KLSNlbmRpZg0KLQ0KLSNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KLQ0KLSNkZWZpbmUgZGlzdF9yICVlZHgNCi0uTF9kb2Rpc3Q6DQotICAgICAgICBtb3ZsICAgICVlYXgsIGRpc3RfciAgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovDQotICAgICAgICBzaHJsICAgICQxNiwgZGlzdF9yICAgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzLnZhbCAqLw0KLSAgICAgICAgbW92YiAgICAlYWgsICVjbA0KLSAgICAgICAgc3ViYiAgICAlYWgsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLw0KLSAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfciAgICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8NCi0NCi0gICAgICAgIC8qIGlmIChvcCAmIDE2KSB7DQotICAgICAgICAgKiAgIGRpc3QgPSB0aGlzLnZhbA0KLSAgICAgICAgICogICBvcCAmPSAxNQ0KLSAgICAgICAgICogICBpZiAob3AgPiBiaXRzKSB7DQotICAgICAgICAgKiAgICAgaG9sZCB8PSAqKCh1bnNpZ25lZCBzaG9ydCAqKWluKSsrIDw8IGJpdHM7DQotICAgICAgICAgKiAgICAgYml0cyArPSAxNg0KLSAgICAgICAgICogICB9DQotICAgICAgICAgKiAgIGRpc3QgKz0gaG9sZCAmIG1hc2tbb3BdOw0KLSAgICAgICAgICogICBiaXRzIC09IG9wOw0KLSAgICAgICAgICogICBob2xkID4+PSBvcDsNCi0gICAgICAgICAqLw0KLSAgICAgICAgbW92YiAgICAlYWwsICVjbCAgICAgICAgICAgICAgICAvKiBjbCA9IHRoaXMub3AgKi8NCi0NCi0gICAgICAgIHRlc3RiICAgJDE2LCAlYWwgICAgICAgICAgICAgICAgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLw0KLSAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdA0KLSAgICAgICAgYW5kYiAgICAkMTUsICVjbCAgICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLw0KLSAgICAgICAganogICAgICAuTF9jaGVja19kaXN0X29uZQ0KLSAgICAgICAgY21wYiAgICAlY2wsIGJpdHNfcg0KLSAgICAgICAgamFlICAgICAuTF9hZGRfYml0c190b19kaXN0ICAgICAvKiBpZiAob3AgPD0gYml0cykgOTcuNiUgKi8NCi0NCi0gICAgICAgIG1vdmIgICAgJWNsLCAlY2ggICAgICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8NCi0gICAgICAgIHhvcmwgICAgJWVheCwgJWVheA0KLSAgICAgICAgbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLw0KLSAgICAgICAgbW92YiAgICBiaXRzX3IsICVjbCAgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLw0KLSAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovDQotICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KLSAgICAgICAgb3JsICAgICAlZWF4LCBob2xkX3IgICAgICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8NCi0gICAgICAgIG1vdmIgICAgJWNoLCAlY2wgICAgICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLw0KLQ0KLS5MX2FkZF9iaXRzX3RvX2Rpc3Q6DQotICAgICAgICBtb3ZsICAgICQxLCAlZWF4DQotICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KLSAgICAgICAgZGVjbCAgICAlZWF4ICAgICAgICAgICAgICAgICAgICAvKiAoMSA8PCBvcCkgLSAxICovDQotICAgICAgICBzdWJiICAgICVjbCwgYml0c19yDQotICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVheCAgICAgICAgICAgIC8qIGVheCAmPSBob2xkICovDQotICAgICAgICBzaHJsICAgICVjbCwgaG9sZF9yDQotICAgICAgICBhZGRsICAgICVlYXgsIGRpc3RfciAgICAgICAgICAgIC8qIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKSAqLw0KLSAgICAgICAgam1wICAgICAuTF9jaGVja193aW5kb3cNCi0NCi0jZWxzZSAvKiBVU0VfTU1YICovDQotDQotI2RlZmluZSBkaXN0X3IgJWVieA0KLS5MX2RvZGlzdDoNCi0gICAgICAgIG1vdnpibCAgJWFoLCAlZWN4ICAgICAgICAgICAgICAgLyogZWN4ID0gdGhpcy5iaXRzICovDQotICAgICAgICBtb3ZsICAgICVlYXgsIGRpc3Rfcg0KLSAgICAgICAgc2hybCAgICAkMTYsIGRpc3RfciAgICAgICAgICAgICAvKiBkaXN0ICA9IHRoaXMudmFsICovDQotICAgICAgICBzdWJsICAgICVlY3gsIGJpdHNfciAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovDQotICAgICAgICBtb3ZkICAgICVlY3gsIHVzZWRfbW0NCi0NCi0gICAgICAgIHRlc3RiICAgJDE2LCAlYWwgICAgICAgICAgICAgICAgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLw0KLSAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdCANCi0gICAgICAgIGFuZGwgICAgJDE1LCAlZWF4ICAgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8NCi0gICAgICAgIGp6ICAgICAgLkxfY2hlY2tfZGlzdF9vbmUNCi0NCi0uTF9hZGRfYml0c190b19kaXN0Og0KLSAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8NCi0gICAgICAgIG1vdmQgICAgJWVheCwgdXNlZF9tbSAgICAgICAgICAgLyogc2F2ZSBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgb3AgKi8NCi0gICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeCAgICAgICAgICAgLyogZ2V0IHRoZSBuZXh0IGJpdHMgb24gaW5wdXQgc3RyZWFtICovDQotICAgICAgICBzdWJsICAgICVlYXgsIGJpdHNfciAgICAgICAgICAgIC8qIGJpdHMgLT0gb3AgYml0cyAqLw0KLSAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4ICAvKiBlY3ggICA9IGhvbGQgJiBtYXNrW29wXSAqLw0KLSAgICAgICAgYWRkbCAgICAlZWN4LCBkaXN0X3IgICAgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiBtYXNrW29wXSAqLw0KLSAgICAgICAgam1wICAgICAuTF9jaGVja193aW5kb3cNCi0NCi0jZW5kaWYNCi0NCi0uYWxpZ24gMTYsMHg5MA0KLQ0KLS5MX2NoZWNrX2Rpc3Rfb25lOg0KLSAgICAgICAgY21wbCAgICAkMSwgZGlzdF9yDQotICAgICAgICBqbmUgICAgIC5MX2NoZWNrX3dpbmRvdw0KLSAgICAgICAgY21wbCAgICBvdXRfciwgYmVnKCVlc3ApDQotICAgICAgICBqZSAgICAgIC5MX2NoZWNrX3dpbmRvdw0KLQ0KLSAgICAgICAgZGVjbCAgICBvdXRfcg0KLSNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KLSAgICAgICAgbW92bCAgICBsZW4oJWVzcCksICVlY3gNCi0jZWxzZQ0KLSAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeA0KLSNlbmRpZg0KLSAgICAgICAgbW92YiAgICAob3V0X3IpLCAlYWwNCi0gICAgICAgIHN1YmwgICAgJDMsICVlY3gNCi0NCi0gICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQ0KLSAgICAgICAgbW92YiAgICAlYWwsIDIob3V0X3IpDQotICAgICAgICBtb3ZiICAgICVhbCwgMyhvdXRfcikNCi0gICAgICAgIGFkZGwgICAgJDQsIG91dF9yDQotICAgICAgICByZXAgICAgIHN0b3NiDQotDQotI2lmIGRlZmluZWQoIFVTRV9NTVggKQ0KLSAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVieCAgICAgICAvKiBtb3ZlIGxjb2RlIGJhY2sgdG8gJWVieCwgdG9zcyBkaXN0ICovDQotI2VuZGlmDQotICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QNCi0NCi0uYWxpZ24gMTYsMHg5MA0KLQ0KLS5MX2NoZWNrX3dpbmRvdzoNCi0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QNCi0gICAgICAgICAqICAgICAgICVlY3ggPSBuYnl0ZXMNCi0gICAgICAgICAqDQotICAgICAgICAgKiBuYnl0ZXMgPSBvdXQgLSBiZWc7DQotICAgICAgICAgKiBpZiAoZGlzdCA8PSBuYnl0ZXMpIHsNCi0gICAgICAgICAqICAgZnJvbSA9IG91dCAtIGRpc3Q7DQotICAgICAgICAgKiAgIGRvIHsNCi0gICAgICAgICAqICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsNCi0gICAgICAgICAqICAgfSB3aGlsZSAoLS1sZW4gPiAwKSB7DQotICAgICAgICAgKiB9DQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIG1vdmwgICAgaW5fciwgaW4oJWVzcCkgICAgICAgICAgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8NCi0gICAgICAgIG1vdmwgICAgb3V0X3IsICVlYXgNCi0gICAgICAgIHN1YmwgICAgYmVnKCVlc3ApLCAlZWF4ICAgICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovDQotDQotICAgICAgICBjbXBsICAgIGRpc3RfciwgJWVheA0KLSAgICAgICAgamIgICAgICAuTF9jbGlwX3dpbmRvdyAgICAgICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLw0KLQ0KLSNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KLSAgICAgICAgbW92bCAgICBsZW4oJWVzcCksICVlY3gNCi0jZWxzZQ0KLSAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeA0KLSNlbmRpZg0KLSAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yDQotICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovDQotDQotICAgICAgICBzdWJsICAgICQzLCAlZWN4DQotICAgICAgICBtb3ZiICAgIChmcm9tX3IpLCAlYWwNCi0gICAgICAgIG1vdmIgICAgJWFsLCAob3V0X3IpDQotICAgICAgICBtb3ZiICAgIDEoZnJvbV9yKSwgJWFsDQotICAgICAgICBtb3ZiICAgIDIoZnJvbV9yKSwgJWRsDQotICAgICAgICBhZGRsICAgICQzLCBmcm9tX3INCi0gICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQ0KLSAgICAgICAgbW92YiAgICAlZGwsIDIob3V0X3IpDQotICAgICAgICBhZGRsICAgICQzLCBvdXRfcg0KLSAgICAgICAgcmVwICAgICBtb3ZzYg0KLQ0KLSAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovDQotI2lmIGRlZmluZWQoIFVTRV9NTVggKQ0KLSAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVieCAgICAgICAvKiBtb3ZlIGxjb2RlIGJhY2sgdG8gJWVieCwgdG9zcyBkaXN0ICovDQotI2VuZGlmDQotICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QNCi0NCi0uYWxpZ24gMTYsMHg5MA0KLQ0KLSNpZiAhIGRlZmluZWQoIFVTRV9NTVggKQ0KLQ0KLS5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6DQotICAgICAgICAvKiBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgew0KLSAgICAgICAgICogICB0aGlzID0gbGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmIG1hc2tbb3BdKV07DQotICAgICAgICAgKiB9DQotICAgICAgICAgKi8NCi0gICAgICAgIHRlc3RiICAgJDY0LCAlYWwNCi0gICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrICAvKiBpZiAoKG9wICYgNjQpICE9IDApICovDQotDQotICAgICAgICBtb3ZsICAgICQxLCAlZWF4DQotICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KLSAgICAgICAgZGVjbCAgICAlZWF4DQotICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVheCAgICAgICAgICAgIC8qIGVheCAmPSBob2xkICovDQotICAgICAgICBhZGRsICAgICVlZHgsICVlYXggICAgICAgICAgICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLw0KLSAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBsY29kZSAqLw0KLSAgICAgICAgbW92bCAgICAoJWVkeCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVt2YWwgKyAoaG9sZCZtYXNrW29wXSldICovDQotICAgICAgICBqbXAgICAgIC5MX2RvbGVuDQotDQotI2Vsc2UgLyogVVNFX01NWCAqLw0KLQ0KLS5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6IA0KLSAgICAgICAgdGVzdGIgICAkNjQsICVhbA0KLSAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8NCi0NCi0gICAgICAgIGFuZGwgICAgJDE1LCAlZWF4DQotICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLw0KLSAgICAgICAgbW92ZCAgICBob2xkX21tLCAlZWN4DQotICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3gNCi0gICAgICAgIGFkZGwgICAgbGVuX3IsICVlY3gNCi0gICAgICAgIG1vdmwgICAgKCVlYngsJWVjeCw0KSwgJWVheCAgICAgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLw0KLSAgICAgICAgam1wICAgICAuTF9kb2xlbg0KLQ0KLSNlbmRpZg0KLQ0KLS5hbGlnbiAxNiwweDkwDQotDQotI2lmICEgZGVmaW5lZCggVVNFX01NWCApDQotDQotLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3Q6DQotICAgICAgICAvKiBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgew0KLSAgICAgICAgICogICB0aGlzID0gZGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmIG1hc2tbb3BdKV07DQotICAgICAgICAgKiB9DQotICAgICAgICAgKi8NCi0gICAgICAgIHRlc3RiICAgJDY0LCAlYWwNCi0gICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlICAvKiBpZiAoKG9wICYgNjQpICE9IDApICovDQotDQotICAgICAgICBtb3ZsICAgICQxLCAlZWF4DQotICAgICAgICBzaGxsICAgICVjbCwgJWVheA0KLSAgICAgICAgZGVjbCAgICAlZWF4DQotICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVheCAgICAgICAgICAgIC8qIGVheCAmPSBob2xkICovDQotICAgICAgICBhZGRsICAgICVlZHgsICVlYXggICAgICAgICAgICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLw0KLSAgICAgICAgbW92bCAgICBkY29kZSglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBkY29kZSAqLw0KLSAgICAgICAgbW92bCAgICAoJWVkeCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBkY29kZVt2YWwgKyAoaG9sZCZtYXNrW29wXSldICovDQotICAgICAgICBqbXAgICAgIC5MX2RvZGlzdA0KLQ0KLSNlbHNlIC8qIFVTRV9NTVggKi8NCi0NCi0uTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDoNCi0gICAgICAgIHRlc3RiICAgJDY0LCAlYWwNCi0gICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlICAvKiBpZiAoKG9wICYgNjQpICE9IDApICovDQotDQotICAgICAgICBhbmRsICAgICQxNSwgJWVheA0KLSAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8NCi0gICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeA0KLSAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4DQotICAgICAgICBtb3ZsICAgIGRjb2RlKCVlc3ApLCAlZWF4ICAgICAgIC8qIGVjeCA9IGRjb2RlICovDQotICAgICAgICBhZGRsICAgIGRpc3RfciwgJWVjeA0KLSAgICAgICAgbW92bCAgICAoJWVheCwlZWN4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovDQotICAgICAgICBqbXAgICAgIC5MX2RvZGlzdA0KLQ0KLSNlbmRpZg0KLQ0KLS5hbGlnbiAxNiwweDkwDQotLkxfY2xpcF93aW5kb3c6DQotICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0DQotICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzDQotICAgICAgICAgKg0KLSAgICAgICAgICogZWxzZSB7DQotICAgICAgICAgKiAgIGlmIChkaXN0ID4gd3NpemUpIHsNCi0gICAgICAgICAqICAgICBpbnZhbGlkIGRpc3RhbmNlDQotICAgICAgICAgKiAgIH0NCi0gICAgICAgICAqICAgZnJvbSA9IHdpbmRvdzsNCi0gICAgICAgICAqICAgbmJ5dGVzID0gZGlzdCAtIG5ieXRlczsNCi0gICAgICAgICAqICAgaWYgKHdyaXRlID09IDApIHsNCi0gICAgICAgICAqICAgICBmcm9tICs9IHdzaXplIC0gbmJ5dGVzOw0KLSAgICAgICAgICovDQotI2RlZmluZSBuYnl0ZXNfciAlZWN4DQotDQotICAgICAgICBtb3ZsICAgICVlYXgsIG5ieXRlc19yDQotICAgICAgICBtb3ZsICAgIHdzaXplKCVlc3ApLCAlZWF4ICAgICAgIC8qIHByZXBhcmUgZm9yIGRpc3QgY29tcGFyZSAqLw0KLSAgICAgICAgbmVnbCAgICBuYnl0ZXNfciAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovDQotICAgICAgICBtb3ZsICAgIHdpbmRvdyglZXNwKSwgZnJvbV9yICAgIC8qIGZyb20gPSB3aW5kb3cgKi8NCi0NCi0gICAgICAgIGNtcGwgICAgZGlzdF9yLCAlZWF4DQotICAgICAgICBqYiAgICAgIC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhciAvKiBpZiAoZGlzdCA+IHdzaXplKSAqLw0KLQ0KLSAgICAgICAgYWRkbCAgICBkaXN0X3IsIG5ieXRlc19yICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovDQotICAgICAgICBjbXBsICAgICQwLCB3cml0ZSglZXNwKQ0KLSAgICAgICAgam5lICAgICAuTF93cmFwX2Fyb3VuZF93aW5kb3cgICAvKiBpZiAod3JpdGUgIT0gMCkgKi8NCi0NCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsICVlYXgNCi0gICAgICAgIGFkZGwgICAgJWVheCwgZnJvbV9yICAgICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLw0KLQ0KLSAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdA0KLSAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcywgJWVheCA9IGxlbg0KLSAgICAgICAgICoNCi0gICAgICAgICAqICAgICBpZiAobmJ5dGVzIDwgbGVuKSB7DQotICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOw0KLSAgICAgICAgICogICAgICAgZG8gew0KLSAgICAgICAgICogICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsNCi0gICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsNCi0gICAgICAgICAqICAgICAgIGZyb20gPSBvdXQgLSBkaXN0Ow0KLSAgICAgICAgICogICAgIH0NCi0gICAgICAgICAqICAgfQ0KLSAgICAgICAgICovDQotDQotI2lmICEgZGVmaW5lZCggVVNFX01NWCApDQotI2RlZmluZSBsZW5fciAlZWF4DQotICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgbGVuX3INCi0jZW5kaWYNCi0gICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yDQotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KLQ0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovDQotICAgICAgICByZXAgICAgIG1vdnNiDQotICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3INCi0gICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCi0gICAgICAgIGptcCAgICAgLkxfZG9fY29weTENCi0NCi0gICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yDQotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KLQ0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovDQotICAgICAgICByZXAgICAgIG1vdnNiDQotICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3INCi0gICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCi0gICAgICAgIGptcCAgICAgLkxfZG9fY29weTENCi0NCi0uTF93cmFwX2Fyb3VuZF93aW5kb3c6DQotICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0DQotICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzLCAlZWF4ID0gd3JpdGUsICVlYXggPSBsZW4NCi0gICAgICAgICAqDQotICAgICAgICAgKiAgIGVsc2UgaWYgKHdyaXRlIDwgbmJ5dGVzKSB7DQotICAgICAgICAgKiAgICAgZnJvbSArPSB3c2l6ZSArIHdyaXRlIC0gbmJ5dGVzOw0KLSAgICAgICAgICogICAgIG5ieXRlcyAtPSB3cml0ZTsNCi0gICAgICAgICAqICAgICBpZiAobmJ5dGVzIDwgbGVuKSB7DQotICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOw0KLSAgICAgICAgICogICAgICAgZG8gew0KLSAgICAgICAgICogICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsNCi0gICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsNCi0gICAgICAgICAqICAgICAgIGZyb20gPSB3aW5kb3c7DQotICAgICAgICAgKiAgICAgICBuYnl0ZXMgPSB3cml0ZTsNCi0gICAgICAgICAqICAgICAgIGlmIChuYnl0ZXMgPCBsZW4pIHsNCi0gICAgICAgICAqICAgICAgICAgbGVuIC09IG5ieXRlczsNCi0gICAgICAgICAqICAgICAgICAgZG8gew0KLSAgICAgICAgICogICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOw0KLSAgICAgICAgICogICAgICAgICB9IHdoaWxlKC0tbmJ5dGVzKTsNCi0gICAgICAgICAqICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7DQotICAgICAgICAgKiAgICAgICB9DQotICAgICAgICAgKiAgICAgfQ0KLSAgICAgICAgICogICB9DQotICAgICAgICAgKi8NCi0jZGVmaW5lIHdyaXRlX3IgJWVheA0KLQ0KLSAgICAgICAgbW92bCAgICB3cml0ZSglZXNwKSwgd3JpdGVfcg0KLSAgICAgICAgY21wbCAgICB3cml0ZV9yLCBuYnl0ZXNfcg0KLSAgICAgICAgamJlICAgICAuTF9jb250aWd1b3VzX2luX3dpbmRvdyAvKiBpZiAod3JpdGUgPj0gbmJ5dGVzKSAqLw0KLQ0KLSAgICAgICAgYWRkbCAgICB3c2l6ZSglZXNwKSwgZnJvbV9yDQotICAgICAgICBhZGRsICAgIHdyaXRlX3IsIGZyb21fcg0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBuYnl0ZXMgKi8NCi0gICAgICAgIHN1YmwgICAgd3JpdGVfciwgbmJ5dGVzX3IgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovDQotI3VuZGVmIHdyaXRlX3INCi0NCi0jaWYgISBkZWZpbmVkKCBVU0VfTU1YICkNCi0gICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCBsZW5fcg0KLSNlbmRpZg0KLSAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3INCi0gICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovDQotDQotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8NCi0gICAgICAgIHJlcCAgICAgbW92c2INCi0gICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLw0KLSAgICAgICAgbW92bCAgICB3cml0ZSglZXNwKSwgbmJ5dGVzX3IgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLw0KLSAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3INCi0gICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovDQotDQotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8NCi0gICAgICAgIHJlcCAgICAgbW92c2INCi0gICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcg0KLSAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLw0KLSAgICAgICAgam1wICAgICAuTF9kb19jb3B5MQ0KLQ0KLS5MX2NvbnRpZ3VvdXNfaW5fd2luZG93Og0KLSAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdA0KLSAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcywgJWVheCA9IHdyaXRlLCAlZWF4ID0gbGVuDQotICAgICAgICAgKg0KLSAgICAgICAgICogICBlbHNlIHsNCi0gICAgICAgICAqICAgICBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzOw0KLSAgICAgICAgICogICAgIGlmIChuYnl0ZXMgPCBsZW4pIHsNCi0gICAgICAgICAqICAgICAgIGxlbiAtPSBuYnl0ZXM7DQotICAgICAgICAgKiAgICAgICBkbyB7DQotICAgICAgICAgKiAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOw0KLSAgICAgICAgICogICAgICAgfSB3aGlsZSAoLS1uYnl0ZXMpOw0KLSAgICAgICAgICogICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7DQotICAgICAgICAgKiAgICAgfQ0KLSAgICAgICAgICogICB9DQotICAgICAgICAgKi8NCi0jZGVmaW5lIHdyaXRlX3IgJWVheA0KLQ0KLSAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3INCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGZyb21fciAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLw0KLSN1bmRlZiB3cml0ZV9yDQotDQotI2lmICEgZGVmaW5lZCggVVNFX01NWCApDQotICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgbGVuX3INCi0jZW5kaWYNCi0gICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yDQotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLw0KLQ0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovDQotICAgICAgICByZXAgICAgIG1vdnNiDQotICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3INCi0gICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCi0NCi0uTF9kb19jb3B5MToNCi0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0DQotICAgICAgICAgKiAgICAgICAlZWF4ID0gbGVuDQotICAgICAgICAgKg0KLSAgICAgICAgICogICAgIHdoaWxlIChsZW4gPiAwKSB7DQotICAgICAgICAgKiAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsNCi0gICAgICAgICAqICAgICAgIGxlbi0tOw0KLSAgICAgICAgICogICAgIH0NCi0gICAgICAgICAqICAgfQ0KLSAgICAgICAgICogfSB3aGlsZSAoaW4gPCBsYXN0ICYmIG91dCA8IGVuZCk7DQotICAgICAgICAgKi8NCi0jdW5kZWYgbmJ5dGVzX3INCi0jZGVmaW5lIGluX3IgJWVzaQ0KLQ0KLSAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeA0KLSAgICAgICAgcmVwICAgICBtb3ZzYg0KLQ0KLSAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovDQotI2lmIGRlZmluZWQoIFVTRV9NTVggKQ0KLSAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVieCAgICAgICAvKiBtb3ZlIGxjb2RlIGJhY2sgdG8gJWVieCwgdG9zcyBkaXN0ICovDQotI2VuZGlmDQotICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QNCi0NCi0jdW5kZWYgbGVuX3INCi0jdW5kZWYgZnJvbV9yDQotI3VuZGVmIGRpc3Rfcg0KLQ0KLS5MX2ludmFsaWRfZGlzdGFuY2VfY29kZToNCi0gICAgICAgIC8qIGVsc2Ugew0KLSAgICAgICAgICogICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsNCi0gICAgICAgICAqICAgc3RhdGUtPm1vZGUgPSBCQUQ7DQotICAgICAgICAgKiB9DQotICAgICAgICAgKi8NCi0gICAgICAgIG1vdmwgICAgJC5MX2ludmFsaWRfZGlzdGFuY2VfY29kZV9tc2csICVlY3gNCi0gICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9CQUQsICVlZHgNCi0gICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQ0KLQ0KLS5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jazoNCi0gICAgICAgIC8qIGVsc2UgaWYgKG9wICYgMzIpIHsNCi0gICAgICAgICAqICAgc3RhdGUtPm1vZGUgPSBUWVBFOw0KLSAgICAgICAgICogICBicmVhazsNCi0gICAgICAgICAqIH0NCi0gICAgICAgICAqLw0KLSAgICAgICAgdGVzdGIgICAkMzIsICVhbA0KLSAgICAgICAganogICAgICAuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGUgIC8qIGlmICgob3AgJiAzMikgPT0gMCkgKi8NCi0NCi0gICAgICAgIG1vdmwgICAgJDAsICVlY3gNCi0gICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9UWVBFLCAlZWR4DQotICAgICAgICBqbXAgICAgIC5MX3VwZGF0ZV9zdHJlYW1fc3RhdGUNCi0NCi0uTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6DQotICAgICAgICAvKiBlbHNlIHsNCi0gICAgICAgICAqICAgc3RybS0+bXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7DQotICAgICAgICAgKiAgIHN0YXRlLT5tb2RlID0gQkFEOw0KLSAgICAgICAgICogfQ0KLSAgICAgICAgICovDQotICAgICAgICBtb3ZsICAgICQuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnLCAlZWN4DQotICAgICAgICBtb3ZsICAgICRJTkZMQVRFX01PREVfQkFELCAlZWR4DQotICAgICAgICBqbXAgICAgIC5MX3VwZGF0ZV9zdHJlYW1fc3RhdGUNCi0NCi0uTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6DQotICAgICAgICAvKiBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOw0KLSAgICAgICAgICogc3RhdGUtPm1vZGUgPSBCQUQ7DQotICAgICAgICAgKi8NCi0gICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IgICAgICAgICAgLyogZnJvbV9yIGhhcyBpbidzIHJlZywgcHV0IGluIGJhY2sgKi8NCi0gICAgICAgIG1vdmwgICAgJC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2csICVlY3gNCi0gICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9CQUQsICVlZHgNCi0gICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQ0KLQ0KLS5MX3VwZGF0ZV9zdHJlYW1fc3RhdGU6DQotICAgICAgICAvKiBzZXQgc3RybS0+bXNnID0gJWVjeCwgc3RybS0+c3RhdGUtPm1vZGUgPSAlZWR4ICovDQotICAgICAgICBtb3ZsICAgIHN0cm1fc3AoJWVzcCksICVlYXgNCi0gICAgICAgIHRlc3RsICAgJWVjeCwgJWVjeCAgICAgICAgICAgICAgLyogaWYgKG1zZyAhPSBOVUxMKSAqLw0KLSAgICAgICAganogICAgICAuTF9za2lwX21zZw0KLSAgICAgICAgbW92bCAgICAlZWN4LCBtc2dfc3RybSglZWF4KSAgICAvKiBzdHJtLT5tc2cgPSBtc2cgKi8NCi0uTF9za2lwX21zZzoNCi0gICAgICAgIG1vdmwgICAgc3RhdGVfc3RybSglZWF4KSwgJWVheCAgLyogc3RhdGUgPSBzdHJtLT5zdGF0ZSAqLw0KLSAgICAgICAgbW92bCAgICAlZWR4LCBtb2RlX3N0YXRlKCVlYXgpICAvKiBzdGF0ZS0+bW9kZSA9IGVkeCAoQkFEIHwgVFlQRSkgKi8NCi0NCi0uTF9icmVha19sb29wOg0KLQ0KLSNkZWZpbmUgc3RybV9yICAlZWF4DQotI2RlZmluZSBzdGF0ZV9yICVlZHgNCi0NCi0gICAgICAgIC8qIGxlbiA9IGJpdHMgPj4gMzsNCi0gICAgICAgICAqIGluIC09IGxlbjsNCi0gICAgICAgICAqIGJpdHMgLT0gbGVuIDw8IDM7DQotICAgICAgICAgKiBob2xkICY9ICgxVSA8PCBiaXRzKSAtIDE7DQotICAgICAgICAgKiBzdGF0ZS0+aG9sZCA9IGhvbGQ7DQotICAgICAgICAgKiBzdGF0ZS0+Yml0cyA9IGJpdHM7DQotICAgICAgICAgKiBzdHJtLT5uZXh0X2luID0gaW47DQotICAgICAgICAgKiBzdHJtLT5uZXh0X291dCA9IG91dDsNCi0gICAgICAgICAqLw0KLSAgICAgICAgbW92bCAgICBzdHJtX3NwKCVlc3ApLCBzdHJtX3INCi0gICAgICAgIG1vdmwgICAgYml0c2xvbmdfciwgJWVjeA0KLSAgICAgICAgbW92bCAgICBzdGF0ZV9zdHJtKHN0cm1fciksIHN0YXRlX3INCi0gICAgICAgIHNocmwgICAgJDMsICVlY3gNCi0gICAgICAgIHN1YmwgICAgJWVjeCwgaW5fcg0KLSAgICAgICAgc2hsbCAgICAkMywgJWVjeA0KLSAgICAgICAgc3VibCAgICAlZWN4LCBiaXRzbG9uZ19yDQotICAgICAgICBtb3ZsICAgIG91dF9yLCBuZXh0X291dF9zdHJtKHN0cm1fcikNCi0gICAgICAgIG1vdmwgICAgaW5fciwgbmV4dF9pbl9zdHJtKHN0cm1fcikNCi0gICAgICAgIG1vdmwgICAgYml0c2xvbmdfciwgYml0c19zdGF0ZShzdGF0ZV9yKQ0KLQ0KLSAgICAgICAgbW92bCAgICBiaXRzbG9uZ19yLCAlZWN4DQotICAgICAgICBtb3ZsICAgICQxLCAlZWJ4ICAgICAgICAgICAgICAgIC8qIG92ZXJ3cml0ZXMgYml0c2xvbmdfciwgJWJsICovDQotICAgICAgICBzaGxsICAgICVjbCwgJWVieA0KLSAgICAgICAgZGVjbCAgICAlZWJ4DQotDQotI3VuZGVmIGJpdHNfcg0KLSN1bmRlZiBiaXRzbG9uZ19yDQotDQotI2lmICEgZGVmaW5lZCggVVNFX01NWCApDQotDQotICAgICAgICBhbmRsICAgICVlYngsIGhvbGRfcg0KLSAgICAgICAgbW92bCAgICBob2xkX3IsIGhvbGRfc3RhdGUoc3RhdGVfcikNCi0NCi0jZWxzZSAvKiBVU0VfTU1YICovDQotDQotICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLw0KLSAgICAgICAgbW92ZCAgICBob2xkX21tLCAlZWN4DQotICAgICAgICBhbmRsICAgICVlYngsICVlY3gNCi0gICAgICAgIG1vdmwgICAgJWVjeCwgaG9sZF9zdGF0ZShzdGF0ZV9yKQ0KLQ0KLSNlbmRpZg0KLQ0KLSNkZWZpbmUgbGFzdF9yICVlYngNCi0NCi0gICAgICAgIC8qIHN0cm0tPmF2YWlsX2luID0gaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gaW4pIDogNSAtIChpbiAtIGxhc3QpICovDQotICAgICAgICBtb3ZsICAgIGxhc3QoJWVzcCksIGxhc3Rfcg0KLSAgICAgICAgY21wbCAgICBpbl9yLCBsYXN0X3INCi0gICAgICAgIGpiZSAgICAgLkxfbGFzdF9pc19zbWFsbGVyICAgICAvKiBpZiAoaW4gPj0gbGFzdCkgKi8NCi0NCi0gICAgICAgIHN1YmwgICAgaW5fciwgbGFzdF9yICAgICAgICAgICAvKiBsYXN0IC09IGluICovDQotICAgICAgICBhZGRsICAgICQ1LCBsYXN0X3IgICAgICAgICAgICAgLyogbGFzdCArPSA1ICovDQotICAgICAgICBtb3ZsICAgIGxhc3RfciwgYXZhaWxfaW5fc3RybShzdHJtX3IpDQotICAgICAgICBqbXAgICAgIC5MX2ZpeHVwX291dA0KLS5MX2xhc3RfaXNfc21hbGxlcjoNCi0gICAgICAgIHN1YmwgICAgbGFzdF9yLCBpbl9yICAgICAgICAgICAvKiBpbiAtPSBsYXN0ICovDQotICAgICAgICBuZWdsICAgIGluX3IgICAgICAgICAgICAgICAgICAgLyogaW4gPSAtaW4gKi8NCi0gICAgICAgIGFkZGwgICAgJDUsIGluX3IgICAgICAgICAgICAgICAvKiBpbiArPSA1ICovDQotICAgICAgICBtb3ZsICAgIGluX3IsIGF2YWlsX2luX3N0cm0oc3RybV9yKQ0KLQ0KLSN1bmRlZiBsYXN0X3INCi0jZGVmaW5lIGVuZF9yICVlYngNCi0NCi0uTF9maXh1cF9vdXQ6DQotICAgICAgICAvKiBzdHJtLT5hdmFpbF9vdXQgPSBvdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gb3V0KSA6IDI1NyAtIChvdXQgLSBlbmQpKi8NCi0gICAgICAgIG1vdmwgICAgZW5kKCVlc3ApLCBlbmRfcg0KLSAgICAgICAgY21wbCAgICBvdXRfciwgZW5kX3INCi0gICAgICAgIGpiZSAgICAgLkxfZW5kX2lzX3NtYWxsZXIgICAgICAvKiBpZiAob3V0ID49IGVuZCkgKi8NCi0NCi0gICAgICAgIHN1YmwgICAgb3V0X3IsIGVuZF9yICAgICAgICAgICAvKiBlbmQgLT0gb3V0ICovDQotICAgICAgICBhZGRsICAgICQyNTcsIGVuZF9yICAgICAgICAgICAgLyogZW5kICs9IDI1NyAqLw0KLSAgICAgICAgbW92bCAgICBlbmRfciwgYXZhaWxfb3V0X3N0cm0oc3RybV9yKQ0KLSAgICAgICAgam1wICAgICAuTF9kb25lDQotLkxfZW5kX2lzX3NtYWxsZXI6DQotICAgICAgICBzdWJsICAgIGVuZF9yLCBvdXRfciAgICAgICAgICAgLyogb3V0IC09IGVuZCAqLw0KLSAgICAgICAgbmVnbCAgICBvdXRfciAgICAgICAgICAgICAgICAgIC8qIG91dCA9IC1vdXQgKi8NCi0gICAgICAgIGFkZGwgICAgJDI1Nywgb3V0X3IgICAgICAgICAgICAvKiBvdXQgKz0gMjU3ICovDQotICAgICAgICBtb3ZsICAgIG91dF9yLCBhdmFpbF9vdXRfc3RybShzdHJtX3IpDQotDQotI3VuZGVmIGVuZF9yDQotDQotLkxfZG9uZToNCi0jaWYgZGVmaW5lZCggVVNFX01NWCApDQotICAgICAgICBlbW1zDQotI2VuZGlmDQotICAgICAgICBhZGRsICAgICRsb2NhbF92YXJfc2l6ZSwgJWVzcA0KLSAgICAgICAgcG9wZg0KLSAgICAgICAgcG9wbCAgICAlZWJ4DQotICAgICAgICBwb3BsICAgICVlYnANCi0gICAgICAgIHBvcGwgICAgJWVzaQ0KLSAgICAgICAgcG9wbCAgICAlZWRpDQotICAgICAgICByZXQNCi0NCi0udHlwZSBpbmZsYXRlX2Zhc3QsQGZ1bmN0aW9uDQotLnNpemUgaW5mbGF0ZV9mYXN0LC4taW5mbGF0ZV9mYXN0DQorLyoKKyAqIGluZmZhc3QuUyBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2Y6CisgKgorICogaW5mZmFzdC5jIC0tIGZhc3QgZGVjb2RpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzIEFuZGVyc29uIDxjaHJpc3RvcEBjaGFybS5uZXQ+CisgKiBQbGVhc2UgdXNlIHRoZSBjb3B5cmlnaHQgY29uZGl0aW9ucyBhYm92ZS4KKyAqIAorICogVGhpcyB2ZXJzaW9uIChKYW4tMjMtMjAwMykgb2YgaW5mbGF0ZV9mYXN0IHdhcyBjb2RlZCBhbmQgdGVzdGVkIHVuZGVyCisgKiBHTlUvTGludXggb24gYSBwZW50aXVtIDMsIHVzaW5nIHRoZSBnY2MtMy4yIGNvbXBpbGVyIGRpc3RyaWJ1dGlvbi4gIE9uIHRoYXQKKyAqIG1hY2hpbmUsIEkgZm91bmQgdGhhdCBnemlwIHN0eWxlIGFyY2hpdmVzIGRlY29tcHJlc3NlZCBhYm91dCAyMCUgZmFzdGVyIHRoYW4KKyAqIHRoZSBnY2MtMy4yIC1PMyAtZm9taXQtZnJhbWUtcG9pbnRlciBjb21waWxlZCB2ZXJzaW9uLiAgWW91ciByZXN1bHRzIHdpbGwKKyAqIGRlcGVuZCBvbiBob3cgbGFyZ2Ugb2YgYSBidWZmZXIgaXMgdXNlZCBmb3Igel9zdHJlYW0ubmV4dF9pbiAmIG5leHRfb3V0CisgKiAoOEstMzJLIHdvcmtlZCBiZXN0IGZvciBteSAyNTZLIGNwdSBjYWNoZSkgYW5kIGhvdyBtdWNoIG92ZXJoZWFkIHRoZXJlIGlzIGluCisgKiBzdHJlYW0gcHJvY2Vzc2luZyBJL08gYW5kIGNyYzMyL2FkZGxlcjMyLiAgSW4gbXkgY2FzZSwgdGhpcyByb3V0aW5lIHVzZWQKKyAqIDcwJSBvZiB0aGUgY3B1IHRpbWUgYW5kIGNyYzMyIHVzZWQgMjAlLgorICoKKyAqIEkgYW0gY29uZmlkZW50IHRoYXQgdGhpcyB2ZXJzaW9uIHdpbGwgd29yayBpbiB0aGUgZ2VuZXJhbCBjYXNlLCBidXQgSSBoYXZlCisgKiBub3QgdGVzdGVkIGEgd2lkZSB2YXJpZXR5IG9mIGRhdGFzZXRzIG9yIGEgd2lkZSB2YXJpZXR5IG9mIHBsYXRmb3Jtcy4KKyAqCisgKiBKYW4tMjQtMjAwMyAtLSBBZGRlZCAtRFVTRV9NTVggZGVmaW5lIGZvciBzbGlnaHRseSBmYXN0ZXIgaW5mbGF0aW5nLgorICogSXQgc2hvdWxkIGJlIGEgcnVudGltZSBmbGFnIGluc3RlYWQgb2YgY29tcGlsZSB0aW1lIGZsYWcuLi4KKyAqCisgKiBKYW4tMjYtMjAwMyAtLSBBZGRlZCBydW50aW1lIGNoZWNrIGZvciBNTVggc3VwcG9ydCB3aXRoIGNwdWlkIGluc3RydWN0aW9uLgorICogV2l0aCAtRFVTRV9NTVgsIG9ubHkgTU1YIGNvZGUgaXMgY29tcGlsZWQuICBXaXRoIC1ETk9fTU1YLCBvbmx5IG5vbi1NTVggY29kZQorICogaXMgY29tcGlsZWQuICBXaXRob3V0IGVpdGhlciBvcHRpb24sIHJ1bnRpbWUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQuICBSdW50aW1lCisgKiBkZXRlY3Rpb24gc2hvdWxkIHdvcmsgb24gYWxsIG1vZGVybiBjcHVzIGFuZCB0aGUgcmVjb21lbmRlZCBhbGdvcml0aG0gKGZsaXAKKyAqIElEIGJpdCBvbiBlZmxhZ3MgYW5kIHRoZW4gdXNlIHRoZSBjcHVpZCBpbnN0cnVjdGlvbikgaXMgdXNlZCBpbiBtYW55CisgKiBtdWx0aW1lZGlhIGFwcGxpY2F0aW9ucy4gIFRlc3RlZCB1bmRlciB3aW4yayB3aXRoIGdjYy0yLjk1IGFuZCBnYXMtMi4xMgorICogZGlzdHJpYnV0ZWQgd2l0aCBjeWd3aW4zLiAgQ29tcGlsaW5nIHdpdGggZ2NjLTIuOTUgLWMgaW5mZmFzdC5TIC1vCisgKiBpbmZmYXN0Lm9iaiBnZW5lcmF0ZXMgYSBDT0ZGIG9iamVjdCB3aGljaCBjYW4gdGhlbiBiZSBsaW5rZWQgd2l0aCBNU1ZDKysKKyAqIGNvbXBpbGVkIGNvZGUuICBUZXN0ZWQgdW5kZXIgRnJlZUJTRCA0Ljcgd2l0aCBnY2MtMi45NS4KKyAqCisgKiBKYW4tMjgtMjAwMyAtLSBUZXN0ZWQgQXRobG9uIFhQLi4uIE1NWCBtb2RlIGlzIHNsb3dlciB0aGFuIG5vIE1NWCAoYW5kCisgKiBzbG93ZXIgdGhhbiBjb21waWxlciBnZW5lcmF0ZWQgY29kZSkuICBBZGp1c3RlZCBjcHVpZCBjaGVjayB0byB1c2UgdGhlIE1NWAorICogY29kZSBvbmx5IGZvciBQZW50aXVtcyA8IFA0IHVudGlsIEkgaGF2ZSBtb3JlIGRhdGEgb24gdGhlIFA0LiAgU3BlZWQKKyAqIGltcHJvdm1lbnQgaXMgb25seSBhYm91dCAxNSUgb24gdGhlIEF0aGxvbiB3aGVuIGNvbXBhcmVkIHdpdGggY29kZSBnZW5lcmF0ZWQKKyAqIHdpdGggTVNWQysrLiAgTm90IHN1cmUgeWV0LCBidXQgSSB0aGluayB0aGUgUDQgd2lsbCBhbHNvIGJlIHNsb3dlciB1c2luZyB0aGUKKyAqIE1NWCBtb2RlIGJlY2F1c2UgbWFueSBvZiBpdCdzIHg4NiBBTFUgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGUgaW4gLjUgY3ljbGVzIGFuZAorICogaGF2ZSBsZXNzIGxhdGVuY3kgdGhhbiBNTVggb3BzLiAgQWRkZWQgY29kZSB0byBidWZmZXIgdGhlIGxhc3QgMTEgYnl0ZXMgb2YKKyAqIHRoZSBpbnB1dCBzdHJlYW0gc2luY2UgdGhlIE1NWCBjb2RlIGdyYWJzIGJpdHMgaW4gY2h1bmtzIG9mIDMyLCB3aGljaAorICogZGlmZmVycyBmcm9tIHRoZSBpbmZmYXN0LmMgYWxnb3JpdGhtLiAgSSBkb24ndCB0aGluayB0aGVyZSB3b3VsZCBoYXZlIGJlZW4KKyAqIHJlYWQgb3ZlcnJ1bnMgd2hlcmUgYSBwYWdlIGJvdW5kYXJ5IHdhcyBjcm9zc2VkIChhIHNlZ2ZhdWx0KSwgYnV0IHRoZXJlCisgKiBjb3VsZCBoYXZlIGJlZW4gb3ZlcnJ1bnMgd2hlbiBuZXh0X2luIGVuZHMgb24gdW5hbGlnbmVkIG1lbW9yeSAodW5pbnRpYWxpemVkCisgKiBtZW1vcnkgcmVhZCkuCisgKgorICogTWFyLTEzLTIwMDMgLS0gUDQgTU1YIGlzIHNsaWdodGx5IHNsb3dlciB0aGFuIFA0IE5PX01NWC4gIEkgY3JlYXRlZCBhIEMKKyAqIHZlcnNpb24gb2YgdGhlIG5vbi1NTVggY29kZSBzbyB0aGF0IGl0IGRvZXNuJ3QgZGVwZW5kIG9uIHpzdHJtIGFuZCB6c3RhdGUKKyAqIHN0cnVjdHVyZSBvZmZzZXRzIHdoaWNoIGFyZSBoYXJkIGNvZGVkIGluIHRoaXMgZmlsZS4gIFRoaXMgd2FzIGxhc3QgdGVzdGVkCisgKiB3aXRoIHpsaWItMS4yLjAgd2hpY2ggaXMgY3VycmVudGx5IGluIGJldGEgdGVzdGluZywgbmV3ZXIgdmVyc2lvbnMgb2YgdGhpcworICogYW5kIGluZmZhczg2LmMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly93d3cuZWV0YmVldGVlLmNvbS96bGliLyBhbmQKKyAqIGh0dHA6Ly93d3cuY2hhcm0ubmV0L35jaHJpc3RvcC96bGliLworICovCisKKworLyoKKyAqIGlmIHlvdSBoYXZlIHVuZGVyc2NvcmUgbGlua2luZyBwcm9ibGVtcyAoX2luZmxhdGVfZmFzdCB1bmRlZmluZWQpLCB0cnkKKyAqIHVzaW5nIC1ER0FTX0NPRkYKKyAqLworI2lmICEgZGVmaW5lZCggR0FTX0NPRkYgKSAmJiAhIGRlZmluZWQoIEdBU19FTEYgKQorCisjaWYgZGVmaW5lZCggX19DWUdXSU5fXyApCisjZGVmaW5lIEdBU19DT0ZGIC8qIHdpbmRvd3Mgb2JqZWN0IGZvcm1hdCAqLworI2Vsc2UKKyNkZWZpbmUgR0FTX0VMRgorI2VuZGlmCisKKyNlbmRpZiAvKiAhIEdBU19DT0ZGICYmICEgR0FTX0VMRiAqLworCisKKyNpZiBkZWZpbmVkKCBHQVNfQ09GRiApCisKKy8qIGNvZmYgZXh0ZXJuYWxzIGhhdmUgdW5kZXJzY29yZXMgKi8KKyNkZWZpbmUgaW5mbGF0ZV9mYXN0IF9pbmZsYXRlX2Zhc3QKKyNkZWZpbmUgaW5mbGF0ZV9mYXN0X3VzZV9tbXggX2luZmxhdGVfZmFzdF91c2VfbW14CisKKyNlbmRpZiAvKiBHQVNfQ09GRiAqLworCisKKy5maWxlICJpbmZmYXN0LlMiCisKKy5nbG9ibCBpbmZsYXRlX2Zhc3QKKworLnRleHQKKy5hbGlnbiA0LDAKKy5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZV9tc2c6Cisuc3RyaW5nICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiCisKKy5hbGlnbiA0LDAKKy5MX2ludmFsaWRfZGlzdGFuY2VfY29kZV9tc2c6Cisuc3RyaW5nICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiCisKKy5hbGlnbiA0LDAKKy5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2c6Cisuc3RyaW5nICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIKKworI2lmICEgZGVmaW5lZCggTk9fTU1YICkKKy5hbGlnbiA0LDAKKy5MX21hc2s6IC8qIG1hc2tbTl0gPSAoIDEgPDwgTiApIC0gMSAqLworLmxvbmcgMAorLmxvbmcgMQorLmxvbmcgMworLmxvbmcgNworLmxvbmcgMTUKKy5sb25nIDMxCisubG9uZyA2MworLmxvbmcgMTI3CisubG9uZyAyNTUKKy5sb25nIDUxMQorLmxvbmcgMTAyMworLmxvbmcgMjA0NworLmxvbmcgNDA5NQorLmxvbmcgODE5MQorLmxvbmcgMTYzODMKKy5sb25nIDMyNzY3CisubG9uZyA2NTUzNQorLmxvbmcgMTMxMDcxCisubG9uZyAyNjIxNDMKKy5sb25nIDUyNDI4NworLmxvbmcgMTA0ODU3NQorLmxvbmcgMjA5NzE1MQorLmxvbmcgNDE5NDMwMworLmxvbmcgODM4ODYwNworLmxvbmcgMTY3NzcyMTUKKy5sb25nIDMzNTU0NDMxCisubG9uZyA2NzEwODg2MworLmxvbmcgMTM0MjE3NzI3CisubG9uZyAyNjg0MzU0NTUKKy5sb25nIDUzNjg3MDkxMQorLmxvbmcgMTA3Mzc0MTgyMworLmxvbmcgMjE0NzQ4MzY0NworLmxvbmcgNDI5NDk2NzI5NQorI2VuZGlmIC8qIE5PX01NWCAqLworCisudGV4dAorCisvKgorICogc3RydWN0IHpfc3RyZWFtIG9mZnNldHMsIGluIHpsaWIuaAorICovCisjZGVmaW5lIG5leHRfaW5fc3RybSAgIDAgICAvKiBzdHJtLT5uZXh0X2luICovCisjZGVmaW5lIGF2YWlsX2luX3N0cm0gIDQgICAvKiBzdHJtLT5hdmFpbF9pbiAqLworI2RlZmluZSBuZXh0X291dF9zdHJtICAxMiAgLyogc3RybS0+bmV4dF9vdXQgKi8KKyNkZWZpbmUgYXZhaWxfb3V0X3N0cm0gMTYgIC8qIHN0cm0tPmF2YWlsX291dCAqLworI2RlZmluZSBtc2dfc3RybSAgICAgICAyNCAgLyogc3RybS0+bXNnICovCisjZGVmaW5lIHN0YXRlX3N0cm0gICAgIDI4ICAvKiBzdHJtLT5zdGF0ZSAqLworCisvKgorICogc3RydWN0IGluZmxhdGVfc3RhdGUgb2Zmc2V0cywgaW4gaW5mbGF0ZS5oCisgKi8KKyNkZWZpbmUgbW9kZV9zdGF0ZSAgICAgMCAgIC8qIHN0YXRlLT5tb2RlICovCisjZGVmaW5lIHdzaXplX3N0YXRlICAgIDMyICAvKiBzdGF0ZS0+d3NpemUgKi8KKyNkZWZpbmUgd3JpdGVfc3RhdGUgICAgMzYgIC8qIHN0YXRlLT53cml0ZSAqLworI2RlZmluZSB3aW5kb3dfc3RhdGUgICA0MCAgLyogc3RhdGUtPndpbmRvdyAqLworI2RlZmluZSBob2xkX3N0YXRlICAgICA0NCAgLyogc3RhdGUtPmhvbGQgKi8KKyNkZWZpbmUgYml0c19zdGF0ZSAgICAgNDggIC8qIHN0YXRlLT5iaXRzICovCisjZGVmaW5lIGxlbmNvZGVfc3RhdGUgIDY0ICAvKiBzdGF0ZS0+bGVuY29kZSAqLworI2RlZmluZSBkaXN0Y29kZV9zdGF0ZSA2OCAgLyogc3RhdGUtPmRpc3Rjb2RlICovCisjZGVmaW5lIGxlbmJpdHNfc3RhdGUgIDcyICAvKiBzdGF0ZS0+bGVuYml0cyAqLworI2RlZmluZSBkaXN0Yml0c19zdGF0ZSA3NiAgLyogc3RhdGUtPmRpc3RiaXRzICovCisKKy8qCisgKiBpbmZsYXRlX2Zhc3QncyBhY3RpdmF0aW9uIHJlY29yZAorICovCisjZGVmaW5lIGxvY2FsX3Zhcl9zaXplIDY0IC8qIGhvdyBtdWNoIGxvY2FsIHNwYWNlIGZvciB2YXJzICovCisjZGVmaW5lIHN0cm1fc3AgICAgICAgIDg4IC8qIGZpcnN0IGFyZzogel9zdHJlYW0gKiAobG9jYWxfdmFyX3NpemUgKyAyNCkgKi8KKyNkZWZpbmUgc3RhcnRfc3AgICAgICAgOTIgLyogc2Vjb25kIGFyZzogdW5zaWduZWQgaW50IChsb2NhbF92YXJfc2l6ZSArIDI4KSAqLworCisvKgorICogb2Zmc2V0cyBmb3IgbG9jYWwgdmFycyBvbiBzdGFjaworICovCisjZGVmaW5lIG91dCAgICAgICAgICAgIDYwICAvKiB1bnNpZ25lZCBjaGFyKiAqLworI2RlZmluZSB3aW5kb3cgICAgICAgICA1NiAgLyogdW5zaWduZWQgY2hhciogKi8KKyNkZWZpbmUgd3NpemUgICAgICAgICAgNTIgIC8qIHVuc2lnbmVkIGludCAqLworI2RlZmluZSB3cml0ZSAgICAgICAgICA0OCAgLyogdW5zaWduZWQgaW50ICovCisjZGVmaW5lIGluICAgICAgICAgICAgIDQ0ICAvKiB1bnNpZ25lZCBjaGFyKiAqLworI2RlZmluZSBiZWcgICAgICAgICAgICA0MCAgLyogdW5zaWduZWQgY2hhciogKi8KKyNkZWZpbmUgYnVmICAgICAgICAgICAgMjggIC8qIGNoYXJbIDEyIF0gKi8KKyNkZWZpbmUgbGVuICAgICAgICAgICAgMjQgIC8qIHVuc2lnbmVkIGludCAqLworI2RlZmluZSBsYXN0ICAgICAgICAgICAyMCAgLyogdW5zaWduZWQgY2hhciogKi8KKyNkZWZpbmUgZW5kICAgICAgICAgICAgMTYgIC8qIHVuc2lnbmVkIGNoYXIqICovCisjZGVmaW5lIGRjb2RlICAgICAgICAgIDEyICAvKiBjb2RlKiAqLworI2RlZmluZSBsY29kZSAgICAgICAgICAgOCAgLyogY29kZSogKi8KKyNkZWZpbmUgZG1hc2sgICAgICAgICAgIDQgIC8qIHVuc2lnbmVkIGludCAqLworI2RlZmluZSBsbWFzayAgICAgICAgICAgMCAgLyogdW5zaWduZWQgaW50ICovCisKKy8qCisgKiB0eXBlZGVmIGVudW0gaW5mbGF0ZV9tb2RlIGNvbnN0cywgaW4gaW5mbGF0ZS5oCisgKi8KKyNpZm5kZWYgTk9fR1VOWklQCisjZGVmaW5lIEdVTlpJUAorI2VuZGlmCisKKyNpZmRlZiBHVU5aSVAKKyNkZWZpbmUgSU5GTEFURV9NT0RFX1RZUEUgMTEgIC8qIHN0YXRlLT5tb2RlIGZsYWdzIGVudW0tZWQgaW4gaW5mbGF0ZS5oICovCisjZGVmaW5lIElORkxBVEVfTU9ERV9CQUQgIDI2CisjZWxzZQorI2RlZmluZSBJTkZMQVRFX01PREVfVFlQRSAzCisjZGVmaW5lIElORkxBVEVfTU9ERV9CQUQgIDE3CisjZW5kaWYKKworCisjaWYgISBkZWZpbmVkKCBVU0VfTU1YICkgJiYgISBkZWZpbmVkKCBOT19NTVggKQorCisjZGVmaW5lIFJVTl9USU1FX01NWAorCisjZGVmaW5lIENIRUNLX01NWCAgICAxCisjZGVmaW5lIERPX1VTRV9NTVggICAyCisjZGVmaW5lIERPTlRfVVNFX01NWCAzCisKKy5nbG9ibCBpbmZsYXRlX2Zhc3RfdXNlX21teAorCisuZGF0YQorCisuYWxpZ24gNCwwCitpbmZsYXRlX2Zhc3RfdXNlX21teDogLyogaW50ZWdlciBmbGFnIGZvciBydW4gdGltZSBjb250cm9sIDE9Y2hlY2ssMj1tbXgsMz1ubyAqLworLmxvbmcgQ0hFQ0tfTU1YCisKKyNpZiBkZWZpbmVkKCBHQVNfRUxGICkKKy8qIGVsZiBpbmZvICovCisudHlwZSAgIGluZmxhdGVfZmFzdF91c2VfbW14LEBvYmplY3QKKy5zaXplICAgaW5mbGF0ZV9mYXN0X3VzZV9tbXgsNAorI2VuZGlmCisKKyNlbmRpZiAvKiBSVU5fVElNRV9NTVggKi8KKworI2lmIGRlZmluZWQoIEdBU19DT0ZGICkKKy8qIGNvZmYgaW5mbzogc2NsIDIgPSBleHRlcm4sIHR5cGUgMzIgPSBmdW5jdGlvbiAqLworLmRlZiBpbmZsYXRlX2Zhc3Q7IC5zY2wgMjsgLnR5cGUgMzI7IC5lbmRlZgorI2VuZGlmCisKKy50ZXh0CisKKy5hbGlnbiAzMiwweDkwCitpbmZsYXRlX2Zhc3Q6CisgICAgICAgIHB1c2hsICAgJWVkaQorICAgICAgICBwdXNobCAgICVlc2kKKyAgICAgICAgcHVzaGwgICAlZWJwCisgICAgICAgIHB1c2hsICAgJWVieAorICAgICAgICBwdXNoZiAgIC8qIHNhdmUgZWZsYWdzIChzdHJtX3NwLCBzdGF0ZV9zcCBhc3N1bWVzIHRoaXMgaXMgMzIgYml0cykgKi8KKyAgICAgICAgc3VibCAgICAkbG9jYWxfdmFyX3NpemUsICVlc3AKKyAgICAgICAgY2xkCisKKyNkZWZpbmUgc3RybV9yICAlZXNpCisjZGVmaW5lIHN0YXRlX3IgJWVkaQorCisgICAgICAgIG1vdmwgICAgc3RybV9zcCglZXNwKSwgc3RybV9yCisgICAgICAgIG1vdmwgICAgc3RhdGVfc3RybShzdHJtX3IpLCBzdGF0ZV9yCisKKyAgICAgICAgLyogaW4gPSBzdHJtLT5uZXh0X2luOworICAgICAgICAgKiBvdXQgPSBzdHJtLT5uZXh0X291dDsKKyAgICAgICAgICogbGFzdCA9IGluICsgc3RybS0+YXZhaWxfaW4gLSAxMTsKKyAgICAgICAgICogYmVnID0gb3V0IC0gKHN0YXJ0IC0gc3RybS0+YXZhaWxfb3V0KTsKKyAgICAgICAgICogZW5kID0gb3V0ICsgKHN0cm0tPmF2YWlsX291dCAtIDI1Nyk7CisgICAgICAgICAqLworICAgICAgICBtb3ZsICAgIGF2YWlsX2luX3N0cm0oc3RybV9yKSwgJWVkeAorICAgICAgICBtb3ZsICAgIG5leHRfaW5fc3RybShzdHJtX3IpLCAlZWF4CisKKyAgICAgICAgYWRkbCAgICAlZWF4LCAlZWR4ICAgICAgLyogYXZhaWxfaW4gKz0gbmV4dF9pbiAqLworICAgICAgICBzdWJsICAgICQxMSwgJWVkeCAgICAgICAvKiBhdmFpbF9pbiAtPSAxMSAqLworCisgICAgICAgIG1vdmwgICAgJWVheCwgaW4oJWVzcCkKKyAgICAgICAgbW92bCAgICAlZWR4LCBsYXN0KCVlc3ApCisKKyAgICAgICAgbW92bCAgICBzdGFydF9zcCglZXNwKSwgJWVicAorICAgICAgICBtb3ZsICAgIGF2YWlsX291dF9zdHJtKHN0cm1fciksICVlY3gKKyAgICAgICAgbW92bCAgICBuZXh0X291dF9zdHJtKHN0cm1fciksICVlYngKKworICAgICAgICBzdWJsICAgICVlY3gsICVlYnAgICAgICAvKiBzdGFydCAtPSBhdmFpbF9vdXQgKi8KKyAgICAgICAgbmVnbCAgICAlZWJwICAgICAgICAgICAgLyogc3RhcnQgPSAtc3RhcnQgKi8KKyAgICAgICAgYWRkbCAgICAlZWJ4LCAlZWJwICAgICAgLyogc3RhcnQgKz0gbmV4dF9vdXQgKi8KKworICAgICAgICBzdWJsICAgICQyNTcsICVlY3ggICAgICAvKiBhdmFpbF9vdXQgLT0gMjU3ICovCisgICAgICAgIGFkZGwgICAgJWVieCwgJWVjeCAgICAgIC8qIGF2YWlsX291dCArPSBvdXQgKi8KKworICAgICAgICBtb3ZsICAgICVlYngsIG91dCglZXNwKQorICAgICAgICBtb3ZsICAgICVlYnAsIGJlZyglZXNwKQorICAgICAgICBtb3ZsICAgICVlY3gsIGVuZCglZXNwKQorCisgICAgICAgIC8qIHdzaXplID0gc3RhdGUtPndzaXplOworICAgICAgICAgKiB3cml0ZSA9IHN0YXRlLT53cml0ZTsKKyAgICAgICAgICogd2luZG93ID0gc3RhdGUtPndpbmRvdzsKKyAgICAgICAgICogaG9sZCA9IHN0YXRlLT5ob2xkOworICAgICAgICAgKiBiaXRzID0gc3RhdGUtPmJpdHM7CisgICAgICAgICAqIGxjb2RlID0gc3RhdGUtPmxlbmNvZGU7CisgICAgICAgICAqIGRjb2RlID0gc3RhdGUtPmRpc3Rjb2RlOworICAgICAgICAgKiBsbWFzayA9ICggMSA8PCBzdGF0ZS0+bGVuYml0cyApIC0gMTsKKyAgICAgICAgICogZG1hc2sgPSAoIDEgPDwgc3RhdGUtPmRpc3RiaXRzICkgLSAxOworICAgICAgICAgKi8KKworICAgICAgICBtb3ZsICAgIGxlbmNvZGVfc3RhdGUoc3RhdGVfciksICVlYXgKKyAgICAgICAgbW92bCAgICBkaXN0Y29kZV9zdGF0ZShzdGF0ZV9yKSwgJWVjeAorCisgICAgICAgIG1vdmwgICAgJWVheCwgbGNvZGUoJWVzcCkKKyAgICAgICAgbW92bCAgICAlZWN4LCBkY29kZSglZXNwKQorCisgICAgICAgIG1vdmwgICAgJDEsICVlYXgKKyAgICAgICAgbW92bCAgICBsZW5iaXRzX3N0YXRlKHN0YXRlX3IpLCAlZWN4CisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIGRlY2wgICAgJWVheAorICAgICAgICBtb3ZsICAgICVlYXgsIGxtYXNrKCVlc3ApCisKKyAgICAgICAgbW92bCAgICAkMSwgJWVheAorICAgICAgICBtb3ZsICAgIGRpc3RiaXRzX3N0YXRlKHN0YXRlX3IpLCAlZWN4CisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIGRlY2wgICAgJWVheAorICAgICAgICBtb3ZsICAgICVlYXgsIGRtYXNrKCVlc3ApCisKKyAgICAgICAgbW92bCAgICB3c2l6ZV9zdGF0ZShzdGF0ZV9yKSwgJWVheAorICAgICAgICBtb3ZsICAgIHdyaXRlX3N0YXRlKHN0YXRlX3IpLCAlZWN4CisgICAgICAgIG1vdmwgICAgd2luZG93X3N0YXRlKHN0YXRlX3IpLCAlZWR4CisKKyAgICAgICAgbW92bCAgICAlZWF4LCB3c2l6ZSglZXNwKQorICAgICAgICBtb3ZsICAgICVlY3gsIHdyaXRlKCVlc3ApCisgICAgICAgIG1vdmwgICAgJWVkeCwgd2luZG93KCVlc3ApCisKKyAgICAgICAgbW92bCAgICBob2xkX3N0YXRlKHN0YXRlX3IpLCAlZWJwCisgICAgICAgIG1vdmwgICAgYml0c19zdGF0ZShzdGF0ZV9yKSwgJWVieAorCisjdW5kZWYgc3RybV9yCisjdW5kZWYgc3RhdGVfcgorCisjZGVmaW5lIGluX3IgICAgICAgJWVzaQorI2RlZmluZSBmcm9tX3IgICAgICVlc2kKKyNkZWZpbmUgb3V0X3IgICAgICAlZWRpCisKKyAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fcgorICAgICAgICBtb3ZsICAgIGxhc3QoJWVzcCksICVlY3gKKyAgICAgICAgY21wbCAgICBpbl9yLCAlZWN4CisgICAgICAgIGphICAgICAgLkxfYWxpZ25fbG9uZyAgICAgICAgICAgLyogaWYgaW4gPCBsYXN0ICovCisKKyAgICAgICAgYWRkbCAgICAkMTEsICVlY3ggICAgICAgICAgICAgICAvKiBlY3ggPSAmaW5bIGF2YWlsX2luIF0gKi8KKyAgICAgICAgc3VibCAgICBpbl9yLCAlZWN4ICAgICAgICAgICAgICAvKiBlY3ggPSBhdmFpbF9pbiAqLworICAgICAgICBtb3ZsICAgICQxMiwgJWVheAorICAgICAgICBzdWJsICAgICVlY3gsICVlYXggICAgICAgICAgICAgIC8qIGVheCA9IDEyIC0gYXZhaWxfaW4gKi8KKyAgICAgICAgbGVhbCAgICBidWYoJWVzcCksICVlZGkKKyAgICAgICAgcmVwICAgICBtb3ZzYiAgICAgICAgICAgICAgICAgICAvKiBtZW1jcHkoIGJ1ZiwgaW4sIGF2YWlsX2luICkgKi8KKyAgICAgICAgbW92bCAgICAlZWF4LCAlZWN4CisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheAorICAgICAgICByZXAgICAgIHN0b3NiICAgICAgICAgLyogbWVtc2V0KCAmYnVmWyBhdmFpbF9pbiBdLCAwLCAxMiAtIGF2YWlsX2luICkgKi8KKyAgICAgICAgbGVhbCAgICBidWYoJWVzcCksIGluX3IgICAgICAgICAvKiBpbiA9IGJ1ZiAqLworICAgICAgICBtb3ZsICAgIGluX3IsIGxhc3QoJWVzcCkgICAgICAgIC8qIGxhc3QgPSBpbiwgZG8ganVzdCBvbmUgaXRlcmF0aW9uICovCisgICAgICAgIGptcCAgICAgLkxfaXNfYWxpZ25lZAorCisgICAgICAgIC8qIGFsaWduIGluX3Igb24gbG9uZyBib3VuZGFyeSAqLworLkxfYWxpZ25fbG9uZzoKKyAgICAgICAgdGVzdGwgICAkMywgaW5fcgorICAgICAgICBqeiAgICAgIC5MX2lzX2FsaWduZWQKKyAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4CisgICAgICAgIG1vdmIgICAgKGluX3IpLCAlYWwKKyAgICAgICAgaW5jbCAgICBpbl9yCisgICAgICAgIG1vdmwgICAgJWVieCwgJWVjeAorICAgICAgICBhZGRsICAgICQ4LCAlZWJ4CisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIG9ybCAgICAgJWVheCwgJWVicAorICAgICAgICBqbXAgICAgIC5MX2FsaWduX2xvbmcKKworLkxfaXNfYWxpZ25lZDoKKyAgICAgICAgbW92bCAgICBvdXQoJWVzcCksIG91dF9yCisKKyNpZiBkZWZpbmVkKCBOT19NTVggKQorICAgICAgICBqbXAgICAgIC5MX2RvX2xvb3AKKyNlbmRpZgorCisjaWYgZGVmaW5lZCggVVNFX01NWCApCisgICAgICAgIGptcCAgICAgLkxfaW5pdF9tbXgKKyNlbmRpZgorCisvKioqIFJ1bnRpbWUgTU1YIGNoZWNrICoqKi8KKworI2lmIGRlZmluZWQoIFJVTl9USU1FX01NWCApCisuTF9jaGVja19tbXg6CisgICAgICAgIGNtcGwgICAgJERPX1VTRV9NTVgsIGluZmxhdGVfZmFzdF91c2VfbW14CisgICAgICAgIGplICAgICAgLkxfaW5pdF9tbXgKKyAgICAgICAgamEgICAgICAuTF9kb19sb29wIC8qID4gMiAqLworCisgICAgICAgIHB1c2hsICAgJWVheAorICAgICAgICBwdXNobCAgICVlYngKKyAgICAgICAgcHVzaGwgICAlZWN4CisgICAgICAgIHB1c2hsICAgJWVkeAorICAgICAgICBwdXNoZgorICAgICAgICBtb3ZsICAgICglZXNwKSwgJWVheCAgICAgIC8qIGNvcHkgZWZsYWdzIHRvIGVheCAqLworICAgICAgICB4b3JsICAgICQweDIwMDAwMCwgKCVlc3ApIC8qIHRyeSB0b2dnbGluZyBJRCBiaXQgb2YgZWZsYWdzIChiaXQgMjEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gc2VlIGlmIGNwdSBzdXBwb3J0cyBjcHVpZC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElEIGJpdCBtZXRob2Qgbm90IHN1cHBvcnRlZCBieSBOZXhHZW4gYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmlvcyBtYXkgbG9hZCBhIGNwdWlkIGluc3RydWN0aW9uIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNwdWlkIG1heSBiZSBkaXNhYmxlZCBvbiBDeXJpeCA1LTZ4ODYgKi8KKyAgICAgICAgcG9wZgorICAgICAgICBwdXNoZiAgIAorICAgICAgICBwb3BsICAgICVlZHggICAgICAgICAgICAgIC8qIGNvcHkgbmV3IGVmbGFncyB0byBlZHggKi8KKyAgICAgICAgeG9ybCAgICAlZWF4LCAlZWR4ICAgICAgICAvKiB0ZXN0IGlmIElEIGJpdCBpcyBmbGlwcGVkICovCisgICAgICAgIGp6ICAgICAgLkxfZG9udF91c2VfbW14ICAgLyogbm90IGZsaXBwZWQgaWYgemVybyAqLworICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKKyAgICAgICAgY3B1aWQKKyAgICAgICAgY21wbCAgICAkMHg3NTZlNjU0NywgJWVieCAvKiBjaGVjayBmb3IgR2VudWluZUludGVsIGluIGVieCxlY3gsZWR4ICovCisgICAgICAgIGpuZSAgICAgLkxfZG9udF91c2VfbW14CisgICAgICAgIGNtcGwgICAgJDB4NmM2NTc0NmUsICVlY3gKKyAgICAgICAgam5lICAgICAuTF9kb250X3VzZV9tbXgKKyAgICAgICAgY21wbCAgICAkMHg0OTY1NmU2OSwgJWVkeAorICAgICAgICBqbmUgICAgIC5MX2RvbnRfdXNlX21teAorICAgICAgICBtb3ZsICAgICQxLCAlZWF4CisgICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGNwdSBmZWF0dXJlcyAqLworICAgICAgICBzaHJsICAgICQ4LCAlZWF4CisgICAgICAgIGFuZGwgICAgJDE1LCAlZWF4CisgICAgICAgIGNtcGwgICAgJDYsICVlYXggICAgICAgICAgLyogY2hlY2sgZm9yIFBlbnRpdW0gZmFtaWx5LCBpcyAweGYgZm9yIFA0ICovCisgICAgICAgIGpuZSAgICAgLkxfZG9udF91c2VfbW14CisgICAgICAgIHRlc3RsICAgJDB4ODAwMDAwLCAlZWR4ICAgLyogdGVzdCBpZiBNTVggZmVhdHVyZSBpcyBzZXQgKGJpdCAyMykgKi8KKyAgICAgICAgam56ICAgICAuTF91c2VfbW14CisgICAgICAgIGptcCAgICAgLkxfZG9udF91c2VfbW14CisuTF91c2VfbW14OgorICAgICAgICBtb3ZsICAgICRET19VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAorICAgICAgICBqbXAgICAgIC5MX2NoZWNrX21teF9wb3AKKy5MX2RvbnRfdXNlX21teDoKKyAgICAgICAgbW92bCAgICAkRE9OVF9VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAorLkxfY2hlY2tfbW14X3BvcDoKKyAgICAgICAgcG9wbCAgICAlZWR4CisgICAgICAgIHBvcGwgICAgJWVjeAorICAgICAgICBwb3BsICAgICVlYngKKyAgICAgICAgcG9wbCAgICAlZWF4CisgICAgICAgIGptcCAgICAgLkxfY2hlY2tfbW14CisjZW5kaWYKKyAgICAgICAgCisKKy8qKiogTm9uLU1NWCBjb2RlICoqKi8KKworI2lmIGRlZmluZWQgKCBOT19NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQorCisjZGVmaW5lIGhvbGRfciAgICAgJWVicAorI2RlZmluZSBiaXRzX3IgICAgICVibAorI2RlZmluZSBiaXRzbG9uZ19yICVlYngKKworLmFsaWduIDMyLDB4OTAKKy5MX3doaWxlX3Rlc3Q6CisgICAgICAgIC8qIHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKQorICAgICAgICAgKi8KKyAgICAgICAgY21wbCAgICBvdXRfciwgZW5kKCVlc3ApCisgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcCAgICAgICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovCisKKyAgICAgICAgY21wbCAgICBpbl9yLCBsYXN0KCVlc3ApCisgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcAorCisuTF9kb19sb29wOgorICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0CisgICAgICAgICAqCisgICAgICAgICAqIGRvIHsgCisgICAgICAgICAqICAgaWYgKGJpdHMgPCAxNSkgeworICAgICAgICAgKiAgICAgaG9sZCB8PSAqKCh1bnNpZ25lZCBzaG9ydCAqKWluKSsrIDw8IGJpdHM7CisgICAgICAgICAqICAgICBiaXRzICs9IDE2CisgICAgICAgICAqICAgfQorICAgICAgICAgKiAgIHRoaXMgPSBsY29kZVtob2xkICYgbG1hc2tdCisgICAgICAgICAqLworICAgICAgICBjbXBiICAgICQxNSwgYml0c19yCisgICAgICAgIGphICAgICAgLkxfZ2V0X2xlbmd0aF9jb2RlICAgICAgLyogaWYgKDE1IDwgYml0cykgKi8KKworICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKKyAgICAgICAgbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworICAgICAgICBtb3ZiICAgIGJpdHNfciwgJWNsICAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisgICAgICAgIGFkZGIgICAgJDE2LCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworICAgICAgICBzaGxsICAgICVjbCwgJWVheAorICAgICAgICBvcmwgICAgICVlYXgsIGhvbGRfciAgICAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworCisuTF9nZXRfbGVuZ3RoX2NvZGU6CisgICAgICAgIG1vdmwgICAgbG1hc2soJWVzcCksICVlZHggICAgICAgLyogZWR4ID0gbG1hc2sgKi8KKyAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVjeCAgICAgICAvKiBlY3ggPSBsY29kZSAqLworICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVkeCAgICAgICAgICAgIC8qIGVkeCAmPSBob2xkICovCisgICAgICAgIG1vdmwgICAgKCVlY3gsJWVkeCw0KSwgJWVheCAgICAgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLworCisuTF9kb2xlbjoKKyAgICAgICAgLyogcmVnczogJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dAorICAgICAgICAgKgorICAgICAgICAgKiBkb2xlbjoKKyAgICAgICAgICogICAgYml0cyAtPSB0aGlzLmJpdHM7CisgICAgICAgICAqICAgIGhvbGQgPj49IHRoaXMuYml0cworICAgICAgICAgKi8KKyAgICAgICAgbW92YiAgICAlYWgsICVjbCAgICAgICAgICAgICAgICAvKiBjbCA9IHRoaXMuYml0cyAqLworICAgICAgICBzdWJiICAgICVhaCwgYml0c19yICAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCisgICAgICAgIHNocmwgICAgJWNsLCBob2xkX3IgICAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCisKKyAgICAgICAgLyogY2hlY2sgaWYgb3AgaXMgYSBsaXRlcmFsCisgICAgICAgICAqIGlmIChvcCA9PSAwKSB7CisgICAgICAgICAqICAgIFBVUChvdXQpID0gdGhpcy52YWw7CisgICAgICAgICAqICB9CisgICAgICAgICAqLworICAgICAgICB0ZXN0YiAgICVhbCwgJWFsCisgICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UgLyogaWYgKG9wICE9IDApIDQ1LjclICovCisKKyAgICAgICAgc2hybCAgICAkMTYsICVlYXggICAgICAgICAgICAgICAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLworICAgICAgICBzdG9zYgorICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QKKworLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6CisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBpbiwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBsZW4KKyAgICAgICAgICoKKyAgICAgICAgICogZWxzZSBpZiAob3AgJiAxNikgeworICAgICAgICAgKiAgIGxlbiA9IHRoaXMudmFsCisgICAgICAgICAqICAgb3AgJj0gMTUKKyAgICAgICAgICogICBpZiAob3ApIHsKKyAgICAgICAgICogICAgIGlmIChvcCA+IGJpdHMpIHsKKyAgICAgICAgICogICAgICAgaG9sZCB8PSAqKCh1bnNpZ25lZCBzaG9ydCAqKWluKSsrIDw8IGJpdHM7CisgICAgICAgICAqICAgICAgIGJpdHMgKz0gMTYKKyAgICAgICAgICogICAgIH0KKyAgICAgICAgICogICAgIGxlbiArPSBob2xkICYgbWFza1tvcF07CisgICAgICAgICAqICAgICBiaXRzIC09IG9wOworICAgICAgICAgKiAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAqICAgfQorICAgICAgICAgKi8KKyNkZWZpbmUgbGVuX3IgJWVkeAorICAgICAgICBtb3ZsICAgICVlYXgsIGxlbl9yICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMgKi8KKyAgICAgICAgc2hybCAgICAkMTYsIGxlbl9yICAgICAgICAgICAgICAvKiBsZW4gPSB0aGlzLnZhbCAqLworICAgICAgICBtb3ZiICAgICVhbCwgJWNsCisKKyAgICAgICAgdGVzdGIgICAkMTYsICVhbAorICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGggLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLworICAgICAgICBhbmRiICAgICQxNSwgJWNsICAgICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisgICAgICAgIGp6ICAgICAgLkxfc2F2ZV9sZW4gICAgICAgICAgICAgLyogaWYgKCFvcCkgKi8KKyAgICAgICAgY21wYiAgICAlY2wsIGJpdHNfcgorICAgICAgICBqYWUgICAgIC5MX2FkZF9iaXRzX3RvX2xlbiAgICAgIC8qIGlmIChvcCA8PSBiaXRzKSAqLworCisgICAgICAgIG1vdmIgICAgJWNsLCAlY2ggICAgICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8KKyAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4CisgICAgICAgIGxvZHN3ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KKyAgICAgICAgbW92YiAgICBiaXRzX3IsICVjbCAgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLworICAgICAgICBhZGRiICAgICQxNiwgYml0c19yICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKKyAgICAgICAgb3JsICAgICAlZWF4LCBob2xkX3IgICAgICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KKyAgICAgICAgbW92YiAgICAlY2gsICVjbCAgICAgICAgICAgICAgICAvKiBtb3ZlIG9wIGJhY2sgdG8gZWN4ICovCisKKy5MX2FkZF9iaXRzX3RvX2xlbjoKKyAgICAgICAgbW92bCAgICAkMSwgJWVheAorICAgICAgICBzaGxsICAgICVjbCwgJWVheAorICAgICAgICBkZWNsICAgICVlYXgKKyAgICAgICAgc3ViYiAgICAlY2wsIGJpdHNfcgorICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVheCAgICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisgICAgICAgIHNocmwgICAgJWNsLCBob2xkX3IKKyAgICAgICAgYWRkbCAgICAlZWF4LCBsZW5fciAgICAgICAgICAgICAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovCisKKy5MX3NhdmVfbGVuOgorICAgICAgICBtb3ZsICAgIGxlbl9yLCBsZW4oJWVzcCkgICAgICAgIC8qIHNhdmUgbGVuICovCisjdW5kZWYgIGxlbl9yCisKKy5MX2RlY29kZV9kaXN0YW5jZToKKyAgICAgICAgLyogcmVnczogJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKKyAgICAgICAgICoKKyAgICAgICAgICogICBpZiAoYml0cyA8IDE1KSB7CisgICAgICAgICAqICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsKKyAgICAgICAgICogICAgIGJpdHMgKz0gMTYKKyAgICAgICAgICogICB9CisgICAgICAgICAqICAgdGhpcyA9IGRjb2RlW2hvbGQgJiBkbWFza107CisgICAgICAgICAqIGRvZGlzdDoKKyAgICAgICAgICogICBiaXRzIC09IHRoaXMuYml0czsKKyAgICAgICAgICogICBob2xkID4+PSB0aGlzLmJpdHM7CisgICAgICAgICAqICAgb3AgPSB0aGlzLm9wOworICAgICAgICAgKi8KKworICAgICAgICBjbXBiICAgICQxNSwgYml0c19yCisgICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RhbmNlX2NvZGUgICAgLyogaWYgKDE1IDwgYml0cykgKi8KKworICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKKyAgICAgICAgbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworICAgICAgICBtb3ZiICAgIGJpdHNfciwgJWNsICAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisgICAgICAgIGFkZGIgICAgJDE2LCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworICAgICAgICBzaGxsICAgICVjbCwgJWVheAorICAgICAgICBvcmwgICAgICVlYXgsIGhvbGRfciAgICAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworCisuTF9nZXRfZGlzdGFuY2VfY29kZToKKyAgICAgICAgbW92bCAgICBkbWFzayglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBkbWFzayAqLworICAgICAgICBtb3ZsICAgIGRjb2RlKCVlc3ApLCAlZWN4ICAgICAgIC8qIGVjeCA9IGRjb2RlICovCisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWR4ICAgICAgICAgICAgLyogZWR4ICY9IGhvbGQgKi8KKyAgICAgICAgbW92bCAgICAoJWVjeCwlZWR4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBkY29kZVtob2xkICYgZG1hc2tdICovCisKKyNkZWZpbmUgZGlzdF9yICVlZHgKKy5MX2RvZGlzdDoKKyAgICAgICAgbW92bCAgICAlZWF4LCBkaXN0X3IgICAgICAgICAgICAvKiBkaXN0ID0gdGhpcyAqLworICAgICAgICBzaHJsICAgICQxNiwgZGlzdF9yICAgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzLnZhbCAqLworICAgICAgICBtb3ZiICAgICVhaCwgJWNsCisgICAgICAgIHN1YmIgICAgJWFoLCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKyAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfciAgICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KKworICAgICAgICAvKiBpZiAob3AgJiAxNikgeworICAgICAgICAgKiAgIGRpc3QgPSB0aGlzLnZhbAorICAgICAgICAgKiAgIG9wICY9IDE1CisgICAgICAgICAqICAgaWYgKG9wID4gYml0cykgeworICAgICAgICAgKiAgICAgaG9sZCB8PSAqKCh1bnNpZ25lZCBzaG9ydCAqKWluKSsrIDw8IGJpdHM7CisgICAgICAgICAqICAgICBiaXRzICs9IDE2CisgICAgICAgICAqICAgfQorICAgICAgICAgKiAgIGRpc3QgKz0gaG9sZCAmIG1hc2tbb3BdOworICAgICAgICAgKiAgIGJpdHMgLT0gb3A7CisgICAgICAgICAqICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAqLworICAgICAgICBtb3ZiICAgICVhbCwgJWNsICAgICAgICAgICAgICAgIC8qIGNsID0gdGhpcy5vcCAqLworCisgICAgICAgIHRlc3RiICAgJDE2LCAlYWwgICAgICAgICAgICAgICAgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLworICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0CisgICAgICAgIGFuZGIgICAgJDE1LCAlY2wgICAgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KKyAgICAgICAganogICAgICAuTF9jaGVja19kaXN0X29uZQorICAgICAgICBjbXBiICAgICVjbCwgYml0c19yCisgICAgICAgIGphZSAgICAgLkxfYWRkX2JpdHNfdG9fZGlzdCAgICAgLyogaWYgKG9wIDw9IGJpdHMpIDk3LjYlICovCisKKyAgICAgICAgbW92YiAgICAlY2wsICVjaCAgICAgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLworICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKKyAgICAgICAgbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworICAgICAgICBtb3ZiICAgIGJpdHNfciwgJWNsICAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisgICAgICAgIGFkZGIgICAgJDE2LCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworICAgICAgICBzaGxsICAgICVjbCwgJWVheAorICAgICAgICBvcmwgICAgICVlYXgsIGhvbGRfciAgICAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworICAgICAgICBtb3ZiICAgICVjaCwgJWNsICAgICAgICAgICAgICAgIC8qIG1vdmUgb3AgYmFjayB0byBlY3ggKi8KKworLkxfYWRkX2JpdHNfdG9fZGlzdDoKKyAgICAgICAgbW92bCAgICAkMSwgJWVheAorICAgICAgICBzaGxsICAgICVjbCwgJWVheAorICAgICAgICBkZWNsICAgICVlYXggICAgICAgICAgICAgICAgICAgIC8qICgxIDw8IG9wKSAtIDEgKi8KKyAgICAgICAgc3ViYiAgICAlY2wsIGJpdHNfcgorICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVheCAgICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisgICAgICAgIHNocmwgICAgJWNsLCBob2xkX3IKKyAgICAgICAgYWRkbCAgICAlZWF4LCBkaXN0X3IgICAgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkgKi8KKyAgICAgICAgam1wICAgICAuTF9jaGVja193aW5kb3cKKworLkxfY2hlY2tfd2luZG93OgorICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0CisgICAgICAgICAqICAgICAgICVlY3ggPSBuYnl0ZXMKKyAgICAgICAgICoKKyAgICAgICAgICogbmJ5dGVzID0gb3V0IC0gYmVnOworICAgICAgICAgKiBpZiAoZGlzdCA8PSBuYnl0ZXMpIHsKKyAgICAgICAgICogICBmcm9tID0gb3V0IC0gZGlzdDsKKyAgICAgICAgICogICBkbyB7CisgICAgICAgICAqICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICogICB9IHdoaWxlICgtLWxlbiA+IDApIHsKKyAgICAgICAgICogfQorICAgICAgICAgKi8KKworICAgICAgICBtb3ZsICAgIGluX3IsIGluKCVlc3ApICAgICAgICAgIC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovCisgICAgICAgIG1vdmwgICAgb3V0X3IsICVlYXgKKyAgICAgICAgc3VibCAgICBiZWcoJWVzcCksICVlYXggICAgICAgICAvKiBuYnl0ZXMgPSBvdXQgLSBiZWcgKi8KKworICAgICAgICBjbXBsICAgIGRpc3RfciwgJWVheAorICAgICAgICBqYiAgICAgIC5MX2NsaXBfd2luZG93ICAgICAgICAgIC8qIGlmIChkaXN0ID4gbmJ5dGVzKSA0LjIlICovCisKKyAgICAgICAgbW92bCAgICBsZW4oJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKworICAgICAgICBzdWJsICAgICQzLCAlZWN4CisgICAgICAgIG1vdmIgICAgKGZyb21fciksICVhbAorICAgICAgICBtb3ZiICAgICVhbCwgKG91dF9yKQorICAgICAgICBtb3ZiICAgIDEoZnJvbV9yKSwgJWFsCisgICAgICAgIG1vdmIgICAgMihmcm9tX3IpLCAlZGwKKyAgICAgICAgYWRkbCAgICAkMywgZnJvbV9yCisgICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQorICAgICAgICBtb3ZiICAgICVkbCwgMihvdXRfcikKKyAgICAgICAgYWRkbCAgICAkMywgb3V0X3IKKyAgICAgICAgcmVwICAgICBtb3ZzYgorCisgICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QKKworLmFsaWduIDE2LDB4OTAKKy5MX2NoZWNrX2Rpc3Rfb25lOgorICAgICAgICBjbXBsICAgICQxLCBkaXN0X3IKKyAgICAgICAgam5lICAgICAuTF9jaGVja193aW5kb3cKKyAgICAgICAgY21wbCAgICBvdXRfciwgYmVnKCVlc3ApCisgICAgICAgIGplICAgICAgLkxfY2hlY2tfd2luZG93CisKKyAgICAgICAgZGVjbCAgICBvdXRfcgorICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgJWVjeAorICAgICAgICBtb3ZiICAgIChvdXRfciksICVhbAorICAgICAgICBzdWJsICAgICQzLCAlZWN4CisKKyAgICAgICAgbW92YiAgICAlYWwsIDEob3V0X3IpCisgICAgICAgIG1vdmIgICAgJWFsLCAyKG91dF9yKQorICAgICAgICBtb3ZiICAgICVhbCwgMyhvdXRfcikKKyAgICAgICAgYWRkbCAgICAkNCwgb3V0X3IKKyAgICAgICAgcmVwICAgICBzdG9zYgorCisgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdAorCisuYWxpZ24gMTYsMHg5MAorLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDoKKyAgICAgICAgLyogZWxzZSBpZiAoKG9wICYgNjQpID09IDApIHsKKyAgICAgICAgICogICB0aGlzID0gbGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmIG1hc2tbb3BdKV07CisgICAgICAgICAqIH0KKyAgICAgICAgICovCisgICAgICAgIHRlc3RiICAgJDY0LCAlYWwKKyAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworICAgICAgICBtb3ZsICAgICQxLCAlZWF4CisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIGRlY2wgICAgJWVheAorICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVheCAgICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisgICAgICAgIGFkZGwgICAgJWVkeCwgJWVheCAgICAgICAgICAgICAgLyogZWF4ICs9IHRoaXMudmFsICovCisgICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlZHggICAgICAgLyogZWR4ID0gbGNvZGUgKi8KKyAgICAgICAgbW92bCAgICAoJWVkeCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVt2YWwgKyAoaG9sZCZtYXNrW29wXSldICovCisgICAgICAgIGptcCAgICAgLkxfZG9sZW4KKworLmFsaWduIDE2LDB4OTAKKy5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0OgorICAgICAgICAvKiBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeworICAgICAgICAgKiAgIHRoaXMgPSBkY29kZVt0aGlzLnZhbCArIChob2xkICYgbWFza1tvcF0pXTsKKyAgICAgICAgICogfQorICAgICAgICAgKi8KKyAgICAgICAgdGVzdGIgICAkNjQsICVhbAorICAgICAgICBqbnogICAgIC5MX2ludmFsaWRfZGlzdGFuY2VfY29kZSAgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLworCisgICAgICAgIG1vdmwgICAgJDEsICVlYXgKKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKKyAgICAgICAgZGVjbCAgICAlZWF4CisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWF4ICAgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyAgICAgICAgYWRkbCAgICAlZWR4LCAlZWF4ICAgICAgICAgICAgICAvKiBlYXggKz0gdGhpcy52YWwgKi8KKyAgICAgICAgbW92bCAgICBkY29kZSglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBkY29kZSAqLworICAgICAgICBtb3ZsICAgICglZWR4LCVlYXgsNCksICVlYXggICAgIC8qIGVheCA9IGRjb2RlW3ZhbCArIChob2xkJm1hc2tbb3BdKV0gKi8KKyAgICAgICAgam1wICAgICAuTF9kb2Rpc3QKKworLmFsaWduIDE2LDB4OTAKKy5MX2NsaXBfd2luZG93OgorICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0CisgICAgICAgICAqICAgICAgICVlY3ggPSBuYnl0ZXMKKyAgICAgICAgICoKKyAgICAgICAgICogZWxzZSB7CisgICAgICAgICAqICAgaWYgKGRpc3QgPiB3c2l6ZSkgeworICAgICAgICAgKiAgICAgaW52YWxpZCBkaXN0YW5jZQorICAgICAgICAgKiAgIH0KKyAgICAgICAgICogICBmcm9tID0gd2luZG93OworICAgICAgICAgKiAgIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXM7CisgICAgICAgICAqICAgaWYgKHdyaXRlID09IDApIHsKKyAgICAgICAgICogICAgIGZyb20gKz0gd3NpemUgLSBuYnl0ZXM7CisgICAgICAgICAqLworI2RlZmluZSBuYnl0ZXNfciAlZWN4CisgICAgICAgIG1vdmwgICAgJWVheCwgbmJ5dGVzX3IKKyAgICAgICAgbW92bCAgICB3c2l6ZSglZXNwKSwgJWVheCAgICAgICAvKiBwcmVwYXJlIGZvciBkaXN0IGNvbXBhcmUgKi8KKyAgICAgICAgbmVnbCAgICBuYnl0ZXNfciAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovCisgICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLworCisgICAgICAgIGNtcGwgICAgZGlzdF9yLCAlZWF4CisgICAgICAgIGpiICAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyIC8qIGlmIChkaXN0ID4gd3NpemUpICovCisKKyAgICAgICAgYWRkbCAgICBkaXN0X3IsIG5ieXRlc19yICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCisgICAgICAgIGNtcGwgICAgJDAsIHdyaXRlKCVlc3ApCisgICAgICAgIGpuZSAgICAgLkxfd3JhcF9hcm91bmRfd2luZG93ICAgLyogaWYgKHdyaXRlICE9IDApICovCisKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgJWVheAorICAgICAgICBhZGRsICAgICVlYXgsIGZyb21fciAgICAgICAgICAgIC8qIGZyb20gKz0gd3NpemUgLSBuYnl0ZXMgKi8KKworICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0CisgICAgICAgICAqICAgICAgICVlY3ggPSBuYnl0ZXMsICVlYXggPSBsZW4KKyAgICAgICAgICoKKyAgICAgICAgICogICAgIGlmIChuYnl0ZXMgPCBsZW4pIHsKKyAgICAgICAgICogICAgICAgbGVuIC09IG5ieXRlczsKKyAgICAgICAgICogICAgICAgZG8geworICAgICAgICAgKiAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgKiAgICAgICB9IHdoaWxlICgtLW5ieXRlcyk7CisgICAgICAgICAqICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OworICAgICAgICAgKiAgICAgfQorICAgICAgICAgKiAgIH0KKyAgICAgICAgICovCisjZGVmaW5lIGxlbl9yICVlYXgKKyAgICAgICAgbW92bCAgICBsZW4oJWVzcCksIGxlbl9yCisgICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCisgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisgICAgICAgIHJlcCAgICAgbW92c2IKKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF9kb19jb3B5MQorCisgICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCisgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisgICAgICAgIHJlcCAgICAgbW92c2IKKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF9kb19jb3B5MQorCisuTF93cmFwX2Fyb3VuZF93aW5kb3c6CisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKKyAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcywgJWVheCA9IHdyaXRlLCAlZWF4ID0gbGVuCisgICAgICAgICAqCisgICAgICAgICAqICAgZWxzZSBpZiAod3JpdGUgPCBuYnl0ZXMpIHsKKyAgICAgICAgICogICAgIGZyb20gKz0gd3NpemUgKyB3cml0ZSAtIG5ieXRlczsKKyAgICAgICAgICogICAgIG5ieXRlcyAtPSB3cml0ZTsKKyAgICAgICAgICogICAgIGlmIChuYnl0ZXMgPCBsZW4pIHsKKyAgICAgICAgICogICAgICAgbGVuIC09IG5ieXRlczsKKyAgICAgICAgICogICAgICAgZG8geworICAgICAgICAgKiAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgKiAgICAgICB9IHdoaWxlICgtLW5ieXRlcyk7CisgICAgICAgICAqICAgICAgIGZyb20gPSB3aW5kb3c7CisgICAgICAgICAqICAgICAgIG5ieXRlcyA9IHdyaXRlOworICAgICAgICAgKiAgICAgICBpZiAobmJ5dGVzIDwgbGVuKSB7CisgICAgICAgICAqICAgICAgICAgbGVuIC09IG5ieXRlczsKKyAgICAgICAgICogICAgICAgICBkbyB7CisgICAgICAgICAqICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICogICAgICAgICB9IHdoaWxlKC0tbmJ5dGVzKTsKKyAgICAgICAgICogICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsKKyAgICAgICAgICogICAgICAgfQorICAgICAgICAgKiAgICAgfQorICAgICAgICAgKiAgIH0KKyAgICAgICAgICovCisjZGVmaW5lIHdyaXRlX3IgJWVheAorICAgICAgICBtb3ZsICAgIHdyaXRlKCVlc3ApLCB3cml0ZV9yCisgICAgICAgIGNtcGwgICAgd3JpdGVfciwgbmJ5dGVzX3IKKyAgICAgICAgamJlICAgICAuTF9jb250aWd1b3VzX2luX3dpbmRvdyAvKiBpZiAod3JpdGUgPj0gbmJ5dGVzKSAqLworCisgICAgICAgIGFkZGwgICAgd3NpemUoJWVzcCksIGZyb21fcgorICAgICAgICBhZGRsICAgIHdyaXRlX3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBmcm9tX3IgICAgICAgIC8qIGZyb20gKz0gd3NpemUgKyB3cml0ZSAtIG5ieXRlcyAqLworICAgICAgICBzdWJsICAgIHdyaXRlX3IsIG5ieXRlc19yICAgICAgIC8qIG5ieXRlcyAtPSB3cml0ZSAqLworI3VuZGVmIHdyaXRlX3IKKworICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgbGVuX3IKKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKKyAgICAgICAgamJlICAgICAuTF9kb19jb3B5MSAgICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyAgICAgICAgcmVwICAgICBtb3ZzYgorICAgICAgICBtb3ZsICAgIHdpbmRvdyglZXNwKSwgZnJvbV9yICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KKyAgICAgICAgbW92bCAgICB3cml0ZSglZXNwKSwgbmJ5dGVzX3IgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLworICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisgICAgICAgIGptcCAgICAgLkxfZG9fY29weTEKKworLkxfY29udGlndW91c19pbl93aW5kb3c6CisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKKyAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcywgJWVheCA9IHdyaXRlLCAlZWF4ID0gbGVuCisgICAgICAgICAqCisgICAgICAgICAqICAgZWxzZSB7CisgICAgICAgICAqICAgICBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzOworICAgICAgICAgKiAgICAgaWYgKG5ieXRlcyA8IGxlbikgeworICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOworICAgICAgICAgKiAgICAgICBkbyB7CisgICAgICAgICAqICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsKKyAgICAgICAgICogICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7CisgICAgICAgICAqICAgICB9CisgICAgICAgICAqICAgfQorICAgICAgICAgKi8KKyNkZWZpbmUgd3JpdGVfciAlZWF4CisgICAgICAgIGFkZGwgICAgd3JpdGVfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGZyb21fciAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworI3VuZGVmIHdyaXRlX3IKKworICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgbGVuX3IKKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKKyAgICAgICAgamJlICAgICAuTF9kb19jb3B5MSAgICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyAgICAgICAgcmVwICAgICBtb3ZzYgorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCisuTF9kb19jb3B5MToKKyAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlc2kgPSBpbiwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQKKyAgICAgICAgICogICAgICAgJWVheCA9IGxlbgorICAgICAgICAgKgorICAgICAgICAgKiAgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgICogICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAqICAgICAgIGxlbi0tOworICAgICAgICAgKiAgICAgfQorICAgICAgICAgKiAgIH0KKyAgICAgICAgICogfSB3aGlsZSAoaW4gPCBsYXN0ICYmIG91dCA8IGVuZCk7CisgICAgICAgICAqLworI3VuZGVmIG5ieXRlc19yCisjZGVmaW5lIGluX3IgJWVzaQorICAgICAgICBtb3ZsICAgIGxlbl9yLCAlZWN4CisgICAgICAgIHJlcCAgICAgbW92c2IKKworICAgICAgICBtb3ZsICAgIGluKCVlc3ApLCBpbl9yICAgICAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KKyAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0CisKKyN1bmRlZiBsZW5fcgorI3VuZGVmIGRpc3RfcgorCisjZW5kaWYgLyogTk9fTU1YIHx8IFJVTl9USU1FX01NWCAqLworCisKKy8qKiogTU1YIGNvZGUgKioqLworCisjaWYgZGVmaW5lZCggVVNFX01NWCApIHx8IGRlZmluZWQoIFJVTl9USU1FX01NWCApCisKKy5hbGlnbiAzMiwweDkwCisuTF9pbml0X21teDoKKyAgICAgICAgZW1tcworCisjdW5kZWYgIGJpdHNfcgorI3VuZGVmICBiaXRzbG9uZ19yCisjZGVmaW5lIGJpdHNsb25nX3IgJWVicAorI2RlZmluZSBob2xkX21tICAgICVtbTAKKyAgICAgICAgbW92ZCAgICAlZWJwLCBob2xkX21tCisgICAgICAgIG1vdmwgICAgJWVieCwgYml0c2xvbmdfcgorCisjZGVmaW5lIHVzZWRfbW0gICAlbW0xCisjZGVmaW5lIGRtYXNrMl9tbSAlbW0yCisjZGVmaW5lIGxtYXNrMl9tbSAlbW0zCisjZGVmaW5lIGxtYXNrX21tICAlbW00CisjZGVmaW5lIGRtYXNrX21tICAlbW01CisjZGVmaW5lIHRtcF9tbSAgICAlbW02CisKKyAgICAgICAgbW92ZCAgICBsbWFzayglZXNwKSwgbG1hc2tfbW0gCisgICAgICAgIG1vdnEgICAgbG1hc2tfbW0sIGxtYXNrMl9tbQorICAgICAgICBtb3ZkICAgIGRtYXNrKCVlc3ApLCBkbWFza19tbQorICAgICAgICBtb3ZxICAgIGRtYXNrX21tLCBkbWFzazJfbW0KKyAgICAgICAgcHhvciAgICB1c2VkX21tLCB1c2VkX21tCisgICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlYnggICAgICAgLyogZWJ4ID0gbGNvZGUgKi8KKyAgICAgICAgam1wICAgICAuTF9kb19sb29wX21teAorCisuYWxpZ24gMzIsMHg5MAorLkxfd2hpbGVfdGVzdF9tbXg6CisgICAgICAgIC8qIHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKQorICAgICAgICAgKi8KKyAgICAgICAgY21wbCAgICBvdXRfciwgZW5kKCVlc3ApCisgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcCAgICAgICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovCisKKyAgICAgICAgY21wbCAgICBpbl9yLCBsYXN0KCVlc3ApCisgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcAorCisuTF9kb19sb29wX21teDoKKyAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8KKworICAgICAgICBjbXBsICAgICQzMiwgYml0c2xvbmdfcgorICAgICAgICBqYSAgICAgIC5MX2dldF9sZW5ndGhfY29kZV9tbXggIC8qIGlmICgzMiA8IGJpdHMpICovCisKKyAgICAgICAgbW92ZCAgICBiaXRzbG9uZ19yLCB0bXBfbW0KKyAgICAgICAgbW92ZCAgICAoaW5fciksICVtbTcKKyAgICAgICAgYWRkbCAgICAkNCwgaW5fcgorICAgICAgICBwc2xscSAgIHRtcF9tbSwgJW1tNworICAgICAgICBhZGRsICAgICQzMiwgYml0c2xvbmdfcgorICAgICAgICBwb3IgICAgICVtbTcsIGhvbGRfbW0gICAgICAgICAgIC8qIGhvbGRfbW0gfD0gKigodWludCAqKWluKSsrIDw8IGJpdHMgKi8KKworLkxfZ2V0X2xlbmd0aF9jb2RlX21teDoKKyAgICAgICAgcGFuZCAgICBob2xkX21tLCBsbWFza19tbQorICAgICAgICBtb3ZkICAgIGxtYXNrX21tLCAlZWF4CisgICAgICAgIG1vdnEgICAgbG1hc2syX21tLCBsbWFza19tbQorICAgICAgICBtb3ZsICAgICglZWJ4LCVlYXgsNCksICVlYXggICAgIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8KKworLkxfZG9sZW5fbW14OgorICAgICAgICBtb3Z6YmwgICVhaCwgJWVjeCAgICAgICAgICAgICAgIC8qIGVjeCA9IHRoaXMuYml0cyAqLworICAgICAgICBtb3ZkICAgICVlY3gsIHVzZWRfbW0KKyAgICAgICAgc3VibCAgICAlZWN4LCBiaXRzbG9uZ19yICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworCisgICAgICAgIHRlc3RiICAgJWFsLCAlYWwKKyAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZV9tbXggLyogaWYgKG9wICE9IDApIDQ1LjclICovCisKKyAgICAgICAgc2hybCAgICAkMTYsICVlYXggICAgICAgICAgICAgICAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLworICAgICAgICBzdG9zYgorICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RfbW14CisKKy5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlX21teDoKKyNkZWZpbmUgbGVuX3IgICVlZHgKKyAgICAgICAgbW92bCAgICAlZWF4LCBsZW5fciAgICAgICAgICAgICAvKiBsZW4gPSB0aGlzICovCisgICAgICAgIHNocmwgICAgJDE2LCBsZW5fciAgICAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8KKworICAgICAgICB0ZXN0YiAgICQxNiwgJWFsCisgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aF9tbXggLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLworICAgICAgICBhbmRsICAgICQxNSwgJWVheCAgICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisgICAgICAgIGp6ICAgICAgLkxfZGVjb2RlX2Rpc3RhbmNlX21teCAgLyogaWYgKCFvcCkgKi8KKworICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgICVlYXgsIHVzZWRfbW0KKyAgICAgICAgbW92ZCAgICBob2xkX21tLCAlZWN4CisgICAgICAgIHN1YmwgICAgJWVheCwgYml0c2xvbmdfcgorICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3gKKyAgICAgICAgYWRkbCAgICAlZWN4LCBsZW5fciAgICAgICAgICAgICAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovCisKKy5MX2RlY29kZV9kaXN0YW5jZV9tbXg6CisgICAgICAgIHBzcmxxICAgdXNlZF9tbSwgaG9sZF9tbSAgICAgICAgLyogaG9sZF9tbSA+Pj0gbGFzdCBiaXQgbGVuZ3RoICovCisKKyAgICAgICAgY21wbCAgICAkMzIsIGJpdHNsb25nX3IKKyAgICAgICAgamEgICAgICAuTF9nZXRfZGlzdF9jb2RlX21teCAgICAvKiBpZiAoMzIgPCBiaXRzKSAqLworCisgICAgICAgIG1vdmQgICAgYml0c2xvbmdfciwgdG1wX21tCisgICAgICAgIG1vdmQgICAgKGluX3IpLCAlbW03CisgICAgICAgIGFkZGwgICAgJDQsIGluX3IKKyAgICAgICAgcHNsbHEgICB0bXBfbW0sICVtbTcKKyAgICAgICAgYWRkbCAgICAkMzIsIGJpdHNsb25nX3IKKyAgICAgICAgcG9yICAgICAlbW03LCBob2xkX21tICAgICAgICAgICAvKiBob2xkX21tIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCisKKy5MX2dldF9kaXN0X2NvZGVfbW14OgorICAgICAgICBtb3ZsICAgIGRjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIGVieCA9IGRjb2RlICovCisgICAgICAgIHBhbmQgICAgaG9sZF9tbSwgZG1hc2tfbW0KKyAgICAgICAgbW92ZCAgICBkbWFza19tbSwgJWVheAorICAgICAgICBtb3ZxICAgIGRtYXNrMl9tbSwgZG1hc2tfbW0KKyAgICAgICAgbW92bCAgICAoJWVieCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBkY29kZVtob2xkICYgbG1hc2tdICovCisKKy5MX2RvZGlzdF9tbXg6CisjZGVmaW5lIGRpc3RfciAlZWJ4CisgICAgICAgIG1vdnpibCAgJWFoLCAlZWN4ICAgICAgICAgICAgICAgLyogZWN4ID0gdGhpcy5iaXRzICovCisgICAgICAgIG1vdmwgICAgJWVheCwgZGlzdF9yCisgICAgICAgIHNocmwgICAgJDE2LCBkaXN0X3IgICAgICAgICAgICAgLyogZGlzdCAgPSB0aGlzLnZhbCAqLworICAgICAgICBzdWJsICAgICVlY3gsIGJpdHNsb25nX3IgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCisgICAgICAgIG1vdmQgICAgJWVjeCwgdXNlZF9tbQorCisgICAgICAgIHRlc3RiICAgJDE2LCAlYWwgICAgICAgICAgICAgICAgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLworICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0X21teAorICAgICAgICBhbmRsICAgICQxNSwgJWVheCAgICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisgICAgICAgIGp6ICAgICAgLkxfY2hlY2tfZGlzdF9vbmVfbW14CisKKy5MX2FkZF9iaXRzX3RvX2Rpc3RfbW14OgorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgICVlYXgsIHVzZWRfbW0gICAgICAgICAgIC8qIHNhdmUgYml0IGxlbmd0aCBvZiBjdXJyZW50IG9wICovCisgICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeCAgICAgICAgICAgLyogZ2V0IHRoZSBuZXh0IGJpdHMgb24gaW5wdXQgc3RyZWFtICovCisgICAgICAgIHN1YmwgICAgJWVheCwgYml0c2xvbmdfciAgICAgICAgLyogYml0cyAtPSBvcCBiaXRzICovCisgICAgICAgIGFuZGwgICAgLkxfbWFzaygsJWVheCw0KSwgJWVjeCAgLyogZWN4ICAgPSBob2xkICYgbWFza1tvcF0gKi8KKyAgICAgICAgYWRkbCAgICAlZWN4LCBkaXN0X3IgICAgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiBtYXNrW29wXSAqLworCisuTF9jaGVja193aW5kb3dfbW14OgorICAgICAgICBtb3ZsICAgIGluX3IsIGluKCVlc3ApICAgICAgICAgIC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovCisgICAgICAgIG1vdmwgICAgb3V0X3IsICVlYXgKKyAgICAgICAgc3VibCAgICBiZWcoJWVzcCksICVlYXggICAgICAgICAvKiBuYnl0ZXMgPSBvdXQgLSBiZWcgKi8KKworICAgICAgICBjbXBsICAgIGRpc3RfciwgJWVheAorICAgICAgICBqYiAgICAgIC5MX2NsaXBfd2luZG93X21teCAgICAgIC8qIGlmIChkaXN0ID4gbmJ5dGVzKSA0LjIlICovCisKKyAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeAorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCisgICAgICAgIHN1YmwgICAgJDMsICVlY3gKKyAgICAgICAgbW92YiAgICAoZnJvbV9yKSwgJWFsCisgICAgICAgIG1vdmIgICAgJWFsLCAob3V0X3IpCisgICAgICAgIG1vdmIgICAgMShmcm9tX3IpLCAlYWwKKyAgICAgICAgbW92YiAgICAyKGZyb21fciksICVkbAorICAgICAgICBhZGRsICAgICQzLCBmcm9tX3IKKyAgICAgICAgbW92YiAgICAlYWwsIDEob3V0X3IpCisgICAgICAgIG1vdmIgICAgJWRsLCAyKG91dF9yKQorICAgICAgICBhZGRsICAgICQzLCBvdXRfcgorICAgICAgICByZXAgICAgIG1vdnNiCisKKyAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisgICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlYnggICAgICAgLyogbW92ZSBsY29kZSBiYWNrIHRvICVlYngsIHRvc3MgZGlzdCAqLworICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RfbW14CisKKy5hbGlnbiAxNiwweDkwCisuTF9jaGVja19kaXN0X29uZV9tbXg6CisgICAgICAgIGNtcGwgICAgJDEsIGRpc3RfcgorICAgICAgICBqbmUgICAgIC5MX2NoZWNrX3dpbmRvd19tbXgKKyAgICAgICAgY21wbCAgICBvdXRfciwgYmVnKCVlc3ApCisgICAgICAgIGplICAgICAgLkxfY2hlY2tfd2luZG93X21teAorCisgICAgICAgIGRlY2wgICAgb3V0X3IKKyAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeAorICAgICAgICBtb3ZiICAgIChvdXRfciksICVhbAorICAgICAgICBzdWJsICAgICQzLCAlZWN4CisKKyAgICAgICAgbW92YiAgICAlYWwsIDEob3V0X3IpCisgICAgICAgIG1vdmIgICAgJWFsLCAyKG91dF9yKQorICAgICAgICBtb3ZiICAgICVhbCwgMyhvdXRfcikKKyAgICAgICAgYWRkbCAgICAkNCwgb3V0X3IKKyAgICAgICAgcmVwICAgICBzdG9zYgorCisgICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlYnggICAgICAgLyogbW92ZSBsY29kZSBiYWNrIHRvICVlYngsIHRvc3MgZGlzdCAqLworICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RfbW14CisKKy5hbGlnbiAxNiwweDkwCisuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoX21teDogCisgICAgICAgIHRlc3RiICAgJDY0LCAlYWwKKyAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworICAgICAgICBhbmRsICAgICQxNSwgJWVheAorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3gKKyAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4CisgICAgICAgIGFkZGwgICAgbGVuX3IsICVlY3gKKyAgICAgICAgbW92bCAgICAoJWVieCwlZWN4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisgICAgICAgIGptcCAgICAgLkxfZG9sZW5fbW14CisKKy5hbGlnbiAxNiwweDkwCisuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdF9tbXg6CisgICAgICAgIHRlc3RiICAgJDY0LCAlYWwKKyAgICAgICAgam56ICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworICAgICAgICBhbmRsICAgICQxNSwgJWVheAorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3gKKyAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4CisgICAgICAgIG1vdmwgICAgZGNvZGUoJWVzcCksICVlYXggICAgICAgLyogZWN4ID0gZGNvZGUgKi8KKyAgICAgICAgYWRkbCAgICBkaXN0X3IsICVlY3gKKyAgICAgICAgbW92bCAgICAoJWVheCwlZWN4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisgICAgICAgIGptcCAgICAgLkxfZG9kaXN0X21teAorCisuYWxpZ24gMTYsMHg5MAorLkxfY2xpcF93aW5kb3dfbW14OgorI2RlZmluZSBuYnl0ZXNfciAlZWN4CisgICAgICAgIG1vdmwgICAgJWVheCwgbmJ5dGVzX3IKKyAgICAgICAgbW92bCAgICB3c2l6ZSglZXNwKSwgJWVheCAgICAgICAvKiBwcmVwYXJlIGZvciBkaXN0IGNvbXBhcmUgKi8KKyAgICAgICAgbmVnbCAgICBuYnl0ZXNfciAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovCisgICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLworCisgICAgICAgIGNtcGwgICAgZGlzdF9yLCAlZWF4CisgICAgICAgIGpiICAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyIC8qIGlmIChkaXN0ID4gd3NpemUpICovCisKKyAgICAgICAgYWRkbCAgICBkaXN0X3IsIG5ieXRlc19yICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCisgICAgICAgIGNtcGwgICAgJDAsIHdyaXRlKCVlc3ApCisgICAgICAgIGpuZSAgICAgLkxfd3JhcF9hcm91bmRfd2luZG93X21teCAvKiBpZiAod3JpdGUgIT0gMCkgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCAlZWF4CisgICAgICAgIGFkZGwgICAgJWVheCwgZnJvbV9yICAgICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLworCisgICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCisgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFfbW14ICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisgICAgICAgIHJlcCAgICAgbW92c2IKKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF9kb19jb3B5MV9tbXgKKworICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisgICAgICAgIGptcCAgICAgLkxfZG9fY29weTFfbW14CisKKy5MX3dyYXBfYXJvdW5kX3dpbmRvd19tbXg6CisjZGVmaW5lIHdyaXRlX3IgJWVheAorICAgICAgICBtb3ZsICAgIHdyaXRlKCVlc3ApLCB3cml0ZV9yCisgICAgICAgIGNtcGwgICAgd3JpdGVfciwgbmJ5dGVzX3IKKyAgICAgICAgamJlICAgICAuTF9jb250aWd1b3VzX2luX3dpbmRvd19tbXggLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KKworICAgICAgICBhZGRsICAgIHdzaXplKCVlc3ApLCBmcm9tX3IKKyAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBuYnl0ZXMgKi8KKyAgICAgICAgc3VibCAgICB3cml0ZV9yLCBuYnl0ZXNfciAgICAgICAvKiBuYnl0ZXMgLT0gd3JpdGUgKi8KKyN1bmRlZiB3cml0ZV9yCisKKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKKyAgICAgICAgamJlICAgICAuTF9kb19jb3B5MV9tbXggICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyAgICAgICAgcmVwICAgICBtb3ZzYgorICAgICAgICBtb3ZsICAgIHdpbmRvdyglZXNwKSwgZnJvbV9yICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KKyAgICAgICAgbW92bCAgICB3cml0ZSglZXNwKSwgbmJ5dGVzX3IgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLworICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisgICAgICAgIGptcCAgICAgLkxfZG9fY29weTFfbW14CisKKy5MX2NvbnRpZ3VvdXNfaW5fd2luZG93X21teDoKKyNkZWZpbmUgd3JpdGVfciAlZWF4CisgICAgICAgIGFkZGwgICAgd3JpdGVfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGZyb21fciAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworI3VuZGVmIHdyaXRlX3IKKworICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisKKy5MX2RvX2NvcHkxX21teDoKKyN1bmRlZiBuYnl0ZXNfcgorI2RlZmluZSBpbl9yICVlc2kKKyAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeAorICAgICAgICByZXAgICAgIG1vdnNiCisKKyAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisgICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlYnggICAgICAgLyogbW92ZSBsY29kZSBiYWNrIHRvICVlYngsIHRvc3MgZGlzdCAqLworICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RfbW14CisKKyN1bmRlZiBob2xkX3IKKyN1bmRlZiBiaXRzbG9uZ19yCisKKyNlbmRpZiAvKiBVU0VfTU1YIHx8IFJVTl9USU1FX01NWCAqLworCisKKy8qKiogVVNFX01NWCwgTk9fTU1YLCBhbmQgUlVOVElNRV9NTVggZnJvbSBoZXJlIG9uICoqKi8KKworLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlOgorICAgICAgICAvKiBlbHNlIHsKKyAgICAgICAgICogICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICogICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICogfQorICAgICAgICAgKi8KKyAgICAgICAgbW92bCAgICAkLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlX21zZywgJWVjeAorICAgICAgICBtb3ZsICAgICRJTkZMQVRFX01PREVfQkFELCAlZWR4CisgICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQorCisuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6CisgICAgICAgIC8qIGVsc2UgaWYgKG9wICYgMzIpIHsKKyAgICAgICAgICogICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAqICAgYnJlYWs7CisgICAgICAgICAqIH0KKyAgICAgICAgICovCisgICAgICAgIHRlc3RiICAgJDMyLCAlYWwKKyAgICAgICAganogICAgICAuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGUgIC8qIGlmICgob3AgJiAzMikgPT0gMCkgKi8KKworICAgICAgICBtb3ZsICAgICQwLCAlZWN4CisgICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9UWVBFLCAlZWR4CisgICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQorCisuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6CisgICAgICAgIC8qIGVsc2UgeworICAgICAgICAgKiAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgKiAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgKiB9CisgICAgICAgICAqLworICAgICAgICBtb3ZsICAgICQuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnLCAlZWN4CisgICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9CQUQsICVlZHgKKyAgICAgICAgam1wICAgICAuTF91cGRhdGVfc3RyZWFtX3N0YXRlCisKKy5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoKKyAgICAgICAgLyogc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICogc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAqLworICAgICAgICBtb3ZsICAgIGluKCVlc3ApLCBpbl9yICAgICAgICAgIC8qIGZyb21fciBoYXMgaW4ncyByZWcsIHB1dCBpbiBiYWNrICovCisgICAgICAgIG1vdmwgICAgJC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2csICVlY3gKKyAgICAgICAgbW92bCAgICAkSU5GTEFURV9NT0RFX0JBRCwgJWVkeAorICAgICAgICBqbXAgICAgIC5MX3VwZGF0ZV9zdHJlYW1fc3RhdGUKKworLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZToKKyAgICAgICAgLyogc2V0IHN0cm0tPm1zZyA9ICVlY3gsIHN0cm0tPnN0YXRlLT5tb2RlID0gJWVkeCAqLworICAgICAgICBtb3ZsICAgIHN0cm1fc3AoJWVzcCksICVlYXgKKyAgICAgICAgdGVzdGwgICAlZWN4LCAlZWN4ICAgICAgICAgICAgICAvKiBpZiAobXNnICE9IE5VTEwpICovCisgICAgICAgIGp6ICAgICAgLkxfc2tpcF9tc2cKKyAgICAgICAgbW92bCAgICAlZWN4LCBtc2dfc3RybSglZWF4KSAgICAvKiBzdHJtLT5tc2cgPSBtc2cgKi8KKy5MX3NraXBfbXNnOgorICAgICAgICBtb3ZsICAgIHN0YXRlX3N0cm0oJWVheCksICVlYXggIC8qIHN0YXRlID0gc3RybS0+c3RhdGUgKi8KKyAgICAgICAgbW92bCAgICAlZWR4LCBtb2RlX3N0YXRlKCVlYXgpICAvKiBzdGF0ZS0+bW9kZSA9IGVkeCAoQkFEIHwgVFlQRSkgKi8KKyAgICAgICAgam1wICAgICAuTF9icmVha19sb29wCisKKy5hbGlnbiAzMiwweDkwCisuTF9icmVha19sb29wOgorCisvKgorICogUmVnczoKKyAqCisgKiBiaXRzID0gJWVicCB3aGVuIG1teCwgYW5kIGluICVlYnggd2hlbiBub24tbW14CisgKiBob2xkID0gJWhvbGRfbW0gd2hlbiBtbXgsIGFuZCBpbiAlZWJwIHdoZW4gbm9uLW1teAorICogaW4gICA9ICVlc2kKKyAqIG91dCAgPSAlZWRpCisgKi8KKworI2lmIGRlZmluZWQoIFVTRV9NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQorCisjaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKKworICAgICAgICBjbXBsICAgICRET19VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAorICAgICAgICBqbmUgICAgIC5MX3VwZGF0ZV9uZXh0X2luCisKKyNlbmRpZiAvKiBSVU5fVElNRV9NTVggKi8KKworICAgICAgICBtb3ZsICAgICVlYnAsICVlYngKKworLkxfdXBkYXRlX25leHRfaW46CisKKyNlbmRpZgorCisjZGVmaW5lIHN0cm1fciAgJWVheAorI2RlZmluZSBzdGF0ZV9yICVlZHgKKworICAgICAgICAvKiBsZW4gPSBiaXRzID4+IDM7CisgICAgICAgICAqIGluIC09IGxlbjsKKyAgICAgICAgICogYml0cyAtPSBsZW4gPDwgMzsKKyAgICAgICAgICogaG9sZCAmPSAoMVUgPDwgYml0cykgLSAxOworICAgICAgICAgKiBzdGF0ZS0+aG9sZCA9IGhvbGQ7CisgICAgICAgICAqIHN0YXRlLT5iaXRzID0gYml0czsKKyAgICAgICAgICogc3RybS0+bmV4dF9pbiA9IGluOworICAgICAgICAgKiBzdHJtLT5uZXh0X291dCA9IG91dDsKKyAgICAgICAgICovCisgICAgICAgIG1vdmwgICAgc3RybV9zcCglZXNwKSwgc3RybV9yCisgICAgICAgIG1vdmwgICAgJWVieCwgJWVjeAorICAgICAgICBtb3ZsICAgIHN0YXRlX3N0cm0oc3RybV9yKSwgc3RhdGVfcgorICAgICAgICBzaHJsICAgICQzLCAlZWN4CisgICAgICAgIHN1YmwgICAgJWVjeCwgaW5fcgorICAgICAgICBzaGxsICAgICQzLCAlZWN4CisgICAgICAgIHN1YmwgICAgJWVjeCwgJWVieAorICAgICAgICBtb3ZsICAgIG91dF9yLCBuZXh0X291dF9zdHJtKHN0cm1fcikKKyAgICAgICAgbW92bCAgICAlZWJ4LCBiaXRzX3N0YXRlKHN0YXRlX3IpCisgICAgICAgIG1vdmwgICAgJWVieCwgJWVjeAorCisgICAgICAgIGxlYWwgICAgYnVmKCVlc3ApLCAlZWJ4CisgICAgICAgIGNtcGwgICAgJWVieCwgbGFzdCglZXNwKQorICAgICAgICBqbmUgICAgIC5MX2J1Zl9ub3RfdXNlZCAgICAgICAgIC8qIGlmIGJ1ZiAhPSBsYXN0ICovCisKKyAgICAgICAgc3VibCAgICAlZWJ4LCBpbl9yICAgICAgICAgICAgICAvKiBpbiAtPSBidWYgKi8KKyAgICAgICAgbW92bCAgICBuZXh0X2luX3N0cm0oc3RybV9yKSwgJWVieAorICAgICAgICBtb3ZsICAgICVlYngsIGxhc3QoJWVzcCkgICAgICAgIC8qIGxhc3QgPSBzdHJtLT5uZXh0X2luICovCisgICAgICAgIGFkZGwgICAgJWVieCwgaW5fciAgICAgICAgICAgICAgLyogaW4gKz0gc3RybS0+bmV4dF9pbiAqLworICAgICAgICBtb3ZsICAgIGF2YWlsX2luX3N0cm0oc3RybV9yKSwgJWVieAorICAgICAgICBzdWJsICAgICQxMSwgJWVieAorICAgICAgICBhZGRsICAgICVlYngsIGxhc3QoJWVzcCkgICAgLyogbGFzdCA9ICZzdHJtLT5uZXh0X2luWyBhdmFpbF9pbiAtIDExIF0gKi8KKworLkxfYnVmX25vdF91c2VkOgorICAgICAgICBtb3ZsICAgIGluX3IsIG5leHRfaW5fc3RybShzdHJtX3IpCisKKyAgICAgICAgbW92bCAgICAkMSwgJWVieAorICAgICAgICBzaGxsICAgICVjbCwgJWVieAorICAgICAgICBkZWNsICAgICVlYngKKworI2lmIGRlZmluZWQoIFVTRV9NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQorCisjaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKKworICAgICAgICBjbXBsICAgICRET19VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAorICAgICAgICBqbmUgICAgIC5MX3VwZGF0ZV9ob2xkCisKKyNlbmRpZiAvKiBSVU5fVElNRV9NTVggKi8KKworICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlYnAKKworICAgICAgICBlbW1zCisKKy5MX3VwZGF0ZV9ob2xkOgorCisjZW5kaWYgLyogVVNFX01NWCB8fCBSVU5fVElNRV9NTVggKi8KKworICAgICAgICBhbmRsICAgICVlYngsICVlYnAKKyAgICAgICAgbW92bCAgICAlZWJwLCBob2xkX3N0YXRlKHN0YXRlX3IpCisKKyNkZWZpbmUgbGFzdF9yICVlYngKKworICAgICAgICAvKiBzdHJtLT5hdmFpbF9pbiA9IGluIDwgbGFzdCA/IDExICsgKGxhc3QgLSBpbikgOiAxMSAtIChpbiAtIGxhc3QpICovCisgICAgICAgIG1vdmwgICAgbGFzdCglZXNwKSwgbGFzdF9yCisgICAgICAgIGNtcGwgICAgaW5fciwgbGFzdF9yCisgICAgICAgIGpiZSAgICAgLkxfbGFzdF9pc19zbWFsbGVyICAgICAvKiBpZiAoaW4gPj0gbGFzdCkgKi8KKworICAgICAgICBzdWJsICAgIGluX3IsIGxhc3RfciAgICAgICAgICAgLyogbGFzdCAtPSBpbiAqLworICAgICAgICBhZGRsICAgICQxMSwgbGFzdF9yICAgICAgICAgICAgLyogbGFzdCArPSAxMSAqLworICAgICAgICBtb3ZsICAgIGxhc3RfciwgYXZhaWxfaW5fc3RybShzdHJtX3IpCisgICAgICAgIGptcCAgICAgLkxfZml4dXBfb3V0CisuTF9sYXN0X2lzX3NtYWxsZXI6CisgICAgICAgIHN1YmwgICAgbGFzdF9yLCBpbl9yICAgICAgICAgICAvKiBpbiAtPSBsYXN0ICovCisgICAgICAgIG5lZ2wgICAgaW5fciAgICAgICAgICAgICAgICAgICAvKiBpbiA9IC1pbiAqLworICAgICAgICBhZGRsICAgICQxMSwgaW5fciAgICAgICAgICAgICAgLyogaW4gKz0gMTEgKi8KKyAgICAgICAgbW92bCAgICBpbl9yLCBhdmFpbF9pbl9zdHJtKHN0cm1fcikKKworI3VuZGVmIGxhc3RfcgorI2RlZmluZSBlbmRfciAlZWJ4CisKKy5MX2ZpeHVwX291dDoKKyAgICAgICAgLyogc3RybS0+YXZhaWxfb3V0ID0gb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIG91dCkgOiAyNTcgLSAob3V0IC0gZW5kKSovCisgICAgICAgIG1vdmwgICAgZW5kKCVlc3ApLCBlbmRfcgorICAgICAgICBjbXBsICAgIG91dF9yLCBlbmRfcgorICAgICAgICBqYmUgICAgIC5MX2VuZF9pc19zbWFsbGVyICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovCisKKyAgICAgICAgc3VibCAgICBvdXRfciwgZW5kX3IgICAgICAgICAgIC8qIGVuZCAtPSBvdXQgKi8KKyAgICAgICAgYWRkbCAgICAkMjU3LCBlbmRfciAgICAgICAgICAgIC8qIGVuZCArPSAyNTcgKi8KKyAgICAgICAgbW92bCAgICBlbmRfciwgYXZhaWxfb3V0X3N0cm0oc3RybV9yKQorICAgICAgICBqbXAgICAgIC5MX2RvbmUKKy5MX2VuZF9pc19zbWFsbGVyOgorICAgICAgICBzdWJsICAgIGVuZF9yLCBvdXRfciAgICAgICAgICAgLyogb3V0IC09IGVuZCAqLworICAgICAgICBuZWdsICAgIG91dF9yICAgICAgICAgICAgICAgICAgLyogb3V0ID0gLW91dCAqLworICAgICAgICBhZGRsICAgICQyNTcsIG91dF9yICAgICAgICAgICAgLyogb3V0ICs9IDI1NyAqLworICAgICAgICBtb3ZsICAgIG91dF9yLCBhdmFpbF9vdXRfc3RybShzdHJtX3IpCisKKyN1bmRlZiBlbmRfcgorI3VuZGVmIHN0cm1fcgorI3VuZGVmIHN0YXRlX3IKKworLkxfZG9uZToKKyAgICAgICAgYWRkbCAgICAkbG9jYWxfdmFyX3NpemUsICVlc3AKKyAgICAgICAgcG9wZgorICAgICAgICBwb3BsICAgICVlYngKKyAgICAgICAgcG9wbCAgICAlZWJwCisgICAgICAgIHBvcGwgICAgJWVzaQorICAgICAgICBwb3BsICAgICVlZGkKKyAgICAgICAgcmV0CisKKyNpZiBkZWZpbmVkKCBHQVNfRUxGICkKKy8qIGVsZiBpbmZvICovCisudHlwZSBpbmZsYXRlX2Zhc3QsQGZ1bmN0aW9uCisuc2l6ZSBpbmZsYXRlX2Zhc3QsLi1pbmZsYXRlX2Zhc3QKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL0NoYW5nZUxvZ1VuemlwIGIvY29udHJpYi9taW5pemlwL0NoYW5nZUxvZ1VuemlwCmluZGV4IDk5ODdjNTQuLjE4MzE2ZmMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbWluaXppcC9DaGFuZ2VMb2dVbnppcAorKysgYi9jb250cmliL21pbml6aXAvQ2hhbmdlTG9nVW56aXAKQEAgLTEsMyArMSwxMiBAQAorQ2hhbmdlIGluIDAuMjE6ICgxMCBNYXIgMDMpCistIGJ1ZyBmaXhlcworCitDaGFuZ2UgaW4gMC4xNzogKDI3IEphbiAwMikKKy0gYnVnIGZpeGVzCisKK0NoYW5nZSBpbiAwLjE2OiAoMTkgSmFuIDAyKQorLSBTdXBwb3J0IG9mIGlvYXBpIGZvciB2aXJ0dWFsaXplIHppcCBmaWxlIGFjY2VzcworCiBDaGFuZ2UgaW4gMC4xNTogKDE5IE1hciA5OCkKIC0gZml4IG1lbW9yeSBsZWFrIGluIG1pbml6aXAuYwogCmRpZmYgLS1naXQgYS9jb250cmliL21pbml6aXAvTWFrZWZpbGUgYi9jb250cmliL21pbml6aXAvTWFrZWZpbGUKaW5kZXggYTFkZmMxNi4uODRlYWFkMiAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL01ha2VmaWxlCisrKyBiL2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZQpAQCAtMSw4ICsxLDggQEAKIENDPWNjCiBDRkxBR1M9LU8gLUkuLi8uLgogCi1VTlpfT0JKUyA9IG1pbml1bnoubyB1bnppcC5vIC4uLy4uL2xpYnouYQotWklQX09CSlMgPSBtaW5pemlwLm8gemlwLm8gICAuLi8uLi9saWJ6LmEKK1VOWl9PQkpTID0gbWluaXVuei5vIHVuemlwLm8gaW9hcGkubyAuLi8uLi9saWJ6LmEKK1pJUF9PQkpTID0gbWluaXppcC5vIHppcC5vICAgaW9hcGkubyAuLi8uLi9saWJ6LmEKIAogLmMubzoKIAkkKENDKSAtYyAkKENGTEFHUykgJCouYwpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL2NyeXB0LmggYi9jb250cmliL21pbml6aXAvY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWJjNjI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9taW5pemlwL2NyeXB0LmgKQEAgLTAsMCArMSwxMDQgQEAKKworI2RlZmluZSBDUkMzMihjLCBiKSAoKCoocGNyY18zMl90YWIrKCgoaW50KShjKSBeIChiKSkgJiAweGZmKSkpIF4gKChjKSA+PiA4KSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXR1cm4gdGhlIG5leHQgYnl0ZSBpbiB0aGUgcHNldWRvLXJhbmRvbSBzZXF1ZW5jZQorICovCitzdGF0aWMgaW50IGRlY3J5cHRfYnl0ZSh1bnNpZ25lZCBsb25nKiBwa2V5cywgY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWIpCit7CisgICAgdW5zaWduZWQgdGVtcDsgIC8qIFBPVEVOVElBTCBCVUc6ICB0ZW1wKih0ZW1wXjEpIG1heSBvdmVyZmxvdyBpbiBhbgorICAgICAgICAgICAgICAgICAgICAgKiB1bnByZWRpY3RhYmxlIG1hbm5lciBvbiAxNi1iaXQgc3lzdGVtczsgbm90IGEgcHJvYmxlbQorICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGFueSBrbm93biBjb21waWxlciBzbyBmYXIsIHRob3VnaCAqLworCisgICAgdGVtcCA9ICgodW5zaWduZWQpKCoocGtleXMrMikpICYgMHhmZmZmKSB8IDI7CisgICAgcmV0dXJuIChpbnQpKCgodGVtcCAqICh0ZW1wIF4gMSkpID4+IDgpICYgMHhmZik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVXBkYXRlIHRoZSBlbmNyeXB0aW9uIGtleXMgd2l0aCB0aGUgbmV4dCBieXRlIG9mIHBsYWluIHRleHQKKyAqLworc3RhdGljIGludCB1cGRhdGVfa2V5cyh1bnNpZ25lZCBsb25nKiBwa2V5cyxjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYixpbnQgYykKK3sKKyAgICAoKihwa2V5cyswKSkgPSBDUkMzMigoKihwa2V5cyswKSksIGMpOworICAgICgqKHBrZXlzKzEpKSArPSAoKihwa2V5cyswKSkgJiAweGZmOworICAgICgqKHBrZXlzKzEpKSA9ICgqKHBrZXlzKzEpKSAqIDEzNDc3NTgxM0wgKyAxOworICAgIHsKKyAgICAgIHJlZ2lzdGVyIGludCBrZXlzaGlmdCA9IChpbnQpKCgqKHBrZXlzKzEpKSA+PiAyNCk7CisgICAgICAoKihwa2V5cysyKSkgPSBDUkMzMigoKihwa2V5cysyKSksIGtleXNoaWZ0KTsKKyAgICB9CisgICAgcmV0dXJuIGM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbml0aWFsaXplIHRoZSBlbmNyeXB0aW9uIGtleXMgYW5kIHRoZSByYW5kb20gaGVhZGVyIGFjY29yZGluZyB0bworICogdGhlIGdpdmVuIHBhc3N3b3JkLgorICovCitzdGF0aWMgdm9pZCBpbml0X2tleXMoY29uc3QgY2hhciogcGFzc3dkLHVuc2lnbmVkIGxvbmcqIHBrZXlzLGNvbnN0IHVuc2lnbmVkIGxvbmcqIHBjcmNfMzJfdGFiKQoreworICAgICoocGtleXMrMCkgPSAzMDU0MTk4OTZMOworICAgICoocGtleXMrMSkgPSA1OTE3NTEwNDlMOworICAgICoocGtleXMrMikgPSA4NzgwODIxOTJMOworICAgIHdoaWxlICgqcGFzc3dkICE9ICdcMCcpIHsKKyAgICAgICAgdXBkYXRlX2tleXMocGtleXMscGNyY18zMl90YWIsKGludCkqcGFzc3dkKTsKKyAgICAgICAgcGFzc3dkKys7CisgICAgfQorfQorCisjZGVmaW5lIHpkZWNvZGUocGtleXMscGNyY18zMl90YWIsYykgXAorICAgICh1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYixjIF49IGRlY3J5cHRfYnl0ZShwa2V5cyxwY3JjXzMyX3RhYikpKQorCisjZGVmaW5lIHplbmNvZGUocGtleXMscGNyY18zMl90YWIsYyx0KSBcCisgICAgKHQ9ZGVjcnlwdF9ieXRlKHBrZXlzLHBjcmNfMzJfdGFiKSwgdXBkYXRlX2tleXMocGtleXMscGNyY18zMl90YWIsYyksIHReKGMpKQorCisjaWZkZWYgSU5DTFVERUNSWVBUSU5HQ09ERV9JRkNSWVBUQUxMT1dFRAorCisjZGVmaW5lIFJBTkRfSEVBRF9MRU4gIDEyCisgICAvKiAibGFzdCByZXNvcnQiIHNvdXJjZSBmb3Igc2Vjb25kIHBhcnQgb2YgY3J5cHQgc2VlZCBwYXR0ZXJuICovCisjICBpZm5kZWYgWkNSX1NFRUQyCisjICAgIGRlZmluZSBaQ1JfU0VFRDIgKHVuc2lnbmVkIGxvbmcpMzE0MTU5MjY1NEwgICAgIC8qIHVzZSBQSSBhcyBkZWZhdWx0IHBhdHRlcm4gKi8KKyMgIGVuZGlmCisKK3N0YXRpYyBpbnQgY3J5cHRoZWFkKHBhc3N3ZCwgYnVmLCBidWZTaXplLCBwa2V5cywgcGNyY18zMl90YWIsIGNyY0ZvckNyeXB0aW5nKQorICAgIGNvbnN0IGNoYXIgKnBhc3N3ZDsgICAgICAgICAvKiBwYXNzd29yZCBzdHJpbmcgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpidWY7ICAgICAgICAgLyogd2hlcmUgdG8gd3JpdGUgaGVhZGVyICovCisgICAgaW50IGJ1ZlNpemU7CisgICAgdW5zaWduZWQgbG9uZyogcGtleXM7CisgICAgY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWI7CisgICAgdW5zaWduZWQgbG9uZyBjcmNGb3JDcnlwdGluZzsKK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIHJhbmRvbSBoZWFkZXIgKi8KKyAgICBpbnQgdDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSAqLworICAgIGludCBjOyAgICAgICAgICAgICAgICAgICAgICAgLyogcmFuZG9tIGJ5dGUgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGhlYWRlcltSQU5EX0hFQURfTEVOLTJdOyAvKiByYW5kb20gaGVhZGVyICovCisgICAgc3RhdGljIHVuc2lnbmVkIGNhbGxzID0gMDsgICAvKiBlbnN1cmUgZGlmZmVyZW50IHJhbmRvbSBoZWFkZXIgZWFjaCB0aW1lICovCisKKyAgICBpZiAoYnVmU2l6ZTxSQU5EX0hFQURfTEVOKQorICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBGaXJzdCBnZW5lcmF0ZSBSQU5EX0hFQURfTEVOLTIgcmFuZG9tIGJ5dGVzLiBXZSBlbmNyeXB0IHRoZQorICAgICAqIG91dHB1dCBvZiByYW5kKCkgdG8gZ2V0IGxlc3MgcHJlZGljdGFiaWxpdHksIHNpbmNlIHJhbmQoKSBpcworICAgICAqIG9mdGVuIHBvb3JseSBpbXBsZW1lbnRlZC4KKyAgICAgKi8KKyAgICBpZiAoKytjYWxscyA9PSAxKQorICAgIHsKKyAgICAgICAgc3JhbmQoKHVuc2lnbmVkKSh0aW1lKE5VTEwpIF4gWkNSX1NFRUQyKSk7CisgICAgfQorICAgIGluaXRfa2V5cyhwYXNzd2QsIHBrZXlzLCBwY3JjXzMyX3RhYik7CisgICAgZm9yIChuID0gMDsgbiA8IFJBTkRfSEVBRF9MRU4tMjsgbisrKQorICAgIHsKKyAgICAgICAgYyA9IChyYW5kKCkgPj4gNykgJiAweGZmOworICAgICAgICBoZWFkZXJbbl0gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgYywgdCk7CisgICAgfQorICAgIC8qIEVuY3J5cHQgcmFuZG9tIGhlYWRlciAobGFzdCB0d28gYnl0ZXMgaXMgaGlnaCB3b3JkIG9mIGNyYykgKi8KKyAgICBpbml0X2tleXMocGFzc3dkLCBwa2V5cywgcGNyY18zMl90YWIpOworICAgIGZvciAobiA9IDA7IG4gPCBSQU5EX0hFQURfTEVOLTI7IG4rKykKKyAgICB7CisgICAgICAgIGJ1ZltuXSA9ICh1bnNpZ25lZCBjaGFyKXplbmNvZGUocGtleXMsIHBjcmNfMzJfdGFiLCBoZWFkZXJbbl0sIHQpOworICAgIH0KKyAgICBidWZbbisrXSA9IHplbmNvZGUocGtleXMsIHBjcmNfMzJfdGFiLCAoaW50KShjcmNGb3JDcnlwdGluZyA+PiAxNikgJiAweGZmLCB0KTsKKyAgICBidWZbbisrXSA9IHplbmNvZGUocGtleXMsIHBjcmNfMzJfdGFiLCAoaW50KShjcmNGb3JDcnlwdGluZyA+PiAyNCkgJiAweGZmLCB0KTsKKyAgICByZXR1cm4gbjsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb250cmliL21pbml6aXAvaW9hcGkuYyBiL2NvbnRyaWIvbWluaXppcC9pb2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNWQ1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL21pbml6aXAvaW9hcGkuYwpAQCAtMCwwICsxLDE3NyBAQAorLyogaW9hcGkuYyAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwCisgICBmaWxlcyB1c2luZyB6bGliICsgemlwIG9yIHVuemlwIEFQSQorCisgICBWZXJzaW9uIDAuMjEsIE1hcmNoIDEwdGgsIDIwMDMKKworICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDMgR2lsbGVzIFZvbGxhbnQKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiemxpYi5oIgorI2luY2x1ZGUgImlvYXBpLmgiCisKKworCisvKiBJJ3ZlIGZvdW5kIGFuIG9sZCBVbml4IChhIFN1bk9TIDQuMS4zX1UxKSB3aXRob3V0IGFsbCBTRUVLXyogZGVmaW5lZC4uLi4gKi8KKworI2lmbmRlZiBTRUVLX0NVUgorI2RlZmluZSBTRUVLX0NVUiAgICAxCisjZW5kaWYKKworI2lmbmRlZiBTRUVLX0VORAorI2RlZmluZSBTRUVLX0VORCAgICAyCisjZW5kaWYKKworI2lmbmRlZiBTRUVLX1NFVAorI2RlZmluZSBTRUVLX1NFVCAgICAwCisjZW5kaWYKKwordm9pZHBmIFpDQUxMQkFDSyBmb3Blbl9maWxlX2Z1bmMgT0YoKAorICAgdm9pZHBmIG9wYXF1ZSwKKyAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgaW50IG1vZGUpKTsKKwordUxvbmcgWkNBTExCQUNLIGZyZWFkX2ZpbGVfZnVuYyBPRigoCisgICB2b2lkcGYgb3BhcXVlLAorICAgdm9pZHBmIHN0cmVhbSwKKyAgIHZvaWQqIGJ1ZiwKKyAgIHVMb25nIHNpemUpKTsKKwordUxvbmcgWkNBTExCQUNLIGZ3cml0ZV9maWxlX2Z1bmMgT0YoKAorICAgdm9pZHBmIG9wYXF1ZSwKKyAgIHZvaWRwZiBzdHJlYW0sCisgICBjb25zdCB2b2lkKiBidWYsCisgICB1TG9uZyBzaXplKSk7CisKK2xvbmcgWkNBTExCQUNLIGZ0ZWxsX2ZpbGVfZnVuYyBPRigoCisgICB2b2lkcGYgb3BhcXVlLAorICAgdm9pZHBmIHN0cmVhbSkpOworCitsb25nIFpDQUxMQkFDSyBmc2Vla19maWxlX2Z1bmMgT0YoKAorICAgdm9pZHBmIG9wYXF1ZSwKKyAgIHZvaWRwZiBzdHJlYW0sCisgICB1TG9uZyBvZmZzZXQsCisgICBpbnQgb3JpZ2luKSk7CisKK2ludCBaQ0FMTEJBQ0sgZmNsb3NlX2ZpbGVfZnVuYyBPRigoCisgICB2b2lkcGYgb3BhcXVlLAorICAgdm9pZHBmIHN0cmVhbSkpOworCitpbnQgWkNBTExCQUNLIGZlcnJvcl9maWxlX2Z1bmMgT0YoKAorICAgdm9pZHBmIG9wYXF1ZSwKKyAgIHZvaWRwZiBzdHJlYW0pKTsKKworCit2b2lkcGYgWkNBTExCQUNLIGZvcGVuX2ZpbGVfZnVuYyAob3BhcXVlLCBmaWxlbmFtZSwgbW9kZSkKKyAgIHZvaWRwZiBvcGFxdWU7CisgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKKyAgIGludCBtb2RlOworeworICAgIEZJTEUqIGZpbGUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIqIG1vZGVfZm9wZW4gPSBOVUxMOworICAgIGlmICgobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEV1JJVEVGSUxURVIpPT1aTElCX0ZJTEVGVU5DX01PREVfUkVBRCkKKyAgICAgICAgbW9kZV9mb3BlbiA9ICJyYiI7CisgICAgZWxzZQorICAgIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HKQorICAgICAgICBtb2RlX2ZvcGVuID0gInIrYiI7CisgICAgZWxzZQorICAgIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0NSRUFURSkKKyAgICAgICAgbW9kZV9mb3BlbiA9ICJ3YiI7CisKKyAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAobW9kZV9mb3BlbiAhPSBOVUxMKSkKKyAgICAgICAgZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCBtb2RlX2ZvcGVuKTsKKyAgICByZXR1cm4gZmlsZTsKK30KKworCit1TG9uZyBaQ0FMTEJBQ0sgZnJlYWRfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSwgYnVmLCBzaXplKQorICAgdm9pZHBmIG9wYXF1ZTsKKyAgIHZvaWRwZiBzdHJlYW07CisgICB2b2lkKiBidWY7CisgICB1TG9uZyBzaXplOworeworICAgIHVMb25nIHJldDsKKyAgICByZXQgPSBmcmVhZChidWYsIDEsIChzaXplX3Qpc2l6ZSwgKEZJTEUgKilzdHJlYW0pOworICAgIHJldHVybiByZXQ7Cit9CisKKwordUxvbmcgWkNBTExCQUNLIGZ3cml0ZV9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtLCBidWYsIHNpemUpCisgICB2b2lkcGYgb3BhcXVlOworICAgdm9pZHBmIHN0cmVhbTsKKyAgIGNvbnN0IHZvaWQqIGJ1ZjsKKyAgIHVMb25nIHNpemU7Cit7CisgICAgdUxvbmcgcmV0OworICAgIHJldCA9IGZ3cml0ZShidWYsIDEsIChzaXplX3Qpc2l6ZSwgKEZJTEUgKilzdHJlYW0pOworICAgIHJldHVybiByZXQ7Cit9CisKK2xvbmcgWkNBTExCQUNLIGZ0ZWxsX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0pCisgICB2b2lkcGYgb3BhcXVlOworICAgdm9pZHBmIHN0cmVhbTsKK3sKKyAgICBsb25nIHJldDsKKyAgICByZXQgPSBmdGVsbCgoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworbG9uZyBaQ0FMTEJBQ0sgZnNlZWtfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCisgICB2b2lkcGYgb3BhcXVlOworICAgdm9pZHBmIHN0cmVhbTsKKyAgIHVMb25nIG9mZnNldDsKKyAgIGludCBvcmlnaW47Cit7CisgICAgaW50IGZzZWVrX29yaWdpbj0wOworICAgIGxvbmcgcmV0OworICAgIHN3aXRjaCAob3JpZ2luKQorICAgIHsKKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgorICAgICAgICBmc2Vla19vcmlnaW4gPSBTRUVLX0NVUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfRU5EIDoKKyAgICAgICAgZnNlZWtfb3JpZ2luID0gU0VFS19FTkQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCA6CisgICAgICAgIGZzZWVrX29yaWdpbiA9IFNFRUtfU0VUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiByZXR1cm4gLTE7CisgICAgfQorICAgIHJldCA9IDA7CisgICAgZnNlZWsoKEZJTEUgKilzdHJlYW0sIG9mZnNldCwgZnNlZWtfb3JpZ2luKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgWkNBTExCQUNLIGZjbG9zZV9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtKQorICAgdm9pZHBmIG9wYXF1ZTsKKyAgIHZvaWRwZiBzdHJlYW07Cit7CisgICAgaW50IHJldDsKKyAgICByZXQgPSBmY2xvc2UoKEZJTEUgKilzdHJlYW0pOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBaQ0FMTEJBQ0sgZmVycm9yX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0pCisgICB2b2lkcGYgb3BhcXVlOworICAgdm9pZHBmIHN0cmVhbTsKK3sKKyAgICBpbnQgcmV0OworICAgIHJldCA9IGZlcnJvcigoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBmaWxsX2ZvcGVuX2ZpbGVmdW5jIChwemxpYl9maWxlZnVuY19kZWYpCisgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Cit7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56b3Blbl9maWxlID0gZm9wZW5fZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enJlYWRfZmlsZSA9IGZyZWFkX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp3cml0ZV9maWxlID0gZndyaXRlX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp0ZWxsX2ZpbGUgPSBmdGVsbF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56c2Vla19maWxlID0gZnNlZWtfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSBmY2xvc2VfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSBmZXJyb3JfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluaXppcC9pb2FwaS5oIGIvY29udHJpYi9taW5pemlwL2lvYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwZmU3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbWluaXppcC9pb2FwaS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIGlvYXBpLmggLS0gSU8gYmFzZSBmdW5jdGlvbiBoZWFkZXIgZm9yIGNvbXByZXNzL3VuY29tcHJlc3MgLnppcAorICAgZmlsZXMgdXNpbmcgemxpYiArIHppcCBvciB1bnppcCBBUEkKKworICAgVmVyc2lvbiAwLjIxLCBNYXJjaCAxMHRoLCAyMDAzCisKKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIEdpbGxlcyBWb2xsYW50CisqLworCisjaWZuZGVmIF9aTElCSU9BUElfSAorI2RlZmluZSBfWkxJQklPQVBJX0gKKworCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgKDEpCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfU0VFS19FTkQgKDIpCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgKDApCisKKyNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgICAgICAoMSkKKyNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX1dSSVRFICAgICAoMikKKyNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUiAoMykKKworI2RlZmluZSBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcgKDQpCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUgICAoOCkKKworCisjaWZuZGVmIFpDQUxMQkFDSworCisjaWYgKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQgKFdJTkRPV1MpIHx8IGRlZmluZWQgKF9XSU5ET1dTKSkgJiYgZGVmaW5lZChDQUxMQkFDSykgJiYgZGVmaW5lZCAoVVNFV0lORE9XU19DQUxMQkFDSykKKyNkZWZpbmUgWkNBTExCQUNLIENBTExCQUNLCisjZWxzZQorI2RlZmluZSBaQ0FMTEJBQ0sKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiB2b2lkcGYgKFpDQUxMQkFDSyAqb3Blbl9maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IG1vZGUpKTsKK3R5cGVkZWYgdUxvbmcgIChaQ0FMTEJBQ0sgKnJlYWRfZmlsZV9mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdm9pZCogYnVmLCB1TG9uZyBzaXplKSk7Cit0eXBlZGVmIHVMb25nICAoWkNBTExCQUNLICp3cml0ZV9maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBjb25zdCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsKK3R5cGVkZWYgbG9uZyAgIChaQ0FMTEJBQ0sgKnRlbGxfZmlsZV9mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwordHlwZWRlZiBsb25nICAgKFpDQUxMQkFDSyAqc2Vla19maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB1TG9uZyBvZmZzZXQsIGludCBvcmlnaW4pKTsKK3R5cGVkZWYgaW50ICAgIChaQ0FMTEJBQ0sgKmNsb3NlX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKK3R5cGVkZWYgaW50ICAgIChaQ0FMTEJBQ0sgKnRlc3RlcnJvcl9maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKSk7CisKK3R5cGVkZWYgc3RydWN0IHpsaWJfZmlsZWZ1bmNfZGVmX3MKK3sKKyAgICBvcGVuX2ZpbGVfZnVuYyAgICAgIHpvcGVuX2ZpbGU7CisgICAgcmVhZF9maWxlX2Z1bmMgICAgICB6cmVhZF9maWxlOworICAgIHdyaXRlX2ZpbGVfZnVuYyAgICAgendyaXRlX2ZpbGU7CisgICAgdGVsbF9maWxlX2Z1bmMgICAgICB6dGVsbF9maWxlOworICAgIHNlZWtfZmlsZV9mdW5jICAgICAgenNlZWtfZmlsZTsKKyAgICBjbG9zZV9maWxlX2Z1bmMgICAgIHpjbG9zZV9maWxlOworICAgIHRlc3RlcnJvcl9maWxlX2Z1bmMgemVycm9yX2ZpbGU7CisgICAgdm9pZHBmICAgICAgICAgICAgICBvcGFxdWU7Cit9IHpsaWJfZmlsZWZ1bmNfZGVmOworCisKKwordm9pZCBmaWxsX2ZvcGVuX2ZpbGVmdW5jIE9GKCh6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7CisKKyNkZWZpbmUgWlJFQUQoZmlsZWZ1bmMsZmlsZXN0cmVhbSxidWYsc2l6ZSkgKCgqKChmaWxlZnVuYykuenJlYWRfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0sYnVmLHNpemUpKQorI2RlZmluZSBaV1JJVEUoZmlsZWZ1bmMsZmlsZXN0cmVhbSxidWYsc2l6ZSkgKCgqKChmaWxlZnVuYykuendyaXRlX2ZpbGUpKSgoZmlsZWZ1bmMpLm9wYXF1ZSxmaWxlc3RyZWFtLGJ1ZixzaXplKSkKKyNkZWZpbmUgWlRFTEwoZmlsZWZ1bmMsZmlsZXN0cmVhbSkgKCgqKChmaWxlZnVuYykuenRlbGxfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0pKQorI2RlZmluZSBaU0VFSyhmaWxlZnVuYyxmaWxlc3RyZWFtLHBvcyxtb2RlKSAoKCooKGZpbGVmdW5jKS56c2Vla19maWxlKSkoKGZpbGVmdW5jKS5vcGFxdWUsZmlsZXN0cmVhbSxwb3MsbW9kZSkpCisjZGVmaW5lIFpDTE9TRShmaWxlZnVuYyxmaWxlc3RyZWFtKSAoKCooKGZpbGVmdW5jKS56Y2xvc2VfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0pKQorI2RlZmluZSBaRVJST1IoZmlsZWZ1bmMsZmlsZXN0cmVhbSkgKCgqKChmaWxlZnVuYykuemVycm9yX2ZpbGUpKSgoZmlsZWZ1bmMpLm9wYXF1ZSxmaWxlc3RyZWFtKSkKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL2lvd2luMzIuYyBiL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmNTU0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qIGlvd2luMzIuYyAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwCisgICBmaWxlcyB1c2luZyB6bGliICsgemlwIG9yIHVuemlwIEFQSQorICAgVGhpcyBJTyBBUEkgdmVyc2lvbiB1c2VzIHRoZSBXaW4zMiBBUEkgKGZvciBNaWNyb3NvZnQgV2luZG93cykKKworICAgVmVyc2lvbiAwLjIxLCBNYXJjaCAxMHRoLCAyMDAzCisKKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIEdpbGxlcyBWb2xsYW50CisqLworCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiemxpYi5oIgorI2luY2x1ZGUgImlvYXBpLmgiCisjaW5jbHVkZSAiaW93aW4zMi5oIgorCisjaWZuZGVmIElOVkFMSURfSEFORExFX1ZBTFVFCisjZGVmaW5lIElOVkFMSURfSEFORExFX1ZBTFVFICgweEZGRkZGRkZGKQorI2VuZGlmCisKKyNpZm5kZWYgSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSCisjZGVmaW5lIElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUiAoKERXT1JEKS0xKQorI2VuZGlmCisKK3ZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3Blbl9maWxlX2Z1bmMgT0YoKAorICAgdm9pZHBmIG9wYXF1ZSwKKyAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgaW50IG1vZGUpKTsKKwordUxvbmcgWkNBTExCQUNLIHdpbjMyX3JlYWRfZmlsZV9mdW5jIE9GKCgKKyAgIHZvaWRwZiBvcGFxdWUsCisgICB2b2lkcGYgc3RyZWFtLAorICAgdm9pZCogYnVmLAorICAgdUxvbmcgc2l6ZSkpOworCit1TG9uZyBaQ0FMTEJBQ0sgd2luMzJfd3JpdGVfZmlsZV9mdW5jIE9GKCgKKyAgIHZvaWRwZiBvcGFxdWUsCisgICB2b2lkcGYgc3RyZWFtLAorICAgY29uc3Qgdm9pZCogYnVmLAorICAgdUxvbmcgc2l6ZSkpOworCitsb25nIFpDQUxMQkFDSyB3aW4zMl90ZWxsX2ZpbGVfZnVuYyBPRigoCisgICB2b2lkcGYgb3BhcXVlLAorICAgdm9pZHBmIHN0cmVhbSkpOworCitsb25nIFpDQUxMQkFDSyB3aW4zMl9zZWVrX2ZpbGVfZnVuYyBPRigoCisgICB2b2lkcGYgb3BhcXVlLAorICAgdm9pZHBmIHN0cmVhbSwKKyAgIHVMb25nIG9mZnNldCwKKyAgIGludCBvcmlnaW4pKTsKKworbG9uZyBaQ0FMTEJBQ0sgd2luMzJfY2xvc2VfZmlsZV9mdW5jIE9GKCgKKyAgIHZvaWRwZiBvcGFxdWUsCisgICB2b2lkcGYgc3RyZWFtKSk7CisKK2ludCBaQ0FMTEJBQ0sgd2luMzJfZXJyb3JfZmlsZV9mdW5jIE9GKCgKKyAgIHZvaWRwZiBvcGFxdWUsCisgICB2b2lkcGYgc3RyZWFtKSk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSEFORExFIGhmOworICAgIGludCBlcnJvcjsKK30gV0lOMzJGSUxFX0lPV0lOOworCit2b2lkcGYgWkNBTExCQUNLIHdpbjMyX29wZW5fZmlsZV9mdW5jIChvcGFxdWUsIGZpbGVuYW1lLCBtb2RlKQorICAgdm9pZHBmIG9wYXF1ZTsKKyAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lOworICAgaW50IG1vZGU7Cit7CisgICAgY29uc3QgY2hhciogbW9kZV9mb3BlbiA9IE5VTEw7CisgICAgRFdPUkQgZHdEZXNpcmVkQWNjZXNzLGR3Q3JlYXRpb25EaXNwb3NpdGlvbixkd1NoYXJlTW9kZSxkd0ZsYWdzQW5kQXR0cmlidXRlcyA7CisgICAgSEFORExFIGhGaWxlID0gMDsKKyAgICB2b2lkcGYgcmV0PU5VTEw7CisKKyAgICBkd0Rlc2lyZWRBY2Nlc3MgPSBkd1NoYXJlTW9kZSA9IGR3RmxhZ3NBbmRBdHRyaWJ1dGVzID0gMDsKKworICAgIGlmICgobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEV1JJVEVGSUxURVIpPT1aTElCX0ZJTEVGVU5DX01PREVfUkVBRCkKKyAgICB7CisgICAgICAgIGR3RGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRDsKKyAgICAgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uID0gT1BFTl9FWElTVElORzsKKyAgICAgICAgZHdTaGFyZU1vZGUgPSBGSUxFX1NIQVJFX1JFQUQ7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORykKKyAgICB7CisgICAgICAgIGR3RGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQ7CisgICAgICAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IE9QRU5fRVhJU1RJTkc7CisgICAgfQorICAgIGVsc2UKKyAgICBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUpCisgICAgeworICAgICAgICBkd0Rlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19SRUFEOworICAgICAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24gPSBDUkVBVEVfQUxXQVlTOworICAgIH0KKworICAgIGlmICgoZmlsZW5hbWUhPU5VTEwpICYmIChkd0Rlc2lyZWRBY2Nlc3MgIT0gMCkpCisgICAgICAgIGhGaWxlID0gQ3JlYXRlRmlsZSgoTFBDVFNUUilmaWxlbmFtZSwgZHdEZXNpcmVkQWNjZXNzLCBkd1NoYXJlTW9kZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24sIGR3RmxhZ3NBbmRBdHRyaWJ1dGVzLCBOVUxMKTsKKworICAgIGlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgaEZpbGUgPSBOVUxMOworCisgICAgaWYgKGhGaWxlICE9IE5VTEwpCisgICAgeworICAgICAgICBXSU4zMkZJTEVfSU9XSU4gdzMyZmlvdzsKKyAgICAgICAgdzMyZmlvdy5oZiA9IGhGaWxlOworICAgICAgICB3MzJmaW93LmVycm9yID0gMDsKKyAgICAgICAgcmV0ID0gbWFsbG9jKHNpemVvZihXSU4zMkZJTEVfSU9XSU4pKTsKKyAgICAgICAgaWYgKHJldD09TlVMTCkKKyAgICAgICAgICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICAgICAgZWxzZSAqKChXSU4zMkZJTEVfSU9XSU4qKXJldCkgPSB3MzJmaW93OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKK3VMb25nIFpDQUxMQkFDSyB3aW4zMl9yZWFkX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0sIGJ1Ziwgc2l6ZSkKKyAgIHZvaWRwZiBvcGFxdWU7CisgICB2b2lkcGYgc3RyZWFtOworICAgdm9pZCogYnVmOworICAgdUxvbmcgc2l6ZTsKK3sKKyAgICB1TG9uZyByZXQ9MDsKKyAgICBIQU5ETEUgaEZpbGUgPSBOVUxMOworICAgIGlmIChzdHJlYW0hPU5VTEwpCisgICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7CisgICAgaWYgKGhGaWxlICE9IE5VTEwpCisgICAgICAgIGlmICghUmVhZEZpbGUoaEZpbGUsIGJ1Ziwgc2l6ZSwgJnJldCwgTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoZHdFcnIgPT0gRVJST1JfSEFORExFX0VPRikKKyAgICAgICAgICAgICAgICBkd0VyciA9IDA7CisgICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOworICAgICAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3VMb25nIFpDQUxMQkFDSyB3aW4zMl93cml0ZV9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtLCBidWYsIHNpemUpCisgICB2b2lkcGYgb3BhcXVlOworICAgdm9pZHBmIHN0cmVhbTsKKyAgIGNvbnN0IHZvaWQqIGJ1ZjsKKyAgIHVMb25nIHNpemU7Cit7CisgICAgdUxvbmcgcmV0PTA7CisgICAgSEFORExFIGhGaWxlID0gTlVMTDsKKyAgICBpZiAoc3RyZWFtIT1OVUxMKQorICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOworCisgICAgaWYgKGhGaWxlICE9TlVMTCkKKyAgICAgICAgaWYgKCFXcml0ZUZpbGUoaEZpbGUsIGJ1Ziwgc2l6ZSwgJnJldCwgTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoZHdFcnIgPT0gRVJST1JfSEFORExFX0VPRikKKyAgICAgICAgICAgICAgICBkd0VyciA9IDA7CisgICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOworICAgICAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitsb25nIFpDQUxMQkFDSyB3aW4zMl90ZWxsX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0pCisgICB2b2lkcGYgb3BhcXVlOworICAgdm9pZHBmIHN0cmVhbTsKK3sKKyAgICBsb25nIHJldD0tMTsKKyAgICBIQU5ETEUgaEZpbGUgPSBOVUxMOworICAgIGlmIChzdHJlYW0hPU5VTEwpCisgICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7CisgICAgaWYgKGhGaWxlICE9IE5VTEwpCisgICAgeworICAgICAgICBEV09SRCBkd1NldCA9IFNldEZpbGVQb2ludGVyKGhGaWxlLCAwLCBOVUxMLCBGSUxFX0NVUlJFTlQpOworICAgICAgICBpZiAoZHdTZXQgPT0gSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSKQorICAgICAgICB7CisgICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldD0obG9uZylkd1NldDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworbG9uZyBaQ0FMTEJBQ0sgd2luMzJfc2Vla19maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikKKyAgIHZvaWRwZiBvcGFxdWU7CisgICB2b2lkcGYgc3RyZWFtOworICAgdUxvbmcgb2Zmc2V0OworICAgaW50IG9yaWdpbjsKK3sKKyAgICBEV09SRCBkd01vdmVNZXRob2Q9MHhGRkZGRkZGRjsKKyAgICBIQU5ETEUgaEZpbGUgPSBOVUxMOworCisgICAgbG9uZyByZXQ9LTE7CisgICAgaWYgKHN0cmVhbSE9TlVMTCkKKyAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBoZjsKKyAgICBzd2l0Y2ggKG9yaWdpbikKKyAgICB7CisgICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSIDoKKyAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9DVVJSRU5UOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19FTkQgOgorICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0VORDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUIDoKKyAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9CRUdJTjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChoRmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgRFdPUkQgZHdTZXQgPSBTZXRGaWxlUG9pbnRlcihoRmlsZSwgb2Zmc2V0LCBOVUxMLCBkd01vdmVNZXRob2QpOworICAgICAgICBpZiAoZHdTZXQgPT0gSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSKQorICAgICAgICB7CisgICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldD0wOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitsb25nIFpDQUxMQkFDSyB3aW4zMl9jbG9zZV9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtKQorICAgdm9pZHBmIG9wYXF1ZTsKKyAgIHZvaWRwZiBzdHJlYW07Cit7CisgICAgbG9uZyByZXQ9LTE7CisKKyAgICBpZiAoc3RyZWFtIT1OVUxMKQorICAgIHsKKyAgICAgICAgSEFORExFIGhGaWxlOworICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOworICAgICAgICBpZiAoaEZpbGUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOworICAgICAgICAgICAgcmV0PTA7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShzdHJlYW0pOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgWkNBTExCQUNLIHdpbjMyX2Vycm9yX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0pCisgICB2b2lkcGYgb3BhcXVlOworICAgdm9pZHBmIHN0cmVhbTsKK3sKKyAgICBpbnQgcmV0PS0xOworICAgIGlmIChzdHJlYW0hPU5VTEwpCisgICAgeworICAgICAgICByZXQgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jIChwemxpYl9maWxlZnVuY19kZWYpCisgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Cit7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56b3Blbl9maWxlID0gd2luMzJfb3Blbl9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56cmVhZF9maWxlID0gd2luMzJfcmVhZF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56d3JpdGVfZmlsZSA9IHdpbjMyX3dyaXRlX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp0ZWxsX2ZpbGUgPSB3aW4zMl90ZWxsX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpzZWVrX2ZpbGUgPSB3aW4zMl9zZWVrX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpjbG9zZV9maWxlID0gd2luMzJfY2xvc2VfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSB3aW4zMl9lcnJvcl9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT5vcGFxdWU9TlVMTDsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmggYi9jb250cmliL21pbml6aXAvaW93aW4zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZjVlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL21pbml6aXAvaW93aW4zMi5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qIGlvd2luMzIuaCAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwCisgICBmaWxlcyB1c2luZyB6bGliICsgemlwIG9yIHVuemlwIEFQSQorICAgVGhpcyBJTyBBUEkgdmVyc2lvbiB1c2VzIHRoZSBXaW4zMiBBUEkgKGZvciBNaWNyb3NvZnQgV2luZG93cykKKworICAgVmVyc2lvbiAwLjIxLCBNYXJjaCAxMHRoLCAyMDAzCisKKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIEdpbGxlcyBWb2xsYW50CisqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3ZvaWQgZmlsbF93aW4zMl9maWxlZnVuYyBPRigoemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb250cmliL21pbml6aXAvbWluaXVuei5jIGIvY29udHJpYi9taW5pemlwL21pbml1bnouYwppbmRleCBmM2I3ODMyLi45MzhkNGVmIDEwMDY0NAotLS0gYS9jb250cmliL21pbml6aXAvbWluaXVuei5jCisrKyBiL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMKQEAgLTE3LDcgKzE3LDEyIEBACiAKICNkZWZpbmUgQ0FTRVNFTlNJVElWSVRZICgwKQogI2RlZmluZSBXUklURUJVRkZFUlNJWkUgKDgxOTIpCisjZGVmaW5lIE1BWEZJTEVOQU1FICgyNTYpCiAKKyNpZmRlZiBXSU4zMgorI2RlZmluZSBVU0VXSU4zMklPQVBJCisjaW5jbHVkZSAiaW93aW4zMi5oIgorI2VuZGlmCiAvKgogICBtaW5pIHVuemlwLCBkZW1vIG9mIHVuemlwIHBhY2thZ2UKIApAQCAtMzQsOSArMzksOSBAQAogICAgIGRvc2RhdGUgOiB0aGUgbmV3IGRhdGUgYXQgdGhlIE1TRG9zIGZvcm1hdCAoNCBieXRlcykKICAgICB0bXVfZGF0ZSA6IHRoZSBTQU1FIG5ldyBkYXRlIGF0IHRoZSB0bV91bnogZm9ybWF0ICovCiB2b2lkIGNoYW5nZV9maWxlX2RhdGUoZmlsZW5hbWUsZG9zZGF0ZSx0bXVfZGF0ZSkKLQljb25zdCBjaGFyICpmaWxlbmFtZTsKLQl1TG9uZyBkb3NkYXRlOwotCXRtX3VueiB0bXVfZGF0ZTsKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICB1TG9uZyBkb3NkYXRlOworICAgIHRtX3VueiB0bXVfZGF0ZTsKIHsKICNpZmRlZiBXSU4zMgogICBIQU5ETEUgaEZpbGU7CkBAIC03NSwxNyArODAsMTcgQEAKICAgIEFzIEkgZG9uJ3Qga25vdyB3ZWxsIFVuaXgsIEkgd2FpdCBmZWVkYmFjayBmb3IgdGhlIHVuaXggcG9ydGlvbiAqLwogCiBpbnQgbXlta2RpcihkaXJuYW1lKQotCWNvbnN0IGNoYXIqIGRpcm5hbWU7CisgICAgY29uc3QgY2hhciogZGlybmFtZTsKIHsKICAgICBpbnQgcmV0PTA7CiAjaWZkZWYgV0lOMzIKLQlyZXQgPSBta2RpcihkaXJuYW1lKTsKKyAgICByZXQgPSBta2RpcihkaXJuYW1lKTsKICNlbHNlCiAjaWZkZWYgdW5peAotCXJldCA9IG1rZGlyIChkaXJuYW1lLDA3NzUpOworICAgIHJldCA9IG1rZGlyIChkaXJuYW1lLDA3NzUpOwogI2VuZGlmCiAjZW5kaWYKLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKIGludCBtYWtlZGlyIChuZXdkaXIpCkBAIC05MywxNCArOTgsMTQgQEAKIHsKICAgY2hhciAqYnVmZmVyIDsKICAgY2hhciAqcDsKLSAgaW50ICBsZW4gPSBzdHJsZW4obmV3ZGlyKTsgIAorICBpbnQgIGxlbiA9IChpbnQpc3RybGVuKG5ld2Rpcik7CiAKLSAgaWYgKGxlbiA8PSAwKSAKKyAgaWYgKGxlbiA8PSAwKQogICAgIHJldHVybiAwOwogCiAgIGJ1ZmZlciA9IChjaGFyKiltYWxsb2MobGVuKzEpOwogICBzdHJjcHkoYnVmZmVyLG5ld2Rpcik7Ci0gIAorCiAgIGlmIChidWZmZXJbbGVuLTFdID09ICcvJykgewogICAgIGJ1ZmZlcltsZW4tMV0gPSAnXDAnOwogICB9CkBAIC0xMzUsMTA0ICsxNDAsMTA1IEBACiAKIHZvaWQgZG9fYmFubmVyKCkKIHsKLQlwcmludGYoIk1pbmlVbnogMC4xNSwgZGVtbyBvZiB6TGliICsgVW56IHBhY2thZ2Ugd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudFxuIik7Ci0JcHJpbnRmKCJtb3JlIGluZm8gYXQgaHR0cDovL3d3d3cud2luaW1hZ2UvekxpYkRsbC91bnppcC5odG1cblxuIik7CisgICAgcHJpbnRmKCJNaW5pVW56IDAuMTUsIGRlbW8gb2YgekxpYiArIFVueiBwYWNrYWdlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnRcbiIpOworICAgIHByaW50ZigibW9yZSBpbmZvIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbFxuXG4iKTsKIH0KIAogdm9pZCBkb19oZWxwKCkKLXsJCi0JcHJpbnRmKCJVc2FnZSA6IG1pbml1bnogWy1leHZsb10gZmlsZS56aXAgW2ZpbGVfdG9fZXh0cmFjdF1cblxuIikgOworeworICAgIHByaW50ZigiVXNhZ2UgOiBtaW5pdW56IFstZXh2bG9dIGZpbGUuemlwIFtmaWxlX3RvX2V4dHJhY3RdXG5cbiIpIDsKIH0KIAogCiBpbnQgZG9fbGlzdCh1ZikKLQl1bnpGaWxlIHVmOworICAgIHVuekZpbGUgdWY7CiB7Ci0JdUxvbmcgaTsKLQl1bnpfZ2xvYmFsX2luZm8gZ2k7Ci0JaW50IGVycjsKKyAgICB1TG9uZyBpOworICAgIHVuel9nbG9iYWxfaW5mbyBnaTsKKyAgICBpbnQgZXJyOwogCi0JZXJyID0gdW56R2V0R2xvYmFsSW5mbyAodWYsJmdpKTsKLQlpZiAoZXJyIT1VTlpfT0spCi0JCXByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdldEdsb2JhbEluZm8gXG4iLGVycik7CisgICAgZXJyID0gdW56R2V0R2xvYmFsSW5mbyAodWYsJmdpKTsKKyAgICBpZiAoZXJyIT1VTlpfT0spCisgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdldEdsb2JhbEluZm8gXG4iLGVycik7CiAgICAgcHJpbnRmKCIgTGVuZ3RoICBNZXRob2QgICBTaXplICBSYXRpbyAgIERhdGUgICAgVGltZSAgIENSQy0zMiAgICAgTmFtZVxuIik7CiAgICAgcHJpbnRmKCIgLS0tLS0tICAtLS0tLS0gICAtLS0tICAtLS0tLSAgIC0tLS0gICAgLS0tLSAgIC0tLS0tLSAgICAgLS0tLVxuIik7Ci0JZm9yIChpPTA7aTxnaS5udW1iZXJfZW50cnk7aSsrKQotCXsKLQkJY2hhciBmaWxlbmFtZV9pbnppcFsyNTZdOwotCQl1bnpfZmlsZV9pbmZvIGZpbGVfaW5mbzsKLQkJdUxvbmcgcmF0aW89MDsKLQkJY29uc3QgY2hhciAqc3RyaW5nX21ldGhvZDsKLQkJZXJyID0gdW56R2V0Q3VycmVudEZpbGVJbmZvKHVmLCZmaWxlX2luZm8sZmlsZW5hbWVfaW56aXAsc2l6ZW9mKGZpbGVuYW1lX2luemlwKSxOVUxMLDAsTlVMTCwwKTsKLQkJaWYgKGVyciE9VU5aX09LKQotCQl7Ci0JCQlwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm9cbiIsZXJyKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemU+MCkKLQkJCXJhdGlvID0gKGZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUqMTAwKS9maWxlX2luZm8udW5jb21wcmVzc2VkX3NpemU7CisgICAgZm9yIChpPTA7aTxnaS5udW1iZXJfZW50cnk7aSsrKQorICAgIHsKKyAgICAgICAgY2hhciBmaWxlbmFtZV9pbnppcFsyNTZdOworICAgICAgICB1bnpfZmlsZV9pbmZvIGZpbGVfaW5mbzsKKyAgICAgICAgdUxvbmcgcmF0aW89MDsKKyAgICAgICAgY29uc3QgY2hhciAqc3RyaW5nX21ldGhvZDsKKyAgICAgICAgZXJyID0gdW56R2V0Q3VycmVudEZpbGVJbmZvKHVmLCZmaWxlX2luZm8sZmlsZW5hbWVfaW56aXAsc2l6ZW9mKGZpbGVuYW1lX2luemlwKSxOVUxMLDAsTlVMTCwwKTsKKyAgICAgICAgaWYgKGVyciE9VU5aX09LKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm9cbiIsZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemU+MCkKKyAgICAgICAgICAgIHJhdGlvID0gKGZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUqMTAwKS9maWxlX2luZm8udW5jb21wcmVzc2VkX3NpemU7CiAKLQkJaWYgKGZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PTApCi0JCQlzdHJpbmdfbWV0aG9kPSJTdG9yZWQiOwotCQllbHNlCi0JCWlmIChmaWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kPT1aX0RFRkxBVEVEKQotCQl7Ci0JCQl1SW50IGlMZXZlbD0odUludCkoKGZpbGVfaW5mby5mbGFnICYgMHg2KS8yKTsKLQkJCWlmIChpTGV2ZWw9PTApCi0JCQkgIHN0cmluZ19tZXRob2Q9IkRlZmw6TiI7Ci0JCQllbHNlIGlmIChpTGV2ZWw9PTEpCi0JCQkgIHN0cmluZ19tZXRob2Q9IkRlZmw6WCI7Ci0JCQllbHNlIGlmICgoaUxldmVsPT0yKSB8fCAoaUxldmVsPT0zKSkKLQkJCSAgc3RyaW5nX21ldGhvZD0iRGVmbDpGIjsgLyogMjpmYXN0ICwgMyA6IGV4dHJhIGZhc3QqLwotCQl9Ci0JCWVsc2UKLQkJCXN0cmluZ19tZXRob2Q9IlVua24uICI7CisgICAgICAgIGlmIChmaWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kPT0wKQorICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iU3RvcmVkIjsKKyAgICAgICAgZWxzZQorICAgICAgICBpZiAoZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZD09Wl9ERUZMQVRFRCkKKyAgICAgICAgeworICAgICAgICAgICAgdUludCBpTGV2ZWw9KHVJbnQpKChmaWxlX2luZm8uZmxhZyAmIDB4NikvMik7CisgICAgICAgICAgICBpZiAoaUxldmVsPT0wKQorICAgICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJEZWZsOk4iOworICAgICAgICAgICAgZWxzZSBpZiAoaUxldmVsPT0xKQorICAgICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJEZWZsOlgiOworICAgICAgICAgICAgZWxzZSBpZiAoKGlMZXZlbD09MikgfHwgKGlMZXZlbD09MykpCisgICAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IkRlZmw6RiI7IC8qIDI6ZmFzdCAsIDMgOiBleHRyYSBmYXN0Ki8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJVbmtuLiAiOwogCi0JCXByaW50ZigiJTdsdSAgJTZzICU3bHUgJTNsdSUlICAlMi4ybHUtJTIuMmx1LSUyLjJsdSAgJTIuMmx1OiUyLjJsdSAgJTguOGx4ICAgJXNcbiIsCi0JCQkgICAgZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplLHN0cmluZ19tZXRob2QsZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSwKLQkJCQlyYXRpbywKLQkJCQkodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX21vbiArIDEsCisgICAgICAgIHByaW50ZigiJTdsdSAgJTZzICU3bHUgJTNsdSUlICAlMi4ybHUtJTIuMmx1LSUyLjJsdSAgJTIuMmx1OiUyLjJsdSAgJTguOGx4ICAgJXNcbiIsCisgICAgICAgICAgICAgICAgZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplLHN0cmluZ19tZXRob2QsZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICByYXRpbywKKyAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX21vbiArIDEsCiAgICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9tZGF5LAotCQkJCSh1TG9uZylmaWxlX2luZm8udG11X2RhdGUudG1feWVhciAlIDEwMCwKLQkJCQkodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX2hvdXIsKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9taW4sCi0JCQkJKHVMb25nKWZpbGVfaW5mby5jcmMsZmlsZW5hbWVfaW56aXApOwotCQlpZiAoKGkrMSk8Z2kubnVtYmVyX2VudHJ5KQotCQl7Ci0JCQllcnIgPSB1bnpHb1RvTmV4dEZpbGUodWYpOwotCQkJaWYgKGVyciE9VU5aX09LKQotCQkJewotCQkJCXByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdvVG9OZXh0RmlsZVxuIixlcnIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgICAgICh1TG9uZylmaWxlX2luZm8udG11X2RhdGUudG1feWVhciAlIDEwMCwKKyAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX2hvdXIsKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9taW4sCisgICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby5jcmMsZmlsZW5hbWVfaW56aXApOworICAgICAgICBpZiAoKGkrMSk8Z2kubnVtYmVyX2VudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSB1bnpHb1RvTmV4dEZpbGUodWYpOworICAgICAgICAgICAgaWYgKGVyciE9VU5aX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdvVG9OZXh0RmlsZVxuIixlcnIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIAotaW50IGRvX2V4dHJhY3RfY3VycmVudGZpbGUodWYscG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCxwb3B0X292ZXJ3cml0ZSkKLQl1bnpGaWxlIHVmOwotCWNvbnN0IGludCogcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsKK2ludCBkb19leHRyYWN0X2N1cnJlbnRmaWxlKHVmLHBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgscG9wdF9vdmVyd3JpdGUscGFzc3dvcmQpCisgICAgdW56RmlsZSB1ZjsKKyAgICBjb25zdCBpbnQqIHBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGg7CiAgICAgaW50KiBwb3B0X292ZXJ3cml0ZTsKKyAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKIHsKLQljaGFyIGZpbGVuYW1lX2luemlwWzI1Nl07Ci0JY2hhciogZmlsZW5hbWVfd2l0aG91dHBhdGg7Ci0JY2hhciogcDsKKyAgICBjaGFyIGZpbGVuYW1lX2luemlwWzI1Nl07CisgICAgY2hhciogZmlsZW5hbWVfd2l0aG91dHBhdGg7CisgICAgY2hhciogcDsKICAgICBpbnQgZXJyPVVOWl9PSzsKICAgICBGSUxFICpmb3V0PU5VTEw7CiAgICAgdm9pZCogYnVmOwogICAgIHVJbnQgc2l6ZV9idWY7Ci0JCi0JdW56X2ZpbGVfaW5mbyBmaWxlX2luZm87Ci0JdUxvbmcgcmF0aW89MDsKLQllcnIgPSB1bnpHZXRDdXJyZW50RmlsZUluZm8odWYsJmZpbGVfaW5mbyxmaWxlbmFtZV9pbnppcCxzaXplb2YoZmlsZW5hbWVfaW56aXApLE5VTEwsMCxOVUxMLDApOwogCi0JaWYgKGVyciE9VU5aX09LKQotCXsKLQkJcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R2V0Q3VycmVudEZpbGVJbmZvXG4iLGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQorICAgIHVuel9maWxlX2luZm8gZmlsZV9pbmZvOworICAgIHVMb25nIHJhdGlvPTA7CisgICAgZXJyID0gdW56R2V0Q3VycmVudEZpbGVJbmZvKHVmLCZmaWxlX2luZm8sZmlsZW5hbWVfaW56aXAsc2l6ZW9mKGZpbGVuYW1lX2luemlwKSxOVUxMLDAsTlVMTCwwKTsKKworICAgIGlmIChlcnIhPVVOWl9PSykKKyAgICB7CisgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdldEN1cnJlbnRGaWxlSW5mb1xuIixlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KIAogICAgIHNpemVfYnVmID0gV1JJVEVCVUZGRVJTSVpFOwogICAgIGJ1ZiA9ICh2b2lkKiltYWxsb2Moc2l6ZV9idWYpOwpAQCAtMjQyLDcxICsyNDgsNzEgQEAKICAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOwogICAgIH0KIAotCXAgPSBmaWxlbmFtZV93aXRob3V0cGF0aCA9IGZpbGVuYW1lX2luemlwOwotCXdoaWxlICgoKnApICE9ICdcMCcpCi0JewotCQlpZiAoKCgqcCk9PScvJykgfHwgKCgqcCk9PSdcXCcpKQotCQkJZmlsZW5hbWVfd2l0aG91dHBhdGggPSBwKzE7Ci0JCXArKzsKLQl9CisgICAgcCA9IGZpbGVuYW1lX3dpdGhvdXRwYXRoID0gZmlsZW5hbWVfaW56aXA7CisgICAgd2hpbGUgKCgqcCkgIT0gJ1wwJykKKyAgICB7CisgICAgICAgIGlmICgoKCpwKT09Jy8nKSB8fCAoKCpwKT09J1xcJykpCisgICAgICAgICAgICBmaWxlbmFtZV93aXRob3V0cGF0aCA9IHArMTsKKyAgICAgICAgcCsrOworICAgIH0KIAotCWlmICgoKmZpbGVuYW1lX3dpdGhvdXRwYXRoKT09J1wwJykKLQl7Ci0JCWlmICgoKnBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgpPT0wKQotCQl7Ci0JCQlwcmludGYoImNyZWF0aW5nIGRpcmVjdG9yeTogJXNcbiIsZmlsZW5hbWVfaW56aXApOwotCQkJbXlta2RpcihmaWxlbmFtZV9pbnppcCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJY29uc3QgY2hhciogd3JpdGVfZmlsZW5hbWU7Ci0JCWludCBza2lwPTA7CisgICAgaWYgKCgqZmlsZW5hbWVfd2l0aG91dHBhdGgpPT0nXDAnKQorICAgIHsKKyAgICAgICAgaWYgKCgqcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCk9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgZGlyZWN0b3J5OiAlc1xuIixmaWxlbmFtZV9pbnppcCk7CisgICAgICAgICAgICBteW1rZGlyKGZpbGVuYW1lX2luemlwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb25zdCBjaGFyKiB3cml0ZV9maWxlbmFtZTsKKyAgICAgICAgaW50IHNraXA9MDsKIAotCQlpZiAoKCpwb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoKT09MCkKLQkJCXdyaXRlX2ZpbGVuYW1lID0gZmlsZW5hbWVfaW56aXA7Ci0JCWVsc2UKLQkJCXdyaXRlX2ZpbGVuYW1lID0gZmlsZW5hbWVfd2l0aG91dHBhdGg7CisgICAgICAgIGlmICgoKnBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgpPT0wKQorICAgICAgICAgICAgd3JpdGVfZmlsZW5hbWUgPSBmaWxlbmFtZV9pbnppcDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVfZmlsZW5hbWUgPSBmaWxlbmFtZV93aXRob3V0cGF0aDsKIAotCQllcnIgPSB1bnpPcGVuQ3VycmVudEZpbGUodWYpOwotCQlpZiAoZXJyIT1VTlpfT0spCi0JCXsKLQkJCXByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuek9wZW5DdXJyZW50RmlsZVxuIixlcnIpOwotCQl9CisgICAgICAgIGVyciA9IHVuek9wZW5DdXJyZW50RmlsZVBhc3N3b3JkKHVmLHBhc3N3b3JkKTsKKyAgICAgICAgaWYgKGVyciE9VU5aX09LKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZFxuIixlcnIpOworICAgICAgICB9CiAKLQkJaWYgKCgoKnBvcHRfb3ZlcndyaXRlKT09MCkgJiYgKGVycj09VU5aX09LKSkKLQkJewotCQkJY2hhciByZXA7Ci0JCQlGSUxFKiBmdGVzdGV4aXN0OwotCQkJZnRlc3RleGlzdCA9IGZvcGVuKHdyaXRlX2ZpbGVuYW1lLCJyYiIpOwotCQkJaWYgKGZ0ZXN0ZXhpc3QhPU5VTEwpCi0JCQl7Ci0JCQkJZmNsb3NlKGZ0ZXN0ZXhpc3QpOwotCQkJCWRvCi0JCQkJewotCQkJCQljaGFyIGFuc3dlclsxMjhdOwotCQkJCQlwcmludGYoIlRoZSBmaWxlICVzIGV4aXN0LiBPdmVyd3JpdGUgPyBbeV1lcywgW25dbywgW0FdbGw6ICIsd3JpdGVfZmlsZW5hbWUpOwotCQkJCQlzY2FuZigiJTFzIixhbnN3ZXIpOwotCQkJCQlyZXAgPSBhbnN3ZXJbMF0gOwotCQkJCQlpZiAoKHJlcD49J2EnKSAmJiAocmVwPD0neicpKQotCQkJCQkJcmVwIC09IDB4MjA7Ci0JCQkJfQotCQkJCXdoaWxlICgocmVwIT0nWScpICYmIChyZXAhPSdOJykgJiYgKHJlcCE9J0EnKSk7Ci0JCQl9CisgICAgICAgIGlmICgoKCpwb3B0X292ZXJ3cml0ZSk9PTApICYmIChlcnI9PVVOWl9PSykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgcmVwPTA7CisgICAgICAgICAgICBGSUxFKiBmdGVzdGV4aXN0OworICAgICAgICAgICAgZnRlc3RleGlzdCA9IGZvcGVuKHdyaXRlX2ZpbGVuYW1lLCJyYiIpOworICAgICAgICAgICAgaWYgKGZ0ZXN0ZXhpc3QhPU5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmNsb3NlKGZ0ZXN0ZXhpc3QpOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGFuc3dlclsxMjhdOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRoZSBmaWxlICVzIGV4aXN0LiBPdmVyd3JpdGUgPyBbeV1lcywgW25dbywgW0FdbGw6ICIsd3JpdGVfZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBzY2FuZigiJTFzIixhbnN3ZXIpOworICAgICAgICAgICAgICAgICAgICByZXAgPSBhbnN3ZXJbMF0gOworICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcD49J2EnKSAmJiAocmVwPD0neicpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVwIC09IDB4MjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICgocmVwIT0nWScpICYmIChyZXAhPSdOJykgJiYgKHJlcCE9J0EnKSk7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChyZXAgPT0gJ04nKQotCQkJCXNraXAgPSAxOworICAgICAgICAgICAgaWYgKHJlcCA9PSAnTicpCisgICAgICAgICAgICAgICAgc2tpcCA9IDE7CiAKLQkJCWlmIChyZXAgPT0gJ0EnKQotCQkJCSpwb3B0X292ZXJ3cml0ZT0xOwotCQl9CisgICAgICAgICAgICBpZiAocmVwID09ICdBJykKKyAgICAgICAgICAgICAgICAqcG9wdF9vdmVyd3JpdGU9MTsKKyAgICAgICAgfQogCi0JCWlmICgoc2tpcD09MCkgJiYgKGVycj09VU5aX09LKSkKLQkJewotCQkJZm91dD1mb3Blbih3cml0ZV9maWxlbmFtZSwid2IiKTsKKyAgICAgICAgaWYgKChza2lwPT0wKSAmJiAoZXJyPT1VTlpfT0spKQorICAgICAgICB7CisgICAgICAgICAgICBmb3V0PWZvcGVuKHdyaXRlX2ZpbGVuYW1lLCJ3YiIpOwogCiAgICAgICAgICAgICAvKiBzb21lIHppcGZpbGUgZG9uJ3QgY29udGFpbiBkaXJlY3RvcnkgYWxvbmUgYmVmb3JlIGZpbGUgKi8KLSAgICAgICAgICAgIGlmICgoZm91dD09TlVMTCkgJiYgKCgqcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCk9PTApICYmIAorICAgICAgICAgICAgaWYgKChmb3V0PT1OVUxMKSAmJiAoKCpwb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoKT09MCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVuYW1lX3dpdGhvdXRwYXRoIT0oY2hhciopZmlsZW5hbWVfaW56aXApKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNoYXIgYz0qKGZpbGVuYW1lX3dpdGhvdXRwYXRoLTEpOwpAQCAtMzE2LDk1ICszMjIsMTAwIEBACiAgICAgICAgICAgICAgICAgZm91dD1mb3Blbih3cml0ZV9maWxlbmFtZSwid2IiKTsKICAgICAgICAgICAgIH0KIAotCQkJaWYgKGZvdXQ9PU5VTEwpCi0JCQl7Ci0JCQkJcHJpbnRmKCJlcnJvciBvcGVuaW5nICVzXG4iLHdyaXRlX2ZpbGVuYW1lKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgaWYgKGZvdXQ9PU5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBvcGVuaW5nICVzXG4iLHdyaXRlX2ZpbGVuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWlmIChmb3V0IT1OVUxMKQotCQl7Ci0JCQlwcmludGYoIiBleHRyYWN0aW5nOiAlc1xuIix3cml0ZV9maWxlbmFtZSk7CisgICAgICAgIGlmIChmb3V0IT1OVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIiBleHRyYWN0aW5nOiAlc1xuIix3cml0ZV9maWxlbmFtZSk7CiAKLQkJCWRvCi0JCQl7Ci0JCQkJZXJyID0gdW56UmVhZEN1cnJlbnRGaWxlKHVmLGJ1ZixzaXplX2J1Zik7Ci0JCQkJaWYgKGVycjwwKQkKLQkJCQl7Ci0JCQkJCXByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuelJlYWRDdXJyZW50RmlsZVxuIixlcnIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGVycj4wKQotCQkJCQlpZiAoZndyaXRlKGJ1ZixlcnIsMSxmb3V0KSE9MSkKLQkJCQkJewotCQkJCQkJcHJpbnRmKCJlcnJvciBpbiB3cml0aW5nIGV4dHJhY3RlZCBmaWxlXG4iKTsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gdW56UmVhZEN1cnJlbnRGaWxlKHVmLGJ1ZixzaXplX2J1Zik7CisgICAgICAgICAgICAgICAgaWYgKGVycjwwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56UmVhZEN1cnJlbnRGaWxlXG4iLGVycik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXJyPjApCisgICAgICAgICAgICAgICAgICAgIGlmIChmd3JpdGUoYnVmLGVyciwxLGZvdXQpIT0xKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHdyaXRpbmcgZXh0cmFjdGVkIGZpbGVcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAoZXJyPjApOwotCQkJZmNsb3NlKGZvdXQpOwotCQkJaWYgKGVycj09MCkgCi0JCQkJY2hhbmdlX2ZpbGVfZGF0ZSh3cml0ZV9maWxlbmFtZSxmaWxlX2luZm8uZG9zRGF0ZSwKLQkJCQkJICAgICAgICAgICAgIGZpbGVfaW5mby50bXVfZGF0ZSk7Ci0JCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoZXJyPjApOworICAgICAgICAgICAgaWYgKGZvdXQpCisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmb3V0KTsKKworICAgICAgICAgICAgaWYgKGVycj09MCkKKyAgICAgICAgICAgICAgICBjaGFuZ2VfZmlsZV9kYXRlKHdyaXRlX2ZpbGVuYW1lLGZpbGVfaW5mby5kb3NEYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9pbmZvLnRtdV9kYXRlKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnI9PVVOWl9PSykKICAgICAgICAgewotCQkgICAgZXJyID0gdW56Q2xvc2VDdXJyZW50RmlsZSAodWYpOwotCQkgICAgaWYgKGVyciE9VU5aX09LKQotCQkgICAgewotCQkJICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekNsb3NlQ3VycmVudEZpbGVcbiIsZXJyKTsKLQkJICAgIH0KKyAgICAgICAgICAgIGVyciA9IHVuekNsb3NlQ3VycmVudEZpbGUgKHVmKTsKKyAgICAgICAgICAgIGlmIChlcnIhPVVOWl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpDbG9zZUN1cnJlbnRGaWxlXG4iLGVycik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgdW56Q2xvc2VDdXJyZW50RmlsZSh1Zik7IC8qIGRvbid0IGxvc2UgdGhlIGVycm9yICovICAgICAgIAotCX0KKyAgICAgICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUodWYpOyAvKiBkb24ndCBsb3NlIHRoZSBlcnJvciAqLworICAgIH0KIAotICAgIGZyZWUoYnVmKTsgICAgCisgICAgZnJlZShidWYpOwogICAgIHJldHVybiBlcnI7CiB9CiAKIAotaW50IGRvX2V4dHJhY3QodWYsb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoLG9wdF9vdmVyd3JpdGUpCi0JdW56RmlsZSB1ZjsKLQlpbnQgb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoOworaW50IGRvX2V4dHJhY3QodWYsb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoLG9wdF9vdmVyd3JpdGUscGFzc3dvcmQpCisgICAgdW56RmlsZSB1ZjsKKyAgICBpbnQgb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoOwogICAgIGludCBvcHRfb3ZlcndyaXRlOworICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOwogewotCXVMb25nIGk7Ci0JdW56X2dsb2JhbF9pbmZvIGdpOwotCWludCBlcnI7Ci0JRklMRSogZm91dD1OVUxMOwkKKyAgICB1TG9uZyBpOworICAgIHVuel9nbG9iYWxfaW5mbyBnaTsKKyAgICBpbnQgZXJyOworICAgIEZJTEUqIGZvdXQ9TlVMTDsKIAotCWVyciA9IHVuekdldEdsb2JhbEluZm8gKHVmLCZnaSk7Ci0JaWYgKGVyciE9VU5aX09LKQotCQlwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRHbG9iYWxJbmZvIFxuIixlcnIpOworICAgIGVyciA9IHVuekdldEdsb2JhbEluZm8gKHVmLCZnaSk7CisgICAgaWYgKGVyciE9VU5aX09LKQorICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRHbG9iYWxJbmZvIFxuIixlcnIpOwogCi0JZm9yIChpPTA7aTxnaS5udW1iZXJfZW50cnk7aSsrKQotCXsKKyAgICBmb3IgKGk9MDtpPGdpLm51bWJlcl9lbnRyeTtpKyspCisgICAgewogICAgICAgICBpZiAoZG9fZXh0cmFjdF9jdXJyZW50ZmlsZSh1Ziwmb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0X292ZXJ3cml0ZSkgIT0gVU5aX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0X292ZXJ3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQpICE9IFVOWl9PSykKICAgICAgICAgICAgIGJyZWFrOwogCi0JCWlmICgoaSsxKTxnaS5udW1iZXJfZW50cnkpCi0JCXsKLQkJCWVyciA9IHVuekdvVG9OZXh0RmlsZSh1Zik7Ci0JCQlpZiAoZXJyIT1VTlpfT0spCi0JCQl7Ci0JCQkJcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R29Ub05leHRGaWxlXG4iLGVycik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIGlmICgoaSsxKTxnaS5udW1iZXJfZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IHVuekdvVG9OZXh0RmlsZSh1Zik7CisgICAgICAgICAgICBpZiAoZXJyIT1VTlpfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R29Ub05leHRGaWxlXG4iLGVycik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAotaW50IGRvX2V4dHJhY3Rfb25lZmlsZSh1ZixmaWxlbmFtZSxvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsb3B0X292ZXJ3cml0ZSkKLQl1bnpGaWxlIHVmOwotCWNvbnN0IGNoYXIqIGZpbGVuYW1lOwotCWludCBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGg7CitpbnQgZG9fZXh0cmFjdF9vbmVmaWxlKHVmLGZpbGVuYW1lLG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCxvcHRfb3ZlcndyaXRlLHBhc3N3b3JkKQorICAgIHVuekZpbGUgdWY7CisgICAgY29uc3QgY2hhciogZmlsZW5hbWU7CisgICAgaW50IG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsKICAgICBpbnQgb3B0X292ZXJ3cml0ZTsKKyAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKIHsKICAgICBpbnQgZXJyID0gVU5aX09LOwogICAgIGlmICh1bnpMb2NhdGVGaWxlKHVmLGZpbGVuYW1lLENBU0VTRU5TSVRJVklUWSkhPVVOWl9PSykKQEAgLTQxNCw3ICs0MjUsOCBAQAogICAgIH0KIAogICAgIGlmIChkb19leHRyYWN0X2N1cnJlbnRmaWxlKHVmLCZvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRfb3ZlcndyaXRlKSA9PSBVTlpfT0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRfb3ZlcndyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCkgPT0gVU5aX09LKQogICAgICAgICByZXR1cm4gMDsKICAgICBlbHNlCiAgICAgICAgIHJldHVybiAxOwpAQCAtNDIyLDg3ICs0MzQsMTEwIEBACiAKIAogaW50IG1haW4oYXJnYyxhcmd2KQotCWludCBhcmdjOwotCWNoYXIgKmFyZ3ZbXTsKKyAgICBpbnQgYXJnYzsKKyAgICBjaGFyICphcmd2W107CiB7Ci0JY29uc3QgY2hhciAqemlwZmlsZW5hbWU9TlVMTDsKKyAgICBjb25zdCBjaGFyICp6aXBmaWxlbmFtZT1OVUxMOwogICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX3RvX2V4dHJhY3Q9TlVMTDsKLQlpbnQgaTsKLQlpbnQgb3B0X2RvX2xpc3Q9MDsKLQlpbnQgb3B0X2RvX2V4dHJhY3Q9MTsKLQlpbnQgb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGg9MDsKLQlpbnQgb3B0X292ZXJ3cml0ZT0wOwotCWNoYXIgZmlsZW5hbWVfdHJ5WzUxMl07Ci0JdW56RmlsZSB1Zj1OVUxMOworICAgIGNvbnN0IGNoYXIgKnBhc3N3b3JkPU5VTEw7CisgICAgY2hhciBmaWxlbmFtZV90cnlbTUFYRklMRU5BTUUrMTZdID0gIiI7CisgICAgaW50IGk7CisgICAgaW50IG9wdF9kb19saXN0PTA7CisgICAgaW50IG9wdF9kb19leHRyYWN0PTE7CisgICAgaW50IG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoPTA7CisgICAgaW50IG9wdF9vdmVyd3JpdGU9MDsKKyAgICB1bnpGaWxlIHVmPU5VTEw7CiAKLQlkb19iYW5uZXIoKTsKLQlpZiAoYXJnYz09MSkKLQl7Ci0JCWRvX2hlbHAoKTsKLQkJZXhpdCgwKTsKLQl9Ci0JZWxzZQotCXsKLQkJZm9yIChpPTE7aTxhcmdjO2krKykKLQkJewotCQkJaWYgKCgqYXJndltpXSk9PSctJykKLQkJCXsKLQkJCQljb25zdCBjaGFyICpwPWFyZ3ZbaV0rMTsKLQkJCQkKLQkJCQl3aGlsZSAoKCpwKSE9J1wwJykKLQkJCQl7CQkJCi0JCQkJCWNoYXIgYz0qKHArKyk7OwotCQkJCQlpZiAoKGM9PSdsJykgfHwgKGM9PSdMJykpCi0JCQkJCQlvcHRfZG9fbGlzdCA9IDE7Ci0JCQkJCWlmICgoYz09J3YnKSB8fCAoYz09J1YnKSkKLQkJCQkJCW9wdF9kb19saXN0ID0gMTsKLQkJCQkJaWYgKChjPT0neCcpIHx8IChjPT0nWCcpKQotCQkJCQkJb3B0X2RvX2V4dHJhY3QgPSAxOwotCQkJCQlpZiAoKGM9PSdlJykgfHwgKGM9PSdFJykpCi0JCQkJCQlvcHRfZG9fZXh0cmFjdCA9IG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoID0gMTsKLQkJCQkJaWYgKChjPT0nbycpIHx8IChjPT0nTycpKQotCQkJCQkJb3B0X292ZXJ3cml0ZT0xOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKKyAgICBkb19iYW5uZXIoKTsKKyAgICBpZiAoYXJnYz09MSkKKyAgICB7CisgICAgICAgIGRvX2hlbHAoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaT0xO2k8YXJnYztpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKmFyZ3ZbaV0pPT0nLScpCiAgICAgICAgICAgICB7Ci0JCQkJaWYgKHppcGZpbGVuYW1lID09IE5VTEwpCi0JCQkJCXppcGZpbGVuYW1lID0gYXJndltpXTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwPWFyZ3ZbaV0rMTsKKworICAgICAgICAgICAgICAgIHdoaWxlICgoKnApIT0nXDAnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjPSoocCsrKTs7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2wnKSB8fCAoYz09J0wnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19saXN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0ndicpIHx8IChjPT0nVicpKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RvX2xpc3QgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSd4JykgfHwgKGM9PSdYJykpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fZXh0cmFjdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2UnKSB8fCAoYz09J0UnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19leHRyYWN0ID0gb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGggPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdvJykgfHwgKGM9PSdPJykpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKGM9PSdwJykgfHwgKGM9PSdQJykpICYmIChpKzE8YXJnYykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkPWFyZ3ZbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoemlwZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgemlwZmlsZW5hbWUgPSBhcmd2W2ldOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpbGVuYW1lX3RvX2V4dHJhY3Q9PU5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV90b19leHRyYWN0ID0gYXJndltpXSA7CiAgICAgICAgICAgICB9Ci0JCX0KLQl9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoemlwZmlsZW5hbWUhPU5VTEwpCi0JewotCQlzdHJjcHkoZmlsZW5hbWVfdHJ5LHppcGZpbGVuYW1lKTsKLQkJdWYgPSB1bnpPcGVuKHppcGZpbGVuYW1lKTsKLQkJaWYgKHVmPT1OVUxMKQotCQl7Ci0JCQlzdHJjYXQoZmlsZW5hbWVfdHJ5LCIuemlwIik7Ci0JCQl1ZiA9IHVuek9wZW4oZmlsZW5hbWVfdHJ5KTsKLQkJfQotCX0KKyAgICBpZiAoemlwZmlsZW5hbWUhPU5VTEwpCisgICAgewogCi0JaWYgKHVmPT1OVUxMKQotCXsKLQkJcHJpbnRmKCJDYW5ub3Qgb3BlbiAlcyBvciAlcy56aXBcbiIsemlwZmlsZW5hbWUsemlwZmlsZW5hbWUpOwotCQlleGl0ICgxKTsKLQl9CisgICAgICAgICNpZmRlZiBVU0VXSU4zMklPQVBJCisgICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmIGZmdW5jOworICAgICAgICAjZW5kaWYKKworICAgICAgICBzdHJuY3B5KGZpbGVuYW1lX3RyeSwgemlwZmlsZW5hbWUsTUFYRklMRU5BTUUtMSk7CisgICAgICAgIC8qIHN0cm5jcHkgZG9lc250IGFwcGVuZCB0aGUgdHJhaWxpbmcgTlVMTCwgb2YgdGhlIHN0cmluZyBpcyB0b28gbG9uZy4gKi8KKyAgICAgICAgZmlsZW5hbWVfdHJ5WyBNQVhGSUxFTkFNRSBdID0gJ1wwJzsKKworICAgICAgICAjaWZkZWYgVVNFV0lOMzJJT0FQSQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jKCZmZnVuYyk7CisgICAgICAgIHVmID0gdW56T3BlbjIoemlwZmlsZW5hbWUsJmZmdW5jKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgdWYgPSB1bnpPcGVuKHppcGZpbGVuYW1lKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGlmICh1Zj09TlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyY2F0KGZpbGVuYW1lX3RyeSwiLnppcCIpOworICAgICAgICAgICAgI2lmZGVmIFVTRVdJTjMySU9BUEkKKyAgICAgICAgICAgIHVmID0gdW56T3BlbjIoZmlsZW5hbWVfdHJ5LCZmZnVuYyk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgdWYgPSB1bnpPcGVuKGZpbGVuYW1lX3RyeSk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh1Zj09TlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IG9wZW4gJXMgb3IgJXMuemlwXG4iLHppcGZpbGVuYW1lLHppcGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogICAgIHByaW50ZigiJXMgb3BlbmVkXG4iLGZpbGVuYW1lX3RyeSk7CiAKLQlpZiAob3B0X2RvX2xpc3Q9PTEpCi0JCXJldHVybiBkb19saXN0KHVmKTsKLQllbHNlIGlmIChvcHRfZG9fZXh0cmFjdD09MSkKKyAgICBpZiAob3B0X2RvX2xpc3Q9PTEpCisgICAgICAgIHJldHVybiBkb19saXN0KHVmKTsKKyAgICBlbHNlIGlmIChvcHRfZG9fZXh0cmFjdD09MSkKICAgICB7CiAgICAgICAgIGlmIChmaWxlbmFtZV90b19leHRyYWN0ID09IE5VTEwpCi0JCSAgICByZXR1cm4gZG9fZXh0cmFjdCh1ZixvcHRfZG9fZXh0cmFjdF93aXRob3V0cGF0aCxvcHRfb3ZlcndyaXRlKTsKKyAgICAgICAgICAgIHJldHVybiBkb19leHRyYWN0KHVmLG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoLG9wdF9vdmVyd3JpdGUscGFzc3dvcmQpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICByZXR1cm4gZG9fZXh0cmFjdF9vbmVmaWxlKHVmLGZpbGVuYW1lX3RvX2V4dHJhY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoLG9wdF9vdmVyd3JpdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fZXh0cmFjdF93aXRob3V0cGF0aCxvcHRfb3ZlcndyaXRlLHBhc3N3b3JkKTsKICAgICB9Ci0JdW56Q2xvc2VDdXJyZW50RmlsZSh1Zik7CisgICAgdW56Q2xvc2VDdXJyZW50RmlsZSh1Zik7CiAKLQlyZXR1cm4gMDsgIC8qIHRvIGF2b2lkIHdhcm5pbmcgKi8KKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluaXppcC9taW5pemlwLmMgYi9jb250cmliL21pbml6aXAvbWluaXppcC5jCmluZGV4IDVlNDkyZDIuLjU3OTJhMWUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbWluaXppcC9taW5pemlwLmMKKysrIGIvY29udHJpYi9taW5pemlwL21pbml6aXAuYwpAQCAtMTcsNiArMTcsMTIgQEAKIAogI2luY2x1ZGUgInppcC5oIgogCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgVVNFV0lOMzJJT0FQSQorI2luY2x1ZGUgImlvd2luMzIuaCIKKyNlbmRpZgorCisKIAogI2RlZmluZSBXUklURUJVRkZFUlNJWkUgKDE2Mzg0KQogI2RlZmluZSBNQVhGSUxFTkFNRSAoMjU2KQpAQCAtNTUsMTIgKzYxLDE2IEBACiAgIHN0cnVjdCBzdGF0IHM7ICAgICAgICAvKiByZXN1bHRzIG9mIHN0YXQoKSAqLwogICBzdHJ1Y3QgdG0qIGZpbGVkYXRlOwogICB0aW1lX3QgdG1fdD0wOwotICAKKwogICBpZiAoc3RyY21wKGYsIi0iKSE9MCkKICAgewotICAgIGNoYXIgbmFtZVtNQVhGSUxFTkFNRV07CisgICAgY2hhciBuYW1lW01BWEZJTEVOQU1FKzFdOwogICAgIGludCBsZW4gPSBzdHJsZW4oZik7Ci0gICAgc3RyY3B5KG5hbWUsIGYpOworCisgICAgc3RybmNweShuYW1lLCBmLE1BWEZJTEVOQU1FLTEpOworICAgIC8qIHN0cm5jcHkgZG9lc250IGFwcGVuZCB0aGUgdHJhaWxpbmcgTlVMTCwgb2YgdGhlIHN0cmluZyBpcyB0b28gbG9uZy4gKi8KKyAgICBuYW1lWyBNQVhGSUxFTkFNRSBdID0gJ1wwJzsKKwogICAgIGlmIChuYW1lW2xlbiAtIDFdID09ICcvJykKICAgICAgIG5hbWVbbGVuIC0gMV0gPSAnXDAnOwogICAgIC8qIG5vdCBhbGwgc3lzdGVtcyBhbGxvdyBzdGF0J2luZyBhIGZpbGUgd2l0aCAvIGFwcGVuZGVkICovCkBAIC05OCwxMCArMTA4LDEwIEBACiBpbnQgY2hlY2tfZXhpc3RfZmlsZShmaWxlbmFtZSkKICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKIHsKLQlGSUxFKiBmdGVzdGV4aXN0OworICAgIEZJTEUqIGZ0ZXN0ZXhpc3Q7CiAgICAgaW50IHJldCA9IDE7Ci0JZnRlc3RleGlzdCA9IGZvcGVuKGZpbGVuYW1lLCJyYiIpOwotCWlmIChmdGVzdGV4aXN0PT1OVUxMKQorICAgIGZ0ZXN0ZXhpc3QgPSBmb3BlbihmaWxlbmFtZSwicmIiKTsKKyAgICBpZiAoZnRlc3RleGlzdD09TlVMTCkKICAgICAgICAgcmV0ID0gMDsKICAgICBlbHNlCiAgICAgICAgIGZjbG9zZShmdGVzdGV4aXN0KTsKQEAgLTExMCw1OSArMTIwLDEwNyBAQAogCiB2b2lkIGRvX2Jhbm5lcigpCiB7Ci0JcHJpbnRmKCJNaW5pWmlwIDAuMTUsIGRlbW8gb2YgekxpYiArIFppcCBwYWNrYWdlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnRcbiIpOwotCXByaW50ZigibW9yZSBpbmZvIGF0IGh0dHA6Ly93d3d3LndpbmltYWdlL3pMaWJEbGwvdW56aXAuaHRtXG5cbiIpOworICAgIHByaW50ZigiTWluaVppcCAwLjE1LCBkZW1vIG9mIHpMaWIgKyBaaXAgcGFja2FnZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50XG4iKTsKKyAgICBwcmludGYoIm1vcmUgaW5mbyBhdCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWxcblxuIik7CiB9CiAKIHZvaWQgZG9faGVscCgpCi17CQotCXByaW50ZigiVXNhZ2UgOiBtaW5pemlwIFstb10gZmlsZS56aXAgW2ZpbGVzX3RvX2FkZF1cblxuIikgOworeworICAgIHByaW50ZigiVXNhZ2UgOiBtaW5pemlwIFstb10gZmlsZS56aXAgW2ZpbGVzX3RvX2FkZF1cblxuIikgOworfQorCisvKiBjYWxjdWxhdGUgdGhlIENSQzMyIG9mIGEgZmlsZSwKKyAgIGJlY2F1c2UgdG8gZW5jcnlwdCBhIGZpbGUsIHdlIG5lZWQga25vd24gdGhlIENSQzMyIG9mIHRoZSBmaWxlIGJlZm9yZSAqLworaW50IGdldEZpbGVDcmMoY29uc3QgY2hhciogZmlsZW5hbWVpbnppcCx2b2lkKmJ1Zix1bnNpZ25lZCBsb25nIHNpemVfYnVmLHVuc2lnbmVkIGxvbmcqIHJlc3VsdF9jcmMpCit7CisgICB1bnNpZ25lZCBsb25nIGNhbGN1bGF0ZV9jcmM9MDsKKyAgIGludCBlcnI9WklQX09LOworICAgRklMRSAqIGZpbiA9IGZvcGVuKGZpbGVuYW1laW56aXAsInJiIik7CisgICB1bnNpZ25lZCBsb25nIHNpemVfcmVhZCA9IDA7CisgICB1bnNpZ25lZCBsb25nIHRvdGFsX3JlYWQgPSAwOworICAgaWYgKGZpbj09TlVMTCkKKyAgIHsKKyAgICAgICBlcnIgPSBaSVBfRVJSTk87CisgICB9CisKKyAgICBpZiAoZXJyID09IFpJUF9PSykKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gWklQX09LOworICAgICAgICAgICAgc2l6ZV9yZWFkID0gKGludClmcmVhZChidWYsMSxzaXplX2J1ZixmaW4pOworICAgICAgICAgICAgaWYgKHNpemVfcmVhZCA8IHNpemVfYnVmKQorICAgICAgICAgICAgICAgIGlmIChmZW9mKGZpbik9PTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiByZWFkaW5nICVzXG4iLGZpbGVuYW1laW56aXApOworICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpemVfcmVhZD4wKQorICAgICAgICAgICAgICAgIGNhbGN1bGF0ZV9jcmMgPSBjcmMzMihjYWxjdWxhdGVfY3JjLGJ1ZixzaXplX3JlYWQpOworICAgICAgICAgICAgdG90YWxfcmVhZCArPSBzaXplX3JlYWQ7CisKKyAgICAgICAgfSB3aGlsZSAoKGVyciA9PSBaSVBfT0spICYmIChzaXplX3JlYWQ+MCkpOworCisgICAgaWYgKGZpbikKKyAgICAgICAgZmNsb3NlKGZpbik7CisKKyAgICAqcmVzdWx0X2NyYz1jYWxjdWxhdGVfY3JjOworICAgIHByaW50ZigiZmlsZSAlcyBjcmMgJXhcbiIsZmlsZW5hbWVpbnppcCxjYWxjdWxhdGVfY3JjKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBpbnQgbWFpbihhcmdjLGFyZ3YpCi0JaW50IGFyZ2M7Ci0JY2hhciAqYXJndltdOworICAgIGludCBhcmdjOworICAgIGNoYXIgKmFyZ3ZbXTsKIHsKLQlpbnQgaTsKLQlpbnQgb3B0X292ZXJ3cml0ZT0wOworICAgIGludCBpOworICAgIGludCBvcHRfb3ZlcndyaXRlPTA7CiAgICAgaW50IG9wdF9jb21wcmVzc19sZXZlbD1aX0RFRkFVTFRfQ09NUFJFU1NJT047CiAgICAgaW50IHppcGZpbGVuYW1lYXJnID0gMDsKLQljaGFyIGZpbGVuYW1lX3RyeVtNQVhGSUxFTkFNRV07CisgICAgY2hhciBmaWxlbmFtZV90cnlbTUFYRklMRU5BTUUrMTZdOwogICAgIGludCB6aXBvazsKICAgICBpbnQgZXJyPTA7CiAgICAgaW50IHNpemVfYnVmPTA7Ci0gICAgdm9pZCogYnVmPU5VTEwsCisgICAgdm9pZCogYnVmPU5VTEw7CisgICAgY29uc3QgY2hhciogcGFzc3dvcmQ9TlVMTDsKIAogCi0JZG9fYmFubmVyKCk7Ci0JaWYgKGFyZ2M9PTEpCi0JewotCQlkb19oZWxwKCk7Ci0JCWV4aXQoMCk7CisgICAgZG9fYmFubmVyKCk7CisgICAgaWYgKGFyZ2M9PTEpCisgICAgeworICAgICAgICBkb19oZWxwKCk7CiAgICAgICAgIHJldHVybiAwOwotCX0KLQllbHNlCi0JewotCQlmb3IgKGk9MTtpPGFyZ2M7aSsrKQotCQl7Ci0JCQlpZiAoKCphcmd2W2ldKT09Jy0nKQotCQkJewotCQkJCWNvbnN0IGNoYXIgKnA9YXJndltpXSsxOwotCQkJCQotCQkJCXdoaWxlICgoKnApIT0nXDAnKQotCQkJCXsJCQkKLQkJCQkJY2hhciBjPSoocCsrKTs7Ci0JCQkJCWlmICgoYz09J28nKSB8fCAoYz09J08nKSkKLQkJCQkJCW9wdF9vdmVyd3JpdGUgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGk9MTtpPGFyZ2M7aSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKCphcmd2W2ldKT09Jy0nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnA9YXJndltpXSsxOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCgqcCkhPSdcMCcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGM9KihwKyspOzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0nbycpIHx8IChjPT0nTycpKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2EnKSB8fCAoYz09J0EnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9vdmVyd3JpdGUgPSAyOwogICAgICAgICAgICAgICAgICAgICBpZiAoKGM+PScwJykgJiYgKGM8PSc5JykpCiAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfY29tcHJlc3NfbGV2ZWwgPSBjLScwJzsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJaWYgKHppcGZpbGVuYW1lYXJnID09IDApCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoYz09J3AnKSB8fCAoYz09J1AnKSkgJiYgKGkrMTxhcmdjKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ9YXJndltpKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlmICh6aXBmaWxlbmFtZWFyZyA9PSAwKQogICAgICAgICAgICAgICAgICAgICB6aXBmaWxlbmFtZWFyZyA9IGkgOwotCQl9Ci0JfQorICAgICAgICB9CisgICAgfQogCiAgICAgc2l6ZV9idWYgPSBXUklURUJVRkZFUlNJWkU7CiAgICAgYnVmID0gKHZvaWQqKW1hbGxvYyhzaXplX2J1Zik7CkBAIC0xNzIsMTYgKzIzMCwxOSBAQAogICAgICAgICByZXR1cm4gWklQX0lOVEVSTkFMRVJST1I7CiAgICAgfQogCi0JaWYgKHppcGZpbGVuYW1lYXJnPT0wKQorICAgIGlmICh6aXBmaWxlbmFtZWFyZz09MCkKICAgICAgICAgemlwb2s9MDsKICAgICBlbHNlCi0JeworICAgIHsKICAgICAgICAgaW50IGksbGVuOwogICAgICAgICBpbnQgZG90X2ZvdW5kPTA7CiAKICAgICAgICAgemlwb2sgPSAxIDsKLQkJc3RyY3B5KGZpbGVuYW1lX3RyeSxhcmd2W3ppcGZpbGVuYW1lYXJnXSk7Ci0gICAgICAgIGxlbj1zdHJsZW4oZmlsZW5hbWVfdHJ5KTsKKyAgICAgICAgc3RybmNweShmaWxlbmFtZV90cnksIGFyZ3ZbemlwZmlsZW5hbWVhcmddLE1BWEZJTEVOQU1FLTEpOworICAgICAgICAvKiBzdHJuY3B5IGRvZXNudCBhcHBlbmQgdGhlIHRyYWlsaW5nIE5VTEwsIG9mIHRoZSBzdHJpbmcgaXMgdG9vIGxvbmcuICovCisgICAgICAgIGZpbGVuYW1lX3RyeVsgTUFYRklMRU5BTUUgXSA9ICdcMCc7CisKKyAgICAgICAgbGVuPShpbnQpc3RybGVuKGZpbGVuYW1lX3RyeSk7CiAgICAgICAgIGZvciAoaT0wO2k8bGVuO2krKykKICAgICAgICAgICAgIGlmIChmaWxlbmFtZV90cnlbaV09PScuJykKICAgICAgICAgICAgICAgICBkb3RfZm91bmQ9MTsKQEAgLTE4OSwzNiArMjUwLDUyIEBACiAgICAgICAgIGlmIChkb3RfZm91bmQ9PTApCiAgICAgICAgICAgICBzdHJjYXQoZmlsZW5hbWVfdHJ5LCIuemlwIik7CiAKKyAgICAgICAgaWYgKG9wdF9vdmVyd3JpdGU9PTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlmIHRoZSBmaWxlIGRvbid0IGV4aXN0LCB3ZSBub3QgYXBwZW5kIGZpbGUgKi8KKyAgICAgICAgICAgIGlmIChjaGVja19leGlzdF9maWxlKGZpbGVuYW1lX3RyeSk9PTApCisgICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZT0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKICAgICAgICAgaWYgKG9wdF9vdmVyd3JpdGU9PTApCiAgICAgICAgICAgICBpZiAoY2hlY2tfZXhpc3RfZmlsZShmaWxlbmFtZV90cnkpIT0wKQotCQkJewotICAgICAgICAgICAgICAgIGNoYXIgcmVwOwotCQkJCWRvCi0JCQkJewotCQkJCQljaGFyIGFuc3dlclsxMjhdOwotCQkJCQlwcmludGYoIlRoZSBmaWxlICVzIGV4aXN0LiBPdmVyd3JpdGUgPyBbeV1lcywgW25dbyA6ICIsZmlsZW5hbWVfdHJ5KTsKLQkJCQkJc2NhbmYoIiUxcyIsYW5zd2VyKTsKLQkJCQkJcmVwID0gYW5zd2VyWzBdIDsKLQkJCQkJaWYgKChyZXA+PSdhJykgJiYgKHJlcDw9J3onKSkKLQkJCQkJCXJlcCAtPSAweDIwOwotCQkJCX0KLQkJCQl3aGlsZSAoKHJlcCE9J1knKSAmJiAocmVwIT0nTicpKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIHJlcD0wOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGFuc3dlclsxMjhdOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRoZSBmaWxlICVzIGV4aXN0LiBPdmVyd3JpdGUgPyBbeV1lcywgW25dbywgW2FdcHBlbmQgOiAiLGZpbGVuYW1lX3RyeSk7CisgICAgICAgICAgICAgICAgICAgIHNjYW5mKCIlMXMiLGFuc3dlcik7CisgICAgICAgICAgICAgICAgICAgIHJlcCA9IGFuc3dlclswXSA7CisgICAgICAgICAgICAgICAgICAgIGlmICgocmVwPj0nYScpICYmIChyZXA8PSd6JykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXAgLT0gMHgyMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKChyZXAhPSdZJykgJiYgKHJlcCE9J04nKSAmJiAocmVwIT0nQScpKTsKICAgICAgICAgICAgICAgICBpZiAocmVwPT0nTicpCiAgICAgICAgICAgICAgICAgICAgIHppcG9rID0gMDsKLQkJCX0KKyAgICAgICAgICAgICAgICBpZiAocmVwPT0nQScpCisgICAgICAgICAgICAgICAgICAgIG9wdF9vdmVyd3JpdGUgPSAyOworICAgICAgICAgICAgfQogICAgIH0KIAogICAgIGlmICh6aXBvaz09MSkKICAgICB7CiAgICAgICAgIHppcEZpbGUgemY7CiAgICAgICAgIGludCBlcnJjbG9zZTsKLSAgICAgICAgemYgPSB6aXBPcGVuKGZpbGVuYW1lX3RyeSwwKTsKKyAgICAgICAgI2lmZGVmIFVTRVdJTjMySU9BUEkKKyAgICAgICAgemxpYl9maWxlZnVuY19kZWYgZmZ1bmM7CisgICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmMoJmZmdW5jKTsKKyAgICAgICAgemYgPSB6aXBPcGVuMihmaWxlbmFtZV90cnksKG9wdF9vdmVyd3JpdGU9PTIpID8gMiA6IDAsTlVMTCwmZmZ1bmMpOworICAgICAgICAjZWxzZQorICAgICAgICB6ZiA9IHppcE9wZW4oZmlsZW5hbWVfdHJ5LChvcHRfb3ZlcndyaXRlPT0yKSA/IDIgOiAwKTsKKyAgICAgICAgI2VuZGlmCisKICAgICAgICAgaWYgKHpmID09IE5VTEwpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByaW50ZigiZXJyb3Igb3BlbmluZyAlc1xuIixmaWxlbmFtZV90cnkpOwogICAgICAgICAgICAgZXJyPSBaSVBfRVJSTk87CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSAKKyAgICAgICAgZWxzZQogICAgICAgICAgICAgcHJpbnRmKCJjcmVhdGluZyAlc1xuIixmaWxlbmFtZV90cnkpOwogCiAgICAgICAgIGZvciAoaT16aXBmaWxlbmFtZWFyZysxOyhpPGFyZ2MpICYmIChlcnI9PVpJUF9PSyk7aSsrKQpAQCAtMjI5LDE5ICszMDYsMzEgQEAKICAgICAgICAgICAgICAgICBpbnQgc2l6ZV9yZWFkOwogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1laW56aXAgPSBhcmd2W2ldOwogICAgICAgICAgICAgICAgIHppcF9maWxlaW5mbyB6aTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNyY0ZpbGU9MDsKIAotICAgICAgICAgICAgICAgIHppLnRtel9kYXRlLnRtX3NlYyA9IHppLnRtel9kYXRlLnRtX21pbiA9IHppLnRtel9kYXRlLnRtX2hvdXIgPSAKLSAgICAgICAgICAgICAgICB6aS50bXpfZGF0ZS50bV9tZGF5ID0gemkudG16X2RhdGUudG1fbWluID0gemkudG16X2RhdGUudG1feWVhciA9IDA7CisgICAgICAgICAgICAgICAgemkudG16X2RhdGUudG1fc2VjID0gemkudG16X2RhdGUudG1fbWluID0gemkudG16X2RhdGUudG1faG91ciA9CisgICAgICAgICAgICAgICAgemkudG16X2RhdGUudG1fbWRheSA9IHppLnRtel9kYXRlLnRtX21vbiA9IHppLnRtel9kYXRlLnRtX3llYXIgPSAwOwogICAgICAgICAgICAgICAgIHppLmRvc0RhdGUgPSAwOwogICAgICAgICAgICAgICAgIHppLmludGVybmFsX2ZhID0gMDsKICAgICAgICAgICAgICAgICB6aS5leHRlcm5hbF9mYSA9IDA7CiAgICAgICAgICAgICAgICAgZmlsZXRpbWUoZmlsZW5hbWVpbnppcCwmemkudG16X2RhdGUsJnppLmRvc0RhdGUpOwogCi0KKy8qCiAgICAgICAgICAgICAgICAgZXJyID0gemlwT3Blbk5ld0ZpbGVJblppcCh6ZixmaWxlbmFtZWluemlwLCZ6aSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCAvKiBjb21tZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwgLyAqIGNvbW1lbnQgKiAvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdF9jb21wcmVzc19sZXZlbCAhPSAwKSA/IFpfREVGTEFURUQgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2NvbXByZXNzX2xldmVsKTsKKyovCisgICAgICAgICAgICAgICAgaWYgKChwYXNzd29yZCAhPSBOVUxMKSAmJiAoZXJyPT1aSVBfT0spKQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBnZXRGaWxlQ3JjKGZpbGVuYW1laW56aXAsYnVmLHNpemVfYnVmLCZjcmNGaWxlKTsKKworICAgICAgICAgICAgICAgIGVyciA9IHppcE9wZW5OZXdGaWxlSW5aaXAzKHpmLGZpbGVuYW1laW56aXAsJnppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMIC8qIGNvbW1lbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRfY29tcHJlc3NfbGV2ZWwgIT0gMCkgPyBaX0RFRkxBVEVEIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9jb21wcmVzc19sZXZlbCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsY3JjRmlsZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IFpJUF9PSykKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiBvcGVuaW5nICVzIGluIHppcGZpbGVcbiIsZmlsZW5hbWVpbnppcCk7CkBAIC0yNTksNyArMzQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gWklQX09LOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9yZWFkID0gZnJlYWQoYnVmLDEsc2l6ZV9idWYsZmluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfcmVhZCA9IChpbnQpZnJlYWQoYnVmLDEsc2l6ZV9idWYsZmluKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3JlYWQgPCBzaXplX2J1ZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVvZihmaW4pPT0wKQogICAgICAgICAgICAgICAgICAgICAgICAgewpAQCAtMjc1LDE1ICszNjQsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiB3cml0aW5nICVzIGluIHRoZSB6aXBmaWxlXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1laW56aXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKGVyciA9PSBaSVBfT0spICYmIChzaXplX3JlYWQ+MCkpOwogCi0gICAgICAgICAgICAgICAgZmNsb3NlKGZpbik7CisgICAgICAgICAgICAgICAgaWYgKGZpbikKKyAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZpbik7CisKICAgICAgICAgICAgICAgICBpZiAoZXJyPDApCiAgICAgICAgICAgICAgICAgICAgIGVycj1aSVBfRVJSTk87CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gemlwQ2xvc2VGaWxlSW5aaXAoemYpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIT1aSVBfT0spCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIGNsb3NpbmcgJXMgaW4gdGhlIHppcGZpbGVcbiIsCkBAIC0yOTcsNiArMzg4LDUgQEAKICAgIH0KIAogICAgIGZyZWUoYnVmKTsKLSAgICBleGl0KDApOwotCXJldHVybiAwOyAgLyogdG8gYXZvaWQgd2FybmluZyAqLworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL3JlYWRtZS50eHQgYi9jb250cmliL21pbml6aXAvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjMDIzYy4uMDAwMDAwMAotLS0gYS9jb250cmliL21pbml6aXAvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLQotVW5aaXAgMC4xNSBhZGRpdGlvbm5hbCBsaWJyYXJ5Ci0KLQotICBUaGlzIHVuemlwIHBhY2thZ2UgYWxsb3cgZXh0cmFjdCBmaWxlIGZyb20gLlpJUCBmaWxlLCBjb21wYXRpYmxlIHdpdGggCi1QS1ppcCAyLjA0ZywgV2luWmlwLCBJbmZvWmlwIHRvb2xzIGFuZCBjb21wYXRpYmxlLgotCi0gIE11bHRpIHZvbHVtZSBaaXBGaWxlIChzcGFuKSBhcmUgbm90IHN1cHBvcnRlZCwgYW5kIG9sZCBjb21wcmVzc2lvbiB1c2VkIGJ5IG9sZCAKLVBLWmlwIDEueCBhcmUgbm90IHN1cHBvcnRlZC4KLQotU2VlIHByb2JkZXNjLnppcCBmcm9tIFBLV2FyZSBmb3Igc3BlY2lmaWNhdGlvbiBvZiAuWklQIGZvcm1hdC4KLQotV2hhdCBpcyBVbnppcAotICBUaGUgWmxpYiBsaWJyYXJ5IHN1cHBvcnQgdGhlIGRlZmxhdGUgY29tcHJlc3Npb24gYW5kIHRoZSBjcmVhdGlvbiBvZiBnemlwICguZ3opIAotZmlsZS4gWmxpYiBpcyBmcmVlIGFuZCBzbWFsbC4KLSAgVGhlIC5aaXAgZm9ybWF0LCB3aGljaCBjYW4gY29udGFpbiBzZXZlcmFsIGNvbXByZXNzZWQgZmlsZXMgKC5neiBjYW4gY29udGFpbnQKLW9ubHkgb25lIGZpbGUpIGlzIGEgdmVyeSBwb3B1bGFyIGZvcm1hdC4gVGhpcyBpcyB3aHkgSSd2ZSB3cml0dGVuIGEgcGFja2FnZSBmb3IgcmVhZGluZyBmaWxlIGNvbXByZXNzZWQgaW4gWmlwZmlsZS4KLQotVXNpbmcgVW56aXAgcGFja2FnZQotCi1Zb3UgbmVlZCBzb3VyY2Ugb2YgWmxpYiAoZ2V0IHpsaWIxMTEuemlwIGFuZCByZWFkIHpsaWIuaCkuCi1HZXQgdW56bGIwMTUuemlwIGFuZCByZWFkIHVuemlwLmggKHdoaXRoIGRvY3VtZW50YXRpb24gb2YgdW56aXAgZnVuY3Rpb25zKQotCi1UaGUgVW56aXAgcGFja2FnZSBpcyBvbmx5IHR3byBmaWxlIDogdW56aXAuaCBhbmQgdW56aXAuYy4gQnV0IGl0IHVzZSB0aGUgWmxpYiAKLSAgZmlsZXMuCi11bnp0c3QuYyBpcyBhIHNpbXBsZSBzYW1wbGUgcHJvZ3JhbSwgd2hpY2ggbGlzdCBmaWxlIGluIGEgemlwZmlsZSBhbmQgZGlzcGxheQotICBSRUFETUUuVFhUIG9yIEZJTEVfSUQuRElaIChpZiB0aGVzZSBmaWxlcyBhcmUgZm91bmQpLgotbWluaXVuei5jIGlzIGEgbWluaSB1bnppcCBwcm9ncmFtLgotCi1JJ20gYWxzbyBjdXJyZW5seXQgd3JpdGluZyBhIHppcHBpbmcgcG9ydGlvbiAoemlwLmgsIHppcC5jIGFuZCB0ZXN0IHdpdGggbWluaXppcC5jKQotCi1QbGVhc2UgZW1haWwgbWUgZm9yIGZlZWRiYWNrLgotSSBob3BlIG15IHNvdXJjZSBpcyBjb21wYXRpYmxlIHdpdGggVW5peCBzeXN0ZW0sIGJ1dCBJIG5lZWQgeW91ciBoZWxwIGZvciBiZSBzdXJlCi0KLUxhdGVzdCByZXZpc2lvbiA6IE1hciAwNHRoLCAxOTk4Ci0KLUNoZWNrIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbCBmb3IgdXAgdG8gZGF0ZSBpbmZvLgpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL3VuemlwLmMgYi9jb250cmliL21pbml6aXAvdW56aXAuYwppbmRleCBmZjcxYTQ3Li43MjQ0NTIzIDEwMDY0NAotLS0gYS9jb250cmliL21pbml6aXAvdW56aXAuYworKysgYi9jb250cmliL21pbml6aXAvdW56aXAuYwpAQCAtMSw5ICsxLDM5IEBACi0vKiB1bnppcC5jIC0tIElPIG9uIC56aXAgZmlsZXMgdXNpbmcgemxpYiAKLSAgIFZlcnNpb24gMC4xNSBiZXRhLCBNYXIgMTl0aCwgMTk5OCwKKy8qIHVuemlwLmMgLS0gSU8gZm9yIHVuY29tcHJlc3MgLnppcCBmaWxlcyB1c2luZyB6bGliCisgICBWZXJzaW9uIDAuMjEgd2l0aCBlbmNyeXB0aW9uLCBNYXJjaCAxMHRoLCAyMDAzCisKKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIEdpbGxlcyBWb2xsYW50CiAKICAgIFJlYWQgdW56aXAuaCBmb3IgbW9yZSBpbmZvCiAqLwogCisvKiBEZWNyeXB0aW9uIGNvZGUgY29tZXMgZnJvbSBjcnlwdC5jIGJ5IEluZm8tWklQIGJ1dCBoYXMgYmVlbiBncmVhdGx5IHJlZHVjZWQgaW4gdGVybXMgb2YKK2NvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBzb2Z0d2FyZS4gVGhlIGZvbGxvd2luZyBpcyBmcm9tIHRoZSBvcmlnaW5hbCBjcnlwdC5jLiBDb2RlCit3b3ZlbiBpbiBieSBUZXJyeSBUaG9yc2VuIDEvMjAwMy4KKyovCisvKgorICBDb3B5cmlnaHQgKGMpIDE5OTAtMjAwMCBJbmZvLVpJUC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgU2VlIHRoZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFLCB2ZXJzaW9uIDIwMDAtQXByLTA5IG9yIGxhdGVyCisgICh0aGUgY29udGVudHMgb2Ygd2hpY2ggYXJlIGFsc28gaW5jbHVkZWQgaW4gemlwLmgpIGZvciB0ZXJtcyBvZiB1c2UuCisgIElmLCBmb3Igc29tZSByZWFzb24sIGFsbCB0aGVzZSBmaWxlcyBhcmUgbWlzc2luZywgdGhlIEluZm8tWklQIGxpY2Vuc2UKKyAgYWxzbyBtYXkgYmUgZm91bmQgYXQ6ICBmdHA6Ly9mdHAuaW5mby16aXAub3JnL3B1Yi9pbmZvemlwL2xpY2Vuc2UuaHRtbAorKi8KKy8qCisgIGNyeXB0LmMgKGZ1bGwgdmVyc2lvbikgYnkgSW5mby1aSVAuICAgICAgTGFzdCByZXZpc2VkOiAgW3NlZSBjcnlwdC5oXQorCisgIFRoZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcGFydHMgb2YgdGhpcyBzb3VyY2UgY29kZSAoYXMgb3Bwb3NlZCB0byB0aGUKKyAgbm9uLWVjaG9pbmcgcGFzc3dvcmQgcGFydHMpIHdlcmUgb3JpZ2luYWxseSB3cml0dGVuIGluIEV1cm9wZS4gIFRoZQorICB3aG9sZSBzb3VyY2UgcGFja2FnZSBjYW4gYmUgZnJlZWx5IGRpc3RyaWJ1dGVkLCBpbmNsdWRpbmcgZnJvbSB0aGUgVVNBLgorICAoUHJpb3IgdG8gSmFudWFyeSAyMDAwLCByZS1leHBvcnQgZnJvbSB0aGUgVVMgd2FzIGEgdmlvbGF0aW9uIG9mIFVTIGxhdy4pCisgKi8KKworLyoKKyAgVGhpcyBlbmNyeXB0aW9uIGNvZGUgaXMgYSBkaXJlY3QgdHJhbnNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtIGZyb20KKyAgUm9nZXIgU2NobGFmbHksIGRlc2NyaWJlZCBieSBQaGlsIEthdHogaW4gdGhlIGZpbGUgYXBwbm90ZS50eHQuICBUaGlzCisgIGZpbGUgKGFwcG5vdGUudHh0KSBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBQS1pJUCBwcm9ncmFtIChldmVuIGluIHRoZQorICB2ZXJzaW9uIHdpdGhvdXQgZW5jcnlwdGlvbiBjYXBhYmlsaXRpZXMpLgorICovCisKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC01NSwyMiArODUsMTAgQEAKICNkZWZpbmUgU0laRVpJUExPQ0FMSEVBREVSICgweDFlKQogCiAKLS8qIEkndmUgZm91bmQgYW4gb2xkIFVuaXggKGEgU3VuT1MgNC4xLjNfVTEpIHdpdGhvdXQgYWxsIFNFRUtfKiBkZWZpbmVkLi4uLiAqLwogCi0jaWZuZGVmIFNFRUtfQ1VSCi0jZGVmaW5lIFNFRUtfQ1VSICAgIDEKLSNlbmRpZgotCi0jaWZuZGVmIFNFRUtfRU5ECi0jZGVmaW5lIFNFRUtfRU5EICAgIDIKLSNlbmRpZgotCi0jaWZuZGVmIFNFRUtfU0VUCi0jZGVmaW5lIFNFRUtfU0VUICAgIDAKLSNlbmRpZgogCiBjb25zdCBjaGFyIHVuel9jb3B5cmlnaHRbXSA9Ci0gICAiIHVuemlwIDAuMTUgQ29weXJpZ2h0IDE5OTggR2lsbGVzIFZvbGxhbnQgIjsKKyAgICIgdW56aXAgMC4yMSBDb3B5cmlnaHQgMTk5OC0yMDAzIEdpbGxlcyBWb2xsYW50IC0gaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbCI7CiAKIC8qIHVuel9maWxlX2luZm9faW50ZXJudGFsIGNvbnRhaW4gaW50ZXJuYWwgaW5mbyBhYm91dCBhIGZpbGUgaW4gemlwZmlsZSovCiB0eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9pbmZvX2ludGVybmFsX3MKQEAgLTgzLDIzICsxMDEsMjUgQEAKICAgICB3aGVuIHJlYWRpbmcgYW5kIGRlY29tcHJlc3MgaXQgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0JY2hhciAgKnJlYWRfYnVmZmVyOyAgICAgICAgIC8qIGludGVybmFsIGJ1ZmZlciBmb3IgY29tcHJlc3NlZCBkYXRhICovCi0Jel9zdHJlYW0gc3RyZWFtOyAgICAgICAgICAgIC8qIHpMaWIgc3RyZWFtIHN0cnVjdHVyZSBmb3IgaW5mbGF0ZSAqLworICAgIGNoYXIgICpyZWFkX2J1ZmZlcjsgICAgICAgICAvKiBpbnRlcm5hbCBidWZmZXIgZm9yIGNvbXByZXNzZWQgZGF0YSAqLworICAgIHpfc3RyZWFtIHN0cmVhbTsgICAgICAgICAgICAvKiB6TGliIHN0cmVhbSBzdHJ1Y3R1cmUgZm9yIGluZmxhdGUgKi8KIAotCXVMb25nIHBvc19pbl96aXBmaWxlOyAgICAgICAvKiBwb3NpdGlvbiBpbiBieXRlIG9uIHRoZSB6aXBmaWxlLCBmb3IgZnNlZWsqLwotCXVMb25nIHN0cmVhbV9pbml0aWFsaXNlZDsgICAvKiBmbGFnIHNldCBpZiBzdHJlYW0gc3RydWN0dXJlIGlzIGluaXRpYWxpc2VkKi8KKyAgICB1TG9uZyBwb3NfaW5femlwZmlsZTsgICAgICAgLyogcG9zaXRpb24gaW4gYnl0ZSBvbiB0aGUgemlwZmlsZSwgZm9yIGZzZWVrKi8KKyAgICB1TG9uZyBzdHJlYW1faW5pdGlhbGlzZWQ7ICAgLyogZmxhZyBzZXQgaWYgc3RyZWFtIHN0cnVjdHVyZSBpcyBpbml0aWFsaXNlZCovCiAKLQl1TG9uZyBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsvKiBvZmZzZXQgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkICovCi0JdUludCAgc2l6ZV9sb2NhbF9leHRyYWZpZWxkOy8qIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkICovCi0JdUxvbmcgcG9zX2xvY2FsX2V4dHJhZmllbGQ7ICAgLyogcG9zaXRpb24gaW4gdGhlIGxvY2FsIGV4dHJhIGZpZWxkIGluIHJlYWQqLworICAgIHVMb25nIG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOy8qIG9mZnNldCBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgKi8KKyAgICB1SW50ICBzaXplX2xvY2FsX2V4dHJhZmllbGQ7Lyogc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgKi8KKyAgICB1TG9uZyBwb3NfbG9jYWxfZXh0cmFmaWVsZDsgICAvKiBwb3NpdGlvbiBpbiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgaW4gcmVhZCovCiAKLQl1TG9uZyBjcmMzMjsgICAgICAgICAgICAgICAgLyogY3JjMzIgb2YgYWxsIGRhdGEgdW5jb21wcmVzc2VkICovCi0JdUxvbmcgY3JjMzJfd2FpdDsgICAgICAgICAgIC8qIGNyYzMyIHdlIG11c3Qgb2J0YWluIGFmdGVyIGRlY29tcHJlc3MgYWxsICovCi0JdUxvbmcgcmVzdF9yZWFkX2NvbXByZXNzZWQ7IC8qIG51bWJlciBvZiBieXRlIHRvIGJlIGRlY29tcHJlc3NlZCAqLwotCXVMb25nIHJlc3RfcmVhZF91bmNvbXByZXNzZWQ7LypudW1iZXIgb2YgYnl0ZSB0byBiZSBvYnRhaW5lZCBhZnRlciBkZWNvbXAqLwotCUZJTEUqIGZpbGU7ICAgICAgICAgICAgICAgICAvKiBpbyBzdHJ1Y3RvcmUgb2YgdGhlIHppcGZpbGUgKi8KLQl1TG9uZyBjb21wcmVzc2lvbl9tZXRob2Q7ICAgLyogY29tcHJlc3Npb24gbWV0aG9kICgwPT1zdG9yZSkgKi8KLQl1TG9uZyBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsvKiBieXRlIGJlZm9yZSB0aGUgemlwZmlsZSwgKD4wIGZvciBzZngpKi8KKyAgICB1TG9uZyBjcmMzMjsgICAgICAgICAgICAgICAgLyogY3JjMzIgb2YgYWxsIGRhdGEgdW5jb21wcmVzc2VkICovCisgICAgdUxvbmcgY3JjMzJfd2FpdDsgICAgICAgICAgIC8qIGNyYzMyIHdlIG11c3Qgb2J0YWluIGFmdGVyIGRlY29tcHJlc3MgYWxsICovCisgICAgdUxvbmcgcmVzdF9yZWFkX2NvbXByZXNzZWQ7IC8qIG51bWJlciBvZiBieXRlIHRvIGJlIGRlY29tcHJlc3NlZCAqLworICAgIHVMb25nIHJlc3RfcmVhZF91bmNvbXByZXNzZWQ7LypudW1iZXIgb2YgYnl0ZSB0byBiZSBvYnRhaW5lZCBhZnRlciBkZWNvbXAqLworICAgIHpsaWJfZmlsZWZ1bmNfZGVmIHpfZmlsZWZ1bmM7CisgICAgdm9pZHBmIGZpbGVzdHJlYW07ICAgICAgICAvKiBpbyBzdHJ1Y3RvcmUgb2YgdGhlIHppcGZpbGUgKi8KKyAgICB1TG9uZyBjb21wcmVzc2lvbl9tZXRob2Q7ICAgLyogY29tcHJlc3Npb24gbWV0aG9kICgwPT1zdG9yZSkgKi8KKyAgICB1TG9uZyBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsvKiBieXRlIGJlZm9yZSB0aGUgemlwZmlsZSwgKD4wIGZvciBzZngpKi8KKyAgICBpbnQgICByYXc7CiB9IGZpbGVfaW5femlwX3JlYWRfaW5mb19zOwogCiAKQEAgLTEwNywyNSArMTI3LDM1IEBACiAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlGSUxFKiBmaWxlOyAgICAgICAgICAgICAgICAgLyogaW8gc3RydWN0b3JlIG9mIHRoZSB6aXBmaWxlICovCi0JdW56X2dsb2JhbF9pbmZvIGdpOyAgICAgICAvKiBwdWJsaWMgZ2xvYmFsIGluZm9ybWF0aW9uICovCi0JdUxvbmcgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7LyogYnl0ZSBiZWZvcmUgdGhlIHppcGZpbGUsICg+MCBmb3Igc2Z4KSovCi0JdUxvbmcgbnVtX2ZpbGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiB0aGUgY3VycmVudCBmaWxlIGluIHRoZSB6aXBmaWxlKi8KLQl1TG9uZyBwb3NfaW5fY2VudHJhbF9kaXI7ICAgLyogcG9zIG9mIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIGNlbnRyYWwgZGlyKi8KLQl1TG9uZyBjdXJyZW50X2ZpbGVfb2s7ICAgICAgLyogZmxhZyBhYm91dCB0aGUgdXNhYmlsaXR5IG9mIHRoZSBjdXJyZW50IGZpbGUqLwotCXVMb25nIGNlbnRyYWxfcG9zOyAgICAgICAgICAvKiBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjZW50cmFsIGRpciovCisgICAgemxpYl9maWxlZnVuY19kZWYgel9maWxlZnVuYzsKKyAgICB2b2lkcGYgZmlsZXN0cmVhbTsgICAgICAgIC8qIGlvIHN0cnVjdG9yZSBvZiB0aGUgemlwZmlsZSAqLworICAgIHVuel9nbG9iYWxfaW5mbyBnaTsgICAgICAgLyogcHVibGljIGdsb2JhbCBpbmZvcm1hdGlvbiAqLworICAgIHVMb25nIGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOy8qIGJ5dGUgYmVmb3JlIHRoZSB6aXBmaWxlLCAoPjAgZm9yIHNmeCkqLworICAgIHVMb25nIG51bV9maWxlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZSovCisgICAgdUxvbmcgcG9zX2luX2NlbnRyYWxfZGlyOyAgIC8qIHBvcyBvZiB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBjZW50cmFsIGRpciovCisgICAgdUxvbmcgY3VycmVudF9maWxlX29rOyAgICAgIC8qIGZsYWcgYWJvdXQgdGhlIHVzYWJpbGl0eSBvZiB0aGUgY3VycmVudCBmaWxlKi8KKyAgICB1TG9uZyBjZW50cmFsX3BvczsgICAgICAgICAgLyogcG9zaXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2VudHJhbCBkaXIqLwogCi0JdUxvbmcgc2l6ZV9jZW50cmFsX2RpcjsgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICAqLwotCXVMb25nIG9mZnNldF9jZW50cmFsX2RpcjsgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aAotCQkJCQkJCQkgICByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAqLworICAgIHVMb25nIHNpemVfY2VudHJhbF9kaXI7ICAgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgKi8KKyAgICB1TG9uZyBvZmZzZXRfY2VudHJhbF9kaXI7ICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdCB0byB0aGUgc3RhcnRpbmcgZGlzayBudW1iZXIgKi8KIAotCXVuel9maWxlX2luZm8gY3VyX2ZpbGVfaW5mbzsgLyogcHVibGljIGluZm8gYWJvdXQgdGhlIGN1cnJlbnQgZmlsZSBpbiB6aXAqLwotCXVuel9maWxlX2luZm9faW50ZXJuYWwgY3VyX2ZpbGVfaW5mb19pbnRlcm5hbDsgLyogcHJpdmF0ZSBpbmZvIGFib3V0IGl0Ki8KKyAgICB1bnpfZmlsZV9pbmZvIGN1cl9maWxlX2luZm87IC8qIHB1YmxpYyBpbmZvIGFib3V0IHRoZSBjdXJyZW50IGZpbGUgaW4gemlwKi8KKyAgICB1bnpfZmlsZV9pbmZvX2ludGVybmFsIGN1cl9maWxlX2luZm9faW50ZXJuYWw7IC8qIHByaXZhdGUgaW5mbyBhYm91dCBpdCovCiAgICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkOyAvKiBzdHJ1Y3R1cmUgYWJvdXQgdGhlIGN1cnJlbnQKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGlmIHdlIGFyZSBkZWNvbXByZXNzaW5nIGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBpZiB3ZSBhcmUgZGVjb21wcmVzc2luZyBpdCAqLworICAgIGludCBlbmNyeXB0ZWQ7CisgICAgI2lmbmRlZiBOT1VOQ1JQWVQKKyAgICB1bnNpZ25lZCBsb25nIGtleXNbM107ICAgICAvKiBrZXlzIGRlZmluaW5nIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlICovCisgICAgY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWI7CisgICAgI2VuZGlmCiB9IHVuel9zOwogCiAKKyNpZm5kZWYgTk9VTkNSUFlUCisjaW5jbHVkZSAiY3J5cHQuaCIKKyNlbmRpZgorCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVhZCBhIGJ5dGUgZnJvbSBhIGd6X3N0cmVhbTsgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luLiBSZXR1cm4gRU9GCiAgICBmb3IgZW5kIG9mIGZpbGUuCkBAIC0xMzMsMTIgKzE2MywxOCBAQAogKi8KIAogCi1sb2NhbCBpbnQgdW56bG9jYWxfZ2V0Qnl0ZShmaW4scGkpCi0JRklMRSAqZmluOwotCWludCAqcGk7Citsb2NhbCBpbnQgdW56bG9jYWxfZ2V0Qnl0ZSBPRigoCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKKyAgICB2b2lkcGYgZmlsZXN0cmVhbSwKKyAgICBpbnQgKnBpKSk7CisKK2xvY2FsIGludCB1bnpsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHBpKQorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7CisgICAgdm9pZHBmIGZpbGVzdHJlYW07CisgICAgaW50ICpwaTsKIHsKICAgICB1bnNpZ25lZCBjaGFyIGM7Ci0JaW50IGVyciA9IGZyZWFkKCZjLCAxLCAxLCBmaW4pOworICAgIGludCBlcnIgPSAoaW50KVpSRUFEKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmYywxKTsKICAgICBpZiAoZXJyPT0xKQogICAgIHsKICAgICAgICAgKnBpID0gKGludCljOwpAQCAtMTQ2LDcgKzE4Miw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIGlmIChmZXJyb3IoZmluKSkgCisgICAgICAgIGlmIChaRVJST1IoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKSkKICAgICAgICAgICAgIHJldHVybiBVTlpfRVJSTk87CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHJldHVybiBVTlpfRU9GOwpAQCAtMTU1LDIzICsxOTEsMjkgQEAKIAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzIAorICAgUmVhZHMgYSBsb25nIGluIExTQiBvcmRlciBmcm9tIHRoZSBnaXZlbiBnel9zdHJlYW0uIFNldHMKICovCi1sb2NhbCBpbnQgdW56bG9jYWxfZ2V0U2hvcnQgKGZpbixwWCkKLQlGSUxFKiBmaW47Citsb2NhbCBpbnQgdW56bG9jYWxfZ2V0U2hvcnQgT0YoKAorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCisgICAgdm9pZHBmIGZpbGVzdHJlYW0sCisgICAgdUxvbmcgKnBYKSk7CisKK2xvY2FsIGludCB1bnpsb2NhbF9nZXRTaG9ydCAocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0scFgpCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKKyAgICB2b2lkcGYgZmlsZXN0cmVhbTsKICAgICB1TG9uZyAqcFg7CiB7CiAgICAgdUxvbmcgeCA7CiAgICAgaW50IGk7CiAgICAgaW50IGVycjsKIAotICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUoZmluLCZpKTsKKyAgICBlcnIgPSB1bnpsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKICAgICB4ID0gKHVMb25nKWk7Ci0gICAgCisKICAgICBpZiAoZXJyPT1VTlpfT0spCi0gICAgICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUoZmluLCZpKTsKKyAgICAgICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CiAgICAgeCArPSAoKHVMb25nKWkpPDw4OwotICAgCisKICAgICBpZiAoZXJyPT1VTlpfT0spCiAgICAgICAgICpwWCA9IHg7CiAgICAgZWxzZQpAQCAtMTc5LDI5ICsyMjEsMzUgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1sb2NhbCBpbnQgdW56bG9jYWxfZ2V0TG9uZyAoZmluLHBYKQotCUZJTEUqIGZpbjsKK2xvY2FsIGludCB1bnpsb2NhbF9nZXRMb25nIE9GKCgKKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAorICAgIHZvaWRwZiBmaWxlc3RyZWFtLAorICAgIHVMb25nICpwWCkpOworCitsb2NhbCBpbnQgdW56bG9jYWxfZ2V0TG9uZyAocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0scFgpCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKKyAgICB2b2lkcGYgZmlsZXN0cmVhbTsKICAgICB1TG9uZyAqcFg7CiB7CiAgICAgdUxvbmcgeCA7CiAgICAgaW50IGk7CiAgICAgaW50IGVycjsKIAotICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUoZmluLCZpKTsKKyAgICBlcnIgPSB1bnpsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKICAgICB4ID0gKHVMb25nKWk7Ci0gICAgCisKICAgICBpZiAoZXJyPT1VTlpfT0spCi0gICAgICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUoZmluLCZpKTsKKyAgICAgICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CiAgICAgeCArPSAoKHVMb25nKWkpPDw4OwogCiAgICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBlcnIgPSB1bnpsb2NhbF9nZXRCeXRlKGZpbiwmaSk7CisgICAgICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwogICAgIHggKz0gKCh1TG9uZylpKTw8MTY7CiAKICAgICBpZiAoZXJyPT1VTlpfT0spCi0gICAgICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUoZmluLCZpKTsKKyAgICAgICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CiAgICAgeCArPSAoKHVMb25nKWkpPDwyNDsKLSAgIAorCiAgICAgaWYgKGVycj09VU5aX09LKQogICAgICAgICAqcFggPSB4OwogICAgIGVsc2UKQEAgLTIxMiwyNiArMjYwLDI2IEBACiAKIC8qIE15IG93biBzdHJjbXBpIC8gc3RyY2FzZWNtcCAqLwogbG9jYWwgaW50IHN0cmNtcGNhc2Vub3NlbnNpdGl2ZV9pbnRlcm5hbCAoZmlsZU5hbWUxLGZpbGVOYW1lMikKLQljb25zdCBjaGFyKiBmaWxlTmFtZTE7Ci0JY29uc3QgY2hhciogZmlsZU5hbWUyOworICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lMTsKKyAgICBjb25zdCBjaGFyKiBmaWxlTmFtZTI7CiB7Ci0JZm9yICg7OykKLQl7Ci0JCWNoYXIgYzE9KihmaWxlTmFtZTErKyk7Ci0JCWNoYXIgYzI9KihmaWxlTmFtZTIrKyk7Ci0JCWlmICgoYzE+PSdhJykgJiYgKGMxPD0neicpKQotCQkJYzEgLT0gMHgyMDsKLQkJaWYgKChjMj49J2EnKSAmJiAoYzI8PSd6JykpCi0JCQljMiAtPSAweDIwOwotCQlpZiAoYzE9PSdcMCcpCi0JCQlyZXR1cm4gKChjMj09J1wwJykgPyAwIDogLTEpOwotCQlpZiAoYzI9PSdcMCcpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKGMxPGMyKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoYzE+YzIpCi0JCQlyZXR1cm4gMTsKLQl9CisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIGNoYXIgYzE9KihmaWxlTmFtZTErKyk7CisgICAgICAgIGNoYXIgYzI9KihmaWxlTmFtZTIrKyk7CisgICAgICAgIGlmICgoYzE+PSdhJykgJiYgKGMxPD0neicpKQorICAgICAgICAgICAgYzEgLT0gMHgyMDsKKyAgICAgICAgaWYgKChjMj49J2EnKSAmJiAoYzI8PSd6JykpCisgICAgICAgICAgICBjMiAtPSAweDIwOworICAgICAgICBpZiAoYzE9PSdcMCcpCisgICAgICAgICAgICByZXR1cm4gKChjMj09J1wwJykgPyAwIDogLTEpOworICAgICAgICBpZiAoYzI9PSdcMCcpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgaWYgKGMxPGMyKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoYzE+YzIpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CiB9CiAKIApAQCAtMjQ1LDcgKzI5Myw3IEBACiAjZGVmaW5lIFNUUkNNUENBU0VOT1NFTlRJVkVGVU5DVElPTiBzdHJjbXBjYXNlbm9zZW5zaXRpdmVfaW50ZXJuYWwKICNlbmRpZgogCi0vKiAKKy8qCiAgICBDb21wYXJlIHR3byBmaWxlbmFtZSAoZmlsZU5hbWUxLGZpbGVOYW1lMikuCiAgICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAxLCBjb21wYXJpc2lvbiBpcyBjYXNlIHNlbnNpdGl2aXR5IChsaWtlIHN0cmNtcCkKICAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDIsIGNvbXBhcmlzaW9uIGlzIG5vdCBjYXNlIHNlbnNpdGl2aXR5IChsaWtlIHN0cmNtcGkKQEAgLTI1NSwyMDMgKzMwMywyMjUgQEAKIAogKi8KIGV4dGVybiBpbnQgWkVYUE9SVCB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUgKGZpbGVOYW1lMSxmaWxlTmFtZTIsaUNhc2VTZW5zaXRpdml0eSkKLQljb25zdCBjaGFyKiBmaWxlTmFtZTE7Ci0JY29uc3QgY2hhciogZmlsZU5hbWUyOwotCWludCBpQ2FzZVNlbnNpdGl2aXR5OworICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lMTsKKyAgICBjb25zdCBjaGFyKiBmaWxlTmFtZTI7CisgICAgaW50IGlDYXNlU2Vuc2l0aXZpdHk7CiB7Ci0JaWYgKGlDYXNlU2Vuc2l0aXZpdHk9PTApCi0JCWlDYXNlU2Vuc2l0aXZpdHk9Q0FTRVNFTlNJVElWSVRZREVGQVVMVFZBTFVFOworICAgIGlmIChpQ2FzZVNlbnNpdGl2aXR5PT0wKQorICAgICAgICBpQ2FzZVNlbnNpdGl2aXR5PUNBU0VTRU5TSVRJVklUWURFRkFVTFRWQUxVRTsKIAotCWlmIChpQ2FzZVNlbnNpdGl2aXR5PT0xKQotCQlyZXR1cm4gc3RyY21wKGZpbGVOYW1lMSxmaWxlTmFtZTIpOworICAgIGlmIChpQ2FzZVNlbnNpdGl2aXR5PT0xKQorICAgICAgICByZXR1cm4gc3RyY21wKGZpbGVOYW1lMSxmaWxlTmFtZTIpOwogCi0JcmV0dXJuIFNUUkNNUENBU0VOT1NFTlRJVkVGVU5DVElPTihmaWxlTmFtZTEsZmlsZU5hbWUyKTsKLX0gCisgICAgcmV0dXJuIFNUUkNNUENBU0VOT1NFTlRJVkVGVU5DVElPTihmaWxlTmFtZTEsZmlsZU5hbWUyKTsKK30KIAorI2lmbmRlZiBCVUZSRUFEQ09NTUVOVAogI2RlZmluZSBCVUZSRUFEQ09NTUVOVCAoMHg0MDApCisjZW5kaWYKIAogLyoKICAgTG9jYXRlIHRoZSBDZW50cmFsIGRpcmVjdG9yeSBvZiBhIHppcGZpbGUgKGF0IHRoZSBlbmQsIGp1c3QgYmVmb3JlCiAgICAgdGhlIGdsb2JhbCBjb21tZW50KQogKi8KLWxvY2FsIHVMb25nIHVuemxvY2FsX1NlYXJjaENlbnRyYWxEaXIoZmluKQotCUZJTEUgKmZpbjsKK2xvY2FsIHVMb25nIHVuemxvY2FsX1NlYXJjaENlbnRyYWxEaXIgT0YoKAorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCisgICAgdm9pZHBmIGZpbGVzdHJlYW0pKTsKKworbG9jYWwgdUxvbmcgdW56bG9jYWxfU2VhcmNoQ2VudHJhbERpcihwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSkKKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOworICAgIHZvaWRwZiBmaWxlc3RyZWFtOwogewotCXVuc2lnbmVkIGNoYXIqIGJ1ZjsKLQl1TG9uZyB1U2l6ZUZpbGU7Ci0JdUxvbmcgdUJhY2tSZWFkOwotCXVMb25nIHVNYXhCYWNrPTB4ZmZmZjsgLyogbWF4aW11bSBzaXplIG9mIGdsb2JhbCBjb21tZW50ICovCi0JdUxvbmcgdVBvc0ZvdW5kPTA7Ci0JCi0JaWYgKGZzZWVrKGZpbiwwLFNFRUtfRU5EKSAhPSAwKQotCQlyZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBjaGFyKiBidWY7CisgICAgdUxvbmcgdVNpemVGaWxlOworICAgIHVMb25nIHVCYWNrUmVhZDsKKyAgICB1TG9uZyB1TWF4QmFjaz0weGZmZmY7IC8qIG1heGltdW0gc2l6ZSBvZiBnbG9iYWwgY29tbWVudCAqLworICAgIHVMb25nIHVQb3NGb3VuZD0wOworCisgICAgaWYgKFpTRUVLKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwwLFpMSUJfRklMRUZVTkNfU0VFS19FTkQpICE9IDApCisgICAgICAgIHJldHVybiAwOwogCiAKLQl1U2l6ZUZpbGUgPSBmdGVsbCggZmluICk7Ci0JCi0JaWYgKHVNYXhCYWNrPnVTaXplRmlsZSkKLQkJdU1heEJhY2sgPSB1U2l6ZUZpbGU7CisgICAgdVNpemVGaWxlID0gWlRFTEwoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKTsKIAotCWJ1ZiA9ICh1bnNpZ25lZCBjaGFyKilBTExPQyhCVUZSRUFEQ09NTUVOVCs0KTsKLQlpZiAoYnVmPT1OVUxMKQotCQlyZXR1cm4gMDsKKyAgICBpZiAodU1heEJhY2s+dVNpemVGaWxlKQorICAgICAgICB1TWF4QmFjayA9IHVTaXplRmlsZTsKIAotCXVCYWNrUmVhZCA9IDQ7Ci0Jd2hpbGUgKHVCYWNrUmVhZDx1TWF4QmFjaykKLQl7Ci0JCXVMb25nIHVSZWFkU2l6ZSx1UmVhZFBvcyA7Ci0JCWludCBpOwotCQlpZiAodUJhY2tSZWFkK0JVRlJFQURDT01NRU5UPnVNYXhCYWNrKSAKLQkJCXVCYWNrUmVhZCA9IHVNYXhCYWNrOwotCQllbHNlCi0JCQl1QmFja1JlYWQrPUJVRlJFQURDT01NRU5UOwotCQl1UmVhZFBvcyA9IHVTaXplRmlsZS11QmFja1JlYWQgOwotCQkKLQkJdVJlYWRTaXplID0gKChCVUZSRUFEQ09NTUVOVCs0KSA8ICh1U2l6ZUZpbGUtdVJlYWRQb3MpKSA/IAorICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKilBTExPQyhCVUZSRUFEQ09NTUVOVCs0KTsKKyAgICBpZiAoYnVmPT1OVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVCYWNrUmVhZCA9IDQ7CisgICAgd2hpbGUgKHVCYWNrUmVhZDx1TWF4QmFjaykKKyAgICB7CisgICAgICAgIHVMb25nIHVSZWFkU2l6ZSx1UmVhZFBvcyA7CisgICAgICAgIGludCBpOworICAgICAgICBpZiAodUJhY2tSZWFkK0JVRlJFQURDT01NRU5UPnVNYXhCYWNrKQorICAgICAgICAgICAgdUJhY2tSZWFkID0gdU1heEJhY2s7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVCYWNrUmVhZCs9QlVGUkVBRENPTU1FTlQ7CisgICAgICAgIHVSZWFkUG9zID0gdVNpemVGaWxlLXVCYWNrUmVhZCA7CisKKyAgICAgICAgdVJlYWRTaXplID0gKChCVUZSRUFEQ09NTUVOVCs0KSA8ICh1U2l6ZUZpbGUtdVJlYWRQb3MpKSA/CiAgICAgICAgICAgICAgICAgICAgICAoQlVGUkVBRENPTU1FTlQrNCkgOiAodVNpemVGaWxlLXVSZWFkUG9zKTsKLQkJaWYgKGZzZWVrKGZpbix1UmVhZFBvcyxTRUVLX1NFVCkhPTApCi0JCQlicmVhazsKKyAgICAgICAgaWYgKFpTRUVLKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSx1UmVhZFBvcyxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWlmIChmcmVhZChidWYsKHVJbnQpdVJlYWRTaXplLDEsZmluKSE9MSkKLQkJCWJyZWFrOworICAgICAgICBpZiAoWlJFQUQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLGJ1Zix1UmVhZFNpemUpIT11UmVhZFNpemUpCisgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIGZvciAoaT0oaW50KXVSZWFkU2l6ZS0zOyAoaS0tKT4wOykKLQkJCWlmICgoKCooYnVmK2kpKT09MHg1MCkgJiYgKCgqKGJ1ZitpKzEpKT09MHg0YikgJiYgCi0JCQkJKCgqKGJ1ZitpKzIpKT09MHgwNSkgJiYgKCgqKGJ1ZitpKzMpKT09MHgwNikpCi0JCQl7Ci0JCQkJdVBvc0ZvdW5kID0gdVJlYWRQb3MraTsKLQkJCQlicmVhazsKLQkJCX0KKyAgICAgICAgZm9yIChpPShpbnQpdVJlYWRTaXplLTM7IChpLS0pPjA7KQorICAgICAgICAgICAgaWYgKCgoKihidWYraSkpPT0weDUwKSAmJiAoKCooYnVmK2krMSkpPT0weDRiKSAmJgorICAgICAgICAgICAgICAgICgoKihidWYraSsyKSk9PTB4MDUpICYmICgoKihidWYraSszKSk9PTB4MDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVQb3NGb3VuZCA9IHVSZWFkUG9zK2k7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKLQkJaWYgKHVQb3NGb3VuZCE9MCkKLQkJCWJyZWFrOwotCX0KLQlUUllGUkVFKGJ1Zik7Ci0JcmV0dXJuIHVQb3NGb3VuZDsKKyAgICAgICAgaWYgKHVQb3NGb3VuZCE9MCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBUUllGUkVFKGJ1Zik7CisgICAgcmV0dXJuIHVQb3NGb3VuZDsKIH0KIAogLyoKICAgT3BlbiBhIFppcCBmaWxlLiBwYXRoIGNvbnRhaW4gdGhlIGZ1bGwgcGF0aG5hbWUgKGJ5IGV4YW1wbGUsCi0gICAgIG9uIGEgV2luZG93cyBOVCBjb21wdXRlciAiYzpcXHRlc3RcXHpsaWIxMDkuemlwIiBvciBvbiBhbiBVbml4IGNvbXB1dGVyCi0JICJ6bGliL3psaWIxMDkuemlwIi4KLQkgSWYgdGhlIHppcGZpbGUgY2Fubm90IGJlIG9wZW5lZCAoZmlsZSBkb24ndCBleGlzdCBvciBpbiBub3QgdmFsaWQpLCB0aGUKLQkgICByZXR1cm4gdmFsdWUgaXMgTlVMTC4KKyAgICAgb24gYSBXaW5kb3dzIE5UIGNvbXB1dGVyICJjOlxcdGVzdFxcemxpYjExNC56aXAiIG9yIG9uIGFuIFVuaXggY29tcHV0ZXIKKyAgICAgInpsaWIvemxpYjExNC56aXAiLgorICAgICBJZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgb3BlbmVkIChmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaW4gbm90IHZhbGlkKSwgdGhlCisgICAgICAgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCiAgICAgIEVsc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgYSB1bnpGaWxlIEhhbmRsZSwgdXNhYmxlIHdpdGggb3RoZXIgZnVuY3Rpb24KLQkgICBvZiB0aGlzIHVuemlwIHBhY2thZ2UuCisgICAgICAgb2YgdGhpcyB1bnppcCBwYWNrYWdlLgogKi8KLWV4dGVybiB1bnpGaWxlIFpFWFBPUlQgdW56T3BlbiAocGF0aCkKLQljb25zdCBjaGFyICpwYXRoOworZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMiAocGF0aCwgcHpsaWJfZmlsZWZ1bmNfZGVmKQorICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKIHsKLQl1bnpfcyB1czsKLQl1bnpfcyAqczsKLQl1TG9uZyBjZW50cmFsX3Bvcyx1TDsKLQlGSUxFICogZmluIDsKKyAgICB1bnpfcyB1czsKKyAgICB1bnpfcyAqczsKKyAgICB1TG9uZyBjZW50cmFsX3Bvcyx1TDsKIAotCXVMb25nIG51bWJlcl9kaXNrOyAgICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZGlzdCwgdXNlZCBmb3IgCi0JCQkJCQkJCSAgIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLwotCXVMb25nIG51bWJlcl9kaXNrX3dpdGhfQ0Q7ICAvKiBudW1iZXIgdGhlIHRoZSBkaXNrIHdpdGggY2VudHJhbCBkaXIsIHVzZWQKLQkJCQkJCQkJICAgZm9yIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLwotCXVMb25nIG51bWJlcl9lbnRyeV9DRDsgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYW1lIHRoYW4gbnVtYmVyX2VudHJ5IG9uIG5vc3BhbikgKi8KKyAgICB1TG9uZyBudW1iZXJfZGlzazsgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBjdXJyZW50IGRpc3QsIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLworICAgIHVMb25nIG51bWJlcl9kaXNrX3dpdGhfQ0Q7ICAvKiBudW1iZXIgdGhlIHRoZSBkaXNrIHdpdGggY2VudHJhbCBkaXIsIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLworICAgIHVMb25nIG51bWJlcl9lbnRyeV9DRDsgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNhbWUgdGhhbiBudW1iZXJfZW50cnkgb24gbm9zcGFuKSAqLwogCi0JaW50IGVycj1VTlpfT0s7CisgICAgaW50IGVycj1VTlpfT0s7CiAKICAgICBpZiAodW56X2NvcHlyaWdodFswXSE9JyAnKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGZpbj1mb3BlbihwYXRoLCJyYiIpOwotCWlmIChmaW49PU5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChwemxpYl9maWxlZnVuY19kZWY9PU5VTEwpCisgICAgICAgIGZpbGxfZm9wZW5fZmlsZWZ1bmMoJnVzLnpfZmlsZWZ1bmMpOworICAgIGVsc2UKKyAgICAgICAgdXMuel9maWxlZnVuYyA9ICpwemxpYl9maWxlZnVuY19kZWY7CiAKLQljZW50cmFsX3BvcyA9IHVuemxvY2FsX1NlYXJjaENlbnRyYWxEaXIoZmluKTsKLQlpZiAoY2VudHJhbF9wb3M9PTApCi0JCWVycj1VTlpfRVJSTk87CisgICAgdXMuZmlsZXN0cmVhbT0gKCoodXMuel9maWxlZnVuYy56b3Blbl9maWxlKSkodXMuel9maWxlZnVuYy5vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX01PREVfUkVBRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HKTsKKyAgICBpZiAodXMuZmlsZXN0cmVhbT09TlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZnNlZWsoZmluLGNlbnRyYWxfcG9zLFNFRUtfU0VUKSE9MCkKLQkJZXJyPVVOWl9FUlJOTzsKKyAgICBjZW50cmFsX3BvcyA9IHVuemxvY2FsX1NlYXJjaENlbnRyYWxEaXIoJnVzLnpfZmlsZWZ1bmMsdXMuZmlsZXN0cmVhbSk7CisgICAgaWYgKGNlbnRyYWxfcG9zPT0wKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JLyogdGhlIHNpZ25hdHVyZSwgYWxyZWFkeSBjaGVja2VkICovCi0JaWYgKHVuemxvY2FsX2dldExvbmcoZmluLCZ1TCkhPVVOWl9PSykKLQkJZXJyPVVOWl9FUlJOTzsKKyAgICBpZiAoWlNFRUsodXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJhbF9wb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgIGVycj1VTlpfRVJSTk87CiAKLQkvKiBudW1iZXIgb2YgdGhpcyBkaXNrICovCi0JaWYgKHVuemxvY2FsX2dldFNob3J0KGZpbiwmbnVtYmVyX2Rpc2spIT1VTlpfT0spCi0JCWVycj1VTlpfRVJSTk87CisgICAgLyogdGhlIHNpZ25hdHVyZSwgYWxyZWFkeSBjaGVja2VkICovCisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLwotCWlmICh1bnpsb2NhbF9nZXRTaG9ydChmaW4sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1VTlpfT0spCi0JCWVycj1VTlpfRVJSTk87CisgICAgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLworICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2spIT1VTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CiAKLQkvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCi0JaWYgKHVuemxvY2FsX2dldFNob3J0KGZpbiwmdXMuZ2kubnVtYmVyX2VudHJ5KSE9VU5aX09LKQotCQllcnI9VU5aX0VSUk5POworICAgIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1VTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CiAKLQkvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgKi8KLQlpZiAodW56bG9jYWxfZ2V0U2hvcnQoZmluLCZudW1iZXJfZW50cnlfQ0QpIT1VTlpfT0spCi0JCWVycj1VTlpfRVJSTk87CisgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyIG9uIHRoaXMgZGlzayAqLworICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdXMuZ2kubnVtYmVyX2VudHJ5KSE9VU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JaWYgKChudW1iZXJfZW50cnlfQ0QhPXVzLmdpLm51bWJlcl9lbnRyeSkgfHwKLQkJKG51bWJlcl9kaXNrX3dpdGhfQ0QhPTApIHx8Ci0JCShudW1iZXJfZGlzayE9MCkpCi0JCWVycj1VTlpfQkFEWklQRklMRTsKKyAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgKi8KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9lbnRyeV9DRCkhPVVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKIAotCS8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0JaWYgKHVuemxvY2FsX2dldExvbmcoZmluLCZ1cy5zaXplX2NlbnRyYWxfZGlyKSE9VU5aX09LKQotCQllcnI9VU5aX0VSUk5POworICAgIGlmICgobnVtYmVyX2VudHJ5X0NEIT11cy5naS5udW1iZXJfZW50cnkpIHx8CisgICAgICAgIChudW1iZXJfZGlza193aXRoX0NEIT0wKSB8fAorICAgICAgICAobnVtYmVyX2Rpc2shPTApKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CiAKLQkvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZSAKLQkgICAgICBzdGFydGluZyBkaXNrIG51bWJlciAqLwotCWlmICh1bnpsb2NhbF9nZXRMb25nKGZpbiwmdXMub2Zmc2V0X2NlbnRyYWxfZGlyKSE9VU5aX09LKQotCQllcnI9VU5aX0VSUk5POworICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLnNpemVfY2VudHJhbF9kaXIpIT1VTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CiAKLQkvKiB6aXBmaWxlIGNvbW1lbnQgbGVuZ3RoICovCi0JaWYgKHVuemxvY2FsX2dldFNob3J0KGZpbiwmdXMuZ2kuc2l6ZV9jb21tZW50KSE9VU5aX09LKQotCQllcnI9VU5aX0VSUk5POworICAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlCisgICAgICAgICAgc3RhcnRpbmcgZGlzayBudW1iZXIgKi8KKyAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdXMub2Zmc2V0X2NlbnRyYWxfZGlyKSE9VU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JaWYgKChjZW50cmFsX3Bvczx1cy5vZmZzZXRfY2VudHJhbF9kaXIrdXMuc2l6ZV9jZW50cmFsX2RpcikgJiYgCi0JCShlcnI9PVVOWl9PSykpCi0JCWVycj1VTlpfQkFEWklQRklMRTsKKyAgICAvKiB6aXBmaWxlIGNvbW1lbnQgbGVuZ3RoICovCisgICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1cy5naS5zaXplX2NvbW1lbnQpIT1VTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CiAKLQlpZiAoZXJyIT1VTlpfT0spCi0JewotCQlmY2xvc2UoZmluKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgoY2VudHJhbF9wb3M8dXMub2Zmc2V0X2NlbnRyYWxfZGlyK3VzLnNpemVfY2VudHJhbF9kaXIpICYmCisgICAgICAgIChlcnI9PVVOWl9PSykpCisgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKIAotCXVzLmZpbGU9ZmluOwotCXVzLmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlID0gY2VudHJhbF9wb3MgLQotCQkgICAgICAgICAgICAgICAgICAgICh1cy5vZmZzZXRfY2VudHJhbF9kaXIrdXMuc2l6ZV9jZW50cmFsX2Rpcik7Ci0JdXMuY2VudHJhbF9wb3MgPSBjZW50cmFsX3BvczsKKyAgICBpZiAoZXJyIT1VTlpfT0spCisgICAgeworICAgICAgICBaQ0xPU0UodXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVzLmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlID0gY2VudHJhbF9wb3MgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cy5vZmZzZXRfY2VudHJhbF9kaXIrdXMuc2l6ZV9jZW50cmFsX2Rpcik7CisgICAgdXMuY2VudHJhbF9wb3MgPSBjZW50cmFsX3BvczsKICAgICB1cy5wZmlsZV9pbl96aXBfcmVhZCA9IE5VTEw7Ci0JCisgICAgdXMuZW5jcnlwdGVkID0gMDsKIAotCXM9KHVuel9zKilBTExPQyhzaXplb2YodW56X3MpKTsKLQkqcz11czsKLQl1bnpHb1RvRmlyc3RGaWxlKCh1bnpGaWxlKXMpOwkKLQlyZXR1cm4gKHVuekZpbGUpczsJCisKKyAgICBzPSh1bnpfcyopQUxMT0Moc2l6ZW9mKHVuel9zKSk7CisgICAgKnM9dXM7CisgICAgdW56R29Ub0ZpcnN0RmlsZSgodW56RmlsZSlzKTsKKyAgICByZXR1cm4gKHVuekZpbGUpczsKIH0KIAogCitleHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW4gKHBhdGgpCisgICAgY29uc3QgY2hhciAqcGF0aDsKK3sKKyAgICByZXR1cm4gdW56T3BlbjIocGF0aCwgTlVMTCk7Cit9CisKIC8qCiAgIENsb3NlIGEgWmlwRmlsZSBvcGVuZWQgd2l0aCB1bnppcE9wZW4uCiAgIElmIHRoZXJlIGlzIGZpbGVzIGluc2lkZSB0aGUgLlppcCBvcGVuZWQgd2l0aCB1bnppcE9wZW5DdXJyZW50RmlsZSAoc2VlIGxhdGVyKSwKICAgICB0aGVzZSBmaWxlcyBNVVNUIGJlIGNsb3NlZCB3aXRoIHVuemlwQ2xvc2VDdXJyZW50RmlsZSBiZWZvcmUgY2FsbCB1bnppcENsb3NlLgogICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0uICovCiBleHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2UgKGZpbGUpCi0JdW56RmlsZSBmaWxlOworICAgIHVuekZpbGUgZmlsZTsKIHsKLQl1bnpfcyogczsKLQlpZiAoZmlsZT09TlVMTCkKLQkJcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCXM9KHVuel9zKilmaWxlOworICAgIHVuel9zKiBzOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56X3MqKWZpbGU7CiAKICAgICBpZiAocy0+cGZpbGVfaW5femlwX3JlYWQhPU5VTEwpCiAgICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUoZmlsZSk7CiAKLQlmY2xvc2Uocy0+ZmlsZSk7Ci0JVFJZRlJFRShzKTsKLQlyZXR1cm4gVU5aX09LOworICAgIFpDTE9TRShzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtKTsKKyAgICBUUllGUkVFKHMpOworICAgIHJldHVybiBVTlpfT0s7CiB9CiAKIApAQCAtNDYwLDE1ICs1MzAsMTUgQEAKICAgTm8gcHJlcGFyYXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpcyBuZWVkZWQKICAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLwogZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbEluZm8gKGZpbGUscGdsb2JhbF9pbmZvKQotCXVuekZpbGUgZmlsZTsKLQl1bnpfZ2xvYmFsX2luZm8gKnBnbG9iYWxfaW5mbzsKKyAgICB1bnpGaWxlIGZpbGU7CisgICAgdW56X2dsb2JhbF9pbmZvICpwZ2xvYmFsX2luZm87CiB7Ci0JdW56X3MqIHM7Ci0JaWYgKGZpbGU9PU5VTEwpCi0JCXJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQlzPSh1bnpfcyopZmlsZTsKLQkqcGdsb2JhbF9pbmZvPXMtPmdpOwotCXJldHVybiBVTlpfT0s7CisgICAgdW56X3MqIHM7CisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bnpfcyopZmlsZTsKKyAgICAqcGdsb2JhbF9pbmZvPXMtPmdpOworICAgIHJldHVybiBVTlpfT0s7CiB9CiAKIApAQCAtNDk1LDE0ICs1NjUsMTQgQEAKICovCiBsb2NhbCBpbnQgdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwgT0YoKHVuekZpbGUgZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mbyAqcGZpbGVfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mb19pbnRlcm5hbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mb19pbnRlcm5hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGZpbGVfaW5mb19pbnRlcm5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pGaWxlTmFtZSwKLQkJCQkJCQkJCQkJCSAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBmaWxlTmFtZUJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dHJhRmllbGQsCi0JCQkJCQkJCQkJCQkgIHVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAotCQkJCQkJCQkJCQkJICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZSkpOwogCiBsb2NhbCBpbnQgdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwgKGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5mbywKQEAgLTUxMCwxNTYgKzU4MCwxNTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLCBmaWxlTmFtZUJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFGaWVsZCwgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pDb21tZW50LCAgY29tbWVudEJ1ZmZlclNpemUpCi0JdW56RmlsZSBmaWxlOwotCXVuel9maWxlX2luZm8gKnBmaWxlX2luZm87Ci0JdW56X2ZpbGVfaW5mb19pbnRlcm5hbCAqcGZpbGVfaW5mb19pbnRlcm5hbDsKLQljaGFyICpzekZpbGVOYW1lOwotCXVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZTsKLQl2b2lkICpleHRyYUZpZWxkOwotCXVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplOwotCWNoYXIgKnN6Q29tbWVudDsKLQl1TG9uZyBjb21tZW50QnVmZmVyU2l6ZTsKKyAgICB1bnpGaWxlIGZpbGU7CisgICAgdW56X2ZpbGVfaW5mbyAqcGZpbGVfaW5mbzsKKyAgICB1bnpfZmlsZV9pbmZvX2ludGVybmFsICpwZmlsZV9pbmZvX2ludGVybmFsOworICAgIGNoYXIgKnN6RmlsZU5hbWU7CisgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplOworICAgIHZvaWQgKmV4dHJhRmllbGQ7CisgICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemU7CisgICAgY2hhciAqc3pDb21tZW50OworICAgIHVMb25nIGNvbW1lbnRCdWZmZXJTaXplOwogewotCXVuel9zKiBzOwotCXVuel9maWxlX2luZm8gZmlsZV9pbmZvOwotCXVuel9maWxlX2luZm9faW50ZXJuYWwgZmlsZV9pbmZvX2ludGVybmFsOwotCWludCBlcnI9VU5aX09LOwotCXVMb25nIHVNYWdpYzsKLQlsb25nIGxTZWVrPTA7CisgICAgdW56X3MqIHM7CisgICAgdW56X2ZpbGVfaW5mbyBmaWxlX2luZm87CisgICAgdW56X2ZpbGVfaW5mb19pbnRlcm5hbCBmaWxlX2luZm9faW50ZXJuYWw7CisgICAgaW50IGVycj1VTlpfT0s7CisgICAgdUxvbmcgdU1hZ2ljOworICAgIGxvbmcgbFNlZWs9MDsKIAotCWlmIChmaWxlPT1OVUxMKQotCQlyZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0Jcz0odW56X3MqKWZpbGU7Ci0JaWYgKGZzZWVrKHMtPmZpbGUscy0+cG9zX2luX2NlbnRyYWxfZGlyK3MtPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLFNFRUtfU0VUKSE9MCkKLQkJZXJyPVVOWl9FUlJOTzsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuel9zKilmaWxlOworICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLAorICAgICAgICAgICAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIrcy0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsCisgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCiAKLQkvKiB3ZSBjaGVjayB0aGUgbWFnaWMgKi8KLQlpZiAoZXJyPT1VTlpfT0spCi0JCWlmICh1bnpsb2NhbF9nZXRMb25nKHMtPmZpbGUsJnVNYWdpYykgIT0gVU5aX09LKQotCQkJZXJyPVVOWl9FUlJOTzsKLQkJZWxzZSBpZiAodU1hZ2ljIT0weDAyMDE0YjUwKQotCQkJZXJyPVVOWl9CQURaSVBGSUxFOworICAgIC8qIHdlIGNoZWNrIHRoZSBtYWdpYyAqLworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVNYWdpYykgIT0gVU5aX09LKQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgZWxzZSBpZiAodU1hZ2ljIT0weDAyMDE0YjUwKQorICAgICAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwogCi0JaWYgKHVuemxvY2FsX2dldFNob3J0KHMtPmZpbGUsJmZpbGVfaW5mby52ZXJzaW9uKSAhPSBVTlpfT0spCi0JCWVycj1VTlpfRVJSTk87CisgICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8udmVyc2lvbikgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JaWYgKHVuemxvY2FsX2dldFNob3J0KHMtPmZpbGUsJmZpbGVfaW5mby52ZXJzaW9uX25lZWRlZCkgIT0gVU5aX09LKQotCQllcnI9VU5aX0VSUk5POworICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnZlcnNpb25fbmVlZGVkKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CiAKLQlpZiAodW56bG9jYWxfZ2V0U2hvcnQocy0+ZmlsZSwmZmlsZV9pbmZvLmZsYWcpICE9IFVOWl9PSykKLQkJZXJyPVVOWl9FUlJOTzsKKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5mbGFnKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CiAKLQlpZiAodW56bG9jYWxfZ2V0U2hvcnQocy0+ZmlsZSwmZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCkgIT0gVU5aX09LKQotCQllcnI9VU5aX0VSUk5POworICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JaWYgKHVuemxvY2FsX2dldExvbmcocy0+ZmlsZSwmZmlsZV9pbmZvLmRvc0RhdGUpICE9IFVOWl9PSykKLQkJZXJyPVVOWl9FUlJOTzsKKyAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmRvc0RhdGUpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKIAogICAgIHVuemxvY2FsX0Rvc0RhdGVUb1RtdURhdGUoZmlsZV9pbmZvLmRvc0RhdGUsJmZpbGVfaW5mby50bXVfZGF0ZSk7CiAKLQlpZiAodW56bG9jYWxfZ2V0TG9uZyhzLT5maWxlLCZmaWxlX2luZm8uY3JjKSAhPSBVTlpfT0spCi0JCWVycj1VTlpfRVJSTk87CisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5jcmMpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKIAotCWlmICh1bnpsb2NhbF9nZXRMb25nKHMtPmZpbGUsJmZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUpICE9IFVOWl9PSykKLQkJZXJyPVVOWl9FUlJOTzsKKyAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JaWYgKHVuemxvY2FsX2dldExvbmcocy0+ZmlsZSwmZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplKSAhPSBVTlpfT0spCi0JCWVycj1VTlpfRVJSTk87CisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZSkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JaWYgKHVuemxvY2FsX2dldFNob3J0KHMtPmZpbGUsJmZpbGVfaW5mby5zaXplX2ZpbGVuYW1lKSAhPSBVTlpfT0spCi0JCWVycj1VTlpfRVJSTk87CisgICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uc2l6ZV9maWxlbmFtZSkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JaWYgKHVuemxvY2FsX2dldFNob3J0KHMtPmZpbGUsJmZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEpICE9IFVOWl9PSykKLQkJZXJyPVVOWl9FUlJOTzsKKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKIAotCWlmICh1bnpsb2NhbF9nZXRTaG9ydChzLT5maWxlLCZmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQpICE9IFVOWl9PSykKLQkJZXJyPVVOWl9FUlJOTzsKKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JaWYgKHVuemxvY2FsX2dldFNob3J0KHMtPmZpbGUsJmZpbGVfaW5mby5kaXNrX251bV9zdGFydCkgIT0gVU5aX09LKQotCQllcnI9VU5aX0VSUk5POworICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmRpc2tfbnVtX3N0YXJ0KSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CiAKLQlpZiAodW56bG9jYWxfZ2V0U2hvcnQocy0+ZmlsZSwmZmlsZV9pbmZvLmludGVybmFsX2ZhKSAhPSBVTlpfT0spCi0JCWVycj1VTlpfRVJSTk87CisgICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uaW50ZXJuYWxfZmEpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKIAotCWlmICh1bnpsb2NhbF9nZXRMb25nKHMtPmZpbGUsJmZpbGVfaW5mby5leHRlcm5hbF9mYSkgIT0gVU5aX09LKQotCQllcnI9VU5aX0VSUk5POworICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uZXh0ZXJuYWxfZmEpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKIAotCWlmICh1bnpsb2NhbF9nZXRMb25nKHMtPmZpbGUsJmZpbGVfaW5mb19pbnRlcm5hbC5vZmZzZXRfY3VyZmlsZSkgIT0gVU5aX09LKQotCQllcnI9VU5aX0VSUk5POworICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKIAotCWxTZWVrKz1maWxlX2luZm8uc2l6ZV9maWxlbmFtZTsKLQlpZiAoKGVycj09VU5aX09LKSAmJiAoc3pGaWxlTmFtZSE9TlVMTCkpCi0JewotCQl1TG9uZyB1U2l6ZVJlYWQgOwotCQlpZiAoZmlsZV9pbmZvLnNpemVfZmlsZW5hbWU8ZmlsZU5hbWVCdWZmZXJTaXplKQotCQl7Ci0JCQkqKHN6RmlsZU5hbWUrZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUpPSdcMCc7Ci0JCQl1U2l6ZVJlYWQgPSBmaWxlX2luZm8uc2l6ZV9maWxlbmFtZTsKLQkJfQotCQllbHNlCi0JCQl1U2l6ZVJlYWQgPSBmaWxlTmFtZUJ1ZmZlclNpemU7CisgICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVuYW1lOworICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChzekZpbGVOYW1lIT1OVUxMKSkKKyAgICB7CisgICAgICAgIHVMb25nIHVTaXplUmVhZCA7CisgICAgICAgIGlmIChmaWxlX2luZm8uc2l6ZV9maWxlbmFtZTxmaWxlTmFtZUJ1ZmZlclNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgICooc3pGaWxlTmFtZStmaWxlX2luZm8uc2l6ZV9maWxlbmFtZSk9J1wwJzsKKyAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVfaW5mby5zaXplX2ZpbGVuYW1lOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVOYW1lQnVmZmVyU2l6ZTsKIAotCQlpZiAoKGZpbGVfaW5mby5zaXplX2ZpbGVuYW1lPjApICYmIChmaWxlTmFtZUJ1ZmZlclNpemU+MCkpCi0JCQlpZiAoZnJlYWQoc3pGaWxlTmFtZSwodUludCl1U2l6ZVJlYWQsMSxzLT5maWxlKSE9MSkKLQkJCQllcnI9VU5aX0VSUk5POwotCQlsU2VlayAtPSB1U2l6ZVJlYWQ7Ci0JfQorICAgICAgICBpZiAoKGZpbGVfaW5mby5zaXplX2ZpbGVuYW1lPjApICYmIChmaWxlTmFtZUJ1ZmZlclNpemU+MCkpCisgICAgICAgICAgICBpZiAoWlJFQUQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxzekZpbGVOYW1lLHVTaXplUmVhZCkhPXVTaXplUmVhZCkKKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICBsU2VlayAtPSB1U2l6ZVJlYWQ7CisgICAgfQogCi0JCi0JaWYgKChlcnI9PVVOWl9PSykgJiYgKGV4dHJhRmllbGQhPU5VTEwpKQotCXsKLQkJdUxvbmcgdVNpemVSZWFkIDsKLQkJaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE8ZXh0cmFGaWVsZEJ1ZmZlclNpemUpCi0JCQl1U2l6ZVJlYWQgPSBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhOwotCQllbHNlCi0JCQl1U2l6ZVJlYWQgPSBleHRyYUZpZWxkQnVmZmVyU2l6ZTsKIAotCQlpZiAobFNlZWshPTApCi0JCQlpZiAoZnNlZWsocy0+ZmlsZSxsU2VlayxTRUVLX0NVUik9PTApCi0JCQkJbFNlZWs9MDsKLQkJCWVsc2UKLQkJCQllcnI9VU5aX0VSUk5POwotCQlpZiAoKGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE+MCkgJiYgKGV4dHJhRmllbGRCdWZmZXJTaXplPjApKQotCQkJaWYgKGZyZWFkKGV4dHJhRmllbGQsKHVJbnQpdVNpemVSZWFkLDEscy0+ZmlsZSkhPTEpCi0JCQkJZXJyPVVOWl9FUlJOTzsKLQkJbFNlZWsgKz0gZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYSAtIHVTaXplUmVhZDsKLQl9Ci0JZWxzZQotCQlsU2Vlays9ZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYTsgCisgICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKGV4dHJhRmllbGQhPU5VTEwpKQorICAgIHsKKyAgICAgICAgdUxvbmcgdVNpemVSZWFkIDsKKyAgICAgICAgaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE8ZXh0cmFGaWVsZEJ1ZmZlclNpemUpCisgICAgICAgICAgICB1U2l6ZVJlYWQgPSBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhOworICAgICAgICBlbHNlCisgICAgICAgICAgICB1U2l6ZVJlYWQgPSBleHRyYUZpZWxkQnVmZmVyU2l6ZTsKIAotCQotCWlmICgoZXJyPT1VTlpfT0spICYmIChzekNvbW1lbnQhPU5VTEwpKQotCXsKLQkJdUxvbmcgdVNpemVSZWFkIDsKLQkJaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudDxjb21tZW50QnVmZmVyU2l6ZSkKLQkJewotCQkJKihzekNvbW1lbnQrZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50KT0nXDAnOwotCQkJdVNpemVSZWFkID0gZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50OwotCQl9Ci0JCWVsc2UKLQkJCXVTaXplUmVhZCA9IGNvbW1lbnRCdWZmZXJTaXplOworICAgICAgICBpZiAobFNlZWshPTApCisgICAgICAgICAgICBpZiAoWlNFRUsocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxsU2VlayxaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSKT09MCkKKyAgICAgICAgICAgICAgICBsU2Vlaz0wOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIGlmICgoZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYT4wKSAmJiAoZXh0cmFGaWVsZEJ1ZmZlclNpemU+MCkpCisgICAgICAgICAgICBpZiAoWlJFQUQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxleHRyYUZpZWxkLHVTaXplUmVhZCkhPXVTaXplUmVhZCkKKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICBsU2VlayArPSBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhIC0gdVNpemVSZWFkOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGxTZWVrKz1maWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhOwogCi0JCWlmIChsU2VlayE9MCkKLQkJCWlmIChmc2VlayhzLT5maWxlLGxTZWVrLFNFRUtfQ1VSKT09MCkKLQkJCQlsU2Vlaz0wOwotCQkJZWxzZQotCQkJCWVycj1VTlpfRVJSTk87Ci0JCWlmICgoZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50PjApICYmIChjb21tZW50QnVmZmVyU2l6ZT4wKSkKLQkJCWlmIChmcmVhZChzekNvbW1lbnQsKHVJbnQpdVNpemVSZWFkLDEscy0+ZmlsZSkhPTEpCi0JCQkJZXJyPVVOWl9FUlJOTzsKLQkJbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCAtIHVTaXplUmVhZDsKLQl9Ci0JZWxzZQotCQlsU2Vlays9ZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50OwogCi0JaWYgKChlcnI9PVVOWl9PSykgJiYgKHBmaWxlX2luZm8hPU5VTEwpKQotCQkqcGZpbGVfaW5mbz1maWxlX2luZm87CisgICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKHN6Q29tbWVudCE9TlVMTCkpCisgICAgeworICAgICAgICB1TG9uZyB1U2l6ZVJlYWQgOworICAgICAgICBpZiAoZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50PGNvbW1lbnRCdWZmZXJTaXplKQorICAgICAgICB7CisgICAgICAgICAgICAqKHN6Q29tbWVudCtmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQpPSdcMCc7CisgICAgICAgICAgICB1U2l6ZVJlYWQgPSBmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdVNpemVSZWFkID0gY29tbWVudEJ1ZmZlclNpemU7CiAKLQlpZiAoKGVycj09VU5aX09LKSAmJiAocGZpbGVfaW5mb19pbnRlcm5hbCE9TlVMTCkpCi0JCSpwZmlsZV9pbmZvX2ludGVybmFsPWZpbGVfaW5mb19pbnRlcm5hbDsKKyAgICAgICAgaWYgKGxTZWVrIT0wKQorICAgICAgICAgICAgaWYgKFpTRUVLKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sbFNlZWssWkxJQl9GSUxFRlVOQ19TRUVLX0NVUik9PTApCisgICAgICAgICAgICAgICAgbFNlZWs9MDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICBpZiAoKGZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudD4wKSAmJiAoY29tbWVudEJ1ZmZlclNpemU+MCkpCisgICAgICAgICAgICBpZiAoWlJFQUQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxzekNvbW1lbnQsdVNpemVSZWFkKSE9dVNpemVSZWFkKQorICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIGxTZWVrKz1maWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQgLSB1U2l6ZVJlYWQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudDsKIAotCXJldHVybiBlcnI7CisgICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKHBmaWxlX2luZm8hPU5VTEwpKQorICAgICAgICAqcGZpbGVfaW5mbz1maWxlX2luZm87CisKKyAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocGZpbGVfaW5mb19pbnRlcm5hbCE9TlVMTCkpCisgICAgICAgICpwZmlsZV9pbmZvX2ludGVybmFsPWZpbGVfaW5mb19pbnRlcm5hbDsKKworICAgIHJldHVybiBlcnI7CiB9CiAKIApAQCAtNjcwLDIzICs3NDIsMjMgQEAKICAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLgogKi8KIGV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRDdXJyZW50RmlsZUluZm8gKGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6RmlsZU5hbWUsIGZpbGVOYW1lQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFGaWVsZCwgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q29tbWVudCwgIGNvbW1lbnRCdWZmZXJTaXplKQotCXVuekZpbGUgZmlsZTsKLQl1bnpfZmlsZV9pbmZvICpwZmlsZV9pbmZvOwotCWNoYXIgKnN6RmlsZU5hbWU7Ci0JdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplOwotCXZvaWQgKmV4dHJhRmllbGQ7Ci0JdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemU7Ci0JY2hhciAqc3pDb21tZW50OwotCXVMb25nIGNvbW1lbnRCdWZmZXJTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6RmlsZU5hbWUsIGZpbGVOYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhRmllbGQsIGV4dHJhRmllbGRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pDb21tZW50LCAgY29tbWVudEJ1ZmZlclNpemUpCisgICAgdW56RmlsZSBmaWxlOworICAgIHVuel9maWxlX2luZm8gKnBmaWxlX2luZm87CisgICAgY2hhciAqc3pGaWxlTmFtZTsKKyAgICB1TG9uZyBmaWxlTmFtZUJ1ZmZlclNpemU7CisgICAgdm9pZCAqZXh0cmFGaWVsZDsKKyAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZTsKKyAgICBjaGFyICpzekNvbW1lbnQ7CisgICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemU7CiB7Ci0JcmV0dXJuIHVuemxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUscGZpbGVfaW5mbyxOVUxMLAotCQkJCQkJCQkJCQkJc3pGaWxlTmFtZSxmaWxlTmFtZUJ1ZmZlclNpemUsCi0JCQkJCQkJCQkJCQlleHRyYUZpZWxkLGV4dHJhRmllbGRCdWZmZXJTaXplLAotCQkJCQkJCQkJCQkJc3pDb21tZW50LGNvbW1lbnRCdWZmZXJTaXplKTsKKyAgICByZXR1cm4gdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSxwZmlsZV9pbmZvLE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLGZpbGVOYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhRmllbGQsZXh0cmFGaWVsZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekNvbW1lbnQsY29tbWVudEJ1ZmZlclNpemUpOwogfQogCiAvKgpAQCAtNjk0LDUwICs3NjYsNDkgQEAKICAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtCiAqLwogZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaXJzdEZpbGUgKGZpbGUpCi0JdW56RmlsZSBmaWxlOworICAgIHVuekZpbGUgZmlsZTsKIHsKLQlpbnQgZXJyPVVOWl9PSzsKLQl1bnpfcyogczsKLQlpZiAoZmlsZT09TlVMTCkKLQkJcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCXM9KHVuel9zKilmaWxlOwotCXMtPnBvc19pbl9jZW50cmFsX2Rpcj1zLT5vZmZzZXRfY2VudHJhbF9kaXI7Ci0Jcy0+bnVtX2ZpbGU9MDsKLQllcnI9dW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywKLQkJCQkJCQkJCQkJICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLAotCQkJCQkJCQkJCQkgTlVMTCwwLE5VTEwsMCxOVUxMLDApOwotCXMtPmN1cnJlbnRfZmlsZV9vayA9IChlcnIgPT0gVU5aX09LKTsKLQlyZXR1cm4gZXJyOworICAgIGludCBlcnI9VU5aX09LOworICAgIHVuel9zKiBzOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56X3MqKWZpbGU7CisgICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyPXMtPm9mZnNldF9jZW50cmFsX2RpcjsKKyAgICBzLT5udW1fZmlsZT0wOworICAgIGVycj11bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbChmaWxlLCZzLT5jdXJfZmlsZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwsMCk7CisgICAgcy0+Y3VycmVudF9maWxlX29rID0gKGVyciA9PSBVTlpfT0spOworICAgIHJldHVybiBlcnI7CiB9CiAKLQogLyoKICAgU2V0IHRoZSBjdXJyZW50IGZpbGUgb2YgdGhlIHppcGZpbGUgdG8gdGhlIG5leHQgZmlsZS4KICAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtCiAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSBpZiB0aGUgYWN0dWFsIGZpbGUgd2FzIHRoZSBsYXRlc3QuCiAqLwogZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9OZXh0RmlsZSAoZmlsZSkKLQl1bnpGaWxlIGZpbGU7CisgICAgdW56RmlsZSBmaWxlOwogewotCXVuel9zKiBzOwkKLQlpbnQgZXJyOworICAgIHVuel9zKiBzOworICAgIGludCBlcnI7CiAKLQlpZiAoZmlsZT09TlVMTCkKLQkJcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCXM9KHVuel9zKilmaWxlOwotCWlmICghcy0+Y3VycmVudF9maWxlX29rKQotCQlyZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7Ci0JaWYgKHMtPm51bV9maWxlKzE9PXMtPmdpLm51bWJlcl9lbnRyeSkKLQkJcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56X3MqKWZpbGU7CisgICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCisgICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKKyAgICBpZiAocy0+bnVtX2ZpbGUrMT09cy0+Z2kubnVtYmVyX2VudHJ5KQorICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7CiAKLQlzLT5wb3NfaW5fY2VudHJhbF9kaXIgKz0gU0laRUNFTlRSQUxESVJJVEVNICsgcy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVuYW1lICsKLQkJCXMtPmN1cl9maWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhICsgcy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCA7Ci0Jcy0+bnVtX2ZpbGUrKzsKLQllcnIgPSB1bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbChmaWxlLCZzLT5jdXJfZmlsZV9pbmZvLAotCQkJCQkJCQkJCQkgICAmcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCwKLQkJCQkJCQkJCQkJICAgTlVMTCwwLE5VTEwsMCxOVUxMLDApOwotCXMtPmN1cnJlbnRfZmlsZV9vayA9IChlcnIgPT0gVU5aX09LKTsKLQlyZXR1cm4gZXJyOworICAgIHMtPnBvc19pbl9jZW50cmFsX2RpciArPSBTSVpFQ0VOVFJBTERJUklURU0gKyBzLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUgKworICAgICAgICAgICAgcy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEgKyBzLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50IDsKKyAgICBzLT5udW1fZmlsZSsrOworICAgIGVyciA9IHVuemxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJnMtPmN1cl9maWxlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwsMCk7CisgICAgcy0+Y3VycmVudF9maWxlX29rID0gKGVyciA9PSBVTlpfT0spOworICAgIHJldHVybiBlcnI7CiB9CiAKIApAQCAtNzUwLDUyICs4MjEsMTE3IEBACiAgIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZAogKi8KIGV4dGVybiBpbnQgWkVYUE9SVCB1bnpMb2NhdGVGaWxlIChmaWxlLCBzekZpbGVOYW1lLCBpQ2FzZVNlbnNpdGl2aXR5KQotCXVuekZpbGUgZmlsZTsKLQljb25zdCBjaGFyICpzekZpbGVOYW1lOwotCWludCBpQ2FzZVNlbnNpdGl2aXR5OworICAgIHVuekZpbGUgZmlsZTsKKyAgICBjb25zdCBjaGFyICpzekZpbGVOYW1lOworICAgIGludCBpQ2FzZVNlbnNpdGl2aXR5OwogewotCXVuel9zKiBzOwkKLQlpbnQgZXJyOwotCi0JCi0JdUxvbmcgbnVtX2ZpbGVTYXZlZDsKLQl1TG9uZyBwb3NfaW5fY2VudHJhbF9kaXJTYXZlZDsKKyAgICB1bnpfcyogczsKKyAgICBpbnQgZXJyOwogCiAKLQlpZiAoZmlsZT09TlVMTCkKLQkJcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHVMb25nIG51bV9maWxlU2F2ZWQ7CisgICAgdUxvbmcgcG9zX2luX2NlbnRyYWxfZGlyU2F2ZWQ7CisKKworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CiAKICAgICBpZiAoc3RybGVuKHN6RmlsZU5hbWUpPj1VTlpfTUFYRklMRU5BTUVJTlpJUCkKICAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwogCi0Jcz0odW56X3MqKWZpbGU7Ci0JaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCi0JCXJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKKyAgICBzPSh1bnpfcyopZmlsZTsKKyAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykKKyAgICAgICAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFOwogCi0JbnVtX2ZpbGVTYXZlZCA9IHMtPm51bV9maWxlOwotCXBvc19pbl9jZW50cmFsX2RpclNhdmVkID0gcy0+cG9zX2luX2NlbnRyYWxfZGlyOworICAgIG51bV9maWxlU2F2ZWQgPSBzLT5udW1fZmlsZTsKKyAgICBwb3NfaW5fY2VudHJhbF9kaXJTYXZlZCA9IHMtPnBvc19pbl9jZW50cmFsX2RpcjsKIAotCWVyciA9IHVuekdvVG9GaXJzdEZpbGUoZmlsZSk7CisgICAgZXJyID0gdW56R29Ub0ZpcnN0RmlsZShmaWxlKTsKIAotCXdoaWxlIChlcnIgPT0gVU5aX09LKQotCXsKLQkJY2hhciBzekN1cnJlbnRGaWxlTmFtZVtVTlpfTUFYRklMRU5BTUVJTlpJUCsxXTsKLQkJdW56R2V0Q3VycmVudEZpbGVJbmZvKGZpbGUsTlVMTCwKLQkJCQkJCQkJc3pDdXJyZW50RmlsZU5hbWUsc2l6ZW9mKHN6Q3VycmVudEZpbGVOYW1lKS0xLAotCQkJCQkJCQlOVUxMLDAsTlVMTCwwKTsKLQkJaWYgKHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZShzekN1cnJlbnRGaWxlTmFtZSwKLQkJCQkJCQkJCQlzekZpbGVOYW1lLGlDYXNlU2Vuc2l0aXZpdHkpPT0wKQotCQkJcmV0dXJuIFVOWl9PSzsKLQkJZXJyID0gdW56R29Ub05leHRGaWxlKGZpbGUpOwotCX0KKyAgICB3aGlsZSAoZXJyID09IFVOWl9PSykKKyAgICB7CisgICAgICAgIGNoYXIgc3pDdXJyZW50RmlsZU5hbWVbVU5aX01BWEZJTEVOQU1FSU5aSVArMV07CisgICAgICAgIHVuekdldEN1cnJlbnRGaWxlSW5mbyhmaWxlLE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q3VycmVudEZpbGVOYW1lLHNpemVvZihzekN1cnJlbnRGaWxlTmFtZSktMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCk7CisgICAgICAgIGlmICh1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUoc3pDdXJyZW50RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pGaWxlTmFtZSxpQ2FzZVNlbnNpdGl2aXR5KT09MCkKKyAgICAgICAgICAgIHJldHVybiBVTlpfT0s7CisgICAgICAgIGVyciA9IHVuekdvVG9OZXh0RmlsZShmaWxlKTsKKyAgICB9CiAKLQlzLT5udW1fZmlsZSA9IG51bV9maWxlU2F2ZWQgOwotCXMtPnBvc19pbl9jZW50cmFsX2RpciA9IHBvc19pbl9jZW50cmFsX2RpclNhdmVkIDsKLQlyZXR1cm4gZXJyOworICAgIHMtPm51bV9maWxlID0gbnVtX2ZpbGVTYXZlZCA7CisgICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyID0gcG9zX2luX2NlbnRyYWxfZGlyU2F2ZWQgOworICAgIHJldHVybiBlcnI7CiB9CiAKIAogLyoKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnRyaWJ1dGVkIGJ5IFJ5YW4gSGFrc2kgKG1haWx0bzovL2NyeW9nZW5AaW5mb3NlcnZlLm5ldCkKKy8vIEkgbmVlZCByYW5kb20gYWNjZXNzCisvLworLy8gRnVydGhlciBvcHRpbWl6YXRpb24gY291bGQgYmUgcmVhbGl6ZWQgYnkgYWRkaW5nIGFuIGFiaWxpdHkKKy8vIHRvIGNhY2hlIHRoZSBkaXJlY3RvcnkgaW4gbWVtb3J5LiBUaGUgZ29hbCBiZWluZyBhIHNpbmdsZQorLy8gY29tcHJlaGVuc2l2ZSBmaWxlIHJlYWQgdG8gcHV0IHRoZSBmaWxlIEkgbmVlZCBpbiBhIG1lbW9yeS4KKyovCisKKy8qCit0eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9wb3NfcworeworICAgIHVMb25nIHBvc19pbl96aXBfZGlyZWN0b3J5OyAgIC8vIG9mZnNldCBpbiBmaWxlCisgICAgdUxvbmcgbnVtX29mX2ZpbGU7ICAgICAgICAgICAgLy8gIyBvZiBmaWxlCit9IHVuel9maWxlX3BvczsKKyovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRGaWxlUG9zKGZpbGUsIGZpbGVfcG9zKQorICAgIHVuekZpbGUgZmlsZTsKKyAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zOworeworICAgIHVuel9zKiBzOworCisgICAgaWYgKGZpbGU9PU5VTEwgfHwgZmlsZV9wb3M9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bnpfcyopZmlsZTsKKyAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykKKyAgICAgICAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFOworCisgICAgZmlsZV9wb3MtPnBvc19pbl96aXBfZGlyZWN0b3J5ICA9IHMtPnBvc19pbl9jZW50cmFsX2RpcjsKKyAgICBmaWxlX3Bvcy0+bnVtX29mX2ZpbGUgICAgICAgICAgID0gcy0+bnVtX2ZpbGU7CisKKyAgICByZXR1cm4gVU5aX09LOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub0ZpbGVQb3MoZmlsZSwgZmlsZV9wb3MpCisgICAgdW56RmlsZSBmaWxlOworICAgIHVuel9maWxlX3BvcyogZmlsZV9wb3M7Cit7CisgICAgdW56X3MqIHM7CisgICAgaW50IGVycjsKKworICAgIGlmIChmaWxlPT1OVUxMIHx8IGZpbGVfcG9zPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56X3MqKWZpbGU7CisKKyAgICAvKiBqdW1wIHRvIHRoZSByaWdodCBzcG90ICovCisgICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyID0gZmlsZV9wb3MtPnBvc19pbl96aXBfZGlyZWN0b3J5OworICAgIHMtPm51bV9maWxlICAgICAgICAgICA9IGZpbGVfcG9zLT5udW1fb2ZfZmlsZTsKKworICAgIC8qIHNldCB0aGUgY3VycmVudCBmaWxlICovCisgICAgZXJyID0gdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCwwKTsKKyAgICAvKiByZXR1cm4gcmVzdWx0cyAqLworICAgIHMtPmN1cnJlbnRfZmlsZV9vayA9IChlcnIgPT0gVU5aX09LKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorLy8gVW56aXAgSGVscGVyIEZ1bmN0aW9ucyAtIHNob3VsZCBiZSBoZXJlPworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworKi8KKworLyoKICAgUmVhZCB0aGUgbG9jYWwgaGVhZGVyIG9mIHRoZSBjdXJyZW50IHppcGZpbGUKICAgQ2hlY2sgdGhlIGNvaGVyZW5jeSBvZiB0aGUgbG9jYWwgaGVhZGVyIGFuZCBpbmZvIGluIHRoZSBlbmQgb2YgY2VudHJhbAogICAgICAgICBkaXJlY3RvcnkgYWJvdXQgdGhpcyBmaWxlCkBAIC04MDMsMTg1ICs5MzksMjU2IEBACiAgICAgICAgIChmaWxlbmFtZSBhbmQgc2l6ZSBvZiBleHRyYSBmaWVsZCBkYXRhKQogKi8KIGxvY2FsIGludCB1bnpsb2NhbF9DaGVja0N1cnJlbnRGaWxlQ29oZXJlbmN5SGVhZGVyIChzLHBpU2l6ZVZhciwKLQkJCQkJCQkJCQkJCQlwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQsCi0JCQkJCQkJCQkJCQkJcHNpemVfbG9jYWxfZXh0cmFmaWVsZCkKLQl1bnpfcyogczsKLQl1SW50KiBwaVNpemVWYXI7Ci0JdUxvbmcgKnBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsKLQl1SW50ICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNpemVfbG9jYWxfZXh0cmFmaWVsZCkKKyAgICB1bnpfcyogczsKKyAgICB1SW50KiBwaVNpemVWYXI7CisgICAgdUxvbmcgKnBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsKKyAgICB1SW50ICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZDsKIHsKLQl1TG9uZyB1TWFnaWMsdURhdGEsdUZsYWdzOwotCXVMb25nIHNpemVfZmlsZW5hbWU7Ci0JdUxvbmcgc2l6ZV9leHRyYV9maWVsZDsKLQlpbnQgZXJyPVVOWl9PSzsKKyAgICB1TG9uZyB1TWFnaWMsdURhdGEsdUZsYWdzOworICAgIHVMb25nIHNpemVfZmlsZW5hbWU7CisgICAgdUxvbmcgc2l6ZV9leHRyYV9maWVsZDsKKyAgICBpbnQgZXJyPVVOWl9PSzsKIAotCSpwaVNpemVWYXIgPSAwOwotCSpwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQgPSAwOwotCSpwc2l6ZV9sb2NhbF9leHRyYWZpZWxkID0gMDsKKyAgICAqcGlTaXplVmFyID0gMDsKKyAgICAqcG9mZnNldF9sb2NhbF9leHRyYWZpZWxkID0gMDsKKyAgICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZCA9IDA7CiAKLQlpZiAoZnNlZWsocy0+ZmlsZSxzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlICsKLQkJCQkJCQkJcy0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsU0VFS19TRVQpIT0wKQotCQlyZXR1cm4gVU5aX0VSUk5POworICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKIAogCi0JaWYgKGVycj09VU5aX09LKQotCQlpZiAodW56bG9jYWxfZ2V0TG9uZyhzLT5maWxlLCZ1TWFnaWMpICE9IFVOWl9PSykKLQkJCWVycj1VTlpfRVJSTk87Ci0JCWVsc2UgaWYgKHVNYWdpYyE9MHgwNDAzNGI1MCkKLQkJCWVycj1VTlpfQkFEWklQRklMRTsKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1TWFnaWMpICE9IFVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIGVsc2UgaWYgKHVNYWdpYyE9MHgwNDAzNGI1MCkKKyAgICAgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKIAotCWlmICh1bnpsb2NhbF9nZXRTaG9ydChzLT5maWxlLCZ1RGF0YSkgIT0gVU5aX09LKQotCQllcnI9VU5aX0VSUk5POworICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKIC8qCi0JZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8ud1ZlcnNpb24pKQotCQllcnI9VU5aX0JBRFpJUEZJTEU7CisgICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8ud1ZlcnNpb24pKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CiAqLwotCWlmICh1bnpsb2NhbF9nZXRTaG9ydChzLT5maWxlLCZ1RmxhZ3MpICE9IFVOWl9PSykKLQkJZXJyPVVOWl9FUlJOTzsKKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVGbGFncykgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JaWYgKHVuemxvY2FsX2dldFNob3J0KHMtPmZpbGUsJnVEYXRhKSAhPSBVTlpfT0spCi0JCWVycj1VTlpfRVJSTk87Ci0JZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kKSkKLQkJZXJyPVVOWl9CQURaSVBGSUxFOworICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QpKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CiAKICAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPTApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kIT1aX0RFRkxBVEVEKSkKICAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwogCi0JaWYgKHVuemxvY2FsX2dldExvbmcocy0+ZmlsZSwmdURhdGEpICE9IFVOWl9PSykgLyogZGF0ZS90aW1lICovCi0JCWVycj1VTlpfRVJSTk87CisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spIC8qIGRhdGUvdGltZSAqLworICAgICAgICBlcnI9VU5aX0VSUk5POwogCi0JaWYgKHVuemxvY2FsX2dldExvbmcocy0+ZmlsZSwmdURhdGEpICE9IFVOWl9PSykgLyogY3JjICovCi0JCWVycj1VTlpfRVJSTk87Ci0JZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8uY3JjKSAmJgotCQkgICAgICAgICAgICAgICAgICAgICAgKCh1RmxhZ3MgJiA4KT09MCkpCi0JCWVycj1VTlpfQkFEWklQRklMRTsKKyAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykgLyogY3JjICovCisgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8uY3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1RmxhZ3MgJiA4KT09MCkpCisgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKIAotCWlmICh1bnpsb2NhbF9nZXRMb25nKHMtPmZpbGUsJnVEYXRhKSAhPSBVTlpfT0spIC8qIHNpemUgY29tcHIgKi8KLQkJZXJyPVVOWl9FUlJOTzsKLQllbHNlIGlmICgoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUpICYmCi0JCQkJCQkJICAoKHVGbGFncyAmIDgpPT0wKSkKLQkJZXJyPVVOWl9CQURaSVBGSUxFOworICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBzaXplIGNvbXByICovCisgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8uY29tcHJlc3NlZF9zaXplKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1RmxhZ3MgJiA4KT09MCkpCisgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKIAotCWlmICh1bnpsb2NhbF9nZXRMb25nKHMtPmZpbGUsJnVEYXRhKSAhPSBVTlpfT0spIC8qIHNpemUgdW5jb21wciAqLwotCQllcnI9VU5aX0VSUk5POwotCWVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplKSAmJiAKLQkJCQkJCQkgICgodUZsYWdzICYgOCk9PTApKQotCQllcnI9VU5aX0JBRFpJUEZJTEU7CisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spIC8qIHNpemUgdW5jb21wciAqLworICAgICAgICBlcnI9VU5aX0VSUk5POworICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1RmxhZ3MgJiA4KT09MCkpCisgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKIAogCi0JaWYgKHVuemxvY2FsX2dldFNob3J0KHMtPmZpbGUsJnNpemVfZmlsZW5hbWUpICE9IFVOWl9PSykKLQkJZXJyPVVOWl9FUlJOTzsKLQllbHNlIGlmICgoZXJyPT1VTlpfT0spICYmIChzaXplX2ZpbGVuYW1lIT1zLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUpKQotCQllcnI9VU5aX0JBRFpJUEZJTEU7CisgICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZzaXplX2ZpbGVuYW1lKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAoc2l6ZV9maWxlbmFtZSE9cy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVuYW1lKSkKKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwogCi0JKnBpU2l6ZVZhciArPSAodUludClzaXplX2ZpbGVuYW1lOworICAgICpwaVNpemVWYXIgKz0gKHVJbnQpc2l6ZV9maWxlbmFtZTsKIAotCWlmICh1bnpsb2NhbF9nZXRTaG9ydChzLT5maWxlLCZzaXplX2V4dHJhX2ZpZWxkKSAhPSBVTlpfT0spCi0JCWVycj1VTlpfRVJSTk87Ci0JKnBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZD0gcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbC5vZmZzZXRfY3VyZmlsZSArCi0JCQkJCQkJCQlTSVpFWklQTE9DQUxIRUFERVIgKyBzaXplX2ZpbGVuYW1lOwotCSpwc2l6ZV9sb2NhbF9leHRyYWZpZWxkID0gKHVJbnQpc2l6ZV9leHRyYV9maWVsZDsKKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnNpemVfZXh0cmFfZmllbGQpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAqcG9mZnNldF9sb2NhbF9leHRyYWZpZWxkPSBzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVaSVBMT0NBTEhFQURFUiArIHNpemVfZmlsZW5hbWU7CisgICAgKnBzaXplX2xvY2FsX2V4dHJhZmllbGQgPSAodUludClzaXplX2V4dHJhX2ZpZWxkOwogCi0JKnBpU2l6ZVZhciArPSAodUludClzaXplX2V4dHJhX2ZpZWxkOworICAgICpwaVNpemVWYXIgKz0gKHVJbnQpc2l6ZV9leHRyYV9maWVsZDsKIAotCXJldHVybiBlcnI7CisgICAgcmV0dXJuIGVycjsKIH0KLQkJCQkJCQkJCQkJCQorCiAvKgogICBPcGVuIGZvciByZWFkaW5nIGRhdGEgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZS4KICAgSWYgdGhlcmUgaXMgbm8gZXJyb3IgYW5kIHRoZSBmaWxlIGlzIG9wZW5lZCwgdGhlIHJldHVybiB2YWx1ZSBpcyBVTlpfT0suCiAqLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZSAoZmlsZSkKLQl1bnpGaWxlIGZpbGU7CitleHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlMyAoZmlsZSwgbWV0aG9kLCBsZXZlbCwgcmF3LCBwYXNzd29yZCkKKyAgICB1bnpGaWxlIGZpbGU7CisgICAgaW50KiBtZXRob2Q7CisgICAgaW50KiBsZXZlbDsKKyAgICBpbnQgcmF3OworICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOwogewotCWludCBlcnI9VU5aX09LOwotCWludCBTdG9yZTsKLQl1SW50IGlTaXplVmFyOwotCXVuel9zKiBzOwotCWZpbGVfaW5femlwX3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOwotCXVMb25nIG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOyAgLyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLwotCXVJbnQgIHNpemVfbG9jYWxfZXh0cmFmaWVsZDsgICAgLyogc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgKi8KKyAgICBpbnQgZXJyPVVOWl9PSzsKKyAgICB1SW50IGlTaXplVmFyOworICAgIHVuel9zKiBzOworICAgIGZpbGVfaW5femlwX3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOworICAgIHVMb25nIG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOyAgLyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLworICAgIHVJbnQgIHNpemVfbG9jYWxfZXh0cmFmaWVsZDsgICAgLyogc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgKi8KKyAgICAjaWZuZGVmIE5PVU5DUlBZVAorICAgIGNoYXIgc291cmNlWzEyXTsKKyAgICAjZWxzZQorICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgI2VuZGlmCiAKLQlpZiAoZmlsZT09TlVMTCkKLQkJcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCXM9KHVuel9zKilmaWxlOwotCWlmICghcy0+Y3VycmVudF9maWxlX29rKQotCQlyZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bnpfcyopZmlsZTsKKyAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwogCiAgICAgaWYgKHMtPnBmaWxlX2luX3ppcF9yZWFkICE9IE5VTEwpCiAgICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUoZmlsZSk7CiAKLQlpZiAodW56bG9jYWxfQ2hlY2tDdXJyZW50RmlsZUNvaGVyZW5jeUhlYWRlcihzLCZpU2l6ZVZhciwKLQkJCQkmb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQsJnNpemVfbG9jYWxfZXh0cmFmaWVsZCkhPVVOWl9PSykKLQkJcmV0dXJuIFVOWl9CQURaSVBGSUxFOworICAgIGlmICh1bnpsb2NhbF9DaGVja0N1cnJlbnRGaWxlQ29oZXJlbmN5SGVhZGVyKHMsJmlTaXplVmFyLAorICAgICAgICAgICAgICAgICZvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCwmc2l6ZV9sb2NhbF9leHRyYWZpZWxkKSE9VU5aX09LKQorICAgICAgICByZXR1cm4gVU5aX0JBRFpJUEZJTEU7CiAKLQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvID0gKGZpbGVfaW5femlwX3JlYWRfaW5mb19zKikKLQkJCQkJCQkJCSAgICBBTExPQyhzaXplb2YoZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MpKTsKLQlpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKLQkJcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8gPSAoZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMTE9DKHNpemVvZihmaWxlX2luX3ppcF9yZWFkX2luZm9fcykpOworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7CiAKLQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcj0oY2hhciopQUxMT0MoVU5aX0JVRlNJWkUpOwotCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPm9mZnNldF9sb2NhbF9leHRyYWZpZWxkID0gb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQ7Ci0JcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c2l6ZV9sb2NhbF9leHRyYWZpZWxkID0gc2l6ZV9sb2NhbF9leHRyYWZpZWxkOwotCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19sb2NhbF9leHRyYWZpZWxkPTA7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI9KGNoYXIqKUFMTE9DKFVOWl9CVUZTSVpFKTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5vZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCA9IG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnNpemVfbG9jYWxfZXh0cmFmaWVsZCA9IHNpemVfbG9jYWxfZXh0cmFmaWVsZDsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZD0wOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJhdz1yYXc7CiAKLQlpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI9PU5VTEwpCi0JewotCQlUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8pOwotCQlyZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7Ci0JfQorICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcj09TlVMTCkKKyAgICB7CisgICAgICAgIFRSWUZSRUUocGZpbGVfaW5femlwX3JlYWRfaW5mbyk7CisgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKKyAgICB9CiAKLQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQ9MDsKLQkKLQlpZiAoKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kIT0wKSAmJgorICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZD0wOworCisgICAgaWYgKG1ldGhvZCE9TlVMTCkKKyAgICAgICAgKm1ldGhvZCA9IChpbnQpcy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q7CisKKyAgICBpZiAobGV2ZWwhPU5VTEwpCisgICAgeworICAgICAgICAqbGV2ZWwgPSA2OworICAgICAgICBzd2l0Y2ggKHMtPmN1cl9maWxlX2luZm8uZmxhZyAmIDB4MDYpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIDYgOiAqbGV2ZWwgPSAxOyBicmVhazsKKyAgICAgICAgICBjYXNlIDQgOiAqbGV2ZWwgPSAyOyBicmVhazsKKyAgICAgICAgICBjYXNlIDIgOiAqbGV2ZWwgPSA5OyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPTApICYmCiAgICAgICAgIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9Wl9ERUZMQVRFRCkpCi0JCWVycj1VTlpfQkFEWklQRklMRTsKLQlTdG9yZSA9IHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kPT0wOworICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CiAKLQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMl93YWl0PXMtPmN1cl9maWxlX2luZm8uY3JjOwotCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyPTA7Ci0JcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y29tcHJlc3Npb25fbWV0aG9kID0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMl93YWl0PXMtPmN1cl9maWxlX2luZm8uY3JjOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyPTA7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y29tcHJlc3Npb25fbWV0aG9kID0KICAgICAgICAgICAgIHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kOwotCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGU9cy0+ZmlsZTsKLQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZT1zLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlc3RyZWFtPXMtPmZpbGVzdHJlYW07CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+el9maWxlZnVuYz1zLT56X2ZpbGVmdW5jOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlPXMtPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOwogCiAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dCA9IDA7CiAKLQlpZiAoIVN0b3JlKQotCXsKLQkgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotCSAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwotCSAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsgCi0gICAgICAKLQkgIGVycj1pbmZsYXRlSW5pdDIoJnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbSwgLU1BWF9XQklUUyk7Ci0JICBpZiAoZXJyID09IFpfT0spCi0JICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZD0xOworICAgIGlmICgocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PVpfREVGTEFURUQpICYmCisgICAgICAgICghcmF3KSkKKyAgICB7CisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICAgIGVycj1pbmZsYXRlSW5pdDIoJnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbSwgLU1BWF9XQklUUyk7CisgICAgICBpZiAoZXJyID09IFpfT0spCisgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZD0xOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAvKiB3aW5kb3dCaXRzIGlzIHBhc3NlZCA8IDAgdG8gdGVsbCB0aGF0IHRoZXJlIGlzIG5vIHpsaWIgaGVhZGVyLgogICAgICAgICAgKiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlIGluZmxhdGUgKnJlcXVpcmVzKiBhbiBleHRyYSAiZHVtbXkiIGJ5dGUKICAgICAgICAgICogYWZ0ZXIgdGhlIGNvbXByZXNzZWQgc3RyZWFtIGluIG9yZGVyIHRvIGNvbXBsZXRlIGRlY29tcHJlc3Npb24gYW5kCi0gICAgICAgICAqIHJldHVybiBaX1NUUkVBTV9FTkQuIAotICAgICAgICAgKiBJbiB1bnppcCwgaSBkb24ndCB3YWl0IGFic29sdXRlbHkgWl9TVFJFQU1fRU5EIGJlY2F1c2UgSSBrbm93biB0aGUgCisgICAgICAgICAqIHJldHVybiBaX1NUUkVBTV9FTkQuCisgICAgICAgICAqIEluIHVuemlwLCBpIGRvbid0IHdhaXQgYWJzb2x1dGVseSBaX1NUUkVBTV9FTkQgYmVjYXVzZSBJIGtub3duIHRoZQogICAgICAgICAgKiBzaXplIG9mIGJvdGggY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIGRhdGEKICAgICAgICAgICovCi0JfQotCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkID0gCisgICAgfQorICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkID0KICAgICAgICAgICAgIHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3NlZF9zaXplIDsKLQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID0gCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9CiAgICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplIDsKIAotCQotCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19pbl96aXBmaWxlID0gCi0gICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlICsgU0laRVpJUExPQ0FMSEVBREVSICsgCi0JCQkgIGlTaXplVmFyOwotCQotCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KTA7CisKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSA9CisgICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlICsgU0laRVpJUExPQ0FMSEVBREVSICsKKyAgICAgICAgICAgICAgaVNpemVWYXI7CisKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludCkwOworCisgICAgcy0+cGZpbGVfaW5femlwX3JlYWQgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOworCisgICAgI2lmbmRlZiBOT1VOQ1JQWVQKKyAgICBpZiAocGFzc3dvcmQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBzLT5wY3JjXzMyX3RhYiA9IGdldF9jcmNfdGFibGUoKTsKKyAgICAgICAgaW5pdF9rZXlzKHBhc3N3b3JkLHMtPmtleXMscy0+cGNyY18zMl90YWIpOworICAgICAgICBpZiAoWlNFRUsocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkLT5wb3NfaW5femlwZmlsZSArCisgICAgICAgICAgICAgICAgICAgICBzLT5wZmlsZV9pbl96aXBfcmVhZC0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsCisgICAgICAgICAgICAgICAgICBTRUVLX1NFVCkhPTApCisgICAgICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7CisgICAgICAgIGlmKFpSRUFEKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sc291cmNlLCAxMik8MTIpCisgICAgICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7CisKKyAgICAgICAgZm9yIChpID0gMDsgaTwxMjsgaSsrKQorICAgICAgICAgICAgemRlY29kZShzLT5rZXlzLHMtPnBjcmNfMzJfdGFiLHNvdXJjZVtpXSk7CisKKyAgICAgICAgcy0+cGZpbGVfaW5femlwX3JlYWQtPnBvc19pbl96aXBmaWxlKz0xMjsKKyAgICAgICAgcy0+ZW5jcnlwdGVkPTE7CisgICAgfQorICAgICNlbmRpZgogCiAKLQlzLT5wZmlsZV9pbl96aXBfcmVhZCA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm87CiAgICAgcmV0dXJuIFVOWl9PSzsKIH0KIAorZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZSAoZmlsZSkKKyAgICB1bnpGaWxlIGZpbGU7Cit7CisgICAgcmV0dXJuIHVuek9wZW5DdXJyZW50RmlsZTMoZmlsZSwgTlVMTCwgTlVMTCwgMCwgTlVMTCk7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCAoZmlsZSwgcGFzc3dvcmQpCisgICAgdW56RmlsZSBmaWxlOworICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOworeworICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIE5VTEwsIE5VTEwsIDAsIHBhc3N3b3JkKTsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTIgKGZpbGUsbWV0aG9kLGxldmVsLHJhdykKKyAgICB1bnpGaWxlIGZpbGU7CisgICAgaW50KiBtZXRob2Q7CisgICAgaW50KiBsZXZlbDsKKyAgICBpbnQgcmF3OworeworICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIG1ldGhvZCwgbGV2ZWwsIHJhdywgTlVMTCk7Cit9CiAKIC8qCiAgIFJlYWQgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBmaWxlLgpAQCAtOTk0LDEyNiArMTIwMSwxNDkgQEAKICAgICAoVU5aX0VSUk5PIGZvciBJTyBlcnJvciwgb3IgekxpYiBlcnJvciBmb3IgdW5jb21wcmVzcyBlcnJvcikKICovCiBleHRlcm4gaW50IFpFWFBPUlQgdW56UmVhZEN1cnJlbnRGaWxlICAoZmlsZSwgYnVmLCBsZW4pCi0JdW56RmlsZSBmaWxlOwotCXZvaWRwIGJ1ZjsKLQl1bnNpZ25lZCBsZW47CisgICAgdW56RmlsZSBmaWxlOworICAgIHZvaWRwIGJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47CiB7Ci0JaW50IGVycj1VTlpfT0s7Ci0JdUludCBpUmVhZCA9IDA7Ci0JdW56X3MqIHM7Ci0JZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0JaWYgKGZpbGU9PU5VTEwpCi0JCXJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQlzPSh1bnpfcyopZmlsZTsKKyAgICBpbnQgZXJyPVVOWl9PSzsKKyAgICB1SW50IGlSZWFkID0gMDsKKyAgICB1bnpfcyogczsKKyAgICBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuel9zKilmaWxlOwogICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7CiAKLQlpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKLQkJcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CiAKIAotCWlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIgPT0gTlVMTCkpCi0JCXJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKLQlpZiAobGVuPT0wKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyID09IE5VTEwpKQorICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7CisgICAgaWYgKGxlbj09MCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZWYqKWJ1ZjsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZWYqKWJ1ZjsKIAotCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClsZW47Ci0JCi0JaWYgKGxlbj5wZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkKQotCQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0ID0gCi0JCSAgKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZDsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpbGVuOwogCi0Jd2hpbGUgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQ+MCkKLQl7Ci0JCWlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luPT0wKSAmJgorICAgIGlmIChsZW4+cGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCkKKyAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA9CisgICAgICAgICAgKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZDsKKworICAgIHdoaWxlIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0PjApCisgICAgeworICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbj09MCkgJiYKICAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZD4wKSkKLQkJewotCQkJdUludCB1UmVhZFRoaXMgPSBVTlpfQlVGU0laRTsKLQkJCWlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZDx1UmVhZFRoaXMpCi0JCQkJdVJlYWRUaGlzID0gKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQ7Ci0JCQlpZiAodVJlYWRUaGlzID09IDApCi0JCQkJcmV0dXJuIFVOWl9FT0Y7Ci0JCQlpZiAoZnNlZWsocGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSArIAotICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLFNFRUtfU0VUKSE9MCkKLQkJCQlyZXR1cm4gVU5aX0VSUk5POwotCQkJaWYgKGZyZWFkKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyLHVSZWFkVGhpcywxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGUpIT0xKQotCQkJCXJldHVybiBVTlpfRVJSTk87Ci0JCQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSArPSB1UmVhZFRoaXM7CisgICAgICAgIHsKKyAgICAgICAgICAgIHVJbnQgdVJlYWRUaGlzID0gVU5aX0JVRlNJWkU7CisgICAgICAgICAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQ8dVJlYWRUaGlzKQorICAgICAgICAgICAgICAgIHVSZWFkVGhpcyA9ICh1SW50KXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkOworICAgICAgICAgICAgaWYgKHVSZWFkVGhpcyA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBVTlpfRU9GOworICAgICAgICAgICAgaWYgKFpTRUVLKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKKyAgICAgICAgICAgIGlmIChaUkVBRChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jLAorICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgdVJlYWRUaGlzKSE9dVJlYWRUaGlzKQorICAgICAgICAgICAgICAgIHJldHVybiBVTlpfRVJSTk87CiAKLQkJCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkLT11UmVhZFRoaXM7Ci0JCQkKLQkJCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luID0gCisKKyAgICAgICAgICAgICNpZm5kZWYgTk9VTkNSUFlUCisgICAgICAgICAgICBpZihzLT5lbmNyeXB0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdUludCBpOworICAgICAgICAgICAgICAgIGZvcihpPTA7aTx1UmVhZFRoaXM7aSsrKQorICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXJbaV0gPQorICAgICAgICAgICAgICAgICAgICAgIHpkZWNvZGUocy0+a2V5cyxzLT5wY3JjXzMyX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19pbl96aXBmaWxlICs9IHVSZWFkVGhpczsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQtPXVSZWFkVGhpczsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW4gPQogICAgICAgICAgICAgICAgIChCeXRlZiopcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI7Ci0JCQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1UmVhZFRoaXM7Ci0JCX0KKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXVSZWFkVGhpczsKKyAgICAgICAgfQogCi0JCWlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jb21wcmVzc2lvbl9tZXRob2Q9PTApCi0JCXsKLQkJCXVJbnQgdURvQ29weSxpIDsKLQkJCWlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0IDwgCisgICAgICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y29tcHJlc3Npb25fbWV0aG9kPT0wKSB8fCAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkKKyAgICAgICAgeworICAgICAgICAgICAgdUludCB1RG9Db3B5LGkgOworCisgICAgICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSAmJgorICAgICAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCA9PSAwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGlSZWFkPT0wKSA/IFVOWl9FT0YgOiBpUmVhZDsKKworICAgICAgICAgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbikKLQkJCQl1RG9Db3B5ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA7Ci0JCQllbHNlCi0JCQkJdURvQ29weSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA7Ci0JCQkJCi0JCQlmb3IgKGk9MDtpPHVEb0NvcHk7aSsrKQotCQkJCSoocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0K2kpID0KKyAgICAgICAgICAgICAgICB1RG9Db3B5ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdURvQ29weSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA7CisKKyAgICAgICAgICAgIGZvciAoaT0wO2k8dURvQ29weTtpKyspCisgICAgICAgICAgICAgICAgKihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQraSkgPQogICAgICAgICAgICAgICAgICAgICAgICAgKihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbitpKTsKLQkJCQkJCi0JCQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiA9IGNyYzMyKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyLAotCQkJCQkJCQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQsCi0JCQkJCQkJCXVEb0NvcHkpOwotCQkJcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZC09dURvQ29weTsKLQkJCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiAtPSB1RG9Db3B5OwotCQkJcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCAtPSB1RG9Db3B5OwotCQkJcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0ICs9IHVEb0NvcHk7Ci0JCQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbiArPSB1RG9Db3B5OworCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiA9IGNyYzMyKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVEb0NvcHkpOworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZC09dURvQ29weTsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiAtPSB1RG9Db3B5OworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCAtPSB1RG9Db3B5OworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0ICs9IHVEb0NvcHk7CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbiArPSB1RG9Db3B5OwogICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dCArPSB1RG9Db3B5OwotCQkJaVJlYWQgKz0gdURvQ29weTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXVMb25nIHVUb3RhbE91dEJlZm9yZSx1VG90YWxPdXRBZnRlcjsKLQkJCWNvbnN0IEJ5dGVmICpidWZCZWZvcmU7Ci0JCQl1TG9uZyB1T3V0VGhpczsKLQkJCWludCBmbHVzaD1aX1NZTkNfRkxVU0g7CisgICAgICAgICAgICBpUmVhZCArPSB1RG9Db3B5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdUxvbmcgdVRvdGFsT3V0QmVmb3JlLHVUb3RhbE91dEFmdGVyOworICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmJ1ZkJlZm9yZTsKKyAgICAgICAgICAgIHVMb25nIHVPdXRUaGlzOworICAgICAgICAgICAgaW50IGZsdXNoPVpfU1lOQ19GTFVTSDsKIAotCQkJdVRvdGFsT3V0QmVmb3JlID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKLQkJCWJ1ZkJlZm9yZSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dDsKKyAgICAgICAgICAgIHVUb3RhbE91dEJlZm9yZSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgICAgICBidWZCZWZvcmUgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQ7CiAKLQkJCS8qCi0JCQlpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgPT0KLQkJCSAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQpICYmCi0JCQkJKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkID09IDApKQotCQkJCWZsdXNoID0gWl9GSU5JU0g7Ci0JCQkqLwotCQkJZXJyPWluZmxhdGUoJnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbSxmbHVzaCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID09CisgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0KSAmJgorICAgICAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCA9PSAwKSkKKyAgICAgICAgICAgICAgICBmbHVzaCA9IFpfRklOSVNIOworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGVycj1pbmZsYXRlKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0sZmx1c2gpOwogCi0JCQl1VG90YWxPdXRBZnRlciA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQ7Ci0JCQl1T3V0VGhpcyA9IHVUb3RhbE91dEFmdGVyLXVUb3RhbE91dEJlZm9yZTsKLQkJCQotCQkJcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgPSAKKyAgICAgICAgICAgIHVUb3RhbE91dEFmdGVyID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgICAgIHVPdXRUaGlzID0gdVRvdGFsT3V0QWZ0ZXItdVRvdGFsT3V0QmVmb3JlOworCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiA9CiAgICAgICAgICAgICAgICAgY3JjMzIocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIsYnVmQmVmb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgKHVJbnQpKHVPdXRUaGlzKSk7CiAKLQkJCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgLT0KKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgLT0KICAgICAgICAgICAgICAgICB1T3V0VGhpczsKIAotCQkJaVJlYWQgKz0gKHVJbnQpKHVUb3RhbE91dEFmdGVyIC0gdVRvdGFsT3V0QmVmb3JlKTsKLSAgICAgICAgICAgIAotCQkJaWYgKGVycj09Wl9TVFJFQU1fRU5EKQotCQkJCXJldHVybiAoaVJlYWQ9PTApID8gVU5aX0VPRiA6IGlSZWFkOwotCQkJaWYgKGVyciE9Wl9PSykgCi0JCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgICAgICAgICBpUmVhZCArPSAodUludCkodVRvdGFsT3V0QWZ0ZXIgLSB1VG90YWxPdXRCZWZvcmUpOwogCi0JaWYgKGVycj09Wl9PSykKLQkJcmV0dXJuIGlSZWFkOwotCXJldHVybiBlcnI7CisgICAgICAgICAgICBpZiAoZXJyPT1aX1NUUkVBTV9FTkQpCisgICAgICAgICAgICAgICAgcmV0dXJuIChpUmVhZD09MCkgPyBVTlpfRU9GIDogaVJlYWQ7CisgICAgICAgICAgICBpZiAoZXJyIT1aX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVycj09Wl9PSykKKyAgICAgICAgcmV0dXJuIGlSZWFkOworICAgIHJldHVybiBlcnI7CiB9CiAKIApAQCAtMTEyMSw0MiArMTM1MSw0MiBAQAogICBHaXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHVuY29tcHJlc3NlZCBkYXRhCiAqLwogZXh0ZXJuIHpfb2ZmX3QgWkVYUE9SVCB1bnp0ZWxsIChmaWxlKQotCXVuekZpbGUgZmlsZTsKKyAgICB1bnpGaWxlIGZpbGU7CiB7Ci0JdW56X3MqIHM7Ci0JZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0JaWYgKGZpbGU9PU5VTEwpCi0JCXJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQlzPSh1bnpfcyopZmlsZTsKKyAgICB1bnpfcyogczsKKyAgICBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuel9zKilmaWxlOwogICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7CiAKLQlpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKLQkJcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CiAKLQlyZXR1cm4gKHpfb2ZmX3QpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKKyAgICByZXR1cm4gKHpfb2ZmX3QpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKIH0KIAogCiAvKgotICByZXR1cm4gMSBpZiB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQsIDAgZWxzZXdoZXJlIAorICByZXR1cm4gMSBpZiB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQsIDAgZWxzZXdoZXJlCiAqLwogZXh0ZXJuIGludCBaRVhQT1JUIHVuemVvZiAoZmlsZSkKLQl1bnpGaWxlIGZpbGU7CisgICAgdW56RmlsZSBmaWxlOwogewotCXVuel9zKiBzOwotCWZpbGVfaW5femlwX3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOwotCWlmIChmaWxlPT1OVUxMKQotCQlyZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0Jcz0odW56X3MqKWZpbGU7CisgICAgdW56X3MqIHM7CisgICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87CisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bnpfcyopZmlsZTsKICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOwogCi0JaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCi0JCXJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQkKLQlpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9PSAwKQotCQlyZXR1cm4gMTsKLQllbHNlCi0JCXJldHVybiAwOworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9PSAwKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOwogfQogCiAKQEAgLTExNjksNTEgKzEzOTksNTUgQEAKICAgaWYgYnVmPT1OVUxMLCBpdCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkIHRoYXQgY2FuIGJlIHJlYWQKIAogICBpZiBidWYhPU5VTEwsIGxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCB0aGUgZXh0cmEgaGVhZGVyIGlzIGNvcGllZCBpbgotCWJ1Zi4KLSAgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbiBidWYsIG9yIChpZiA8MCkgCi0JdGhlIGVycm9yIGNvZGUKKyAgICBidWYuCisgIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW4gYnVmLCBvciAoaWYgPDApCisgICAgdGhlIGVycm9yIGNvZGUKICovCiBleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0TG9jYWxFeHRyYWZpZWxkIChmaWxlLGJ1ZixsZW4pCi0JdW56RmlsZSBmaWxlOwotCXZvaWRwIGJ1ZjsKLQl1bnNpZ25lZCBsZW47CisgICAgdW56RmlsZSBmaWxlOworICAgIHZvaWRwIGJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47CiB7Ci0JdW56X3MqIHM7Ci0JZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0JdUludCByZWFkX25vdzsKLQl1TG9uZyBzaXplX3RvX3JlYWQ7CisgICAgdW56X3MqIHM7CisgICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87CisgICAgdUludCByZWFkX25vdzsKKyAgICB1TG9uZyBzaXplX3RvX3JlYWQ7CiAKLQlpZiAoZmlsZT09TlVMTCkKLQkJcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCXM9KHVuel9zKilmaWxlOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56X3MqKWZpbGU7CiAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsKIAotCWlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQotCQlyZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKIAotCXNpemVfdG9fcmVhZCA9IChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zaXplX2xvY2FsX2V4dHJhZmllbGQgLSAKLQkJCQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZCk7CisgICAgc2l6ZV90b19yZWFkID0gKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnNpemVfbG9jYWxfZXh0cmFmaWVsZCAtCisgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2xvY2FsX2V4dHJhZmllbGQpOwogCi0JaWYgKGJ1Zj09TlVMTCkKLQkJcmV0dXJuIChpbnQpc2l6ZV90b19yZWFkOwotCQotCWlmIChsZW4+c2l6ZV90b19yZWFkKQotCQlyZWFkX25vdyA9ICh1SW50KXNpemVfdG9fcmVhZDsKLQllbHNlCi0JCXJlYWRfbm93ID0gKHVJbnQpbGVuIDsKKyAgICBpZiAoYnVmPT1OVUxMKQorICAgICAgICByZXR1cm4gKGludClzaXplX3RvX3JlYWQ7CiAKLQlpZiAocmVhZF9ub3c9PTApCi0JCXJldHVybiAwOwotCQotCWlmIChmc2VlayhwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlLAotICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5vZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCArIAotCQkJICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZCxTRUVLX1NFVCkhPTApCi0JCXJldHVybiBVTlpfRVJSTk87CisgICAgaWYgKGxlbj5zaXplX3RvX3JlYWQpCisgICAgICAgIHJlYWRfbm93ID0gKHVJbnQpc2l6ZV90b19yZWFkOworICAgIGVsc2UKKyAgICAgICAgcmVhZF9ub3cgPSAodUludClsZW4gOwogCi0JaWYgKGZyZWFkKGJ1ZiwodUludClzaXplX3RvX3JlYWQsMSxwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlKSE9MSkKLQkJcmV0dXJuIFVOWl9FUlJOTzsKKyAgICBpZiAocmVhZF9ub3c9PTApCisgICAgICAgIHJldHVybiAwOwogCi0JcmV0dXJuIChpbnQpcmVhZF9ub3c7CisgICAgaWYgKFpTRUVLKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmMsCisgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPm9mZnNldF9sb2NhbF9leHRyYWZpZWxkICsKKyAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2xvY2FsX2V4dHJhZmllbGQsCisgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICByZXR1cm4gVU5aX0VSUk5POworCisgICAgaWYgKFpSRUFEKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmMsCisgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgIGJ1ZixzaXplX3RvX3JlYWQpIT1zaXplX3RvX3JlYWQpCisgICAgICAgIHJldHVybiBVTlpfRVJSTk87CisKKyAgICByZXR1cm4gKGludClyZWFkX25vdzsKIH0KIAogLyoKQEAgLTEyMjEsMzkgKzE0NTUsNDAgQEAKICAgUmV0dXJuIFVOWl9DUkNFUlJPUiBpZiBhbGwgdGhlIGZpbGUgd2FzIHJlYWQgYnV0IHRoZSBDUkMgaXMgbm90IGdvb2QKICovCiBleHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2VDdXJyZW50RmlsZSAoZmlsZSkKLQl1bnpGaWxlIGZpbGU7CisgICAgdW56RmlsZSBmaWxlOwogewotCWludCBlcnI9VU5aX09LOworICAgIGludCBlcnI9VU5aX09LOwogCi0JdW56X3MqIHM7Ci0JZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0JaWYgKGZpbGU9PU5VTEwpCi0JCXJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQlzPSh1bnpfcyopZmlsZTsKKyAgICB1bnpfcyogczsKKyAgICBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuel9zKilmaWxlOwogICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7CiAKLQlpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKLQkJcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CiAKIAotCWlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID09IDApCi0JewotCQlpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgIT0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzJfd2FpdCkKLQkJCWVycj1VTlpfQ1JDRVJST1I7Ci0JfQorICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9PSAwKSAmJgorICAgICAgICAoIXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJhdykpCisgICAgeworICAgICAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgIT0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzJfd2FpdCkKKyAgICAgICAgICAgIGVycj1VTlpfQ1JDRVJST1I7CisgICAgfQogCiAKLQlUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyKTsKLQlwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlciA9IE5VTEw7Ci0JaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZCkKLQkJaW5mbGF0ZUVuZCgmcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtKTsKKyAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyKTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlciA9IE5VTEw7CisgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZCkKKyAgICAgICAgaW5mbGF0ZUVuZCgmcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtKTsKIAotCXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7Ci0JVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvKTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQgPSAwOworICAgIFRSWUZSRUUocGZpbGVfaW5femlwX3JlYWRfaW5mbyk7CiAKICAgICBzLT5wZmlsZV9pbl96aXBfcmVhZD1OVUxMOwogCi0JcmV0dXJuIGVycjsKKyAgICByZXR1cm4gZXJyOwogfQogCiAKQEAgLTEyNjMsMzIgKzE0OTgsMzIgQEAKICAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgb3IgYW4gZXJyb3IgY29kZSA8MAogKi8KIGV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRHbG9iYWxDb21tZW50IChmaWxlLCBzekNvbW1lbnQsIHVTaXplQnVmKQotCXVuekZpbGUgZmlsZTsKLQljaGFyICpzekNvbW1lbnQ7Ci0JdUxvbmcgdVNpemVCdWY7CisgICAgdW56RmlsZSBmaWxlOworICAgIGNoYXIgKnN6Q29tbWVudDsKKyAgICB1TG9uZyB1U2l6ZUJ1ZjsKIHsKLQlpbnQgZXJyPVVOWl9PSzsKLQl1bnpfcyogczsKLQl1TG9uZyB1UmVhZFRoaXMgOwotCWlmIChmaWxlPT1OVUxMKQotCQlyZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0Jcz0odW56X3MqKWZpbGU7CisgICAgaW50IGVycj1VTlpfT0s7CisgICAgdW56X3MqIHM7CisgICAgdUxvbmcgdVJlYWRUaGlzIDsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuel9zKilmaWxlOwogCi0JdVJlYWRUaGlzID0gdVNpemVCdWY7Ci0JaWYgKHVSZWFkVGhpcz5zLT5naS5zaXplX2NvbW1lbnQpCi0JCXVSZWFkVGhpcyA9IHMtPmdpLnNpemVfY29tbWVudDsKKyAgICB1UmVhZFRoaXMgPSB1U2l6ZUJ1ZjsKKyAgICBpZiAodVJlYWRUaGlzPnMtPmdpLnNpemVfY29tbWVudCkKKyAgICAgICAgdVJlYWRUaGlzID0gcy0+Z2kuc2l6ZV9jb21tZW50OwogCi0JaWYgKGZzZWVrKHMtPmZpbGUscy0+Y2VudHJhbF9wb3MrMjIsU0VFS19TRVQpIT0wKQotCQlyZXR1cm4gVU5aX0VSUk5POworICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLHMtPmZpbGVzdHJlYW0scy0+Y2VudHJhbF9wb3MrMjIsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgIHJldHVybiBVTlpfRVJSTk87CiAKLQlpZiAodVJlYWRUaGlzPjApCisgICAgaWYgKHVSZWFkVGhpcz4wKQogICAgIHsKICAgICAgICpzekNvbW1lbnQ9J1wwJzsKLQkgIGlmIChmcmVhZChzekNvbW1lbnQsKHVJbnQpdVJlYWRUaGlzLDEscy0+ZmlsZSkhPTEpCi0JCXJldHVybiBVTlpfRVJSTk87CisgICAgICBpZiAoWlJFQUQocy0+el9maWxlZnVuYyxzLT5maWxlc3RyZWFtLHN6Q29tbWVudCx1UmVhZFRoaXMpIT11UmVhZFRoaXMpCisgICAgICAgIHJldHVybiBVTlpfRVJSTk87CiAgICAgfQogCi0JaWYgKChzekNvbW1lbnQgIT0gTlVMTCkgJiYgKHVTaXplQnVmID4gcy0+Z2kuc2l6ZV9jb21tZW50KSkKLQkJKihzekNvbW1lbnQrcy0+Z2kuc2l6ZV9jb21tZW50KT0nXDAnOwotCXJldHVybiAoaW50KXVSZWFkVGhpczsKKyAgICBpZiAoKHN6Q29tbWVudCAhPSBOVUxMKSAmJiAodVNpemVCdWYgPiBzLT5naS5zaXplX2NvbW1lbnQpKQorICAgICAgICAqKHN6Q29tbWVudCtzLT5naS5zaXplX2NvbW1lbnQpPSdcMCc7CisgICAgcmV0dXJuIChpbnQpdVJlYWRUaGlzOwogfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL3VuemlwLmRlZiBiL2NvbnRyaWIvbWluaXppcC91bnppcC5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZWRlODkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9taW5pemlwL3VuemlwLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQl1bnpPcGVuICAgICAgICAgICAgICAgICAgICAgICBANjEKLQl1bnpDbG9zZSAgICAgICAgICAgICAgICAgICAgICBANjIKLQl1bnpHZXRHbG9iYWxJbmZvICAgICAgICAgICAgICBANjMKLQl1bnpHZXRDdXJyZW50RmlsZUluZm8gICAgICAgICBANjQKLQl1bnpHb1RvRmlyc3RGaWxlICAgICAgICAgICAgICBANjUKLQl1bnpHb1RvTmV4dEZpbGUgICAgICAgICAgICAgICBANjYKLQl1bnpPcGVuQ3VycmVudEZpbGUgICAgICAgICAgICBANjcKLQl1bnpSZWFkQ3VycmVudEZpbGUgICAgICAgICAgICBANjgKLQl1bnp0ZWxsICAgICAgICAgICAgICAgICAgICAgICBANzAKLQl1bnplb2YgICAgICAgICAgICAgICAgICAgICAgICBANzEKLQl1bnpDbG9zZUN1cnJlbnRGaWxlICAgICAgICAgICBANzIKLQl1bnpHZXRHbG9iYWxDb21tZW50ICAgICAgICAgICBANzMKLQl1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUgICAgICBANzQKLQl1bnpMb2NhdGVGaWxlICAgICAgICAgICAgICAgICBANzUKLQl1bnpHZXRMb2NhbEV4dHJhZmllbGQgICAgICAgICBANzYKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluaXppcC91bnppcC5oIGIvY29udHJpYi9taW5pemlwL3VuemlwLmgKaW5kZXggNzY2OTJjYi4uNjdjYTg1MSAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL3VuemlwLmgKKysrIGIvY29udHJpYi9taW5pemlwL3VuemlwLmgKQEAgLTEsMTUgKzEsMTQgQEAKLS8qIHVuemlwLmggLS0gSU8gZm9yIHVuY29tcHJlc3MgLnppcCBmaWxlcyB1c2luZyB6bGliIAotICAgVmVyc2lvbiAwLjE1IGJldGEsIE1hciAxOXRoLCAxOTk4LAorLyogdW56aXAuaCAtLSBJTyBmb3IgdW5jb21wcmVzcyAuemlwIGZpbGVzIHVzaW5nIHpsaWIKKyAgIFZlcnNpb24gMC4yMSwgTWFyY2ggMTB0aCwgMjAwMwogCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggR2lsbGVzIFZvbGxhbnQKKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIEdpbGxlcyBWb2xsYW50CiAKICAgIFRoaXMgdW56aXAgcGFja2FnZSBhbGxvdyBleHRyYWN0IGZpbGUgZnJvbSAuWklQIGZpbGUsIGNvbXBhdGlibGUgd2l0aCBQS1ppcCAyLjA0ZwogICAgICBXaW5aaXAsIEluZm9aaXAgdG9vbHMgYW5kIGNvbXBhdGlibGUuCiAgICBFbmNyeXB0aW9uIGFuZCBtdWx0aSB2b2x1bWUgWmlwRmlsZSAoc3BhbikgYXJlIG5vdCBzdXBwb3J0ZWQuCiAgICBPbGQgY29tcHJlc3Npb25zIHVzZWQgYnkgb2xkIFBLWmlwIDEueCBhcmUgbm90IHN1cHBvcnRlZAogCi0gICBUSElTIElTIEFOIEFMUEhBIFZFUlNJT04uIEFUIFRISVMgU1RBR0UgT0YgREVWRUxPUFBFTUVOVCwgU09NRVMgQVBJIE9SIFNUUlVDVFVSRQotICAgQ0FOIENIQU5HRSBJTiBGVVRVUkUgVkVSU0lPTiAhIQorCiAgICBJIFdBSVQgRkVFREJBQ0sgYXQgbWFpbCBpbmZvQHdpbmltYWdlLmNvbQogICAgVmlzaXQgYWxzbyBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bSBmb3IgZXZvbHV0aW9uCiAKQEAgLTMzLDEwICszMiwxMyBAQAogCiAKICovCi0vKiBmb3IgbW9yZSBpbmZvIGFib3V0IC5aSVAgZm9ybWF0LCBzZWUgCi0gICAgICBmdHA6Ly9mdHAuY2Ryb20uY29tL3B1Yi9pbmZvemlwL2RvYy9hcHBub3RlLTk3MDMxMS1pei56aXAKKworLyogZm9yIG1vcmUgaW5mbyBhYm91dCAuWklQIGZvcm1hdCwgc2VlCisgICAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9kb2MvYXBwbm90ZS05ODExMTktaXouemlwCisgICAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9kb2MvCiAgICBQa1dhcmUgaGFzIGFsc28gYSBzcGVjaWZpY2F0aW9uIGF0IDoKLSAgICAgIGZ0cDovL2Z0cC5wa3dhcmUuY29tL3Byb2JkZXNjLnppcCAqLworICAgICAgZnRwOi8vZnRwLnBrd2FyZS5jb20vcHJvYmRlc2MuemlwCisqLwogCiAjaWZuZGVmIF91bnpfSAogI2RlZmluZSBfdW56X0gKQEAgLTQ5LDQzICs1MSw0NyBAQAogI2luY2x1ZGUgInpsaWIuaCIKICNlbmRpZgogCisjaWZuZGVmIF9aTElCSU9BUElfSAorI2luY2x1ZGUgImlvYXBpLmgiCisjZW5kaWYKKwogI2lmIGRlZmluZWQoU1RSSUNUVU5aSVApIHx8IGRlZmluZWQoU1RSSUNUWklQVU5aSVApCiAvKiBsaWtlIHRoZSBTVFJJQ1Qgb2YgV0lOMzIsIHdlIGRlZmluZSBhIHBvaW50ZXIgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkCiAgICAgZnJvbSAodm9pZCopIHdpdGhvdXQgY2FzdCAqLwotdHlwZWRlZiBzdHJ1Y3QgVGFndW56RmlsZV9fIHsgaW50IHVudXNlZDsgfSB1bnpGaWxlX187IAordHlwZWRlZiBzdHJ1Y3QgVGFndW56RmlsZV9fIHsgaW50IHVudXNlZDsgfSB1bnpGaWxlX187CiB0eXBlZGVmIHVuekZpbGVfXyAqdW56RmlsZTsKICNlbHNlCiB0eXBlZGVmIHZvaWRwIHVuekZpbGU7CiAjZW5kaWYKIAogCi0jZGVmaW5lIFVOWl9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgKC0xMDApCi0jZGVmaW5lIFVOWl9FUlJOTyAgICAgICAgICAgICAgIChaX0VSUk5PKQotI2RlZmluZSBVTlpfRU9GICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVU5aX09LICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgICAgICAgICAoLTEwMCkKKyNkZWZpbmUgVU5aX0VSUk5PICAgICAgICAgICAgICAgICAgICAgICAoWl9FUlJOTykKKyNkZWZpbmUgVU5aX0VPRiAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKICNkZWZpbmUgVU5aX1BBUkFNRVJST1IgICAgICAgICAgICAgICAgICAoLTEwMikKICNkZWZpbmUgVU5aX0JBRFpJUEZJTEUgICAgICAgICAgICAgICAgICAoLTEwMykKICNkZWZpbmUgVU5aX0lOVEVSTkFMRVJST1IgICAgICAgICAgICAgICAoLTEwNCkKICNkZWZpbmUgVU5aX0NSQ0VSUk9SICAgICAgICAgICAgICAgICAgICAoLTEwNSkKIAogLyogdG1fdW56IGNvbnRhaW4gZGF0ZS90aW1lIGluZm8gKi8KLXR5cGVkZWYgc3RydWN0IHRtX3Vuel9zIAordHlwZWRlZiBzdHJ1Y3QgdG1fdW56X3MKIHsKLQl1SW50IHRtX3NlYzsgICAgICAgICAgICAvKiBzZWNvbmRzIGFmdGVyIHRoZSBtaW51dGUgLSBbMCw1OV0gKi8KLQl1SW50IHRtX21pbjsgICAgICAgICAgICAvKiBtaW51dGVzIGFmdGVyIHRoZSBob3VyIC0gWzAsNTldICovCi0JdUludCB0bV9ob3VyOyAgICAgICAgICAgLyogaG91cnMgc2luY2UgbWlkbmlnaHQgLSBbMCwyM10gKi8KLQl1SW50IHRtX21kYXk7ICAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovCi0JdUludCB0bV9tb247ICAgICAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8KLQl1SW50IHRtX3llYXI7ICAgICAgICAgICAvKiB5ZWFycyAtIFsxOTgwLi4yMDQ0XSAqLworICAgIHVJbnQgdG1fc2VjOyAgICAgICAgICAgIC8qIHNlY29uZHMgYWZ0ZXIgdGhlIG1pbnV0ZSAtIFswLDU5XSAqLworICAgIHVJbnQgdG1fbWluOyAgICAgICAgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KKyAgICB1SW50IHRtX2hvdXI7ICAgICAgICAgICAvKiBob3VycyBzaW5jZSBtaWRuaWdodCAtIFswLDIzXSAqLworICAgIHVJbnQgdG1fbWRheTsgICAgICAgICAgIC8qIGRheSBvZiB0aGUgbW9udGggLSBbMSwzMV0gKi8KKyAgICB1SW50IHRtX21vbjsgICAgICAgICAgICAvKiBtb250aHMgc2luY2UgSmFudWFyeSAtIFswLDExXSAqLworICAgIHVJbnQgdG1feWVhcjsgICAgICAgICAgIC8qIHllYXJzIC0gWzE5ODAuLjIwNDRdICovCiB9IHRtX3VuejsKIAogLyogdW56X2dsb2JhbF9pbmZvIHN0cnVjdHVyZSBjb250YWluIGdsb2JhbCBkYXRhIGFib3V0IHRoZSBaSVBmaWxlCiAgICBUaGVzZSBkYXRhIGNvbWVzIGZyb20gdGhlIGVuZCBvZiBjZW50cmFsIGRpciAqLwogdHlwZWRlZiBzdHJ1Y3QgdW56X2dsb2JhbF9pbmZvX3MKIHsKLQl1TG9uZyBudW1iZXJfZW50cnk7ICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4KLQkJCQkgICAgICAgdGhlIGNlbnRyYWwgZGlyIG9uIHRoaXMgZGlzayAqLwotCXVMb25nIHNpemVfY29tbWVudDsgICAgICAgICAvKiBzaXplIG9mIHRoZSBnbG9iYWwgY29tbWVudCBvZiB0aGUgemlwZmlsZSAqLworICAgIHVMb25nIG51bWJlcl9lbnRyeTsgICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgorICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCisgICAgdUxvbmcgc2l6ZV9jb21tZW50OyAgICAgICAgIC8qIHNpemUgb2YgdGhlIGdsb2JhbCBjb21tZW50IG9mIHRoZSB6aXBmaWxlICovCiB9IHVuel9nbG9iYWxfaW5mbzsKIAogCkBAIC05OCw4ICsxMDQsOCBAQAogICAgIHVMb25nIGNvbXByZXNzaW9uX21ldGhvZDsgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KICAgICB1TG9uZyBkb3NEYXRlOyAgICAgICAgICAgICAgLyogbGFzdCBtb2QgZmlsZSBkYXRlIGluIERvcyBmbXQgICA0IGJ5dGVzICovCiAgICAgdUxvbmcgY3JjOyAgICAgICAgICAgICAgICAgIC8qIGNyYy0zMiAgICAgICAgICAgICAgICAgICAgICAgICAgNCBieXRlcyAqLwotICAgIHVMb25nIGNvbXByZXNzZWRfc2l6ZTsgICAgICAvKiBjb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICAgIDQgYnl0ZXMgKi8gCi0gICAgdUxvbmcgdW5jb21wcmVzc2VkX3NpemU7ICAgIC8qIHVuY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgNCBieXRlcyAqLyAKKyAgICB1TG9uZyBjb21wcmVzc2VkX3NpemU7ICAgICAgLyogY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgICA0IGJ5dGVzICovCisgICAgdUxvbmcgdW5jb21wcmVzc2VkX3NpemU7ICAgIC8qIHVuY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgNCBieXRlcyAqLwogICAgIHVMb25nIHNpemVfZmlsZW5hbWU7ICAgICAgICAvKiBmaWxlbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KICAgICB1TG9uZyBzaXplX2ZpbGVfZXh0cmE7ICAgICAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICAgICAgICAgICAgICAyIGJ5dGVzICovCiAgICAgdUxvbmcgc2l6ZV9maWxlX2NvbW1lbnQ7ICAgIC8qIGZpbGUgY29tbWVudCBsZW5ndGggICAgICAgICAgICAgMiBieXRlcyAqLwpAQCAtMTEyLDI3ICsxMTgsMzQgQEAKIH0gdW56X2ZpbGVfaW5mbzsKIAogZXh0ZXJuIGludCBaRVhQT1JUIHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZSBPRiAoKGNvbnN0IGNoYXIqIGZpbGVOYW1lMSwKLQkJCQkJCQkJCQkJCSBjb25zdCBjaGFyKiBmaWxlTmFtZTIsCi0JCQkJCQkJCQkJCQkgaW50IGlDYXNlU2Vuc2l0aXZpdHkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlTmFtZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlDYXNlU2Vuc2l0aXZpdHkpKTsKIC8qCiAgICBDb21wYXJlIHR3byBmaWxlbmFtZSAoZmlsZU5hbWUxLGZpbGVOYW1lMikuCiAgICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAxLCBjb21wYXJpc2lvbiBpcyBjYXNlIHNlbnNpdGl2aXR5IChsaWtlIHN0cmNtcCkKICAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDIsIGNvbXBhcmlzaW9uIGlzIG5vdCBjYXNlIHNlbnNpdGl2aXR5IChsaWtlIHN0cmNtcGkKLQkJCQkJCQkJb3Igc3RyY2FzZWNtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc3RyY2FzZWNtcCkKICAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDAsIGNhc2Ugc2Vuc2l0aXZpdHkgaXMgZGVmYXV0IG9mIHlvdXIgb3BlcmF0aW5nIHN5c3RlbQotCShsaWtlIDEgb24gVW5peCwgMiBvbiBXaW5kb3dzKQorICAgIChsaWtlIDEgb24gVW5peCwgMiBvbiBXaW5kb3dzKQogKi8KIAogCiBleHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW4gT0YoKGNvbnN0IGNoYXIgKnBhdGgpKTsKIC8qCiAgIE9wZW4gYSBaaXAgZmlsZS4gcGF0aCBjb250YWluIHRoZSBmdWxsIHBhdGhuYW1lIChieSBleGFtcGxlLAotICAgICBvbiBhIFdpbmRvd3MgTlQgY29tcHV0ZXIgImM6XFx6bGliXFx6bGliMTExLnppcCIgb3Igb24gYW4gVW5peCBjb21wdXRlcgotCSAiemxpYi96bGliMTExLnppcCIuCi0JIElmIHRoZSB6aXBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgKGZpbGUgZG9uJ3QgZXhpc3Qgb3IgaW4gbm90IHZhbGlkKSwgdGhlCi0JICAgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCisgICAgIG9uIGEgV2luZG93cyBYUCBjb21wdXRlciAiYzpcXHpsaWJcXHpsaWIxMTMuemlwIiBvciBvbiBhbiBVbml4IGNvbXB1dGVyCisgICAgICJ6bGliL3psaWIxMTMuemlwIi4KKyAgICAgSWYgdGhlIHppcGZpbGUgY2Fubm90IGJlIG9wZW5lZCAoZmlsZSBkb24ndCBleGlzdCBvciBpbiBub3QgdmFsaWQpLCB0aGUKKyAgICAgICByZXR1cm4gdmFsdWUgaXMgTlVMTC4KICAgICAgRWxzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHVuekZpbGUgSGFuZGxlLCB1c2FibGUgd2l0aCBvdGhlciBmdW5jdGlvbgotCSAgIG9mIHRoaXMgdW56aXAgcGFja2FnZS4KKyAgICAgICBvZiB0aGlzIHVuemlwIHBhY2thZ2UuCisqLworCitleHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW4yIE9GKChjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOworLyoKKyAgIE9wZW4gYSBaaXAgZmlsZSwgbGlrZSB1bnpPcGVuLCBidXQgcHJvdmlkZSBhIHNldCBvZiBmaWxlIGxvdyBsZXZlbCBBUEkKKyAgICAgIGZvciByZWFkL3dyaXRlIHRoZSB6aXAgZmlsZSAoc2VlIGlvYXBpLmgpCiAqLwogCiBleHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2UgT0YoKHVuekZpbGUgZmlsZSkpOwpAQCAtMTQzLDcgKzE1Niw3IEBACiAgIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbS4gKi8KIAogZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbEluZm8gT0YoKHVuekZpbGUgZmlsZSwKLQkJCQkJdW56X2dsb2JhbF9pbmZvICpwZ2xvYmFsX2luZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZ2xvYmFsX2luZm8gKnBnbG9iYWxfaW5mbykpOwogLyoKICAgV3JpdGUgaW5mbyBhYm91dCB0aGUgWmlwRmlsZSBpbiB0aGUgKnBnbG9iYWxfaW5mbyBzdHJ1Y3R1cmUuCiAgIE5vIHByZXBhcmF0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgaXMgbmVlZGVkCkBAIC0xNTEsOCArMTY0LDggQEAKIAogCiBleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0R2xvYmFsQ29tbWVudCBPRigodW56RmlsZSBmaWxlLAotCQkJCQkJCQkJCSAgIGNoYXIgKnN6Q29tbWVudCwKLQkJCQkJICAgdUxvbmcgdVNpemVCdWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdVNpemVCdWYpKTsKIC8qCiAgIEdldCB0aGUgZ2xvYmFsIGNvbW1lbnQgc3RyaW5nIG9mIHRoZSBaaXBGaWxlLCBpbiB0aGUgc3pDb21tZW50IGJ1ZmZlci4KICAgdVNpemVCdWYgaXMgdGhlIHNpemUgb2YgdGhlIHN6Q29tbWVudCBidWZmZXIuCkBAIC0xNzYsOSArMTg5LDkgQEAKICAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFIGlmIHRoZSBhY3R1YWwgZmlsZSB3YXMgdGhlIGxhdGVzdC4KICovCiAKLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpMb2NhdGVGaWxlIE9GKCh1bnpGaWxlIGZpbGUsIAotCQkJCSAgICAgY29uc3QgY2hhciAqc3pGaWxlTmFtZSwKLQkJCQkgICAgIGludCBpQ2FzZVNlbnNpdGl2aXR5KSk7CitleHRlcm4gaW50IFpFWFBPUlQgdW56TG9jYXRlRmlsZSBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3pGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBpQ2FzZVNlbnNpdGl2aXR5KSk7CiAvKgogICBUcnkgbG9jYXRlIHRoZSBmaWxlIHN6RmlsZU5hbWUgaW4gdGhlIHppcGZpbGUuCiAgIEZvciB0aGUgaUNhc2VTZW5zaXRpdml0eSBzaWduaWZpY2F0aW9uLCBzZWUgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlCkBAIC0xODksMjUgKzIwMiw0NCBAQAogKi8KIAogCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFJ5YW4gc3VwcGxpZWQgZnVuY3Rpb25zICovCisvKiB1bnpfZmlsZV9pbmZvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGluIHRoZSB6aXBmaWxlICovCit0eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9wb3NfcworeworICAgIHVMb25nIHBvc19pbl96aXBfZGlyZWN0b3J5OyAgIC8qIG9mZnNldCBpbiB6aXAgZmlsZSBkaXJlY3RvcnkgKi8KKyAgICB1TG9uZyBudW1fb2ZfZmlsZTsgICAgICAgICAgICAvKiAjIG9mIGZpbGUgKi8KK30gdW56X2ZpbGVfcG9zOworCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0RmlsZVBvcygKKyAgICB1bnpGaWxlIGZpbGUsCisgICAgdW56X2ZpbGVfcG9zKiBmaWxlX3Bvcyk7CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlsZVBvcygKKyAgICB1bnpGaWxlIGZpbGUsCisgICAgdW56X2ZpbGVfcG9zKiBmaWxlX3Bvcyk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCiBleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0Q3VycmVudEZpbGVJbmZvIE9GKCh1bnpGaWxlIGZpbGUsCi0JCQkJCSAgICAgdW56X2ZpbGVfaW5mbyAqcGZpbGVfaW5mbywKLQkJCQkJICAgICBjaGFyICpzekZpbGVOYW1lLAotCQkJCQkgICAgIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZSwKLQkJCQkJICAgICB2b2lkICpleHRyYUZpZWxkLAotCQkJCQkgICAgIHVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplLAotCQkJCQkgICAgIGNoYXIgKnN6Q29tbWVudCwKLQkJCQkJICAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm8gKnBmaWxlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBmaWxlTmFtZUJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemUpKTsKIC8qCiAgIEdldCBJbmZvIGFib3V0IHRoZSBjdXJyZW50IGZpbGUKICAgaWYgcGZpbGVfaW5mbyE9TlVMTCwgdGhlICpwZmlsZV9pbmZvIHN0cnVjdHVyZSB3aWxsIGNvbnRhaW4gc29tZXMgaW5mbyBhYm91dAotCSAgICB0aGUgY3VycmVudCBmaWxlCisgICAgICAgIHRoZSBjdXJyZW50IGZpbGUKICAgaWYgc3pGaWxlTmFtZSE9TlVMTCwgdGhlIGZpbGVtYW5lIHN0cmluZyB3aWxsIGJlIGNvcGllZCBpbiBzekZpbGVOYW1lCi0JCQkoZmlsZU5hbWVCdWZmZXJTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIpCisgICAgICAgICAgICAoZmlsZU5hbWVCdWZmZXJTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIpCiAgIGlmIGV4dHJhRmllbGQhPU5VTEwsIHRoZSBleHRyYSBmaWVsZCBpbmZvcm1hdGlvbiB3aWxsIGJlIGNvcGllZCBpbiBleHRyYUZpZWxkCi0JCQkoZXh0cmFGaWVsZEJ1ZmZlclNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcikuCi0JCQlUaGlzIGlzIHRoZSBDZW50cmFsLWhlYWRlciB2ZXJzaW9uIG9mIHRoZSBleHRyYSBmaWVsZAorICAgICAgICAgICAgKGV4dHJhRmllbGRCdWZmZXJTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIpLgorICAgICAgICAgICAgVGhpcyBpcyB0aGUgQ2VudHJhbC1oZWFkZXIgdmVyc2lvbiBvZiB0aGUgZXh0cmEgZmllbGQKICAgaWYgc3pDb21tZW50IT1OVUxMLCB0aGUgY29tbWVudCBzdHJpbmcgb2YgdGhlIGZpbGUgd2lsbCBiZSBjb3BpZWQgaW4gc3pDb21tZW50Ci0JCQkoY29tbWVudEJ1ZmZlclNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcikKKyAgICAgICAgICAgIChjb21tZW50QnVmZmVyU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyKQogKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIyMSwxNiArMjUzLDUxIEBACiAgIElmIHRoZXJlIGlzIG5vIGVycm9yLCB0aGUgcmV0dXJuIHZhbHVlIGlzIFVOWl9PSy4KICovCiAKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCkpOworLyoKKyAgT3BlbiBmb3IgcmVhZGluZyBkYXRhIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUuCisgIHBhc3N3b3JkIGlzIGEgY3J5cHRpbmcgcGFzc3dvcmQKKyAgSWYgdGhlcmUgaXMgbm8gZXJyb3IsIHRoZSByZXR1cm4gdmFsdWUgaXMgVU5aX09LLgorKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTIgT0YoKHVuekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcpKTsKKy8qCisgIFNhbWUgdGhhbiB1bnpPcGVuQ3VycmVudEZpbGUsIGJ1dCBvcGVuIGZvciByZWFkIHJhdyB0aGUgZmlsZSAobm90IHVuY29tcHJlc3MpCisgICAgaWYgcmF3PT0xCisgICptZXRob2Qgd2lsbCByZWNlaXZlIG1ldGhvZCBvZiBjb21wcmVzc2lvbiwgKmxldmVsIHdpbGwgcmVjZWl2ZSBsZXZlbCBvZgorICAgICBjb21wcmVzc2lvbgorICBub3RlIDogeW91IGNhbiBzZXQgbGV2ZWwgcGFyYW1ldGVyIGFzIE5VTEwgKGlmIHlvdSBkaWQgbm90IHdhbnQga25vd24gbGV2ZWwsCisgICAgICAgICBidXQgeW91IENBTk5PVCBzZXQgbWV0aG9kIHBhcmFtZXRlciBhcyBOVUxMCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlMyBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCkpOworLyoKKyAgU2FtZSB0aGFuIHVuek9wZW5DdXJyZW50RmlsZSwgYnV0IG9wZW4gZm9yIHJlYWQgcmF3IHRoZSBmaWxlIChub3QgdW5jb21wcmVzcykKKyAgICBpZiByYXc9PTEKKyAgKm1ldGhvZCB3aWxsIHJlY2VpdmUgbWV0aG9kIG9mIGNvbXByZXNzaW9uLCAqbGV2ZWwgd2lsbCByZWNlaXZlIGxldmVsIG9mCisgICAgIGNvbXByZXNzaW9uCisgIG5vdGUgOiB5b3UgY2FuIHNldCBsZXZlbCBwYXJhbWV0ZXIgYXMgTlVMTCAoaWYgeW91IGRpZCBub3Qgd2FudCBrbm93biBsZXZlbCwKKyAgICAgICAgIGJ1dCB5b3UgQ0FOTk9UIHNldCBtZXRob2QgcGFyYW1ldGVyIGFzIE5VTEwKKyovCisKKwogZXh0ZXJuIGludCBaRVhQT1JUIHVuekNsb3NlQ3VycmVudEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOwogLyoKICAgQ2xvc2UgdGhlIGZpbGUgaW4gemlwIG9wZW5lZCB3aXRoIHVuek9wZW5DdXJyZW50RmlsZQogICBSZXR1cm4gVU5aX0NSQ0VSUk9SIGlmIGFsbCB0aGUgZmlsZSB3YXMgcmVhZCBidXQgdGhlIENSQyBpcyBub3QgZ29vZAogKi8KIAotCQkJCQkJCQkJCQkJCi1leHRlcm4gaW50IFpFWFBPUlQgdW56UmVhZEN1cnJlbnRGaWxlIE9GKCh1bnpGaWxlIGZpbGUsIAotCQkJCQkgIHZvaWRwIGJ1ZiwKLQkJCQkJICB1bnNpZ25lZCBsZW4pKTsKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpSZWFkQ3VycmVudEZpbGUgT0YoKHVuekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkcCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7CiAvKgogICBSZWFkIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgZmlsZSAob3BlbmVkIGJ5IHVuek9wZW5DdXJyZW50RmlsZSkKICAgYnVmIGNvbnRhaW4gYnVmZmVyIHdoZXJlIGRhdGEgbXVzdCBiZSBjb3BpZWQKQEAgLTI0OSwxMiArMzE2LDEyIEBACiAKIGV4dGVybiBpbnQgWkVYUE9SVCB1bnplb2YgT0YoKHVuekZpbGUgZmlsZSkpOwogLyoKLSAgcmV0dXJuIDEgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkLCAwIGVsc2V3aGVyZSAKKyAgcmV0dXJuIDEgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkLCAwIGVsc2V3aGVyZQogKi8KIAogZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldExvY2FsRXh0cmFmaWVsZCBPRigodW56RmlsZSBmaWxlLAotCQkJCQkJCQkJCQkgdm9pZHAgYnVmLAotCQkJCQkJCQkJCQkgdW5zaWduZWQgbGVuKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pKTsKIC8qCiAgIFJlYWQgZXh0cmEgZmllbGQgZnJvbSB0aGUgY3VycmVudCBmaWxlIChvcGVuZWQgYnkgdW56T3BlbkN1cnJlbnRGaWxlKQogICBUaGlzIGlzIHRoZSBsb2NhbC1oZWFkZXIgdmVyc2lvbiBvZiB0aGUgZXh0cmEgZmllbGQgKHNvbWV0aW1lcywgdGhlcmUgaXMKQEAgLTI2Myw5ICszMzAsOSBAQAogICBpZiBidWY9PU5VTEwsIGl0IHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQKIAogICBpZiBidWYhPU5VTEwsIGxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCB0aGUgZXh0cmEgaGVhZGVyIGlzIGNvcGllZCBpbgotCWJ1Zi4KLSAgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbiBidWYsIG9yIChpZiA8MCkgCi0JdGhlIGVycm9yIGNvZGUKKyAgICBidWYuCisgIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW4gYnVmLCBvciAoaWYgPDApCisgICAgdGhlIGVycm9yIGNvZGUKICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL3ppcC5jIGIvY29udHJpYi9taW5pemlwL3ppcC5jCmluZGV4IDBjYWU2NGEuLjI5YzE3ZDggMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbWluaXppcC96aXAuYworKysgYi9jb250cmliL21pbml6aXAvemlwLmMKQEAgLTEsNSArMSw1IEBACi0vKiB6aXAuYyAtLSBJTyBvbiAuemlwIGZpbGVzIHVzaW5nIHpsaWIgCi0gICBWZXJzaW9uIDAuMTUgYmV0YSwgTWFyIDE5dGgsIDE5OTgsCisvKiB6aXAuYyAtLSBJTyBvbiAuemlwIGZpbGVzIHVzaW5nIHpsaWIKKyAgIFZlcnNpb24gMC4yMSwgTWFyY2ggMTB0aCwgMjAwMwogCiAgICBSZWFkIHppcC5oIGZvciBtb3JlIGluZm8KICovCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgInpsaWIuaCIKICNpbmNsdWRlICJ6aXAuaCIKIApAQCAtNjYsOCArNjcsMTUgQEAKICNkZWZpbmUgU0VFS19TRVQgICAgMAogI2VuZGlmCiAKKyNpZm5kZWYgREVGX01FTV9MRVZFTAorI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAorI2Vsc2UKKyMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCisjZW5kaWYKKyNlbmRpZgogY29uc3QgY2hhciB6aXBfY29weXJpZ2h0W10gPQotICAgIiB6aXAgMC4xNSBDb3B5cmlnaHQgMTk5OCBHaWxsZXMgVm9sbGFudCAiOworICAgIiB6aXAgMC4yMSBDb3B5cmlnaHQgMTk5OC0yMDAzIEdpbGxlcyBWb2xsYW50IC0gaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbCI7CiAKIAogI2RlZmluZSBTSVpFREFUQV9JTkRBVEFCTE9DSyAoNDA5Ni0oNCo0KSkKQEAgLTk5LDMzICsxMDcsNDkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLQl6X3N0cmVhbSBzdHJlYW07ICAgICAgICAgICAgLyogekxpYiBzdHJlYW0gc3RydWN0dXJlIGZvciBpbmZsYXRlICovCisgICAgel9zdHJlYW0gc3RyZWFtOyAgICAgICAgICAgIC8qIHpMaWIgc3RyZWFtIHN0cnVjdHVyZSBmb3IgaW5mbGF0ZSAqLwogICAgIGludCAgc3RyZWFtX2luaXRpYWxpc2VkOyAgICAvKiAxIGlzIHN0cmVhbSBpcyBpbml0aWFsaXNlZCAqLwogICAgIHVJbnQgcG9zX2luX2J1ZmZlcmVkX2RhdGE7ICAvKiBsYXN0IHdyaXR0ZW4gYnl0ZSBpbiBidWZmZXJlZF9kYXRhICovCiAKLSAgICB1TG9uZyBwb3NfbG9jYWxfaGVhZGVyOyAgICAgLyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBoZWFkZXIgb2YgdGhlIGZpbGUgCisgICAgdUxvbmcgcG9zX2xvY2FsX2hlYWRlcjsgICAgIC8qIG9mZnNldCBvZiB0aGUgbG9jYWwgaGVhZGVyIG9mIHRoZSBmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudHkgd3JpdGluZyAqLwogICAgIGNoYXIqIGNlbnRyYWxfaGVhZGVyOyAgICAgICAvKiBjZW50cmFsIGhlYWRlciBkYXRhIGZvciB0aGUgY3VycmVudCBmaWxlICovCiAgICAgdUxvbmcgc2l6ZV9jZW50cmFsaGVhZGVyOyAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgaGVhZGVyIGZvciBjdXIgZmlsZSAqLwogICAgIHVMb25nIGZsYWc7ICAgICAgICAgICAgICAgICAvKiBmbGFnIG9mIHRoZSBmaWxlIGN1cnJlbnRseSB3cml0aW5nICovCiAKICAgICBpbnQgIG1ldGhvZDsgICAgICAgICAgICAgICAgLyogY29tcHJlc3Npb24gbWV0aG9kIG9mIGZpbGUgY3VycmVudHkgd3IuKi8KKyAgICBpbnQgIHJhdzsgICAgICAgICAgICAgICAgICAgLyogMSBmb3IgZGlyZWN0bHkgd3JpdGluZyByYXcgZGF0YSAqLwogICAgIEJ5dGUgYnVmZmVyZWRfZGF0YVtaX0JVRlNJWkVdOy8qIGJ1ZmZlciBjb250YWluIGNvbXByZXNzZWQgZGF0YSB0byBiZSB3cml0Ki8KICAgICB1TG9uZyBkb3NEYXRlOwogICAgIHVMb25nIGNyYzMyOworICAgIGludCAgZW5jcnlwdDsKKyNpZm5kZWYgTk9DUlBZVAorICAgIHVuc2lnbmVkIGxvbmcga2V5c1szXTsgICAgIC8qIGtleXMgZGVmaW5pbmcgdGhlIHBzZXVkby1yYW5kb20gc2VxdWVuY2UgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYjsKKyAgICBpbnQgY3J5cHRfaGVhZGVyX3NpemU7CisjZW5kaWYKIH0gY3VyZmlsZV9pbmZvOwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIEZJTEUgKiBmaWxlemlwOworICAgIHpsaWJfZmlsZWZ1bmNfZGVmIHpfZmlsZWZ1bmM7CisgICAgdm9pZHBmIGZpbGVzdHJlYW07ICAgICAgICAvKiBpbyBzdHJ1Y3RvcmUgb2YgdGhlIHppcGZpbGUgKi8KICAgICBsaW5rZWRsaXN0X2RhdGEgY2VudHJhbF9kaXI7LyogZGF0YWJsb2NrIHdpdGggY2VudHJhbCBkaXIgaW4gY29uc3RydWN0aW9uKi8KICAgICBpbnQgIGluX29wZW5lZF9maWxlX2luemlwOyAgLyogMSBpZiBhIGZpbGUgaW4gdGhlIHppcCBpcyBjdXJyZW50bHkgd3JpdC4qLwogICAgIGN1cmZpbGVfaW5mbyBjaTsgICAgICAgICAgICAvKiBpbmZvIG9uIHRoZSBmaWxlIGN1cnJldGx5IHdyaXRpbmcgKi8KIAogICAgIHVMb25nIGJlZ2luX3BvczsgICAgICAgICAgICAvKiBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB6aXBmaWxlICovCisgICAgdUxvbmcgYWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0OwogICAgIHVMb25nIG51bWJlcl9lbnRyeTsKIH0gemlwX2ludGVybmFsOwogCisKKworI2lmbmRlZiBOT0NSUFlUCisjZGVmaW5lIElOQ0xVREVDUllQVElOR0NPREVfSUZDUllQVEFMTE9XRUQKKyNpbmNsdWRlICJjcnlwdC5oIgorI2VuZGlmCisKIGxvY2FsIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBhbGxvY2F0ZV9uZXdfZGF0YWJsb2NrKCkKIHsKICAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpOwpAQCAtMTY2LDcgKzE5MCw3IEBACiAKIAogbG9jYWwgaW50IGFkZF9kYXRhX2luX2RhdGFibG9jayhsbCxidWYsbGVuKQotICAgIGxpbmtlZGxpc3RfZGF0YSogbGw7ICAgIAorICAgIGxpbmtlZGxpc3RfZGF0YSogbGw7CiAgICAgY29uc3Qgdm9pZCogYnVmOwogICAgIHVMb25nIGxlbjsKIHsKQEAgLTIyMCwzMiArMjQ0LDIwIEBACiB9CiAKIAotbG9jYWwgaW50IHdyaXRlX2RhdGFibG9jayhmb3V0LGxsKQotICAgIEZJTEUgKiBmb3V0OwotICAgIGxpbmtlZGxpc3RfZGF0YSogbGw7ICAgIAotewotICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGk7Ci0gICAgbGRpID0gbGwtPmZpcnN0X2Jsb2NrOwotICAgIHdoaWxlIChsZGkhPU5VTEwpCi0gICAgewotICAgICAgICBpZiAobGRpLT5maWxsZWRfaW5fdGhpc19ibG9jayA+IDApCi0gICAgICAgICAgICBpZiAoZndyaXRlKGxkaS0+ZGF0YSwodUludClsZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrLDEsZm91dCkhPTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFpJUF9FUlJOTzsKLSAgICAgICAgbGRpID0gbGRpLT5uZXh0X2RhdGFibG9jazsKLSAgICB9Ci0gICAgcmV0dXJuIFpJUF9PSzsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgT3V0cHV0cyBhIGxvbmcgaW4gTFNCIG9yZGVyIHRvIHRoZSBnaXZlbiBmaWxlCisgICBJbnB1dHMgYSBsb25nIGluIExTQiBvcmRlciB0byB0aGUgZ2l2ZW4gZmlsZQogICAgbmJCeXRlID09IDEsIDIgb3IgNCAoYnl0ZSwgc2hvcnQgb3IgbG9uZykKICovCiAKLWxvY2FsIGludCB6aXBsb2NhbF9wdXRWYWx1ZSBPRigoRklMRSAqZmlsZSwgdUxvbmcgeCwgaW50IG5iQnl0ZSkpOwotbG9jYWwgaW50IHppcGxvY2FsX3B1dFZhbHVlIChmaWxlLCB4LCBuYkJ5dGUpCi0gICAgRklMRSAqZmlsZTsKK2xvY2FsIGludCB6aXBsb2NhbF9wdXRWYWx1ZSBPRigoY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHBmIGZpbGVzdHJlYW0sIHVMb25nIHgsIGludCBuYkJ5dGUpKTsKK2xvY2FsIGludCB6aXBsb2NhbF9wdXRWYWx1ZSAocHpsaWJfZmlsZWZ1bmNfZGVmLCBmaWxlc3RyZWFtLCB4LCBuYkJ5dGUpCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKKyAgICB2b2lkcGYgZmlsZXN0cmVhbTsKICAgICB1TG9uZyB4OwogICAgIGludCBuYkJ5dGU7CiB7CkBAIC0yNTUsNyArMjY3LDcgQEAKICAgICAgICAgYnVmW25dID0gKHVuc2lnbmVkIGNoYXIpKHggJiAweGZmKTsKICAgICAgICAgeCA+Pj0gODsKICAgICB9Ci0gICAgaWYgKGZ3cml0ZShidWYsbmJCeXRlLDEsZmlsZSkhPTEpCisgICAgaWYgKFpXUklURSgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLG5iQnl0ZSkhPSh1TG9uZyluYkJ5dGUpCiAgICAgICAgIHJldHVybiBaSVBfRVJSTk87CiAgICAgZWxzZQogICAgICAgICByZXR1cm4gWklQX09LOwpAQCAtMjc4LDcgKzI5MCw3IEBACiAKIAogbG9jYWwgdUxvbmcgemlwbG9jYWxfVG16RGF0ZVRvRG9zRGF0ZShwdG0sZG9zRGF0ZSkKLSAgICB0bV96aXAqIHB0bTsKKyAgICBjb25zdCB0bV96aXAqIHB0bTsKICAgICB1TG9uZyBkb3NEYXRlOwogewogICAgIHVMb25nIHllYXIgPSAodUxvbmcpcHRtLT50bV95ZWFyOwpAQCAtMjk0LDM4ICszMDYsMzQ4IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1leHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4gKHBhdGhuYW1lLCBhcHBlbmQpCitsb2NhbCBpbnQgemlwbG9jYWxfZ2V0Qnl0ZSBPRigoCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKKyAgICB2b2lkcGYgZmlsZXN0cmVhbSwKKyAgICBpbnQgKnBpKSk7CisKK2xvY2FsIGludCB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHBpKQorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7CisgICAgdm9pZHBmIGZpbGVzdHJlYW07CisgICAgaW50ICpwaTsKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGM7CisgICAgaW50IGVyciA9IChpbnQpWlJFQUQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZjLDEpOworICAgIGlmIChlcnI9PTEpCisgICAgeworICAgICAgICAqcGkgPSAoaW50KWM7CisgICAgICAgIHJldHVybiBaSVBfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChaRVJST1IoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKSkKKyAgICAgICAgICAgIHJldHVybiBaSVBfRVJSTk87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBaSVBfRU9GOworICAgIH0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzCisqLworbG9jYWwgaW50IHppcGxvY2FsX2dldFNob3J0IE9GKCgKKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAorICAgIHZvaWRwZiBmaWxlc3RyZWFtLAorICAgIHVMb25nICpwWCkpOworCitsb2NhbCBpbnQgemlwbG9jYWxfZ2V0U2hvcnQgKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHBYKQorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7CisgICAgdm9pZHBmIGZpbGVzdHJlYW07CisgICAgdUxvbmcgKnBYOworeworICAgIHVMb25nIHggOworICAgIGludCBpOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ID0gKHVMb25nKWk7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgIGVyciA9IHppcGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggKz0gKCh1TG9uZylpKTw8ODsKKworICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICAgICAgKnBYID0geDsKKyAgICBlbHNlCisgICAgICAgICpwWCA9IDA7CisgICAgcmV0dXJuIGVycjsKK30KKworbG9jYWwgaW50IHppcGxvY2FsX2dldExvbmcgT0YoKAorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCisgICAgdm9pZHBmIGZpbGVzdHJlYW0sCisgICAgdUxvbmcgKnBYKSk7CisKK2xvY2FsIGludCB6aXBsb2NhbF9nZXRMb25nIChwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxwWCkKKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOworICAgIHZvaWRwZiBmaWxlc3RyZWFtOworICAgIHVMb25nICpwWDsKK3sKKyAgICB1TG9uZyB4IDsKKyAgICBpbnQgaTsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gemlwbG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCA9ICh1TG9uZylpOworCisgICAgaWYgKGVycj09WklQX09LKQorICAgICAgICBlcnIgPSB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ICs9ICgodUxvbmcpaSk8PDg7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgIGVyciA9IHppcGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggKz0gKCh1TG9uZylpKTw8MTY7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgIGVyciA9IHppcGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggKz0gKCh1TG9uZylpKTw8MjQ7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgICpwWCA9IHg7CisgICAgZWxzZQorICAgICAgICAqcFggPSAwOworICAgIHJldHVybiBlcnI7Cit9CisKKyNpZm5kZWYgQlVGUkVBRENPTU1FTlQKKyNkZWZpbmUgQlVGUkVBRENPTU1FTlQgKDB4NDAwKQorI2VuZGlmCisvKgorICBMb2NhdGUgdGhlIENlbnRyYWwgZGlyZWN0b3J5IG9mIGEgemlwZmlsZSAoYXQgdGhlIGVuZCwganVzdCBiZWZvcmUKKyAgICB0aGUgZ2xvYmFsIGNvbW1lbnQpCisqLworbG9jYWwgdUxvbmcgemlwbG9jYWxfU2VhcmNoQ2VudHJhbERpciBPRigoCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKKyAgICB2b2lkcGYgZmlsZXN0cmVhbSkpOworCitsb2NhbCB1TG9uZyB6aXBsb2NhbF9TZWFyY2hDZW50cmFsRGlyKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKQorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7CisgICAgdm9pZHBmIGZpbGVzdHJlYW07Cit7CisgICAgdW5zaWduZWQgY2hhciogYnVmOworICAgIHVMb25nIHVTaXplRmlsZTsKKyAgICB1TG9uZyB1QmFja1JlYWQ7CisgICAgdUxvbmcgdU1heEJhY2s9MHhmZmZmOyAvKiBtYXhpbXVtIHNpemUgb2YgZ2xvYmFsIGNvbW1lbnQgKi8KKyAgICB1TG9uZyB1UG9zRm91bmQ9MDsKKworICAgIGlmIChaU0VFSygqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sMCxaTElCX0ZJTEVGVU5DX1NFRUtfRU5EKSAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworCisgICAgdVNpemVGaWxlID0gWlRFTEwoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKTsKKworICAgIGlmICh1TWF4QmFjaz51U2l6ZUZpbGUpCisgICAgICAgIHVNYXhCYWNrID0gdVNpemVGaWxlOworCisgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIqKUFMTE9DKEJVRlJFQURDT01NRU5UKzQpOworICAgIGlmIChidWY9PU5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgdUJhY2tSZWFkID0gNDsKKyAgICB3aGlsZSAodUJhY2tSZWFkPHVNYXhCYWNrKQorICAgIHsKKyAgICAgICAgdUxvbmcgdVJlYWRTaXplLHVSZWFkUG9zIDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmICh1QmFja1JlYWQrQlVGUkVBRENPTU1FTlQ+dU1heEJhY2spCisgICAgICAgICAgICB1QmFja1JlYWQgPSB1TWF4QmFjazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdUJhY2tSZWFkKz1CVUZSRUFEQ09NTUVOVDsKKyAgICAgICAgdVJlYWRQb3MgPSB1U2l6ZUZpbGUtdUJhY2tSZWFkIDsKKworICAgICAgICB1UmVhZFNpemUgPSAoKEJVRlJFQURDT01NRU5UKzQpIDwgKHVTaXplRmlsZS11UmVhZFBvcykpID8KKyAgICAgICAgICAgICAgICAgICAgIChCVUZSRUFEQ09NTUVOVCs0KSA6ICh1U2l6ZUZpbGUtdVJlYWRQb3MpOworICAgICAgICBpZiAoWlNFRUsoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHVSZWFkUG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKFpSRUFEKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxidWYsdVJlYWRTaXplKSE9dVJlYWRTaXplKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZm9yIChpPShpbnQpdVJlYWRTaXplLTM7IChpLS0pPjA7KQorICAgICAgICAgICAgaWYgKCgoKihidWYraSkpPT0weDUwKSAmJiAoKCooYnVmK2krMSkpPT0weDRiKSAmJgorICAgICAgICAgICAgICAgICgoKihidWYraSsyKSk9PTB4MDUpICYmICgoKihidWYraSszKSk9PTB4MDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVQb3NGb3VuZCA9IHVSZWFkUG9zK2k7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKHVQb3NGb3VuZCE9MCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBUUllGUkVFKGJ1Zik7CisgICAgcmV0dXJuIHVQb3NGb3VuZDsKK30KKyNlbmRpZiAvKiAhTk9fQURERklMRUlORVhJU1RJTkdaSVAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuMiAocGF0aG5hbWUsIGFwcGVuZCwgZ2xvYmFsY29tbWVudCwgcHpsaWJfZmlsZWZ1bmNfZGVmKQogICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lOwogICAgIGludCBhcHBlbmQ7CisgICAgemlwY2hhcnBjKiBnbG9iYWxjb21tZW50OworICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7CiB7CiAgICAgemlwX2ludGVybmFsIHppaW5pdDsKICAgICB6aXBfaW50ZXJuYWwqIHppOworICAgIGludCBlcnI9WklQX09LOwogCi0gICAgemlpbml0LmZpbGV6aXAgPSBmb3BlbihwYXRobmFtZSwoYXBwZW5kID09IDApID8gIndiIiA6ICJhYiIpOwotICAgIGlmICh6aWluaXQuZmlsZXppcCA9PSBOVUxMKQorCisgICAgaWYgKHB6bGliX2ZpbGVmdW5jX2RlZj09TlVMTCkKKyAgICAgICAgZmlsbF9mb3Blbl9maWxlZnVuYygmemlpbml0LnpfZmlsZWZ1bmMpOworICAgIGVsc2UKKyAgICAgICAgemlpbml0LnpfZmlsZWZ1bmMgPSAqcHpsaWJfZmlsZWZ1bmNfZGVmOworCisgICAgemlpbml0LmZpbGVzdHJlYW0gPSAoKih6aWluaXQuel9maWxlZnVuYy56b3Blbl9maWxlKSkKKyAgICAgICAgICAgICAgICAgKHppaW5pdC56X2ZpbGVmdW5jLm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgKGFwcGVuZCA9PSBBUFBFTkRfU1RBVFVTX0NSRUFURSkgPworICAgICAgICAgICAgICAgICAgKFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEIHwgWkxJQl9GSUxFRlVOQ19NT0RFX1dSSVRFIHwgWkxJQl9GSUxFRlVOQ19NT0RFX0NSRUFURSkgOgorICAgICAgICAgICAgICAgICAgICAoWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgfCBaTElCX0ZJTEVGVU5DX01PREVfV1JJVEUgfCBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpKTsKKworICAgIGlmICh6aWluaXQuZmlsZXN0cmVhbSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB6aWluaXQuYmVnaW5fcG9zID0gZnRlbGwoemlpbml0LmZpbGV6aXApOworICAgIHppaW5pdC5iZWdpbl9wb3MgPSBaVEVMTCh6aWluaXQuel9maWxlZnVuYyx6aWluaXQuZmlsZXN0cmVhbSk7CiAgICAgemlpbml0LmluX29wZW5lZF9maWxlX2luemlwID0gMDsKICAgICB6aWluaXQuY2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKICAgICB6aWluaXQubnVtYmVyX2VudHJ5ID0gMDsKKyAgICB6aWluaXQuYWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0ID0gMDsKICAgICBpbml0X2xpbmtlZGxpc3QoJih6aWluaXQuY2VudHJhbF9kaXIpKTsKIAogCiAgICAgemkgPSAoemlwX2ludGVybmFsKilBTExPQyhzaXplb2YoemlwX2ludGVybmFsKSk7CiAgICAgaWYgKHppPT1OVUxMKQogICAgIHsKLSAgICAgICAgZmNsb3NlKHppaW5pdC5maWxlemlwKTsKKyAgICAgICAgWkNMT1NFKHppaW5pdC56X2ZpbGVmdW5jLHppaW5pdC5maWxlc3RyZWFtKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgKnppID0gemlpbml0OwotICAgIHJldHVybiAoemlwRmlsZSl6aTsKKyAgICAvKiBub3cgd2UgYWRkIGZpbGUgaW4gYSB6aXBmaWxlICovCisgICAgI2lmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAorICAgIGlmIChhcHBlbmQgPT0gQVBQRU5EX1NUQVRVU19BRERJTlpJUCkKKyAgICB7CisgICAgICAgIHVMb25nIGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOy8qIGJ5dGUgYmVmb3JlIHRoZSB6aXBmaWxlLCAoPjAgZm9yIHNmeCkqLworCisgICAgICAgIHVMb25nIHNpemVfY2VudHJhbF9kaXI7ICAgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgKi8KKyAgICAgICAgdUxvbmcgb2Zmc2V0X2NlbnRyYWxfZGlyOyAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgICAgICB1TG9uZyBjZW50cmFsX3Bvcyx1TDsKKworICAgICAgICB1TG9uZyBudW1iZXJfZGlzazsgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBjdXJyZW50IGRpc3QsIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuaW5nIFpJUCwgdW5zdXBwb3J0ZWQsIGFsd2F5cyAwKi8KKyAgICAgICAgdUxvbmcgbnVtYmVyX2Rpc2tfd2l0aF9DRDsgIC8qIG51bWJlciB0aGUgdGhlIGRpc2sgd2l0aCBjZW50cmFsIGRpciwgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLworICAgICAgICB1TG9uZyBudW1iZXJfZW50cnk7CisgICAgICAgIHVMb25nIG51bWJlcl9lbnRyeV9DRDsgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNlbnRyYWwgZGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2FtZSB0aGFuIG51bWJlcl9lbnRyeSBvbiBub3NwYW4pICovCisgICAgICAgIHVMb25nIHNpemVfY29tbWVudDsKKworICAgICAgICBjZW50cmFsX3BvcyA9IHppcGxvY2FsX1NlYXJjaENlbnRyYWxEaXIoJnppaW5pdC56X2ZpbGVmdW5jLHppaW5pdC5maWxlc3RyZWFtKTsKKyAgICAgICAgaWYgKGNlbnRyYWxfcG9zPT0wKQorICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgICAgICBpZiAoWlNFRUsoemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyYWxfcG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgICAgICAvKiB0aGUgc2lnbmF0dXJlLCBhbHJlYWR5IGNoZWNrZWQgKi8KKyAgICAgICAgaWYgKHppcGxvY2FsX2dldExvbmcoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCisgICAgICAgICAgICBlcnI9WklQX0VSUk5POworCisgICAgICAgIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KKyAgICAgICAgaWYgKHppcGxvY2FsX2dldFNob3J0KCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrKSE9WklQX09LKQorICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgICAgIGlmICh6aXBsb2NhbF9nZXRTaG9ydCgmemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLCZudW1iZXJfZGlza193aXRoX0NEKSE9WklQX09LKQorICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCisgICAgICAgIGlmICh6aXBsb2NhbF9nZXRTaG9ydCgmemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLCZudW1iZXJfZW50cnkpIT1aSVBfT0spCisgICAgICAgICAgICBlcnI9WklQX0VSUk5POworCisgICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciAqLworICAgICAgICBpZiAoemlwbG9jYWxfZ2V0U2hvcnQoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmbnVtYmVyX2VudHJ5X0NEKSE9WklQX09LKQorICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgICAgICBpZiAoKG51bWJlcl9lbnRyeV9DRCE9bnVtYmVyX2VudHJ5KSB8fAorICAgICAgICAgICAgKG51bWJlcl9kaXNrX3dpdGhfQ0QhPTApIHx8CisgICAgICAgICAgICAobnVtYmVyX2Rpc2shPTApKQorICAgICAgICAgICAgZXJyPVpJUF9CQURaSVBGSUxFOworCisgICAgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgICAgIGlmICh6aXBsb2NhbF9nZXRMb25nKCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJnNpemVfY2VudHJhbF9kaXIpIT1aSVBfT0spCisgICAgICAgICAgICBlcnI9WklQX0VSUk5POworCisgICAgICAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlCisgICAgICAgICAgICBzdGFydGluZyBkaXNrIG51bWJlciAqLworICAgICAgICBpZiAoemlwbG9jYWxfZ2V0TG9uZygmemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLCZvZmZzZXRfY2VudHJhbF9kaXIpIT1aSVBfT0spCisgICAgICAgICAgICBlcnI9WklQX0VSUk5POworCisgICAgICAgIC8qIHppcGZpbGUgY29tbWVudCBsZW5ndGggKi8KKyAgICAgICAgaWYgKHppcGxvY2FsX2dldFNob3J0KCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJnNpemVfY29tbWVudCkhPVpJUF9PSykKKyAgICAgICAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAgICAgaWYgKChjZW50cmFsX3BvczxvZmZzZXRfY2VudHJhbF9kaXIrc2l6ZV9jZW50cmFsX2RpcikgJiYKKyAgICAgICAgICAgIChlcnI9PVpJUF9PSykpCisgICAgICAgICAgICBlcnI9WklQX0JBRFpJUEZJTEU7CisKKyAgICAgICAgaWYgKGVyciE9WklQX09LKQorICAgICAgICB7CisgICAgICAgICAgICBaQ0xPU0Uoemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUgPSBjZW50cmFsX3BvcyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvZmZzZXRfY2VudHJhbF9kaXIrc2l6ZV9jZW50cmFsX2Rpcik7CisgICAgICAgIHppaW5pdC5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQgPSBieXRlX2JlZm9yZV90aGVfemlwZmlsZSA7CisKKyAgICAgICAgeworICAgICAgICAgICAgdUxvbmcgc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkID0gc2l6ZV9jZW50cmFsX2RpcjsKKyAgICAgICAgICAgIHNpemVfdCBidWZfc2l6ZSA9IFNJWkVEQVRBX0lOREFUQUJMT0NLOworICAgICAgICAgICAgdm9pZCogYnVmX3JlYWQgPSAodm9pZCopQUxMT0MoYnVmX3NpemUpOworICAgICAgICAgICAgaWYgKFpTRUVLKHppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgIG9mZnNldF9jZW50cmFsX2RpciArIGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLAorICAgICAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAgICAgICAgIHdoaWxlICgoc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkPjApICYmIChlcnI9PVpJUF9PSykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdUxvbmcgcmVhZF90aGlzID0gU0laRURBVEFfSU5EQVRBQkxPQ0s7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRfdGhpcyA+IHNpemVfY2VudHJhbF9kaXJfdG9fcmVhZCkKKyAgICAgICAgICAgICAgICAgICAgcmVhZF90aGlzID0gc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkOworICAgICAgICAgICAgICAgIGlmIChaUkVBRCh6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sYnVmX3JlYWQscmVhZF90aGlzKSAhPSByZWFkX3RoaXMpCisgICAgICAgICAgICAgICAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgICAgICAgICAgICAgIGVyciA9IGFkZF9kYXRhX2luX2RhdGFibG9jaygmemlpbml0LmNlbnRyYWxfZGlyLGJ1Zl9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVMb25nKXJlYWRfdGhpcyk7CisgICAgICAgICAgICAgICAgc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkLT1yZWFkX3RoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUUllGUkVFKGJ1Zl9yZWFkKTsKKyAgICAgICAgfQorICAgICAgICB6aWluaXQuYmVnaW5fcG9zID0gYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7CisgICAgICAgIHppaW5pdC5udW1iZXJfZW50cnkgPSBudW1iZXJfZW50cnlfQ0Q7CisKKyAgICAgICAgaWYgKFpTRUVLKHppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgIG9mZnNldF9jZW50cmFsX2RpcitieXRlX2JlZm9yZV90aGVfemlwZmlsZSxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgICAgIGVycj1aSVBfRVJSTk87CisgICAgfQorICAgICNlbmRpZiAvKiAhTk9fQURERklMRUlORVhJU1RJTkdaSVAqLworCisgICAgaWYgKGVyciAhPSBaSVBfT0spCisgICAgeworICAgICAgICBUUllGUkVFKHppKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICp6aSA9IHppaW5pdDsKKyAgICAgICAgcmV0dXJuICh6aXBGaWxlKXppOworICAgIH0KIH0KIAotZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAgKGZpbGUsIGZpbGVuYW1lLCB6aXBmaSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfZ2xvYmFsLCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwpCitleHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4gKHBhdGhuYW1lLCBhcHBlbmQpCisgICAgY29uc3QgY2hhciAqcGF0aG5hbWU7CisgICAgaW50IGFwcGVuZDsKK3sKKyAgICByZXR1cm4gemlwT3BlbjIocGF0aG5hbWUsYXBwZW5kLE5VTEwsTlVMTCk7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMyAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfZ2xvYmFsLCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsIGNyY0ZvckNyeXB0aW5nKQogICAgIHppcEZpbGUgZmlsZTsKICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpOwpAQCAtMzM2LDYgKzY1OCwxMiBAQAogICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQ7CiAgICAgaW50IG1ldGhvZDsKICAgICBpbnQgbGV2ZWw7CisgICAgaW50IHJhdzsKKyAgICBpbnQgd2luZG93Qml0czsKKyAgICBpbnQgbWVtTGV2ZWw7CisgICAgaW50IHN0cmF0ZWd5OworICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOworICAgIHVMb25nIGNyY0ZvckNyeXB0aW5nOwogewogICAgIHppcF9pbnRlcm5hbCogemk7CiAgICAgdUludCBzaXplX2ZpbGVuYW1lOwpAQCAtMzQzLDYgKzY3MSwxMSBAQAogICAgIHVJbnQgaTsKICAgICBpbnQgZXJyID0gWklQX09LOwogCisgICAgI2lmZGVmIE5PQ1JQWVQKKyAgICBpZiAocGFzc3dvcmQgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOworICAgICNlbmRpZgorCiAgICAgaWYgKGZpbGUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwogICAgIGlmICgobWV0aG9kIT0wKSAmJiAobWV0aG9kIT1aX0RFRkxBVEVEKSkKQEAgLTM4NCwxMyArNzE3LDE3IEBACiAgICAgICB6aS0+Y2kuZmxhZyB8PSA0OwogICAgIGlmICgobGV2ZWw9PTEpKQogICAgICAgemktPmNpLmZsYWcgfD0gNjsKKyAgICBpZiAocGFzc3dvcmQgIT0gTlVMTCkKKyAgICAgIHppLT5jaS5mbGFnIHw9IDE7CiAKICAgICB6aS0+Y2kuY3JjMzIgPSAwOwogICAgIHppLT5jaS5tZXRob2QgPSBtZXRob2Q7CisgICAgemktPmNpLmVuY3J5cHQgPSAwOwogICAgIHppLT5jaS5zdHJlYW1faW5pdGlhbGlzZWQgPSAwOwogICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSA9IDA7Ci0gICAgemktPmNpLnBvc19sb2NhbF9oZWFkZXIgPSBmdGVsbCh6aS0+ZmlsZXppcCk7Ci0gICAgemktPmNpLnNpemVfY2VudHJhbGhlYWRlciA9IFNJWkVDRU5UUkFMSEVBREVSICsgc2l6ZV9maWxlbmFtZSArIAorICAgIHppLT5jaS5yYXcgPSByYXc7CisgICAgemktPmNpLnBvc19sb2NhbF9oZWFkZXIgPSBaVEVMTCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSkgOworICAgIHppLT5jaS5zaXplX2NlbnRyYWxoZWFkZXIgPSBTSVpFQ0VOVFJBTEhFQURFUiArIHNpemVfZmlsZW5hbWUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2V4dHJhZmllbGRfZ2xvYmFsICsgc2l6ZV9jb21tZW50OwogICAgIHppLT5jaS5jZW50cmFsX2hlYWRlciA9IChjaGFyKilBTExPQygodUludCl6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyKTsKIApAQCAtNDEwLDE2ICs3NDcsMTYgQEAKICAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzQsKHVMb25nKTAsMik7IC8qZGlzayBubSBzdGFydCovCiAKICAgICBpZiAoemlwZmk9PU5VTEwpCi0gICAgICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszNiwodUxvbmcpMCwyKTsgCisgICAgICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszNiwodUxvbmcpMCwyKTsKICAgICBlbHNlCi0gICAgICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszNiwodUxvbmcpemlwZmktPmludGVybmFsX2ZhLDIpOyAKKyAgICAgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM2LCh1TG9uZyl6aXBmaS0+aW50ZXJuYWxfZmEsMik7CiAKICAgICBpZiAoemlwZmk9PU5VTEwpCi0gICAgICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszOCwodUxvbmcpMCw0KTsgCisgICAgICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszOCwodUxvbmcpMCw0KTsKICAgICBlbHNlCiAgICAgICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszOCwodUxvbmcpemlwZmktPmV4dGVybmFsX2ZhLDQpOwogCi0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQyLCh1TG9uZyl6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciw0KTsKKyAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrNDIsKHVMb25nKXppLT5jaS5wb3NfbG9jYWxfaGVhZGVyLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0LDQpOwogCiAgICAgZm9yIChpPTA7aTxzaXplX2ZpbGVuYW1lO2krKykKICAgICAgICAgKih6aS0+Y2kuY2VudHJhbF9oZWFkZXIrU0laRUNFTlRSQUxIRUFERVIraSkgPSAqKGZpbGVuYW1lK2kpOwpAQCAtNDMwLDQ0ICs3NjcsNDQgQEAKIAogICAgIGZvciAoaT0wO2k8c2l6ZV9jb21tZW50O2krKykKICAgICAgICAgKih6aS0+Y2kuY2VudHJhbF9oZWFkZXIrU0laRUNFTlRSQUxIRUFERVIrc2l6ZV9maWxlbmFtZSsKLSAgICAgICAgICAgICAgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCtpKSA9ICooZmlsZW5hbWUraSk7CisgICAgICAgICAgICAgIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwraSkgPSAqKGNvbW1lbnQraSk7CiAgICAgaWYgKHppLT5jaS5jZW50cmFsX2hlYWRlciA9PSBOVUxMKQogICAgICAgICByZXR1cm4gWklQX0lOVEVSTkFMRVJST1I7CiAKICAgICAvKiB3cml0ZSB0aGUgbG9jYWwgaGVhZGVyICovCi0gICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoemktPmZpbGV6aXAsKHVMb25nKUxPQ0FMSEVBREVSTUFHSUMsNCk7CisgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylMT0NBTEhFQURFUk1BR0lDLDQpOwogCiAgICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpMjAsMik7LyogdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAqLworICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTIwLDIpOy8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgKi8KICAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKHppLT5maWxlemlwLCh1TG9uZyl6aS0+Y2kuZmxhZywyKTsKKyAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyl6aS0+Y2kuZmxhZywyKTsKIAogICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoemktPmZpbGV6aXAsKHVMb25nKXppLT5jaS5tZXRob2QsMik7CisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPmNpLm1ldGhvZCwyKTsKIAogICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoemktPmZpbGV6aXAsKHVMb25nKXppLT5jaS5kb3NEYXRlLDQpOworICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5jaS5kb3NEYXRlLDQpOwogCiAgICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpMCw0KTsgLyogY3JjIDMyLCB1bmtub3duICovCisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsgLyogY3JjIDMyLCB1bmtub3duICovCiAgICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpMCw0KTsgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCiAgICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpMCw0KTsgLyogdW5jb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KKyAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDQpOyAvKiB1bmNvbXByZXNzZWQgc2l6ZSwgdW5rbm93biAqLwogCiAgICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpc2l6ZV9maWxlbmFtZSwyKTsKKyAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2ZpbGVuYW1lLDIpOwogCiAgICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpc2l6ZV9leHRyYWZpZWxkX2xvY2FsLDIpOworICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXNpemVfZXh0cmFmaWVsZF9sb2NhbCwyKTsKIAogICAgIGlmICgoZXJyPT1aSVBfT0spICYmIChzaXplX2ZpbGVuYW1lPjApKQotICAgICAgICBpZiAoZndyaXRlKGZpbGVuYW1lLCh1SW50KXNpemVfZmlsZW5hbWUsMSx6aS0+ZmlsZXppcCkhPTEpCisgICAgICAgIGlmIChaV1JJVEUoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sZmlsZW5hbWUsc2l6ZV9maWxlbmFtZSkhPXNpemVfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwogCiAgICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHNpemVfZXh0cmFmaWVsZF9sb2NhbD4wKSkKLSAgICAgICAgaWYgKGZ3cml0ZShleHRyYWZpZWxkX2xvY2FsLCh1SW50KXNpemVfZXh0cmFmaWVsZF9sb2NhbCwxLHppLT5maWxlemlwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0xKQorICAgICAgICBpZiAoWldSSVRFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGV4dHJhZmllbGRfbG9jYWwsc2l6ZV9leHRyYWZpZWxkX2xvY2FsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT1zaXplX2V4dHJhZmllbGRfbG9jYWwpCiAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwogCiAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KTA7CkBAIC00NzYsMTcgKzgxMywzOCBAQAogICAgIHppLT5jaS5zdHJlYW0udG90YWxfaW4gPSAwOwogICAgIHppLT5jaS5zdHJlYW0udG90YWxfb3V0ID0gMDsKIAotICAgIGlmICgoZXJyPT1aSVBfT0spICYmICh6aS0+Y2kubWV0aG9kID09IFpfREVGTEFURUQpKQorICAgIGlmICgoZXJyPT1aSVBfT0spICYmICh6aS0+Y2kubWV0aG9kID09IFpfREVGTEFURUQpICYmICghemktPmNpLnJhdykpCiAgICAgewogICAgICAgICB6aS0+Y2kuc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CiAgICAgICAgIHppLT5jaS5zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CiAgICAgICAgIHppLT5jaS5zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwogCisgICAgICAgIGlmICh3aW5kb3dCaXRzPjApCisgICAgICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisKICAgICAgICAgZXJyID0gZGVmbGF0ZUluaXQyKCZ6aS0+Y2kuc3RyZWFtLCBsZXZlbCwKLSAgICAgICAgICAgICAgIFpfREVGTEFURUQsIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIDApOworICAgICAgICAgICAgICAgWl9ERUZMQVRFRCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KTsKIAogICAgICAgICBpZiAoZXJyPT1aX09LKQogICAgICAgICAgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDE7CisKKyAgICAgICAgI2lmbmRlZiBOT0NSUFlUCisgICAgICAgIHppLT5jaS5jcnlwdF9oZWFkZXJfc2l6ZSA9IDA7CisgICAgICAgIGlmICgoZXJyPT1aX09LKSAmJiAocGFzc3dvcmQgIT0gTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmSGVhZFtSQU5EX0hFQURfTEVOXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplSGVhZDsKKyAgICAgICAgICAgIHppLT5jaS5lbmNyeXB0ID0gMTsKKyAgICAgICAgICAgIHppLT5jaS5wY3JjXzMyX3RhYiA9IGdldF9jcmNfdGFibGUoKTsKKyAgICAgICAgICAgIC8qaW5pdF9rZXlzKHBhc3N3b3JkLHppLT5jaS5rZXlzLHppLT5jaS5wY3JjXzMyX3RhYik7Ki8KKworICAgICAgICAgICAgc2l6ZUhlYWQ9Y3J5cHRoZWFkKHBhc3N3b3JkLGJ1ZkhlYWQsUkFORF9IRUFEX0xFTix6aS0+Y2kua2V5cyx6aS0+Y2kucGNyY18zMl90YWIsY3JjRm9yQ3J5cHRpbmcpOworICAgICAgICAgICAgemktPmNpLmNyeXB0X2hlYWRlcl9zaXplID0gc2l6ZUhlYWQ7CisKKyAgICAgICAgICAgIGlmIChaV1JJVEUoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sYnVmSGVhZCxzaXplSGVhZCkgIT0gc2l6ZUhlYWQpCisgICAgICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKICAgICB9CiAKIApAQCAtNDk1LDkgKzg1Myw3NCBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMihmaWxlLCBmaWxlbmFtZSwgemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfZ2xvYmFsLCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwsIHJhdykKKyAgICB6aXBGaWxlIGZpbGU7CisgICAgY29uc3QgY2hhciogZmlsZW5hbWU7CisgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaTsKKyAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsOworICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsOworICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsOworICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbDsKKyAgICBjb25zdCBjaGFyKiBjb21tZW50OworICAgIGludCBtZXRob2Q7CisgICAgaW50IGxldmVsOworICAgIGludCByYXc7Cit7CisgICAgcmV0dXJuIHppcE9wZW5OZXdGaWxlSW5aaXAzIChmaWxlLCBmaWxlbmFtZSwgemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwsIHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfbG9jYWwsIHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsKQorICAgIHppcEZpbGUgZmlsZTsKKyAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKKyAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpOworICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWw7CisgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWw7CisgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWw7CisgICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsOworICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQ7CisgICAgaW50IG1ldGhvZDsKKyAgICBpbnQgbGV2ZWw7Cit7CisgICAgcmV0dXJuIHppcE9wZW5OZXdGaWxlSW5aaXAyIChmaWxlLCBmaWxlbmFtZSwgemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwsIDApOworfQorCitsb2NhbCBpbnQgemlwRmx1c2hXcml0ZUJ1ZmZlcih6aSkKKyAgemlwX2ludGVybmFsKiB6aTsKK3sKKyAgICBpbnQgZXJyPVpJUF9PSzsKKworICAgIGlmICh6aS0+Y2kuZW5jcnlwdCAhPSAwKQorICAgIHsKKyAgICAgICAgdUludCBpOworICAgICAgICBpbnQgdDsKKyAgICAgICAgZm9yIChpPTA7aTx6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGE7aSsrKQorICAgICAgICAgICAgemktPmNpLmJ1ZmZlcmVkX2RhdGFbaV0gPSB6ZW5jb2RlKHppLT5jaS5rZXlzLCB6aS0+Y2kucGNyY18zMl90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kuYnVmZmVyZWRfZGF0YVtpXSx0KTsKKyAgICB9CisgICAgaWYgKFpXUklURSh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSx6aS0+Y2kuYnVmZmVyZWRfZGF0YSx6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9emktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhKQorICAgICAgZXJyID0gWklQX0VSUk5POworICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSA9IDA7CisgICAgcmV0dXJuIGVycjsKK30KKwogZXh0ZXJuIGludCBaRVhQT1JUIHppcFdyaXRlSW5GaWxlSW5aaXAgKGZpbGUsIGJ1ZiwgbGVuKQogICAgIHppcEZpbGUgZmlsZTsKLSAgICBjb25zdCB2b2lkcCBidWY7CisgICAgY29uc3Qgdm9pZCogYnVmOwogICAgIHVuc2lnbmVkIGxlbjsKIHsKICAgICB6aXBfaW50ZXJuYWwqIHppOwpAQCAtNTEwLDcgKzkzMyw3IEBACiAgICAgaWYgKHppLT5pbl9vcGVuZWRfZmlsZV9pbnppcCA9PSAwKQogICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7CiAKLSAgICB6aS0+Y2kuc3RyZWFtLm5leHRfaW4gPSBidWY7CisgICAgemktPmNpLnN0cmVhbS5uZXh0X2luID0gKHZvaWQqKWJ1ZjsKICAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gbGVuOwogICAgIHppLT5jaS5jcmMzMiA9IGNyYzMyKHppLT5jaS5jcmMzMixidWYsbGVuKTsKIApAQCAtNTE4LDE1ICs5NDEsMTcgQEAKICAgICB7CiAgICAgICAgIGlmICh6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCA9PSAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZndyaXRlKHppLT5jaS5idWZmZXJlZF9kYXRhLCh1SW50KXppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSwxLHppLT5maWxlemlwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0xKQorICAgICAgICAgICAgaWYgKHppcEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKICAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0gICAgICAgICAgICB6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEgPSAwOwogICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClaX0JVRlNJWkU7CiAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0ID0gemktPmNpLmJ1ZmZlcmVkX2RhdGE7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKQorCisgICAgICAgIGlmKGVyciAhPSBaSVBfT0spCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKCF6aS0+Y2kucmF3KSkKICAgICAgICAgewogICAgICAgICAgICAgdUxvbmcgdVRvdGFsT3V0QmVmb3JlID0gemktPmNpLnN0cmVhbS50b3RhbF9vdXQ7CiAgICAgICAgICAgICBlcnI9ZGVmbGF0ZSgmemktPmNpLnN0cmVhbSwgIFpfTk9fRkxVU0gpOwpAQCAtNTU1LDMzICs5ODAsMzQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIHJldHVybiBlcnI7CiB9CiAKLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZUZpbGVJblppcCAoZmlsZSkKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZUZpbGVJblppcFJhdyAoZmlsZSwgdW5jb21wcmVzc2VkX3NpemUsIGNyYzMyKQogICAgIHppcEZpbGUgZmlsZTsKKyAgICB1TG9uZyB1bmNvbXByZXNzZWRfc2l6ZTsKKyAgICB1TG9uZyBjcmMzMjsKIHsKICAgICB6aXBfaW50ZXJuYWwqIHppOworICAgIHVMb25nIGNvbXByZXNzZWRfc2l6ZTsKICAgICBpbnQgZXJyPVpJUF9PSzsKIAogICAgIGlmIChmaWxlID09IE5VTEwpCiAgICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKICAgICB6aSA9ICh6aXBfaW50ZXJuYWwqKWZpbGU7CiAKLSAgICBpZiAoemktPmluX29wZW5lZF9maWxlX2luemlwID09IDApICAgIAorICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMCkKICAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwogICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gPSAwOwotICAgIAotICAgIGlmICh6aS0+Y2kubWV0aG9kID09IFpfREVGTEFURUQpCisKKyAgICBpZiAoKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKCF6aS0+Y2kucmF3KSkKICAgICAgICAgd2hpbGUgKGVycj09WklQX09LKQogICAgIHsKICAgICAgICAgdUxvbmcgdVRvdGFsT3V0QmVmb3JlOwogICAgICAgICBpZiAoemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGZ3cml0ZSh6aS0+Y2kuYnVmZmVyZWRfZGF0YSwodUludCl6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEsMSx6aS0+ZmlsZXppcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9MSkKKyAgICAgICAgICAgIGlmICh6aXBGbHVzaFdyaXRlQnVmZmVyKHppKSA9PSBaSVBfRVJSTk8pCiAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgICAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhID0gMDsKICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpWl9CVUZTSVpFOwogICAgICAgICAgICAgemktPmNpLnN0cmVhbS5uZXh0X291dCA9IHppLT5jaS5idWZmZXJlZF9kYXRhOwogICAgICAgICB9CkBAIC01OTQsMjEgKzEwMjAsMzIgQEAKICAgICAgICAgZXJyPVpJUF9PSzsgLyogdGhpcyBpcyBub3JtYWwgKi8KIAogICAgIGlmICgoemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhPjApICYmIChlcnI9PVpJUF9PSykpCi0gICAgICAgIGlmIChmd3JpdGUoemktPmNpLmJ1ZmZlcmVkX2RhdGEsKHVJbnQpemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhLDEsemktPmZpbGV6aXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9MSkKKyAgICAgICAgaWYgKHppcEZsdXNoV3JpdGVCdWZmZXIoemkpPT1aSVBfRVJSTk8pCiAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87CiAKLSAgICBpZiAoKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKGVycj09WklQX09LKSkKKyAgICBpZiAoKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKCF6aS0+Y2kucmF3KSkKICAgICB7CiAgICAgICAgIGVycj1kZWZsYXRlRW5kKCZ6aS0+Y2kuc3RyZWFtKTsKICAgICAgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7CiAgICAgfQogCi0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzE2LCh1TG9uZyl6aS0+Y2kuY3JjMzIsNCk7IC8qY3JjKi8KKyAgICBpZiAoIXppLT5jaS5yYXcpCisgICAgeworICAgICAgICBjcmMzMiA9ICh1TG9uZyl6aS0+Y2kuY3JjMzI7CisgICAgICAgIHVuY29tcHJlc3NlZF9zaXplID0gKHVMb25nKXppLT5jaS5zdHJlYW0udG90YWxfaW47CisgICAgfQorICAgIGNvbXByZXNzZWRfc2l6ZSA9ICh1TG9uZyl6aS0+Y2kuc3RyZWFtLnRvdGFsX291dDsKKyAgICAjaWZuZGVmIE5PQ1JQWVQKKyAgICBjb21wcmVzc2VkX3NpemUgKz0gemktPmNpLmNyeXB0X2hlYWRlcl9zaXplOworICAgICNlbmRpZgorCisgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzE2LGNyYzMyLDQpOyAvKmNyYyovCiAgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodUxvbmcpemktPmNpLnN0cmVhbS50b3RhbF9vdXQsNCk7IC8qY29tcHIgc2l6ZSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRfc2l6ZSw0KTsgLypjb21wciBzaXplKi8KKyAgICBpZiAoemktPmNpLnN0cmVhbS5kYXRhX3R5cGUgPT0gWl9BU0NJSSkKKyAgICAgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM2LCh1TG9uZylaX0FTQ0lJLDIpOwogICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVMb25nKXppLT5jaS5zdHJlYW0udG90YWxfaW4sNCk7IC8qdW5jb21wciBzaXplKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkX3NpemUsNCk7IC8qdW5jb21wciBzaXplKi8KIAogICAgIGlmIChlcnI9PVpJUF9PSykKICAgICAgICAgZXJyID0gYWRkX2RhdGFfaW5fZGF0YWJsb2NrKCZ6aS0+Y2VudHJhbF9kaXIsemktPmNpLmNlbnRyYWxfaGVhZGVyLApAQCAtNjE3LDIzICsxMDU0LDIzIEBACiAKICAgICBpZiAoZXJyPT1aSVBfT0spCiAgICAgewotICAgICAgICBsb25nIGN1cl9wb3NfaW56aXAgPSBmdGVsbCh6aS0+ZmlsZXppcCk7Ci0JICAgIGlmIChmc2Vlayh6aS0+ZmlsZXppcCwKLSAgICAgICAgICAgICAgICAgIHppLT5jaS5wb3NfbG9jYWxfaGVhZGVyICsgMTQsU0VFS19TRVQpIT0wKQotCQkgICAgZXJyID0gWklQX0VSUk5POworICAgICAgICBsb25nIGN1cl9wb3NfaW56aXAgPSBaVEVMTCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSk7CisgICAgICAgIGlmIChaU0VFSyh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgIHppLT5jaS5wb3NfbG9jYWxfaGVhZGVyICsgMTQsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87CiAKICAgICAgICAgaWYgKGVycj09WklQX09LKQotICAgICAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoemktPmZpbGV6aXAsKHVMb25nKXppLT5jaS5jcmMzMiw0KTsgLyogY3JjIDMyLCB1bmtub3duICovCisgICAgICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sY3JjMzIsNCk7IC8qIGNyYyAzMiwgdW5rbm93biAqLwogCiAgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCi0gICAgICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpemktPmNpLnN0cmVhbS50b3RhbF9vdXQsNCk7IAorICAgICAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGNvbXByZXNzZWRfc2l6ZSw0KTsKIAogICAgICAgICBpZiAoZXJyPT1aSVBfT0spIC8qIHVuY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCi0gICAgICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpemktPmNpLnN0cmVhbS50b3RhbF9pbiw0KTsKKyAgICAgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSx1bmNvbXByZXNzZWRfc2l6ZSw0KTsKIAotCSAgICBpZiAoZnNlZWsoemktPmZpbGV6aXAsCi0gICAgICAgICAgICAgICAgICBjdXJfcG9zX2luemlwLFNFRUtfU0VUKSE9MCkKLQkJICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICAgICAgaWYgKFpTRUVLKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLAorICAgICAgICAgICAgICAgICAgY3VyX3Bvc19pbnppcCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKICAgICB9CiAKICAgICB6aS0+bnVtYmVyX2VudHJ5ICsrOwpAQCAtNjQyLDYgKzEwNzksMTIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitleHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2VGaWxlSW5aaXAgKGZpbGUpCisgICAgemlwRmlsZSBmaWxlOworeworICAgIHJldHVybiB6aXBDbG9zZUZpbGVJblppcFJhdyAoZmlsZSwwLDApOworfQorCiBleHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2UgKGZpbGUsIGdsb2JhbF9jb21tZW50KQogICAgIHppcEZpbGUgZmlsZTsKICAgICBjb25zdCBjaGFyKiBnbG9iYWxfY29tbWVudDsKQEAgLTY2NiwxNSArMTEwOSwxNiBAQAogICAgICAgICBzaXplX2dsb2JhbF9jb21tZW50ID0gc3RybGVuKGdsb2JhbF9jb21tZW50KTsKIAogCi0gICAgY2VudHJhbGRpcl9wb3NfaW56aXAgPSBmdGVsbCh6aS0+ZmlsZXppcCk7CisgICAgY2VudHJhbGRpcl9wb3NfaW56aXAgPSBaVEVMTCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSk7CiAgICAgaWYgKGVycj09WklQX09LKQogICAgIHsKICAgICAgICAgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGxkaSA9IHppLT5jZW50cmFsX2Rpci5maXJzdF9ibG9jayA7CiAgICAgICAgIHdoaWxlIChsZGkhPU5VTEwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgoZXJyPT1aSVBfT0spICYmIChsZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrPjApKQotICAgICAgICAgICAgICAgIGlmIChmd3JpdGUobGRpLT5kYXRhLCh1SW50KWxkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSx6aS0+ZmlsZXppcCkgIT0xICkKKyAgICAgICAgICAgICAgICBpZiAoWldSSVRFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRpLT5kYXRhLGxkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPWxkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2sgKQogICAgICAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87CiAKICAgICAgICAgICAgIHNpemVfY2VudHJhbGRpciArPSBsZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrOwpAQCAtNjg0LDM0ICsxMTI4LDQwIEBACiAgICAgZnJlZV9kYXRhYmxvY2soemktPmNlbnRyYWxfZGlyLmZpcnN0X2Jsb2NrKTsKIAogICAgIGlmIChlcnI9PVpJUF9PSykgLyogTWFnaWMgRW5kICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKHppLT5maWxlemlwLCh1TG9uZylFTkRIRUFERVJNQUdJQyw0KTsKKyAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylFTkRIRUFERVJNQUdJQyw0KTsKIAogICAgIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLwotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpMCwyKTsKKyAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDIpOwogCiAgICAgaWYgKGVycj09WklQX09LKSAvKiBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKHppLT5maWxlemlwLCh1TG9uZykwLDIpOworICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTAsMik7CiAKICAgICBpZiAoZXJyPT1aSVBfT0spIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoemktPmZpbGV6aXAsKHVMb25nKXppLT5udW1iZXJfZW50cnksMik7CisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPm51bWJlcl9lbnRyeSwyKTsKIAogICAgIGlmIChlcnI9PVpJUF9PSykgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKHppLT5maWxlemlwLCh1TG9uZyl6aS0+bnVtYmVyX2VudHJ5LDIpOworICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5udW1iZXJfZW50cnksMik7CiAKICAgICBpZiAoZXJyPT1aSVBfT0spIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKHppLT5maWxlemlwLCh1TG9uZylzaXplX2NlbnRyYWxkaXIsNCk7CisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpc2l6ZV9jZW50cmFsZGlyLDQpOwogCi0gICAgaWYgKGVycj09WklQX09LKSAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZSAKLQkgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBkaXNrIG51bWJlciAqLwotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpY2VudHJhbGRpcl9wb3NfaW56aXAgLDQpOworICAgIGlmIChlcnI9PVpJUF9PSykgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBkaXNrIG51bWJlciAqLworICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1TG9uZykoY2VudHJhbGRpcl9wb3NfaW56aXAgLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0KSw0KTsKIAogICAgIGlmIChlcnI9PVpJUF9PSykgLyogemlwZmlsZSBjb21tZW50IGxlbmd0aCAqLwotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSh6aS0+ZmlsZXppcCwodUxvbmcpc2l6ZV9nbG9iYWxfY29tbWVudCwyKTsKKyAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2dsb2JhbF9jb21tZW50LDIpOwogCiAgICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHNpemVfZ2xvYmFsX2NvbW1lbnQ+MCkpCi0gICAgICAgIGlmIChmd3JpdGUoZ2xvYmFsX2NvbW1lbnQsKHVJbnQpc2l6ZV9nbG9iYWxfY29tbWVudCwxLHppLT5maWxlemlwKSAhPTEgKQorICAgICAgICBpZiAoWldSSVRFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLAorICAgICAgICAgICAgICAgICAgIGdsb2JhbF9jb21tZW50LHNpemVfZ2xvYmFsX2NvbW1lbnQpICE9IHNpemVfZ2xvYmFsX2NvbW1lbnQpCiAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgIGZjbG9zZSh6aS0+ZmlsZXppcCk7CisKKyAgICBpZiAoWkNMT1NFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtKSAhPSAwKQorICAgICAgICBpZiAoZXJyID09IFpJUF9PSykKKyAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKwogICAgIFRSWUZSRUUoemkpOwogCiAgICAgcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluaXppcC96aXAuZGVmIGIvY29udHJpYi9taW5pemlwL3ppcC5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNTA3OWYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9taW5pemlwL3ppcC5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQl6aXBPcGVuICAgICAgICAgICAgICAgICAgICAgICBAODAKLQl6aXBPcGVuTmV3RmlsZUluWmlwICAgICAgICAgICBAODEKLQl6aXBXcml0ZUluRmlsZUluWmlwICAgICAgICAgICBAODIKLQl6aXBDbG9zZUZpbGVJblppcCAgICAgICAgICAgICBAODMKLQl6aXBDbG9zZSAgICAgICAgICAgICAgICAgICAgICBAODQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluaXppcC96aXAuaCBiL2NvbnRyaWIvbWluaXppcC96aXAuaAppbmRleCA2NzgyNjBiLi40YmM2YWE0IDEwMDY0NAotLS0gYS9jb250cmliL21pbml6aXAvemlwLmgKKysrIGIvY29udHJpYi9taW5pemlwL3ppcC5oCkBAIC0xLDcgKzEsNyBAQAotLyogemlwLmggLS0gSU8gZm9yIGNvbXByZXNzIC56aXAgZmlsZXMgdXNpbmcgemxpYiAKLSAgIFZlcnNpb24gMC4xNSBhbHBoYSwgTWFyIDE5dGgsIDE5OTgsCisvKiB6aXAuaCAtLSBJTyBmb3IgY29tcHJlc3MgLnppcCBmaWxlcyB1c2luZyB6bGliCisgICBWZXJzaW9uIDAuMjEsIE1hcmNoIDEwdGgsIDIwMDMKIAotICAgQ29weXJpZ2h0IChDKSAxOTk4IEdpbGxlcyBWb2xsYW50CisgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBHaWxsZXMgVm9sbGFudAogCiAgICBUaGlzIHVuemlwIHBhY2thZ2UgYWxsb3cgY3JlYXRlcyAuWklQIGZpbGUsIGNvbXBhdGlibGUgd2l0aCBQS1ppcCAyLjA0ZwogICAgICBXaW5aaXAsIEluZm9aaXAgdG9vbHMgYW5kIGNvbXBhdGlibGUuCkBAIC0xMCwxMCArMTAsOSBAQAogCiAgIEZvciB1bmNvbXByZXNzIC56aXAgZmlsZSwgbG9vayBhdCB1bnppcC5oCiAKLSAgIFRISVMgSVMgQU4gQUxQSEEgVkVSU0lPTi4gQVQgVEhJUyBTVEFHRSBPRiBERVZFTE9QUEVNRU5ULCBTT01FUyBBUEkgT1IgU1RSVUNUVVJFCi0gICBDQU4gQ0hBTkdFIElOIEZVVFVSRSBWRVJTSU9OICEhCisKICAgIEkgV0FJVCBGRUVEQkFDSyBhdCBtYWlsIGluZm9Ad2luaW1hZ2UuY29tCi0gICBWaXNpdCBhbHNvIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvemlwLmh0bSBmb3IgZXZvbHV0aW9uCisgICBWaXNpdCBhbHNvIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbCBmb3IgZXZvbHV0aW9uCiAKICAgIENvbmRpdGlvbiBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBhcmUgdGhlIHNhbWUgdGhhbiB6bGliIDoKIApAQCAtMzYsOCArMzUsOSBAQAogCiAqLwogCi0vKiBmb3IgbW9yZSBpbmZvIGFib3V0IC5aSVAgZm9ybWF0LCBzZWUgCi0gICAgICBmdHA6Ly9mdHAuY2Ryb20uY29tL3B1Yi9pbmZvemlwL2RvYy9hcHBub3RlLTk3MDMxMS1pei56aXAKKy8qIGZvciBtb3JlIGluZm8gYWJvdXQgLlpJUCBmb3JtYXQsIHNlZQorICAgICAgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvZG9jL2FwcG5vdGUtOTgxMTE5LWl6LnppcAorICAgICAgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvZG9jLwogICAgUGtXYXJlIGhhcyBhbHNvIGEgc3BlY2lmaWNhdGlvbiBhdCA6CiAgICAgICBmdHA6Ly9mdHAucGt3YXJlLmNvbS9wcm9iZGVzYy56aXAKICovCkBAIC01MywzNCArNTMsNDkgQEAKICNpbmNsdWRlICJ6bGliLmgiCiAjZW5kaWYKIAorI2lmbmRlZiBfWkxJQklPQVBJX0gKKyNpbmNsdWRlICJpb2FwaS5oIgorI2VuZGlmCisKICNpZiBkZWZpbmVkKFNUUklDVFpJUCkgfHwgZGVmaW5lZChTVFJJQ1RaSVBVTlpJUCkKIC8qIGxpa2UgdGhlIFNUUklDVCBvZiBXSU4zMiwgd2UgZGVmaW5lIGEgcG9pbnRlciB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQKICAgICBmcm9tICh2b2lkKikgd2l0aG91dCBjYXN0ICovCi10eXBlZGVmIHN0cnVjdCBUYWd6aXBGaWxlX18geyBpbnQgdW51c2VkOyB9IHppcEZpbGVfXzsgCit0eXBlZGVmIHN0cnVjdCBUYWd6aXBGaWxlX18geyBpbnQgdW51c2VkOyB9IHppcEZpbGVfXzsKIHR5cGVkZWYgemlwRmlsZV9fICp6aXBGaWxlOwogI2Vsc2UKIHR5cGVkZWYgdm9pZHAgemlwRmlsZTsKICNlbmRpZgogCi0jZGVmaW5lIFpJUF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgWklQX0VSUk5PICAgICAgICAgICAgICAgKFpfRVJSTk8pCisjZGVmaW5lIFpJUF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFpJUF9FT0YgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFpJUF9FUlJOTyAgICAgICAgICAgICAgICAgICAgICAgKFpfRVJSTk8pCiAjZGVmaW5lIFpJUF9QQVJBTUVSUk9SICAgICAgICAgICAgICAgICAgKC0xMDIpCisjZGVmaW5lIFpJUF9CQURaSVBGSUxFICAgICAgICAgICAgICAgICAgKC0xMDMpCiAjZGVmaW5lIFpJUF9JTlRFUk5BTEVSUk9SICAgICAgICAgICAgICAgKC0xMDQpCiAKKyNpZm5kZWYgREVGX01FTV9MRVZFTAorIyAgaWYgTUFYX01FTV9MRVZFTCA+PSA4CisjICAgIGRlZmluZSBERUZfTUVNX0xFVkVMIDgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKKyMgIGVuZGlmCisjZW5kaWYKKy8qIGRlZmF1bHQgbWVtTGV2ZWwgKi8KKwogLyogdG1femlwIGNvbnRhaW4gZGF0ZS90aW1lIGluZm8gKi8KLXR5cGVkZWYgc3RydWN0IHRtX3ppcF9zIAordHlwZWRlZiBzdHJ1Y3QgdG1femlwX3MKIHsKLQl1SW50IHRtX3NlYzsgICAgICAgICAgICAvKiBzZWNvbmRzIGFmdGVyIHRoZSBtaW51dGUgLSBbMCw1OV0gKi8KLQl1SW50IHRtX21pbjsgICAgICAgICAgICAvKiBtaW51dGVzIGFmdGVyIHRoZSBob3VyIC0gWzAsNTldICovCi0JdUludCB0bV9ob3VyOyAgICAgICAgICAgLyogaG91cnMgc2luY2UgbWlkbmlnaHQgLSBbMCwyM10gKi8KLQl1SW50IHRtX21kYXk7ICAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovCi0JdUludCB0bV9tb247ICAgICAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8KLQl1SW50IHRtX3llYXI7ICAgICAgICAgICAvKiB5ZWFycyAtIFsxOTgwLi4yMDQ0XSAqLworICAgIHVJbnQgdG1fc2VjOyAgICAgICAgICAgIC8qIHNlY29uZHMgYWZ0ZXIgdGhlIG1pbnV0ZSAtIFswLDU5XSAqLworICAgIHVJbnQgdG1fbWluOyAgICAgICAgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KKyAgICB1SW50IHRtX2hvdXI7ICAgICAgICAgICAvKiBob3VycyBzaW5jZSBtaWRuaWdodCAtIFswLDIzXSAqLworICAgIHVJbnQgdG1fbWRheTsgICAgICAgICAgIC8qIGRheSBvZiB0aGUgbW9udGggLSBbMSwzMV0gKi8KKyAgICB1SW50IHRtX21vbjsgICAgICAgICAgICAvKiBtb250aHMgc2luY2UgSmFudWFyeSAtIFswLDExXSAqLworICAgIHVJbnQgdG1feWVhcjsgICAgICAgICAgIC8qIHllYXJzIC0gWzE5ODAuLjIwNDRdICovCiB9IHRtX3ppcDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLQl0bV96aXAgICAgICB0bXpfZGF0ZTsgICAgICAgLyogZGF0ZSBpbiB1bmRlcnN0YW5kYWJsZSBmb3JtYXQgICAgICAgICAgICovCisgICAgdG1femlwICAgICAgdG16X2RhdGU7ICAgICAgIC8qIGRhdGUgaW4gdW5kZXJzdGFuZGFibGUgZm9ybWF0ICAgICAgICAgICAqLwogICAgIHVMb25nICAgICAgIGRvc0RhdGU7ICAgICAgIC8qIGlmIGRvc19kYXRlID09IDAsIHRtdV9kYXRlIGlzIHVzZWQgICAgICAqLwogLyogICAgdUxvbmcgICAgICAgZmxhZzsgICAgICAgICovICAgLyogZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICAgICAgICAyIGJ5dGVzICovCiAKQEAgLTg4LDMwICsxMDMsNDggQEAKICAgICB1TG9uZyAgICAgICBleHRlcm5hbF9mYTsgICAgLyogZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICA0IGJ5dGVzICovCiB9IHppcF9maWxlaW5mbzsKIAordHlwZWRlZiBjb25zdCBjaGFyKiB6aXBjaGFycGM7CisKKworI2RlZmluZSBBUFBFTkRfU1RBVFVTX0NSRUFURSAgICAgICAgKDApCisjZGVmaW5lIEFQUEVORF9TVEFUVVNfQ1JFQVRFQUZURVIgICAoMSkKKyNkZWZpbmUgQVBQRU5EX1NUQVRVU19BRERJTlpJUCAgICAgICgyKQorCiBleHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4gT0YoKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgYXBwZW5kKSk7CiAvKgogICBDcmVhdGUgYSB6aXBmaWxlLgotCSBwYXRobmFtZSBjb250YWluIG9uIFdpbmRvd3MgTlQgYSBmaWxlbmFtZSBsaWtlICJjOlxcemxpYlxcemxpYjExMS56aXAiIG9yIG9uCi0JICAgYW4gVW5peCBjb21wdXRlciAiemxpYi96bGliMTExLnppcCIuCi0JIGlmIHRoZSBmaWxlIHBhdGhuYW1lIGV4aXN0IGFuZCBhcHBlbmQ9MSwgdGhlIHppcCB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIGVuZAotCSAgIG9mIHRoZSBmaWxlLiAodXNlZnVsIGlmIHRoZSBmaWxlIGNvbnRhaW4gYSBzZWxmIGV4dHJhY3RvciBjb2RlKQotCSBJZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgb3BlbmVkLCB0aGUgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCisgICAgIHBhdGhuYW1lIGNvbnRhaW4gb24gV2luZG93cyBYUCBhIGZpbGVuYW1lIGxpa2UgImM6XFx6bGliXFx6bGliMTEzLnppcCIgb3Igb24KKyAgICAgICBhbiBVbml4IGNvbXB1dGVyICJ6bGliL3psaWIxMTMuemlwIi4KKyAgICAgaWYgdGhlIGZpbGUgcGF0aG5hbWUgZXhpc3QgYW5kIGFwcGVuZD09QVBQRU5EX1NUQVRVU19DUkVBVEVBRlRFUiwgdGhlIHppcAorICAgICAgIHdpbGwgYmUgY3JlYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICAgICAgICAgKHVzZWZ1bCBpZiB0aGUgZmlsZSBjb250YWluIGEgc2VsZiBleHRyYWN0b3IgY29kZSkKKyAgICAgaWYgdGhlIGZpbGUgcGF0aG5hbWUgZXhpc3QgYW5kIGFwcGVuZD09QVBQRU5EX1NUQVRVU19BRERJTlpJUCwgd2Ugd2lsbAorICAgICAgIGFkZCBmaWxlcyBpbiBleGlzdGluZyB6aXAgKGJlIHN1cmUgeW91IGRvbid0IGFkZCBmaWxlIHRoYXQgZG9lc24ndCBleGlzdCkKKyAgICAgSWYgdGhlIHppcGZpbGUgY2Fubm90IGJlIG9wZW5lZCwgdGhlIHJldHVybiB2YWx1ZSBpcyBOVUxMLgogICAgICBFbHNlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgemlwRmlsZSBIYW5kbGUsIHVzYWJsZSB3aXRoIG90aGVyIGZ1bmN0aW9uCi0JICAgb2YgdGhpcyB6aXAgcGFja2FnZS4KLQotCisgICAgICAgb2YgdGhpcyB6aXAgcGFja2FnZS4KICovCiAKKy8qIE5vdGUgOiB0aGVyZSBpcyBubyBkZWxldGUgZnVuY3Rpb24gaW50byBhIHppcGZpbGUuCisgICBJZiB5b3Ugd2FudCBkZWxldGUgZmlsZSBpbnRvIGEgemlwZmlsZSwgeW91IG11c3Qgb3BlbiBhIHppcGZpbGUsIGFuZCBjcmVhdGUgYW5vdGhlcgorICAgT2YgY291c2UsIHlvdSBjYW4gdXNlIFJBVyByZWFkaW5nIGFuZCB3cml0aW5nIHRvIGNvcHkgdGhlIGZpbGUgeW91IGRpZCBub3Qgd2FudCBkZWx0ZQorKi8KKworZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuMiBPRigoY29uc3QgY2hhciAqcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcHBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGNoYXJwYyogZ2xvYmFsY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOworCiBleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcCBPRigoemlwRmlsZSBmaWxlLAotCQkJCQkgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLQkJCQkJICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLQkJCQkJICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKLQkJCQkJICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0JCQkJCSAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAotCQkJCQkgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0JCQkJCSAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCi0JCQkJCSAgIGludCBtZXRob2QsCi0JCQkJCSAgIGludCBsZXZlbCkpOworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkpOwogLyoKICAgT3BlbiBhIGZpbGUgaW4gdGhlIFpJUCBmb3Igd3JpdGluZy4KICAgZmlsZW5hbWUgOiB0aGUgZmlsZW5hbWUgaW4gemlwIChpZiBOVUxMLCAnLScgd2l0aG91dCBxdW90ZSB3aWxsIGJlIHVzZWQKQEAgLTEyNSw5ICsxNTgsNTEgQEAKICAgbGV2ZWwgY29udGFpbiB0aGUgbGV2ZWwgb2YgY29tcHJlc3Npb24gKGNhbiBiZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pCiAqLwogCisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMiBPRigoemlwRmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdykpOworCisvKgorICBTYW1lIHRoYW4gemlwT3Blbk5ld0ZpbGVJblppcCwgZXhjZXB0IGlmIHJhdz0xLCB3ZSB3cml0ZSByYXcgZmlsZQorICovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMyBPRigoemlwRmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZW1MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjRm9yQ3R5cHRpbmcpKTsKKworLyoKKyAgU2FtZSB0aGFuIHppcE9wZW5OZXdGaWxlSW5aaXAyLCBleGNlcHQKKyAgICB3aW5kb3dCaXRzLG1lbUxldmVsLCxzdHJhdGVneSA6IHNlZSBwYXJhbWV0ZXIgc3RyYXRlZ3kgaW4gZGVmbGF0ZUluaXQyCisgICAgcGFzc3dvcmQgOiBjcnlwdGluZyBwYXNzd29yZCAoTlVMTCBmb3Igbm8gY3J5cHRpbmcpCisgICAgY3JjRm9yQ3R5cHRpbmcgOiBjcmMgb2YgZmlsZSB0byBjb21wcmVzcyAobmVlZGVkIGZvciBjcnlwdGluZykKKyAqLworCisKIGV4dGVybiBpbnQgWkVYUE9SVCB6aXBXcml0ZUluRmlsZUluWmlwIE9GKCh6aXBGaWxlIGZpbGUsCi0JCQkJCSAgIGNvbnN0IHZvaWRwIGJ1ZiwKLQkJCQkJICAgdW5zaWduZWQgbGVuKSk7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7CiAvKgogICBXcml0ZSBkYXRhIGluIHRoZSB6aXBmaWxlCiAqLwpAQCAtMTM3LDggKzIxMiwxOCBAQAogICBDbG9zZSB0aGUgY3VycmVudCBmaWxlIGluIHRoZSB6aXBmaWxlCiAqLwogCisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZUZpbGVJblppcFJhdyBPRigoemlwRmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyB1bmNvbXByZXNzZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjMzIpKTsKKy8qCisgIENsb3NlIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUsIGZvciBmaWVsIG9wZW5lZCB3aXRoCisgICAgcGFyYW1ldGVyIHJhdz0xIGluIHppcE9wZW5OZXdGaWxlSW5aaXAyCisgIHVuY29tcHJlc3NlZF9zaXplIGFuZCBjcmMzMiBhcmUgdmFsdWUgZm9yIHRoZSB1bmNvbXByZXNzZWQgc2l6ZQorKi8KKwogZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlIE9GKCh6aXBGaWxlIGZpbGUsCi0JCQkJY29uc3QgY2hhciogZ2xvYmFsX2NvbW1lbnQpKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBnbG9iYWxfY29tbWVudCkpOwogLyoKICAgQ2xvc2UgdGhlIHppcGZpbGUKICovCmRpZmYgLS1naXQgYS9jb250cmliL21pbml6aXAvemxpYnZjLmRzcCBiL2NvbnRyaWIvbWluaXppcC96bGlidmMuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzBkNGQ0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvbWluaXppcC96bGlidmMuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsNjUxICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iemxpYnZjIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLSMgVEFSR1RZUEUgIldpbjMyIChBTFBIQSkgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDYwMgotCi1DRkc9emxpYnZjIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJ6bGlidmMubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJ6bGlidmMubWFrIiBDRkc9InpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiemxpYnZjIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VBeHAiIChiYXNlZCBvblwKLSAiV2luMzIgKEFMUEhBKSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRBc20iIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0Q3J0ZGxsIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotQ1BQPWNsLmV4ZQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX1dJTkRMTCIgL0QgIl9XSU4zMiIgL0QgIkJVSUxEX1pMSUJETEwiIC9EICJaTElCX0RMTCIgL0QgIkRZTkFNSUNfQ1JDX1RBQkxFIiAvRCAiQVNNViIgL0ZBY3MgL0ZSIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi1NVEw9bWlkbC5leGUKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGd2bWF0MzIub2JqIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIGNydGRsbC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYiAvb3V0OiIuXFJlbGVhc2VcemxpYi5kbGwiCi0jIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXERlYnVnIgotIyBQUk9QIFRhcmdldF9EaXIgIiIKLUNQUD1jbC5leGUKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9XSU5ETEwiIC9EICJfV0lOMzIiIC9EICJCVUlMRF9aTElCRExMIiAvRCAiWkxJQl9ETEwiIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi1NVEw9bWlkbC5leGUKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6Ii5cRGVidWdcemxpYi5kbGwiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlQXhwIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiemxpYnZjX18iCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ6bGlidmNfXyIKLSMgUFJPUCBCQVNFIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJ6bGlidmNfXyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ6bGlidmNfXyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotTVRMPW1pZGwuZXhlCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLUNQUD1jbC5leGUKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9HdDAgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfV0lOMzIiIC9EICJCVUlMRF9aTElCRExMIiAvRCAiWkxJQl9ETEwiIC9EICJEWU5BTUlDX0NSQ19UQUJMRSIgL0ZBY3MgL0ZSIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NVCAvR3QwIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX1dJTjMyIiAvRCAiQlVJTERfWkxJQkRMTCIgL0QgIlpMSUJfRExMIiAvRCAiRFlOQU1JQ19DUkNfVEFCTEUiIC9GQWNzIC9GUiAvRkQgL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWAotUlNDPXJjLmV4ZQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBjcnRkbGwubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpBTFBIQSAvbm9kZWZhdWx0bGliIC9vdXQ6Ii5cUmVsZWFzZVx6bGliLmRsbCIKLSMgU1VCVFJBQ1QgQkFTRSBMSU5LMzIgL3BkYjpub25lCi0jIEFERCBMSU5LMzIgY3J0ZGxsLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6QUxQSEEgL25vZGVmYXVsdGxpYiAvb3V0OiJ6bGlidmNfX1x6bGliLmRsbCIKLSMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRBc20iCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJ6bGlidmNfMCIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInpsaWJ2Y18wIgotIyBQUk9QIEJBU0UgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgInpsaWJ2Y18wIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInpsaWJ2Y18wIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1DUFA9Y2wuZXhlCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9XSU5ETEwiIC9EICJfV0lOMzIiIC9EICJCVUlMRF9aTElCRExMIiAvRCAiWkxJQl9ETEwiIC9EICJEWU5BTUlDX0NSQ19UQUJMRSIgL0ZBY3MgL0ZSIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9XSU5ETEwiIC9EICJfV0lOMzIiIC9EICJCVUlMRF9aTElCRExMIiAvRCAiWkxJQl9ETEwiIC9EICJEWU5BTUlDX0NSQ19UQUJMRSIgL0ZBY3MgL0ZSIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi1NVEw9bWlkbC5leGUKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotUlNDPXJjLmV4ZQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBjcnRkbGwubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9ub2RlZmF1bHRsaWIgL291dDoiLlxSZWxlYXNlXHpsaWIuZGxsIgotIyBTVUJUUkFDVCBCQVNFIExJTkszMiAvcGRiOm5vbmUKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBjcnRkbGwubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9ub2RlZmF1bHRsaWIgL291dDoiLlx6bGlidmNfMFx6bGliLmRsbCIKLSMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRDcnRkbGwiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJ6bGlidmNfMSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInpsaWJ2Y18xIgotIyBQUk9QIEJBU0UgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgInpsaWJ2Y18xIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInpsaWJ2Y18xIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1DUFA9Y2wuZXhlCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9XSU5ETEwiIC9EICJfV0lOMzIiIC9EICJCVUlMRF9aTElCRExMIiAvRCAiWkxJQl9ETEwiIC9EICJEWU5BTUlDX0NSQ19UQUJMRSIgL0QgIkFTTVYiIC9GQWNzIC9GUiAvWVggL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJfV0lORExMIiAvRCAiX1dJTjMyIiAvRCAiQlVJTERfWkxJQkRMTCIgL0QgIlpMSUJfRExMIiAvRCAiRFlOQU1JQ19DUkNfVEFCTEUiIC9EICJBU01WIiAvRkFjcyAvRlIgL0ZEIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLU1UTD1taWRsLmV4ZQotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGd2bWF0MzIub2JqIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIGNydGRsbC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYiAvb3V0OiIuXFJlbGVhc2VcemxpYi5kbGwiCi0jIFNVQlRSQUNUIEJBU0UgTElOSzMyIC9wZGI6bm9uZQotIyBBREQgTElOSzMyIGd2bWF0MzIub2JqIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIGNydGRsbC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYiAvb3V0OiIuXHpsaWJ2Y18xXHpsaWIuZGxsIgotIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKLSMgTmFtZSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZUF4cCIKLSMgTmFtZSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRBc20iCi0jIE5hbWUgInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0Q3J0ZGxsIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxhZGxlcjMyLmMKLQotIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZUF4cCIKLQotREVQX0NQUF9BRExFUj1cCi0JIi5cemNvbmYuaCJcCi0JIi5cemxpYi5oIlwKLQkKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0QXNtIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRDcnRkbGwiCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cY29tcHJlc3MuYwotCi0hSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlQXhwIgotCi1ERVBfQ1BQX0NPTVBSPVwKLQkiLlx6Y29uZi5oIlwKLQkiLlx6bGliLmgiXAotCQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRBc20iCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dENydGRsbCIKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxjcmMzMi5jCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VBeHAiCi0KLURFUF9DUFBfQ1JDMzI9XAotCSIuXHpjb25mLmgiXAotCSIuXHpsaWIuaCJcCi0JCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dEFzbSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0Q3J0ZGxsIgotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGRlZmxhdGUuYwotCi0hSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlQXhwIgotCi1ERVBfQ1BQX0RFRkxBPVwKLQkiLlxkZWZsYXRlLmgiXAotCSIuXHpjb25mLmgiXAotCSIuXHpsaWIuaCJcCi0JIi5cenV0aWwuaCJcCi0JCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dEFzbSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0Q3J0ZGxsIgotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGd2bWF0MzJjLmMKLQotIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZUF4cCIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0QXNtIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRDcnRkbGwiCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cZ3ppby5jCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VBeHAiCi0KLURFUF9DUFBfR1pJT189XAotCSIuXHpjb25mLmgiXAotCSIuXHpsaWIuaCJcCi0JIi5cenV0aWwuaCJcCi0JCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dEFzbSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0Q3J0ZGxsIgotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluZmJsb2NrLmMKLQotIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZUF4cCIKLQotREVQX0NQUF9JTkZCTD1cCi0JIi5caW5mYmxvY2suaCJcCi0JIi5caW5mY29kZXMuaCJcCi0JIi5caW5mdHJlZXMuaCJcCi0JIi5caW5mdXRpbC5oIlwKLQkiLlx6Y29uZi5oIlwKLQkiLlx6bGliLmgiXAotCSIuXHp1dGlsLmgiXAotCQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRBc20iCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dENydGRsbCIKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmZjb2Rlcy5jCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VBeHAiCi0KLURFUF9DUFBfSU5GQ089XAotCSIuXGluZmJsb2NrLmgiXAotCSIuXGluZmNvZGVzLmgiXAotCSIuXGluZmZhc3QuaCJcCi0JIi5caW5mdHJlZXMuaCJcCi0JIi5caW5mdXRpbC5oIlwKLQkiLlx6Y29uZi5oIlwKLQkiLlx6bGliLmgiXAotCSIuXHp1dGlsLmgiXAotCQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRBc20iCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dENydGRsbCIKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmZmYXN0LmMKLQotIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZUF4cCIKLQotREVQX0NQUF9JTkZGQT1cCi0JIi5caW5mYmxvY2suaCJcCi0JIi5caW5mY29kZXMuaCJcCi0JIi5caW5mZmFzdC5oIlwKLQkiLlxpbmZ0cmVlcy5oIlwKLQkiLlxpbmZ1dGlsLmgiXAotCSIuXHpjb25mLmgiXAotCSIuXHpsaWIuaCJcCi0JIi5cenV0aWwuaCJcCi0JCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dEFzbSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0Q3J0ZGxsIgotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluZmxhdGUuYwotCi0hSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlQXhwIgotCi1ERVBfQ1BQX0lORkxBPVwKLQkiLlxpbmZibG9jay5oIlwKLQkiLlx6Y29uZi5oIlwKLQkiLlx6bGliLmgiXAotCSIuXHp1dGlsLmgiXAotCQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRBc20iCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dENydGRsbCIKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmZ0cmVlcy5jCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VBeHAiCi0KLURFUF9DUFBfSU5GVFI9XAotCSIuXGluZnRyZWVzLmgiXAotCSIuXHpjb25mLmgiXAotCSIuXHpsaWIuaCJcCi0JIi5cenV0aWwuaCJcCi0JCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dEFzbSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0Q3J0ZGxsIgotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluZnV0aWwuYwotCi0hSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlQXhwIgotCi1ERVBfQ1BQX0lORlVUPVwKLQkiLlxpbmZibG9jay5oIlwKLQkiLlxpbmZjb2Rlcy5oIlwKLQkiLlxpbmZ0cmVlcy5oIlwKLQkiLlxpbmZ1dGlsLmgiXAotCSIuXHpjb25mLmgiXAotCSIuXHpsaWIuaCJcCi0JIi5cenV0aWwuaCJcCi0JCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dEFzbSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0Q3J0ZGxsIgotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHRyZWVzLmMKLQotIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZUF4cCIKLQotREVQX0NQUF9UUkVFUz1cCi0JIi5cZGVmbGF0ZS5oIlwKLQkiLlx6Y29uZi5oIlwKLQkiLlx6bGliLmgiXAotCSIuXHp1dGlsLmgiXAotCQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRBc20iCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dENydGRsbCIKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llx1bmNvbXByLmMKLQotIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZUF4cCIKLQotREVQX0NQUF9VTkNPTT1cCi0JIi5cemNvbmYuaCJcCi0JIi5cemxpYi5oIlwKLQkKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0QXNtIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRDcnRkbGwiCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cdW56aXAuYwotCi0hSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlQXhwIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRBc20iCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dENydGRsbCIKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llx6aXAuYwotCi0hSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlQXhwIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZVdpdGhvdXRBc20iCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dENydGRsbCIKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llx6bGliLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llx6bGlidmMuZGVmCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llx6dXRpbC5jCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VBeHAiCi0KLURFUF9DUFBfWlVUSUw9XAotCSIuXHpjb25mLmgiXAotCSIuXHpsaWIuaCJcCi0JIi5cenV0aWwuaCJcCi0JCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlV2l0aG91dEFzbSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2VXaXRob3V0Q3J0ZGxsIgotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGRlZmxhdGUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5mYmxvY2suaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5mY29kZXMuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5mZmFzdC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmZ0cmVlcy5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmZ1dGlsLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHpjb25mLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHpsaWIuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cenV0aWwuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47Y250O3J0ZjtnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL3psaWJ2Yy5kc3cgYi9jb250cmliL21pbml6aXAvemxpYnZjLmRzdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzY2Q4Ny4uMDAwMDAwMAotLS0gYS9jb250cmliL21pbml6aXAvemxpYnZjLmRzdworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJ6bGlic3RhdCI9Llx6bGlic3RhdC5kc3AgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogInpsaWJ2YyI9Llx6bGlidmMuZHNwIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUdsb2JhbDoKLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDM+Ci17e3sKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIuYyBiL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWFlNGVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jCkBAIC0wLDAgKzEsMTQ5IEBACisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisjaW5jbHVkZSAiemxpYi5oIg0KKw0KK2ludCBSZWFkRmlsZU1lbW9yeShjb25zdCBjaGFyKiBmaWxlbmFtZSxsb25nKiBwbEZpbGVTaXplLHZvaWQqKiBwRmlsZVB0cikNCit7DQorICAgIEZJTEUqIHN0cmVhbTsNCisgICAgdm9pZCogcHRyOw0KKyAgICBpbnQgcmV0VmFsPTE7DQorICAgIHN0cmVhbT1mb3BlbihmaWxlbmFtZSwgInJiIik7DQorICAgIGlmIChzdHJlYW09PU5VTEwpDQorICAgICAgICByZXR1cm4gMDsNCisNCisgICAgZnNlZWsoc3RyZWFtLDAsU0VFS19FTkQpOw0KKw0KKyAgICAqcGxGaWxlU2l6ZT1mdGVsbChzdHJlYW0pOw0KKyAgICBmc2VlayhzdHJlYW0sMCxTRUVLX1NFVCk7DQorICAgIHB0cj1tYWxsb2MoKCpwbEZpbGVTaXplKSsxKTsNCisgICAgaWYgKHB0cj09TlVMTCkNCisgICAgICAgIHJldFZhbD0wOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIGlmIChmcmVhZChwdHIsIDEsICpwbEZpbGVTaXplLHN0cmVhbSkgIT0gKCpwbEZpbGVTaXplKSkNCisgICAgICAgICAgICByZXRWYWw9MDsNCisgICAgfQ0KKyAgICBmY2xvc2Uoc3RyZWFtKTsNCisgICAgKnBGaWxlUHRyPXB0cjsNCisgICAgcmV0dXJuIHJldFZhbDsNCit9DQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCit7DQorICAgIGludCBCbG9ja1NpemVDb21wcmVzcz0weDgwMDA7DQorICAgIGludCBCbG9ja1NpemVVbmNvbXByZXNzPTB4ODAwMDsNCisgICAgaW50IGNwckxldmVsPVpfREVGQVVMVF9DT01QUkVTU0lPTiA7DQorICAgIGxvbmcgbEZpbGVTaXplOw0KKyAgICB1bnNpZ25lZCBjaGFyKiBGaWxlUHRyOw0KKyAgICBsb25nIGxCdWZmZXJTaXplQ3ByOw0KKyAgICBsb25nIGxCdWZmZXJTaXplVW5jcHI7DQorICAgIGxvbmcgbENvbXByZXNzZWRTaXplPTA7DQorICAgIHVuc2lnbmVkIGNoYXIqIENwclB0cjsNCisgICAgdW5zaWduZWQgY2hhciogVW5jcHJQdHI7DQorICAgIGxvbmcgbFNpemVDcHIsbFNpemVVbmNwcjsNCisgICAgRFdPUkQgZHdHZXRUaWNrOw0KKw0KKyAgICBpZiAoYXJnYzw9MSkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJydW4gVGVzdFpsaWIgPEZpbGU+IFtCbG9ja1NpemVDb21wcmVzc10gW0Jsb2NrU2l6ZVVuY29tcHJlc3NdIFtjb21wcmVzLiBsZXZlbF1cbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKFJlYWRGaWxlTWVtb3J5KGFyZ3ZbMV0sJmxGaWxlU2l6ZSwmRmlsZVB0cik9PTApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZXJyb3IgcmVhZGluZyAlc1xuIixhcmd2WzFdKTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGVsc2UgcHJpbnRmKCJmaWxlICVzIHJlYWQsICV1IGJ5dGVzXG4iLGFyZ3ZbMV0sbEZpbGVTaXplKTsNCisNCisgICAgaWYgKGFyZ2M+PTMpDQorICAgICAgICBCbG9ja1NpemVDb21wcmVzcz1hdG9sKGFyZ3ZbMl0pOw0KKw0KKyAgICBpZiAoYXJnYz49NCkNCisgICAgICAgIEJsb2NrU2l6ZVVuY29tcHJlc3M9YXRvbChhcmd2WzNdKTsNCisNCisgICAgaWYgKGFyZ2M+PTUpDQorICAgICAgICBjcHJMZXZlbD0oaW50KWF0b2woYXJndls0XSk7DQorDQorICAgIGxCdWZmZXJTaXplQ3ByID0gbEZpbGVTaXplICsgKGxGaWxlU2l6ZS8weDEwKSArIDB4MjAwOw0KKyAgICBsQnVmZmVyU2l6ZVVuY3ByID0gbEJ1ZmZlclNpemVDcHI7DQorDQorICAgIENwclB0cj0odW5zaWduZWQgY2hhciopbWFsbG9jKGxCdWZmZXJTaXplQ3ByICsgQmxvY2tTaXplQ29tcHJlc3MpOw0KKyAgICBVbmNwclB0cj0odW5zaWduZWQgY2hhciopbWFsbG9jKGxCdWZmZXJTaXplVW5jcHIgKyBCbG9ja1NpemVVbmNvbXByZXNzKTsNCisNCisgICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpOw0KKyAgICB7DQorICAgICAgICB6X3N0cmVhbSB6Y3ByOw0KKyAgICAgICAgaW50IHJldD1aX09LOw0KKyAgICAgICAgbG9uZyBsT3JpZ1RvRG8gPSBsRmlsZVNpemU7DQorICAgICAgICBsb25nIGxPcmlnRG9uZSA9IDA7DQorICAgICAgICBpbnQgc3RlcD0wOw0KKyAgICAgICAgbWVtc2V0KCZ6Y3ByLDAsc2l6ZW9mKHpfc3RyZWFtKSk7DQorICAgICAgICBkZWZsYXRlSW5pdCgmemNwcixjcHJMZXZlbCk7DQorDQorICAgICAgICB6Y3ByLm5leHRfaW4gPSBGaWxlUHRyOw0KKyAgICAgICAgemNwci5uZXh0X291dCA9IENwclB0cjsNCisNCisNCisgICAgICAgIGRvDQorICAgICAgICB7DQorICAgICAgICAgICAgbG9uZyBhbGxfcmVhZF9iZWZvcmUgPSB6Y3ByLnRvdGFsX2luOw0KKyAgICAgICAgICAgIHpjcHIuYXZhaWxfaW4gPSBtaW4obE9yaWdUb0RvLEJsb2NrU2l6ZUNvbXByZXNzKTsNCisgICAgICAgICAgICB6Y3ByLmF2YWlsX291dCA9IEJsb2NrU2l6ZUNvbXByZXNzOw0KKyAgICAgICAgICAgIHJldD1kZWZsYXRlKCZ6Y3ByLCh6Y3ByLmF2YWlsX2luPT1sT3JpZ1RvRG8pID8gWl9GSU5JU0ggOiBaX1NZTkNfRkxVU0gpOw0KKyAgICAgICAgICAgIGxPcmlnRG9uZSArPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOw0KKyAgICAgICAgICAgIGxPcmlnVG9EbyAtPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOw0KKyAgICAgICAgICAgIHN0ZXArKzsNCisgICAgICAgIH0gd2hpbGUgKHJldD09Wl9PSyk7DQorDQorICAgICAgICBsU2l6ZUNwcj16Y3ByLnRvdGFsX291dDsNCisgICAgICAgIGRlZmxhdGVFbmQoJnpjcHIpOw0KKyAgICAgICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpLWR3R2V0VGljazsNCisgICAgICAgIHByaW50ZigidG90YWwgY29tcHJlc3Mgc2l6ZSA9ICV1LCBpbiAldSBzdGVwXG4iLGxTaXplQ3ByLHN0ZXApOw0KKyAgICAgICAgcHJpbnRmKCJ0aW1lID0gJXUgbXNlYyA9ICVmIHNlY1xuXG4iLGR3R2V0VGljayxkd0dldFRpY2svKGRvdWJsZSkxMDAwLik7DQorICAgIH0NCisNCisgICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpOw0KKyAgICB7DQorICAgICAgICB6X3N0cmVhbSB6Y3ByOw0KKyAgICAgICAgaW50IHJldD1aX09LOw0KKyAgICAgICAgbG9uZyBsT3JpZ1RvRG8gPSBsU2l6ZUNwcjsNCisgICAgICAgIGxvbmcgbE9yaWdEb25lID0gMDsNCisgICAgICAgIGludCBzdGVwPTA7DQorICAgICAgICBtZW1zZXQoJnpjcHIsMCxzaXplb2Yoel9zdHJlYW0pKTsNCisgICAgICAgIGluZmxhdGVJbml0KCZ6Y3ByKTsNCisNCisgICAgICAgIHpjcHIubmV4dF9pbiA9IENwclB0cjsNCisgICAgICAgIHpjcHIubmV4dF9vdXQgPSBVbmNwclB0cjsNCisNCisNCisgICAgICAgIGRvDQorICAgICAgICB7DQorICAgICAgICAgICAgbG9uZyBhbGxfcmVhZF9iZWZvcmUgPSB6Y3ByLnRvdGFsX2luOw0KKyAgICAgICAgICAgIHpjcHIuYXZhaWxfaW4gPSBtaW4obE9yaWdUb0RvLEJsb2NrU2l6ZVVuY29tcHJlc3MpOw0KKyAgICAgICAgICAgIHpjcHIuYXZhaWxfb3V0ID0gQmxvY2tTaXplVW5jb21wcmVzczsNCisgICAgICAgICAgICByZXQ9aW5mbGF0ZSgmemNwcixaX1NZTkNfRkxVU0gpOw0KKyAgICAgICAgICAgIGxPcmlnRG9uZSArPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOw0KKyAgICAgICAgICAgIGxPcmlnVG9EbyAtPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOw0KKyAgICAgICAgICAgIHN0ZXArKzsNCisgICAgICAgIH0gd2hpbGUgKHJldD09Wl9PSyk7DQorDQorICAgICAgICBsU2l6ZVVuY3ByPXpjcHIudG90YWxfb3V0Ow0KKyAgICAgICAgaW5mbGF0ZUVuZCgmemNwcik7DQorICAgICAgICBkd0dldFRpY2s9R2V0VGlja0NvdW50KCktZHdHZXRUaWNrOw0KKyAgICAgICAgcHJpbnRmKCJ0b3RhbCB1bmNvbXByZXNzIHNpemUgPSAldSwgaW4gJXUgc3RlcFxuIixsU2l6ZVVuY3ByLHN0ZXApOw0KKyAgICAgICAgcHJpbnRmKCJ0aW1lID0gJXUgbXNlYyA9ICVmIHNlY1xuXG4iLGR3R2V0VGljayxkd0dldFRpY2svKGRvdWJsZSkxMDAwLik7DQorICAgIH0NCisNCisgICAgaWYgKGxTaXplVW5jcHI9PWxGaWxlU2l6ZSkNCisgICAgew0KKyAgICAgICAgaWYgKG1lbWNtcChGaWxlUHRyLFVuY3ByUHRyLGxGaWxlU2l6ZSk9PTApDQorICAgICAgICAgICAgcHJpbnRmKCJjb21wYXJlIG9rXG4iKTsNCisNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gMDsNCisNCit9DQpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5zbG4gYi9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmRhNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5zbG4KQEAgLTAsMCArMSwyMSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gNy4wMA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidGVzdHpsaWIiLCAidGVzdHpsaWIudmNwcm9qIiwgIntBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb24pID0gcHJlU29sdXRpb24NCisJCUNvbmZpZ05hbWUuMCA9IERlYnVnDQorCQlDb25maWdOYW1lLjEgPSBSZWxlYXNlDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RTb2x1dGlvbg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb24pID0gcG9zdFNvbHV0aW9uDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUFkZElucykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIudmNwcm9qIGIvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0MjMzYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIudmNwcm9qCkBAIC0wLDAgKzEsMTI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nID0gIldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjAwIg0KKwlOYW1lPSJ0ZXN0emxpYiINCisJUHJvamVjdEdVSUQ9IntBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJEZWJ1ZyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IkRlYnVnIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvdGVzdHpsaWIucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IlJlbGVhc2UiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJSZWxlYXNlIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9IlRSVUUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI0Ig0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJ0ZXN0emxpYi5jIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYyI+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSI+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSJ6bGliLmxpYiI+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdnN0dWRpby9yZWFkbWUudHh0IGIvY29udHJpYi92c3R1ZGlvL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxOWI5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdnN0dWRpby9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTcgQEAKK0ZvciBjcmVhdGUgdGhlIDE2IGFuZCAzMiBiaXRzIERMTCBvZiBabGliIDEuMjANCisNCitGb3IgdGhlIDE2IGJpdHMgOg0KK3VuemlwIHpsaWIxMjAuemlwIGFuZCBjb3B5IGZpbGUgZnJvbSBjb250cmliXHZzdHVkaW9cdmMxNV8xNiBhbmQgZnJvbSBjb250cmliXG1pbml6aXAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5DQorb3BlbiB6bGliMTYubWFrIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgMS41Mg0KKw0KKw0KK0ZvciB0aGUgMzIgYml0cyA6DQordW56aXAgemxpYjEyMC56aXAgYW5kIGNvcHkgZmlsZSBmcm9tIGNvbnRyaWJcdnN0dWRpb1x2YzcwXzMyIGFuZCBmcm9tIGNvbnRyaWJcbWluaXppcCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkNCitZb3UgY2FuIGFsc28gbmVlZCB1bnppcCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL2NydGRsbC56aXANCisNCitJZiB5b3UgYXJlIHVzaW5nIHg4NiwgdXNlIHRhcmdldCBSZWxlYXNlDQorb3BlbiB6bGlidmMuc2xuIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgNy4wIChWaXN1YWwgU3R1ZGlvIC5uZXQpDQorDQorDQorTm90ZSA6IFlvdSBkb24ndCBuZWVkIHJlY29tcGlsZSB5b3Vyc2VsZi4gVGhlcmUgaXMgY29tcGlsZWQgLkxJQiBpbg0KKyAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbA0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdnN0dWRpby92YzE1XzE2L3psaWIxNi5kZWYgYi9jb250cmliL3ZzdHVkaW8vdmMxNV8xNi96bGliMTYuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Y2I4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZzdHVkaW8vdmMxNV8xNi96bGliMTYuZGVmCkBAIC0wLDAgKzEsOTQgQEAKK0xJQlJBUlkJCSJ6bGliIg0KKw0KK0RFU0NSSVBUSU9OCSciIiJ6bGliIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeSIiIicNCisNCitFWEVUWVBFCQlXSU5ET1dTDQorDQorVkVSU0lPTgkJMS4yMA0KKw0KK0NPREUgICAgUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRQ0KK0RBVEEgICAgUFJFTE9BRCBNT1ZFQUJMRSBTSU5HTEUNCisNCisNCitIRUFQU0laRQkzMjc2OCw4MTkyDQorDQorRVhQT1JUUw0KKyAgICAgICAgYWRsZXIzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMQ0KKyAgICAgICAgY29tcHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMg0KKyAgICAgICAgY3JjMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMw0KKyAgICAgICAgZGVmbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANA0KKyAgICAgICAgZGVmbGF0ZUNvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANQ0KKyAgICAgICAgZGVmbGF0ZUVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANg0KKyAgICAgICAgZGVmbGF0ZUluaXQyXyAgICAgICAgICAgICAgICAgICAgICAgICAgICBANw0KKyAgICAgICAgZGVmbGF0ZUluaXRfICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAOA0KKyAgICAgICAgZGVmbGF0ZVBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAOQ0KKyAgICAgICAgZGVmbGF0ZVJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTANCisgICAgICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICAgICAgICAgICAgICAgICAgICAgQDExDQorICAgICAgICBnemNsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMg0KKyAgICAgICAgZ3pkb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTMNCisgICAgICAgIGd6ZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0DQorICAgICAgICBnemZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNQ0KKyAgICAgICAgZ3pvcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTYNCisgICAgICAgIGd6cmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE3DQorICAgICAgICBnendyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxOA0KKyAgICAgICAgaW5mbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTkNCisgICAgICAgIGluZmxhdGVFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIwDQorICAgICAgICBpbmZsYXRlSW5pdDJfICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyMQ0KKyAgICAgICAgaW5mbGF0ZUluaXRfICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjINCisgICAgICAgIGluZmxhdGVSZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIzDQorICAgICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSAgICAgICAgICAgICAgICAgICAgIEAyNA0KKyAgICAgICAgaW5mbGF0ZVN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjUNCisgICAgICAgIHVuY29tcHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI2DQorICAgICAgICB6bGliVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyNw0KKyAgICAgICAgX2d6cHJpbnRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjgNCisgICAgICAgIGd6cHV0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI5DQorICAgICAgICBnemdldGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzMA0KKyAgICAgICAgZ3pzZWVrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzENCisgICAgICAgIGd6cmV3aW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMyDQorICAgICAgICBnenRlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzMw0KKyAgICAgICAgZ3plb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzQNCisgICAgICAgIGd6c2V0cGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM1DQorICAgICAgICB6RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzNg0KKyAgICAgICAgaW5mbGF0ZVN5bmNQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBAMzcNCisgICAgICAgIGdldF9jcmNfdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM4DQorICAgICAgICBjb21wcmVzczIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzOQ0KKyAgICAgICAgZ3pwdXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDANCisgICAgICAgIGd6Z2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQxDQorICAgICAgICBpbmZsYXRlQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0Mg0KKyAgICAgICAgaW5mbGF0ZUJhY2tJbml0XyAgICAgICAgICAgICAgICAgICAgICAgICBANDMNCisgICAgICAgIGluZmxhdGVCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ0DQorICAgICAgICBpbmZsYXRlQmFja0VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0NQ0KKyAgICAgICAgY29tcHJlc3NCb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDYNCisNCisgICAgICAgIHVuek9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDYxDQorICAgICAgICB1bnpDbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA2Mg0KKyAgICAgICAgdW56R2V0R2xvYmFsSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICBANjMNCisgICAgICAgIHVuekdldEN1cnJlbnRGaWxlSW5mbyAgICAgICAgICAgICAgICAgICAgQDY0DQorICAgICAgICB1bnpHb1RvRmlyc3RGaWxlICAgICAgICAgICAgICAgICAgICAgICAgIEA2NQ0KKyAgICAgICAgdW56R29Ub05leHRGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICBANjYNCisgICAgICAgIHVuek9wZW5DdXJyZW50RmlsZSAgICAgICAgICAgICAgICAgICAgICAgQDY3DQorICAgICAgICB1bnpSZWFkQ3VycmVudEZpbGUgICAgICAgICAgICAgICAgICAgICAgIEA2OA0KKyAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlMyAgICAgICAgICAgICAgICAgICAgICBANjkNCisgICAgICAgIHVuenRlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDcwDQorICAgICAgICB1bnplb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3MQ0KKyAgICAgICAgdW56Q2xvc2VDdXJyZW50RmlsZSAgICAgICAgICAgICAgICAgICAgICBANzINCisgICAgICAgIHVuekdldEdsb2JhbENvbW1lbnQgICAgICAgICAgICAgICAgICAgICAgQDczDQorICAgICAgICB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUgICAgICAgICAgICAgICAgIEA3NA0KKyAgICAgICAgdW56TG9jYXRlRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzUNCisgICAgICAgIHVuekdldExvY2FsRXh0cmFmaWVsZCAgICAgICAgICAgICAgICAgICAgQDc2DQorICAgICAgICB1bnpPcGVuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3Nw0KKyAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlMiAgICAgICAgICAgICAgICAgICAgICBANzgNCisgICAgICAgIHVuek9wZW5DdXJyZW50RmlsZVBhc3N3b3JkICAgICAgICAgICAgICAgQDc5DQorDQorICAgICAgICB6aXBPcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4MA0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcCAgICAgICAgICAgICAgICAgICAgICBAODENCisgICAgICAgIHppcFdyaXRlSW5GaWxlSW5aaXAgICAgICAgICAgICAgICAgICAgICAgQDgyDQorICAgICAgICB6aXBDbG9zZUZpbGVJblppcCAgICAgICAgICAgICAgICAgICAgICAgIEA4Mw0KKyAgICAgICAgemlwQ2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAODQNCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAyICAgICAgICAgICAgICAgICAgICAgQDg2DQorICAgICAgICB6aXBDbG9zZUZpbGVJblppcFJhdyAgICAgICAgICAgICAgICAgICAgIEA4Nw0KKyAgICAgICAgemlwT3BlbjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAODgNCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAzICAgICAgICAgICAgICAgICAgICAgQDg5DQorDQorICAgICAgICB1bnpHZXRGaWxlUG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMDANCisgICAgICAgIHVuekdvVG9GaWxlUG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEwMQ0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdnN0dWRpby92YzE1XzE2L3psaWIxNi5tYWsgYi9jb250cmliL3ZzdHVkaW8vdmMxNV8xNi96bGliMTYubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YzhkODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZzdHVkaW8vdmMxNV8xNi96bGliMTYubWFrCkBAIC0wLDAgKzEsMjU2IEBACisjIE1pY3Jvc29mdCBWaXN1YWwgQysrIGdlbmVyYXRlZCBidWlsZCBzY3JpcHQgLSBEbyBub3QgbW9kaWZ5DQorDQorUFJPSiA9IFpMSUIxNg0KK0RFQlVHID0gMA0KK1BST0dUWVBFID0gMQ0KK0NBTExFUiA9IA0KK0FSR1MgPSANCitETExTID0gDQorRF9SQ0RFRklORVMgPSAtZF9ERUJVRw0KK1JfUkNERUZJTkVTID0gLWROREVCVUcNCitPUklHSU4gPSBNU1ZDDQorT1JJR0lOX1ZFUiA9IDEuMDANCitQUk9KUEFUSCA9IGM6XHpsaWJcDQorVVNFTUZDID0gMA0KK0NDID0gY2wNCitDUFAgPSBjbA0KK0NYWCA9IGNsDQorQ0NSRUFURVBDSEZMQUcgPSANCitDUFBDUkVBVEVQQ0hGTEFHID0gDQorQ1VTRVBDSEZMQUcgPSANCitDUFBVU0VQQ0hGTEFHID0gDQorRklSU1RDID0gQURMRVIzMi5DICAgDQorRklSU1RDUFAgPSAgICAgICAgICAgICANCitSQyA9IHJjDQorQ0ZMQUdTX0RfV0RMTCA9IC9ub2xvZ28gL0cyIC9XMyAvWmkgL0FMdyAvT2QgL0QgIl9ERUJVRyIgL0QgIldJTkRPV1MiIC9EICJaTElCX0RMTCIgL0ZSIC9HRCAvRmQiWkxJQi5QREIiDQorQ0ZMQUdTX1JfV0RMTCA9IC9ub2xvZ28gL1czIC9BTHcgL08xIC9EICJOREVCVUciIC9EICJXSU5ET1dTIiAvRCAiWkxJQl9ETEwiIC9GUiAvR0QgDQorTEZMQUdTX0RfV0RMTCA9IC9OT0xPR08gL09ORVJST1I6Tk9FWEUgL05PRCAvUEFDS0M6NjE0NDAgL0NPIC9OT0UgL0FMSUdOOjE2IC9NQVA6RlVMTA0KK0xGTEFHU19SX1dETEwgPSAvTk9MT0dPIC9PTkVSUk9SOk5PRVhFIC9OT0QgL1BBQ0tDOjYxNDQwIC9OT0UgL0FMSUdOOjE2IC9NQVA6RlVMTA0KK0xJQlNfRF9XRExMID0gb2xkbmFtZXMgbGlidyBjb21tZGxnIHNoZWxsIG9sZWNsaSBvbGVzdnIgbGRsbGNldw0KK0xJQlNfUl9XRExMID0gb2xkbmFtZXMgbGlidyBjb21tZGxnIHNoZWxsIG9sZWNsaSBvbGVzdnIgbGRsbGNldw0KK1JDRkxBR1MgPSAvbm9sb2dvDQorUkVTRkxBR1MgPSAvbm9sb2dvDQorUlVORkxBR1MgPSANCitERUZGSUxFID0gWkxJQjE2LkRFRg0KK09CSlNfRVhUID0gDQorTElCU19FWFQgPSANCishaWYgIiQoREVCVUcpIiA9PSAiMSINCitDRkxBR1MgPSAkKENGTEFHU19EX1dETEwpDQorTEZMQUdTID0gJChMRkxBR1NfRF9XRExMKQ0KK0xJQlMgPSAkKExJQlNfRF9XRExMKQ0KK01BUEZJTEUgPSBudWwNCitSQ0RFRklORVMgPSAkKERfUkNERUZJTkVTKQ0KKyFlbHNlDQorQ0ZMQUdTID0gJChDRkxBR1NfUl9XRExMKQ0KK0xGTEFHUyA9ICQoTEZMQUdTX1JfV0RMTCkNCitMSUJTID0gJChMSUJTX1JfV0RMTCkNCitNQVBGSUxFID0gbnVsDQorUkNERUZJTkVTID0gJChSX1JDREVGSU5FUykNCishZW5kaWYNCishaWYgW2lmIGV4aXN0IE1TVkMuQk5EIGRlbCBNU1ZDLkJORF0NCishZW5kaWYNCitTQlJTID0gQURMRVIzMi5TQlIgXA0KKwkJQ09NUFJFU1MuU0JSIFwNCisJCUNSQzMyLlNCUiBcDQorCQlERUZMQVRFLlNCUiBcDQorCQlHWklPLlNCUiBcDQorCQlJTkZGQVNULlNCUiBcDQorCQlJTkZMQVRFLlNCUiBcDQorCQlUUkVFUy5TQlIgXA0KKwkJVU5DT01QUi5TQlIgXA0KKwkJWlVUSUwuU0JSIFwNCisJCVpJUC5TQlIgXA0KKwkJVU5aSVAuU0JSIFwNCisJCUlORkJBQ0suU0JSIFwNCisJCUlPQVBJLlNCUiBcDQorCQlJTkZUUkVFUy5TQlINCisNCisNCitBRExFUjMyX0RFUCA9IGM6XHpsaWJcemxpYi5oIFwNCisJYzpcemxpYlx6Y29uZi5oDQorDQorDQorQ09NUFJFU1NfREVQID0gYzpcemxpYlx6bGliLmggXA0KKwljOlx6bGliXHpjb25mLmgNCisNCisNCitDUkMzMl9ERVAgPSBjOlx6bGliXHpsaWIuaCBcDQorCWM6XHpsaWJcemNvbmYuaCBcDQorCWM6XHpsaWJcY3JjMzIuaA0KKw0KKw0KK0RFRkxBVEVfREVQID0gYzpcemxpYlxkZWZsYXRlLmggXA0KKwljOlx6bGliXHp1dGlsLmggXA0KKwljOlx6bGliXHpsaWIuaCBcDQorCWM6XHpsaWJcemNvbmYuaA0KKw0KKw0KK0daSU9fREVQID0gYzpcemxpYlx6dXRpbC5oIFwNCisJYzpcemxpYlx6bGliLmggXA0KKwljOlx6bGliXHpjb25mLmgNCisNCisNCitJTkZGQVNUX0RFUCA9IGM6XHpsaWJcenV0aWwuaCBcDQorCWM6XHpsaWJcemxpYi5oIFwNCisJYzpcemxpYlx6Y29uZi5oIFwNCisJYzpcemxpYlxpbmZ0cmVlcy5oIFwNCisJYzpcemxpYlxpbmZsYXRlLmggXA0KKwljOlx6bGliXGluZmZhc3QuaA0KKw0KKw0KK0lORkxBVEVfREVQID0gYzpcemxpYlx6dXRpbC5oIFwNCisJYzpcemxpYlx6bGliLmggXA0KKwljOlx6bGliXHpjb25mLmggXA0KKwljOlx6bGliXGluZnRyZWVzLmggXA0KKwljOlx6bGliXGluZmxhdGUuaCBcDQorCWM6XHpsaWJcaW5mZmFzdC5oIFwNCisJYzpcemxpYlxpbmZmaXhlZC5oDQorDQorDQorVFJFRVNfREVQID0gYzpcemxpYlxkZWZsYXRlLmggXA0KKwljOlx6bGliXHp1dGlsLmggXA0KKwljOlx6bGliXHpsaWIuaCBcDQorCWM6XHpsaWJcemNvbmYuaCBcDQorCWM6XHpsaWJcdHJlZXMuaA0KKw0KKw0KK1VOQ09NUFJfREVQID0gYzpcemxpYlx6bGliLmggXA0KKwljOlx6bGliXHpjb25mLmgNCisNCisNCitaVVRJTF9ERVAgPSBjOlx6bGliXHp1dGlsLmggXA0KKwljOlx6bGliXHpsaWIuaCBcDQorCWM6XHpsaWJcemNvbmYuaA0KKw0KKw0KK1pMSUIxNl9SQ0RFUCA9IA0KKw0KK1pJUF9ERVAgPSBjOlx6bGliXHpsaWIuaCBcDQorCWM6XHpsaWJcemNvbmYuaCBcDQorCWM6XHpsaWJcemlwLmggXA0KKwljOlx6bGliXGlvYXBpLmgNCisNCisNCitVTlpJUF9ERVAgPSBjOlx6bGliXHpsaWIuaCBcDQorCWM6XHpsaWJcemNvbmYuaCBcDQorCWM6XHpsaWJcdW56aXAuaCBcDQorCWM6XHpsaWJcaW9hcGkuaA0KKw0KKw0KK0lORkJBQ0tfREVQID0gYzpcemxpYlx6dXRpbC5oIFwNCisJYzpcemxpYlx6bGliLmggXA0KKwljOlx6bGliXHpjb25mLmggXA0KKwljOlx6bGliXGluZnRyZWVzLmggXA0KKwljOlx6bGliXGluZmxhdGUuaCBcDQorCWM6XHpsaWJcaW5mZmFzdC5oIFwNCisJYzpcemxpYlxpbmZmaXhlZC5oDQorDQorDQorSU9BUElfREVQID0gYzpcemxpYlx6bGliLmggXA0KKwljOlx6bGliXHpjb25mLmggXA0KKwljOlx6bGliXGlvYXBpLmgNCisNCisNCitJTkZUUkVFU19ERVAgPSBjOlx6bGliXHp1dGlsLmggXA0KKwljOlx6bGliXHpsaWIuaCBcDQorCWM6XHpsaWJcemNvbmYuaCBcDQorCWM6XHpsaWJcaW5mdHJlZXMuaA0KKw0KKw0KK2FsbDoJJChQUk9KKS5ETEwgJChQUk9KKS5CU0MNCisNCitBRExFUjMyLk9CSjoJQURMRVIzMi5DICQoQURMRVIzMl9ERVApDQorCSQoQ0MpICQoQ0ZMQUdTKSAkKENDUkVBVEVQQ0hGTEFHKSAvYyBBRExFUjMyLkMNCisNCitDT01QUkVTUy5PQko6CUNPTVBSRVNTLkMgJChDT01QUkVTU19ERVApDQorCSQoQ0MpICQoQ0ZMQUdTKSAkKENVU0VQQ0hGTEFHKSAvYyBDT01QUkVTUy5DDQorDQorQ1JDMzIuT0JKOglDUkMzMi5DICQoQ1JDMzJfREVQKQ0KKwkkKENDKSAkKENGTEFHUykgJChDVVNFUENIRkxBRykgL2MgQ1JDMzIuQw0KKw0KK0RFRkxBVEUuT0JKOglERUZMQVRFLkMgJChERUZMQVRFX0RFUCkNCisJJChDQykgJChDRkxBR1MpICQoQ1VTRVBDSEZMQUcpIC9jIERFRkxBVEUuQw0KKw0KK0daSU8uT0JKOglHWklPLkMgJChHWklPX0RFUCkNCisJJChDQykgJChDRkxBR1MpICQoQ1VTRVBDSEZMQUcpIC9jIEdaSU8uQw0KKw0KK0lORkZBU1QuT0JKOglJTkZGQVNULkMgJChJTkZGQVNUX0RFUCkNCisJJChDQykgJChDRkxBR1MpICQoQ1VTRVBDSEZMQUcpIC9jIElORkZBU1QuQw0KKw0KK0lORkxBVEUuT0JKOglJTkZMQVRFLkMgJChJTkZMQVRFX0RFUCkNCisJJChDQykgJChDRkxBR1MpICQoQ1VTRVBDSEZMQUcpIC9jIElORkxBVEUuQw0KKw0KK1RSRUVTLk9CSjoJVFJFRVMuQyAkKFRSRUVTX0RFUCkNCisJJChDQykgJChDRkxBR1MpICQoQ1VTRVBDSEZMQUcpIC9jIFRSRUVTLkMNCisNCitVTkNPTVBSLk9CSjoJVU5DT01QUi5DICQoVU5DT01QUl9ERVApDQorCSQoQ0MpICQoQ0ZMQUdTKSAkKENVU0VQQ0hGTEFHKSAvYyBVTkNPTVBSLkMNCisNCitaVVRJTC5PQko6CVpVVElMLkMgJChaVVRJTF9ERVApDQorCSQoQ0MpICQoQ0ZMQUdTKSAkKENVU0VQQ0hGTEFHKSAvYyBaVVRJTC5DDQorDQorWkxJQjE2LlJFUzoJWkxJQjE2LlJDICQoWkxJQjE2X1JDREVQKQ0KKwkkKFJDKSAkKFJDRkxBR1MpICQoUkNERUZJTkVTKSAtciBaTElCMTYuUkMNCisNCitaSVAuT0JKOglaSVAuQyAkKFpJUF9ERVApDQorCSQoQ0MpICQoQ0ZMQUdTKSAkKENVU0VQQ0hGTEFHKSAvYyBaSVAuQw0KKw0KK1VOWklQLk9CSjoJVU5aSVAuQyAkKFVOWklQX0RFUCkNCisJJChDQykgJChDRkxBR1MpICQoQ1VTRVBDSEZMQUcpIC9jIFVOWklQLkMNCisNCitJTkZCQUNLLk9CSjoJSU5GQkFDSy5DICQoSU5GQkFDS19ERVApDQorCSQoQ0MpICQoQ0ZMQUdTKSAkKENVU0VQQ0hGTEFHKSAvYyBJTkZCQUNLLkMNCisNCitJT0FQSS5PQko6CUlPQVBJLkMgJChJT0FQSV9ERVApDQorCSQoQ0MpICQoQ0ZMQUdTKSAkKENVU0VQQ0hGTEFHKSAvYyBJT0FQSS5DDQorDQorSU5GVFJFRVMuT0JKOglJTkZUUkVFUy5DICQoSU5GVFJFRVNfREVQKQ0KKwkkKENDKSAkKENGTEFHUykgJChDVVNFUENIRkxBRykgL2MgSU5GVFJFRVMuQw0KKw0KKw0KKyQoUFJPSikuRExMOjoJWkxJQjE2LlJFUw0KKw0KKyQoUFJPSikuRExMOjoJQURMRVIzMi5PQkogQ09NUFJFU1MuT0JKIENSQzMyLk9CSiBERUZMQVRFLk9CSiBHWklPLk9CSiBJTkZGQVNULk9CSiBcDQorCUlORkxBVEUuT0JKIFRSRUVTLk9CSiBVTkNPTVBSLk9CSiBaVVRJTC5PQkogWklQLk9CSiBVTlpJUC5PQkogSU5GQkFDSy5PQkogSU9BUEkuT0JKIFwNCisJSU5GVFJFRVMuT0JKICQoT0JKU19FWFQpICQoREVGRklMRSkNCisJZWNobyA+TlVMIEA8PCQoUFJPSikuQ1JGDQorQURMRVIzMi5PQkogKw0KK0NPTVBSRVNTLk9CSiArDQorQ1JDMzIuT0JKICsNCitERUZMQVRFLk9CSiArDQorR1pJTy5PQkogKw0KK0lORkZBU1QuT0JKICsNCitJTkZMQVRFLk9CSiArDQorVFJFRVMuT0JKICsNCitVTkNPTVBSLk9CSiArDQorWlVUSUwuT0JKICsNCitaSVAuT0JKICsNCitVTlpJUC5PQkogKw0KK0lORkJBQ0suT0JKICsNCitJT0FQSS5PQkogKw0KK0lORlRSRUVTLk9CSiArDQorJChPQkpTX0VYVCkNCiskKFBST0opLkRMTA0KKyQoTUFQRklMRSkNCitDOlxNU1ZDXExJQlwrDQorQzpcTVNWQ1xNRkNcTElCXCsNCitFOlxQUk9HUkFNRklMRVNcTUlDUk9TT0ZUVklTVUFMU1RVRElPLk5FVFxGUkFNRVdPUktTREtcTElCXCsNCiskKExJQlMpDQorJChERUZGSUxFKTsNCis8PA0KKwlsaW5rICQoTEZMQUdTKSBAJChQUk9KKS5DUkYNCisJJChSQykgJChSRVNGTEFHUykgWkxJQjE2LlJFUyAkQA0KKwlAY29weSAkKFBST0opLkNSRiBNU1ZDLkJORA0KKwlpbXBsaWIgL25vd2VwICQoUFJPSikuTElCICQoUFJPSikuRExMDQorDQorJChQUk9KKS5ETEw6OglaTElCMTYuUkVTDQorCWlmIG5vdCBleGlzdCBNU1ZDLkJORCAJJChSQykgJChSRVNGTEFHUykgWkxJQjE2LlJFUyAkQA0KKw0KK3J1bjogJChQUk9KKS5ETEwNCisJJChQUk9KKSAkKFJVTkZMQUdTKQ0KKw0KKw0KKyQoUFJPSikuQlNDOiAkKFNCUlMpDQorCWJzY21ha2UgQDw8DQorL28kQCAkKFNCUlMpDQorPDwNCmRpZmYgLS1naXQgYS9jb250cmliL3ZzdHVkaW8vdmMxNV8xNi96bGliMTYucmMgYi9jb250cmliL3ZzdHVkaW8vdmMxNV8xNi96bGliMTYucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkMGQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdnN0dWRpby92YzE1XzE2L3psaWIxNi5yYwpAQCAtMCwwICsxLDMzIEBACisjaW5jbHVkZSA8d2luZG93cy5oPg0KKyNpbmNsdWRlIDx2ZXIuaD4NCisNCisjZGVmaW5lIElEUl9WRVJTSU9OMSAgMQ0KK0lEUl9WRVJTSU9OMQlWRVJTSU9OSU5GTwlNT1ZFQUJMRSBJTVBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRQ0KKyAgRklMRVZFUlNJT04JIDEsMiwwLDANCisgIFBST0RVQ1RWRVJTSU9OIDEsMiwwLDANCisgIEZJTEVGTEFHU01BU0sJVlNfRkZJX0ZJTEVGTEFHU01BU0sNCisgIEZJTEVGTEFHUwkwDQorICBGSUxFT1MJVk9TX0RPU19XSU5ET1dTMTYNCisgIEZJTEVUWVBFCVZGVF9ETEwNCisgIEZJTEVTVUJUWVBFCTAJLy8gbm90IHVzZWQNCitCRUdJTg0KKyAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIg0KKyAgQkVHSU4NCisgICAgQkxPQ0sgIjA0MDkwNEU0Ig0KKyAgICAvL2xhbmd1YWdlIElEID0gVS5TLiBFbmdsaXNoLCBjaGFyIHNldCA9IFdpbmRvd3MsIE11bHRpbGluZ3VhbA0KKw0KKyAgICBCRUdJTg0KKyAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiemxpYiBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnlcMCINCisgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLAkiMS4yLjBcMCINCisgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwJInpsaWIxNlwwIg0KKyAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwJInpsaWIxNi5kbGxcMCINCisgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLAkiWkxpYjE2LkRMTFwwIg0KKyAgICAgIFZBTFVFICJDb21tZW50cyIsIkRMTCBzdXBwb3J0IGJ5IEFsZXNzYW5kcm8gSWFjb3BldHRpICYgR2lsbGVzIFZvbGxhbnRcMCINCisgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiKEMpIDE5OTUtMjAwMyBKZWFuLWxvdXAgR2FpbGx5ICYgTWFyayBBZGxlclwwIg0KKyAgICBFTkQNCisgIEVORA0KKyAgQkxPQ0sgIlZhckZpbGVJbmZvIg0KKyAgQkVHSU4NCisgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAxMjUyDQorICBFTkQNCitFTkQNCmRpZmYgLS1naXQgYS9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9ndm1hdDMyLmFzbSBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL2d2bWF0MzIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDM0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9ndm1hdDMyLmFzbQpAQCAtMCwwICsxLDkwNSBAQAorOw0KKzsgZ3ZtYXQzMi5hc20gLS0gQXNtIHBvcnRpb24gb2YgdGhlIG9wdGltaXplZCBsb25nZXN0X21hdGNoIGZvciAzMiBiaXRzIHg4Ng0KKzsgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgSmVhbi1sb3VwIEdhaWxseSBhbmQgR2lsbGVzIFZvbGxhbnQuDQorOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gNCis7ICBmcm9tIEplYW4tbG91cCBHYWlsbHkgaW4gZGVmbGF0ZS5jDQorOyBJdCBuZWVkIHdtYXNrID09IDB4N2ZmZg0KKzsgICAgIChhc3NlbWJseSBjb2RlIGlzIGZhc3RlciB3aXRoIGEgZml4ZWQgd21hc2spDQorOw0KKzsgRm9yIFZpc3VhbCBDKysgNC4yIGFuZCBNTCA2LjExYyAodmVyc2lvbiBpbiBkaXJlY3RvcnkgXE1BU002MTFDIG9mIFdpbjk1IERESykNCis7ICAgSSBjb21waWxlIHdpdGggOiAibWwgL2NvZmYgL1ppIC9jIGd2bWF0MzIuYXNtIg0KKzsNCisNCis7dUludCBsb25nZXN0X21hdGNoXzdmZmYocywgY3VyX21hdGNoKQ0KKzsgICAgZGVmbGF0ZV9zdGF0ZSAqczsNCis7ICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLw0KKw0KKyAgICAgICAgTmJTdGFjayAgICAgICAgIGVxdSAgICAgNzYNCisgICAgICAgIGN1cl9tYXRjaCAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0wXQ0KKyAgICAgICAgc3RyX3MgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTRdDQorOyA1IGR3b3JkIG9uIHRvcCAocmV0LGVicCxlc2ksZWRpLGVieCkNCisgICAgICAgIGFkcnJldCAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay04XQ0KKyAgICAgICAgcHVzaGVicCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTEyXQ0KKyAgICAgICAgcHVzaGVkaSAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTE2XQ0KKyAgICAgICAgcHVzaGVzaSAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTIwXQ0KKyAgICAgICAgcHVzaGVieCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTI0XQ0KKw0KKyAgICAgICAgY2hhaW5fbGVuZ3RoICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay0yOF0NCisgICAgICAgIGxpbWl0ICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzJdDQorICAgICAgICBiZXN0X2xlbiAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTM2XQ0KKyAgICAgICAgd2luZG93ICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay00MF0NCisgICAgICAgIHByZXYgICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDRdDQorICAgICAgICBzY2FuX3N0YXJ0ICAgICAgZXF1ICAgICAgd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQ4XQ0KKyAgICAgICAgd21hc2sgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay01Ml0NCisgICAgICAgIG1hdGNoX3N0YXJ0X3B0ciBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTZdDQorICAgICAgICBuaWNlX21hdGNoICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTYwXQ0KKyAgICAgICAgc2NhbiAgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay02NF0NCisNCisgICAgICAgIHdpbmRvd2xlbiAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjhdDQorICAgICAgICBtYXRjaF9zdGFydCAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTcyXQ0KKyAgICAgICAgc3RyZW5kICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay03Nl0NCisgICAgICAgIE5iU3RhY2tBZGQgICAgICBlcXUgICAgIChOYlN0YWNrLTI0KQ0KKw0KKyAgICAuMzg2cA0KKw0KKyAgICBuYW1lICAgIGd2bWF0Y2gNCisgICAgLk1PREVMICBGTEFUDQorDQorDQorDQorOyAgYWxsIHRoZSArNCBvZmZzZXRzIGFyZSBkdWUgdG8gdGhlIGFkZGl0aW9uIG9mIHBlbmRpbmdfYnVmX3NpemUgKGluIHpsaWINCis7ICBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgc2luY2UgdGhlIGFzbSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuDQorOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjAuNCBvciBvbGRlciwgcmVtb3ZlIHRoZSArNCkuDQorOyAgTm90ZSA6IHRoZXNlIHZhbHVlIGFyZSBnb29kIHdpdGggYSA4IGJ5dGVzIGJvdW5kYXJ5IHBhY2sgc3RydWN0dXJlDQorICAgIGRlcF9jaGFpbl9sZW5ndGggICAgZXF1ICAgICA3MGgrNA0KKyAgICBkZXBfd2luZG93ICAgICAgICAgIGVxdSAgICAgMmNoKzQNCisgICAgZGVwX3N0cnN0YXJ0ICAgICAgICBlcXUgICAgIDYwaCs0DQorICAgIGRlcF9wcmV2X2xlbmd0aCAgICAgZXF1ICAgICA2Y2grNA0KKyAgICBkZXBfbmljZV9tYXRjaCAgICAgIGVxdSAgICAgODRoKzQNCisgICAgZGVwX3dfc2l6ZSAgICAgICAgICBlcXUgICAgIDIwaCs0DQorICAgIGRlcF9wcmV2ICAgICAgICAgICAgZXF1ICAgICAzNGgrNA0KKyAgICBkZXBfd19tYXNrICAgICAgICAgIGVxdSAgICAgMjhoKzQNCisgICAgZGVwX2dvb2RfbWF0Y2ggICAgICBlcXUgICAgIDgwaCs0DQorICAgIGRlcF9tYXRjaF9zdGFydCAgICAgZXF1ICAgICA2NGgrNA0KKyAgICBkZXBfbG9va2FoZWFkICAgICAgIGVxdSAgICAgNjhoKzQNCisNCisNCitfVEVYVCAgICAgICAgICAgICAgICAgICBzZWdtZW50DQorDQorSUZERUYgTk9VTkRFUkxJTkUNCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGxvbmdlc3RfbWF0Y2hfN2ZmZg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgbG9uZ2VzdF9tYXRjaF82ODYNCis7ICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBtYXRjaF9pbml0DQorRUxTRQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgX2xvbmdlc3RfbWF0Y2hfN2ZmZg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgX2xvbmdlc3RfbWF0Y2hfNjg2DQorOyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgX21hdGNoX2luaXQNCitFTkRJRg0KKw0KKyAgICBNQVhfTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMjU4DQorICAgIE1JTl9NQVRDSCAgICAgICAgICAgZXF1ICAgICAzDQorICAgIE1JTl9MT09LQUhFQUQgICAgICAgZXF1ICAgICAoTUFYX01BVENIK01JTl9NQVRDSCsxKQ0KKw0KKw0KKw0KK0lGREVGIE5PVU5ERVJMSU5FDQorO21hdGNoX2luaXQgICAgICBwcm9jIG5lYXINCis7ICAgICAgICAgICAgICAgIHJldA0KKzttYXRjaF9pbml0ICAgICAgZW5kcA0KK0VMU0UNCis7X21hdGNoX2luaXQgICAgIHByb2MgbmVhcg0KKzsgICAgICAgICAgICAgICAgcmV0DQorO19tYXRjaF9pbml0ICAgICBlbmRwDQorRU5ESUYNCisNCisNCitJRkRFRiBOT1VOREVSTElORQ0KK2xvbmdlc3RfbWF0Y2hfN2ZmZiAgIHByb2MgbmVhcg0KK0VMU0UNCitfbG9uZ2VzdF9tYXRjaF83ZmZmICBwcm9jIG5lYXINCitFTkRJRg0KKw0KKyAgICAgICAgbW92ICAgICBlZHgsW2VzcCs0XQ0KKw0KKw0KKw0KKyAgICAgICAgcHVzaCAgICBlYnANCisgICAgICAgIHB1c2ggICAgZWRpDQorICAgICAgICBwdXNoICAgIGVzaQ0KKyAgICAgICAgcHVzaCAgICBlYngNCisNCisgICAgICAgIHN1YiAgICAgZXNwLE5iU3RhY2tBZGQNCisNCis7IGluaXRpYWxpemUgb3IgY2hlY2sgdGhlIHZhcmlhYmxlcyB1c2VkIGluIG1hdGNoLmFzbS4NCisgICAgICAgIG1vdiAgICAgZWJwLGVkeA0KKw0KKzsgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aA0KKzsgaWYgKHByZXZfbGVuZ3RoPj1nb29kX21hdGNoKSBjaGFpbl9sZW5ndGggPj49IDINCisgICAgICAgIG1vdiAgICAgZWR4LFtlYnArZGVwX2NoYWluX2xlbmd0aF0NCisgICAgICAgIG1vdiAgICAgZWJ4LFtlYnArZGVwX3ByZXZfbGVuZ3RoXQ0KKyAgICAgICAgY21wICAgICBbZWJwK2RlcF9nb29kX21hdGNoXSxlYngNCisgICAgICAgIGphICAgICAgbm9zaHINCisgICAgICAgIHNociAgICAgZWR4LDINCitub3NocjoNCis7IHdlIGluY3JlbWVudCBjaGFpbl9sZW5ndGggYmVjYXVzZSBpbiB0aGUgYXNtLCB0aGUgLS1jaGFpbl9sZW5naHQgaXMgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcA0KKyAgICAgICAgaW5jICAgICBlZHgNCisgICAgICAgIG1vdiAgICAgZWRpLFtlYnArZGVwX25pY2VfbWF0Y2hdDQorICAgICAgICBtb3YgICAgIGNoYWluX2xlbmd0aCxlZHgNCisgICAgICAgIG1vdiAgICAgZWF4LFtlYnArZGVwX2xvb2thaGVhZF0NCisgICAgICAgIGNtcCAgICAgZWF4LGVkaQ0KKzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQorICAgICAgICBqYWUgICAgIG5vbG9va2FoZWFkbmljZW1hdGNoDQorICAgICAgICBtb3YgICAgIGVkaSxlYXgNCitub2xvb2thaGVhZG5pY2VtYXRjaDoNCis7IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGgNCisgICAgICAgIG1vdiAgICAgYmVzdF9sZW4sZWJ4DQorDQorOyB3aW5kb3cgPSBzLT53aW5kb3cNCisgICAgICAgIG1vdiAgICAgZXNpLFtlYnArZGVwX3dpbmRvd10NCisgICAgICAgIG1vdiAgICAgZWN4LFtlYnArZGVwX3N0cnN0YXJ0XQ0KKyAgICAgICAgbW92ICAgICB3aW5kb3csZXNpDQorDQorICAgICAgICBtb3YgICAgIG5pY2VfbWF0Y2gsZWRpDQorOyBzY2FuID0gd2luZG93ICsgc3Ryc3RhcnQNCisgICAgICAgIGFkZCAgICAgZXNpLGVjeA0KKyAgICAgICAgbW92ICAgICBzY2FuLGVzaQ0KKzsgZHggPSAqd2luZG93DQorICAgICAgICBtb3YgICAgIGR4LHdvcmQgcHRyIFtlc2ldDQorOyBieCA9ICood2luZG93K2Jlc3RfbGVuLTEpDQorICAgICAgICBtb3YgICAgIGJ4LHdvcmQgcHRyIFtlc2krZWJ4LTFdDQorICAgICAgICBhZGQgICAgIGVzaSxNQVhfTUFUQ0gtMQ0KKzsgc2Nhbl9zdGFydCA9ICpzY2FuDQorICAgICAgICBtb3YgICAgIHNjYW5fc3RhcnQsZHgNCis7IHN0cmVuZCA9IHNjYW4gKyBNQVhfTUFUQ0gtMQ0KKyAgICAgICAgbW92ICAgICBzdHJlbmQsZXNpDQorOyBieCA9IHNjYW5fZW5kID0gKih3aW5kb3crYmVzdF9sZW4tMSkNCisNCis7ICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8NCis7ICAgICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOw0KKw0KKyAgICAgICAgbW92ICAgICBlc2ksW2VicCtkZXBfd19zaXplXQ0KKyAgICAgICAgc3ViICAgICBlc2ksTUlOX0xPT0tBSEVBRA0KKzsgaGVyZSBlc2kgPSBNQVhfRElTVChzKQ0KKyAgICAgICAgc3ViICAgICBlY3gsZXNpDQorICAgICAgICBqYSAgICAgIG5vZGlzdA0KKyAgICAgICAgeG9yICAgICBlY3gsZWN4DQorbm9kaXN0Og0KKyAgICAgICAgbW92ICAgICBsaW1pdCxlY3gNCisNCis7IHByZXYgPSBzLT5wcmV2DQorICAgICAgICBtb3YgICAgIGVkeCxbZWJwK2RlcF9wcmV2XQ0KKyAgICAgICAgbW92ICAgICBwcmV2LGVkeA0KKw0KKzsNCisgICAgICAgIG1vdiAgICAgZWR4LGR3b3JkIHB0ciBbZWJwK2RlcF9tYXRjaF9zdGFydF0NCisgICAgICAgIG1vdiAgICAgYnAsc2Nhbl9zdGFydA0KKyAgICAgICAgbW92ICAgICBlYXgsY3VyX21hdGNoDQorICAgICAgICBtb3YgICAgIG1hdGNoX3N0YXJ0LGVkeA0KKw0KKyAgICAgICAgbW92ICAgICBlZHgsd2luZG93DQorICAgICAgICBtb3YgICAgIGVkaSxlZHgNCisgICAgICAgIGFkZCAgICAgZWRpLGJlc3RfbGVuDQorICAgICAgICBtb3YgICAgIGVzaSxwcmV2DQorICAgICAgICBkZWMgICAgIGVkaQ0KKzsgd2luZG93bGVuID0gd2luZG93ICsgYmVzdF9sZW4gLTENCisgICAgICAgIG1vdiAgICAgd2luZG93bGVuLGVkaQ0KKw0KKyAgICAgICAgam1wICAgICBiZWdpbmxvb3AyDQorICAgICAgICBhbGlnbiAgIDQNCisNCis7IGhlcmUsIGluIHRoZSBsb29wDQorOyAgICAgICBlYXggPSBheCA9IGN1cl9tYXRjaA0KKzsgICAgICAgZWN4ID0gbGltaXQNCis7ICAgICAgICBieCA9IHNjYW5fZW5kDQorOyAgICAgICAgYnAgPSBzY2FuX3N0YXJ0DQorOyAgICAgICBlZGkgPSB3aW5kb3dsZW4gKHdpbmRvdyArIGJlc3RfbGVuIC0xKQ0KKzsgICAgICAgZXNpID0gcHJldg0KKw0KKw0KKzsvLyBoZXJlOyBjaGFpbl9sZW5ndGggPD0xNg0KK25vcm1hbGJlZzBhZGQxNjoNCisgICAgICAgIGFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2DQorICAgICAgICBqeiAgICAgIGV4aXRsb29wDQorbm9ybWFsYmVnMDoNCisgICAgICAgIGNtcCAgICAgd29yZCBwdHJbZWRpK2VheF0sYngNCisgICAgICAgIGplICAgICAgbm9ybWFsYmVnMm5vcm9sbA0KK3Jjb250bGFibm9yb2xsOg0KKzsgY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10NCisgICAgICAgIGFuZCAgICAgZWF4LDdmZmZoDQorICAgICAgICBtb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0NCis7IGlmIGN1cl9tYXRjaCA+IGxpbWl0LCBnbyB0byBleGl0bG9vcA0KKyAgICAgICAgY21wICAgICBlY3gsZWF4DQorICAgICAgICBqbmIgICAgIGV4aXRsb29wDQorOyBpZiAtLWNoYWluX2xlbmd0aCAhPSAwLCBnbyB0byBleGl0bG9vcA0KKyAgICAgICAgZGVjICAgICBjaGFpbl9sZW5ndGgNCisgICAgICAgIGpueiAgICAgbm9ybWFsYmVnMA0KKyAgICAgICAgam1wICAgICBleGl0bG9vcA0KKw0KK25vcm1hbGJlZzJub3JvbGw6DQorOyBpZiAoc2Nhbl9zdGFydD09KihjdXJfbWF0Y2grd2luZG93KSkgZ290byBub3JtYWxiZWcyDQorICAgICAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkeCtlYXhdDQorICAgICAgICBqbmUgICAgIHJjb250bGFibm9yb2xsDQorICAgICAgICBqbXAgICAgIG5vcm1hbGJlZzINCisNCitjb250bG9vcDM6DQorICAgICAgICBtb3YgICAgIGVkaSx3aW5kb3dsZW4NCisNCis7IGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdDQorICAgICAgICBhbmQgICAgIGVheCw3ZmZmaA0KKyAgICAgICAgbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdDQorOyBpZiBjdXJfbWF0Y2ggPiBsaW1pdCwgZ28gdG8gZXhpdGxvb3ANCisgICAgICAgIGNtcCAgICAgZWN4LGVheA0KK2puYmV4aXRsb29wc2hvcnQxOg0KKyAgICAgICAgam5iICAgICBleGl0bG9vcA0KKzsgaWYgLS1jaGFpbl9sZW5ndGggIT0gMCwgZ28gdG8gZXhpdGxvb3ANCisNCisNCis7IGJlZ2luIHRoZSBtYWluIGxvb3ANCitiZWdpbmxvb3AyOg0KKyAgICAgICAgc3ViICAgICBjaGFpbl9sZW5ndGgsMTYrMQ0KKzsgaWYgY2hhaW5fbGVuZ3RoIDw9MTYsIGRvbid0IHVzZSB0aGUgdW5yb2xsZWQgbG9vcA0KKyAgICAgICAgam5hICAgICBub3JtYWxiZWcwYWRkMTYNCisNCitkbzE2Og0KKyAgICAgICAgY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieA0KKyAgICAgICAgamUgICAgICBub3JtYWxiZWcyZGMwDQorDQorbWFjY24gICBNQUNSTyAgIGxhYg0KKyAgICAgICAgYW5kICAgICBlYXgsN2ZmZmgNCisgICAgICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQ0KKyAgICAgICAgY21wICAgICBlY3gsZWF4DQorICAgICAgICBqbmIgICAgIGV4aXRsb29wDQorICAgICAgICBjbXAgICAgIHdvcmQgcHRyW2VkaStlYXhdLGJ4DQorICAgICAgICBqZSAgICAgIGxhYg0KKyAgICAgICAgRU5ETQ0KKw0KK3Jjb250bG9vcDA6DQorICAgICAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzENCisNCityY29udGxvb3AxOg0KKyAgICAgICAgbWFjY24gICBub3JtYWxiZWcyZGMyDQorDQorcmNvbnRsb29wMjoNCisgICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjMw0KKw0KK3Jjb250bG9vcDM6DQorICAgICAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzQNCisNCityY29udGxvb3A0Og0KKyAgICAgICAgbWFjY24gICBub3JtYWxiZWcyZGM1DQorDQorcmNvbnRsb29wNToNCisgICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjNg0KKw0KK3Jjb250bG9vcDY6DQorICAgICAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzcNCisNCityY29udGxvb3A3Og0KKyAgICAgICAgbWFjY24gICBub3JtYWxiZWcyZGM4DQorDQorcmNvbnRsb29wODoNCisgICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjOQ0KKw0KK3Jjb250bG9vcDk6DQorICAgICAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzEwDQorDQorcmNvbnRsb29wMTA6DQorICAgICAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzExDQorDQorcmNvbnRsb29wMTE6DQorICAgICAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzEyDQorDQorcmNvbnRsb29wMTI6DQorICAgICAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzEzDQorDQorcmNvbnRsb29wMTM6DQorICAgICAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzE0DQorDQorcmNvbnRsb29wMTQ6DQorICAgICAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzE1DQorDQorcmNvbnRsb29wMTU6DQorICAgICAgICBhbmQgICAgIGVheCw3ZmZmaA0KKyAgICAgICAgbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdDQorICAgICAgICBjbXAgICAgIGVjeCxlYXgNCisgICAgICAgIGpuYiAgICAgZXhpdGxvb3ANCisNCisgICAgICAgIHN1YiAgICAgY2hhaW5fbGVuZ3RoLDE2DQorICAgICAgICBqYSAgICAgIGRvMTYNCisgICAgICAgIGptcCAgICAgbm9ybWFsYmVnMGFkZDE2DQorDQorOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsNCisNCitub3JtYmVnIE1BQ1JPICAgcmNvbnRsYWIsdmFsc3ViDQorOyBpZiB3ZSBhcmUgaGVyZSwgd2Uga25vdyB0aGF0ICoobWF0Y2grYmVzdF9sZW4tMSkgPT0gc2Nhbl9lbmQNCisgICAgICAgIGNtcCAgICAgYnAsd29yZCBwdHJbZWR4K2VheF0NCis7IGlmIChtYXRjaCAhPSBzY2FuX3N0YXJ0KSBnb3RvIHJjb250bGFiDQorICAgICAgICBqbmUgICAgIHJjb250bGFiDQorOyBjYWxjdWxhdGUgdGhlIGdvb2QgY2hhaW5fbGVuZ3RoLCBhbmQgd2UnbGwgY29tcGFyZSBzY2FuIGFuZCBtYXRjaCBzdHJpbmcNCisgICAgICAgIGFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2LXZhbHN1Yg0KKyAgICAgICAgam1wICAgICBpc2VxDQorICAgICAgICBFTkRNDQorDQorDQorbm9ybWFsYmVnMmRjMTE6DQorICAgICAgICBub3JtYmVnIHJjb250bG9vcDExLDExDQorDQorbm9ybWFsYmVnMmRjMTI6DQorICAgICAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDEyLDEyDQorDQorbm9ybWFsYmVnMmRjMTM6DQorICAgICAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDEzLDEzDQorDQorbm9ybWFsYmVnMmRjMTQ6DQorICAgICAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDE0LDE0DQorDQorbm9ybWFsYmVnMmRjMTU6DQorICAgICAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDE1LDE1DQorDQorbm9ybWFsYmVnMmRjMTA6DQorICAgICAgICBub3JtYmVnIHJjb250bG9vcDEwLDEwDQorDQorbm9ybWFsYmVnMmRjOToNCisgICAgICAgIG5vcm1iZWcgcmNvbnRsb29wOSw5DQorDQorbm9ybWFsYmVnMmRjODoNCisgICAgICAgIG5vcm1iZWcgcmNvbnRsb29wOCw4DQorDQorbm9ybWFsYmVnMmRjNzoNCisgICAgICAgIG5vcm1iZWcgcmNvbnRsb29wNyw3DQorDQorbm9ybWFsYmVnMmRjNjoNCisgICAgICAgIG5vcm1iZWcgcmNvbnRsb29wNiw2DQorDQorbm9ybWFsYmVnMmRjNToNCisgICAgICAgIG5vcm1iZWcgcmNvbnRsb29wNSw1DQorDQorbm9ybWFsYmVnMmRjNDoNCisgICAgICAgIG5vcm1iZWcgcmNvbnRsb29wNCw0DQorDQorbm9ybWFsYmVnMmRjMzoNCisgICAgICAgIG5vcm1iZWcgcmNvbnRsb29wMywzDQorDQorbm9ybWFsYmVnMmRjMjoNCisgICAgICAgIG5vcm1iZWcgcmNvbnRsb29wMiwyDQorDQorbm9ybWFsYmVnMmRjMToNCisgICAgICAgIG5vcm1iZWcgcmNvbnRsb29wMSwxDQorDQorbm9ybWFsYmVnMmRjMDoNCisgICAgICAgIG5vcm1iZWcgcmNvbnRsb29wMCwwDQorDQorDQorOyB3ZSBnbyBpbiBub3JtYWxiZWcyIGJlY2F1c2UgKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgPT0gc2Nhbl9lbmQNCisNCitub3JtYWxiZWcyOg0KKyAgICAgICAgbW92ICAgICBlZGksd2luZG93DQorDQorICAgICAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkaStlYXhdDQorICAgICAgICBqbmUgICAgIGNvbnRsb29wMyAgICAgICAgICAgICAgICAgICA7IGlmICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCwgY29udGludWUNCisNCitpc2VxOg0KKzsgaWYgd2UgYXJlIGhlcmUsIHdlIGtub3cgdGhhdCAqKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kDQorOyBhbmQgKG1hdGNoID09IHNjYW5fc3RhcnQpDQorDQorICAgICAgICBtb3YgICAgIGVkaSxlZHgNCisgICAgICAgIG1vdiAgICAgZXNpLHNjYW4gICAgICAgICAgICAgICAgICAgIDsgZXNpID0gc2Nhbg0KKyAgICAgICAgYWRkICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICAgICAgOyBlZGkgPSB3aW5kb3cgKyBjdXJfbWF0Y2ggPSBtYXRjaA0KKw0KKyAgICAgICAgbW92ICAgICBlZHgsW2VzaSszXSAgICAgICAgICAgICAgICAgOyBjb21wYXJlIG1hbnVhbGx5IGR3b3JkIGF0IG1hdGNoKzMNCisgICAgICAgIHhvciAgICAgZWR4LFtlZGkrM10gICAgICAgICAgICAgICAgIDsgYW5kIHNjYW4gKzMNCisNCisgICAgICAgIGp6ICAgICAgYmVnaW5jb21wYXJlICAgICAgICAgICAgICAgIDsgaWYgZXF1YWwsIGdvIHRvIGxvbmcgY29tcGFyZQ0KKw0KKzsgd2Ugd2lsbCBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZSBhbmQgY2FsY3VsYXRlIGxlbiAoaW4gZXNpKQ0KKyAgICAgICAgb3IgICAgICBkbCxkbA0KKyAgICAgICAgamUgICAgICBlcTFycg0KKyAgICAgICAgbW92ICAgICBlc2ksMw0KKyAgICAgICAgam1wICAgICB0cmZpbnZhbA0KK2VxMXJyOg0KKyAgICAgICAgb3IgICAgICBkeCxkeA0KKyAgICAgICAgamUgICAgICBlcTENCisNCisgICAgICAgIG1vdiAgICAgZXNpLDQNCisgICAgICAgIGptcCAgICAgdHJmaW52YWwNCitlcTE6DQorICAgICAgICBhbmQgICAgIGVkeCwwZmZmZmZmaA0KKyAgICAgICAganogICAgICBlcTExDQorICAgICAgICBtb3YgICAgIGVzaSw1DQorICAgICAgICBqbXAgICAgIHRyZmludmFsDQorZXExMToNCisgICAgICAgIG1vdiAgICAgZXNpLDYNCisgICAgICAgIGptcCAgICAgdHJmaW52YWwNCisNCitiZWdpbmNvbXBhcmU6DQorICAgICAgICA7IGhlcmUgd2Ugbm93IHNjYW4gYW5kIG1hdGNoIGJlZ2luIHNhbWUNCisgICAgICAgIGFkZCAgICAgZWRpLDYNCisgICAgICAgIGFkZCAgICAgZXNpLDYNCisgICAgICAgIG1vdiAgICAgZWN4LChNQVhfTUFUQ0gtKDIrNCkpLzQgICAgIDsgc2NhbiBmb3IgYXQgbW9zdCBNQVhfTUFUQ0ggYnl0ZXMNCisgICAgICAgIHJlcGUgICAgY21wc2QgICAgICAgICAgICAgICAgICAgICAgIDsgbG9vcCB1bnRpbCBtaXNtYXRjaA0KKw0KKyAgICAgICAgamUgICAgICB0cmZpbiAgICAgICAgICAgICAgICAgICAgICAgOyBnbyB0byB0cmZpbiBpZiBub3QgdW5tYXRjaA0KKzsgd2UgZGV0ZXJtaW5lIHRoZSB1bm1hdGNoIGJ5dGUNCisgICAgICAgIHN1YiAgICAgZXNpLDQNCisgICAgICAgIG1vdiAgICAgZWR4LFtlZGktNF0NCisgICAgICAgIHhvciAgICAgZWR4LFtlc2ldDQorDQorICAgICAgICBvciAgICAgIGRsLGRsDQorICAgICAgICBqbnogICAgIHRyZmluDQorICAgICAgICBpbmMgICAgIGVzaQ0KKw0KKyAgICAgICAgb3IgICAgICBkeCxkeA0KKyAgICAgICAgam56ICAgICB0cmZpbg0KKyAgICAgICAgaW5jICAgICBlc2kNCisNCisgICAgICAgIGFuZCAgICAgZWR4LDBmZmZmZmZoDQorICAgICAgICBqbnogICAgIHRyZmluDQorICAgICAgICBpbmMgICAgIGVzaQ0KKw0KK3RyZmluOg0KKyAgICAgICAgc3ViICAgICBlc2ksc2NhbiAgICAgICAgICA7IGVzaSA9IGxlbg0KK3RyZmludmFsOg0KKzsgaGVyZSB3ZSBoYXZlIGZpbmlzZWQgY29tcGFyZSwgYW5kIGVzaSBjb250YWluIGxlbiBvZiBlcXVhbCBzdHJpbmcNCisgICAgICAgIGNtcCAgICAgZXNpLGJlc3RfbGVuICAgICAgICA7IGlmIGxlbiA+IGJlc3RfbGVuLCBnbyBuZXdiZXN0bGVuDQorICAgICAgICBqYSAgICAgIHNob3J0IG5ld2Jlc3RsZW4NCis7IG5vdyB3ZSByZXN0b3JlIGVkeCwgZWN4IGFuZCBlc2ksIGZvciB0aGUgYmlnIGxvb3ANCisgICAgICAgIG1vdiAgICAgZXNpLHByZXYNCisgICAgICAgIG1vdiAgICAgZWN4LGxpbWl0DQorICAgICAgICBtb3YgICAgIGVkeCx3aW5kb3cNCisgICAgICAgIGptcCAgICAgY29udGxvb3AzDQorDQorbmV3YmVzdGxlbjoNCisgICAgICAgIG1vdiAgICAgYmVzdF9sZW4sZXNpICAgICAgICA7IGxlbiBiZWNvbWUgYmVzdF9sZW4NCisNCisgICAgICAgIG1vdiAgICAgbWF0Y2hfc3RhcnQsZWF4ICAgICA7IHNhdmUgbmV3IHBvc2l0aW9uIGFzIG1hdGNoX3N0YXJ0DQorICAgICAgICBjbXAgICAgIGVzaSxuaWNlX21hdGNoICAgICAgOyBpZiBiZXN0X2xlbiA+PSBuaWNlX21hdGNoLCBleGl0DQorICAgICAgICBqYWUgICAgIGV4aXRsb29wDQorICAgICAgICBtb3YgICAgIGVjeCxzY2FuDQorICAgICAgICBtb3YgICAgIGVkeCx3aW5kb3cgICAgICAgICAgOyByZXN0b3JlIGVkeD13aW5kb3cNCisgICAgICAgIGFkZCAgICAgZWN4LGVzaQ0KKyAgICAgICAgYWRkICAgICBlc2ksZWR4DQorDQorICAgICAgICBkZWMgICAgIGVzaQ0KKyAgICAgICAgbW92ICAgICB3aW5kb3dsZW4sZXNpICAgICAgIDsgd2luZG93bGVuID0gd2luZG93ICsgYmVzdF9sZW4tMQ0KKyAgICAgICAgbW92ICAgICBieCxbZWN4LTFdICAgICAgICAgIDsgYnggPSAqKHNjYW4rYmVzdF9sZW4tMSkgPSBzY2FuX2VuZA0KKw0KKzsgbm93IHdlIHJlc3RvcmUgZWN4IGFuZCBlc2ksIGZvciB0aGUgYmlnIGxvb3AgOg0KKyAgICAgICAgbW92ICAgICBlc2kscHJldg0KKyAgICAgICAgbW92ICAgICBlY3gsbGltaXQNCisgICAgICAgIGptcCAgICAgY29udGxvb3AzDQorDQorZXhpdGxvb3A6DQorOyBleGl0IDogcy0+bWF0Y2hfc3RhcnQ9bWF0Y2hfc3RhcnQNCisgICAgICAgIG1vdiAgICAgZWJ4LG1hdGNoX3N0YXJ0DQorICAgICAgICBtb3YgICAgIGVicCxzdHJfcw0KKyAgICAgICAgbW92ICAgICBlY3gsYmVzdF9sZW4NCisgICAgICAgIG1vdiAgICAgZHdvcmQgcHRyIFtlYnArZGVwX21hdGNoX3N0YXJ0XSxlYnggICAgICAgIA0KKyAgICAgICAgbW92ICAgICBlYXgsZHdvcmQgcHRyIFtlYnArZGVwX2xvb2thaGVhZF0NCisgICAgICAgIGNtcCAgICAgZWN4LGVheA0KKyAgICAgICAgamEgICAgICBtaW5leGxvDQorICAgICAgICBtb3YgICAgIGVheCxlY3gNCittaW5leGxvOg0KKzsgcmV0dXJuIG1pbihiZXN0X2xlbixzLT5sb29rYWhlYWQpDQorICAgICAgICANCis7IHJlc3RvcmUgc3RhY2sgYW5kIHJlZ2lzdGVyIGVieCxlc2ksZWRpLGVicA0KKyAgICAgICAgYWRkICAgICBlc3AsTmJTdGFja0FkZA0KKw0KKyAgICAgICAgcG9wICAgICBlYngNCisgICAgICAgIHBvcCAgICAgZXNpDQorICAgICAgICBwb3AgICAgIGVkaQ0KKyAgICAgICAgcG9wICAgICBlYnANCisgICAgICAgIHJldA0KK0luZm9BdXRob3I6DQorOyBwbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgc3RyaW5nICENCis7IFlvdXIgYXJlIGZyZWUgdXNlIGd2bWF0MzIgaW4gYW55IGZyZSBvciBjb21tZXJjaWFsIGFwcHMgaWYgeW91IGRvbid0IHJlbW92ZSB0aGUgc3RyaW5nIGluIHRoZSBiaW5hcnkhDQorICAgICAgICBkYiAgICAgMGRoLDBhaCwiR1ZNYXQzMiBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSB3cml0dGVuIDE5OTYtOTggYnkgR2lsbGVzIFZvbGxhbnQiLDBkaCwwYWgNCisNCisNCisNCitJRkRFRiBOT1VOREVSTElORQ0KK2xvbmdlc3RfbWF0Y2hfN2ZmZiAgIGVuZHANCitFTFNFDQorX2xvbmdlc3RfbWF0Y2hfN2ZmZiAgZW5kcA0KK0VORElGDQorDQorDQorSUZERUYgTk9VTkRFUkxJTkUNCitjcHVkZXRlY3QzMiAgICAgcHJvYyBuZWFyDQorRUxTRQ0KK19jcHVkZXRlY3QzMiAgICBwcm9jIG5lYXINCitFTkRJRg0KKw0KKwlwdXNoCWVieA0KKw0KKwlwdXNoZmQgICAgICAgICAgICAgICAgICA7IHB1c2ggb3JpZ2luYWwgRUZMQUdTDQorCXBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgZ2V0IG9yaWdpbmFsIEVGTEFHUw0KKwltb3YgICAgIGVjeCwgZWF4ICAgICAgICA7IHNhdmUgb3JpZ2luYWwgRUZMQUdTDQorCXhvciAgICAgZWF4LCA0MDAwMGggICAgIDsgZmxpcCBBQyBiaXQgaW4gRUZMQUdTDQorCXB1c2ggICAgZWF4ICAgICAgICAgICAgIDsgc2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrDQorCXBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQ0KKwlwdXNoZmQgICAgICAgICAgICAgICAgICA7IGdldCBuZXcgRUZMQUdTDQorCXBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgc3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgNCisJeG9yICAgICBlYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgQUMgYml0LCBwcm9jZXNzb3I9ODAzODYNCisJanogICAgICBlbmRfY3B1X2lzXzM4NiAgOyBqdW1wIGlmIDgwMzg2IHByb2Nlc3Nvcg0KKwlwdXNoICAgIGVjeA0KKwlwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgQUMgYml0IGluIEVGTEFHUyBmaXJzdA0KKw0KKwlwdXNoZmQNCisJcHVzaGZkDQorCXBvcCAgICAgZWN4DQorCQkJDQorCW1vdiAgICAgZWF4LCBlY3ggICAgICAgIDsgZ2V0IG9yaWdpbmFsIEVGTEFHUw0KKwl4b3IgICAgIGVheCwgMjAwMDAwaCAgICA7IGZsaXAgSUQgYml0IGluIEVGTEFHUw0KKwlwdXNoICAgIGVheCAgICAgICAgICAgICA7IHNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbiBzdGFjaw0KKwlwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUNCisJcHVzaGZkICAgICAgICAgICAgICAgICAgOyBnZXQgbmV3IEVGTEFHUw0KKwlwb3AJCWVheAkgICAgICAgICAgICA7IHN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYDQorCXBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBvcmlnaW5hbCBFRkxBR1MNCisJeG9yCQllYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgSUQgYml0LA0KKwlqZQkJaXNfb2xkXzQ4NgkJOyBwcm9jZXNzb3I9b2xkDQorDQorCW1vdiAgICAgZWF4LDENCisJZGIgICAgICAwZmgsMGEyaCAgICAgICAgO0NQVUlEICAgDQorDQorZXhpdGNwdWRldGVjdDoNCisJcG9wCWVieA0KKwlyZXQNCisNCitlbmRfY3B1X2lzXzM4NjoNCisJbW92ICAgICBlYXgsMDMwMGgNCisJam1wICAgICBleGl0Y3B1ZGV0ZWN0DQorDQoraXNfb2xkXzQ4NjoNCisJbW92ICAgICBlYXgsMDQwMGgNCisJam1wICAgICBleGl0Y3B1ZGV0ZWN0DQorDQorSUZERUYgTk9VTkRFUkxJTkUNCitjcHVkZXRlY3QzMiAgICAgZW5kcA0KK0VMU0UNCitfY3B1ZGV0ZWN0MzIgICAgZW5kcA0KK0VORElGDQorDQorDQorDQorDQorTUFYX01BVENIICAgICAgIGVxdSAgICAgMjU4DQorTUlOX01BVENIICAgICAgIGVxdSAgICAgMw0KK01JTl9MT09LQUhFQUQgICBlcXUgICAgIChNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKQ0KK01BWF9NQVRDSF84XyAgICAgZXF1ICAgICAoKE1BWF9NQVRDSCArIDcpIEFORCAwRkZGMGgpDQorDQorDQorOzs7IHN0YWNrIGZyYW1lIG9mZnNldHMNCisNCitjaGFpbmxlbndtYXNrCWVxdSAgZXNwICsgMAk7IGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4NCisJCQkJCTsgbG93IHdvcmQ6IHMtPndtYXNrDQord2luZG93CQllcXUgIGVzcCArIDQJOyBsb2NhbCBjb3B5IG9mIHMtPndpbmRvdw0KK3dpbmRvd2Jlc3RsZW4JZXF1ICBlc3AgKyA4CTsgcy0+d2luZG93ICsgYmVzdGxlbg0KK3NjYW5zdGFydAllcXUgIGVzcCArIDE2CTsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZw0KK3NjYW5lbmQJCWVxdSAgZXNwICsgMTIJOyBsYXN0IHR3byBieXRlcyBvZiBzdHJpbmcNCitzY2FuYWxpZ24JZXF1ICBlc3AgKyAyMAk7IGR3b3JkLW1pc2FsaWdubWVudCBvZiBzdHJpbmcNCituaWNlbWF0Y2gJZXF1ICBlc3AgKyAyNAk7IGEgZ29vZCBlbm91Z2ggbWF0Y2ggc2l6ZQ0KK2Jlc3RsZW4JCWVxdSAgZXNwICsgMjgJOyBzaXplIG9mIGJlc3QgbWF0Y2ggc28gZmFyDQorc2NhbgkJZXF1ICBlc3AgKyAzMgk7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaA0KKw0KK0xvY2FsVmFyc1NpemUJZXF1IDM2DQorOwlzYXZlZCBlYngJYnl0ZSBlc3AgKyAzNg0KKzsJc2F2ZWQgZWRpCWJ5dGUgZXNwICsgNDANCis7CXNhdmVkIGVzaQlieXRlIGVzcCArIDQ0DQorOwlzYXZlZCBlYnAJYnl0ZSBlc3AgKyA0OA0KKzsJcmV0dXJuIGFkZHJlc3MJYnl0ZSBlc3AgKyA1Mg0KK2RlZmxhdGVzdGF0ZQllcXUgIGVzcCArIDU2CTsgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cw0KK2N1cm1hdGNoCWVxdSAgZXNwICsgNjANCisNCis7OzsgT2Zmc2V0cyBmb3IgZmllbGRzIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZS4gVGhlc2UgbnVtYmVycw0KKzs7OyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUsIHdpdGggdGhlDQorOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywNCis7OzsgY2hhbmdpbmcgdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSBjb3VsZCBlYXNpbHkgY2F1c2UgdGhpcw0KKzs7OyBwcm9ncmFtIHRvIGNyYXNoIGhvcnJpYmx5LCB3aXRob3V0IHNvIG11Y2ggYXMgYSB3YXJuaW5nIGF0DQorOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pDQorDQorZHNXU2l6ZQkJZXF1IDM2DQorZHNXTWFzawkJZXF1IDQ0DQorZHNXaW5kb3cJZXF1IDQ4DQorZHNQcmV2CQllcXUgNTYNCitkc01hdGNoTGVuCWVxdSA4OA0KK2RzUHJldk1hdGNoCWVxdSA5Mg0KK2RzU3RyU3RhcnQJZXF1IDEwMA0KK2RzTWF0Y2hTdGFydAllcXUgMTA0DQorZHNMb29rYWhlYWQJZXF1IDEwOA0KK2RzUHJldkxlbgllcXUgMTEyDQorZHNNYXhDaGFpbkxlbgllcXUgMTE2DQorZHNHb29kTWF0Y2gJZXF1IDEzMg0KK2RzTmljZU1hdGNoCWVxdSAxMzYNCisNCisNCis7OzsgbWF0Y2guYXNtIC0tIFBlbnRpdW0tUHJvLW9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQ0KKzs7OyBXcml0dGVuIGZvciB6bGliIDEuMS4yDQorOzs7IENvcHlyaWdodCAoQykgMTk5OCBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPg0KKzs7OyBZb3UgY2FuIGxvb2sgYXQgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KKzs7Ow0KKzs7OyBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQNCis7OzsgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4NCisNCis7R0xPQkFMCV9sb25nZXN0X21hdGNoLCBfbWF0Y2hfaW5pdA0KKw0KKw0KKztTRUNUSU9OCS50ZXh0DQorDQorOzs7IHVJbnQgbG9uZ2VzdF9tYXRjaChkZWZsYXRlX3N0YXRlICpkZWZsYXRlc3RhdGUsIElQb3MgY3VybWF0Y2gpDQorDQorO19sb25nZXN0X21hdGNoOg0KK0lGREVGIE5PVU5ERVJMSU5FDQorbG9uZ2VzdF9tYXRjaF82ODYgICBwcm9jIG5lYXINCitFTFNFDQorX2xvbmdlc3RfbWF0Y2hfNjg2ICBwcm9jIG5lYXINCitFTkRJRg0KKw0KKw0KKzs7OyBTYXZlIHJlZ2lzdGVycyB0aGF0IHRoZSBjb21waWxlciBtYXkgYmUgdXNpbmcsIGFuZCBhZGp1c3QgZXNwIHRvDQorOzs7IG1ha2Ugcm9vbSBmb3Igb3VyIHN0YWNrIGZyYW1lLg0KKw0KKwkJcHVzaAllYnANCisJCXB1c2gJZWRpDQorCQlwdXNoCWVzaQ0KKwkJcHVzaAllYngNCisJCXN1Ygllc3AsIExvY2FsVmFyc1NpemUNCisNCis7OzsgUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gZWN4IHdpbGwgaG9sZCBjdXJfbWF0Y2gNCis7OzsgdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiBlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQ0KKzs7OyBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBkdXJpbmcgdGhlIGZ1bmN0aW9uJ3Mgc2V0dXAgKGJlZm9yZQ0KKzs7OyBlbnRlcmluZyB0aGUgbWFpbiBsb29wLg0KKw0KKwkJbW92CWVkeCwgW2RlZmxhdGVzdGF0ZV0NCisJCW1vdgllY3gsIFtjdXJtYXRjaF0NCisNCis7OzsgdUludCB3bWFzayA9IHMtPndfbWFzazsNCis7OzsgdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsNCis7OzsgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsNCis7OzsgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsNCis7OzsgfQ0KKw0KKwkJbW92CWVheCwgW2VkeCArIGRzUHJldkxlbl0NCisJCW1vdgllYngsIFtlZHggKyBkc0dvb2RNYXRjaF0NCisJCWNtcAllYXgsIGVieA0KKwkJbW92CWVheCwgW2VkeCArIGRzV01hc2tdDQorCQltb3YJZWJ4LCBbZWR4ICsgZHNNYXhDaGFpbkxlbl0NCisJCWpsCUxhc3RNYXRjaEdvb2QNCisJCXNocgllYngsIDINCitMYXN0TWF0Y2hHb29kOg0KKw0KKzs7OyBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuDQorOzs7IHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4NCis7OzsgSXQgaXMgdGhlbiBzaGlmdGVkIGludG8gdGhlIGhpZ2ggd29yZCwgdG8gbWFrZSByb29tIGZvciB0aGUgd21hc2sNCis7OzsgdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4NCisNCisJCWRlYwllYngNCisJCXNobAllYngsIDE2DQorCQlvcgllYngsIGVheA0KKwkJbW92CVtjaGFpbmxlbndtYXNrXSwgZWJ4DQorDQorOzs7IGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOw0KKw0KKwkJbW92CWVheCwgW2VkeCArIGRzTmljZU1hdGNoXQ0KKwkJbW92CWVieCwgW2VkeCArIGRzTG9va2FoZWFkXQ0KKwkJY21wCWVieCwgZWF4DQorCQlqbAlMb29rYWhlYWRMZXNzDQorCQltb3YJZWJ4LCBlYXgNCitMb29rYWhlYWRMZXNzOgltb3YJW25pY2VtYXRjaF0sIGVieA0KKw0KKzs7OyByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0Ow0KKw0KKwkJbW92CWVzaSwgW2VkeCArIGRzV2luZG93XQ0KKwkJbW92CVt3aW5kb3ddLCBlc2kNCisJCW1vdgllYnAsIFtlZHggKyBkc1N0clN0YXJ0XQ0KKwkJbGVhCWVkaSwgW2VzaSArIGVicF0NCisJCW1vdglbc2Nhbl0sIGVkaQ0KKw0KKzs7OyBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nDQorOzs7IGR3b3JkLWFsaWduZWQuDQorDQorCQltb3YJZWF4LCBlZGkNCisJCW5lZwllYXgNCisJCWFuZAllYXgsIDMNCisJCW1vdglbc2NhbmFsaWduXSwgZWF4DQorDQorOzs7IElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8NCis7OzsgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7DQorDQorCQltb3YJZWF4LCBbZWR4ICsgZHNXU2l6ZV0NCisJCXN1YgllYXgsIE1JTl9MT09LQUhFQUQNCisJCXN1YgllYnAsIGVheA0KKwkJamcJTGltaXRQb3NpdGl2ZQ0KKwkJeG9yCWVicCwgZWJwDQorTGltaXRQb3NpdGl2ZToNCisNCis7OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7DQorDQorCQltb3YJZWF4LCBbZWR4ICsgZHNQcmV2TGVuXQ0KKwkJbW92CVtiZXN0bGVuXSwgZWF4DQorDQorOzs7IFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gZXNpIGxvY2FsbHksIGFuZCBpbiBlc2kuDQorDQorCQlhZGQJZXNpLCBlYXgNCisJCW1vdglbd2luZG93YmVzdGxlbl0sIGVzaQ0KKw0KKzs7OyByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsNCis7OzsgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKzs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsNCisNCisJCW1vdnp4CWVieCwgd29yZCBwdHIgW2VkaV0NCisJCW1vdglbc2NhbnN0YXJ0XSwgZWJ4DQorCQltb3Z6eAllYngsIHdvcmQgcHRyIFtlZGkgKyBlYXggLSAxXQ0KKwkJbW92CVtzY2FuZW5kXSwgZWJ4DQorCQltb3YJZWRpLCBbZWR4ICsgZHNQcmV2XQ0KKw0KKzs7OyBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4NCisNCisJCW1vdgllZHgsIFtjaGFpbmxlbndtYXNrXQ0KKwkJam1wCXNob3J0IExvb3BFbnRyeQ0KKw0KK2FsaWduIDQNCisNCis7OzsgZG8gew0KKzs7OyAgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7DQorOzs7ICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwNCis7OzsgICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOw0KKzs7OyAgICAgWy4uLl0NCis7OzsgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0DQorOzs7ICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOw0KKzs7Ow0KKzs7OyBIZXJlIGlzIHRoZSBpbm5lciBsb29wIG9mIHRoZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgc3BlbmQgdGhlDQorOzs7IG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsDQorOzs7IGJlIHNwZW50IGluIHRoZSBmaXJzdCB0ZW4gaW5zdHJ1Y3Rpb25zLg0KKzs7Ow0KKzs7OyBXaXRoaW4gdGhpcyBsb29wOg0KKzs7OyBlYnggPSBzY2FuZW5kDQorOzs7IGVjeCA9IGN1cm1hdGNoDQorOzs7IGVkeCA9IGNoYWlubGVud21hc2sgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHdtYXNrKQ0KKzs7OyBlc2kgPSB3aW5kb3diZXN0bGVuIC0gaS5lLiwgKHdpbmRvdyArIGJlc3RsZW4pDQorOzs7IGVkaSA9IHByZXYNCis7OzsgZWJwID0gbGltaXQNCisNCitMb29rdXBMb29wOg0KKwkJYW5kCWVjeCwgZWR4DQorCQltb3Z6eAllY3gsIHdvcmQgcHRyIFtlZGkgKyBlY3gqMl0NCisJCWNtcAllY3gsIGVicA0KKwkJamJlCUxlYXZlTm93DQorCQlzdWIJZWR4LCAwMDAxMDAwMGgNCisJCWpzCUxlYXZlTm93DQorTG9vcEVudHJ5Ogltb3Z6eAllYXgsIHdvcmQgcHRyIFtlc2kgKyBlY3ggLSAxXQ0KKwkJY21wCWVheCwgZWJ4DQorCQlqbnoJTG9va3VwTG9vcA0KKwkJbW92CWVheCwgW3dpbmRvd10NCisJCW1vdnp4CWVheCwgd29yZCBwdHIgW2VheCArIGVjeF0NCisJCWNtcAllYXgsIFtzY2Fuc3RhcnRdDQorCQlqbnoJTG9va3VwTG9vcA0KKw0KKzs7OyBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4NCisNCisJCW1vdglbY2hhaW5sZW53bWFza10sIGVkeA0KKw0KKzs7OyBQb2ludCBlZGkgdG8gdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kIGVzaSB0byB0aGUgc3RyaW5nIHdlDQorOzs7IGFyZSBob3BpbmcgdG8gbWF0Y2ggaXQgdXAgd2l0aC4gSW4gYWN0dWFsaXR5LCBlc2kgYW5kIGVkaSBhcmUNCis7OzsgYm90aCBwb2ludGVkIChNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikgYnl0ZXMgYWhlYWQsIGFuZCBlZHggaXMNCis7OzsgaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuDQorDQorCQltb3YJZXNpLCBbd2luZG93XQ0KKwkJbW92CWVkaSwgW3NjYW5dDQorCQlhZGQJZXNpLCBlY3gNCisJCW1vdgllYXgsIFtzY2FuYWxpZ25dDQorCQltb3YJZWR4LCAwZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQ0KKwkJbGVhCWVkaSwgW2VkaSArIGVheCArIDAxMDhoXSA7TUFYX01BVENIXzhdDQorCQlsZWEJZXNpLCBbZXNpICsgZWF4ICsgMDEwOGhdIDtNQVhfTUFUQ0hfOF0NCisNCis7OzsgVGVzdCB0aGUgc3RyaW5ncyBmb3IgZXF1YWxpdHksIDggYnl0ZXMgYXQgYSB0aW1lLiBBdCB0aGUgZW5kLA0KKzs7OyBhZGp1c3QgZWR4IHNvIHRoYXQgaXQgaXMgb2Zmc2V0IHRvIHRoZSBleGFjdCBieXRlIHRoYXQgbWlzbWF0Y2hlZC4NCis7OzsNCis7OzsgV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlDQorOzs7IHN0cmluZ3MgbWF0Y2ggZWFjaCBvdGhlciwgYW5kIHRoZXkgY2FuIGJlIHNhZmVseSBwYXNzZWQgb3ZlciBiZWZvcmUNCis7Ozsgc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zDQorOzs7IGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgZWRpDQorOzs7IHBvaW50ZXIuIChlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikNCis7OzsNCis7OzsgSXQgc2hvdWxkIGJlIGNvbmZlc3NlZCB0aGF0IHRoaXMgbG9vcCB1c3VhbGx5IGRvZXMgbm90IHJlcHJlc2VudA0KKzs7OyBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQ0KKzs7OyBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUNCis7OzsgcGVyZm9ybWFuY2UuDQorDQorTG9vcENtcHM6DQorCQltb3YJZWF4LCBbZXNpICsgZWR4XQ0KKwkJeG9yCWVheCwgW2VkaSArIGVkeF0NCisJCWpueglMZWF2ZUxvb3BDbXBzDQorCQltb3YJZWF4LCBbZXNpICsgZWR4ICsgNF0NCisJCXhvcgllYXgsIFtlZGkgKyBlZHggKyA0XQ0KKwkJam56CUxlYXZlTG9vcENtcHM0DQorCQlhZGQJZWR4LCA4DQorCQlqbnoJTG9vcENtcHMNCisJCWptcAlzaG9ydCBMZW5NYXhpbXVtDQorTGVhdmVMb29wQ21wczQ6CWFkZAllZHgsIDQNCitMZWF2ZUxvb3BDbXBzOgl0ZXN0CWVheCwgMDAwMEZGRkZoDQorCQlqbnoJTGVuTG93ZXINCisJCWFkZAllZHgsICAyDQorCQlzaHIJZWF4LCAxNg0KK0xlbkxvd2VyOglzdWIJYWwsIDENCisJCWFkYwllZHgsIDANCisNCis7OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsDQorOzs7IHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLg0KKw0KKwkJbGVhCWVheCwgW2VkaSArIGVkeF0NCisJCW1vdgllZGksIFtzY2FuXQ0KKwkJc3ViCWVheCwgZWRpDQorCQljbXAJZWF4LCBNQVhfTUFUQ0gNCisJCWpnZQlMZW5NYXhpbXVtDQorDQorOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQ0KKzs7OyBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuDQorDQorCQltb3YJZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KKwkJbW92CWVieCwgW2Jlc3RsZW5dDQorCQljbXAJZWF4LCBlYngNCisJCWpnCUxvbmdlck1hdGNoDQorCQltb3YJZXNpLCBbd2luZG93YmVzdGxlbl0NCisJCW1vdgllZGksIFtlZHggKyBkc1ByZXZdDQorCQltb3YJZWJ4LCBbc2NhbmVuZF0NCisJCW1vdgllZHgsIFtjaGFpbmxlbndtYXNrXQ0KKwkJam1wCUxvb2t1cExvb3ANCisNCis7OzsgICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsNCis7OzsgICAgICAgICBiZXN0X2xlbiA9IGxlbjsNCis7OzsgICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOw0KKzs7OyAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsNCisNCitMb25nZXJNYXRjaDoJbW92CWVieCwgW25pY2VtYXRjaF0NCisJCW1vdglbYmVzdGxlbl0sIGVheA0KKwkJbW92CVtlZHggKyBkc01hdGNoU3RhcnRdLCBlY3gNCisJCWNtcAllYXgsIGVieA0KKwkJamdlCUxlYXZlTm93DQorCQltb3YJZXNpLCBbd2luZG93XQ0KKwkJYWRkCWVzaSwgZWF4DQorCQltb3YJW3dpbmRvd2Jlc3RsZW5dLCBlc2kNCisJCW1vdnp4CWVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdDQorCQltb3YJZWRpLCBbZWR4ICsgZHNQcmV2XQ0KKwkJbW92CVtzY2FuZW5kXSwgZWJ4DQorCQltb3YJZWR4LCBbY2hhaW5sZW53bWFza10NCisJCWptcAlMb29rdXBMb29wDQorDQorOzs7IEFjY2VwdCB0aGUgY3VycmVudCBzdHJpbmcsIHdpdGggdGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoLg0KKw0KK0xlbk1heGltdW06CW1vdgllZHgsIFtkZWZsYXRlc3RhdGVdDQorCQltb3YJZHdvcmQgcHRyIFtiZXN0bGVuXSwgTUFYX01BVENIDQorCQltb3YJW2VkeCArIGRzTWF0Y2hTdGFydF0sIGVjeA0KKw0KKzs7OyBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47DQorOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7DQorDQorTGVhdmVOb3c6DQorCQltb3YJZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KKwkJbW92CWVieCwgW2Jlc3RsZW5dDQorCQltb3YJZWF4LCBbZWR4ICsgZHNMb29rYWhlYWRdDQorCQljbXAJZWJ4LCBlYXgNCisJCWpnCUxvb2thaGVhZFJldA0KKwkJbW92CWVheCwgZWJ4DQorTG9va2FoZWFkUmV0Og0KKw0KKzs7OyBSZXN0b3JlIHRoZSBzdGFjayBhbmQgcmV0dXJuIGZyb20gd2hlbmNlIHdlIGNhbWUuDQorDQorCQlhZGQJZXNwLCBMb2NhbFZhcnNTaXplDQorCQlwb3AJZWJ4DQorCQlwb3AJZXNpDQorCQlwb3AJZWRpDQorCQlwb3AJZWJwDQorDQorCQlyZXQNCis7IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQ0KKzsgWW91ciBhcmUgZnJlZSB1c2UgZ3ZtYXQzMiBpbiBhbnkgZnJlIG9yIGNvbW1lcmNpYWwgYXBwcyBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSENCisgICAgICAgIGRiICAgICAwZGgsMGFoLCJhc202ODYgd2l0aCBtYXNtLCBjb2RlIG9wdGltaXNlZCBhc3NlbWJseSBjb2RlIGZyb20gQnJpYW4gUmFpdGVyLCB3cml0dGVuIDE5OTgiLDBkaCwwYWgNCisNCitJRkRFRiBOT1VOREVSTElORQ0KK2xvbmdlc3RfbWF0Y2hfNjg2ICAgZW5kcA0KK0VMU0UNCitfbG9uZ2VzdF9tYXRjaF82ODYgIGVuZHANCitFTkRJRg0KKw0KK19URVhUICAgZW5kcw0KK2VuZA0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL2d2bWF0MzIub2JqIGIvY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIvZ3ZtYXQzMi5vYmoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyZjg1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL2d2bWF0MzIub2JqCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL2d2bWF0MzJjLmMgYi9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9ndm1hdDMyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmUxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9ndm1hdDMyYy5jCkBAIC0wLDAgKzEsMjA5IEBACisvKiBndm1hdDMyLmMgLS0gQyBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODYNCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBHaWxsZXMgVm9sbGFudC4NCisgKiBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gNCisgKiAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYw0KKyAqICBpdCBwcmVwYXJlIGFsbCBwYXJhbWV0ZXJzIGFuZCBjYWxsIHRoZSBhc3NlbWJseSBsb25nZXN0X21hdGNoX2d2YXNtDQorICogIGxvbmdlc3RfbWF0Y2ggZXhlY3V0ZSBzdGFuZGFyZCBDIGNvZGUgaXMgd21hc2sgIT0gMHg3ZmZmDQorICogICAgIChhc3NlbWJseSBjb2RlIGlzIGZhc3RlciB3aXRoIGEgZml4ZWQgd21hc2spDQorICoNCisgKi8NCisNCisjaW5jbHVkZSAiZGVmbGF0ZS5oIg0KKw0KKyN1bmRlZiBGQVINCisvLyNpbmNsdWRlIDx3aW5kb3dzLmg+DQorDQorI2lmZGVmIEFTTVYNCisjZGVmaW5lIE5JTCAwDQorDQorI2RlZmluZSBVTkFMSUdORURfT0sNCisNCisNCisvKiBpZiB5b3VyIEMgY29tcGlsZXIgZG9uJ3QgYWRkIHVuZGVybGluZSBiZWZvcmUgZnVuY3Rpb24gbmFtZSwNCisgICAgICAgIGRlZmluZSBBRERfVU5ERVJMSU5FX0FTTUZVTkMgKi8NCisjaWZkZWYgQUREX1VOREVSTElORV9BU01GVU5DDQorI2RlZmluZSBsb25nZXN0X21hdGNoXzdmZmYgX2xvbmdlc3RfbWF0Y2hfN2ZmZg0KKyNkZWZpbmUgbG9uZ2VzdF9tYXRjaF82ODYgIF9sb25nZXN0X21hdGNoXzY4Ng0KKyNkZWZpbmUgY3B1ZGV0ZWN0MzIgICAgICAgIF9jcHVkZXRlY3QzMg0KKyNlbmRpZg0KKw0KKw0KKw0KK3ZvaWQgbWF0Y2hfaW5pdCgpDQorew0KK30NCisNCit1bnNpZ25lZCBsb25nIGNwdWRldGVjdDMyKCk7DQorDQordUludCBsb25nZXN0X21hdGNoX2MoDQorICAgIGRlZmxhdGVfc3RhdGUgKnMsDQorICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisNCisNCit1SW50IGxvbmdlc3RfbWF0Y2hfN2ZmZigNCisgICAgZGVmbGF0ZV9zdGF0ZSAqcywNCisgICAgSVBvcyBjdXJfbWF0Y2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLw0KKw0KK3VJbnQgbG9uZ2VzdF9tYXRjaF82ODYoDQorICAgIGRlZmxhdGVfc3RhdGUgKnMsDQorICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisNCit1SW50IGxvbmdlc3RfbWF0Y2goDQorICAgIGRlZmxhdGVfc3RhdGUgKnMsDQorICAgIElQb3MgY3VyX21hdGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLw0KK3sNCisgICAgc3RhdGljIHVJbnQgaUlzUFBybz0yOw0KKw0KKyAgICBpZiAoKHMtPndfbWFzayA9PSAweDdmZmYpICYmIChpSXNQUHJvPT0wKSkNCisgICAgICAgIHJldHVybiBsb25nZXN0X21hdGNoXzdmZmYocyxjdXJfbWF0Y2gpOw0KKw0KKyAgICBpZiAoaUlzUFBybz09MSkNCisgICAgICAgIHJldHVybiBsb25nZXN0X21hdGNoXzY4NihzLGN1cl9tYXRjaCk7DQorDQorICAgIGlmIChpSXNQUHJvPT0yKQ0KKyAgICAgICAgaUlzUFBybyA9ICgoKGNwdWRldGVjdDMyKCkvMHgxMDApJjB4Zik+PTYpID8gMSA6IDA7DQorDQorICAgIHJldHVybiBsb25nZXN0X21hdGNoX2MocyxjdXJfbWF0Y2gpOw0KK30NCisNCisNCisNCit1SW50IGxvbmdlc3RfbWF0Y2hfYyhzLCBjdXJfbWF0Y2gpDQorICAgIGRlZmxhdGVfc3RhdGUgKnM7DQorICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLw0KK3sNCisgICAgdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi8NCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi8NCisgICAgcmVnaXN0ZXIgQnl0ZWYgKm1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi8NCisgICAgcmVnaXN0ZXIgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLw0KKyAgICBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLw0KKyAgICBpbnQgbmljZV9tYXRjaCA9IHMtPm5pY2VfbWF0Y2g7ICAgICAgICAgICAgIC8qIHN0b3AgaWYgbWF0Y2ggbG9uZyBlbm91Z2ggKi8NCisgICAgSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPw0KKyAgICAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsNCisgICAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSwNCisgICAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC4NCisgICAgICovDQorICAgIFBvc2YgKnByZXYgPSBzLT5wcmV2Ow0KKyAgICB1SW50IHdtYXNrID0gcy0+d19tYXNrOw0KKw0KKyNpZmRlZiBVTkFMSUdORURfT0sNCisgICAgLyogQ29tcGFyZSB0d28gYnl0ZXMgYXQgYSB0aW1lLiBOb3RlOiB0aGlzIGlzIG5vdCBhbHdheXMgYmVuZWZpY2lhbC4NCisgICAgICogVHJ5IHdpdGggYW5kIHdpdGhvdXQgLURVTkFMSUdORURfT0sgdG8gY2hlY2suDQorICAgICAqLw0KKyAgICByZWdpc3RlciBCeXRlZiAqc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0ggLSAxOw0KKyAgICByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsNCisgICAgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKyNlbHNlDQorICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsNCisgICAgcmVnaXN0ZXIgQnl0ZSBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsNCisgICAgcmVnaXN0ZXIgQnl0ZSBzY2FuX2VuZCAgID0gc2NhbltiZXN0X2xlbl07DQorI2VuZGlmDQorDQorICAgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2Lg0KKyAgICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5Lg0KKyAgICAgKi8NCisgICAgQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsICJDb2RlIHRvbyBjbGV2ZXIiKTsNCisNCisgICAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi8NCisgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsNCisgICAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsNCisgICAgfQ0KKyAgICAvKiBEbyBub3QgbG9vayBmb3IgbWF0Y2hlcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuIFRoaXMgaXMgbmVjZXNzYXJ5DQorICAgICAqIHRvIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljLg0KKyAgICAgKi8NCisgICAgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQorDQorICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOw0KKw0KKyAgICBkbyB7DQorICAgICAgICBBc3NlcnQoY3VyX21hdGNoIDwgcy0+c3Ryc3RhcnQsICJubyBmdXR1cmUiKTsNCisgICAgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOw0KKw0KKyAgICAgICAgLyogU2tpcCB0byBuZXh0IG1hdGNoIGlmIHRoZSBtYXRjaCBsZW5ndGggY2Fubm90IGluY3JlYXNlDQorICAgICAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyOg0KKyAgICAgICAgICovDQorI2lmIChkZWZpbmVkKFVOQUxJR05FRF9PSykgJiYgTUFYX01BVENIID09IDI1OCkNCisgICAgICAgIC8qIFRoaXMgY29kZSBhc3N1bWVzIHNpemVvZih1bnNpZ25lZCBzaG9ydCkgPT0gMi4gRG8gbm90IHVzZQ0KKyAgICAgICAgICogVU5BTElHTkVEX09LIGlmIHlvdXIgY29tcGlsZXIgdXNlcyBhIGRpZmZlcmVudCBzaXplLg0KKyAgICAgICAgICovDQorICAgICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwNCisgICAgICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOw0KKw0KKyAgICAgICAgLyogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXkgYXJlDQorICAgICAgICAgKiBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQgdGhlIGhhc2gga2V5cw0KKyAgICAgICAgICogYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LiBDb21wYXJlIDIgYnl0ZXMgYXQgYSB0aW1lIGF0DQorICAgICAgICAgKiBzdHJzdGFydCszLCArNSwgLi4uIHVwIHRvIHN0cnN0YXJ0KzI1Ny4gV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudA0KKyAgICAgICAgICogbG9va2FoZWFkIG9ubHkgZXZlcnkgNHRoIGNvbXBhcmlzb247IHRoZSAxMjh0aCBjaGVjayB3aWxsIGJlIG1hZGUNCisgICAgICAgICAqIGF0IHN0cnN0YXJ0KzI1Ny4gSWYgTUFYX01BVENILTIgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgaXQgaXMNCisgICAgICAgICAqIG5lY2Vzc2FyeSB0byBwdXQgbW9yZSBndWFyZCBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3csIG9yDQorICAgICAgICAgKiB0byBjaGVjayBtb3JlIG9mdGVuIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLg0KKyAgICAgICAgICovDQorICAgICAgICBBc3NlcnQoc2NhblsyXSA9PSBtYXRjaFsyXSwgInNjYW5bMl0/Iik7DQorICAgICAgICBzY2FuKyssIG1hdGNoKys7DQorICAgICAgICBkbyB7DQorICAgICAgICB9IHdoaWxlICgqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYNCisgICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJg0KKyAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmDQorICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYNCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOw0KKyAgICAgICAgLyogVGhlIGZ1bm55ICJkbyB7fSIgZ2VuZXJhdGVzIGJldHRlciBjb2RlIG9uIG1vc3QgY29tcGlsZXJzICovDQorDQorICAgICAgICAvKiBIZXJlLCBzY2FuIDw9IHdpbmRvdytzdHJzdGFydCsyNTcgKi8NCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7DQorICAgICAgICBpZiAoKnNjYW4gPT0gKm1hdGNoKSBzY2FuKys7DQorDQorICAgICAgICBsZW4gPSAoTUFYX01BVENIIC0gMSkgLSAoaW50KShzdHJlbmQtc2Nhbik7DQorICAgICAgICBzY2FuID0gc3RyZW5kIC0gKE1BWF9NQVRDSC0xKTsNCisNCisjZWxzZSAvKiBVTkFMSUdORURfT0sgKi8NCisNCisgICAgICAgIGlmIChtYXRjaFtiZXN0X2xlbl0gICAhPSBzY2FuX2VuZCAgfHwNCisgICAgICAgICAgICBtYXRjaFtiZXN0X2xlbi0xXSAhPSBzY2FuX2VuZDEgfHwNCisgICAgICAgICAgICAqbWF0Y2ggICAgICAgICAgICAhPSAqc2NhbiAgICAgfHwNCisgICAgICAgICAgICAqKyttYXRjaCAgICAgICAgICAhPSBzY2FuWzFdKSAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICAgICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUNCisgICAgICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pDQorICAgICAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQ0KKyAgICAgICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdA0KKyAgICAgICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguDQorICAgICAgICAgKi8NCisgICAgICAgIHNjYW4gKz0gMiwgbWF0Y2grKzsNCisgICAgICAgIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsICJtYXRjaFsyXT8iKTsNCisNCisgICAgICAgIC8qIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgZXZlcnkgOHRoIGNvbXBhcmlzb247DQorICAgICAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC4NCisgICAgICAgICAqLw0KKyAgICAgICAgZG8gew0KKyAgICAgICAgfSB3aGlsZSAoKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmDQorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYNCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJg0KKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmDQorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsNCisNCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7DQorDQorICAgICAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsNCisgICAgICAgIHNjYW4gPSBzdHJlbmQgLSBNQVhfTUFUQ0g7DQorDQorI2VuZGlmIC8qIFVOQUxJR05FRF9PSyAqLw0KKw0KKyAgICAgICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7DQorICAgICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7DQorICAgICAgICAgICAgYmVzdF9sZW4gPSBsZW47DQorICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsNCisjaWZkZWYgVU5BTElHTkVEX09LDQorICAgICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKyNlbHNlDQorICAgICAgICAgICAgc2Nhbl9lbmQxICA9IHNjYW5bYmVzdF9sZW4tMV07DQorICAgICAgICAgICAgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOw0KKyNlbmRpZg0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQNCisgICAgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7DQorDQorICAgIGlmICgodUludCliZXN0X2xlbiA8PSBzLT5sb29rYWhlYWQpIHJldHVybiAodUludCliZXN0X2xlbjsNCisgICAgcmV0dXJuIHMtPmxvb2thaGVhZDsNCit9DQorDQorI2VuZGlmIC8qIEFTTVYgKi8NCmRpZmYgLS1naXQgYS9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9pbmZmYXN0QXNtLmFzbSBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL2luZmZhc3RBc20uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjZhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9pbmZmYXN0QXNtLmFzbQpAQCAtMCwwICsxLDEwMjAgQEAKKzsgNzUgImluZmZhc3QuUyINCis7RklMRSAiaW5mZmFzdC5TIg0KKw0KKzs7O0dMT0JBTCBfaW5mbGF0ZV9mYXN0DQorDQorOzs7U0VDVElPTiAudGV4dA0KKw0KKw0KKw0KKyAgICAuNTg2cA0KKyAgICAubW14DQorDQorICAgIG5hbWUgICAgaW5mbGF0ZV9mYXN0X3g4Ng0KKyAgICAuTU9ERUwgIEZMQVQNCisNCitfREFUQSAgICAgICAgICAgICAgICAgICBzZWdtZW50DQoraW5mbGF0ZV9mYXN0X3VzZV9tbXg6IA0KK2RkICAgIDENCisNCisNCitfVEVYVCAgICAgICAgICAgICAgICAgICBzZWdtZW50DQorUFVCTElDIF9pbmZsYXRlX2Zhc3QNCisNCitBTElHTiA0DQorX2luZmxhdGVfZmFzdDogDQorICAgICAgICBqbXAgaW5mbGF0ZV9mYXN0X2VudHJ5DQorDQorDQorDQorQUxJR04gNA0KKyAgICAgICAgZGIgICAgICdGYXN0IGRlY29kaW5nIENvZGUgZnJvbSBDaHJpcyBBbmRlcnNvbicNCisgICAgICAgIGRiICAgICAgMA0KKw0KK0FMSUdOIDQNCitpbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnOiANCisgICAgICAgIGRiICAgICAgJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZScNCisgICAgICAgIGRiICAgICAgMA0KKw0KK0FMSUdOIDQNCitpbnZhbGlkX2Rpc3RhbmNlX2NvZGVfbXNnOiANCisgICAgICAgIGRiICAgICAgJ2ludmFsaWQgZGlzdGFuY2UgY29kZScNCisgICAgICAgIGRiICAgICAgMA0KKw0KK0FMSUdOIDQNCitpbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnOiANCisgICAgICAgIGRiICAgICAgJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJw0KKyAgICAgICAgZGIgICAgICAwDQorDQorDQorQUxJR04gNA0KK2luZmxhdGVfZmFzdF9tYXNrOiANCitkZCAgICAwDQorZGQgICAgMQ0KK2RkICAgIDMNCitkZCAgICA3DQorZGQgICAgMTUNCitkZCAgICAzMQ0KK2RkICAgIDYzDQorZGQgICAgMTI3DQorZGQgICAgMjU1DQorZGQgICAgNTExDQorZGQgICAgMTAyMw0KK2RkICAgIDIwNDcNCitkZCAgICA0MDk1DQorZGQgICAgODE5MQ0KK2RkICAgIDE2MzgzDQorZGQgICAgMzI3NjcNCitkZCAgICA2NTUzNQ0KK2RkICAgIDEzMTA3MQ0KK2RkICAgIDI2MjE0Mw0KK2RkICAgIDUyNDI4Nw0KK2RkICAgIDEwNDg1NzUNCitkZCAgICAyMDk3MTUxDQorZGQgICAgNDE5NDMwMw0KK2RkICAgIDgzODg2MDcNCitkZCAgICAxNjc3NzIxNQ0KK2RkICAgIDMzNTU0NDMxDQorZGQgICAgNjcxMDg4NjMNCitkZCAgICAxMzQyMTc3MjcNCitkZCAgICAyNjg0MzU0NTUNCitkZCAgICA1MzY4NzA5MTENCitkZCAgICAxMDczNzQxODIzDQorZGQgICAgMjE0NzQ4MzY0Nw0KK2RkICAgIDQyOTQ5NjcyOTUNCisNCisNCis7O1NFQ1RJT04gLnRleHQNCis7IDIwNSAiaW5mZmFzdC5TIg0KKztHTE9CQUwgaW5mbGF0ZV9mYXN0X3VzZV9tbXgNCisNCis7U0VDVElPTiAuZGF0YQ0KKw0KKw0KKzsgR0xPQkFMIGluZmxhdGVfZmFzdF91c2VfbW14Om9iamVjdA0KKzsuc2l6ZSBpbmZsYXRlX2Zhc3RfdXNlX21teCwgNA0KKzsgMjI2ICJpbmZmYXN0LlMiDQorO1NFQ1RJT04gLnRleHQNCisNCitBTElHTiA0IA0KK2luZmxhdGVfZmFzdF9lbnRyeTogDQorICAgICAgICBwdXNoICBlZGkNCisgICAgICAgIHB1c2ggIGVzaQ0KKyAgICAgICAgcHVzaCAgZWJwDQorICAgICAgICBwdXNoICBlYngNCisgICAgICAgIHB1c2hmZA0KKyAgICAgICAgc3ViICBlc3AsNjQNCisgICAgICAgIGNsZA0KKw0KKw0KKw0KKw0KKyAgICAgICAgbW92ICBlc2ksIFtlc3ArODhdDQorICAgICAgICBtb3YgIGVkaSwgW2VzaSsyOF0NCisNCisNCisNCisNCisNCisNCisNCisgICAgICAgIG1vdiAgZWR4LCBbZXNpKzRdDQorICAgICAgICBtb3YgIGVheCwgW2VzaSswXQ0KKw0KKyAgICAgICAgYWRkICBlZHgsZWF4DQorICAgICAgICBzdWIgIGVkeCwxMQ0KKw0KKyAgICAgICAgbW92ICBbZXNwKzQ0XSxlYXgNCisgICAgICAgIG1vdiAgW2VzcCsyMF0sZWR4DQorDQorICAgICAgICBtb3YgIGVicCwgW2VzcCs5Ml0NCisgICAgICAgIG1vdiAgZWN4LCBbZXNpKzE2XQ0KKyAgICAgICAgbW92ICBlYngsIFtlc2krMTJdDQorDQorICAgICAgICBzdWIgIGVicCxlY3gNCisgICAgICAgIG5lZyAgZWJwDQorICAgICAgICBhZGQgIGVicCxlYngNCisNCisgICAgICAgIHN1YiAgZWN4LDI1Nw0KKyAgICAgICAgYWRkICBlY3gsZWJ4DQorDQorICAgICAgICBtb3YgIFtlc3ArNjBdLGVieA0KKyAgICAgICAgbW92ICBbZXNwKzQwXSxlYnANCisgICAgICAgIG1vdiAgW2VzcCsxNl0sZWN4DQorOyAyODUgImluZmZhc3QuUyINCisgICAgICAgIG1vdiAgZWF4LCBbZWRpKzY0XQ0KKyAgICAgICAgbW92ICBlY3gsIFtlZGkrNjhdDQorDQorICAgICAgICBtb3YgIFtlc3ArOF0sZWF4DQorICAgICAgICBtb3YgIFtlc3ArMTJdLGVjeA0KKw0KKyAgICAgICAgbW92ICBlYXgsMQ0KKyAgICAgICAgbW92ICBlY3gsIFtlZGkrNzJdDQorICAgICAgICBzaGwgIGVheCxjbA0KKyAgICAgICAgZGVjICBlYXgNCisgICAgICAgIG1vdiAgW2VzcCswXSxlYXgNCisNCisgICAgICAgIG1vdiAgZWF4LDENCisgICAgICAgIG1vdiAgZWN4LCBbZWRpKzc2XQ0KKyAgICAgICAgc2hsICBlYXgsY2wNCisgICAgICAgIGRlYyAgZWF4DQorICAgICAgICBtb3YgIFtlc3ArNF0sZWF4DQorDQorICAgICAgICBtb3YgIGVheCwgW2VkaSszMl0NCisgICAgICAgIG1vdiAgZWN4LCBbZWRpKzM2XQ0KKyAgICAgICAgbW92ICBlZHgsIFtlZGkrNDBdDQorDQorICAgICAgICBtb3YgIFtlc3ArNTJdLGVheA0KKyAgICAgICAgbW92ICBbZXNwKzQ4XSxlY3gNCisgICAgICAgIG1vdiAgW2VzcCs1Nl0sZWR4DQorDQorICAgICAgICBtb3YgIGVicCwgW2VkaSs0NF0NCisgICAgICAgIG1vdiAgZWJ4LCBbZWRpKzQ4XQ0KKzsgMzIxICJpbmZmYXN0LlMiDQorICAgICAgICBtb3YgIGVzaSwgW2VzcCs0NF0NCisgICAgICAgIG1vdiAgZWN4LCBbZXNwKzIwXQ0KKyAgICAgICAgY21wICBlY3gsZXNpDQorICAgICAgICBqYSAgIExfYWxpZ25fbG9uZw0KKw0KKyAgICAgICAgYWRkICBlY3gsMTENCisgICAgICAgIHN1YiAgZWN4LGVzaQ0KKyAgICAgICAgbW92ICBlYXgsMTINCisgICAgICAgIHN1YiAgZWF4LGVjeA0KKyAgICAgICAgbGVhICBlZGksIFtlc3ArMjhdDQorICAgICAgICByZXAgbW92c2INCisgICAgICAgIG1vdiAgZWN4LGVheA0KKyAgICAgICAgeG9yICBlYXgsZWF4DQorICAgICAgICByZXAgc3Rvc2INCisgICAgICAgIGxlYSAgZXNpLCBbZXNwKzI4XQ0KKyAgICAgICAgbW92ICBbZXNwKzIwXSxlc2kNCisgICAgICAgIGptcCAgTF9pc19hbGlnbmVkDQorDQorDQorTF9hbGlnbl9sb25nOiANCisgICAgICAgIHRlc3QgIGVzaSwzDQorICAgICAgICBqeiAgIExfaXNfYWxpZ25lZA0KKyAgICAgICAgeG9yICBlYXgsZWF4DQorICAgICAgICBtb3YgIGFsLCBbZXNpXQ0KKyAgICAgICAgaW5jICBlc2kNCisgICAgICAgIG1vdiAgZWN4LGVieA0KKyAgICAgICAgYWRkICBlYngsOA0KKyAgICAgICAgc2hsICBlYXgsY2wNCisgICAgICAgIG9yICBlYnAsZWF4DQorICAgICAgICBqbXAgTF9hbGlnbl9sb25nDQorDQorTF9pc19hbGlnbmVkOiANCisgICAgICAgIG1vdiAgZWRpLCBbZXNwKzYwXQ0KKzsgMzY2ICJpbmZmYXN0LlMiDQorTF9jaGVja19tbXg6IA0KKyAgICAgICAgY21wICBkd29yZCBwdHIgW2luZmxhdGVfZmFzdF91c2VfbW14XSwyDQorICAgICAgICBqZSAgIExfaW5pdF9tbXgNCisgICAgICAgIGphICAgTF9kb19sb29wDQorDQorICAgICAgICBwdXNoICBlYXgNCisgICAgICAgIHB1c2ggIGVieA0KKyAgICAgICAgcHVzaCAgZWN4DQorICAgICAgICBwdXNoICBlZHgNCisgICAgICAgIHB1c2hmZA0KKyAgICAgICAgbW92ICBlYXgsIFtlc3BdDQorICAgICAgICB4b3IgIGR3b3JkIHB0ciBbZXNwXSwwMjAwMDAwaA0KKw0KKw0KKw0KKw0KKyAgICAgICAgcG9wZmQNCisgICAgICAgIHB1c2hmZA0KKyAgICAgICAgcG9wICBlZHgNCisgICAgICAgIHhvciAgZWR4LGVheA0KKyAgICAgICAganogICBMX2RvbnRfdXNlX21teA0KKyAgICAgICAgeG9yICBlYXgsZWF4DQorICAgICAgICBjcHVpZA0KKyAgICAgICAgY21wICBlYngsMDc1NmU2NTQ3aA0KKyAgICAgICAgam5lICBMX2RvbnRfdXNlX21teA0KKyAgICAgICAgY21wICBlY3gsMDZjNjU3NDZlaA0KKyAgICAgICAgam5lICBMX2RvbnRfdXNlX21teA0KKyAgICAgICAgY21wICBlZHgsMDQ5NjU2ZTY5aA0KKyAgICAgICAgam5lICBMX2RvbnRfdXNlX21teA0KKyAgICAgICAgbW92ICBlYXgsMQ0KKyAgICAgICAgY3B1aWQNCisgICAgICAgIHNociAgZWF4LDgNCisgICAgICAgIGFuZCAgZWF4LDE1DQorICAgICAgICBjbXAgIGVheCw2DQorICAgICAgICBqbmUgIExfZG9udF91c2VfbW14DQorICAgICAgICB0ZXN0ICBlZHgsMDgwMDAwMGgNCisgICAgICAgIGpueiAgTF91c2VfbW14DQorICAgICAgICBqbXAgIExfZG9udF91c2VfbW14DQorTF91c2VfbW14OiANCisgICAgICAgIG1vdiAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMg0KKyAgICAgICAgam1wICBMX2NoZWNrX21teF9wb3ANCitMX2RvbnRfdXNlX21teDogDQorICAgICAgICBtb3YgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDMNCitMX2NoZWNrX21teF9wb3A6IA0KKyAgICAgICAgcG9wICBlZHgNCisgICAgICAgIHBvcCAgZWN4DQorICAgICAgICBwb3AgIGVieA0KKyAgICAgICAgcG9wICBlYXgNCisgICAgICAgIGptcCAgTF9jaGVja19tbXgNCis7IDQyNiAiaW5mZmFzdC5TIg0KK0FMSUdOIDQNCitMX2RvX2xvb3A6IA0KKzsgNDM3ICJpbmZmYXN0LlMiDQorICAgICAgICBjbXAgIGJsLDE1DQorICAgICAgICBqYSAgIExfZ2V0X2xlbmd0aF9jb2RlDQorDQorICAgICAgICB4b3IgIGVheCxlYXgNCisgICAgICAgIGxvZHN3DQorICAgICAgICBtb3YgIGNsLGJsDQorICAgICAgICBhZGQgIGJsLDE2DQorICAgICAgICBzaGwgIGVheCxjbA0KKyAgICAgICAgb3IgIGVicCxlYXgNCisNCitMX2dldF9sZW5ndGhfY29kZTogDQorICAgICAgICBtb3YgIGVkeCwgW2VzcCswXQ0KKyAgICAgICAgbW92ICBlY3gsIFtlc3ArOF0NCisgICAgICAgIGFuZCAgZWR4LGVicA0KKyAgICAgICAgbW92ICBlYXgsIFtlY3grZWR4KjRdDQorDQorTF9kb2xlbjogDQorDQorDQorDQorDQorDQorDQorICAgICAgICBtb3YgIGNsLGFoDQorICAgICAgICBzdWIgIGJsLGFoDQorICAgICAgICBzaHIgIGVicCxjbA0KKw0KKw0KKw0KKw0KKw0KKw0KKyAgICAgICAgdGVzdCAgYWwsYWwNCisgICAgICAgIGpueiAgIExfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UNCisNCisgICAgICAgIHNociAgZWF4LDE2DQorICAgICAgICBzdG9zYg0KKw0KK0xfd2hpbGVfdGVzdDogDQorDQorDQorICAgICAgICBjbXAgIFtlc3ArMTZdLGVkaQ0KKyAgICAgICAgamJlICBMX2JyZWFrX2xvb3ANCisNCisgICAgICAgIGNtcCAgW2VzcCsyMF0sZXNpDQorICAgICAgICBqYSAgIExfZG9fbG9vcA0KKyAgICAgICAgam1wICBMX2JyZWFrX2xvb3ANCisNCitMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlOiANCis7IDUwMiAiaW5mZmFzdC5TIg0KKyAgICAgICAgbW92ICBlZHgsZWF4DQorICAgICAgICBzaHIgIGVkeCwxNg0KKyAgICAgICAgbW92ICBjbCxhbA0KKw0KKyAgICAgICAgdGVzdCAgYWwsMTYNCisgICAgICAgIGp6ICAgTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoDQorICAgICAgICBhbmQgIGNsLDE1DQorICAgICAgICBqeiAgIExfc2F2ZV9sZW4NCisgICAgICAgIGNtcCAgYmwsY2wNCisgICAgICAgIGphZSAgTF9hZGRfYml0c190b19sZW4NCisNCisgICAgICAgIG1vdiAgY2gsY2wNCisgICAgICAgIHhvciAgZWF4LGVheA0KKyAgICAgICAgbG9kc3cNCisgICAgICAgIG1vdiAgY2wsYmwNCisgICAgICAgIGFkZCAgYmwsMTYNCisgICAgICAgIHNobCAgZWF4LGNsDQorICAgICAgICBvciAgZWJwLGVheA0KKyAgICAgICAgbW92ICBjbCxjaA0KKw0KK0xfYWRkX2JpdHNfdG9fbGVuOiANCisgICAgICAgIG1vdiAgZWF4LDENCisgICAgICAgIHNobCAgZWF4LGNsDQorICAgICAgICBkZWMgIGVheA0KKyAgICAgICAgc3ViICBibCxjbA0KKyAgICAgICAgYW5kICBlYXgsZWJwDQorICAgICAgICBzaHIgIGVicCxjbA0KKyAgICAgICAgYWRkICBlZHgsZWF4DQorDQorTF9zYXZlX2xlbjogDQorICAgICAgICBtb3YgIFtlc3ArMjRdLGVkeA0KKw0KKw0KK0xfZGVjb2RlX2Rpc3RhbmNlOiANCis7IDU0OSAiaW5mZmFzdC5TIg0KKyAgICAgICAgY21wICBibCwxNQ0KKyAgICAgICAgamEgICBMX2dldF9kaXN0YW5jZV9jb2RlDQorDQorICAgICAgICB4b3IgIGVheCxlYXgNCisgICAgICAgIGxvZHN3DQorICAgICAgICBtb3YgIGNsLGJsDQorICAgICAgICBhZGQgIGJsLDE2DQorICAgICAgICBzaGwgIGVheCxjbA0KKyAgICAgICAgb3IgIGVicCxlYXgNCisNCitMX2dldF9kaXN0YW5jZV9jb2RlOiANCisgICAgICAgIG1vdiAgZWR4LCBbZXNwKzRdDQorICAgICAgICBtb3YgIGVjeCwgW2VzcCsxMl0NCisgICAgICAgIGFuZCAgZWR4LGVicA0KKyAgICAgICAgbW92ICBlYXgsIFtlY3grZWR4KjRdDQorDQorDQorTF9kb2Rpc3Q6IA0KKyAgICAgICAgbW92ICBlZHgsZWF4DQorICAgICAgICBzaHIgIGVkeCwxNg0KKyAgICAgICAgbW92ICBjbCxhaA0KKyAgICAgICAgc3ViICBibCxhaA0KKyAgICAgICAgc2hyICBlYnAsY2wNCis7IDU4NCAiaW5mZmFzdC5TIg0KKyAgICAgICAgbW92ICBjbCxhbA0KKw0KKyAgICAgICAgdGVzdCAgYWwsMTYNCisgICAgICAgIGp6ICBMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0DQorICAgICAgICBhbmQgIGNsLDE1DQorICAgICAgICBqeiAgTF9jaGVja19kaXN0X29uZQ0KKyAgICAgICAgY21wICBibCxjbA0KKyAgICAgICAgamFlICBMX2FkZF9iaXRzX3RvX2Rpc3QNCisNCisgICAgICAgIG1vdiAgY2gsY2wNCisgICAgICAgIHhvciAgZWF4LGVheA0KKyAgICAgICAgbG9kc3cNCisgICAgICAgIG1vdiAgY2wsYmwNCisgICAgICAgIGFkZCAgYmwsMTYNCisgICAgICAgIHNobCAgZWF4LGNsDQorICAgICAgICBvciAgZWJwLGVheA0KKyAgICAgICAgbW92ICBjbCxjaA0KKw0KK0xfYWRkX2JpdHNfdG9fZGlzdDogDQorICAgICAgICBtb3YgIGVheCwxDQorICAgICAgICBzaGwgIGVheCxjbA0KKyAgICAgICAgZGVjICBlYXgNCisgICAgICAgIHN1YiAgYmwsY2wNCisgICAgICAgIGFuZCAgZWF4LGVicA0KKyAgICAgICAgc2hyICBlYnAsY2wNCisgICAgICAgIGFkZCAgZWR4LGVheA0KKyAgICAgICAgam1wICBMX2NoZWNrX3dpbmRvdw0KKw0KK0xfY2hlY2tfd2luZG93OiANCis7IDYyNSAiaW5mZmFzdC5TIg0KKyAgICAgICAgbW92ICBbZXNwKzQ0XSxlc2kNCisgICAgICAgIG1vdiAgZWF4LGVkaQ0KKyAgICAgICAgc3ViICBlYXgsIFtlc3ArNDBdDQorDQorICAgICAgICBjbXAgIGVheCxlZHgNCisgICAgICAgIGpiICAgTF9jbGlwX3dpbmRvdw0KKw0KKyAgICAgICAgbW92ICBlY3gsIFtlc3ArMjRdDQorICAgICAgICBtb3YgIGVzaSxlZGkNCisgICAgICAgIHN1YiAgZXNpLGVkeA0KKw0KKyAgICAgICAgc3ViICBlY3gsMw0KKyAgICAgICAgbW92ICBhbCwgW2VzaV0NCisgICAgICAgIG1vdiAgW2VkaV0sYWwNCisgICAgICAgIG1vdiAgYWwsIFtlc2krMV0NCisgICAgICAgIG1vdiAgZGwsIFtlc2krMl0NCisgICAgICAgIGFkZCAgZXNpLDMNCisgICAgICAgIG1vdiAgW2VkaSsxXSxhbA0KKyAgICAgICAgbW92ICBbZWRpKzJdLGRsDQorICAgICAgICBhZGQgIGVkaSwzDQorICAgICAgICByZXAgbW92c2INCisNCisgICAgICAgIG1vdiAgZXNpLCBbZXNwKzQ0XQ0KKyAgICAgICAgam1wICBMX3doaWxlX3Rlc3QNCisNCitBTElHTiA0DQorTF9jaGVja19kaXN0X29uZTogDQorICAgICAgICBjbXAgIGVkeCwxDQorICAgICAgICBqbmUgIExfY2hlY2tfd2luZG93DQorICAgICAgICBjbXAgIFtlc3ArNDBdLGVkaQ0KKyAgICAgICAgamUgIExfY2hlY2tfd2luZG93DQorDQorICAgICAgICBkZWMgIGVkaQ0KKyAgICAgICAgbW92ICBlY3gsIFtlc3ArMjRdDQorICAgICAgICBtb3YgIGFsLCBbZWRpXQ0KKyAgICAgICAgc3ViICBlY3gsMw0KKw0KKyAgICAgICAgbW92ICBbZWRpKzFdLGFsDQorICAgICAgICBtb3YgIFtlZGkrMl0sYWwNCisgICAgICAgIG1vdiAgW2VkaSszXSxhbA0KKyAgICAgICAgYWRkICBlZGksNA0KKyAgICAgICAgcmVwIHN0b3NiDQorDQorICAgICAgICBqbXAgIExfd2hpbGVfdGVzdA0KKw0KK0FMSUdOIDQNCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6IA0KKw0KKw0KKw0KKw0KKyAgICAgICAgdGVzdCAgYWwsNjQNCisgICAgICAgIGpueiAgIExfdGVzdF9mb3JfZW5kX29mX2Jsb2NrDQorDQorICAgICAgICBtb3YgIGVheCwxDQorICAgICAgICBzaGwgIGVheCxjbA0KKyAgICAgICAgZGVjICBlYXgNCisgICAgICAgIGFuZCAgZWF4LGVicA0KKyAgICAgICAgYWRkICBlYXgsZWR4DQorICAgICAgICBtb3YgIGVkeCwgW2VzcCs4XQ0KKyAgICAgICAgbW92ICBlYXgsIFtlZHgrZWF4KjRdDQorICAgICAgICBqbXAgIExfZG9sZW4NCisNCitBTElHTiA0DQorTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDogDQorDQorDQorDQorDQorICAgICAgICB0ZXN0ICBhbCw2NA0KKyAgICAgICAgam56ICAgTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUNCisNCisgICAgICAgIG1vdiAgZWF4LDENCisgICAgICAgIHNobCAgZWF4LGNsDQorICAgICAgICBkZWMgIGVheA0KKyAgICAgICAgYW5kICBlYXgsZWJwDQorICAgICAgICBhZGQgIGVheCxlZHgNCisgICAgICAgIG1vdiAgZWR4LCBbZXNwKzEyXQ0KKyAgICAgICAgbW92ICBlYXgsIFtlZHgrZWF4KjRdDQorICAgICAgICBqbXAgIExfZG9kaXN0DQorDQorQUxJR04gNCANCitMX2NsaXBfd2luZG93OiANCis7IDcyMSAiaW5mZmFzdC5TIg0KKyAgICAgICAgbW92ICBlY3gsZWF4DQorICAgICAgICBtb3YgIGVheCwgW2VzcCs1Ml0NCisgICAgICAgIG5lZyAgZWN4DQorICAgICAgICBtb3YgIGVzaSwgW2VzcCs1Nl0NCisNCisgICAgICAgIGNtcCAgZWF4LGVkeA0KKyAgICAgICAgamIgICBMX2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcg0KKw0KKyAgICAgICAgYWRkICBlY3gsZWR4DQorICAgICAgICBjbXAgIGR3b3JkIHB0ciBbZXNwKzQ4XSwwDQorICAgICAgICBqbmUgIExfd3JhcF9hcm91bmRfd2luZG93DQorDQorICAgICAgICBzdWIgIGVheCxlY3gNCisgICAgICAgIGFkZCAgZXNpLGVheA0KKzsgNzQ5ICJpbmZmYXN0LlMiDQorICAgICAgICBtb3YgIGVheCwgW2VzcCsyNF0NCisgICAgICAgIGNtcCAgZWF4LGVjeA0KKyAgICAgICAgamJlICBMX2RvX2NvcHkxDQorDQorICAgICAgICBzdWIgIGVheCxlY3gNCisgICAgICAgIHJlcCBtb3ZzYg0KKyAgICAgICAgbW92ICBlc2ksZWRpDQorICAgICAgICBzdWIgIGVzaSxlZHgNCisgICAgICAgIGptcCAgTF9kb19jb3B5MQ0KKw0KKyAgICAgICAgY21wICBlYXgsZWN4DQorICAgICAgICBqYmUgIExfZG9fY29weTENCisNCisgICAgICAgIHN1YiAgZWF4LGVjeA0KKyAgICAgICAgcmVwIG1vdnNiDQorICAgICAgICBtb3YgIGVzaSxlZGkNCisgICAgICAgIHN1YiAgZXNpLGVkeA0KKyAgICAgICAgam1wICBMX2RvX2NvcHkxDQorDQorTF93cmFwX2Fyb3VuZF93aW5kb3c6IA0KKzsgNzkzICJpbmZmYXN0LlMiDQorICAgICAgICBtb3YgIGVheCwgW2VzcCs0OF0NCisgICAgICAgIGNtcCAgZWN4LGVheA0KKyAgICAgICAgamJlICBMX2NvbnRpZ3VvdXNfaW5fd2luZG93DQorDQorICAgICAgICBhZGQgIGVzaSwgW2VzcCs1Ml0NCisgICAgICAgIGFkZCAgZXNpLGVheA0KKyAgICAgICAgc3ViICBlc2ksZWN4DQorICAgICAgICBzdWIgIGVjeCxlYXgNCisNCisNCisgICAgICAgIG1vdiAgZWF4LCBbZXNwKzI0XQ0KKyAgICAgICAgY21wICBlYXgsZWN4DQorICAgICAgICBqYmUgIExfZG9fY29weTENCisNCisgICAgICAgIHN1YiAgZWF4LGVjeA0KKyAgICAgICAgcmVwIG1vdnNiDQorICAgICAgICBtb3YgIGVzaSwgW2VzcCs1Nl0NCisgICAgICAgIG1vdiAgZWN4LCBbZXNwKzQ4XQ0KKyAgICAgICAgY21wICBlYXgsZWN4DQorICAgICAgICBqYmUgIExfZG9fY29weTENCisNCisgICAgICAgIHN1YiAgZWF4LGVjeA0KKyAgICAgICAgcmVwIG1vdnNiDQorICAgICAgICBtb3YgIGVzaSxlZGkNCisgICAgICAgIHN1YiAgZXNpLGVkeA0KKyAgICAgICAgam1wICBMX2RvX2NvcHkxDQorDQorTF9jb250aWd1b3VzX2luX3dpbmRvdzogDQorOyA4MzYgImluZmZhc3QuUyINCisgICAgICAgIGFkZCAgZXNpLGVheA0KKyAgICAgICAgc3ViICBlc2ksZWN4DQorDQorDQorICAgICAgICBtb3YgIGVheCwgW2VzcCsyNF0NCisgICAgICAgIGNtcCAgZWF4LGVjeA0KKyAgICAgICAgamJlICBMX2RvX2NvcHkxDQorDQorICAgICAgICBzdWIgIGVheCxlY3gNCisgICAgICAgIHJlcCBtb3ZzYg0KKyAgICAgICAgbW92ICBlc2ksZWRpDQorICAgICAgICBzdWIgIGVzaSxlZHgNCisNCitMX2RvX2NvcHkxOiANCis7IDg2MiAiaW5mZmFzdC5TIg0KKyAgICAgICAgbW92ICBlY3gsZWF4DQorICAgICAgICByZXAgbW92c2INCisNCisgICAgICAgIG1vdiAgZXNpLCBbZXNwKzQ0XQ0KKyAgICAgICAgam1wICBMX3doaWxlX3Rlc3QNCis7IDg3OCAiaW5mZmFzdC5TIg0KK0FMSUdOIDQNCitMX2luaXRfbW14OiANCisgICAgICAgIGVtbXMNCisNCisNCisNCisNCisNCisgICAgICAgIG1vdmQgbW0wLGVicA0KKyAgICAgICAgbW92ICBlYnAsZWJ4DQorOyA4OTYgImluZmZhc3QuUyINCisgICAgICAgIG1vdmQgbW00LFtlc3ArMF0NCisgICAgICAgIG1vdnEgbW0zLG1tNA0KKyAgICAgICAgbW92ZCBtbTUsW2VzcCs0XQ0KKyAgICAgICAgbW92cSBtbTIsbW01DQorICAgICAgICBweG9yIG1tMSxtbTENCisgICAgICAgIG1vdiAgZWJ4LCBbZXNwKzhdDQorICAgICAgICBqbXAgIExfZG9fbG9vcF9tbXgNCisNCitBTElHTiA0DQorTF9kb19sb29wX21teDogDQorICAgICAgICBwc3JscSBtbTAsbW0xDQorDQorICAgICAgICBjbXAgIGVicCwzMg0KKyAgICAgICAgamEgIExfZ2V0X2xlbmd0aF9jb2RlX21teA0KKw0KKyAgICAgICAgbW92ZCBtbTYsZWJwDQorICAgICAgICBtb3ZkIG1tNyxbZXNpXQ0KKyAgICAgICAgYWRkICBlc2ksNA0KKyAgICAgICAgcHNsbHEgbW03LG1tNg0KKyAgICAgICAgYWRkICBlYnAsMzINCisgICAgICAgIHBvciBtbTAsbW03DQorDQorTF9nZXRfbGVuZ3RoX2NvZGVfbW14OiANCisgICAgICAgIHBhbmQgbW00LG1tMA0KKyAgICAgICAgbW92ZCBlYXgsbW00DQorICAgICAgICBtb3ZxIG1tNCxtbTMNCisgICAgICAgIG1vdiAgZWF4LCBbZWJ4K2VheCo0XQ0KKw0KK0xfZG9sZW5fbW14OiANCisgICAgICAgIG1vdnp4ICBlY3gsYWgNCisgICAgICAgIG1vdmQgbW0xLGVjeA0KKyAgICAgICAgc3ViICBlYnAsZWN4DQorDQorICAgICAgICB0ZXN0ICBhbCxhbA0KKyAgICAgICAgam56IExfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VfbW14DQorDQorICAgICAgICBzaHIgIGVheCwxNg0KKyAgICAgICAgc3Rvc2INCisNCitMX3doaWxlX3Rlc3RfbW14OiANCisNCisNCisgICAgICAgIGNtcCAgW2VzcCsxNl0sZWRpDQorICAgICAgICBqYmUgTF9icmVha19sb29wDQorDQorICAgICAgICBjbXAgIFtlc3ArMjBdLGVzaQ0KKyAgICAgICAgamEgTF9kb19sb29wX21teA0KKyAgICAgICAgam1wIExfYnJlYWtfbG9vcA0KKw0KK0xfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VfbW14OiANCisNCisgICAgICAgIG1vdiAgZWR4LGVheA0KKyAgICAgICAgc2hyICBlZHgsMTYNCisNCisgICAgICAgIHRlc3QgIGFsLDE2DQorICAgICAgICBqeiAgTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoX21teA0KKyAgICAgICAgYW5kICBlYXgsMTUNCisgICAgICAgIGp6IExfZGVjb2RlX2Rpc3RhbmNlX21teA0KKw0KKyAgICAgICAgcHNybHEgbW0wLG1tMQ0KKyAgICAgICAgbW92ZCBtbTEsZWF4DQorICAgICAgICBtb3ZkIGVjeCxtbTANCisgICAgICAgIHN1YiAgZWJwLGVheA0KKyAgICAgICAgYW5kICBlY3gsIFtpbmZsYXRlX2Zhc3RfbWFzaytlYXgqNF0NCisgICAgICAgIGFkZCAgZWR4LGVjeA0KKw0KK0xfZGVjb2RlX2Rpc3RhbmNlX21teDogDQorICAgICAgICBwc3JscSBtbTAsbW0xDQorDQorICAgICAgICBjbXAgIGVicCwzMg0KKyAgICAgICAgamEgTF9nZXRfZGlzdF9jb2RlX21teA0KKw0KKyAgICAgICAgbW92ZCBtbTYsZWJwDQorICAgICAgICBtb3ZkIG1tNyxbZXNpXQ0KKyAgICAgICAgYWRkICBlc2ksNA0KKyAgICAgICAgcHNsbHEgbW03LG1tNg0KKyAgICAgICAgYWRkICBlYnAsMzINCisgICAgICAgIHBvciBtbTAsbW03DQorDQorTF9nZXRfZGlzdF9jb2RlX21teDogDQorICAgICAgICBtb3YgIGVieCwgW2VzcCsxMl0NCisgICAgICAgIHBhbmQgbW01LG1tMA0KKyAgICAgICAgbW92ZCBlYXgsbW01DQorICAgICAgICBtb3ZxIG1tNSxtbTINCisgICAgICAgIG1vdiAgZWF4LCBbZWJ4K2VheCo0XQ0KKw0KK0xfZG9kaXN0X21teDogDQorDQorICAgICAgICBtb3Z6eCAgZWN4LGFoDQorICAgICAgICBtb3YgIGVieCxlYXgNCisgICAgICAgIHNociAgZWJ4LDE2DQorICAgICAgICBzdWIgIGVicCxlY3gNCisgICAgICAgIG1vdmQgbW0xLGVjeA0KKw0KKyAgICAgICAgdGVzdCAgYWwsMTYNCisgICAgICAgIGp6IExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3RfbW14DQorICAgICAgICBhbmQgIGVheCwxNQ0KKyAgICAgICAganogTF9jaGVja19kaXN0X29uZV9tbXgNCisNCitMX2FkZF9iaXRzX3RvX2Rpc3RfbW14OiANCisgICAgICAgIHBzcmxxIG1tMCxtbTENCisgICAgICAgIG1vdmQgbW0xLGVheA0KKyAgICAgICAgbW92ZCBlY3gsbW0wDQorICAgICAgICBzdWIgIGVicCxlYXgNCisgICAgICAgIGFuZCAgZWN4LCBbaW5mbGF0ZV9mYXN0X21hc2srZWF4KjRdDQorICAgICAgICBhZGQgIGVieCxlY3gNCisNCitMX2NoZWNrX3dpbmRvd19tbXg6IA0KKyAgICAgICAgbW92ICBbZXNwKzQ0XSxlc2kNCisgICAgICAgIG1vdiAgZWF4LGVkaQ0KKyAgICAgICAgc3ViICBlYXgsIFtlc3ArNDBdDQorDQorICAgICAgICBjbXAgIGVheCxlYngNCisgICAgICAgIGpiIExfY2xpcF93aW5kb3dfbW14DQorDQorICAgICAgICBtb3YgIGVjeCxlZHgNCisgICAgICAgIG1vdiAgZXNpLGVkaQ0KKyAgICAgICAgc3ViICBlc2ksZWJ4DQorDQorICAgICAgICBzdWIgIGVjeCwzDQorICAgICAgICBtb3YgIGFsLCBbZXNpXQ0KKyAgICAgICAgbW92ICBbZWRpXSxhbA0KKyAgICAgICAgbW92ICBhbCwgW2VzaSsxXQ0KKyAgICAgICAgbW92ICBkbCwgW2VzaSsyXQ0KKyAgICAgICAgYWRkICBlc2ksMw0KKyAgICAgICAgbW92ICBbZWRpKzFdLGFsDQorICAgICAgICBtb3YgIFtlZGkrMl0sZGwNCisgICAgICAgIGFkZCAgZWRpLDMNCisgICAgICAgIHJlcCBtb3ZzYg0KKw0KKyAgICAgICAgbW92ICBlc2ksIFtlc3ArNDRdDQorICAgICAgICBtb3YgIGVieCwgW2VzcCs4XQ0KKyAgICAgICAgam1wICBMX3doaWxlX3Rlc3RfbW14DQorDQorQUxJR04gNA0KK0xfY2hlY2tfZGlzdF9vbmVfbW14OiANCisgICAgICAgIGNtcCAgZWJ4LDENCisgICAgICAgIGpuZSAgTF9jaGVja193aW5kb3dfbW14DQorICAgICAgICBjbXAgIFtlc3ArNDBdLGVkaQ0KKyAgICAgICAgamUgICBMX2NoZWNrX3dpbmRvd19tbXgNCisNCisgICAgICAgIGRlYyAgZWRpDQorICAgICAgICBtb3YgIGVjeCxlZHgNCisgICAgICAgIG1vdiAgYWwsIFtlZGldDQorICAgICAgICBzdWIgIGVjeCwzDQorDQorICAgICAgICBtb3YgIFtlZGkrMV0sYWwNCisgICAgICAgIG1vdiAgW2VkaSsyXSxhbA0KKyAgICAgICAgbW92ICBbZWRpKzNdLGFsDQorICAgICAgICBhZGQgIGVkaSw0DQorICAgICAgICByZXAgc3Rvc2INCisNCisgICAgICAgIG1vdiAgZWJ4LCBbZXNwKzhdDQorICAgICAgICBqbXAgIExfd2hpbGVfdGVzdF9tbXgNCisNCitBTElHTiA0DQorTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoX21teDogDQorICAgICAgICB0ZXN0ICBhbCw2NA0KKyAgICAgICAgam56IExfdGVzdF9mb3JfZW5kX29mX2Jsb2NrDQorDQorICAgICAgICBhbmQgIGVheCwxNQ0KKyAgICAgICAgcHNybHEgbW0wLG1tMQ0KKyAgICAgICAgbW92ZCBlY3gsbW0wDQorICAgICAgICBhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQ0KKyAgICAgICAgYWRkICBlY3gsZWR4DQorICAgICAgICBtb3YgIGVheCwgW2VieCtlY3gqNF0NCisgICAgICAgIGptcCBMX2RvbGVuX21teA0KKw0KK0FMSUdOIDQNCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0X21teDogDQorICAgICAgICB0ZXN0ICBhbCw2NA0KKyAgICAgICAgam56IExfaW52YWxpZF9kaXN0YW5jZV9jb2RlDQorDQorICAgICAgICBhbmQgIGVheCwxNQ0KKyAgICAgICAgcHNybHEgbW0wLG1tMQ0KKyAgICAgICAgbW92ZCBlY3gsbW0wDQorICAgICAgICBhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQ0KKyAgICAgICAgbW92ICBlYXgsIFtlc3ArMTJdDQorICAgICAgICBhZGQgIGVjeCxlYngNCisgICAgICAgIG1vdiAgZWF4LCBbZWF4K2VjeCo0XQ0KKyAgICAgICAgam1wICBMX2RvZGlzdF9tbXgNCisNCitBTElHTiA0DQorTF9jbGlwX3dpbmRvd19tbXg6IA0KKw0KKyAgICAgICAgbW92ICBlY3gsZWF4DQorICAgICAgICBtb3YgIGVheCwgW2VzcCs1Ml0NCisgICAgICAgIG5lZyAgZWN4DQorICAgICAgICBtb3YgIGVzaSwgW2VzcCs1Nl0NCisNCisgICAgICAgIGNtcCAgZWF4LGVieA0KKyAgICAgICAgamIgIExfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyDQorDQorICAgICAgICBhZGQgIGVjeCxlYngNCisgICAgICAgIGNtcCAgZHdvcmQgcHRyIFtlc3ArNDhdLDANCisgICAgICAgIGpuZSAgTF93cmFwX2Fyb3VuZF93aW5kb3dfbW14DQorDQorICAgICAgICBzdWIgIGVheCxlY3gNCisgICAgICAgIGFkZCAgZXNpLGVheA0KKw0KKyAgICAgICAgY21wICBlZHgsZWN4DQorICAgICAgICBqYmUgIExfZG9fY29weTFfbW14DQorDQorICAgICAgICBzdWIgIGVkeCxlY3gNCisgICAgICAgIHJlcCBtb3ZzYg0KKyAgICAgICAgbW92ICBlc2ksZWRpDQorICAgICAgICBzdWIgIGVzaSxlYngNCisgICAgICAgIGptcCAgTF9kb19jb3B5MV9tbXgNCisNCisgICAgICAgIGNtcCAgZWR4LGVjeA0KKyAgICAgICAgamJlICBMX2RvX2NvcHkxX21teA0KKw0KKyAgICAgICAgc3ViICBlZHgsZWN4DQorICAgICAgICByZXAgbW92c2INCisgICAgICAgIG1vdiAgZXNpLGVkaQ0KKyAgICAgICAgc3ViICBlc2ksZWJ4DQorICAgICAgICBqbXAgIExfZG9fY29weTFfbW14DQorDQorTF93cmFwX2Fyb3VuZF93aW5kb3dfbW14OiANCisNCisgICAgICAgIG1vdiAgZWF4LCBbZXNwKzQ4XQ0KKyAgICAgICAgY21wICBlY3gsZWF4DQorICAgICAgICBqYmUgIExfY29udGlndW91c19pbl93aW5kb3dfbW14DQorDQorICAgICAgICBhZGQgIGVzaSwgW2VzcCs1Ml0NCisgICAgICAgIGFkZCAgZXNpLGVheA0KKyAgICAgICAgc3ViICBlc2ksZWN4DQorICAgICAgICBzdWIgIGVjeCxlYXgNCisNCisNCisgICAgICAgIGNtcCAgZWR4LGVjeA0KKyAgICAgICAgamJlICBMX2RvX2NvcHkxX21teA0KKw0KKyAgICAgICAgc3ViICBlZHgsZWN4DQorICAgICAgICByZXAgbW92c2INCisgICAgICAgIG1vdiAgZXNpLCBbZXNwKzU2XQ0KKyAgICAgICAgbW92ICBlY3gsIFtlc3ArNDhdDQorICAgICAgICBjbXAgIGVkeCxlY3gNCisgICAgICAgIGpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisgICAgICAgIHN1YiAgZWR4LGVjeA0KKyAgICAgICAgcmVwIG1vdnNiDQorICAgICAgICBtb3YgIGVzaSxlZGkNCisgICAgICAgIHN1YiAgZXNpLGVieA0KKyAgICAgICAgam1wICBMX2RvX2NvcHkxX21teA0KKw0KK0xfY29udGlndW91c19pbl93aW5kb3dfbW14OiANCisNCisgICAgICAgIGFkZCAgZXNpLGVheA0KKyAgICAgICAgc3ViICBlc2ksZWN4DQorDQorDQorICAgICAgICBjbXAgIGVkeCxlY3gNCisgICAgICAgIGpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisgICAgICAgIHN1YiAgZWR4LGVjeA0KKyAgICAgICAgcmVwIG1vdnNiDQorICAgICAgICBtb3YgIGVzaSxlZGkNCisgICAgICAgIHN1YiAgZXNpLGVieA0KKw0KK0xfZG9fY29weTFfbW14OiANCisNCisNCisgICAgICAgIG1vdiAgZWN4LGVkeA0KKyAgICAgICAgcmVwIG1vdnNiDQorDQorICAgICAgICBtb3YgIGVzaSwgW2VzcCs0NF0NCisgICAgICAgIG1vdiAgZWJ4LCBbZXNwKzhdDQorICAgICAgICBqbXAgIExfd2hpbGVfdGVzdF9tbXgNCis7IDExNzQgImluZmZhc3QuUyINCitMX2ludmFsaWRfZGlzdGFuY2VfY29kZTogDQorDQorDQorDQorDQorDQorICAgICAgICBtb3YgIGVjeCwgaW52YWxpZF9kaXN0YW5jZV9jb2RlX21zZw0KKyAgICAgICAgbW92ICBlZHgsMjYNCisgICAgICAgIGptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlDQorDQorTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6IA0KKw0KKw0KKw0KKw0KKw0KKyAgICAgICAgdGVzdCAgYWwsMzINCisgICAgICAgIGp6ICBMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZQ0KKw0KKyAgICAgICAgbW92ICBlY3gsMA0KKyAgICAgICAgbW92ICBlZHgsMTENCisgICAgICAgIGptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlDQorDQorTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6IA0KKw0KKw0KKw0KKw0KKw0KKyAgICAgICAgbW92ICBlY3gsIGludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZV9tc2cNCisgICAgICAgIG1vdiAgZWR4LDI2DQorICAgICAgICBqbXAgIExfdXBkYXRlX3N0cmVhbV9zdGF0ZQ0KKw0KK0xfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyOiANCisNCisNCisNCisgICAgICAgIG1vdiAgZXNpLCBbZXNwKzQ0XQ0KKyAgICAgICAgbW92ICBlY3gsIGludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2cNCisgICAgICAgIG1vdiAgZWR4LDI2DQorICAgICAgICBqbXAgIExfdXBkYXRlX3N0cmVhbV9zdGF0ZQ0KKw0KK0xfdXBkYXRlX3N0cmVhbV9zdGF0ZTogDQorDQorICAgICAgICBtb3YgIGVheCwgW2VzcCs4OF0NCisgICAgICAgIHRlc3QgIGVjeCxlY3gNCisgICAgICAgIGp6ICBMX3NraXBfbXNnDQorICAgICAgICBtb3YgIFtlYXgrMjRdLGVjeA0KK0xfc2tpcF9tc2c6IA0KKyAgICAgICAgbW92ICBlYXgsIFtlYXgrMjhdDQorICAgICAgICBtb3YgIFtlYXgrMF0sZWR4DQorICAgICAgICBqbXAgIExfYnJlYWtfbG9vcA0KKw0KK0FMSUdOIDQNCitMX2JyZWFrX2xvb3A6IA0KKzsgMTI0MyAiaW5mZmFzdC5TIg0KKyAgICAgICAgY21wICBkd29yZCBwdHIgW2luZmxhdGVfZmFzdF91c2VfbW14XSwyDQorICAgICAgICBqbmUgIExfdXBkYXRlX25leHRfaW4NCisNCisNCisNCisgICAgICAgIG1vdiAgZWJ4LGVicA0KKw0KK0xfdXBkYXRlX25leHRfaW46IA0KKzsgMTI2NiAiaW5mZmFzdC5TIg0KKyAgICAgICAgbW92ICBlYXgsIFtlc3ArODhdDQorICAgICAgICBtb3YgIGVjeCxlYngNCisgICAgICAgIG1vdiAgZWR4LCBbZWF4KzI4XQ0KKyAgICAgICAgc2hyICBlY3gsMw0KKyAgICAgICAgc3ViICBlc2ksZWN4DQorICAgICAgICBzaGwgIGVjeCwzDQorICAgICAgICBzdWIgIGVieCxlY3gNCisgICAgICAgIG1vdiAgW2VheCsxMl0sZWRpDQorICAgICAgICBtb3YgIFtlZHgrNDhdLGVieA0KKyAgICAgICAgbW92ICBlY3gsZWJ4DQorDQorICAgICAgICBsZWEgIGVieCwgW2VzcCsyOF0NCisgICAgICAgIGNtcCAgW2VzcCsyMF0sZWJ4DQorICAgICAgICBqbmUgIExfYnVmX25vdF91c2VkDQorDQorICAgICAgICBzdWIgIGVzaSxlYngNCisgICAgICAgIG1vdiAgZWJ4LCBbZWF4KzBdDQorICAgICAgICBtb3YgIFtlc3ArMjBdLGVieA0KKyAgICAgICAgYWRkICBlc2ksZWJ4DQorICAgICAgICBtb3YgIGVieCwgW2VheCs0XQ0KKyAgICAgICAgc3ViICBlYngsMTENCisgICAgICAgIGFkZCAgW2VzcCsyMF0sZWJ4DQorDQorTF9idWZfbm90X3VzZWQ6IA0KKyAgICAgICAgbW92ICBbZWF4KzBdLGVzaQ0KKw0KKyAgICAgICAgbW92ICBlYngsMQ0KKyAgICAgICAgc2hsICBlYngsY2wNCisgICAgICAgIGRlYyAgZWJ4DQorDQorDQorDQorDQorDQorICAgICAgICBjbXAgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDINCisgICAgICAgIGpuZSAgTF91cGRhdGVfaG9sZA0KKw0KKw0KKw0KKyAgICAgICAgcHNybHEgbW0wLG1tMQ0KKyAgICAgICAgbW92ZCBlYnAsbW0wDQorDQorICAgICAgICBlbW1zDQorDQorTF91cGRhdGVfaG9sZDogDQorDQorDQorDQorICAgICAgICBhbmQgIGVicCxlYngNCisgICAgICAgIG1vdiAgW2VkeCs0NF0sZWJwDQorDQorDQorDQorDQorICAgICAgICBtb3YgIGVieCwgW2VzcCsyMF0NCisgICAgICAgIGNtcCAgZWJ4LGVzaQ0KKyAgICAgICAgamJlICBMX2xhc3RfaXNfc21hbGxlcg0KKw0KKyAgICAgICAgc3ViICBlYngsZXNpDQorICAgICAgICBhZGQgIGVieCwxMQ0KKyAgICAgICAgbW92ICBbZWF4KzRdLGVieA0KKyAgICAgICAgam1wICBMX2ZpeHVwX291dA0KK0xfbGFzdF9pc19zbWFsbGVyOiANCisgICAgICAgIHN1YiAgZXNpLGVieA0KKyAgICAgICAgbmVnICBlc2kNCisgICAgICAgIGFkZCAgZXNpLDExDQorICAgICAgICBtb3YgIFtlYXgrNF0sZXNpDQorDQorDQorDQorDQorTF9maXh1cF9vdXQ6IA0KKw0KKyAgICAgICAgbW92ICBlYngsIFtlc3ArMTZdDQorICAgICAgICBjbXAgIGVieCxlZGkNCisgICAgICAgIGpiZSAgTF9lbmRfaXNfc21hbGxlcg0KKw0KKyAgICAgICAgc3ViICBlYngsZWRpDQorICAgICAgICBhZGQgIGVieCwyNTcNCisgICAgICAgIG1vdiAgW2VheCsxNl0sZWJ4DQorICAgICAgICBqbXAgIExfZG9uZQ0KK0xfZW5kX2lzX3NtYWxsZXI6IA0KKyAgICAgICAgc3ViICBlZGksZWJ4DQorICAgICAgICBuZWcgIGVkaQ0KKyAgICAgICAgYWRkICBlZGksMjU3DQorICAgICAgICBtb3YgIFtlYXgrMTZdLGVkaQ0KKw0KKw0KKw0KKw0KKw0KK0xfZG9uZTogDQorICAgICAgICBhZGQgIGVzcCw2NA0KKyAgICAgICAgcG9wZmQNCisgICAgICAgIHBvcCAgZWJ4DQorICAgICAgICBwb3AgIGVicA0KKyAgICAgICAgcG9wICBlc2kNCisgICAgICAgIHBvcCAgZWRpDQorICAgICAgICByZXQNCisNCisNCisNCisNCitfVEVYVCAgIGVuZHMNCitlbmQNCmRpZmYgLS1naXQgYS9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9pbmZmYXN0QXNtLm9iaiBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL2luZmZhc3RBc20ub2JqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTU0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9pbmZmYXN0QXNtLm9iagpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9taW5pdW56LnZjcHJvaiBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL21pbml1bnoudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjBkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9taW5pdW56LnZjcHJvagpAQCAtMCwwICsxLDEyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZyA9ICJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4wMCINCisJTmFtZT0ibWluaXVueiINCisJUHJvamVjdEdVSUQ9IntDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJEZWJ1ZyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IkRlYnVnIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9taW5pdW56LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9taW5pdW56LnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJSZWxlYXNlIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUmVsZWFzZSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJUUlVFIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNCINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXVuei5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJtaW5pdW56LmMiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jIj4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIj4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9InpsaWIubGliIj4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIvbWluaXppcC52Y3Byb2ogYi9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi9taW5pemlwLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2M1YWNhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIvbWluaXppcC52Y3Byb2oKQEAgLTAsMCArMSwxMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2RpbmcgPSAiV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMDAiDQorCU5hbWU9Im1pbml6aXAiDQorCVByb2plY3RHVUlEPSJ7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iRGVidWciDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJEZWJ1ZyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRSINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXppcC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvbWluaXppcC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iUmVsZWFzZSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlJlbGVhc2UiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlPbWl0RnJhbWVQb2ludGVycz0iVFJVRSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSINCisJCQkJU3RyaW5nUG9vbGluZz0iVFJVRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjQiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbml6aXAuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc20iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ibWluaXppcC5jIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYyI+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSI+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSJ6bGliLmxpYiI+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL21rZ3ZtdDMyLmJhdCBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL21rZ3ZtdDMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU0ZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIvbWtndm10MzIuYmF0CkBAIC0wLDAgKzEsMiBAQAorYzpcbWFzbTYxMVxiaW5cbWwgL2NvZmYgL1ppIC9jIC9GbGd2bWF0MzIubHN0IGd2bWF0MzIuYXNtDQorYzpcbWFzbTYxMVxiaW5cbWwgL2NvZmYgL1ppIC9jIC9GbGluZmZhc3RBc20ubHN0IGluZmZhc3RBc20uYXNtDQpkaWZmIC0tZ2l0IGEvY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIvemxpYi5yYyBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL3psaWIucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4NmUwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL3psaWIucmMKQEAgLTAsMCArMSwzMiBAQAorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisNCisjZGVmaW5lIElEUl9WRVJTSU9OMSAgMQ0KK0lEUl9WRVJTSU9OMQlWRVJTSU9OSU5GTwlNT1ZFQUJMRSBJTVBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRQ0KKyAgRklMRVZFUlNJT04JIDEsMiwwLDANCisgIFBST0RVQ1RWRVJTSU9OIDEsMiwwLDANCisgIEZJTEVGTEFHU01BU0sJVlNfRkZJX0ZJTEVGTEFHU01BU0sNCisgIEZJTEVGTEFHUwkwDQorICBGSUxFT1MJVk9TX0RPU19XSU5ET1dTMzINCisgIEZJTEVUWVBFCVZGVF9ETEwNCisgIEZJTEVTVUJUWVBFCTAJLy8gbm90IHVzZWQNCitCRUdJTg0KKyAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIg0KKyAgQkVHSU4NCisgICAgQkxPQ0sgIjA0MDkwNEU0Ig0KKyAgICAvL2xhbmd1YWdlIElEID0gVS5TLiBFbmdsaXNoLCBjaGFyIHNldCA9IFdpbmRvd3MsIE11bHRpbGluZ3VhbA0KKw0KKyAgICBCRUdJTg0KKyAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiemxpYiBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnlcMCINCisgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLAkiMS4yLjAuMFwwIg0KKyAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLAkiemxpYlwwIg0KKyAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwJInpsaWIuZGxsXDAiDQorICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwJIlpMaWIuRExMXDAiDQorICAgICAgVkFMVUUgIkNvbW1lbnRzIiwiRExMIHN1cHBvcnQgYnkgQWxlc3NhbmRybyBJYWNvcGV0dGkgJiBHaWxsZXMgVm9sbGFudFwwIg0KKyAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICIoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkgJiBNYXJrIEFkbGVyXDAiDQorICAgIEVORA0KKyAgRU5EDQorICBCTE9DSyAiVmFyRmlsZUluZm8iDQorICBCRUdJTg0KKyAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDA0MDksIDEyNTINCisgIEVORA0KK0VORA0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL3psaWJzdGF0LnZjcHJvaiBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL3psaWJzdGF0LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGQ0YTYzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIvemxpYnN0YXQudmNwcm9qCkBAIC0wLDAgKzEsMjUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nID0gIldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjAwIg0KKwlOYW1lPSJ6bGlic3RhdCINCisJU2NjUHJvamVjdE5hbWU9IiINCisJU2NjTG9jYWxQYXRoPSIiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHpsaWJzdGF0RGVidWciDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHpsaWJzdGF0RGVidWciDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMiINCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IkZBTFNFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHpsaWJzdGF0RGVidWcvemxpYnN0YXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cemxpYnN0YXREZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cemxpYnN0YXREZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHpsaWJzdGF0RGVidWcvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL05PREVGQVVMVExJQiAiDQorCQkJCU91dHB1dEZpbGU9Ii5cemxpYnN0YXREZWJ1Z1x6bGlic3RhdC5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VBeHB8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHpsaWJzdGEwIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx6bGlic3RhMCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzIiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSJGQUxTRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjQiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cemxpYnN0YTAvemxpYnN0YXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cemxpYnN0YTAvIg0KKwkJCQlPYmplY3RGaWxlPSIuXHpsaWJzdGEwLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cemxpYnN0YTAvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL05PREVGQVVMVExJQiAiDQorCQkJCU91dHB1dEZpbGU9Ii5cemxpYnN0YTBcemxpYnN0YXQubGliIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlx6bGlic3RhdCINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cemxpYnN0YXQiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyLEFTTVYiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSJGQUxTRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjQiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cemxpYnN0YXQvemxpYnN0YXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cemxpYnN0YXQvIg0KKwkJCQlPYmplY3RGaWxlPSIuXHpsaWJzdGF0LyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cemxpYnN0YXQvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iZ3ZtYXQzMi5vYmogIGluZmZhc3RBc20ub2JqIC9OT0RFRkFVTFRMSUIgIg0KKwkJCQlPdXRwdXRGaWxlPSIuXHpsaWJzdGF0XHpsaWJzdGF0LmxpYiINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCUN1bHR1cmU9IjEwMzYiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZVdpdGhvdXRBc218V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ6bGlic3RhdFdpdGhvdXRBc20iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ6bGlic3RhdFdpdGhvdXRBc20iDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyIg0KKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iRkFMU0UiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI0Ig0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHpsaWJzdGF0L3psaWJzdGF0LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXHpsaWJzdGF0V2l0aG91dEFzbS8iDQorCQkJCU9iamVjdEZpbGU9Ii5cemxpYnN0YXRXaXRob3V0QXNtLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cemxpYnN0YXRXaXRob3V0QXNtLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTk9ERUZBVUxUTElCICINCisJCQkJT3V0cHV0RmlsZT0iLlx6bGlic3RhdFdpdGhvdXRBc21cemxpYnN0YXQubGliIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJQ3VsdHVyZT0iMTAzNiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iIj4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cYWRsZXIzMi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGNvbXByZXNzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY3JjMzIuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkZWZsYXRlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ3ZtYXQzMmMuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnemlvLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5mYmFjay5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluZmZhc3QuYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5mbGF0ZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluZnRyZWVzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW9hcGkuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx0cmVlcy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHVuY29tcHIuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx1bnppcC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHppcC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHpsaWIucmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cemxpYnZjLmRlZiI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx6dXRpbC5jIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIvemxpYnZjLmRlZiBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL3psaWJ2Yy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxMDlkNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL3psaWJ2Yy5kZWYKQEAgLTAsMCArMSw4OCBAQAorTElCUkFSWQkJInpsaWIiDQorDQorVkVSU0lPTgkJMS4yMA0KKw0KK0hFQVBTSVpFCTEwNDg1NzYsODE5Mg0KKw0KK0VYUE9SVFMNCisgICAgICAgIGFkbGVyMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDENCisgICAgICAgIGNvbXByZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDINCisgICAgICAgIGNyYzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMNCisgICAgICAgIGRlZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQNCisgICAgICAgIGRlZmxhdGVDb3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDUNCisgICAgICAgIGRlZmxhdGVFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDYNCisgICAgICAgIGRlZmxhdGVJbml0Ml8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQDcNCisgICAgICAgIGRlZmxhdGVJbml0XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDgNCisgICAgICAgIGRlZmxhdGVQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDkNCisgICAgICAgIGRlZmxhdGVSZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEwDQorICAgICAgICBkZWZsYXRlU2V0RGljdGlvbmFyeSAgICAgICAgICAgICAgICAgICAgIEAxMQ0KKyAgICAgICAgZ3pjbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTINCisgICAgICAgIGd6ZG9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEzDQorICAgICAgICBnemVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNA0KKyAgICAgICAgZ3pmbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTUNCisgICAgICAgIGd6b3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE2DQorICAgICAgICBnenJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNw0KKyAgICAgICAgZ3p3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTgNCisgICAgICAgIGluZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE5DQorICAgICAgICBpbmZsYXRlRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyMA0KKyAgICAgICAgaW5mbGF0ZUluaXQyXyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjENCisgICAgICAgIGluZmxhdGVJbml0XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIyDQorICAgICAgICBpbmZsYXRlUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyMw0KKyAgICAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkgICAgICAgICAgICAgICAgICAgICBAMjQNCisgICAgICAgIGluZmxhdGVTeW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI1DQorICAgICAgICB1bmNvbXByZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyNg0KKyAgICAgICAgemxpYlZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjcNCisgICAgICAgIGd6cHJpbnRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI4DQorICAgICAgICBnenB1dGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyOQ0KKyAgICAgICAgZ3pnZXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzANCisgICAgICAgIGd6c2VlayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMxDQorICAgICAgICBnenJld2luZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzMg0KKyAgICAgICAgZ3p0ZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzMNCisgICAgICAgIGd6ZW9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM0DQorICAgICAgICBnenNldHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzNQ0KKyAgICAgICAgekVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzYNCisgICAgICAgIGluZmxhdGVTeW5jUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgQDM3DQorICAgICAgICBnZXRfY3JjX3RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzOA0KKyAgICAgICAgY29tcHJlc3MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzkNCisgICAgICAgIGd6cHV0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQwDQorICAgICAgICBnemdldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0MQ0KKyAgICAgICAgaW5mbGF0ZUNvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDINCisgICAgICAgIGluZmxhdGVCYWNrSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgQDQzDQorICAgICAgICBpbmZsYXRlQmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0NA0KKyAgICAgICAgaW5mbGF0ZUJhY2tFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICBANDUNCisgICAgICAgIGNvbXByZXNzQm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ2DQorDQorICAgICAgICB1bnpPcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA2MQ0KKyAgICAgICAgdW56Q2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANjINCisgICAgICAgIHVuekdldEdsb2JhbEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgQDYzDQorICAgICAgICB1bnpHZXRDdXJyZW50RmlsZUluZm8gICAgICAgICAgICAgICAgICAgIEA2NA0KKyAgICAgICAgdW56R29Ub0ZpcnN0RmlsZSAgICAgICAgICAgICAgICAgICAgICAgICBANjUNCisgICAgICAgIHVuekdvVG9OZXh0RmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgQDY2DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUgICAgICAgICAgICAgICAgICAgICAgIEA2Nw0KKyAgICAgICAgdW56UmVhZEN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgICBANjgNCisgICAgICAgIHVuek9wZW5DdXJyZW50RmlsZTMgICAgICAgICAgICAgICAgICAgICAgQDY5DQorICAgICAgICB1bnp0ZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3MA0KKyAgICAgICAgdW56ZW9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzENCisgICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUgICAgICAgICAgICAgICAgICAgICAgQDcyDQorICAgICAgICB1bnpHZXRHbG9iYWxDb21tZW50ICAgICAgICAgICAgICAgICAgICAgIEA3Mw0KKyAgICAgICAgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlICAgICAgICAgICAgICAgICBANzQNCisgICAgICAgIHVuekxvY2F0ZUZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDc1DQorICAgICAgICB1bnpHZXRMb2NhbEV4dHJhZmllbGQgICAgICAgICAgICAgICAgICAgIEA3Ng0KKyAgICAgICAgdW56T3BlbjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzcNCisgICAgICAgIHVuek9wZW5DdXJyZW50RmlsZTIgICAgICAgICAgICAgICAgICAgICAgQDc4DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCAgICAgICAgICAgICAgIEA3OQ0KKw0KKyAgICAgICAgemlwT3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAODANCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAgICAgICAgICAgICAgICAgICAgICAgQDgxDQorICAgICAgICB6aXBXcml0ZUluRmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgIEA4Mg0KKyAgICAgICAgemlwQ2xvc2VGaWxlSW5aaXAgICAgICAgICAgICAgICAgICAgICAgICBAODMNCisgICAgICAgIHppcENsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDg0DQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwMiAgICAgICAgICAgICAgICAgICAgIEA4Ng0KKyAgICAgICAgemlwQ2xvc2VGaWxlSW5aaXBSYXcgICAgICAgICAgICAgICAgICAgICBAODcNCisgICAgICAgIHppcE9wZW4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDg4DQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwMyAgICAgICAgICAgICAgICAgICAgIEA4OQ0KKw0KKyAgICAgICAgdW56R2V0RmlsZVBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTAwDQorICAgICAgICB1bnpHb1RvRmlsZVBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMDENCisNCisgICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmMgICAgICAgICAgICAgICAgICAgICAgQDExMA0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL3psaWJ2Yy5zbG4gYi9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi96bGlidmMuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDA3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZzdHVkaW8vdmM3MF8zMi96bGlidmMuc2xuCkBAIC0wLDAgKzEsNjYgQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDcuMDANCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInpsaWJzdGF0IiwgInpsaWJzdGF0LnZjcHJvaiIsICJ7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ6bGlidmMiLCAiemxpYnZjLnZjcHJvaiIsICJ7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJtaW5pemlwIiwgIm1pbml6aXAudmNwcm9qIiwgIns0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIm1pbml1bnoiLCAibWluaXVuei52Y3Byb2oiLCAie0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0iDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvbikgPSBwcmVTb2x1dGlvbg0KKwkJQ29uZmlnTmFtZS4wID0gRGVidWcNCisJCUNvbmZpZ05hbWUuMSA9IFJlbGVhc2UNCisJCUNvbmZpZ05hbWUuMiA9IFJlbGVhc2VBeHANCisJCUNvbmZpZ05hbWUuMyA9IFJlbGVhc2VXaXRob3V0QXNtDQorCQlDb25maWdOYW1lLjQgPSBSZWxlYXNlV2l0aG91dENydGRsbA0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uKSA9IHBvc3RTb2x1dGlvbg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlQXhwLkFjdGl2ZUNmZyA9IFJlbGVhc2VBeHB8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VBeHAuQnVpbGQuMCA9IFJlbGVhc2VBeHB8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0QXNtLkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbS5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0Q3J0ZGxsLkFjdGl2ZUNmZyA9IFJlbGVhc2VBeHB8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0Q3J0ZGxsLkJ1aWxkLjAgPSBSZWxlYXNlQXhwfFdpbjMyDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VBeHAuQWN0aXZlQ2ZnID0gUmVsZWFzZUF4cHxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZUF4cC5CdWlsZC4wID0gUmVsZWFzZUF4cHxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc20uQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0QXNtLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRDcnRkbGwuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRDcnRkbGx8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0Q3J0ZGxsLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dENydGRsbHxXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlQXhwLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VBeHAuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dENydGRsbC5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dENydGRsbC5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlQXhwLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2VBeHAuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2VXaXRob3V0QXNtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2VXaXRob3V0QXNtLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlV2l0aG91dENydGRsbC5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlV2l0aG91dENydGRsbC5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5QWRkSW5zKSA9IHBvc3RTb2x1dGlvbg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIvemxpYnZjLnZjcHJvaiBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL3psaWJ2Yy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNmOTg5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdnN0dWRpby92YzcwXzMyL3psaWJ2Yy52Y3Byb2oKQEAgLTAsMCArMSw0MzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2RpbmcgPSAiV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMDAiDQorCU5hbWU9InpsaWJ2YyINCisJU2NjUHJvamVjdE5hbWU9IiINCisJU2NjTG9jYWxQYXRoPSIiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnRGxsIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1Z0RsbCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyLEFTTVYiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSJGQUxTRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjEiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Z0RsbC96bGlidmMucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWdEbGwvIg0KKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnRGxsLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cRGVidWdEbGwvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iZ3ZtYXQzMi5vYmogIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnRGxsXHpsaWIuZGxsIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii5cemxpYnZjLmRlZiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnRGxsL3psaWIucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cRGVidWdEbGwvemxpYi5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9IlRSVUUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Z0RsbC96bGlidmMudGxiIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzNiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZVdpdGhvdXRBc218V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHpsaWJEbGxXaXRob3V0QXNtIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx6bGliRGxsV2l0aG91dEFzbSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzIiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSJGQUxTRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cemxpYkRsbFdpdGhvdXRBc20vemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cemxpYkRsbFdpdGhvdXRBc20vIg0KKwkJCQlPYmplY3RGaWxlPSIuXHpsaWJEbGxXaXRob3V0QXNtLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cemxpYkRsbFdpdGhvdXRBc20vIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImNydGRsbC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii5cemxpYkRsbFdpdGhvdXRBc21cemxpYi5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJUUlVFIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlx6bGlidmMuZGVmIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHpsaWJEbGxXaXRob3V0QXNtL3psaWIucGRiIg0KKwkJCQlHZW5lcmF0ZU1hcEZpbGU9IlRSVUUiDQorCQkJCU1hcEZpbGVOYW1lPSIuXHpsaWJEbGxXaXRob3V0QXNtL3psaWIubWFwIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXHpsaWJEbGxXaXRob3V0QXNtL3psaWIubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cemxpYkRsbFdpdGhvdXRBc20vemxpYnZjLnRsYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0Q3J0ZGxsfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlx6bGliRGxsV2l0aG91dENydERsbCINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cemxpYkRsbFdpdGhvdXRDcnREbGwiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyLEFTTVYiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSJGQUxTRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cemxpYkRsbFdpdGhvdXRDcnREbGwvemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cemxpYkRsbFdpdGhvdXRDcnREbGwvIg0KKwkJCQlPYmplY3RGaWxlPSIuXHpsaWJEbGxXaXRob3V0Q3J0RGxsLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cemxpYkRsbFdpdGhvdXRDcnREbGwvIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Imd2bWF0MzIub2JqIGluZmZhc3RBc20ub2JqICINCisJCQkJT3V0cHV0RmlsZT0iLlx6bGliRGxsV2l0aG91dENydERsbFx6bGliLmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9IkZBTFNFIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlx6bGlidmMuZGVmIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHpsaWJEbGxXaXRob3V0Q3J0RGxsL3psaWIucGRiIg0KKwkJCQlHZW5lcmF0ZU1hcEZpbGU9IlRSVUUiDQorCQkJCU1hcEZpbGVOYW1lPSIuXHpsaWJEbGxXaXRob3V0Q3J0RGxsL3psaWIubWFwIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXHpsaWJEbGxXaXRob3V0Q3J0RGxsL3psaWIubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cemxpYkRsbFdpdGhvdXRDcnREbGwvemxpYnZjLnRsYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VBeHB8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHpsaWJ2Y19fIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx6bGlidmNfXyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzIiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSJGQUxTRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cemxpYnZjX18vemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cemxpYnZjX18vIg0KKwkJCQlPYmplY3RGaWxlPSIuXHpsaWJ2Y19fLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cemxpYnZjX18vIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iY3J0ZGxsLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iemxpYnZjX19cemxpYi5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJUUlVFIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlx6bGlidmMuZGVmIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHpsaWJ2Y19fL3psaWIucGRiIg0KKwkJCQlHZW5lcmF0ZU1hcEZpbGU9IlRSVUUiDQorCQkJCU1hcEZpbGVOYW1lPSIuXHpsaWJ2Y19fL3psaWIubWFwIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cemxpYnZjX18vemxpYi5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9IlRSVUUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx6bGlidmNfXy96bGlidmMudGxiIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzNiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cUmVsZWFzZURsbCINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cUmVsZWFzZURsbCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzIsQVNNViINCisJCQkJU3RyaW5nUG9vbGluZz0iVFJVRSINCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IkZBTFNFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlRGxsL3psaWJ2Yy5wY2giDQorCQkJCUFzc2VtYmxlck91dHB1dD0iMiINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2VEbGwvIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2VEbGwvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlRGxsLyINCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2Ig0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJndm1hdDMyLm9iaiBpbmZmYXN0QXNtLm9iaiBjcnRkbGwubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2VEbGxcemxpYi5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJUUlVFIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlx6bGlidmMuZGVmIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2VEbGwvemxpYi5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0iVFJVRSINCisJCQkJTWFwRmlsZU5hbWU9Ii5cUmVsZWFzZURsbC96bGliLm1hcCINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlPcHRpbWl6ZUZvcldpbmRvd3M5OD0iMSINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxSZWxlYXNlRGxsL3psaWIubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cUmVsZWFzZS96bGlidmMudGxiIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzNiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIj4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cYWRsZXIzMi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGNvbXByZXNzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY3JjMzIuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkZWZsYXRlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ3ZtYXQzMmMuYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZVdpdGhvdXRBc218V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGd6aW8uYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmZiYWNrLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5mZmFzdC5jIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlV2l0aG91dENydGRsbHxXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluZmxhdGUuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmZ0cmVlcy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGlvYXBpLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW93aW4zMi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHRyZWVzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdW5jb21wci5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHVuemlwLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cemlwLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cemxpYi5yYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx6bGlidmMuZGVmIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHp1dGlsLmMiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkZWZsYXRlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5mYmxvY2suaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmZjb2Rlcy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluZmZhc3QuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmZ0cmVlcy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluZnV0aWwuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx6Y29uZi5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHpsaWIuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx6dXRpbC5oIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2RlZmxhdGUuYyBiL2RlZmxhdGUuYwppbmRleCBkMTM2MjdlLi45N2EwODBjIDEwMDY0NAotLS0gYS9kZWZsYXRlLmMKKysrIGIvZGVmbGF0ZS5jCkBAIC0xLDYgKzEsNiBAQAogLyogZGVmbGF0ZS5jIC0tIGNvbXByZXNzIGRhdGEgdXNpbmcgdGhlIGRlZmxhdGlvbiBhbGdvcml0aG0KICAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKIC8qCkBAIC01Miw3ICs1Miw3IEBACiAjaW5jbHVkZSAiZGVmbGF0ZS5oIgogCiBjb25zdCBjaGFyIGRlZmxhdGVfY29weXJpZ2h0W10gPQotICAgIiBkZWZsYXRlIDEuMi4wIENvcHlyaWdodCAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseSAiOworICAgIiBkZWZsYXRlIDEuMi4wLjEgQ29weXJpZ2h0IDE5OTUtMjAwMyBKZWFuLWxvdXAgR2FpbGx5ICI7CiAvKgogICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCiAgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKQEAgLTc2LDE3ICs3NiwyMiBAQAogbG9jYWwgdm9pZCBmaWxsX3dpbmRvdyAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwogbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOwogbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworI2lmbmRlZiBGQVNURVNUCiBsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3cgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7CisjZW5kaWYKIGxvY2FsIHZvaWQgbG1faW5pdCAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKIGxvY2FsIHZvaWQgcHV0U2hvcnRNU0IgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHVJbnQgYikpOwogbG9jYWwgdm9pZCBmbHVzaF9wZW5kaW5nICBPRigoel9zdHJlYW1wIHN0cm0pKTsKIGxvY2FsIGludCByZWFkX2J1ZiAgICAgICAgT0YoKHpfc3RyZWFtcCBzdHJtLCBCeXRlZiAqYnVmLCB1bnNpZ25lZCBzaXplKSk7CisjaWZuZGVmIEZBU1RFU1QKICNpZmRlZiBBU01WCiAgICAgICB2b2lkIG1hdGNoX2luaXQgT0YoKHZvaWQpKTsgLyogYXNtIGNvZGUgaW5pdGlhbGl6YXRpb24gKi8KICAgICAgIHVJbnQgbG9uZ2VzdF9tYXRjaCAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7CiAjZWxzZQogbG9jYWwgdUludCBsb25nZXN0X21hdGNoICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBjdXJfbWF0Y2gpKTsKICNlbmRpZgorI2VuZGlmCitsb2NhbCB1SW50IGxvbmdlc3RfbWF0Y2hfZmFzdCBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBjdXJfbWF0Y2gpKTsKIAogI2lmZGVmIERFQlVHCiBsb2NhbCAgdm9pZCBjaGVja19tYXRjaCBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBzdGFydCwgSVBvcyBtYXRjaCwKQEAgLTEyMyw2ICsxMjgsMTIgQEAKICAgIGNvbXByZXNzX2Z1bmMgZnVuYzsKIH0gY29uZmlnOwogCisjaWZkZWYgRkFTVEVTVAorbG9jYWwgY29uc3QgY29uZmlnIGNvbmZpZ3VyYXRpb25fdGFibGVbMl0gPSB7CisvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCisvKiAwICovIHswLCAgICAwLCAgMCwgICAgMCwgZGVmbGF0ZV9zdG9yZWR9LCAgLyogc3RvcmUgb25seSAqLworLyogMSAqLyB7NCwgICAgNCwgIDgsICAgIDQsIGRlZmxhdGVfZmFzdH19OyAvKiBtYXhpbXVtIHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KKyNlbHNlCiBsb2NhbCBjb25zdCBjb25maWcgY29uZmlndXJhdGlvbl90YWJsZVsxMF0gPSB7CiAvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCiAvKiAwICovIHswLCAgICAwLCAgMCwgICAgMCwgZGVmbGF0ZV9zdG9yZWR9LCAgLyogc3RvcmUgb25seSAqLwpAQCAtMTM2LDYgKzE0Nyw3IEBACiAvKiA3ICovIHs4LCAgIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93fSwKIC8qIDggKi8gezMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93fSwKIC8qIDkgKi8gezMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93fX07IC8qIG1heGltdW0gY29tcHJlc3Npb24gKi8KKyNlbmRpZgogCiAvKiBOb3RlOiB0aGUgZGVmbGF0ZSgpIGNvZGUgcmVxdWlyZXMgbWF4X2xhenkgPj0gTUlOX01BVENIIGFuZCBtYXhfY2hhaW4gPj0gNAogICogRm9yIGRlZmxhdGVfZmFzdCgpIChsZXZlbHMgPD0gMykgZ29vZCBpcyBpZ25vcmVkIGFuZCBsYXp5IGhhcyBhIGRpZmZlcmVudApAQCAtMTk0LDEzICsyMDYsMTMgQEAKICAgICBpbnQgc3RyZWFtX3NpemU7CiB7CiAgICAgcmV0dXJuIGRlZmxhdGVJbml0Ml8oc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIE1BWF9XQklUUywgREVGX01FTV9MRVZFTCwKLQkJCSBaX0RFRkFVTFRfU1RSQVRFR1ksIHZlcnNpb24sIHN0cmVhbV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1ksIHZlcnNpb24sIHN0cmVhbV9zaXplKTsKICAgICAvKiBUbyBkbzogaWdub3JlIHN0cm0tPm5leHRfaW4gaWYgd2UgdXNlIGl0IGFzIHdpbmRvdyAqLwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwKLQkJICB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKKyAgICAgICAgICAgICAgICAgIHZlcnNpb24sIHN0cmVhbV9zaXplKQogICAgIHpfc3RyZWFtcCBzdHJtOwogICAgIGludCAgbGV2ZWw7CiAgICAgaW50ICBtZXRob2Q7CkBAIC0yMjEsMjAgKzIzMywyMSBAQAogCiAgICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gbXlfdmVyc2lvblswXSB8fAogICAgICAgICBzdHJlYW1fc2l6ZSAhPSBzaXplb2Yoel9zdHJlYW0pKSB7Ci0JcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKICAgICB9CiAgICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAKICAgICBzdHJtLT5tc2cgPSBaX05VTEw7CiAgICAgaWYgKHN0cm0tPnphbGxvYyA9PSBaX05VTEwpIHsKLQlzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOwotCXN0cm0tPm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOwogICAgIH0KICAgICBpZiAoc3RybS0+emZyZWUgPT0gWl9OVUxMKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKIAotICAgIGlmIChsZXZlbCA9PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIGxldmVsID0gNjsKICNpZmRlZiBGQVNURVNUCi0gICAgbGV2ZWwgPSAxOworICAgIGlmIChsZXZlbCAhPSAwKSBsZXZlbCA9IDE7CisjZWxzZQorICAgIGlmIChsZXZlbCA9PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIGxldmVsID0gNjsKICNlbmRpZgogCiAgICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7IC8qIHVuZG9jdW1lbnRlZCBmZWF0dXJlOiBzdXBwcmVzcyB6bGliIGhlYWRlciAqLwpAQCAtMjQzLDcgKzI1Niw3IEBACiAgICAgfQogICAgIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPSBaX0RFRkxBVEVEIHx8CiAgICAgICAgIHdpbmRvd0JpdHMgPCA5IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8Ci0Jc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9IVUZGTUFOX09OTFkpIHsKKyAgICAgICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9STEUpIHsKICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgIH0KICAgICBzID0gKGRlZmxhdGVfc3RhdGUgKikgWkFMTE9DKHN0cm0sIDEsIHNpemVvZihkZWZsYXRlX3N0YXRlKSk7CkBAIC0zMDksOSArMzIyLDkgQEAKIAogICAgIGlmIChsZW5ndGggPCBNSU5fTUFUQ0gpIHJldHVybiBaX09LOwogICAgIGlmIChsZW5ndGggPiBNQVhfRElTVChzKSkgewotCWxlbmd0aCA9IE1BWF9ESVNUKHMpOworICAgICAgICBsZW5ndGggPSBNQVhfRElTVChzKTsKICNpZm5kZWYgVVNFX0RJQ1RfSEVBRAotCWRpY3Rpb25hcnkgKz0gZGljdExlbmd0aCAtIGxlbmd0aDsgLyogdXNlIHRoZSB0YWlsIG9mIHRoZSBkaWN0aW9uYXJ5ICovCisgICAgICAgIGRpY3Rpb25hcnkgKz0gZGljdExlbmd0aCAtIGxlbmd0aDsgLyogdXNlIHRoZSB0YWlsIG9mIHRoZSBkaWN0aW9uYXJ5ICovCiAjZW5kaWYKICAgICB9CiAgICAgem1lbWNweShzLT53aW5kb3csIGRpY3Rpb25hcnksIGxlbmd0aCk7CkBAIC0zMjUsNyArMzM4LDcgQEAKICAgICBzLT5pbnNfaCA9IHMtPndpbmRvd1swXTsKICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WzFdKTsKICAgICBmb3IgKG4gPSAwOyBuIDw9IGxlbmd0aCAtIE1JTl9NQVRDSDsgbisrKSB7Ci0JSU5TRVJUX1NUUklORyhzLCBuLCBoYXNoX2hlYWQpOworICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIG4sIGhhc2hfaGVhZCk7CiAgICAgfQogICAgIGlmIChoYXNoX2hlYWQpIGhhc2hfaGVhZCA9IDA7ICAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCiAgICAgcmV0dXJuIFpfT0s7CkBAIC0zMzYsNyArMzQ5LDcgQEAKICAgICB6X3N0cmVhbXAgc3RybTsKIHsKICAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIAorCiAgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAogICAgICAgICBzdHJtLT56YWxsb2MgPT0gWl9OVUxMIHx8IHN0cm0tPnpmcmVlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogCkBAIC0zNzQsMjQgKzM4NywyNiBAQAogICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICBzID0gc3RybS0+c3RhdGU7CiAKLSAgICBpZiAobGV2ZWwgPT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSB7Ci0JbGV2ZWwgPSA2OwotICAgIH0KLSAgICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fCBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0hVRkZNQU5fT05MWSkgewotCXJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNpZmRlZiBGQVNURVNUCisgICAgaWYgKGxldmVsICE9IDApIGxldmVsID0gMTsKKyNlbHNlCisgICAgaWYgKGxldmVsID09IFpfREVGQVVMVF9DT01QUkVTU0lPTikgbGV2ZWwgPSA2OworI2VuZGlmCisgICAgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHwgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9STEUpIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgIH0KICAgICBmdW5jID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYzsKIAogICAgIGlmIChmdW5jICE9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmZ1bmMgJiYgc3RybS0+dG90YWxfaW4gIT0gMCkgewotCS8qIEZsdXNoIHRoZSBsYXN0IGJ1ZmZlcjogKi8KLQllcnIgPSBkZWZsYXRlKHN0cm0sIFpfUEFSVElBTF9GTFVTSCk7CisgICAgICAgIC8qIEZsdXNoIHRoZSBsYXN0IGJ1ZmZlcjogKi8KKyAgICAgICAgZXJyID0gZGVmbGF0ZShzdHJtLCBaX1BBUlRJQUxfRkxVU0gpOwogICAgIH0KICAgICBpZiAocy0+bGV2ZWwgIT0gbGV2ZWwpIHsKLQlzLT5sZXZlbCA9IGxldmVsOwotCXMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfbGF6eTsKLQlzLT5nb29kX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0uZ29vZF9sZW5ndGg7Ci0Jcy0+bmljZV9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLm5pY2VfbGVuZ3RoOwotCXMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfY2hhaW47CisgICAgICAgIHMtPmxldmVsID0gbGV2ZWw7CisgICAgICAgIHMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfbGF6eTsKKyAgICAgICAgcy0+Z29vZF9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmdvb2RfbGVuZ3RoOworICAgICAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0ubmljZV9sZW5ndGg7CisgICAgICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfY2hhaW47CiAgICAgfQogICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CiAgICAgcmV0dXJuIGVycjsKQEAgLTQ0OSw3ICs0NjQsNyBAQAogewogICAgIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTsKICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTsKLX0gICAKK30KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZS4gQWxsIGRlZmxhdGUoKSBvdXRwdXQgZ29lcwpAQCAtNDg1LDE0ICs1MDAsMTQgQEAKICAgICBkZWZsYXRlX3N0YXRlICpzOwogCiAgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAotCWZsdXNoID4gWl9GSU5JU0ggfHwgZmx1c2ggPCAwKSB7CisgICAgICAgIGZsdXNoID4gWl9GSU5JU0ggfHwgZmx1c2ggPCAwKSB7CiAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICB9CiAgICAgcyA9IHN0cm0tPnN0YXRlOwogCiAgICAgaWYgKHN0cm0tPm5leHRfb3V0ID09IFpfTlVMTCB8fAogICAgICAgICAoc3RybS0+bmV4dF9pbiA9PSBaX05VTEwgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgfHwKLQkocy0+c3RhdHVzID09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPSBaX0ZJTklTSCkpIHsKKyAgICAgICAgKHMtPnN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT0gWl9GSU5JU0gpKSB7CiAgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9TVFJFQU1fRVJST1IpOwogICAgIH0KICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOwpAQCAtNTA5LDQwICs1MjQsNDAgQEAKIAogICAgICAgICBpZiAobGV2ZWxfZmxhZ3MgPiAzKSBsZXZlbF9mbGFncyA9IDM7CiAgICAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7Ci0JaWYgKHMtPnN0cnN0YXJ0ICE9IDApIGhlYWRlciB8PSBQUkVTRVRfRElDVDsKKyAgICAgICAgaWYgKHMtPnN0cnN0YXJ0ICE9IDApIGhlYWRlciB8PSBQUkVTRVRfRElDVDsKICAgICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTsKIAogICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOwogICAgICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpOwogCi0JLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovCi0JaWYgKHMtPnN0cnN0YXJ0ICE9IDApIHsKLQkgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyID4+IDE2KSk7Ci0JICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOwotCX0KLQlzdHJtLT5hZGxlciA9IDFMOworICAgICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi8KKyAgICAgICAgaWYgKHMtPnN0cnN0YXJ0ICE9IDApIHsKKyAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciA+PiAxNikpOworICAgICAgICAgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyICYgMHhmZmZmKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RybS0+YWRsZXIgPSAxTDsKICAgICB9CiAKICAgICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovCiAgICAgaWYgKHMtPnBlbmRpbmcgIT0gMCkgewogICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwogICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKLQkgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aAotCSAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZAotCSAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbywKLQkgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2UKLQkgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOgorICAgICAgICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aAorICAgICAgICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmQKKyAgICAgICAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLAorICAgICAgICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2UKKyAgICAgICAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZToKICAgICAgICAgICAgICAqLwotCSAgICBzLT5sYXN0X2ZsdXNoID0gLTE7Ci0JICAgIHJldHVybiBaX09LOwotCX0KKyAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsKKyAgICAgICAgICAgIHJldHVybiBaX09LOworICAgICAgICB9CiAKICAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmUKICAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcAotICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRkZfRVJST1IuCisgICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLgogICAgICAqLwogICAgIH0gZWxzZSBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBmbHVzaCA8PSBvbGRfZmx1c2ggJiYKLQkgICAgICAgZmx1c2ggIT0gWl9GSU5JU0gpIHsKKyAgICAgICAgICAgICAgIGZsdXNoICE9IFpfRklOSVNIKSB7CiAgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOwogICAgIH0KIApAQCAtNTU3LDI0ICs1NzIsMjQgQEAKICAgICAgICAgKGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgcy0+c3RhdHVzICE9IEZJTklTSF9TVEFURSkpIHsKICAgICAgICAgYmxvY2tfc3RhdGUgYnN0YXRlOwogCi0JYnN0YXRlID0gKCooY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYykpKHMsIGZsdXNoKTsKKyAgICAgICAgYnN0YXRlID0gKCooY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYykpKHMsIGZsdXNoKTsKIAogICAgICAgICBpZiAoYnN0YXRlID09IGZpbmlzaF9zdGFydGVkIHx8IGJzdGF0ZSA9PSBmaW5pc2hfZG9uZSkgewogICAgICAgICAgICAgcy0+c3RhdHVzID0gRklOSVNIX1NUQVRFOwogICAgICAgICB9CiAgICAgICAgIGlmIChic3RhdGUgPT0gbmVlZF9tb3JlIHx8IGJzdGF0ZSA9PSBmaW5pc2hfc3RhcnRlZCkgewotCSAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKLQkgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovCi0JICAgIH0KLQkgICAgcmV0dXJuIFpfT0s7Ci0JICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGwKLQkgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmUKLQkgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuCi0JICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvCi0JICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdAotCSAgICAgKiBvbmUgZW1wdHkgYmxvY2suCi0JICAgICAqLwotCX0KKyAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gWl9PSzsKKyAgICAgICAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlCisgICAgICAgICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW4KKyAgICAgICAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvCisgICAgICAgICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3QKKyAgICAgICAgICAgICAqIG9uZSBlbXB0eSBibG9jay4KKyAgICAgICAgICAgICAqLworICAgICAgICB9CiAgICAgICAgIGlmIChic3RhdGUgPT0gYmxvY2tfZG9uZSkgewogICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfUEFSVElBTF9GTFVTSCkgewogICAgICAgICAgICAgICAgIF90cl9hbGlnbihzKTsKQEAgLTU4OCwxMCArNjAzLDEwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKLQkgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7Ci0JICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi8KLQkgICAgICByZXR1cm4gWl9PSzsKLQkgICAgfQorICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovCisgICAgICAgICAgICAgIHJldHVybiBaX09LOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIEFzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCAiYnVnMiIpOwpAQCAtNjIwLDcgKzYzNSw3IEBACiAKICAgICBzdGF0dXMgPSBzdHJtLT5zdGF0ZS0+c3RhdHVzOwogICAgIGlmIChzdGF0dXMgIT0gSU5JVF9TVEFURSAmJiBzdGF0dXMgIT0gQlVTWV9TVEFURSAmJgotCXN0YXR1cyAhPSBGSU5JU0hfU1RBVEUpIHsKKyAgICAgICAgc3RhdHVzICE9IEZJTklTSF9TVEFURSkgewogICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgIH0KIApAQCAtNjkzLDcgKzcwOCw3IEBACiAgICAgZHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBkcy0+YmxfdHJlZTsKIAogICAgIHJldHVybiBaX09LOwotI2VuZGlmCisjZW5kaWYgLyogTUFYU0VHXzY0SyAqLwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTc1Myw2ICs3NjgsNyBAQAogI2VuZGlmCiB9CiAKKyNpZm5kZWYgRkFTVEVTVAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmQKICAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCwKQEAgLTc2Niw3ICs3ODIsNiBAQAogLyogRm9yIDgweDg2IGFuZCA2ODB4MCwgYW4gb3B0aW1pemVkIHZlcnNpb24gd2lsbCBiZSBwcm92aWRlZCBpbiBtYXRjaC5hc20gb3IKICAqIG1hdGNoLlMuIFRoZSBjb2RlIHdpbGwgYmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQuCiAgKi8KLSNpZm5kZWYgRkFTVEVTVAogbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKICAgICBkZWZsYXRlX3N0YXRlICpzOwogICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLwpAQCAtOTA0LDEyICs5MTksMTMgQEAKICAgICBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CiAgICAgcmV0dXJuIHMtPmxvb2thaGVhZDsKIH0KKyNlbmRpZiAvKiBBU01WICovCisjZW5kaWYgLyogRkFTVEVTVCAqLwogCi0jZWxzZSAvKiBGQVNURVNUICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE9wdGltaXplZCB2ZXJzaW9uIGZvciBsZXZlbCA9PSAxIG9ubHkKKyAqIE9wdGltaXplZCB2ZXJzaW9uIGZvciBsZXZlbCA9PSAxIG9yIHN0cmF0ZWd5ID09IFpfUkxFIG9ubHkKICAqLwotbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKK2xvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaF9mYXN0KHMsIGN1cl9tYXRjaCkKICAgICBkZWZsYXRlX3N0YXRlICpzOwogICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLwogewpAQCAtOTQ3LDEwICs5NjMsMTAgQEAKICAgICAgKi8KICAgICBkbyB7CiAgICAgfSB3aGlsZSAoKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCi0JICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLQkgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgotCSAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCi0JICAgICBzY2FuIDwgc3RyZW5kKTsKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKIAogICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CiAKQEAgLTk2MSw4ICs5NzcsNiBAQAogICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOwogICAgIHJldHVybiBsZW4gPD0gcy0+bG9va2FoZWFkID8gbGVuIDogcy0+bG9va2FoZWFkOwogfQotI2VuZGlmIC8qIEZBU1RFU1QgKi8KLSNlbmRpZiAvKiBBU01WICovCiAKICNpZmRlZiBERUJVRwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC05NzcsMTAgKzk5MSwxMCBAQAogICAgIGlmICh6bWVtY21wKHMtPndpbmRvdyArIG1hdGNoLAogICAgICAgICAgICAgICAgIHMtPndpbmRvdyArIHN0YXJ0LCBsZW5ndGgpICE9IEVRVUFMKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIHN0YXJ0ICV1LCBtYXRjaCAldSwgbGVuZ3RoICVkXG4iLAotCQlzdGFydCwgbWF0Y2gsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgc3RhcnQsIG1hdGNoLCBsZW5ndGgpOwogICAgICAgICBkbyB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiJWMlYyIsIHMtPndpbmRvd1ttYXRjaCsrXSwgcy0+d2luZG93W3N0YXJ0KytdKTsKLQl9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWMlYyIsIHMtPndpbmRvd1ttYXRjaCsrXSwgcy0+d2luZG93W3N0YXJ0KytdKTsKKyAgICAgICAgfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7CiAgICAgICAgIHpfZXJyb3IoImludmFsaWQgbWF0Y2giKTsKICAgICB9CiAgICAgaWYgKHpfdmVyYm9zZSA+IDEpIHsKQEAgLTk5MCw3ICsxMDA0LDcgQEAKIH0KICNlbHNlCiAjICBkZWZpbmUgY2hlY2tfbWF0Y2gocywgc3RhcnQsIG1hdGNoLCBsZW5ndGgpCi0jZW5kaWYKKyNlbmRpZiAvKiBERUJVRyAqLwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZpbGwgdGhlIHdpbmRvdyB3aGVuIHRoZSBsb29rYWhlYWQgYmVjb21lcyBpbnN1ZmZpY2llbnQuCkBAIC0xMDM5LDIzICsxMDUzLDIzIEBACiAgICAgICAgICAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2YKICAgICAgICAgICAgICAgIHpsaWIsIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBwYXRob2xvZ2ljYWwgY2FzZS4pCiAgICAgICAgICAgICAgKi8KLQkgICAgbiA9IHMtPmhhc2hfc2l6ZTsKLQkgICAgcCA9ICZzLT5oZWFkW25dOwotCSAgICBkbyB7Ci0JCW0gPSAqLS1wOwotCQkqcCA9IChQb3MpKG0gPj0gd3NpemUgPyBtLXdzaXplIDogTklMKTsKLQkgICAgfSB3aGlsZSAoLS1uKTsKKyAgICAgICAgICAgIG4gPSBzLT5oYXNoX3NpemU7CisgICAgICAgICAgICBwID0gJnMtPmhlYWRbbl07CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbSA9ICotLXA7CisgICAgICAgICAgICAgICAgKnAgPSAoUG9zKShtID49IHdzaXplID8gbS13c2l6ZSA6IE5JTCk7CisgICAgICAgICAgICB9IHdoaWxlICgtLW4pOwogCi0JICAgIG4gPSB3c2l6ZTsKKyAgICAgICAgICAgIG4gPSB3c2l6ZTsKICNpZm5kZWYgRkFTVEVTVAotCSAgICBwID0gJnMtPnByZXZbbl07Ci0JICAgIGRvIHsKLQkJbSA9ICotLXA7Ci0JCSpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOwotCQkvKiBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dAotCQkgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLgotCQkgKi8KLQkgICAgfSB3aGlsZSAoLS1uKTsKKyAgICAgICAgICAgIHAgPSAmcy0+cHJldltuXTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtID0gKi0tcDsKKyAgICAgICAgICAgICAgICAqcCA9IChQb3MpKG0gPj0gd3NpemUgPyBtLXdzaXplIDogTklMKTsKKyAgICAgICAgICAgICAgICAvKiBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dAorICAgICAgICAgICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9IHdoaWxlICgtLW4pOwogI2VuZGlmCiAgICAgICAgICAgICBtb3JlICs9IHdzaXplOwogICAgICAgICB9CkBAIC0xMTAwLDggKzExMTQsOCBAQAogICAgX3RyX2ZsdXNoX2Jsb2NrKHMsIChzLT5ibG9ja19zdGFydCA+PSAwTCA/IFwKICAgICAgICAgICAgICAgICAgICAoY2hhcmYgKikmcy0+d2luZG93Wyh1bnNpZ25lZClzLT5ibG9ja19zdGFydF0gOiBcCiAgICAgICAgICAgICAgICAgICAgKGNoYXJmICopWl9OVUxMKSwgXAotCQkodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KSwgXAotCQkoZW9mKSk7IFwKKyAgICAgICAgICAgICAgICAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KSwgXAorICAgICAgICAgICAgICAgIChlb2YpKTsgXAogICAgcy0+YmxvY2tfc3RhcnQgPSBzLT5zdHJzdGFydDsgXAogICAgZmx1c2hfcGVuZGluZyhzLT5zdHJtKTsgXAogICAgVHJhY2V2KChzdGRlcnIsIltGTFVTSF0iKSk7IFwKQEAgLTExNDIsMzIgKzExNTYsMzIgQEAKICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8PSAxKSB7CiAKICAgICAgICAgICAgIEFzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fAotCQkgICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsICJzbGlkZSB0b28gbGF0ZSIpOworICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgInNsaWRlIHRvbyBsYXRlIik7CiAKICAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOwogICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHJldHVybiBuZWVkX21vcmU7CiAKICAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCiAgICAgICAgIH0KLQlBc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsICJibG9jayBnb25lIik7CisgICAgICAgIEFzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgImJsb2NrIGdvbmUiKTsKIAotCXMtPnN0cnN0YXJ0ICs9IHMtPmxvb2thaGVhZDsKLQlzLT5sb29rYWhlYWQgPSAwOworICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5sb29rYWhlYWQ7CisgICAgICAgIHMtPmxvb2thaGVhZCA9IDA7CiAKLQkvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi8KLSAJbWF4X3N0YXJ0ID0gcy0+YmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTsKKyAgICAgICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovCisgICAgICAgIG1heF9zdGFydCA9IHMtPmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7CiAgICAgICAgIGlmIChzLT5zdHJzdGFydCA9PSAwIHx8ICh1bGcpcy0+c3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7Ci0JICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovCi0JICAgIHMtPmxvb2thaGVhZCA9ICh1SW50KShzLT5zdHJzdGFydCAtIG1heF9zdGFydCk7Ci0JICAgIHMtPnN0cnN0YXJ0ID0gKHVJbnQpbWF4X3N0YXJ0OworICAgICAgICAgICAgLyogc3Ryc3RhcnQgPT0gMCBpcyBwb3NzaWJsZSB3aGVuIHdyYXBhcm91bmQgb24gMTYtYml0IG1hY2hpbmUgKi8KKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCA9ICh1SW50KShzLT5zdHJzdGFydCAtIG1heF9zdGFydCk7CisgICAgICAgICAgICBzLT5zdHJzdGFydCA9ICh1SW50KW1heF9zdGFydDsKICAgICAgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOwotCX0KLQkvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWUKKyAgICAgICAgfQorICAgICAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWUKICAgICAgICAgICogbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZToKICAgICAgICAgICovCiAgICAgICAgIGlmIChzLT5zdHJzdGFydCAtICh1SW50KXMtPmJsb2NrX3N0YXJ0ID49IE1BWF9ESVNUKHMpKSB7CiAgICAgICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKLQl9CisgICAgICAgIH0KICAgICB9CiAgICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOwogICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKQEAgLTExOTYsOCArMTIxMCw4IEBACiAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CiAgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKICAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHsKLQkgICAgICAgIHJldHVybiBuZWVkX21vcmU7Ci0JICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmVlZF9tb3JlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KICAgICAgICAgfQogCkBAIC0xMjE2LDEwICsxMjMwLDE5IEBACiAgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZKSB7Ci0gICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKKyNpZmRlZiBGQVNURVNUCisgICAgICAgICAgICBpZiAoKHMtPnN0cmF0ZWd5IDwgWl9IVUZGTUFOX09OTFkpIHx8CisgICAgICAgICAgICAgICAgKHMtPnN0cmF0ZWd5ID09IFpfUkxFICYmIHMtPnN0cnN0YXJ0IC0gaGFzaF9oZWFkID09IDEpKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaF9mYXN0IChzLCBoYXNoX2hlYWQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KKyNlbHNlCisgICAgICAgICAgICBpZiAocy0+c3RyYXRlZ3kgPCBaX0hVRkZNQU5fT05MWSkgeworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2ggKHMsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPnN0cmF0ZWd5ID09IFpfUkxFICYmIHMtPnN0cnN0YXJ0IC0gaGFzaF9oZWFkID09IDEpIHsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoX2Zhc3QgKHMsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBvciBsb25nZXN0X21hdGNoX2Zhc3QoKSBzZXRzIG1hdGNoX3N0YXJ0ICovCiAgICAgICAgIH0KICAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHsKICAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LCBzLT5tYXRjaF9zdGFydCwgcy0+bWF0Y2hfbGVuZ3RoKTsKQEAgLTEyNDMsMTAgKzEyNjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC4KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5tYXRjaF9sZW5ndGggIT0gMCk7Ci0gICAgICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsgCisgICAgICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKICAgICAgICAgICAgIH0gZWxzZQogI2VuZGlmCi0JICAgIHsKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5tYXRjaF9sZW5ndGg7CiAgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICBzLT5pbnNfaCA9IHMtPndpbmRvd1tzLT5zdHJzdGFydF07CkBAIC0xMjYzLDcgKzEyODYsNyBAQAogICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKICAgICAgICAgICAgIF90cl90YWxseV9saXQgKHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0sIGJmbHVzaCk7CiAgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7IAorICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKICAgICAgICAgfQogICAgICAgICBpZiAoYmZsdXNoKSBGTFVTSF9CTE9DSyhzLCAwKTsKICAgICB9CkBAIC0xMjcxLDYgKzEyOTQsNyBAQAogICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKIH0KIAorI2lmbmRlZiBGQVNURVNUCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenkKICAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXMKQEAgLTEyOTMsOCArMTMxNyw4IEBACiAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CiAgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKICAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHsKLQkgICAgICAgIHJldHVybiBuZWVkX21vcmU7Ci0JICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmVlZF9tb3JlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KICAgICAgICAgfQogCkBAIC0xMzE2LDEwICsxMzQwLDEyIEBACiAgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZKSB7CisgICAgICAgICAgICBpZiAocy0+c3RyYXRlZ3kgPCBaX0hVRkZNQU5fT05MWSkgewogICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2ggKHMsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPnN0cmF0ZWd5ID09IFpfUkxFICYmIHMtPnN0cnN0YXJ0IC0gaGFzaF9oZWFkID09IDEpIHsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoX2Zhc3QgKHMsIGhhc2hfaGVhZCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqLworICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIG9yIGxvbmdlc3RfbWF0Y2hfZmFzdCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KIAogICAgICAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA8PSA1ICYmIChzLT5zdHJhdGVneSA9PSBaX0ZJTFRFUkVEIHx8CiAgICAgICAgICAgICAgICAgIChzLT5tYXRjaF9sZW5ndGggPT0gTUlOX01BVENIICYmCkBAIC0xMzQxLDcgKzEzNjcsNyBAQAogICAgICAgICAgICAgY2hlY2tfbWF0Y2gocywgcy0+c3Ryc3RhcnQtMSwgcy0+cHJldl9tYXRjaCwgcy0+cHJldl9sZW5ndGgpOwogCiAgICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCBzLT5zdHJzdGFydCAtMSAtIHMtPnByZXZfbWF0Y2gsCi0JCQkgICBzLT5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOwogCiAgICAgICAgICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC4KICAgICAgICAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3QKQEAgLTEzNjcsOCArMTM5Myw4IEBACiAgICAgICAgICAgICAgKiBpcyBsb25nZXIsIHRydW5jYXRlIHRoZSBwcmV2aW91cyBtYXRjaCB0byBhIHNpbmdsZSBsaXRlcmFsLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7Ci0JICAgIF90cl90YWxseV9saXQocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdLCBiZmx1c2gpOwotCSAgICBpZiAoYmZsdXNoKSB7CisgICAgICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKKyAgICAgICAgICAgIGlmIChiZmx1c2gpIHsKICAgICAgICAgICAgICAgICBGTFVTSF9CTE9DS19PTkxZKHMsIDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKQEAgLTEzOTIsMyArMTQxOCw0IEBACiAgICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOwogICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKIH0KKyNlbmRpZiAvKiBGQVNURVNUICovCmRpZmYgLS1naXQgYS9kZWZsYXRlLmggYi9kZWZsYXRlLmgKaW5kZXggYjk5YTQ4YS4uYzNmODg1OCAxMDA2NDQKLS0tIGEvZGVmbGF0ZS5oCisrKyBiL2RlZmxhdGUuaApAQCAtMjY5LDcgKzI2OSw3IEBACiB2b2lkIF90cl9pbml0ICAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKIGludCAgX3RyX3RhbGx5ICAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdW5zaWduZWQgZGlzdCwgdW5zaWduZWQgbGMpKTsKIHZvaWQgX3RyX2ZsdXNoX2Jsb2NrICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sCi0JCQkgIGludCBlb2YpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVvZikpOwogdm9pZCBfdHJfYWxpZ24gICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7CiB2b2lkIF90cl9zdG9yZWRfYmxvY2sgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsIHVsZyBzdG9yZWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW9mKSk7CmRpZmYgLS1naXQgYS9leGFtcGxlLmMgYi9leGFtcGxlLmMKaW5kZXggODgyMGU1Ni4uOWZkMTNjZSAxMDA2NDQKLS0tIGEvZXhhbXBsZS5jCisrKyBiL2V4YW1wbGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIGV4YW1wbGUuYyAtLSB1c2FnZSBleGFtcGxlIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKICAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKIC8qIEAoIykgJElkJCAqLwpAQCAtMzcsMjIgKzM3LDIyIEBACiB1TG9uZyBkaWN0SWQ7IC8qIEFkbGVyMzIgdmFsdWUgb2YgdGhlIGRpY3Rpb25hcnkgKi8KIAogdm9pZCB0ZXN0X2NvbXByZXNzICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLQkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwotdm9pZCB0ZXN0X2d6aW8gICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKm91dCwgY29uc3QgY2hhciAqaW4sIAotCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCBpbnQgdW5jb21wckxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKK3ZvaWQgdGVzdF9nemlvICAgICAgICAgIE9GKChjb25zdCBjaGFyICpvdXQsIGNvbnN0IGNoYXIgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIGludCB1bmNvbXByTGVuKSk7CiB2b2lkIHRlc3RfZGVmbGF0ZSAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuKSk7CiB2b2lkIHRlc3RfaW5mbGF0ZSAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAotCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwogdm9pZCB0ZXN0X2xhcmdlX2RlZmxhdGUgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLQkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKIHZvaWQgdGVzdF9sYXJnZV9pbmZsYXRlIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCi0JCSAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7CiB2b2lkIHRlc3RfZmx1c2ggICAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nICpjb21wckxlbikpOwogdm9pZCB0ZXN0X3N5bmMgICAgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLQkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKIHZvaWQgdGVzdF9kaWN0X2RlZmxhdGUgIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4pKTsKIHZvaWQgdGVzdF9kaWN0X2luZmxhdGUgIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCi0JCSAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7CiBpbnQgIG1haW4gICAgICAgICAgICAgICBPRigoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkpOwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTc1LDcgKzc1LDcgQEAKIAogICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCB1bmNvbXByZXNzXG4iKTsKLQlleGl0KDEpOworICAgICAgICBleGl0KDEpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHByaW50ZigidW5jb21wcmVzcygpOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKICAgICB9CkBAIC0xMDMsMTEgKzEwMywxMSBAQAogICAgIGd6cHV0YyhmaWxlLCAnaCcpOwogICAgIGlmIChnenB1dHMoZmlsZSwgImVsbG8iKSAhPSA0KSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pwdXRzIGVycjogJXNcbiIsIGd6ZXJyb3IoZmlsZSwgJmVycikpOwotCWV4aXQoMSk7CisgICAgICAgIGV4aXQoMSk7CiAgICAgfQogICAgIGlmIChnenByaW50ZihmaWxlLCAiLCAlcyEiLCAiaGVsbG8iKSAhPSA4KSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pwcmludGYgZXJyOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7Ci0JZXhpdCgxKTsKKyAgICAgICAgZXhpdCgxKTsKICAgICB9CiAgICAgZ3pzZWVrKGZpbGUsIDFMLCBTRUVLX0NVUik7IC8qIGFkZCBvbmUgemVybyBieXRlICovCiAgICAgZ3pjbG9zZShmaWxlKTsKQEAgLTEyMSwzNiArMTIxLDM2IEBACiAgICAgdW5jb21wckxlbiA9IGd6cmVhZChmaWxlLCB1bmNvbXByLCAodW5zaWduZWQpdW5jb21wckxlbik7CiAgICAgaWYgKHVuY29tcHJMZW4gIT0gbGVuKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pyZWFkIGVycjogJXNcbiIsIGd6ZXJyb3IoZmlsZSwgJmVycikpOwotCWV4aXQoMSk7CisgICAgICAgIGV4aXQoMSk7CiAgICAgfQogICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBnenJlYWQ6ICVzXG4iLCAoY2hhciopdW5jb21wcik7Ci0JZXhpdCgxKTsKKyAgICAgICAgZXhpdCgxKTsKICAgICB9IGVsc2UgewogICAgICAgICBwcmludGYoImd6cmVhZCgpOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKICAgICB9CiAKICAgICBwb3MgPSBnenNlZWsoZmlsZSwgLThMLCBTRUVLX0NVUik7CiAgICAgaWYgKHBvcyAhPSA2IHx8IGd6dGVsbChmaWxlKSAhPSBwb3MpIHsKLQlmcHJpbnRmKHN0ZGVyciwgImd6c2VlayBlcnJvciwgcG9zPSVsZCwgZ3p0ZWxsPSVsZFxuIiwKLQkJKGxvbmcpcG9zLCAobG9uZylnenRlbGwoZmlsZSkpOwotCWV4aXQoMSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pzZWVrIGVycm9yLCBwb3M9JWxkLCBnenRlbGw9JWxkXG4iLAorICAgICAgICAgICAgICAgIChsb25nKXBvcywgKGxvbmcpZ3p0ZWxsKGZpbGUpKTsKKyAgICAgICAgZXhpdCgxKTsKICAgICB9CiAKICAgICBpZiAoZ3pnZXRjKGZpbGUpICE9ICcgJykgewotCWZwcmludGYoc3RkZXJyLCAiZ3pnZXRjIGVycm9yXG4iKTsKLQlleGl0KDEpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6Z2V0YyBlcnJvclxuIik7CisgICAgICAgIGV4aXQoMSk7CiAgICAgfQogCiAgICAgZ3pnZXRzKGZpbGUsIChjaGFyKil1bmNvbXByLCB1bmNvbXByTGVuKTsKICAgICB1bmNvbXByTGVuID0gc3RybGVuKChjaGFyKil1bmNvbXByKTsKICAgICBpZiAodW5jb21wckxlbiAhPSA2KSB7IC8qICJoZWxsbyEiICovCiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pnZXRzIGVyciBhZnRlciBnenNlZWs6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKLQlleGl0KDEpOworICAgICAgICBleGl0KDEpOwogICAgIH0KICAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbys3KSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBnemdldHMgYWZ0ZXIgZ3pzZWVrXG4iKTsKLQlleGl0KDEpOworICAgICAgICBleGl0KDEpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHByaW50ZigiZ3pnZXRzKCkgYWZ0ZXIgZ3pzZWVrOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKICAgICB9CkBAIC0yMzEsNyArMjMxLDcgQEAKIAogICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBpbmZsYXRlXG4iKTsKLQlleGl0KDEpOworICAgICAgICBleGl0KDEpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHByaW50ZigiaW5mbGF0ZSgpOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKICAgICB9CkBAIC0yNjYsNyArMjY2LDcgQEAKICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwogICAgIGlmIChjX3N0cmVhbS5hdmFpbF9pbiAhPSAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBub3QgZ3JlZWR5XG4iKTsKLQlleGl0KDEpOworICAgICAgICBleGl0KDEpOwogICAgIH0KIAogICAgIC8qIEZlZWQgaW4gYWxyZWFkeSBjb21wcmVzc2VkIGRhdGEgYW5kIHN3aXRjaCB0byBubyBjb21wcmVzc2lvbjogKi8KQEAgLTI4Niw3ICsyODYsNyBAQAogICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZJTklTSCk7CiAgICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWZsYXRlIHNob3VsZCByZXBvcnQgWl9TVFJFQU1fRU5EXG4iKTsKLQlleGl0KDEpOworICAgICAgICBleGl0KDEpOwogICAgIH0KICAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7CiAgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKQEAgLTMxNiw3ICszMTYsNyBAQAogCiAgICAgZm9yICg7OykgewogICAgICAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7ICAgICAgICAgICAgLyogZGlzY2FyZCB0aGUgb3V0cHV0ICovCi0JZF9zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpdW5jb21wckxlbjsKKyAgICAgICAgZF9zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpdW5jb21wckxlbjsKICAgICAgICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOwogICAgICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgYnJlYWs7CiAgICAgICAgIENIRUNLX0VSUihlcnIsICJsYXJnZSBpbmZsYXRlIik7CkBAIC0zMjcsNyArMzI3LDcgQEAKIAogICAgIGlmIChkX3N0cmVhbS50b3RhbF9vdXQgIT0gMip1bmNvbXByTGVuICsgY29tcHJMZW4vMikgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBsYXJnZSBpbmZsYXRlOiAlbGRcbiIsIGRfc3RyZWFtLnRvdGFsX291dCk7Ci0JZXhpdCgxKTsKKyAgICAgICAgZXhpdCgxKTsKICAgICB9IGVsc2UgewogICAgICAgICBwcmludGYoImxhcmdlX2luZmxhdGUoKTogT0tcbiIpOwogICAgIH0KQEAgLTQwNyw3ICs0MDcsNyBAQAogICAgIGlmIChlcnIgIT0gWl9EQVRBX0VSUk9SKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5mbGF0ZSBzaG91bGQgcmVwb3J0IERBVEFfRVJST1JcbiIpOwogICAgICAgICAvKiBCZWNhdXNlIG9mIGluY29ycmVjdCBhZGxlcjMyICovCi0JZXhpdCgxKTsKKyAgICAgICAgZXhpdCgxKTsKICAgICB9CiAgICAgZXJyID0gaW5mbGF0ZUVuZCgmZF9zdHJlYW0pOwogICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlRW5kIik7CkBAIC00MzMsNyArNDMzLDcgQEAKICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUluaXQiKTsKIAogICAgIGVyciA9IGRlZmxhdGVTZXREaWN0aW9uYXJ5KCZjX3N0cmVhbSwKLQkJCSAgICAgICAoY29uc3QgQnl0ZWYqKWRpY3Rpb25hcnksIHNpemVvZihkaWN0aW9uYXJ5KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEJ5dGVmKilkaWN0aW9uYXJ5LCBzaXplb2YoZGljdGlvbmFyeSkpOwogICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlU2V0RGljdGlvbmFyeSIpOwogCiAgICAgZGljdElkID0gY19zdHJlYW0uYWRsZXI7CkBAIC00NDYsNyArNDQ2LDcgQEAKICAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GSU5JU0gpOwogICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBzaG91bGQgcmVwb3J0IFpfU1RSRUFNX0VORFxuIik7Ci0JZXhpdCgxKTsKKyAgICAgICAgZXhpdCgxKTsKICAgICB9CiAgICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOwogICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7CkBAIC00ODAsMTQgKzQ4MCwxNCBAQAogICAgIGZvciAoOzspIHsKICAgICAgICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOwogICAgICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgYnJlYWs7Ci0JaWYgKGVyciA9PSBaX05FRURfRElDVCkgewotCSAgICBpZiAoZF9zdHJlYW0uYWRsZXIgIT0gZGljdElkKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAidW5leHBlY3RlZCBkaWN0aW9uYXJ5Iik7Ci0JCWV4aXQoMSk7Ci0JICAgIH0KLQkgICAgZXJyID0gaW5mbGF0ZVNldERpY3Rpb25hcnkoJmRfc3RyZWFtLCAoY29uc3QgQnl0ZWYqKWRpY3Rpb25hcnksCi0JCQkJICAgICAgIHNpemVvZihkaWN0aW9uYXJ5KSk7Ci0JfQorICAgICAgICBpZiAoZXJyID09IFpfTkVFRF9ESUNUKSB7CisgICAgICAgICAgICBpZiAoZF9zdHJlYW0uYWRsZXIgIT0gZGljdElkKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmV4cGVjdGVkIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gaW5mbGF0ZVNldERpY3Rpb25hcnkoJmRfc3RyZWFtLCAoY29uc3QgQnl0ZWYqKWRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGljdGlvbmFyeSkpOworICAgICAgICB9CiAgICAgICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIHdpdGggZGljdCIpOwogICAgIH0KIApAQCAtNDk2LDcgKzQ5Niw3IEBACiAKICAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgaW5mbGF0ZSB3aXRoIGRpY3RcbiIpOwotCWV4aXQoMSk7CisgICAgICAgIGV4aXQoMSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcHJpbnRmKCJpbmZsYXRlIHdpdGggZGljdGlvbmFyeTogJXNcbiIsIChjaGFyICopdW5jb21wcik7CiAgICAgfQpAQCAtNTMwLDEzICs1MzAsMTMgQEAKICAgICAgKi8KICAgICBpZiAoY29tcHIgPT0gWl9OVUxMIHx8IHVuY29tcHIgPT0gWl9OVUxMKSB7CiAgICAgICAgIHByaW50Zigib3V0IG9mIG1lbW9yeVxuIik7Ci0JZXhpdCgxKTsKKyAgICAgICAgZXhpdCgxKTsKICAgICB9CiAgICAgdGVzdF9jb21wcmVzcyhjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwogCiAgICAgdGVzdF9nemlvKChhcmdjID4gMSA/IGFyZ3ZbMV0gOiBURVNURklMRSksCiAgICAgICAgICAgICAgIChhcmdjID4gMiA/IGFyZ3ZbMl0gOiBURVNURklMRSksCi0JICAgICAgdW5jb21wciwgKGludCl1bmNvbXByTGVuKTsKKyAgICAgICAgICAgICAgdW5jb21wciwgKGludCl1bmNvbXByTGVuKTsKIAogICAgIHRlc3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pOwogICAgIHRlc3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwpAQCAtNTU0LDYgKzU1NCw1IEBACiAgICAgZnJlZShjb21wcik7CiAgICAgZnJlZSh1bmNvbXByKTsKIAotICAgIGV4aXQoMCk7Ci0gICAgcmV0dXJuIDA7IC8qIHRvIGF2b2lkIHdhcm5pbmcgKi8KKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2d6aW8uYyBiL2d6aW8uYwppbmRleCAzMzM3MzUzLi4xZjU2MWFjIDEwMDY0NAotLS0gYS9nemlvLmMKKysrIGIvZ3ppby5jCkBAIC0xMTcsMTcgKzExNywxOSBAQAogICAgICAgICBpZiAoKnAgPT0gJ3InKSBzLT5tb2RlID0gJ3InOwogICAgICAgICBpZiAoKnAgPT0gJ3cnIHx8ICpwID09ICdhJykgcy0+bW9kZSA9ICd3JzsKICAgICAgICAgaWYgKCpwID49ICcwJyAmJiAqcCA8PSAnOScpIHsKLQkgICAgbGV2ZWwgPSAqcCAtICcwJzsKLQl9IGVsc2UgaWYgKCpwID09ICdmJykgewotCSAgc3RyYXRlZ3kgPSBaX0ZJTFRFUkVEOwotCX0gZWxzZSBpZiAoKnAgPT0gJ2gnKSB7Ci0JICBzdHJhdGVneSA9IFpfSFVGRk1BTl9PTkxZOwotCX0gZWxzZSB7Ci0JICAgICptKysgPSAqcDsgLyogY29weSB0aGUgbW9kZSAqLwotCX0KKyAgICAgICAgICAgIGxldmVsID0gKnAgLSAnMCc7CisgICAgICAgIH0gZWxzZSBpZiAoKnAgPT0gJ2YnKSB7CisgICAgICAgICAgc3RyYXRlZ3kgPSBaX0ZJTFRFUkVEOworICAgICAgICB9IGVsc2UgaWYgKCpwID09ICdoJykgeworICAgICAgICAgIHN0cmF0ZWd5ID0gWl9IVUZGTUFOX09OTFk7CisgICAgICAgIH0gZWxzZSBpZiAoKnAgPT0gJ1InKSB7CisgICAgICAgICAgc3RyYXRlZ3kgPSBaX1JMRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICptKysgPSAqcDsgLyogY29weSB0aGUgbW9kZSAqLworICAgICAgICB9CiAgICAgfSB3aGlsZSAoKnArKyAmJiBtICE9IGZtb2RlICsgc2l6ZW9mKGZtb2RlKSk7CiAgICAgaWYgKHMtPm1vZGUgPT0gJ1wwJykgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOwotICAgIAorCiAgICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7CiAjaWZkZWYgTk9fREVGTEFURQogICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKQEAgLTE2OCwxNyArMTcwLDE3IEBACiAgICAgICAgICAqLwogICAgICAgICBmcHJpbnRmKHMtPmZpbGUsICIlYyVjJWMlYyVjJWMlYyVjJWMlYyIsIGd6X21hZ2ljWzBdLCBnel9tYWdpY1sxXSwKICAgICAgICAgICAgICBaX0RFRkxBVEVELCAwIC8qZmxhZ3MqLywgMCwwLDAsMCAvKnRpbWUqLywgMCAvKnhmbGFncyovLCBPU19DT0RFKTsKLQlzLT5zdGFydHBvcyA9IDEwTDsKLQkvKiBXZSB1c2UgMTBMIGluc3RlYWQgb2YgZnRlbGwocy0+ZmlsZSkgdG8gYmVjYXVzZSBmdGVsbCBjYXVzZXMgYW4KKyAgICAgICAgcy0+c3RhcnRwb3MgPSAxMEw7CisgICAgICAgIC8qIFdlIHVzZSAxMEwgaW5zdGVhZCBvZiBmdGVsbChzLT5maWxlKSB0byBiZWNhdXNlIGZ0ZWxsIGNhdXNlcyBhbgogICAgICAgICAgKiBmZmx1c2ggb24gc29tZSBzeXN0ZW1zLiBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgZG9lc24ndCB1c2UKICAgICAgICAgICogc3RhcnRwb3MgYW55d2F5IGluIHdyaXRlIG1vZGUsIHNvIHRoaXMgaW5pdGlhbGl6YXRpb24gaXMgbm90CiAgICAgICAgICAqIG5lY2Vzc2FyeS4KICAgICAgICAgICovCiAgICAgfSBlbHNlIHsKLQljaGVja19oZWFkZXIocyk7IC8qIHNraXAgdGhlIC5neiBoZWFkZXIgKi8KLQlzLT5zdGFydHBvcyA9IChmdGVsbChzLT5maWxlKSAtIHMtPnN0cmVhbS5hdmFpbF9pbik7CisgICAgICAgIGNoZWNrX2hlYWRlcihzKTsgLyogc2tpcCB0aGUgLmd6IGhlYWRlciAqLworICAgICAgICBzLT5zdGFydHBvcyA9IChmdGVsbChzLT5maWxlKSAtIHMtPnN0cmVhbS5hdmFpbF9pbik7CiAgICAgfQotICAgIAorCiAgICAgcmV0dXJuIChnekZpbGUpczsKIH0KIApAQCAtMjIzLDExICsyMjUsMTEgQEAKICAgICAvKiBNYWtlIHJvb20gdG8gYWxsb3cgZmx1c2hpbmcgKi8KICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX291dCA9PSAwKSB7CiAKLQlzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWY7Ci0JaWYgKGZ3cml0ZShzLT5vdXRidWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSkgIT0gWl9CVUZTSVpFKSB7Ci0JICAgIHMtPnpfZXJyID0gWl9FUlJOTzsKLQl9Ci0Jcy0+c3RyZWFtLmF2YWlsX291dCA9IFpfQlVGU0laRTsKKyAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmOworICAgICAgICBpZiAoZndyaXRlKHMtPm91dGJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKSAhPSBaX0JVRlNJWkUpIHsKKyAgICAgICAgICAgIHMtPnpfZXJyID0gWl9FUlJOTzsKKyAgICAgICAgfQorICAgICAgICBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gWl9CVUZTSVpFOwogICAgIH0KIAogICAgIHJldHVybiBkZWZsYXRlUGFyYW1zICgmKHMtPnN0cmVhbSksIGxldmVsLCBzdHJhdGVneSk7CkBAIC0yNDMsMTQgKzI0NSwxNCBAQAogewogICAgIGlmIChzLT56X2VvZikgcmV0dXJuIEVPRjsKICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDApIHsKLQllcnJubyA9IDA7Ci0Jcy0+c3RyZWFtLmF2YWlsX2luID0gZnJlYWQocy0+aW5idWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSk7Ci0JaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSB7Ci0JICAgIHMtPnpfZW9mID0gMTsKLQkgICAgaWYgKGZlcnJvcihzLT5maWxlKSkgcy0+el9lcnIgPSBaX0VSUk5POwotCSAgICByZXR1cm4gRU9GOwotCX0KLQlzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IGZyZWFkKHMtPmluYnVmLCAxLCBaX0JVRlNJWkUsIHMtPmZpbGUpOworICAgICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDApIHsKKyAgICAgICAgICAgIHMtPnpfZW9mID0gMTsKKyAgICAgICAgICAgIGlmIChmZXJyb3Iocy0+ZmlsZSkpIHMtPnpfZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgIH0KKyAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKICAgICB9CiAgICAgcy0+c3RyZWFtLmF2YWlsX2luLS07CiAgICAgcmV0dXJuICoocy0+c3RyZWFtLm5leHRfaW4pKys7CkBAIC0yOTIsNyArMjk0LDcgQEAKIAogICAgIC8qIFBlZWsgYWhlYWQgdG8gY2hlY2sgdGhlIGd6aXAgbWFnaWMgaGVhZGVyICovCiAgICAgaWYgKHMtPnN0cmVhbS5uZXh0X2luWzBdICE9IGd6X21hZ2ljWzBdIHx8Ci0Jcy0+c3RyZWFtLm5leHRfaW5bMV0gIT0gZ3pfbWFnaWNbMV0pIHsKKyAgICAgICAgcy0+c3RyZWFtLm5leHRfaW5bMV0gIT0gZ3pfbWFnaWNbMV0pIHsKICAgICAgICAgcy0+dHJhbnNwYXJlbnQgPSAxOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMzAzLDI3ICszMDUsMjcgQEAKICAgICBtZXRob2QgPSBnZXRfYnl0ZShzKTsKICAgICBmbGFncyA9IGdldF9ieXRlKHMpOwogICAgIGlmIChtZXRob2QgIT0gWl9ERUZMQVRFRCB8fCAoZmxhZ3MgJiBSRVNFUlZFRCkgIT0gMCkgewotCXMtPnpfZXJyID0gWl9EQVRBX0VSUk9SOwotCXJldHVybjsKKyAgICAgICAgcy0+el9lcnIgPSBaX0RBVEFfRVJST1I7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICAvKiBEaXNjYXJkIHRpbWUsIHhmbGFncyBhbmQgT1MgY29kZTogKi8KICAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IDY7IGxlbisrKSAodm9pZClnZXRfYnl0ZShzKTsKIAogICAgIGlmICgoZmxhZ3MgJiBFWFRSQV9GSUVMRCkgIT0gMCkgeyAvKiBza2lwIHRoZSBleHRyYSBmaWVsZCAqLwotCWxlbiAgPSAgKHVJbnQpZ2V0X2J5dGUocyk7Ci0JbGVuICs9ICgodUludClnZXRfYnl0ZShzKSk8PDg7Ci0JLyogbGVuIGlzIGdhcmJhZ2UgaWYgRU9GIGJ1dCB0aGUgbG9vcCBiZWxvdyB3aWxsIHF1aXQgYW55d2F5ICovCi0Jd2hpbGUgKGxlbi0tICE9IDAgJiYgZ2V0X2J5dGUocykgIT0gRU9GKSA7CisgICAgICAgIGxlbiAgPSAgKHVJbnQpZ2V0X2J5dGUocyk7CisgICAgICAgIGxlbiArPSAoKHVJbnQpZ2V0X2J5dGUocykpPDw4OworICAgICAgICAvKiBsZW4gaXMgZ2FyYmFnZSBpZiBFT0YgYnV0IHRoZSBsb29wIGJlbG93IHdpbGwgcXVpdCBhbnl3YXkgKi8KKyAgICAgICAgd2hpbGUgKGxlbi0tICE9IDAgJiYgZ2V0X2J5dGUocykgIT0gRU9GKSA7CiAgICAgfQogICAgIGlmICgoZmxhZ3MgJiBPUklHX05BTUUpICE9IDApIHsgLyogc2tpcCB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lICovCi0Jd2hpbGUgKChjID0gZ2V0X2J5dGUocykpICE9IDAgJiYgYyAhPSBFT0YpIDsKKyAgICAgICAgd2hpbGUgKChjID0gZ2V0X2J5dGUocykpICE9IDAgJiYgYyAhPSBFT0YpIDsKICAgICB9CiAgICAgaWYgKChmbGFncyAmIENPTU1FTlQpICE9IDApIHsgICAvKiBza2lwIHRoZSAuZ3ogZmlsZSBjb21tZW50ICovCi0Jd2hpbGUgKChjID0gZ2V0X2J5dGUocykpICE9IDAgJiYgYyAhPSBFT0YpIDsKKyAgICAgICAgd2hpbGUgKChjID0gZ2V0X2J5dGUocykpICE9IDAgJiYgYyAhPSBFT0YpIDsKICAgICB9CiAgICAgaWYgKChmbGFncyAmIEhFQURfQ1JDKSAhPSAwKSB7ICAvKiBza2lwIHRoZSBoZWFkZXIgY3JjICovCi0JZm9yIChsZW4gPSAwOyBsZW4gPCAyOyBsZW4rKykgKHZvaWQpZ2V0X2J5dGUocyk7CisgICAgICAgIGZvciAobGVuID0gMDsgbGVuIDwgMjsgbGVuKyspICh2b2lkKWdldF9ieXRlKHMpOwogICAgIH0KICAgICBzLT56X2VyciA9IHMtPnpfZW9mID8gWl9EQVRBX0VSUk9SIDogWl9PSzsKIH0KQEAgLTM0MiwyMSArMzQ0LDIxIEBACiAgICAgVFJZRlJFRShzLT5tc2cpOwogCiAgICAgaWYgKHMtPnN0cmVhbS5zdGF0ZSAhPSBOVUxMKSB7Ci0JaWYgKHMtPm1vZGUgPT0gJ3cnKSB7CisgICAgICAgIGlmIChzLT5tb2RlID09ICd3JykgewogI2lmZGVmIE5PX0RFRkxBVEUKLQkgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7CisgICAgICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKICNlbHNlCi0JICAgIGVyciA9IGRlZmxhdGVFbmQoJihzLT5zdHJlYW0pKTsKKyAgICAgICAgICAgIGVyciA9IGRlZmxhdGVFbmQoJihzLT5zdHJlYW0pKTsKICNlbmRpZgotCX0gZWxzZSBpZiAocy0+bW9kZSA9PSAncicpIHsKLQkgICAgZXJyID0gaW5mbGF0ZUVuZCgmKHMtPnN0cmVhbSkpOwotCX0KKyAgICAgICAgfSBlbHNlIGlmIChzLT5tb2RlID09ICdyJykgeworICAgICAgICAgICAgZXJyID0gaW5mbGF0ZUVuZCgmKHMtPnN0cmVhbSkpOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChzLT5maWxlICE9IE5VTEwgJiYgZmNsb3NlKHMtPmZpbGUpKSB7CiAjaWZkZWYgRVNQSVBFCi0JaWYgKGVycm5vICE9IEVTUElQRSkgLyogZmNsb3NlIGlzIGJyb2tlbiBmb3IgcGlwZXMgaW4gSFAvVVggKi8KKyAgICAgICAgaWYgKGVycm5vICE9IEVTUElQRSkgLyogZmNsb3NlIGlzIGJyb2tlbiBmb3IgcGlwZXMgaW4gSFAvVVggKi8KICNlbmRpZgotCSAgICBlcnIgPSBaX0VSUk5POworICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKICAgICB9CiAgICAgaWYgKHMtPnpfZXJyIDwgMCkgZXJyID0gcy0+el9lcnI7CiAKQEAgLTM5MSw2OSArMzkzLDY5IEBACiAKICAgICB3aGlsZSAocy0+c3RyZWFtLmF2YWlsX291dCAhPSAwKSB7CiAKLQlpZiAocy0+dHJhbnNwYXJlbnQpIHsKLQkgICAgLyogQ29weSBmaXJzdCB0aGUgbG9va2FoZWFkIGJ5dGVzOiAqLwotCSAgICB1SW50IG4gPSBzLT5zdHJlYW0uYXZhaWxfaW47Ci0JICAgIGlmIChuID4gcy0+c3RyZWFtLmF2YWlsX291dCkgbiA9IHMtPnN0cmVhbS5hdmFpbF9vdXQ7Ci0JICAgIGlmIChuID4gMCkgewotCQl6bWVtY3B5KHMtPnN0cmVhbS5uZXh0X291dCwgcy0+c3RyZWFtLm5leHRfaW4sIG4pOwotCQluZXh0X291dCArPSBuOwotCQlzLT5zdHJlYW0ubmV4dF9vdXQgPSBuZXh0X291dDsKLQkJcy0+c3RyZWFtLm5leHRfaW4gICArPSBuOwotCQlzLT5zdHJlYW0uYXZhaWxfb3V0IC09IG47Ci0JCXMtPnN0cmVhbS5hdmFpbF9pbiAgLT0gbjsKLQkgICAgfQotCSAgICBpZiAocy0+c3RyZWFtLmF2YWlsX291dCA+IDApIHsKLQkJcy0+c3RyZWFtLmF2YWlsX291dCAtPSBmcmVhZChuZXh0X291dCwgMSwgcy0+c3RyZWFtLmF2YWlsX291dCwKLQkJCQkJICAgICBzLT5maWxlKTsKLQkgICAgfQotCSAgICBsZW4gLT0gcy0+c3RyZWFtLmF2YWlsX291dDsKLQkgICAgcy0+c3RyZWFtLnRvdGFsX2luICArPSAodUxvbmcpbGVuOwotCSAgICBzLT5zdHJlYW0udG90YWxfb3V0ICs9ICh1TG9uZylsZW47CisgICAgICAgIGlmIChzLT50cmFuc3BhcmVudCkgeworICAgICAgICAgICAgLyogQ29weSBmaXJzdCB0aGUgbG9va2FoZWFkIGJ5dGVzOiAqLworICAgICAgICAgICAgdUludCBuID0gcy0+c3RyZWFtLmF2YWlsX2luOworICAgICAgICAgICAgaWYgKG4gPiBzLT5zdHJlYW0uYXZhaWxfb3V0KSBuID0gcy0+c3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgICAgIHptZW1jcHkocy0+c3RyZWFtLm5leHRfb3V0LCBzLT5zdHJlYW0ubmV4dF9pbiwgbik7CisgICAgICAgICAgICAgICAgbmV4dF9vdXQgKz0gbjsKKyAgICAgICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBuZXh0X291dDsKKyAgICAgICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiAgICs9IG47CisgICAgICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dCAtPSBuOworICAgICAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiAgLT0gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfb3V0ID4gMCkgeworICAgICAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgLT0gZnJlYWQobmV4dF9vdXQsIDEsIHMtPnN0cmVhbS5hdmFpbF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbiAtPSBzLT5zdHJlYW0uYXZhaWxfb3V0OworICAgICAgICAgICAgcy0+c3RyZWFtLnRvdGFsX2luICArPSAodUxvbmcpbGVuOworICAgICAgICAgICAgcy0+c3RyZWFtLnRvdGFsX291dCArPSAodUxvbmcpbGVuOwogICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSBzLT56X2VvZiA9IDE7Ci0JICAgIHJldHVybiAoaW50KWxlbjsKLQl9CisgICAgICAgICAgICByZXR1cm4gKGludClsZW47CisgICAgICAgIH0KICAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwICYmICFzLT56X2VvZikgewogCiAgICAgICAgICAgICBlcnJubyA9IDA7CiAgICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSBmcmVhZChzLT5pbmJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKTsKICAgICAgICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPT0gMCkgewogICAgICAgICAgICAgICAgIHMtPnpfZW9mID0gMTsKLQkJaWYgKGZlcnJvcihzLT5maWxlKSkgewotCQkgICAgcy0+el9lcnIgPSBaX0VSUk5POwotCQkgICAgYnJlYWs7Ci0JCX0KKyAgICAgICAgICAgICAgICBpZiAoZmVycm9yKHMtPmZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnpfZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKICAgICAgICAgfQogICAgICAgICBzLT56X2VyciA9IGluZmxhdGUoJihzLT5zdHJlYW0pLCBaX05PX0ZMVVNIKTsKIAotCWlmIChzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQpIHsKLQkgICAgLyogQ2hlY2sgQ1JDIGFuZCBvcmlnaW5hbCBzaXplICovCi0JICAgIHMtPmNyYyA9IGNyYzMyKHMtPmNyYywgc3RhcnQsICh1SW50KShzLT5zdHJlYW0ubmV4dF9vdXQgLSBzdGFydCkpOwotCSAgICBzdGFydCA9IHMtPnN0cmVhbS5uZXh0X291dDsKKyAgICAgICAgaWYgKHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgLyogQ2hlY2sgQ1JDIGFuZCBvcmlnaW5hbCBzaXplICovCisgICAgICAgICAgICBzLT5jcmMgPSBjcmMzMihzLT5jcmMsIHN0YXJ0LCAodUludCkocy0+c3RyZWFtLm5leHRfb3V0IC0gc3RhcnQpKTsKKyAgICAgICAgICAgIHN0YXJ0ID0gcy0+c3RyZWFtLm5leHRfb3V0OwogCi0JICAgIGlmIChnZXRMb25nKHMpICE9IHMtPmNyYykgewotCQlzLT56X2VyciA9IFpfREFUQV9FUlJPUjsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgICh2b2lkKWdldExvbmcocyk7CisgICAgICAgICAgICBpZiAoZ2V0TG9uZyhzKSAhPSBzLT5jcmMpIHsKKyAgICAgICAgICAgICAgICBzLT56X2VyciA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpZ2V0TG9uZyhzKTsKICAgICAgICAgICAgICAgICAvKiBUaGUgdW5jb21wcmVzc2VkIGxlbmd0aCByZXR1cm5lZCBieSBhYm92ZSBnZXRsb25nKCkgbWF5CiAgICAgICAgICAgICAgICAgICogYmUgZGlmZmVyZW50IGZyb20gcy0+c3RyZWFtLnRvdGFsX291dCkgaW4gY2FzZSBvZgotCQkgKiBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzLiBDaGVjayBmb3Igc3VjaCBmaWxlczoKLQkJICovCi0JCWNoZWNrX2hlYWRlcihzKTsKLQkJaWYgKHMtPnpfZXJyID09IFpfT0spIHsKLQkJICAgIHVMb25nIHRvdGFsX2luID0gcy0+c3RyZWFtLnRvdGFsX2luOwotCQkgICAgdUxvbmcgdG90YWxfb3V0ID0gcy0+c3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgICAgICAgICAgKiBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzLiBDaGVjayBmb3Igc3VjaCBmaWxlczoKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBjaGVja19oZWFkZXIocyk7CisgICAgICAgICAgICAgICAgaWYgKHMtPnpfZXJyID09IFpfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgdUxvbmcgdG90YWxfaW4gPSBzLT5zdHJlYW0udG90YWxfaW47CisgICAgICAgICAgICAgICAgICAgIHVMb25nIHRvdGFsX291dCA9IHMtPnN0cmVhbS50b3RhbF9vdXQ7CiAKLQkJICAgIGluZmxhdGVSZXNldCgmKHMtPnN0cmVhbSkpOwotCQkgICAgcy0+c3RyZWFtLnRvdGFsX2luID0gdG90YWxfaW47Ci0JCSAgICBzLT5zdHJlYW0udG90YWxfb3V0ID0gdG90YWxfb3V0OwotCQkgICAgcy0+Y3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7Ci0JCX0KLQkgICAgfQotCX0KLQlpZiAocy0+el9lcnIgIT0gWl9PSyB8fCBzLT56X2VvZikgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGluZmxhdGVSZXNldCgmKHMtPnN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW0udG90YWxfaW4gPSB0b3RhbF9pbjsKKyAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtLnRvdGFsX291dCA9IHRvdGFsX291dDsKKyAgICAgICAgICAgICAgICAgICAgcy0+Y3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzLT56X2VyciAhPSBaX09LIHx8IHMtPnpfZW9mKSBicmVhazsKICAgICB9CiAgICAgcy0+Y3JjID0gY3JjMzIocy0+Y3JjLCBzdGFydCwgKHVJbnQpKHMtPnN0cmVhbS5uZXh0X291dCAtIHN0YXJ0KSk7CiAKQEAgLTU4MCwxMSArNTgyLDExIEBACiAjZWxzZSAvKiBub3QgQU5TSSBDICovCiAKIGludCBaRVhQT1JUVkEgZ3pwcmludGYgKGZpbGUsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLAotCSAgICAgICAgICAgICAgIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCkKKyAgICAgICAgICAgICAgICAgICAgICAgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKQogICAgIGd6RmlsZSBmaWxlOwogICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKICAgICBpbnQgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLAotCWExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMDsKKyAgICAgICAgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwOwogewogICAgIGNoYXIgYnVmW1pfUFJJTlRGX0JVRlNJWkVdOwogICAgIGludCBsZW47CkBAIC01OTIsMjUgKzU5NCwyNSBAQAogI2lmZGVmIE5PX3NucHJpbnRmCiAjICBpZmRlZiBIQVNfc3ByaW50Zl92b2lkCiAgICAgc3ByaW50ZihidWYsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAotCSAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOworICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKICAgICBsZW4gPSBzdHJsZW4oYnVmKTsgLyogb2xkIHNwcmludGYgZG9lc24ndCByZXR1cm4gdGhlIG5iIG9mIGJ5dGVzIHdyaXR0ZW4gKi8KICAgICBpZiAobGVuIDw9IDApIHJldHVybiAwOwogIyAgZWxzZQogICAgIGxlbiA9IHNwcmludGYoYnVmLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKLQkgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisgICAgICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKICAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IHNpemVvZihidWYpKQogICAgICAgICByZXR1cm4gMDsKICMgIGVuZGlmCiAjZWxzZQogIyAgaWZkZWYgSEFTX3NucHJpbnRmX3ZvaWQKICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKLQkgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisgICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKICAgICBsZW4gPSBzdHJsZW4oYnVmKTsKICAgICBpZiAobGVuIDw9IDApCiAgICAgICAgIHJldHVybiAwOwogIyAgZWxzZQogICAgIGxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAotCSAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisgICAgICAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CiAgICAgaWYgKGxlbiA8PSAwIHx8IGxlbiA+PSBzaXplb2YoYnVmKSkKICAgICAgICAgcmV0dXJuIDA7CiAjICBlbmRpZgpAQCAtNjc3LDE0ICs2NzksMTQgQEAKICAgICAgICAgaWYgKGRvbmUpIGJyZWFrOwogICAgICAgICBzLT56X2VyciA9IGRlZmxhdGUoJihzLT5zdHJlYW0pLCBmbHVzaCk7CiAKLQkvKiBJZ25vcmUgdGhlIHNlY29uZCBvZiB0d28gY29uc2VjdXRpdmUgZmx1c2hlczogKi8KLQlpZiAobGVuID09IDAgJiYgcy0+el9lcnIgPT0gWl9CVUZfRVJST1IpIHMtPnpfZXJyID0gWl9PSzsKKyAgICAgICAgLyogSWdub3JlIHRoZSBzZWNvbmQgb2YgdHdvIGNvbnNlY3V0aXZlIGZsdXNoZXM6ICovCisgICAgICAgIGlmIChsZW4gPT0gMCAmJiBzLT56X2VyciA9PSBaX0JVRl9FUlJPUikgcy0+el9lcnIgPSBaX09LOwogCiAgICAgICAgIC8qIGRlZmxhdGUgaGFzIGZpbmlzaGVkIGZsdXNoaW5nIG9ubHkgd2hlbiBpdCBoYXNuJ3QgdXNlZCB1cAotICAgICAgICAgKiBhbGwgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcjogCisgICAgICAgICAqIGFsbCB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyOgogICAgICAgICAgKi8KICAgICAgICAgZG9uZSA9IChzLT5zdHJlYW0uYXZhaWxfb3V0ICE9IDAgfHwgcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EKTsKLSAKKwogICAgICAgICBpZiAocy0+el9lcnIgIT0gWl9PSyAmJiBzLT56X2VyciAhPSBaX1NUUkVBTV9FTkQpIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gIHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCA/IFpfT0sgOiBzLT56X2VycjsKQEAgLTcxOSw4NiArNzIxLDg2IEBACiAgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKIAogICAgIGlmIChzID09IE5VTEwgfHwgd2hlbmNlID09IFNFRUtfRU5EIHx8Ci0Jcy0+el9lcnIgPT0gWl9FUlJOTyB8fCBzLT56X2VyciA9PSBaX0RBVEFfRVJST1IpIHsKLQlyZXR1cm4gLTFMOworICAgICAgICBzLT56X2VyciA9PSBaX0VSUk5PIHx8IHMtPnpfZXJyID09IFpfREFUQV9FUlJPUikgeworICAgICAgICByZXR1cm4gLTFMOwogICAgIH0KLSAgICAKKwogICAgIGlmIChzLT5tb2RlID09ICd3JykgewogI2lmZGVmIE5PX0RFRkxBVEUKLQlyZXR1cm4gLTFMOworICAgICAgICByZXR1cm4gLTFMOwogI2Vsc2UKLQlpZiAod2hlbmNlID09IFNFRUtfU0VUKSB7Ci0JICAgIG9mZnNldCAtPSBzLT5zdHJlYW0udG90YWxfaW47Ci0JfQotCWlmIChvZmZzZXQgPCAwKSByZXR1cm4gLTFMOworICAgICAgICBpZiAod2hlbmNlID09IFNFRUtfU0VUKSB7CisgICAgICAgICAgICBvZmZzZXQgLT0gcy0+c3RyZWFtLnRvdGFsX2luOworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgPCAwKSByZXR1cm4gLTFMOwogCi0JLyogQXQgdGhpcyBwb2ludCwgb2Zmc2V0IGlzIHRoZSBudW1iZXIgb2YgemVybyBieXRlcyB0byB3cml0ZS4gKi8KLQlpZiAocy0+aW5idWYgPT0gWl9OVUxMKSB7Ci0JICAgIHMtPmluYnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7IC8qIGZvciBzZWVraW5nICovCisgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9mZnNldCBpcyB0aGUgbnVtYmVyIG9mIHplcm8gYnl0ZXMgdG8gd3JpdGUuICovCisgICAgICAgIGlmIChzLT5pbmJ1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgICAgIHMtPmluYnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7IC8qIGZvciBzZWVraW5nICovCiAgICAgICAgICAgICBpZiAocy0+aW5idWYgPT0gWl9OVUxMKSByZXR1cm4gLTFMOwotCSAgICB6bWVtemVybyhzLT5pbmJ1ZiwgWl9CVUZTSVpFKTsKLQl9Ci0Jd2hpbGUgKG9mZnNldCA+IDApICB7Ci0JICAgIHVJbnQgc2l6ZSA9IFpfQlVGU0laRTsKLQkgICAgaWYgKG9mZnNldCA8IFpfQlVGU0laRSkgc2l6ZSA9ICh1SW50KW9mZnNldDsKKyAgICAgICAgICAgIHptZW16ZXJvKHMtPmluYnVmLCBaX0JVRlNJWkUpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChvZmZzZXQgPiAwKSAgeworICAgICAgICAgICAgdUludCBzaXplID0gWl9CVUZTSVpFOworICAgICAgICAgICAgaWYgKG9mZnNldCA8IFpfQlVGU0laRSkgc2l6ZSA9ICh1SW50KW9mZnNldDsKIAotCSAgICBzaXplID0gZ3p3cml0ZShmaWxlLCBzLT5pbmJ1Ziwgc2l6ZSk7Ci0JICAgIGlmIChzaXplID09IDApIHJldHVybiAtMUw7CisgICAgICAgICAgICBzaXplID0gZ3p3cml0ZShmaWxlLCBzLT5pbmJ1Ziwgc2l6ZSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSByZXR1cm4gLTFMOwogCi0JICAgIG9mZnNldCAtPSBzaXplOwotCX0KLQlyZXR1cm4gKHpfb2ZmX3Qpcy0+c3RyZWFtLnRvdGFsX2luOworICAgICAgICAgICAgb2Zmc2V0IC09IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh6X29mZl90KXMtPnN0cmVhbS50b3RhbF9pbjsKICNlbmRpZgogICAgIH0KICAgICAvKiBSZXN0IG9mIGZ1bmN0aW9uIGlzIGZvciByZWFkaW5nIG9ubHkgKi8KIAogICAgIC8qIGNvbXB1dGUgYWJzb2x1dGUgcG9zaXRpb24gKi8KICAgICBpZiAod2hlbmNlID09IFNFRUtfQ1VSKSB7Ci0Jb2Zmc2V0ICs9IHMtPnN0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgIG9mZnNldCArPSBzLT5zdHJlYW0udG90YWxfb3V0OwogICAgIH0KICAgICBpZiAob2Zmc2V0IDwgMCkgcmV0dXJuIC0xTDsKIAogICAgIGlmIChzLT50cmFuc3BhcmVudCkgewotCS8qIG1hcCB0byBmc2VlayAqLwotCXMtPnN0cmVhbS5hdmFpbF9pbiA9IDA7Ci0Jcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKKyAgICAgICAgLyogbWFwIHRvIGZzZWVrICovCisgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7CiAgICAgICAgIGlmIChmc2VlayhzLT5maWxlLCBvZmZzZXQsIFNFRUtfU0VUKSA8IDApIHJldHVybiAtMUw7CiAKLQlzLT5zdHJlYW0udG90YWxfaW4gPSBzLT5zdHJlYW0udG90YWxfb3V0ID0gKHVMb25nKW9mZnNldDsKLQlyZXR1cm4gb2Zmc2V0OworICAgICAgICBzLT5zdHJlYW0udG90YWxfaW4gPSBzLT5zdHJlYW0udG90YWxfb3V0ID0gKHVMb25nKW9mZnNldDsKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICB9CiAKICAgICAvKiBGb3IgYSBuZWdhdGl2ZSBzZWVrLCByZXdpbmQgYW5kIHVzZSBwb3NpdGl2ZSBzZWVrICovCiAgICAgaWYgKCh1TG9uZylvZmZzZXQgPj0gcy0+c3RyZWFtLnRvdGFsX291dCkgewotCW9mZnNldCAtPSBzLT5zdHJlYW0udG90YWxfb3V0OworICAgICAgICBvZmZzZXQgLT0gcy0+c3RyZWFtLnRvdGFsX291dDsKICAgICB9IGVsc2UgaWYgKGd6cmV3aW5kKGZpbGUpIDwgMCkgewotCXJldHVybiAtMUw7CisgICAgICAgIHJldHVybiAtMUw7CiAgICAgfQogICAgIC8qIG9mZnNldCBpcyBub3cgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLiAqLwogCiAgICAgaWYgKG9mZnNldCAhPSAwICYmIHMtPm91dGJ1ZiA9PSBaX05VTEwpIHsKLQlzLT5vdXRidWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsKKyAgICAgICAgcy0+b3V0YnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7CiAgICAgICAgIGlmIChzLT5vdXRidWYgPT0gWl9OVUxMKSByZXR1cm4gLTFMOwogICAgIH0KICAgICB3aGlsZSAob2Zmc2V0ID4gMCkgIHsKLQlpbnQgc2l6ZSA9IFpfQlVGU0laRTsKLQlpZiAob2Zmc2V0IDwgWl9CVUZTSVpFKSBzaXplID0gKGludClvZmZzZXQ7CisgICAgICAgIGludCBzaXplID0gWl9CVUZTSVpFOworICAgICAgICBpZiAob2Zmc2V0IDwgWl9CVUZTSVpFKSBzaXplID0gKGludClvZmZzZXQ7CiAKLQlzaXplID0gZ3pyZWFkKGZpbGUsIHMtPm91dGJ1ZiwgKHVJbnQpc2l6ZSk7Ci0JaWYgKHNpemUgPD0gMCkgcmV0dXJuIC0xTDsKLQlvZmZzZXQgLT0gc2l6ZTsKKyAgICAgICAgc2l6ZSA9IGd6cmVhZChmaWxlLCBzLT5vdXRidWYsICh1SW50KXNpemUpOworICAgICAgICBpZiAoc2l6ZSA8PSAwKSByZXR1cm4gLTFMOworICAgICAgICBvZmZzZXQgLT0gc2l6ZTsKICAgICB9CiAgICAgcmV0dXJuICh6X29mZl90KXMtPnN0cmVhbS50b3RhbF9vdXQ7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBSZXdpbmRzIGlucHV0IGZpbGUuIAorICAgICBSZXdpbmRzIGlucHV0IGZpbGUuCiAqLwogaW50IFpFWFBPUlQgZ3pyZXdpbmQgKGZpbGUpCiAgICAgZ3pGaWxlIGZpbGU7CiB7CiAgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKLSAgICAKKwogICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpIHJldHVybiAtMTsKIAogICAgIHMtPnpfZXJyID0gWl9PSzsKQEAgLTgwNiwxMCArODA4LDEwIEBACiAgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gMDsKICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOwogICAgIHMtPmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotCQorCiAgICAgaWYgKHMtPnN0YXJ0cG9zID09IDApIHsgLyogbm90IGEgY29tcHJlc3NlZCBmaWxlICovCi0JcmV3aW5kKHMtPmZpbGUpOwotCXJldHVybiAwOworICAgICAgICByZXdpbmQocy0+ZmlsZSk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgICh2b2lkKSBpbmZsYXRlUmVzZXQoJnMtPnN0cmVhbSk7CkBAIC04MzUsNyArODM3LDcgQEAKICAgICBnekZpbGUgZmlsZTsKIHsKICAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOwotICAgIAorCiAgICAgcmV0dXJuIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpID8gMCA6IHMtPnpfZW9mOwogfQogCkBAIC04ODUsNyArODg3LDcgQEAKIAogICAgIGlmIChzLT5tb2RlID09ICd3JykgewogI2lmZGVmIE5PX0RFRkxBVEUKLQlyZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICNlbHNlCiAgICAgICAgIGVyciA9IGRvX2ZsdXNoIChmaWxlLCBaX0ZJTklTSCk7CiAgICAgICAgIGlmIChlcnIgIT0gWl9PSykgcmV0dXJuIGRlc3Ryb3koKGd6X3N0cmVhbSopZmlsZSk7CmRpZmYgLS1naXQgYS9pbmZiYWNrLmMgYi9pbmZiYWNrLmMKaW5kZXggNDYwOTBhZC4uZmRkN2Q4OSAxMDA2NDQKLS0tIGEvaW5mYmFjay5jCisrKyBiL2luZmJhY2suYwpAQCAtNjAzLDExICs2MDMsOCBAQAogaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tFbmQoc3RybSkKIHpfc3RyZWFtIEZBUiAqc3RybTsKIHsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotCiAgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT56ZnJlZSA9PSBaX05VTEwpCiAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKICAgICBaRlJFRShzdHJtLCBzdHJtLT5zdGF0ZSk7CiAgICAgc3RybS0+c3RhdGUgPSBaX05VTEw7CiAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBlbmRcbiIpKTsKZGlmZiAtLWdpdCBhL2luZmZhc3QuYyBiL2luZmZhc3QuYwppbmRleCA4ZDE0NWMyLi41OWE4YWY4IDEwMDY0NAotLS0gYS9pbmZmYXN0LmMKKysrIGIvaW5mZmFzdC5jCkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMVUgPDwgb3ApIC0gMSk7CisgICAgICAgICAgICAgICAgbGVuICs9ICh1bnNpZ25lZClob2xkICYgKCgxVSA8PCBvcCkgLSAxKTsKICAgICAgICAgICAgICAgICBob2xkID4+PSBvcDsKICAgICAgICAgICAgICAgICBiaXRzIC09IG9wOwogICAgICAgICAgICAgfQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxVSA8PCBvcCkgLSAxKTsKKyAgICAgICAgICAgICAgICBkaXN0ICs9ICh1bnNpZ25lZClob2xkICYgKCgxVSA8PCBvcCkgLSAxKTsKICAgICAgICAgICAgICAgICBob2xkID4+PSBvcDsKICAgICAgICAgICAgICAgICBiaXRzIC09IG9wOwogICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIGRpc3QpKTsKZGlmZiAtLWdpdCBhL2luZmxhdGUuYyBiL2luZmxhdGUuYwppbmRleCAzNmZiYjc1Li4xZGEyNzc2IDEwMDY0NAotLS0gYS9pbmZsYXRlLmMKKysrIGIvaW5mbGF0ZS5jCkBAIC03MCwxNCArNzAsMTQgQEAKICAqIC0gQ2hhbmdlZCBtYW55IHR5cGVzIHRvIHVuc2lnbmVkIG9yIHVuc2lnbmVkIHNob3J0IHRvIGF2b2lkIHdhcm5pbmdzCiAgKiAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24KICAqCi0gKiAxLjIuMAk5IE1hciAyMDAzCisgKiAxLjIuMCAgICAgICAgOSBNYXIgMjAwMwogICogLSBDaGFuZ2VkIGluZmxhdGVCYWNrKCkgaW50ZXJmYWNlIHRvIHByb3ZpZGUgc2VwYXJhdGUgb3BhcXVlIGRlc2NyaXB0b3JzCiAgKiAgIGZvciB0aGUgaW4oKSBhbmQgb3V0KCkgZnVuY3Rpb25zCiAgKiAtIENoYW5nZWQgaW5mbGF0ZUJhY2soKSBhcmd1bWVudCBhbmQgaW5fZnVuYyB0eXBlZGVmIHRvIHN3YXAgdGhlIGxlbmd0aAogICogICBhbmQgYnVmZmVyIGFkZHJlc3MgcmV0dXJuIHZhbHVlcyBmb3IgdGhlIGlucHV0IGZ1bmN0aW9uCiAgKiAtIENoZWNrIG5leHRfaW4gYW5kIG5leHRfb3V0IGZvciBaX05VTEwgb24gZW50cnkgdG8gaW5mbGF0ZSgpCiAgKgotICogUmVtYWluZGVyIG9mIGNoYW5nZSBoaXN0b3J5IGlzIGluIENoYW5nZUxvZyBpbiB6bGliIGRpc3RyaWJ1dGlvbi4KKyAqIFRoZSBoaXN0b3J5IGZvciB2ZXJzaW9ucyBwYXN0IDEuMi4wIGFyZSBpbiBDaGFuZ2VMb2cgaW4gemxpYiBkaXN0cmlidXRpb24uCiAgKi8KIAogI2luY2x1ZGUgInp1dGlsLmgiCmRpZmYgLS1naXQgYS9pbmZ0cmVlcy5jIGIvaW5mdHJlZXMuYwppbmRleCAyNGNhMDg5Li5hNGUwNzQ1IDEwMDY0NAotLS0gYS9pbmZ0cmVlcy5jCisrKyBiL2luZnRyZWVzLmMKQEAgLTksNyArOSw3IEBACiAjZGVmaW5lIE1BWEJJVFMgMTUKIAogY29uc3QgY2hhciBpbmZsYXRlX2NvcHlyaWdodFtdID0KLSAgICIgaW5mbGF0ZSAxLjIuMCBDb3B5cmlnaHQgMTk5NS0yMDAzIE1hcmsgQWRsZXIgIjsKKyAgICIgaW5mbGF0ZSAxLjIuMC4xIENvcHlyaWdodCAxOTk1LTIwMDMgTWFyayBBZGxlciAiOwogLyoKICAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQogICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90CkBAIC02Miw3ICs2Miw3IEBACiAgICAgICAgIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwfTsKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGV4dFszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqLwogICAgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwKLSAgICAgICAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDczLCAxOTR9OworICAgICAgICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgMjA1LCA2NH07CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRiYXNlWzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqLwogICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsCiAgICAgICAgIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwKZGlmZiAtLWdpdCBhL21pbmlnemlwLmMgYi9taW5pZ3ppcC5jCmluZGV4IDk3YjdjMmQuLjM5MThjYmMgMTAwNjQ0Ci0tLSBhL21pbmlnemlwLmMKKysrIGIvbWluaWd6aXAuYwpAQCAtMSw2ICsxLDcgQEAKIC8qIG1pbmlnemlwLmMgLS0gc2ltdWxhdGUgZ3ppcCB1c2luZyB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqIEFkYXB0ZWQgZm9yIFpfUkxFIGJ5IENvc21pbiBUcnV0YSwgMjAwMy4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCiAvKgpAQCAtMTQ3LDcgKzE0OCw3IEBACiAgICAgaWYgKGJ1Zl9sZW4gPD0gMCkgcmV0dXJuIFpfRVJSTk87CiAKICAgICAvKiBOb3cgZG8gdGhlIGFjdHVhbCBtbWFwOiAqLwotICAgIGJ1ZiA9IG1tYXAoKGNhZGRyX3QpIDAsIGJ1Zl9sZW4sIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgaWZkLCAob2ZmX3QpMCk7IAorICAgIGJ1ZiA9IG1tYXAoKGNhZGRyX3QpIDAsIGJ1Zl9sZW4sIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgaWZkLCAob2ZmX3QpMCk7CiAgICAgaWYgKGJ1ZiA9PSAoY2FkZHJfdCkoLTEpKSByZXR1cm4gWl9FUlJOTzsKIAogICAgIC8qIENvbXByZXNzIHRoZSB3aG9sZSBmaWxlIGF0IG9uY2U6ICovCkBAIC0xNzksOCArMTgwLDggQEAKICAgICAgICAgaWYgKGxlbiA9PSAwKSBicmVhazsKIAogICAgICAgICBpZiAoKGludClmd3JpdGUoYnVmLCAxLCAodW5zaWduZWQpbGVuLCBvdXQpICE9IGxlbikgewotCSAgICBlcnJvcigiZmFpbGVkIGZ3cml0ZSIpOwotCX0KKyAgICAgICAgICAgIGVycm9yKCJmYWlsZWQgZndyaXRlIik7CisgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGZjbG9zZShvdXQpKSBlcnJvcigiZmFpbGVkIGZjbG9zZSIpOwogCkBAIC0yNjAsMTAgKzI2MSwxMSBAQAogCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVXNhZ2U6ICBtaW5pZ3ppcCBbLWRdIFstZl0gWy1oXSBbLTEgdG8gLTldIFtmaWxlcy4uLl0KKyAqIFVzYWdlOiAgbWluaWd6aXAgWy1kXSBbLWZdIFstaF0gWy1yXSBbLTEgdG8gLTldIFtmaWxlcy4uLl0KICAqICAgLWQgOiBkZWNvbXByZXNzCiAgKiAgIC1mIDogY29tcHJlc3Mgd2l0aCBaX0ZJTFRFUkVECiAgKiAgIC1oIDogY29tcHJlc3Mgd2l0aCBaX0hVRkZNQU5fT05MWQorICogICAtciA6IGNvbXByZXNzIHdpdGggWl9STEUKICAqICAgLTEgdG8gLTkgOiBjb21wcmVzc2lvbiBsZXZlbAogICovCiAKQEAgLTI4MiwxNiArMjg0LDE4IEBACiAKICAgICB3aGlsZSAoYXJnYyA+IDApIHsKICAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICItZCIpID09IDApCi0JdW5jb21wciA9IDE7CisgICAgICAgIHVuY29tcHIgPSAxOwogICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWYiKSA9PSAwKQotCW91dG1vZGVbM10gPSAnZic7CisgICAgICAgIG91dG1vZGVbM10gPSAnZic7CiAgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItaCIpID09IDApCi0Jb3V0bW9kZVszXSA9ICdoJzsKKyAgICAgICAgb3V0bW9kZVszXSA9ICdoJzsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1yIikgPT0gMCkKKyAgICAgICAgb3V0bW9kZVszXSA9ICdSJzsKICAgICAgIGVsc2UgaWYgKCgqYXJndilbMF0gPT0gJy0nICYmICgqYXJndilbMV0gPj0gJzEnICYmICgqYXJndilbMV0gPD0gJzknICYmCi0JICAgICAgICgqYXJndilbMl0gPT0gMCkKLQlvdXRtb2RlWzJdID0gKCphcmd2KVsxXTsKKyAgICAgICAgICAgICAgICgqYXJndilbMl0gPT0gMCkKKyAgICAgICAgb3V0bW9kZVsyXSA9ICgqYXJndilbMV07CiAgICAgICBlbHNlCi0JYnJlYWs7CisgICAgICAgIGJyZWFrOwogICAgICAgYXJnYy0tLCBhcmd2Kys7CiAgICAgfQogICAgIGlmIChhcmdjID09IDApIHsKQEAgLTMxNSw2ICszMTksNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IHdoaWxlIChhcmd2KyssIC0tYXJnYyk7CiAgICAgfQotICAgIGV4aXQoMCk7Ci0gICAgcmV0dXJuIDA7IC8qIHRvIGF2b2lkIHdhcm5pbmcgKi8KKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL21zZG9zL01ha2VmaWxlLmJvciBiL21zZG9zL01ha2VmaWxlLmJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ0MDYxCi0tLSAvZGV2L251bGwKKysrIGIvbXNkb3MvTWFrZWZpbGUuYm9yCkBAIC0wLDAgKzEsMTA5IEBACisjIE1ha2VmaWxlIGZvciB6bGliCisjIEJvcmxhbmQgQysrCisjIFVwZGF0ZWQgZm9yIHpsaWItMS4yLnggYnkgQ29zbWluIFRydXRhLCAxNS1NYXItMjAwMy4KKworIyBUbyB1c2UsIGRvICJtYWtlIC1mbWFrZWZpbGUuYm9yIgorIyBUbyBjb21waWxlIGluIHNtYWxsIG1vZGVsLCBzZXQgYmVsb3c6IE1PREVMPXMKKworIyBXQVJOSU5HOiB0aGUgc21hbGwgbW9kZWwgaXMgc3VwcG9ydGVkIGJ1dCBvbmx5IGZvciBzbWFsbCB2YWx1ZXMgb2YKKyMgTUFYX1dCSVRTIGFuZCBNQVhfTUVNX0xFVkVMLiBGb3IgZXhhbXBsZToKKyMgICAgLURNQVhfV0JJVFM9MTEgLURERUZfV0JJVFM9MTEgLURNQVhfTUVNX0xFVkVMPTMKKyMgSWYgeW91IHdpc2ggdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIChkZWZhdWx0IDI1NksgZm9yIGJpZworIyBvYmplY3RzIHBsdXMgYSBmZXcgSyksIHlvdSBjYW4gYWRkIHRvIHRoZSBMT0MgbWFjcm8gYmVsb3c6CisjICAgLURNQVhfTUVNX0xFVkVMPTcgLURNQVhfV0JJVFM9MTQKKyMgU2VlIHpjb25mLmggZm9yIGRldGFpbHMgYWJvdXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMuCisKKyMgLS0tLS0tLS0tLS0tIFR1cmJvIEMrKywgQm9ybGFuZCBDKysgLS0tLS0tLS0tLS0tCisKKyMgICAgT3B0aW9uYWwgbm9uc3RhbmRhcmQgcHJlcHJvY2Vzc29yIGZsYWdzIChlLmcuIC1ETUFYX01FTV9MRVZFTD03KQorIyAgICBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50IHZpYSAic2V0IExPQ0FMX1pMSUI9LURGT08iIG9yIGFkZGVkCisjICAgIHRvIHRoZSBkZWNsYXJhdGlvbiBvZiBMT0MgaGVyZToKK0xPQyA9ICQoTE9DQUxfWkxJQikKKworIyB0eXBlIGZvciBDUFUgcmVxdWlyZWQ6IDA6IDgwODYsIDE6IDgwMTg2LCAyOiA4MDI4NiwgMzogODAzODYsIGV0Yy4KK0NQVV9UWVAgPSAwCisKKyMgbWVtb3J5IG1vZGVsOiBvbmUgb2YgcywgbSwgYywgbCAoc21hbGwsIG1lZGl1bSwgY29tcGFjdCwgbGFyZ2UpCitNT0RFTD1sCisKKyMgcmVwbGFjZSBiY2Mgd2l0aCB0Y2MgZm9yIFR1cmJvIEMrKyAxLjAsIHdpdGggYmNjMzIgZm9yIHRoZSAzMiBiaXQgdmVyc2lvbgorQ0M9YmNjCitMRD1iY2MKK0FSPXRsaWIKKworIyBjb21waWxlciBmbGFncworIyByZXBsYWNlICItTzIiIGJ5ICItTyAtRyAtYSAtZCIgZm9yIFR1cmJvIEMrKyAxLjAKK0NGTEFHUz0tTzIgLVogLW0kKE1PREVMKSAkKExPQykKKworTERGTEFHUz0tbSQoTU9ERUwpIC1mLQorCisKKyMgdmFyaWFibGVzCitaTElCX0xJQiA9IHpsaWJfJChNT0RFTCkubGliCisKK09CSjEgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6aW8ub2JqIGluZmJhY2sub2JqCitPQkoyID0gaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKK09CSlAxID0gK2FkbGVyMzIub2JqK2NvbXByZXNzLm9iaitjcmMzMi5vYmorZGVmbGF0ZS5vYmorZ3ppby5vYmoraW5mYmFjay5vYmoKK09CSlAyID0gK2luZmZhc3Qub2JqK2luZmxhdGUub2JqK2luZnRyZWVzLm9iait0cmVlcy5vYmordW5jb21wci5vYmorenV0aWwub2JqCisKKworIyB0YXJnZXRzCithbGw6ICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCisuYy5vYmo6CisJJChDQykgLWMgJChDRkxBR1MpICQqLmMKKworYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyB6bGliLmggemNvbmYuaAorCitjb21wcmVzcy5vYmo6IGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKKworY3JjMzIub2JqOiBjcmMzMi5jIHpsaWIuaCB6Y29uZi5oIGNyYzMyLmgKKworZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorCitnemlvLm9iajogZ3ppby5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworaW5mYmFjay5vYmo6IGluZmJhY2suYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZmYXN0Lm9iajogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaAorCitpbmZsYXRlLm9iajogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaCBpbmZmaXhlZC5oCisKK2luZnRyZWVzLm9iajogaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKKwordHJlZXMub2JqOiB0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggZGVmbGF0ZS5oIHRyZWVzLmgKKwordW5jb21wci5vYmo6IHVuY29tcHIuYyB6bGliLmggemNvbmYuaAorCit6dXRpbC5vYmo6IHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorCitleGFtcGxlLm9iajogZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCisKK21pbmlnemlwLm9iajogbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAorCisKKyMgdGhlIGNvbW1hbmQgbGluZSBpcyBjdXQgdG8gZml0IGluIHRoZSBNUy1ET1MgMTI4IGJ5dGUgbGltaXQ6CiskKFpMSUJfTElCKTogJChPQkoxKSAkKE9CSjIpCisJLWRlbCAkKFpMSUJfTElCKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDEpCisJJChBUikgJChaTElCX0xJQikgJChPQkpQMikKKworZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCisJJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCittaW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisKK3Rlc3Q6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCWV4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZAorCitjbGVhbjoKKwktZGVsICoub2JqCisJLWRlbCAqLmV4ZQorCS1kZWwgKi5saWIKKwktZGVsIHpsaWJfJChNT0RFTCkuYmFrCisJLWRlbCBmb28uZ3oKZGlmZiAtLWdpdCBhL21zZG9zL01ha2VmaWxlLnRjIGIvbXNkb3MvTWFrZWZpbGUudGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhNzg2NAotLS0gL2Rldi9udWxsCisrKyBiL21zZG9zL01ha2VmaWxlLnRjCkBAIC0wLDAgKzEsOTQgQEAKKyMgTWFrZWZpbGUgZm9yIHpsaWIKKyMgVHVyYm8gQyAyLjAxLCBUdXJibyBDKysgMS4wMQorIyBVcGRhdGVkIGZvciB6bGliLTEuMi54IGJ5IENvc21pbiBUcnV0YSwgMTUtTWFyLTIwMDMuCisKKyMgVG8gdXNlLCBkbyAibWFrZSAtZm1ha2VmaWxlLnRjIgorIyBUbyBjb21waWxlIGluIHNtYWxsIG1vZGVsLCBzZXQgYmVsb3c6IE1PREVMPXMKKworIyBXQVJOSU5HOiB0aGUgc21hbGwgbW9kZWwgaXMgc3VwcG9ydGVkIGJ1dCBvbmx5IGZvciBzbWFsbCB2YWx1ZXMgb2YKKyMgTUFYX1dCSVRTIGFuZCBNQVhfTUVNX0xFVkVMLiBGb3IgZXhhbXBsZToKKyMgICAgLURNQVhfV0JJVFM9MTEgLURNQVhfTUVNX0xFVkVMPTMKKyMgSWYgeW91IHdpc2ggdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIChkZWZhdWx0IDI1NksgZm9yIGJpZworIyBvYmplY3RzIHBsdXMgYSBmZXcgSyksIHlvdSBjYW4gYWRkIHRvIENGTEFHUyBiZWxvdzoKKyMgICAtRE1BWF9NRU1fTEVWRUw9NyAtRE1BWF9XQklUUz0xNAorIyBTZWUgemNvbmYuaCBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cy4KKworIyAtLS0tLS0tLS0tLS0gVHVyYm8gQyAyLjAxLCBUdXJibyBDKysgMS4wMSAtLS0tLS0tLS0tLS0KK01PREVMPWwKK0NDPXRjYworTEQ9dGNjCitBUj10bGliCisjIENGTEFHUz0tTzIgLUcgLVogLW0kKE1PREVMKSAtRE1BWF9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MworQ0ZMQUdTPS1PMiAtRyAtWiAtbSQoTU9ERUwpCitMREZMQUdTPS1tJChNT0RFTCkgLWYtCisKKworIyB2YXJpYWJsZXMKK1pMSUJfTElCID0gemxpYl8kKE1PREVMKS5saWIKKworT0JKMSA9IGFkbGVyMzIub2JqIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogZGVmbGF0ZS5vYmogZ3ppby5vYmogaW5mYmFjay5vYmoKK09CSjIgPSBpbmZmYXN0Lm9iaiBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogdHJlZXMub2JqIHVuY29tcHIub2JqIHp1dGlsLm9iagorT0JKUDEgPSArYWRsZXIzMi5vYmorY29tcHJlc3Mub2JqK2NyYzMyLm9iaitkZWZsYXRlLm9iaitnemlvLm9iaitpbmZiYWNrLm9iagorT0JKUDIgPSAraW5mZmFzdC5vYmoraW5mbGF0ZS5vYmoraW5mdHJlZXMub2JqK3RyZWVzLm9iait1bmNvbXByLm9iait6dXRpbC5vYmoKKworCisjIHRhcmdldHMKK2FsbDogJChaTElCX0xJQikgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKKy5jLm9iajoKKwkkKENDKSAtYyAkKENGTEFHUykgJCouYworCithZGxlcjMyLm9iajogYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCisKK2NvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAorCitjcmMzMi5vYmo6IGNyYzMyLmMgemxpYi5oIHpjb25mLmggY3JjMzIuaAorCitkZWZsYXRlLm9iajogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2d6aW8ub2JqOiBnemlvLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorCitpbmZiYWNrLm9iajogaW5mYmFjay5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaCBpbmZmaXhlZC5oCisKK2luZmZhc3Qub2JqOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oCisKK2luZmxhdGUub2JqOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oIGluZmZpeGVkLmgKKworaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAorCit0cmVlcy5vYmo6IHRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBkZWZsYXRlLmggdHJlZXMuaAorCit1bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCisKK3p1dGlsLm9iajogenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2V4YW1wbGUub2JqOiBleGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKworbWluaWd6aXAub2JqOiBtaW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisKKworIyB0aGUgY29tbWFuZCBsaW5lIGlzIGN1dCB0byBmaXQgaW4gdGhlIE1TLURPUyAxMjggYnl0ZSBsaW1pdDoKKyQoWkxJQl9MSUIpOiAkKE9CSjEpICQoT0JKMikKKwktZGVsICQoWkxJQl9MSUIpCisJJChBUikgJChaTElCX0xJQikgJChPQkpQMSkKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAyKQorCitleGFtcGxlLmV4ZTogZXhhbXBsZS5vYmogJChaTElCX0xJQikKKwkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCisKK21pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisJJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKKwordGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisJZXhhbXBsZQorCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCisKK2NsZWFuOgorCS1kZWwgKi5vYmoKKwktZGVsICouZXhlCisJLWRlbCAqLmxpYgorCS1kZWwgemxpYl8kKE1PREVMKS5iYWsKKwktZGVsIGZvby5negpkaWZmIC0tZ2l0IGEvb2xkL21zZG9zL01ha2VmaWxlLmJvciBiL29sZC9tc2Rvcy9NYWtlZmlsZS5ib3IKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NjUxYjQuLjAwMDAwMDAKLS0tIGEvb2xkL21zZG9zL01ha2VmaWxlLmJvcgorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciB6bGliCi0jIEJvcmxhbmQgQysrICAgKioqKioqKioqKioqIFVOVEVTVEVEICoqKioqKioqKioqCi0KLSMgVG8gdXNlLCBkbyAibWFrZSAtZm1ha2VmaWxlLmJvciIKLSMgVG8gY29tcGlsZSBpbiBzbWFsbCBtb2RlbCwgc2V0IGJlbG93OiBNT0RFTD1zCi0KLSMgV0FSTklORzogdGhlIHNtYWxsIG1vZGVsIGlzIHN1cHBvcnRlZCBidXQgb25seSBmb3Igc21hbGwgdmFsdWVzIG9mCi0jIE1BWF9XQklUUyBhbmQgTUFYX01FTV9MRVZFTC4gRm9yIGV4YW1wbGU6Ci0jICAgIC1ETUFYX1dCSVRTPTExIC1EREVGX1dCSVRTPTExIC1ETUFYX01FTV9MRVZFTD0zCi0jIElmIHlvdSB3aXNoIHRvIHJlZHVjZSB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAoZGVmYXVsdCAyNTZLIGZvciBiaWcKLSMgb2JqZWN0cyBwbHVzIGEgZmV3IEspLCB5b3UgY2FuIGFkZCB0byB0aGUgTE9DIG1hY3JvIGJlbG93OgotIyAgIC1ETUFYX01FTV9MRVZFTD03IC1ETUFYX1dCSVRTPTE0Ci0jIFNlZSB6Y29uZi5oIGZvciBkZXRhaWxzIGFib3V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzLgotCi0jIC0tLS0tLS0tLS0tLS0gVHVyYm8gQysrLCBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0tCi0KLSMgICAgT3B0aW9uYWwgbm9uc3RhbmRhcmQgcHJlcHJvY2Vzc29yIGZsYWdzIChlLmcuIC1ETUFYX01FTV9MRVZFTD03KQotIyAgICBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50IHZpYSAic2V0IExPQ0FMX1pMSUI9LURGT08iIG9yIGFkZGVkCi0jICAgIHRvIHRoZSBkZWNsYXJhdGlvbiBvZiBMT0MgaGVyZToKLUxPQyA9ICQoTE9DQUxfWkxJQikKLQotIyBUeXBlIGZvciBDUFUgcmVxdWlyZWQ6IDA6IDgwODYsIDE6IDgwMTg2LCAyOiA4MDI4NiwgMzogODAzODYsIGV0Yy4KLUNQVV9UWVAgPSAwCi0KLSMgTWVtb3J5IG1vZGVsOiBvbmUgb2YgcywgbSwgYywgbCAoc21hbGwsIG1lZGl1bSwgY29tcGFjdCwgbGFyZ2UpCi1NT0RFTD1sCi0KLUNDPWJjYwotIyAgIHJlcGxhY2UgYmNjIHdpdGggdGNjIGZvciBUdXJibyBDKysgMS4wLCB3aXRoIGJjYzMyIGZvciB0aGUgMzIgYml0IHZlcnNpb24KLUxEPSQoQ0MpCi1BUj10bGliCi0KLSMgY29tcGlsZXIgZmxhZ3MKLUNGTEFHUz0tTzIgLVogLW0kKE1PREVMKSAkKExPQykKLSMgICByZXBsYWNlICItTzIiIGJ5ICItTyAtRyAtYSAtZCIgZm9yIFR1cmJvIEMrKyAxLjAKLQotTERGTEFHUz0tbSQoTU9ERUwpCi0KLU89Lm9iagotCi0jIHZhcmlhYmxlcwotT0JKMSA9IGFkbGVyMzIkKE8pIGNvbXByZXNzJChPKSBjcmMzMiQoTykgZ3ppbyQoTykgdW5jb21wciQoTykgZGVmbGF0ZSQoTykgXAotICB0cmVlcyQoTykKLU9CSlAxID0gYWRsZXIzMiQoTykrY29tcHJlc3MkKE8pK2NyYzMyJChPKStnemlvJChPKSt1bmNvbXByJChPKStkZWZsYXRlJChPKStcCi0gIHRyZWVzJChPKQotT0JKMiA9IHp1dGlsJChPKSBpbmZsYXRlJChPKSBpbmZibG9jayQoTykgaW5mdHJlZXMkKE8pIGluZmNvZGVzJChPKSBcCi0gIGluZnV0aWwkKE8pIGluZmZhc3QkKE8pCi1PQkpQMiA9IHp1dGlsJChPKStpbmZsYXRlJChPKStpbmZibG9jayQoTykraW5mdHJlZXMkKE8pK2luZmNvZGVzJChPKStcCi0gIGluZnV0aWwkKE8pK2luZmZhc3QkKE8pCi0KLVpMSUJfSCA9IHpsaWIuaCB6Y29uZi5oCi1aVVRJTF9IID0genV0aWwuaCAkKFpMSUJfSCkKLQotWkxJQl9MSUIgPSB6bGliXyQoTU9ERUwpLmxpYgotCi1hbGw6IHRlc3QKLQotIyBpbmRpdmlkdWFsIGRlcGVuZGVuY2llcyBhbmQgYWN0aW9uIHJ1bGVzOgotYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyAkKFpMSUJfSCkKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1jb21wcmVzcy5vYmo6IGNvbXByZXNzLmMgJChaTElCX0gpCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotY3JjMzIub2JqOiBjcmMzMi5jICQoWkxJQl9IKQotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWRlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oICQoWlVUSUxfSCkKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1nemlvLm9iajogZ3ppby5jICQoWlVUSUxfSCkKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1pbmZibG9jay5vYmo6IGluZmJsb2NrLmMgJChaVVRJTF9IKSBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1pbmZjb2Rlcy5vYmo6IGluZmNvZGVzLmMgJChaVVRJTF9IKSBpbmZ0cmVlcy5oIGluZnV0aWwuaCBpbmZjb2Rlcy5oIGluZmZhc3QuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWluZmxhdGUub2JqOiBpbmZsYXRlLmMgJChaVVRJTF9IKSBpbmZibG9jay5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jICQoWlVUSUxfSCkgaW5mdHJlZXMuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWluZnV0aWwub2JqOiBpbmZ1dGlsLmMgJChaVVRJTF9IKSBpbmZ0cmVlcy5oIGluZnV0aWwuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWluZmZhc3Qub2JqOiBpbmZmYXN0LmMgJChaVVRJTF9IKSBpbmZ0cmVlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi10cmVlcy5vYmo6IHRyZWVzLmMgZGVmbGF0ZS5oICQoWlVUSUxfSCkKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi11bmNvbXByLm9iajogdW5jb21wci5jICQoWkxJQl9IKQotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXp1dGlsLm9iajogenV0aWwuYyAkKFpVVElMX0gpCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotZXhhbXBsZS5vYmo6IGV4YW1wbGUuYyAkKFpMSUJfSCkKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1taW5pZ3ppcC5vYmo6IG1pbmlnemlwLmMgJChaTElCX0gpCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotIyB3ZSBtdXN0IGN1dCB0aGUgY29tbWFuZCBsaW5lIHRvIGZpdCBpbiB0aGUgTVMvRE9TIDEyOCBieXRlIGxpbWl0OgotJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQotCWRlbCAkKFpMSUJfTElCKQotCSQoQVIpICQoWkxJQl9MSUIpICskKE9CSlAxKQotCSQoQVIpICQoWkxJQl9MSUIpICskKE9CSlAyKQotCi1leGFtcGxlLmV4ZTogZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCi0KLW1pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCi0JJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQotdGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0JZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kIAotCi0jY2xlYW46Ci0jCWRlbCAqLm9iagotIwlkZWwgKi5leGUKZGlmZiAtLWdpdCBhL29sZC9tc2Rvcy9NYWtlZmlsZS50YyBiL29sZC9tc2Rvcy9NYWtlZmlsZS50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlMDU1MC4uMDAwMDAwMAotLS0gYS9vbGQvbXNkb3MvTWFrZWZpbGUudGMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYgotIyBUdXJib0MgMi4wCi0KLSMgVG8gdXNlLCBkbyAibWFrZSAtZm1ha2VmaWxlLnRjIgotIyBUbyBjb21waWxlIGluIHNtYWxsIG1vZGVsLCBzZXQgYmVsb3c6IE1PREVMPS1tcwotCi0jIFdBUk5JTkc6IHRoZSBzbWFsbCBtb2RlbCBpcyBzdXBwb3J0ZWQgYnV0IG9ubHkgZm9yIHNtYWxsIHZhbHVlcyBvZgotIyBNQVhfV0JJVFMgYW5kIE1BWF9NRU1fTEVWRUwuIEZvciBleGFtcGxlOgotIyAgICAtRE1BWF9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MwotIyBJZiB5b3Ugd2lzaCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKGRlZmF1bHQgMjU2SyBmb3IgYmlnCi0jIG9iamVjdHMgcGx1cyBhIGZldyBLKSwgeW91IGNhbiBhZGQgdG8gQ0ZMQUdTIGJlbG93OgotIyAgIC1ETUFYX01FTV9MRVZFTD03IC1ETUFYX1dCSVRTPTE0Ci0jIFNlZSB6Y29uZi5oIGZvciBkZXRhaWxzIGFib3V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzLgotCi0jIC0tLS0tLS0tLS0tLS0gVHVyYm8gQyAyLjAgLS0tLS0tLS0tLS0tLQotTU9ERUw9bAotIyBDRkxBR1M9LU8yIC1HIC1aIC1tJChNT0RFTCkgLURNQVhfV0JJVFM9MTEgLURNQVhfTUVNX0xFVkVMPTMKLUNGTEFHUz0tTzIgLUcgLVogLW0kKE1PREVMKQotQ0M9dGNjIC1JXHRjXGluY2x1ZGUKLUxEPXRjYyAtTFx0Y1xsaWIKLUFSPXRsaWIKLUxERkxBR1M9LW0kKE1PREVMKSAtZi0KLU89Lm9iagotCi0jIHZhcmlhYmxlcwotT0JKMSA9IGFkbGVyMzIkKE8pIGNvbXByZXNzJChPKSBjcmMzMiQoTykgZ3ppbyQoTykgdW5jb21wciQoTykgZGVmbGF0ZSQoTykgXAotICB0cmVlcyQoTykKLU9CSlAxID0gYWRsZXIzMiQoTykrY29tcHJlc3MkKE8pK2NyYzMyJChPKStnemlvJChPKSt1bmNvbXByJChPKStkZWZsYXRlJChPKStcCi0gIHRyZWVzJChPKQotT0JKMiA9IHp1dGlsJChPKSBpbmZsYXRlJChPKSBpbmZibG9jayQoTykgaW5mdHJlZXMkKE8pIGluZmNvZGVzJChPKSBcCi0gIGluZnV0aWwkKE8pIGluZmZhc3QkKE8pCi1PQkpQMiA9IHp1dGlsJChPKStpbmZsYXRlJChPKStpbmZibG9jayQoTykraW5mdHJlZXMkKE8pK2luZmNvZGVzJChPKStcCi0gIGluZnV0aWwkKE8pK2luZmZhc3QkKE8pCi0KLVpMSUJfSCA9IHpsaWIuaCB6Y29uZi5oCi1aVVRJTF9IID0genV0aWwuaCAkKFpMSUJfSCkKLQotWkxJQl9MSUIgPSB6bGliXyQoTU9ERUwpLmxpYgotCi1hbGw6IHRlc3QKLQotYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyAkKFpMSUJfSCkKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1jb21wcmVzcy5vYmo6IGNvbXByZXNzLmMgJChaTElCX0gpCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotY3JjMzIub2JqOiBjcmMzMi5jICQoWkxJQl9IKQotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWRlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oICQoWlVUSUxfSCkKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1nemlvLm9iajogZ3ppby5jICQoWlVUSUxfSCkKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1pbmZibG9jay5vYmo6IGluZmJsb2NrLmMgJChaVVRJTF9IKSBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1pbmZjb2Rlcy5vYmo6IGluZmNvZGVzLmMgJChaVVRJTF9IKSBpbmZ0cmVlcy5oIGluZnV0aWwuaCBpbmZjb2Rlcy5oIGluZmZhc3QuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWluZmxhdGUub2JqOiBpbmZsYXRlLmMgJChaVVRJTF9IKSBpbmZibG9jay5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jICQoWlVUSUxfSCkgaW5mdHJlZXMuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWluZnV0aWwub2JqOiBpbmZ1dGlsLmMgJChaVVRJTF9IKSBpbmZ0cmVlcy5oIGluZnV0aWwuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWluZmZhc3Qub2JqOiBpbmZmYXN0LmMgJChaVVRJTF9IKSBpbmZ0cmVlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi10cmVlcy5vYmo6IHRyZWVzLmMgZGVmbGF0ZS5oICQoWlVUSUxfSCkKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi11bmNvbXByLm9iajogdW5jb21wci5jICQoWkxJQl9IKQotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXp1dGlsLm9iajogenV0aWwuYyAkKFpVVElMX0gpCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotZXhhbXBsZS5vYmo6IGV4YW1wbGUuYyAkKFpMSUJfSCkKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1taW5pZ3ppcC5vYmo6IG1pbmlnemlwLmMgJChaTElCX0gpCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotIyB3ZSBtdXN0IGN1dCB0aGUgY29tbWFuZCBsaW5lIHRvIGZpdCBpbiB0aGUgTVMvRE9TIDEyOCBieXRlIGxpbWl0OgotJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQotCWRlbCAkKFpMSUJfTElCKQotCSQoQVIpICQoWkxJQl9MSUIpICskKE9CSlAxKQotCSQoQVIpICQoWkxJQl9MSUIpICskKE9CSlAyKQotCi1leGFtcGxlLmV4ZTogZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIC1lZXhhbXBsZS5leGUgZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQotbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIC1lbWluaWd6aXAuZXhlIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQotCi10ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQlleGFtcGxlCi0JZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQgCi0KLSNjbGVhbjoKLSMJZGVsICoub2JqCi0jCWRlbCAqLmV4ZQpkaWZmIC0tZ2l0IGEvdHJlZXMuYyBiL3RyZWVzLmMKaW5kZXggZjdmNGE4NC4uNWY2ZDRhZiAxMDA2NDQKLS0tIGEvdHJlZXMuYworKysgYi90cmVlcy5jCkBAIC0xLDYgKzEsNiBAQAogLyogdHJlZXMuYyAtLSBvdXRwdXQgZGVmbGF0ZWQgZGF0YSB1c2luZyBIdWZmbWFuIGNvZGluZwogICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCiAvKgpAQCAtMzM0LDQyICszMzQsNDIgQEAKIAogICAgIEFzc2VydCAoaGVhZGVyICE9IE5VTEwsICJDYW4ndCBvcGVuIHRyZWVzLmgiKTsKICAgICBmcHJpbnRmKGhlYWRlciwKLQkgICAgIi8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovXG5cbiIpOworICAgICAgICAgICAgIi8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovXG5cbiIpOwogCiAgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTKzJdID0ge1xuIik7CiAgICAgZm9yIChpID0gMDsgaSA8IExfQ09ERVMrMjsgaSsrKSB7Ci0JZnByaW50ZihoZWFkZXIsICJ7eyUzdX0seyUzdX19JXMiLCBzdGF0aWNfbHRyZWVbaV0uQ29kZSwKLQkJc3RhdGljX2x0cmVlW2ldLkxlbiwgU0VQQVJBVE9SKGksIExfQ09ERVMrMSwgNSkpOworICAgICAgICBmcHJpbnRmKGhlYWRlciwgInt7JTN1fSx7JTN1fX0lcyIsIHN0YXRpY19sdHJlZVtpXS5Db2RlLAorICAgICAgICAgICAgICAgIHN0YXRpY19sdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBMX0NPREVTKzEsIDUpKTsKICAgICB9CiAKICAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdID0ge1xuIik7CiAgICAgZm9yIChpID0gMDsgaSA8IERfQ09ERVM7IGkrKykgewotCWZwcmludGYoaGVhZGVyLCAie3slMnV9LHslMnV9fSVzIiwgc3RhdGljX2R0cmVlW2ldLkNvZGUsCi0JCXN0YXRpY19kdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDUpKTsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICJ7eyUydX0seyUydX19JXMiLCBzdGF0aWNfZHRyZWVbaV0uQ29kZSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfZHRyZWVbaV0uTGVuLCBTRVBBUkFUT1IoaSwgRF9DT0RFUy0xLCA1KSk7CiAgICAgfQogCiAgICAgZnByaW50ZihoZWFkZXIsICJjb25zdCB1Y2ggX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXSA9IHtcbiIpOwogICAgIGZvciAoaSA9IDA7IGkgPCBESVNUX0NPREVfTEVOOyBpKyspIHsKLQlmcHJpbnRmKGhlYWRlciwgIiUydSVzIiwgX2Rpc3RfY29kZVtpXSwKLQkJU0VQQVJBVE9SKGksIERJU1RfQ09ERV9MRU4tMSwgMjApKTsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICIlMnUlcyIsIF9kaXN0X2NvZGVbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIERJU1RfQ09ERV9MRU4tMSwgMjApKTsKICAgICB9CiAKICAgICBmcHJpbnRmKGhlYWRlciwgImNvbnN0IHVjaCBfbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXT0ge1xuIik7CiAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQVRDSC1NSU5fTUFUQ0grMTsgaSsrKSB7Ci0JZnByaW50ZihoZWFkZXIsICIlMnUlcyIsIF9sZW5ndGhfY29kZVtpXSwKLQkJU0VQQVJBVE9SKGksIE1BWF9NQVRDSC1NSU5fTUFUQ0gsIDIwKSk7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfbGVuZ3RoX2NvZGVbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIE1BWF9NQVRDSC1NSU5fTUFUQ0gsIDIwKSk7CiAgICAgfQogCiAgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXSA9IHtcbiIpOwogICAgIGZvciAoaSA9IDA7IGkgPCBMRU5HVEhfQ09ERVM7IGkrKykgewotCWZwcmludGYoaGVhZGVyLCAiJTF1JXMiLCBiYXNlX2xlbmd0aFtpXSwKLQkJU0VQQVJBVE9SKGksIExFTkdUSF9DT0RFUy0xLCAyMCkpOworICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiUxdSVzIiwgYmFzZV9sZW5ndGhbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIExFTkdUSF9DT0RFUy0xLCAyMCkpOwogICAgIH0KIAogICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgaW50IGJhc2VfZGlzdFtEX0NPREVTXSA9IHtcbiIpOwogICAgIGZvciAoaSA9IDA7IGkgPCBEX0NPREVTOyBpKyspIHsKLQlmcHJpbnRmKGhlYWRlciwgIiU1dSVzIiwgYmFzZV9kaXN0W2ldLAotCQlTRVBBUkFUT1IoaSwgRF9DT0RFUy0xLCAxMCkpOworICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiU1dSVzIiwgYmFzZV9kaXN0W2ldLAorICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDEwKSk7CiAgICAgfQogCiAgICAgZmNsb3NlKGhlYWRlcik7CkBAIC05MzAsMzkgKzkzMCwzOSBAQAogICAgIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi8KICAgICBpZiAocy0+bGV2ZWwgPiAwKSB7CiAKLQkgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYXNjaWkgb3IgYmluYXJ5ICovCi0JaWYgKHMtPmRhdGFfdHlwZSA9PSBaX1VOS05PV04pIHNldF9kYXRhX3R5cGUocyk7CisgICAgICAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBhc2NpaSBvciBiaW5hcnkgKi8KKyAgICAgICAgaWYgKHMtPmRhdGFfdHlwZSA9PSBaX1VOS05PV04pIHNldF9kYXRhX3R5cGUocyk7CiAKLQkvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCi0JYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+bF9kZXNjKSkpOwotCVRyYWNldigoc3RkZXJyLCAiXG5saXQgZGF0YTogZHluICVsZCwgc3RhdCAlbGQiLCBzLT5vcHRfbGVuLAotCQlzLT5zdGF0aWNfbGVuKSk7CisgICAgICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KKyAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+bF9kZXNjKSkpOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgcy0+b3B0X2xlbiwKKyAgICAgICAgICAgICAgICBzLT5zdGF0aWNfbGVuKSk7CiAKLQlidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5kX2Rlc2MpKSk7Ci0JVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGQiLCBzLT5vcHRfbGVuLAotCQlzLT5zdGF0aWNfbGVuKSk7Ci0JLyogQXQgdGhpcyBwb2ludCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mCi0JICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy4KLQkgKi8KKyAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+ZF9kZXNjKSkpOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCisgICAgICAgICAgICAgICAgcy0+c3RhdGljX2xlbikpOworICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2YKKyAgICAgICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgICAgICovCiAKLQkvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleAotCSAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgotCSAqLwotCW1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTsKKyAgICAgICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKKyAgICAgICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisgICAgICAgICAqLworICAgICAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7CiAKICAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqLwotCW9wdF9sZW5iID0gKHMtPm9wdF9sZW4rMys3KT4+MzsKLQlzdGF0aWNfbGVuYiA9IChzLT5zdGF0aWNfbGVuKzMrNyk+PjM7CisgICAgICAgIG9wdF9sZW5iID0gKHMtPm9wdF9sZW4rMys3KT4+MzsKKyAgICAgICAgc3RhdGljX2xlbmIgPSAocy0+c3RhdGljX2xlbiszKzcpPj4zOwogCi0JVHJhY2V2KChzdGRlcnIsICJcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1ICIsCi0JCW9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbiwKLQkJcy0+bGFzdF9saXQpKTsKKyAgICAgICAgVHJhY2V2KChzdGRlcnIsICJcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1ICIsCisgICAgICAgICAgICAgICAgb3B0X2xlbmIsIHMtPm9wdF9sZW4sIHN0YXRpY19sZW5iLCBzLT5zdGF0aWNfbGVuLCBzdG9yZWRfbGVuLAorICAgICAgICAgICAgICAgIHMtPmxhc3RfbGl0KSk7CiAKLQlpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7CisgICAgICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsKIAogICAgIH0gZWxzZSB7CiAgICAgICAgIEFzc2VydChidWYgIT0gKGNoYXIqKTAsICJsb3N0IGJ1ZiIpOwotCW9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi8KKyAgICAgICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqLwogICAgIH0KIAogI2lmZGVmIEZPUkNFX1NUT1JFRApAQCAtMTE5OSw3ICsxMTk5LDcgQEAKICAgICBzLT5sYXN0X2VvYl9sZW4gPSA4OyAvKiBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlICovCiAKICAgICBpZiAoaGVhZGVyKSB7Ci0gICAgICAgIHB1dF9zaG9ydChzLCAodXNoKWxlbik7ICAgCisgICAgICAgIHB1dF9zaG9ydChzLCAodXNoKWxlbik7CiAgICAgICAgIHB1dF9zaG9ydChzLCAodXNoKX5sZW4pOwogI2lmZGVmIERFQlVHCiAgICAgICAgIHMtPmJpdHNfc2VudCArPSAyKjE2OwpkaWZmIC0tZ2l0IGEvd2luMzIvTWFrZWZpbGUtZGxsLm1zYyBiL3dpbjMyL01ha2VmaWxlLWRsbC5tc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2ZjRjZgotLS0gL2Rldi9udWxsCisrKyBiL3dpbjMyL01ha2VmaWxlLWRsbC5tc2MKQEAgLTAsMCArMSw3NiBAQAorIyBNYWtlZmlsZSBmb3IgemxpYi5kbGwgLS0gTWljcm9zb2Z0IChWaXN1YWwpIEMuDQorIyBBdXRob3I6IENvc21pbiBUcnV0YSwgMTEtTWFyLTIwMDMuDQorIw0KKyMgVXNhZ2U6IG5tYWtlIC1mIHdpbjMyL01ha2VmaWxlLWRsbC5tc2MNCisNCitDQyA9IGNsDQorTEQgPSBjbA0KK0NGTEFHUyA9IC1ub2xvZ28gLU1EIC1PMg0KK0xERkxBR1MgPSAtbm9sb2dvDQorDQorT0JKUyA9IGFkbGVyMzIub2JqIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogZGVmbGF0ZS5vYmogZ3ppby5vYmogaW5mYmFjay5vYmogXA0KKyAgICAgICBpbmZmYXN0Lm9iaiBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogdHJlZXMub2JqIHVuY29tcHIub2JqIHp1dGlsLm9iag0KKw0KKyMgdGFyZ2V0cw0KK2FsbDogemxpYi5kbGwgemxpYi5saWIgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlDQorDQoremxpYi5saWI6ICQoT0JKUykNCisJbGliIC1vdXQ6JEAgJChPQkpTKQ0KKw0KK3psaWIuZGxsOiAkKE9CSlMpIHdpbjMyL3psaWIuZGVmDQorCWxpbmsgLXJlbGVhc2UgLWRlZjp3aW4zMi96bGliLmRlZiAtZGxsIC1vdXQ6JEAgJChPQkpTKQ0KKw0KK3psaWIubGliOiB6bGliLmRsbA0KKw0KK2V4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiB6bGliLmxpYg0KKwkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqIHpsaWIubGliDQorDQorbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogemxpYi5saWINCisJJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmogemxpYi5saWINCisNCisuYy5vYmo6DQorCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jDQorDQorYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyB6bGliLmggemNvbmYuaA0KKw0KK2NvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaA0KKw0KK2NyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oDQorDQorZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaA0KKw0KK2d6aW8ub2JqOiBnemlvLmMgenV0aWwuaCB6bGliLmggemNvbmYuaA0KKw0KK2luZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcDQorICAgICAgICAgICAgIGluZmZhc3QuaCBpbmZmaXhlZC5oDQorDQoraW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwNCisgICAgICAgICAgICAgaW5mZmFzdC5oDQorDQoraW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwNCisgICAgICAgICAgICAgaW5mZmFzdC5oIGluZmZpeGVkLmgNCisNCitpbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oDQorDQordHJlZXMub2JqOiB0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggZGVmbGF0ZS5oIHRyZWVzLmgNCisNCit1bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oDQorDQorenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgNCisNCitleGFtcGxlLm9iajogZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oDQorDQorbWluaWd6aXAub2JqOiBtaW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oDQorDQorIyB0ZXN0aW5nDQordGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlDQorCWV4YW1wbGUNCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQgDQorDQorIyBjbGVhbnVwDQorY2xlYW46DQorCWRlbCAqLm9iag0KKwlkZWwgKi5kbGwNCisJZGVsICoubGliDQorCWRlbCAqLmV4cA0KKwlkZWwgKi5leGUNCmRpZmYgLS1naXQgYS93aW4zMi9NYWtlZmlsZS5ib3IgYi93aW4zMi9NYWtlZmlsZS5ib3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhMWM0NgotLS0gL2Rldi9udWxsCisrKyBiL3dpbjMyL01ha2VmaWxlLmJvcgpAQCAtMCwwICsxLDkxIEBACisjIE1ha2VmaWxlIGZvciB6bGliCisjIEJvcmxhbmQgQysrIGZvciBXaW4zMgorIyBVcGRhdGVkIGZvciB6bGliLTEuMi54IGJ5IENvc21pbiBUcnV0YSwgMTEtTWFyLTIwMDMuCisKKyMgVXNhZ2U6ICJtYWtlIC1mIHdpbjMyL21ha2VmaWxlLmJvciIKKworIyAtLS0tLS0tLS0tLS0gQm9ybGFuZCBDKysgZm9yIFdpbjMyIC0tLS0tLS0tLS0tLQorCisjICAgIE9wdGlvbmFsIG5vbnN0YW5kYXJkIHByZXByb2Nlc3NvciBmbGFncyAoZS5nLiAtRE1BWF9NRU1fTEVWRUw9NykKKyMgICAgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudCB2aWEgInNldCBMT0NBTF9aTElCPS1ERk9PIiBvciBhZGRlZAorIyAgICB0byB0aGUgZGVjbGFyYXRpb24gb2YgTE9DIGhlcmU6CitMT0MgPSAkKExPQ0FMX1pMSUIpCisKK0NDID0gYmNjMzIKK0xEID0gYmNjMzIKK0FSID0gdGxpYgorQ0ZMQUdTID0gLU8yIC1kIC1rLSAkKExPQykKK0xERkxBR1MgPSAkKExPQykKKworCisjIHZhcmlhYmxlcworWkxJQl9MSUIgPSB6bGliLmxpYgorCitPQkoxID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemlvLm9iaiBpbmZiYWNrLm9iagorT0JKMiA9IGluZmZhc3Qub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCitPQkpQMSA9ICthZGxlcjMyLm9iaitjb21wcmVzcy5vYmorY3JjMzIub2JqK2RlZmxhdGUub2JqK2d6aW8ub2JqK2luZmJhY2sub2JqCitPQkpQMiA9ICtpbmZmYXN0Lm9iaitpbmZsYXRlLm9iaitpbmZ0cmVlcy5vYmordHJlZXMub2JqK3VuY29tcHIub2JqK3p1dGlsLm9iagorCisKKyMgdGFyZ2V0cworYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKworLmMub2JqOgorCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCisKK2FkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKKworY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCisKK2NyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCisKK2RlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworZ3ppby5vYmo6IGd6aW8uYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2luZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oIGluZmZpeGVkLmgKKworaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmgKKworaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCisKK3RyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCisKK3VuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKKworenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworZXhhbXBsZS5vYmo6IGV4YW1wbGUuYyB6bGliLmggemNvbmYuaAorCittaW5pZ3ppcC5vYmo6IG1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKKworCisjIEZvciB0aGUgc2FrZSBvZiB0aGUgb2xkIEJvcmxhbmQgbWFrZSwKKyMgdGhlIGNvbW1hbmQgbGluZSBpcyBjdXQgdG8gZml0IGluIHRoZSBNUy1ET1MgMTI4IGJ5dGUgbGltaXQ6CiskKFpMSUJfTElCKTogJChPQkoxKSAkKE9CSjIpCisJLWRlbCAkKFpMSUJfTElCKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDEpCisJJChBUikgJChaTElCX0xJQikgJChPQkpQMikKKworZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCisJJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCittaW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisKK3Rlc3Q6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCWV4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZCAKKworY2xlYW46CisJLWRlbCAqLm9iagorCS1kZWwgKi5leGUKKwktZGVsICoubGliCisJLWRlbCAqLnRkcworCS1kZWwgemxpYi5iYWsKKwktZGVsIGZvby5negpkaWZmIC0tZ2l0IGEvd2luMzIvTWFrZWZpbGUuZ2NjIGIvd2luMzIvTWFrZWZpbGUuZ2NjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOTk3M2IKLS0tIC9kZXYvbnVsbAorKysgYi93aW4zMi9NYWtlZmlsZS5nY2MKQEAgLTAsMCArMSwxMDUgQEAKKyMgTWFrZWZpbGUgZm9yIHpsaWIsIGRlcml2ZWQgZnJvbSBNYWtlZmlsZS5kajIuCisjIE1vZGlmaWVkIGZvciBtaW5ndzMyIGJ5IEMuIFNwaWVsZXIsIDYvMTYvOTguCisjIFVwZGF0ZWQgZm9yIHpsaWItMS4yLnggYnkgQ29zbWluIFRydXRhLCAxMS1NYXItMjAwMy4KKyMgVGVzdGVkIHVuZGVyIEN5Z3dpbiBhbmQgTWluR1cuCisKKyMgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggSmVhbi1sb3VwIEdhaWxseS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKworIyBUbyBjb21waWxlLCBvciB0byBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgorIyAKKyMgICBtYWtlIC1mbWFrZWZpbGUuZ2NjOyAgbWFrZSB0ZXN0IC1mbWFrZWZpbGUuZ2NjCisjIAorIyBUbyBpbnN0YWxsIGxpYnouYSwgemNvbmYuaCBhbmQgemxpYi5oIGluIHRoZSBzeXN0ZW0gZGlyZWN0b3JpZXMsIHR5cGU6CisjIAorIyAgICBtYWtlIGluc3RhbGwgLWZtYWtlZmlsZS5nY2MKKyMgCisKK0xJQiA9IGxpYnouYQorU0hBUkVETElCID0gbGliei5zbworVkVSID0gMS4yLjAKKworQ0MgPSBnY2MKKyNDRkxBR1MgPSAtRERFQlVHIC1NTUQgLWcKK0NGTEFHUyA9ICQoTE9DKSAtTzMgLVdhbGwKKworQVMgPSAkKENDKQorQVNGTEFHUyA9ICQoTE9DKSAtV2FsbAorCitMRCA9ICQoQ0MpCitMREZMQUdTID0gJChMT0MpIC1zCisKK0FSID0gYXIKK0FSRkxBR1MgPSByY3MKKworQ1AgPSBjcCAtZnAKKyMgSWYgR05VIGluc3RhbGwgaXMgYXZhaWxhYmxlLCByZXBsYWNlICQoQ1ApIHdpdGggaW5zdGFsbC4KK0lOU1RBTEwgPSAkKENQKQorUk0gPSBybSAtZgorCitwcmVmaXggPSAvdXNyL2xvY2FsCitleGVjX3ByZWZpeCA9ICQocHJlZml4KQorCitPQkpTID0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBkZWZsYXRlLm8gZ3ppby5vIGluZmJhY2subyBcCisgICAgICAgaW5mZmFzdC5vIGluZmxhdGUubyBpbmZ0cmVlcy5vIHRyZWVzLm8gdW5jb21wci5vIHp1dGlsLm8KKworIyB0byB1c2UgdGhlIGFzbSBjb2RlOiBtYWtlIE9CSkE9bWF0Y2gubworT0JKQSA9CisKK1RFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCisKK2FsbDogJChMSUIpIGV4YW1wbGUgbWluaWd6aXAKKwordGVzdDogYWxsCisJLi9leGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXAgfCAuL21pbmlnemlwIC1kIAorCisuYy5vOgorCSQoQ0MpICQoQ0ZMQUdTKSAtYyAtbyAkQCAkPAorCitsaWJ6LmE6ICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworZXhhbXBsZTogZXhhbXBsZS5vICQoTElCKQorCSQoTEQpIC1vICRAICQ8ICQoTElCKQorCittaW5pZ3ppcDogbWluaWd6aXAubyAkKExJQikKKwkkKExEKSAtbyAkQCAkPCAkKExJQikKKworCisjIElOQ0xVREVfUEFUSCBhbmQgTElCUkFSWV9QQVRIIHdlcmUgc2V0IGZvciBbbWFrZV0gaW4gZGpncHAuZW52IC4KKworLlBIT05ZIDogdW5pbnN0YWxsIGNsZWFuCisKK2luc3RhbGw6IHpsaWIuaCB6Y29uZi5oICQoTElCKQorCS1AaWYgbm90IGV4aXN0ICQoSU5DTFVERV9QQVRIKS9udWwgbWtkaXIgJChJTkNMVURFX1BBVEgpCisJLUBpZiBub3QgZXhpc3QgJChMSUJSQVJZX1BBVEgpL251bCBta2RpciAkKExJQlJBUllfUEFUSCkKKwkkKElOU1RBTEwpIHpsaWIuaCAkKElOQ0xVREVfUEFUSCkKKwkkKElOU1RBTEwpIHpjb25mLmggJChJTkNMVURFX1BBVEgpCisJJChJTlNUQUxMKSAkKExJQikgJChMSUJSQVJZX1BBVEgpCisKK3VuaW5zdGFsbDoKKwkkKFJNKSAkKElOQ0xVREVfUEFUSCkvemxpYi5oCisJJChSTSkgJChJTkNMVURFX1BBVEgpL3pjb25mLmgKKwkkKFJNKSAkKExJQlJBUllfUEFUSCkvbGliei5hCisKK2NsZWFuOgorCSQoUk0pICoubworCSQoUk0pICouZXhlCisJJChSTSkgbGliei5hCisJJChSTSkgZm9vLmd6CisKK2FkbGVyMzIubzogemxpYi5oIHpjb25mLmgKK2NvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCitjcmMzMi5vOiBjcmMzMi5oIHpsaWIuaCB6Y29uZi5oCitkZWZsYXRlLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitleGFtcGxlLm86IHpsaWIuaCB6Y29uZi5oCitnemlvLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2luZmZhc3QubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZmJhY2subzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZnRyZWVzLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAorbWluaWd6aXAubzogIHpsaWIuaCB6Y29uZi5oIAordHJlZXMubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmggdHJlZXMuaAordW5jb21wci5vOiB6bGliLmggemNvbmYuaAorenV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaCAgCmRpZmYgLS1naXQgYS93aW4zMi9NYWtlZmlsZS5tc2MgYi93aW4zMi9NYWtlZmlsZS5tc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2MDIwOAotLS0gL2Rldi9udWxsCisrKyBiL3dpbjMyL01ha2VmaWxlLm1zYwpAQCAtMCwwICsxLDY5IEBACisjIE1ha2VmaWxlIGZvciAoc3RhdGljKSB6bGliIC0tIE1pY3Jvc29mdCAoVmlzdWFsKSBDLg0KKyMgQXV0aG9yOiBDb3NtaW4gVHJ1dGEsIDExLU1hci0yMDAzLg0KKyMNCisjIFVzYWdlOiBubWFrZSAtZiB3aW4zMi9NYWtlZmlsZS5tc2MNCisNCitDQyA9IGNsDQorTEQgPSBjbA0KK0NGTEFHUyA9IC1ub2xvZ28gLU1EIC1PMg0KK0xERkxBR1MgPSAtbm9sb2dvDQorDQorT0JKUyA9IGFkbGVyMzIub2JqIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogZGVmbGF0ZS5vYmogZ3ppby5vYmogaW5mYmFjay5vYmogXA0KKyAgICAgICBpbmZmYXN0Lm9iaiBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogdHJlZXMub2JqIHVuY29tcHIub2JqIHp1dGlsLm9iag0KKw0KKyMgdGFyZ2V0cw0KK2FsbDogemxpYi5saWIgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlDQorDQoremxpYi5saWI6ICQoT0JKUykNCisJbGliIC1vdXQ6JEAgJChPQkpTKQ0KKw0KK2V4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiB6bGliLmxpYg0KKwkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqIHpsaWIubGliDQorDQorbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogemxpYi5saWINCisJJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmogemxpYi5saWINCisNCisuYy5vYmo6DQorCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jDQorDQorYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyB6bGliLmggemNvbmYuaA0KKw0KK2NvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaA0KKw0KK2NyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oDQorDQorZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaA0KKw0KK2d6aW8ub2JqOiBnemlvLmMgenV0aWwuaCB6bGliLmggemNvbmYuaA0KKw0KK2luZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcDQorICAgICAgICAgICAgIGluZmZhc3QuaCBpbmZmaXhlZC5oDQorDQoraW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwNCisgICAgICAgICAgICAgaW5mZmFzdC5oDQorDQoraW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwNCisgICAgICAgICAgICAgaW5mZmFzdC5oIGluZmZpeGVkLmgNCisNCitpbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oDQorDQordHJlZXMub2JqOiB0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggZGVmbGF0ZS5oIHRyZWVzLmgNCisNCit1bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oDQorDQorenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgNCisNCitleGFtcGxlLm9iajogZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oDQorDQorbWluaWd6aXAub2JqOiBtaW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oDQorDQorIyB0ZXN0aW5nDQordGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlDQorCWV4YW1wbGUNCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQgDQorDQorIyBjbGVhbnVwDQorY2xlYW46DQorCWRlbCAqLm9iag0KKwlkZWwgKi5saWINCisJZGVsICouZXhlDQpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL3psaWJ2Yy5kZWYgYi93aW4zMi96bGliLmRlZgpzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSBjb250cmliL21pbml6aXAvemxpYnZjLmRlZgpyZW5hbWUgdG8gd2luMzIvemxpYi5kZWYKaW5kZXggN2U5ZDYwZC4uM2I0YjA1YSAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL3psaWJ2Yy5kZWYKKysrIGIvd2luMzIvemxpYi5kZWYKQEAgLTEsMTIgKzEsNSBAQAotTElCUkFSWQkJInpsaWIiCi0KLURFU0NSSVBUSU9OCSciIiJ6bGliIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeSIiIicKLQotCi1WRVJTSU9OCQkxLjExCi0KLQotSEVBUFNJWkUJMTA0ODU3Niw4MTkyCitMSUJSQVJZCQl6bGliLmRsbAorREVTQ1JJUFRJT04JInpsaWIgY29tcHJlc3Npb24gbGlicmFyeSBmb3IgV2luZG93cyIKIAogRVhQT1JUUwogICAgIGFkbGVyMzIgICAgICAgICAgICAgICAgICAgICAgICBAMQpAQCAtNTAsMjUgKzQzLDcgQEAKICAgICBjb21wcmVzczIgICAgICAgICAgICAgICAgICAgICAgQDM5CiAgICAgZ3pwdXRzICAgICAgICAgICAgICAgICAgICAgICAgIEA0MAogICAgIGd6Z2V0cyAgICAgICAgICAgICAgICAgICAgICAgICBANDEKLQotCXVuek9wZW4gICAgICAgICAgICAgICAgICAgICAgIEA2MQotCXVuekNsb3NlICAgICAgICAgICAgICAgICAgICAgIEA2MgotCXVuekdldEdsb2JhbEluZm8gICAgICAgICAgICAgIEA2MwotCXVuekdldEN1cnJlbnRGaWxlSW5mbyAgICAgICAgIEA2NAotCXVuekdvVG9GaXJzdEZpbGUgICAgICAgICAgICAgIEA2NQotCXVuekdvVG9OZXh0RmlsZSAgICAgICAgICAgICAgIEA2NgotCXVuek9wZW5DdXJyZW50RmlsZSAgICAgICAgICAgIEA2NwotCXVuelJlYWRDdXJyZW50RmlsZSAgICAgICAgICAgIEA2OAotCXVuenRlbGwgICAgICAgICAgICAgICAgICAgICAgIEA3MAotCXVuemVvZiAgICAgICAgICAgICAgICAgICAgICAgIEA3MQotCXVuekNsb3NlQ3VycmVudEZpbGUgICAgICAgICAgIEA3MgotCXVuekdldEdsb2JhbENvbW1lbnQgICAgICAgICAgIEA3MwotCXVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZSAgICAgIEA3NAotCXVuekxvY2F0ZUZpbGUgICAgICAgICAgICAgICAgIEA3NQotCXVuekdldExvY2FsRXh0cmFmaWVsZCAgICAgICAgIEA3NgotCi0JemlwT3BlbiAgICAgICAgICAgICAgICAgICAgICAgQDgwCi0JemlwT3Blbk5ld0ZpbGVJblppcCAgICAgICAgICAgQDgxCi0JemlwV3JpdGVJbkZpbGVJblppcCAgICAgICAgICAgQDgyCi0JemlwQ2xvc2VGaWxlSW5aaXAgICAgICAgICAgICAgQDgzCi0JemlwQ2xvc2UgICAgICAgICAgICAgICAgICAgICAgQDg0Cis7IFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGV4aXN0IHNpbmNlIHpsaWItMS4yLjAKKzsgICBkZWZsYXRlQm91bmQgICAgICAgICAgICAgICAgICAgQDQyCis7ICAgY29tcHJlc3NCb3VuZCAgICAgICAgICAgICAgICAgIEA0MworOyBldGMuCmRpZmYgLS1naXQgYS96Y29uZi5oIGIvemNvbmYuaAppbmRleCA4ZWY4NDVlLi5mM2M0NDMwIDEwMDY0NAotLS0gYS96Y29uZi5oCisrKyBiL3pjb25mLmgKQEAgLTkxLDcgKzkxLDcgQEAKIAogI2lmbmRlZiBTVERDCiAjICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCi0jICAgIGRlZmluZSBjb25zdAkvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLworIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KICMgIGVuZGlmCiAjZW5kaWYKIApAQCAtMTAxLDcgKzEwMSwxMCBAQAogI2VuZGlmCiAKIC8qIE9sZCBCb3JsYW5kIEMgaW5jb3JyZWN0bHkgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcmV0dXJuczogKi8KLSNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA8IDB4NTAwKQorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg0NjApCisjICBkZWZpbmUgTkVFRF9EVU1NWV9SRVRVUk4KKyNlbmRpZgorI2lmIGRlZmluZWQoX19UVVJCT0NfXykgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQogIyAgZGVmaW5lIE5FRURfRFVNTVlfUkVUVVJOCiAjZW5kaWYKIApAQCAtMTY5LDE3ICsxNzIsMjQgQEAKICMgIGVuZGlmCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChaTElCX1dJTjMyX05PRExMKSkgJiYgKCFkZWZpbmVkKFpMSUJfRExMKSkKKyMgIGRlZmluZSBaTElCX0RMTAorI2VuZGlmCisKIC8qIENvbXBpbGUgd2l0aCAtRFpMSUJfRExMIGZvciBXaW5kb3dzIERMTCBzdXBwb3J0ICovCiAjaWYgZGVmaW5lZChaTElCX0RMTCkKLSMgIGlmIGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoV0lORE9XUykKLSMgICAgaWZkZWYgRkFSCi0jICAgICAgdW5kZWYgRkFSCisjICBpZiBkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCisjICAgIGlmbmRlZiBXSU5BUElWCisjICAgICAgaWZkZWYgRkFSCisjICAgICAgICB1bmRlZiBGQVIKKyMgICAgICBlbmRpZgorIyAgICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KICMgICAgZW5kaWYKLSMgICAgaW5jbHVkZSA8d2luZG93cy5oPgotIyAgICBkZWZpbmUgWkVYUE9SVCAgV0lOQVBJCiAjICAgIGlmZGVmIFdJTjMyCisjICAgICAgZGVmaW5lIFpFWFBPUlQgIFdJTkFQSQogIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgIFdJTkFQSVYKICMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUICBXSU5BUEkgX2V4cG9ydAogIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgIEZBUiBfY2RlY2wgX2V4cG9ydAogIyAgICBlbmRpZgogIyAgZW5kaWYKQEAgLTE4Nyw3ICsxOTcsNyBAQAogIyAgICBpZiAoX19CT1JMQU5EQ19fID49IDB4MDUwMCkgJiYgZGVmaW5lZCAoV0lOMzIpCiAjICAgICAgaW5jbHVkZSA8d2luZG93cy5oPgogIyAgICAgIGRlZmluZSBaRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBXSU5BUEkKLSMgICAgICBkZWZpbmUgWkVYUE9SVFJWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgV0lOQVBJVgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpIFdJTkFQSVYKICMgICAgZWxzZQogIyAgICAgIGlmIGRlZmluZWQgKF9XaW5kb3dzKSAmJiBkZWZpbmVkIChfX0RMTF9fKQogIyAgICAgICAgZGVmaW5lIFpFWFBPUlQgX2V4cG9ydApAQCAtMjQ2LDkgKzI1NiwxMiBAQAogICAgdHlwZWRlZiBCeXRlICAgICAqdm9pZHA7CiAjZW5kaWYKIAotI2lmIDAJLyogSEFWRV9VTklTVERfSCAtLSB0aGlzIGxpbmUgaXMgdXBkYXRlZCBieSAuL2NvbmZpZ3VyZSAqLworI2lmIDAgICAgICAgICAgIC8qIEhBVkVfVU5JU1REX0ggLS0gdGhpcyBsaW5lIGlzIHVwZGF0ZWQgYnkgLi9jb25maWd1cmUgKi8KICMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBmb3Igb2ZmX3QgKi8KICMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAvKiBmb3IgU0VFS18qIGFuZCBvZmZfdCAqLworIyAgaWZkZWYgVk1TCisjICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgIC8qIGZvciBvZmZfdCAqLworIyAgZW5kaWYKICMgIGRlZmluZSB6X29mZl90ICBvZmZfdAogI2VuZGlmCiAjaWZuZGVmIFNFRUtfU0VUCmRpZmYgLS1naXQgYS96Y29uZi5pbi5oIGIvemNvbmYuaW4uaAppbmRleCA4ZWY4NDVlLi5mM2M0NDMwIDEwMDY0NAotLS0gYS96Y29uZi5pbi5oCisrKyBiL3pjb25mLmluLmgKQEAgLTkxLDcgKzkxLDcgQEAKIAogI2lmbmRlZiBTVERDCiAjICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCi0jICAgIGRlZmluZSBjb25zdAkvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLworIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KICMgIGVuZGlmCiAjZW5kaWYKIApAQCAtMTAxLDcgKzEwMSwxMCBAQAogI2VuZGlmCiAKIC8qIE9sZCBCb3JsYW5kIEMgaW5jb3JyZWN0bHkgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcmV0dXJuczogKi8KLSNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA8IDB4NTAwKQorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg0NjApCisjICBkZWZpbmUgTkVFRF9EVU1NWV9SRVRVUk4KKyNlbmRpZgorI2lmIGRlZmluZWQoX19UVVJCT0NfXykgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQogIyAgZGVmaW5lIE5FRURfRFVNTVlfUkVUVVJOCiAjZW5kaWYKIApAQCAtMTY5LDE3ICsxNzIsMjQgQEAKICMgIGVuZGlmCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChaTElCX1dJTjMyX05PRExMKSkgJiYgKCFkZWZpbmVkKFpMSUJfRExMKSkKKyMgIGRlZmluZSBaTElCX0RMTAorI2VuZGlmCisKIC8qIENvbXBpbGUgd2l0aCAtRFpMSUJfRExMIGZvciBXaW5kb3dzIERMTCBzdXBwb3J0ICovCiAjaWYgZGVmaW5lZChaTElCX0RMTCkKLSMgIGlmIGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoV0lORE9XUykKLSMgICAgaWZkZWYgRkFSCi0jICAgICAgdW5kZWYgRkFSCisjICBpZiBkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCisjICAgIGlmbmRlZiBXSU5BUElWCisjICAgICAgaWZkZWYgRkFSCisjICAgICAgICB1bmRlZiBGQVIKKyMgICAgICBlbmRpZgorIyAgICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KICMgICAgZW5kaWYKLSMgICAgaW5jbHVkZSA8d2luZG93cy5oPgotIyAgICBkZWZpbmUgWkVYUE9SVCAgV0lOQVBJCiAjICAgIGlmZGVmIFdJTjMyCisjICAgICAgZGVmaW5lIFpFWFBPUlQgIFdJTkFQSQogIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgIFdJTkFQSVYKICMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUICBXSU5BUEkgX2V4cG9ydAogIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgIEZBUiBfY2RlY2wgX2V4cG9ydAogIyAgICBlbmRpZgogIyAgZW5kaWYKQEAgLTE4Nyw3ICsxOTcsNyBAQAogIyAgICBpZiAoX19CT1JMQU5EQ19fID49IDB4MDUwMCkgJiYgZGVmaW5lZCAoV0lOMzIpCiAjICAgICAgaW5jbHVkZSA8d2luZG93cy5oPgogIyAgICAgIGRlZmluZSBaRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBXSU5BUEkKLSMgICAgICBkZWZpbmUgWkVYUE9SVFJWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgV0lOQVBJVgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpIFdJTkFQSVYKICMgICAgZWxzZQogIyAgICAgIGlmIGRlZmluZWQgKF9XaW5kb3dzKSAmJiBkZWZpbmVkIChfX0RMTF9fKQogIyAgICAgICAgZGVmaW5lIFpFWFBPUlQgX2V4cG9ydApAQCAtMjQ2LDkgKzI1NiwxMiBAQAogICAgdHlwZWRlZiBCeXRlICAgICAqdm9pZHA7CiAjZW5kaWYKIAotI2lmIDAJLyogSEFWRV9VTklTVERfSCAtLSB0aGlzIGxpbmUgaXMgdXBkYXRlZCBieSAuL2NvbmZpZ3VyZSAqLworI2lmIDAgICAgICAgICAgIC8qIEhBVkVfVU5JU1REX0ggLS0gdGhpcyBsaW5lIGlzIHVwZGF0ZWQgYnkgLi9jb25maWd1cmUgKi8KICMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBmb3Igb2ZmX3QgKi8KICMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAvKiBmb3IgU0VFS18qIGFuZCBvZmZfdCAqLworIyAgaWZkZWYgVk1TCisjICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgIC8qIGZvciBvZmZfdCAqLworIyAgZW5kaWYKICMgIGRlZmluZSB6X29mZl90ICBvZmZfdAogI2VuZGlmCiAjaWZuZGVmIFNFRUtfU0VUCmRpZmYgLS1naXQgYS96bGliLmggYi96bGliLmgKaW5kZXggYzUxNDI1Ni4uMmQyMzlhMiAxMDA2NDQKLS0tIGEvemxpYi5oCisrKyBiL3psaWIuaApAQCAtMSw1ICsxLDUgQEAKIC8qIHpsaWIuaCAtLSBpbnRlcmZhY2Ugb2YgdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQotICB2ZXJzaW9uIDEuMi4wLCBNYXJjaCA5dGgsIDIwMDMKKyAgdmVyc2lvbiAxLjIuMC4xLCBNYXJjaCAxN3RoLCAyMDAzCiAKICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgogCkBAIC0zNyw3ICszNyw3IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0jZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjAiCisjZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjAuMSIKIAogLyogCiAgICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCkBAIC0xNjUsNiArMTY1LDcgQEAKIAogI2RlZmluZSBaX0ZJTFRFUkVEICAgICAgICAgICAgMQogI2RlZmluZSBaX0hVRkZNQU5fT05MWSAgICAgICAgMgorI2RlZmluZSBaX1JMRSAgICAgICAgICAgICAgICAgMwogI2RlZmluZSBaX0RFRkFVTFRfU1RSQVRFR1kgICAgMAogLyogY29tcHJlc3Npb24gc3RyYXRlZ3k7IHNlZSBkZWZsYXRlSW5pdDIoKSBiZWxvdyBmb3IgZGV0YWlscyAqLwogCkBAIC00NjEsMTQgKzQ2MiwxNiBAQAogCiAgICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uIFVzZSB0aGUKICAgIHZhbHVlIFpfREVGQVVMVF9TVFJBVEVHWSBmb3Igbm9ybWFsIGRhdGEsIFpfRklMVEVSRUQgZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQotICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBvciBaX0hVRkZNQU5fT05MWSB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCi0gICBzdHJpbmcgbWF0Y2gpLiAgRmlsdGVyZWQgZGF0YSBjb25zaXN0cyBtb3N0bHkgb2Ygc21hbGwgdmFsdWVzIHdpdGggYQotICAgc29tZXdoYXQgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzCi0gICB0dW5lZCB0byBjb21wcmVzcyB0aGVtIGJldHRlci4gVGhlIGVmZmVjdCBvZiBaX0ZJTFRFUkVEIGlzIHRvIGZvcmNlIG1vcmUKLSAgIEh1ZmZtYW4gY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZzsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlCi0gICBiZXR3ZWVuIFpfREVGQVVMVCBhbmQgWl9IVUZGTUFOX09OTFkuIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgb25seSBhZmZlY3RzCi0gICB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4KLSAgIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS4KKyAgIGZpbHRlciAob3IgcHJlZGljdG9yKSwgWl9IVUZGTUFOX09OTFkgdG8gZm9yY2UgSHVmZm1hbiBlbmNvZGluZyBvbmx5IChubworICAgc3RyaW5nIG1hdGNoKSwgb3IgWl9STEUgdG8gbGltaXQgbWF0Y2ggZGlzdGFuY2VzIHRvIG9uZSAocnVuLWxlbmd0aAorICAgZW5jb2RpbmcpLiBGaWx0ZXJlZCBkYXRhIGNvbnNpc3RzIG1vc3RseSBvZiBzbWFsbCB2YWx1ZXMgd2l0aCBhIHNvbWV3aGF0CisgICByYW5kb20gZGlzdHJpYnV0aW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgdHVuZWQgdG8KKyAgIGNvbXByZXNzIHRoZW0gYmV0dGVyLiBUaGUgZWZmZWN0IG9mIFpfRklMVEVSRUQgaXMgdG8gZm9yY2UgbW9yZSBIdWZmbWFuCisgICBjb2RpbmcgYW5kIGxlc3Mgc3RyaW5nIG1hdGNoaW5nOyBpdCBpcyBzb21ld2hhdCBpbnRlcm1lZGlhdGUgYmV0d2VlbgorICAgWl9ERUZBVUxUIGFuZCBaX0hVRkZNQU5fT05MWS4gWl9STEUgaXMgZGVzaWduZWQgdG8gYmUgYWxtb3N0IGFzIGZhc3QgYXMKKyAgIFpfSFVGRk1BTl9PTkxZLCBidXQgZ2l2ZSBiZXR0ZXIgY29tcHJlc3Npb24gZm9yIFBORyBpbWFnZSBkYXRhLiBUaGUgc3RyYXRlZ3kKKyAgIHBhcmFtZXRlciBvbmx5IGFmZmVjdHMgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBub3QgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZQorICAgY29tcHJlc3NlZCBvdXRwdXQgZXZlbiBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuCiAKICAgICAgIGRlZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKICAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCkBAIC04NDMsOCArODQ2LDkgQEAKICAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIG1vZGUgcGFyYW1ldGVyCiAgICBpcyBhcyBpbiBmb3BlbiAoInJiIiBvciAid2IiKSBidXQgY2FuIGFsc28gaW5jbHVkZSBhIGNvbXByZXNzaW9uIGxldmVsCiAgICAoIndiOSIpIG9yIGEgc3RyYXRlZ3k6ICdmJyBmb3IgZmlsdGVyZWQgZGF0YSBhcyBpbiAid2I2ZiIsICdoJyBmb3IKLSAgIEh1ZmZtYW4gb25seSBjb21wcmVzc2lvbiBhcyBpbiAid2IxaCIuIChTZWUgdGhlIGRlc2NyaXB0aW9uCi0gICBvZiBkZWZsYXRlSW5pdDIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmF0ZWd5IHBhcmFtZXRlci4pCisgICBIdWZmbWFuIG9ubHkgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLCBvciAnUicgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcKKyAgIGFzIGluICJ3YjFSIi4gKFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgc3RyYXRlZ3kgcGFyYW1ldGVyLikKIAogICAgICBnem9wZW4gY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0OyBpbiB0aGlzCiAgICBjYXNlIGd6cmVhZCB3aWxsIGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgZmlsZSB3aXRob3V0IGRlY29tcHJlc3Npb24uCkBAIC04OTYsOSArOTAwLDEyIEBACiAgICAgIENvbnZlcnRzLCBmb3JtYXRzLCBhbmQgd3JpdGVzIHRoZSBhcmdzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKICAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuIGd6cHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgogICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuICBUaGUgbnVtYmVyIG9mCi0gICB1bmNvbXByZXNzZWQgYnl0ZXMgd3JpdHRlbiBpcyBsaW1pdGVkIHRvIDQwOTUuICBUaGUgY2FsbGVyIHNob3VsZCBhc3N1cmUKLSAgIHRoYXQgdGhpcyBsaW1pdCBpcyBub3QgZXhjZWVkZWQsIHNpbmNlIG90aGVyd2lzZSBhIGJ1ZmZlciBvdmVyZmxvdyBtYXkKLSAgIHJlc3VsdC4KKyAgIHVuY29tcHJlc3NlZCBieXRlcyB3cml0dGVuIGlzIGxpbWl0ZWQgdG8gNDA5NS4gVGhlIGNhbGxlciBzaG91bGQgYXNzdXJlIHRoYXQKKyAgIHRoaXMgbGltaXQgaXMgbm90IGV4Y2VlZGVkLiBJZiBpdCBpcyBleGNlZWRlZCwgdGhlbiBlaXRoZXIgZ3pwcmludGYoKSB3aWxsCisgICByZXR1cm4gYW4gZXJyb3IgKDApIHdpdGggbm90aGluZyB3cml0dGVuLCBvciB0aGVyZSB3aWxsIGJlIGEgYnVmZmVyIG92ZXJmbG93CisgICB3aXRoIHVucHJlZGljdGFibGUgY29uc2VxdWVuY2VzLiBUaGUgbGF0dGVyIGlzIHBvc3NpYmxlIG9ubHkgaWYgemxpYiB3YXMKKyAgIGNvbXBpbGVkIHdpdGggaW5zZWN1cmUgdmFyaWFudHMgb2YgcHJpbnRmLCBpLmUuIHNwcmludGYoKSBvciB2c3ByaW50ZigpCisgICBiZWNhdXNlIHRoZSBzZWN1cmUgc25wcmludGYoKSBvciB2c25wcmludGYoKSBmdW5jdGlvbnMgd2VyZSBub3QgYXZhaWxhYmxlLgogKi8KIAogWkVYVEVSTiBpbnQgWkVYUE9SVCBnenB1dHMgT0YoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpzKSk7CmRpZmYgLS1naXQgYS96dXRpbC5oIGIvenV0aWwuaAppbmRleCBkOWMzNmFiLi45MTA4M2VkIDEwMDY0NAotLS0gYS96dXRpbC5oCisrKyBiL3p1dGlsLmgKQEAgLTE1MCw2ICsxNTAsMzAgQEAKIAogICAgICAgICAgLyogZnVuY3Rpb25zICovCiAKKyNpZmRlZiBfX1NURENfVkVSU0lPTl9fCisjICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICAgaWZuZGVmIFNUREM5OQorIyAgICAgIGRlZmluZSBTVERDOTkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDOTkpICYmICEoZGVmaW5lZChfX1RVUkJPQ19fKSAmJiBfX1RVUkJPQ19fID49IDB4NTUwKSAmJiAhZGVmaW5lZChWU05QUklOVEZfREVGSU5FRCkKKyMgIGlmZGVmIE1TRE9TCisgICAgIC8qIHZzbnByaW50ZiBtYXkgZXhpc3Qgb24gc29tZSBNUy1ET1MgY29tcGlsZXJzIChESkdQUD8pLAorICAgICAgICBidXQgZm9yIG5vdyB3ZSBqdXN0IGFzc3VtZSBpdCBkb2Vzbid0LiAqLworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorIyAgaWZkZWYgV0lOMzIKKyAgICAgLyogSW4gV2luMzIsIHZzbnByaW50ZiBpcyBhdmFpbGFibGUgYXMgdGhlICJub24tQU5TSSIgX3ZzbnByaW50Zi4gKi8KKyMgICAgaWYgIWRlZmluZWQodnNucHJpbnRmKSAmJiAhZGVmaW5lZChfX1RVUkJPQ19fKQorIyAgICAgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9fVFVSQk9DX18KKyMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgorIyAgZW5kaWYKKyNlbmRpZgorCiAjaWZkZWYgSEFWRV9TVFJFUlJPUgogICAgZXh0ZXJuIGNoYXIgKnN0cmVycm9yIE9GKChpbnQpKTsKICMgIGRlZmluZSB6c3RyZXJyb3IoZXJybnVtKSBzdHJlcnJvcihlcnJudW0pCg==